Easy MIDI – бібліотека для роботи з MIDI на java. Представляє собою обгортку стандартних класів з пакету javax.sound.midi.*
, основні функції яких були інкапсульовані у декількох високорівневих методах, які будуть зручними для тих, хто бажає використовувати MIDI-функціонал у своїх проектах, не заглиблюючись у низькорівневі аспекти стандартних класів.
Оскільки у проекті використовуються стандартні класи JRE, на Android бібліотека працювати не буде. Для роботи з MIDI на Android використовуйте сторонні бібліотеки.
Проект є розвитком бібліотеки невідомого автора, вихідний код якої було переписано, додано новий функціонал та переведено на Maven.
Для представлення нот використовується клас-обгортка Note
з пакету com.rutar.easy_midi
. У конструктор класу передається "висота" ноти та інструмент, на якому нота буде відтворена. Для зручності, у класі Note
є багато визначених констант для нот та інструментів. Також, в якості додаткових параметрів, можна вказати гучність ноти та частину ноти (наприклад 4 = 1/4 ноти). Для створення нової ноти використовується наступний фрагмент коду:
// Створення нової ноти
Note note = new Note(Note.p41_3_Fa, Note.i57_Trombone, 127, 4);
Note.p41_3_Fa
- нота Фа у третій октавіNote.i57_Trombone
- інструмент Тромбон127
- гучність ноти, задається від 0 до 1274
- частина цілої ноти, тобто у 4 рази коротша за цілу ноту
Для відтворення ноти використовується допоміжний клас Tools
, якому в якості параметра передається значення періоду звучання, який задається у мілісекундах.
// Відтворення ноти Фа протягом 0,7 сек.
Tools.playNote(new Note(Note.p41_3_Fa, Note.i57_Trombone), 700);
Також можна "відкрити" ноту – в цьому випадку вона буде звучати, поки її явно не закриють, наприклад:
// Відкриття ноти Соль. Нота буде звучати до виклику методу closeNote()
int channel = Tools.openNote(Note.p67_5_Sol, Note.i25_Acoustic_Guitar_steel, 127);
// Закриття ноти Соль
Tools.closeNote(Note.p67_5_Sol, channel);
Для представлення ударних інструментів використовується клас-обгортка Drum
з пакету com.rutar.easy_midi
. Використання класу Drum
в цілому аналогічне використанню класу Note
, з тією лиш відмінністю, що Drum
у якості параметрів приймає лише назву ударних інструментів, список яких представлено у вигляді констант.
// Відтворення ударного інструменту Low_Mid_Tom протягом 0,3 сек.
Tools.playDrum(new Drum(Drum.d47_Low_Mid_Tom), 300);
Аналогічно можна "відкривати" та "закривати" ударні інструменти, наприклад:
// Відкриття ударного інструменту Low_Mid_Tom. Він буде звучати до виклику методу closeDrum()
Tools.openDrum(Drum.d47_Low_Mid_Tom, 127);
// Закриття ударного інструменту Low_Mid_Tom
Tools.closeDrum(Drum.d47_Low_Mid_Tom);
Акорд – сполучення кількох різних за висотою звуків. У бібліотеці для представлення акордів використовується клас Chord
, якому в якості параметра конструктора може передаватися частина цілої ноти, а елементи класів Note
та Drum
додаються за допомогою методів note()
та drum()
. Нижче подано приклад створення простого акорду:
// Ноти та ударні інструменти
Note n_1 = new Note(Note.p41_3_Fa, Note.i57_Trombone);
Note n_2 = new Note(Note.p114_9_Fa_Diese, Note.i105_Banjo);
Drum d_1 = new Drum(Drum.d47_Low_Mid_Tom);
// Створення нового акорду
Chord chord = new Chord().note(n_1).note(n_2).drum(d_1);
Для відтворення музичних фрагментів використовуються класи Phrase
та Ticker
.
Клас Phrase
представляє собою музичний фрагмент (масив акордів, елементів класу Achord
, які відтворюються послідовно, один за одним). Даний клас має єдиний метод chord()
, за допомогою якого можна додати новий акорд в кінець музичного фрагменту.
Клас Ticker
відповідає за відтворення музичних фрагментів. В якості параметрів йому передаються темп, елемент класу Phrase
та параметр, який вказує чи буде музичний фрагмент відтворюватися циклічно. Приклад використання класу Ticker
подано нижче:
// Змінна, яка містить значення темпу
int tempo = 120;
// Створення нового музичного фрагменту
Phrase phrase = new Phrase()
.chord(new Chord(8).drum(hat).drum(bass).note(Note.p28_2_Mi, instrument, 8)) // Акорд №1
.chord(new Chord(8).drum(hat).note(Note.p28_2_Mi, instrument, 8)) // Акорд №2
.chord(new Chord(8).drum(hat).drum(snare) .note(Note.p28_2_Mi, instrument, 8)) // Акорд №3
.chord(new Chord(8).drum(hat).note(Note.p28_2_Mi, instrument, 8)) // Акорд №4
.chord(new Chord(8).drum(hat).drum(bass).note(Note.p28_2_Mi, instrument, 8)) // Акорд №5
.chord(new Chord(8).drum(hat).drum(bass).note(Note.p28_2_Mi, instrument, 8)) // Акорд №6
.chord(new Chord(8).drum(hat).drum(snare).note(Note.p34_2_La_Diese, instrument, 8)) // Акорд №7
.chord(new Chord(8).drum(hat).note(Note.p35_2_Si, instrument, 8)); // Акорд №8
// Створення екземпляру класу Ticker. Музичний фрагмент буде відтворюватися циклічно.
Ticker ticker = new Ticker (tempo, phrase, true);
// Відтворення музичного фрагменту
ticker.play();
// Припинення відтворення музичного фрагменту
ticker.stop();
Для ознайомлення із можливостями бібліотеки можна запустити її виконавчий jar-файл – запуститься Demo програма, у якій можна перевірити відтворення тестового музичного фрагменту на різних інструментах та при різному значенні темпу.
Добавити бібліотеку в свій проект можна за допомогою залежностей. Бібліотека доступна на JitPack.IO