[125] MIDI - język nie tylko instrumentów cz. 1

[125] MIDI - język nie tylko instrumentów cz. 1

Przez jakiś czas chciałbym się zająć tematyką MIDI, dodam – niezwykle bliską memu sercu, z którą przyjemność zacząłem mieć jeszcze w późnych latach osiemdziesiątych. Czym jest MIDI? Odpowiedzi są dwie: krótka i długa. Krótko: to język instrumentów muzycznych. Długa… o tym będzie reszta artykułu. Dla mnie osobiście jest to jeszcze podróż sentymentalna, bo z MIDI spotkałem się w drugiej klasie liceum, kiedy to cudem jakimś udało mi się kupić syntezator widoczny powyżej – niech pozory nie mylą, to naprawdę jest syntezator – i bardzo chciałem móc nim sterować za pomocą komputera ZX Spectrum. Ponieważ jednak nie było wsparcia dla tego komputera w dziedzinie MIDI, w każdym razie na krakowskiej giełdzie, sequencer trzeba było sobie napisać samemu. Napisałem wówczas jakąś prostą jego postać, łącznie z okładką ukazującą się podczas wgrywania programu, która ocalała do dziś, więc się nią dzielę.


Znamienite jest to, że tamten program powstał w kompilowanym BASIC-u ze wstawkami asemblerowymi i całość pisałem kilka miesięcy. Uruchomienie podstawowego układu na Arduino zajęło mi kilka minut. I w tym właśnie tkwi siła tego komputerka: w niesamowitej efektywności i oszczędności czasu. Artykuł będzie też odpowiedzią na pytanie: czy da się stworzyć choć jeden projekt bez bibliotek? Ależ oczywiście, że się da!

No więc czym jest MIDI? Jest przyjacielem samotnych muzyków. Samotny muzyk to ktoś, kto umówił się na próbę, ale gitarzysta musiał zostać z dzieckiem, basista zaspał, a perkusista od trzech dni wciąż jest niedysponowany. Tacy muzycy irytowali się do czasu, gdy ktoś wymyślił, by te wszystkie sekwencje naciskanych klawiszy jakoś ogarnąć, ustandaryzować i móc zapisywać w komputerach – nawet tych prymitywnych, ośmiobitowych, bo działo się to na początku lat osiemdziesiątych. Taki ciąg danych mógł być potem wysłany z powrotem i instrument je interpretował tak, jakby ktoś na nim grał – ale to grały zapisy wcześniejszego grania.

Zaczęło się więc od generowania unikalnych kodów: dla każdego klawisza innego. Ale gdy klawisze były puszczane, trzeba było wysyłać kolejne kody, że niby już przestały być wciskane, by ta konkretna nuta przestała grać. Porządne klawiatury zaś można wciskać słabiej albo silniej, dzięki czemu dźwięki brzmią delikatniej albo dosadniej. Zatem do informacji o wysokości nuty doszła jeszcze jedna, o szybkości wciskania klawisza. A potem ktoś pomyślał, że warto też zmieniać brzmienia za pomocą kodów. No i w końcu dużo klawiatur ma różne drążki, pokrętła i manipulatory. Ich ruch także był zamieniany na ciągi bajtów i interpretowany później owymi ciągami.

Samotny muzyk przestał być samotny, bo najpierw nagrał partię perkusji, potem basu, później fortepianu, solówek i tak dalej, aż mu się skończyło miejsce na dyskietce i instrumenty. To tak ogólnie i w skrócie. MIDI wychodzi daleko poza te zagadnienia i to sprawia, że jest tam duży bałagan, choć w większości trzyma się reguł. Zanim to usystematyzuję, słówko o sprzęcie.

MIDI to krewny RS232, więc sprzętowo jest prosto, ale są istotne różnice. Używa się tam pętli prądowych. Dlaczego? Bo sceny podczas koncertów to siedlisko najgorszych zakłóceń jakie można znaleźć. Wzmacniacze, kolumny, światła, ściemniacze, mnóstwo impulsów, przetwornic; zły sen każdego elektryka. Tylko pętla prądowa i izolacja daje jaką taką pewność działania systemu.

Wygląda to więc tak: z portu wyjściowego, przez gniazdko zwane MIDI OUT wychodzi sygnał – przez rezystor 220Ω i płynie czasem całkiem długim kablem do urządzenia, w którym siedzi gniazdko MIDI IN. Tam zasila transoptor i wraca drugim przewodem, przez wspomniane MIDI OUT znowu przez rezystor 220Ω do źródła napięcia 5 woltów. Tak więc urządzenia nie są nijak połączone ze sobą elektrycznie, bo dzieli je transoptor.

No dobrze, ale tak sygnał może płynąć tylko w jedną stronę. Co z informacją zwrotną? Otóż – nie jest wymagana! Tak, MIDI pracuje w ciemno, wysyła dane, ale nie ma pojęcia czy w ogóle doszły, zakładając że tak jest. Jeśli zrealizujemy połączenie w drugą stronę, to jest ono zupełnie niezależne. Na przykład gdy gramy na klawiaturze, komputer zapisze nasze ruchy, korzystając z jednej linii. Podczas odtwarzania tych zapisów, linia ta będzie nieaktywna, dane popłyną drugą linią. Co prawda można zrealizować, że tak powiem, dialog z potwierdzeniem, ale będzie to niestandardowe, co MIDI dopuszcza, bo jest bardzo tolerancyjne na pomysły autorskie.

Dziś zajmiemy się tylko jednym kierunkiem: z płytki edukacyjnej TME, na której siedzi Arduino popłyną bajty do mojego syntezatora, dokładnie takiego, jaki kupiłem sobie pod koniec lat osiemdziesiątych. Po tamtym nie pozostała mi nawet śrubka, ale kiedyś mnie wzięło, uległem i kupiłem identyczny egzemplarz, trochę nie wiem po co. Niech więc choć posłuży edukacji.

Czas na omówienie warstwy programowej. Jak mówiłem, to właściwie zwykła transmisja szeregowa o nietypowej wartości 31250 bps. Z tym było dużo problemów, standardowe układy nie zawsze pozwalają na taką wartość. Prawdopodobnie była najszybszą dostępną w rozsądnej cenie w czasie opracowywania standardu, a wolniejsze realizacje powodowałyby słyszalne opóźnienia w gęstych aranżach.

Zdarzenia MIDI, czyli na przykład wciśnięcie klawisza albo zmiana programu, zajmują od jednego do trzech bajtów, a bywa, że więcej. Bajty lecą ciurkiem i nie wiadomo gdzie jest początek takiego słowa, nie mówiąc już o tym, że nie wiadomo ile słowo ma mieć bajtów. Poradzono sobie sposobem: pierwszy bajt ma zawsze ustawiony najstarszy bit, kolejne – zerowane. Ogranicza to zakres do 128 wartości, ale pozwolono sobie na taki kompromis, bo tyle wystarczy; w końcu fortepiany mają najwyżej 88 klawiszy. Jeśli wartości jest za mało, łączy się dwa bajty i zakres rośnie do 14 bitów, dając ponad 16 tysięcy pozycji. Rzućmy więc okiem na standard, zaczynając od numeru 128, bo to najniższa wartość z ustawionym najstarszym bitem.

128/80h...143/8Fh Note Off - 3 bytes: Channel/Note/Velocity

144/90h...159/9Fh Note On - 3 bytes: Channel/Note/Velocity

160/A0h..175/AFh Key’s Aftertouch - 3 bytes: Channel/Note/Aftertouch

176/B0h...191/BFh Control Change - 3 bytes: Channel/Controller/Value

  • 0/00h & 32/20h Bank Select

  • 1/01h & 33/21h Modulation

  • 2/02h & 34/22h Breatch

  • 4/04h & 36/24h Foot

  • 5/05h & 37/25h Portamento

  • 6/06h & 38/26h Data Entry

  • 7/07h & 39/27h Volume

  • 8/08h & 40/28h Balance

  • 10/Ah & 42/2Ah Pan

  • 11/0Bh & 43/2Bh Expression

  • 12/0Ch & 44/2Ch Effect Type 1

  • 13/0Dh & 45/2Dh Effect Type 2

  • 64/40h Sustain

  • 65/41h Portamento

  • 66/42h Sostenuto

  • 67/43h Soft

  • 68/44h Legato

  • 69/45h Hold

  • 70/46h Variation

  • 71/47h Resonance

  • 72/48h Relase

  • 73/49h Attack

  • 74/50h Cutoff

  • 84/64h Portamento

  • 91/5Bh Reverb

  • 92/5Ch Tremolo

  • 93/5Dh Chorus

  • 94/5Eh Variation/Celeste

  • 95/5Fh Phaser

  • 96/60h Data Inc

  • 97/61h Data Dec

  • 98/62h NRP LBS

  • 99/63h NRP MBS

  • 100/64h RPN LBS

  • 0/00h Pitch Band Sensitivity

  • 1/01h Fine Tuning

  • 2/02h Coarse Tuning

  • 3/03h MTS Bank Select

  • 4/04h MTS Program Select

  • 101/65h RPN MBS

  • 120/78h All Sound Off

  • 121/79h Reset All Controller

  • 122/7Ah Local Control

  • 123/7Bh All Notes Off

  • 124/7Ch Omni Off

  • 125/7Dh Omni On

  • 126/7Eh Mono On

  • 127/7Fh Mono Off

192/C0h...207/CFh Program Change - 2 bytes: Channel/Program

208/D0h...223/DFh Ch’s Aftertouch - 2 bytes: Channel/Aftertouch

224/E0h...239/EFh Pitch - 3 bytes: Channel/Pitch MSB/Pitch LSB

  • 240/F0h SysEx

  • 241/F1h Quartet Frame

  • 242/F2h Song Position

  • 243/F3h Song Select

  • 246/F4h Tune Request

  • 247/F7h EOX

  • 248/F8h Clock

  • 250/FAh Start

  • 251/FBh Continue

  • 252/FCh Stop

  • 254/FEh Active Sensing

  • 255/FFh System Reset

Ale najpierw jeszcze jedno wyjaśnienie: większość komunikatów umieszczono seriami, po 16, dając im tyleż bliźniaczych pozycji. Po co takie marnotrawstwo? Ależ to jest bardzo przemyślane! Wspomniałem o basiście, perkusiście i pianiście. Każdy gra na innym instrumencie, więc stworzono im rezerwę szesnastu. Jeśli na przykład przyszedł kod wciśniętej nuty C na kanale basisty, to pianista go zignoruje, bo basista nadaje na kanale pierwszym, a pianista na drugim na przykład. Innymi słowy, w MIDI możemy tworzyć zespoły szesnastoosobowe, że tak w uproszczeniu powiem. Jeśli to będzie zbyt mało – trzeba dołożyć kolejne MIDI.

Wróćmy do opisu. Od numeru 128 do 143 mamy zdarzenia… puszczenia wciśniętych wcześniej nut. Wciśnięcia siedzą szesnaście pozycji wyżej, czyli od 144 do 159 – tak trochę nielogicznie na odwrót. Pierwszy z bajtów określa czy nuta ma być włączona, czy wyłączona i na którym z 16 kanałów. Drugi – przyjmujący wartości od 0 do 127 stanowi o wysokości nuty, przy czym praktycznie tylko środek zakresu jest wykorzystywany, bo nie zdarzają się instrumenty z tak wielkimi klawiaturami. Trzeci – to szybkość wciśnięcia klawisza. W przypadku jego puszczenia także mamy trzeci bajt, ale najczęściej jest ignorowany.

Pozycje od 160 do 175 używane są bardzo rzadko. Niektóre klawiatury można jeszcze dociskać po wciśnięciu i ugniatać. Moduluje to dźwięki na różne sposoby i najczęściej pod całą klawiaturą znajduje się specjalna guma oporowa, która jest czuła na ten docisk, ale globalnie, czyli nie rozróżnia który klawisz ją dociska. Najdroższe klawiatury mają taką gumkę pod każdym klawiszem z osobna i ten zakres komunikatów służy właśnie wysyłaniu owych zmian docisku w podobny sposób jak fakt wciśnięcia klawisza, tylko ostatni bajt zamiast szybkości niesie informację o dociśnięciu. A co w przypadku uproszczonych klawiatur z jedną dużą gumą oporową? Dla niej zarezerwowano zakres 208-223, ale wysyłane są tylko dwa bajty. Ten drugi to wartość docisku, już bez rozróżnienia konkretnego klawisza.

Wróćmy niżej, od 176 do 191 znajdują się tak zwane kontrolery, czyli odpowiedniki potencjometrów. Może być ich 128 i przyjmują tyleż wartości. Co robią? Różnie, kontrolują głośność, modulację, filtry, a nawet wciśnięcie pedałów. Sporo ma ustalone wartości, ale większość można sobie implementować dowolnie i mając konkretny instrument trzeba poczytać jakie wartości co oznaczają.

Zakres 192-207 to znowu dwubajtowe komunikaty wybierające program w pamięci instrumentu. Tego systemu używają także gitarzyści, przełączając programy w efektach za pomocą przełącznika nożnego.

Przedostatnia grupa: 224 do 239 to pitchbend, czyli ta wajcha z lewej strony w większości syntezatorów, którą się wywija, żeby muzyka była bardziej ekspresyjna, udająca podciąganie strun na gitarze. Okazało się, że siedem bitów to za mało i słychać było tak zwane schodki. Tutaj połączono razem drugi i trzeci bajt, dając zakresom 14 bitów, czyli ponad 8 tysięcy kroków w górę i tyleż w dół. Z takim zapasem całość brzmi płynnie.

Ostatnie 16 pozycji to jednobajtowe komunikaty specjalne, w większości służące do obsługi sequencerów, ale też stworzone dla celów kontrolnych i specjalnych.

To tylko część wiedzy, z czasem doszło dużo dodatkowych elementów, ale wszystkie muszą bazować na tym porządku, w którym stworzono specjalne furtki dla większej ilości kontrolerów czy w ogóle niestandardowych przesłań, czasem idących w kilobajty. O tym jednak ma razie nie będę pisać, a w kolejnym artykule stworzymy sobie pierwszy, prosty projekt: sekwencer, który powoli nam przetestować czy to wszystko w ogóle działa.

Powiązane tematy

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2025 arduino.pl