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

Вы можете скачать тестовое приложение 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.
параметры:
Note.p93_7_La — высота звука от 0 до 127, удобней указывать константами заданными в классе Note
Note.i127_Gunshot — номер инструмента от 0 до 127, удобней указывать константами заданными в классе Note
127 — громкость от 0 до 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 возвращают ссылку на сам экземпляр класса и в результате запись музыкальной фразы в коде выглядит вполне наглядно:
Вы можете использовать MIDI-звук из программ на Java для воспроизведения интерактивной музыки или звуковых эффектов.
Во многих случаях будет достаточно использовать упрощённый доступ через библиотеку EasyMIDI.
MIDI-звук удобно использовать для интерактивной музыки и вспомогательных звуковых эффектов.
Преимущества:
- MIDI поддерживается любой звуковой картой
- Содержит 128 обычных и 46 ударных инструментов (от гитары до щебетания птиц)
- Возможно интерактивно менять ноты «на лету» (разумеется, если вы в состоянии отличить бемоль от диеза)
- Звук воспроизводится сопроцессором звуковой карты и не влияет на производительность
Недостатки:
- Звучание инструментов полностью зависит от возможностей звуковой карты и может сильно отличаться на разных компьютерах
В Java встроены классы для полного контроля над воспроизведением звука по стандарту MIDI. Я предлагаю использовать мою библиотеку EsayMIDI в которой «события MIDI» инкапсулированы в простые функции.
Скриншот тестового приложения:

Вы можете скачать тестовое приложение 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.