Как стать автором
Поиск
Написать публикацию
Обновить

Использование MIDI-звука в Java

Что такое MIDI: это «стандарт цифровой звукозаписи на формат обмена данными между электронными музыкальными инструментами» (см. http://en.wikipedia.org/wiki/General_MIDI ). В отличии от семплированного звука, MIDI-данные содержат не семплы звука а нотную запись, которую воспроизводит музыкальная карта или другое подключаемое устройство.

MIDI-звук удобно использовать для интерактивной музыки и вспомогательных звуковых эффектов.

Преимущества:
  • MIDI поддерживается любой звуковой картой
  • Содержит 128 обычных и 46 ударных инструментов (от гитары до щебетания птиц)
  • Возможно интерактивно менять ноты «на лету» (разумеется, если вы в состоянии отличить бемоль от диеза)
  • Звук воспроизводится сопроцессором звуковой карты и не влияет на производительность

Недостатки:
  • Звучание инструментов полностью зависит от возможностей звуковой карты и может сильно отличаться на разных компьютерах


В Java встроены классы для полного контроля над воспроизведением звука по стандарту MIDI. Я предлагаю использовать мою библиотеку EsayMIDI в которой «события MIDI» инкапсулированы в простые функции.

Скриншот тестового приложения:
image

Вы можете скачать тестовое приложение EasyEMIDI.jar на странице http://code.google.com/p/easy-midi/downloads/list


Описание библиотеки



Исходный код доступен в Google Project Hosting (см. http://code.google.com/p/easy-midi/ ).
Скомпилированную версию библиотеки можно скачть на странице http://code.google.com/p/easy-midi/downloads/list (библиотека включает в себя и форму тестового приложения).

Для использования библиотеки нужно подключить к вашему проекту файл EasyEMIDI.jar.

Простые примеры

Проигрывание одной ноты

import midi.*;
...
Tools.playNote( Note.p93_7_La, Note.i127_Gunshot, 127, 2000);

параметры:
Note.p93_7_La — высота звука от 0 до 127, удобней указывать константами заданными в классе Note
Note.i127_Gunshot — номер инструмента от 0 до 127, удобней указывать константами заданными в классе Note
127 — громкость от 0 до 127
2000 — время звучания в тысячных долях секунды
Проигрывание ударного инструмента

import midi.*;
...
Tools.playDrum(Drum.d39_Hand_Clap, 127, 2000);

параметры:
Drum.d39_Hand_Clap — номер инструмента от 35 до 81, удобней указывать константами заданными в классе Drum
127 — громкость от 0 до 127
2000 — время звучания в тысячных долях секунды
Проигрывание музыкальных фрагментов

Для воспроизведения музыкальных фрагментов используется класс Ticker. При его создании указывается tempo (см. http://en.wikipedia.org/wiki/Tempo) и экземпляр класса Phrase.
Вы можете переопределить метод public void onTick(long count) класса Ticker если хотите синхронизировать воспроизведение с каким-то другим процессом (счётчик увеличивается с шагом в 1/16 ноты)

Класс Phrase содержит набор аккордов (Chord) для воспроизведения.
Класс Chord содержит наборы нот обычных и ударных инструментов а так же длительность аккорда.
Сами ноты задаются в классах Note и Drum (для обычных и ударных инструментов). Длительность нот может различаться с длительностью аккорда в котором звучит нота.

Длительность нот задаётся в частях целой ноты, например 8 это 1/8 ноты, 4 это 1/4 ноты и т.д. Темп воспроизведения указывает количество четвертей ноты (U+2669) за минуту.
Т.е. при tempo=120 (120 четвертей в минуту) длительность целой ноты будет 2 секунда а new Chord(8) задаст аккорд с длительностью 1/8 т.е. 0.25 секунды.
Такое описание длительности не очень понятно программисту но привычно музыканту.

Методы drum и note класса Chord возвращают ссылку на сам экземпляр класса и в результате запись музыкальной фразы в коде выглядит вполне наглядно:
import midi.*;
...
int bassVoice=Note.i33_Electric_Bass_finger;
Drum hat=new Drum(4, Drum.d42_Closed_Hi_Hat,64);
Drum snare=new Drum(4, Drum.d38_Acoustic_Snare);
Drum bass=new Drum(4, Drum.d35_Acoustic_Bass_Drum);
Phrase p1=new Phrase()
.chord(new Chord(8).drum(hat).drum(bass) .note(8, Note.p28_2_Mi, bassVoice))
.chord(new Chord(8).drum(hat) .note(8, Note.p28_2_Mi, bassVoice))
.chord(new Chord(8).drum(hat).drum(snare) .note(8, Note.p28_2_Mi, bassVoice))
.chord(new Chord(8).drum(hat) .note(8, Note.p28_2_Mi, bassVoice))
.chord(new Chord(8).drum(hat).drum(bass) .note(8, Note.p28_2_Mi, bassVoice))
.chord(new Chord(8).drum(hat).drum(bass) .note(8, Note.p28_2_Mi, bassVoice))
.chord(new Chord(8).drum(hat).drum(snare) .note(8, Note.p34_2_La_Diese, bassVoice))
.chord(new Chord(8).drum(hat) .note(8, Note.p35_2_Si, bassVoice));
Ticker ti = new Ticker(120, p1);
ti.restart();

Заключение

Вы можете использовать MIDI-звук из программ на Java для воспроизведения интерактивной музыки или звуковых эффектов.
Во многих случаях будет достаточно использовать упрощённый доступ через библиотеку EasyMIDI.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.