Skip to content

RutarAndriy/Easy_MIDI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Easy MIDI

License Release JitPack

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 до 127
  • 4 - частина цілої ноти, тобто у 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