[126] MIDI - język nie tylko instrumentów cz. 2
![[126] MIDI - język nie tylko instrumentów cz. 2](/_next/image?url=https%3A%2F%2Farduino.pl%2Fimgproxy%2FHuyH-WkKfPSPwPEPF-2lAWTMzPJVDh-rH-mB22KZhx8%2Ff%3Awebp%2Fw%3A1200%2FbG9jYWw6Ly8vaW1hZ2VzLzAtNjhhL2VlODU1LzM0ODMxLzAtNjhhZWU4NTUzNDgzMTAyNjU1NDQ3Ni5wbmc%3D.webp&w=3840&q=75)
Po nieco przydługim wstępie – krótka wprawka programowa, bo czymże byłoby Arduino bez oprogramowania? Stwórzmy prościutki sekwencer z jedną frazą, głównie po to, by sprawdzić czy mamy kontakt z instrumentem. Oczywiście potrzebny jest tutaj syntezator z wejściem MIDI, ale jeśli ktoś nie posiada – nie ma tragedii.

Wystarczy najprostszy interfejs MIDI i jakikolwiek komputer z oprogramowaniem, który sygnały z tego złącza wyśle do softwarowego syntezatora MIDI. Jeden taki mamy w systemie obowiązkowo i jest to uproszczony moduł GS Rolanda. Instrumentów wirtualnych VST są tysiące i większość darmowych, więc jest w czym wybierać. Ale to temat na inny artykuł, więc wróćmy do sedna.
void setup() {
Serial.begin(31250); // Inicjuj port z nietypową szybkością 31250 bps
}
void loop() {
zagraj(43, 43); // Wyślij parę nut - dla kanału arpeggiatora i basowego.
zagraj(62, 0); // Nuta o wysokości 0 będzie ignorowana.
zagraj(65, 55);
zagraj(67, 0);
}
void zagraj(byte arpeggio, byte bas) { // Pozyskaj obie wysokości nut.
Serial.write(145); // Wyślij komunikat "włącz nutę" na kanale drugim (arpeggiatora).
Serial.write(arpeggio); // Wyślij wysokość nuty.
Serial.write(64); // Wyślij głośność nuty.
if (bas != 0) { // Jeśli nuta nie ma wysokości zerowej...
Serial.write(146); // Wyślij komunikat "włącz nutę" na kanale trzecim (basowym).
Serial.write(bas); // Wyślij wysokość nuty.
Serial.write(64); // Wyślij głośność nuty.
}
delay(100); // Wprowadź opóźnienie, stanowiące o tempie arpeggia.
Serial.write(129); // Wyślij komunikat "wyłącz nutę" na kanale drugim (arpeggiatora).
Serial.write(arpeggio); // Wyślij wysokość nuty.
Serial.write(0); // Wyślij głośność nuty.
if (bas != 0) { // Jeśli nuta nie ma wysokości zerowej...
Serial.write(130); // Wyślij komunikat "wyłącz nutę" na kanale trzecim (basowym).
Serial.write(bas); // Wyślij wysokość nuty.
Serial.write(0); // Wyślij głośność nuty.
}
}
Jak pisałem w poprzednim artykule, nie będzie żadnych bibliotek. Zaczniemy od zainicjowania portu z tą nietypową szybkością równą 31250 bps. Arduino pozwala na taką. Co ciekawe, użyjemy portu, który służy programowaniu płytki. Konfliktu jednak nie będzie i wszystko zadziała.

W pętli głównej będziemy wystawiać cztery pary nut, a w podprogramie przechwytywać owe wartości i wysyłać je najpierw na kanał drugi, który nazwałem arpeggiatorem, a potem na trzeci – basowy, bo moje Casio obsługuje trzy kanały, czyli jak gdyby siedzą w nim trzy niezależne instrumenty. Ponieważ basu chcę mniej, zastawiłem pułapkę na wysokość zerową. Jeśli taką napotkam, nutka nie zagra wcale. Po zagraniu jednej lub obu nut poczekamy 100 ms, wyłączymy je i wrócimy do pętli. Kompilujemy i… Dokładnie tę samą sekwencję, którą można pobrać z załącznika, stworzyłem blisko 40 lat temu, na tym samym instrumencie. Ależ nostalgia! :)
