pondělí 29. ledna 2018

Python a MIDI

Různí lidé vnímají pojem MIDI různě. Pro zkušené it uživatele je to formát hudebního souboru, pro hudebníky je to komunikační protokol mezi elektronickými nástroji a ostatním to neříká vůbec nic. Programátor může pracovat jak s midi soubory, tak s komunikací mezi nástroji, protože ty lze připojit i k počítači. Tento článek se bude věnovat právě komunikaci s hudebními nástroji, typicky nějakým keyboardem, který je připojen k pc.

Lepší keyboardy mají MIDI rozhraní. Dříve to byl petikolíkový DIN konektor, který se v případě počítače připojíval k jeho game portu. Dnes se převážně používá USB rozhraní a to na straně keyboardu i počítače. Byťnjsou možné i jiné cesty. Třeba DIN na straně keyboardu a speciální převodník DIN/USB na straně počítače. Na významu, hlavně v souvislosti s tablety, nabývá i bezdrátová bluetooth komunikace, která umí přenášet i midi protokol.

Pro MIDI komunikaci existuje pěkná multiplatformní knihovna PortMidi, která v Linuxu využívá Alsu (ve windows MME a na Macu CoreMIDI), tedy nízkoúrovňové systémové rozhraní. Pro PortMidi existuje wrapper pro Python, který se jmenuje  pyPortMidi. Tento projekt se zdá být mrtvý, protože poslední aktualizace je z roku 2005, tedy stará 13 let. Ale nazvěme ho eufeministicky jako výjimečně stabilní. Linuxové distribuce ho udržují při životě, tento wrapper je součástí jejich standarních repozitářů, takže se snadno instaluje a používá. Jak je tomu na turbulentních Windows nevím. Ale třeba na Raspberry Pi funguje ukázkově (a já mám v plánu udělat si z Raspberry Pi Zero W takový WiFi MIDI vysílač).

Práce s pyPortMidi je jednoduchá, ale jen pro toho, kdo zná MIDI protokol. Takže kdo ho nezná, musí si ho nastudovat. A nebo si přečíst alespoň úvod tady.

Úvod do MIDI

MIDI protokol je starý 35 let, je z roku 1983. Tehdy vzniknul a od té doby se bez větších změn používá dodnes. Co se mění je především technická část, kdy se pro přenos začalo používat třeba USB nebo Bluetooth a také vznikly podrobnější specifikace pro lepší kompatibilitu mezi nástroji známé jako General MIDI a Geeral MIDI 2, které defiují píd jakým číslem má být jakýnástroj a podíbně. Ale do toho základu skutečně nikdo celých 35 let nehrábl a tak lze bez problému používat i velmistaré MIDI nástroje.

Protože do toho nikdo nehrábl 35 let, je specifikace poplatná své době, kdy se nejen šetřil každý byte, ale dokonce i každý bit. A tak některé byte v midi komunikaci přenáší dvě informace, jednu v horních 4 bitech, druhou ve spodních 4 bitech. Protokol je proto samozřejmě binární a trochu hůřvse s ním pracuje. Byť to pocítíme především při práci s midi soubory, v případě komunikace nás od toho pyPortMidi trochu odstíní.

Cílem midi komunikace je přenášet hru mezi hudebními nástroji (byť se používá třeba i pro dálkové ovládání pódiové techniky, např. osvětlení), přičemž se nepřenáší zvuky, které hráč vyloudil, ale informace, jakým způsobem je vyloudil. Tedy například kdy stisknul Klávesu c1 a jakou rychlostí (od rychlosti stisknutí se odhaduje síla, tedy typicky, ale ne nutně, hlasitost) a kdy ji potom opět pustil.

Asi víte, že keyboard umí hrát i několik nástrojů současně. Obvykle je to až 16 současně znějících nástrojů, protože midi specifikuje 16 nezávislých kanálů. Ve skladbě může být nástrojů i víc, protože hlasy nástrojů se dají během hry přepínat, ale současně jich zazní maximálně 16.

Typická midi komunikace je tedy plná eventů NoteOn, NoteOff a sem tam PC (ProgramChange). Změna programu v midi světě znamená právě onu změnu hlasu nástroje, kde na úrovni midi komunikace se operuje jen s čísly nástroje. Tedy když místo zvuku klavíru začneme používat třeba zvuk kytary, trubky nebo houslí, v midi komunikaci se posílá událost PC 1 nebo PC 48 a podobně.

Reálně se místo kódu PC (to jsou dva byte) používá číselný kód události. Dokonce se šetřilo tak, že kód události a číslo kanálu se posílá v jednom byte. Navíc první bit je nastaven vždy na 1, pokud jde o začátek událost a vždy na 0, pokud jde o následující data události. To si určitě žádá obšírnější vysvětlení.

Začátek událost je byte, tedy 8 bitů, se strukturou: 1-EEE-CCCC a za ním následují datové byte se strukturou 0-DDDDDDD. EEE je číslo události (3 bity = 8 různých událistí), CCCC je číslo kanálu (4 bity, max. 16 kanálů) a DDDDDDD je hodnota (7 bitů, max 127). Počet datových byte se liší podle události.

Dejme tomu, že hráč hraje na kanále číslo 0, stisknul klávesu noty c1, která má číslo 64, a stiskl ji poměrně silně rychlostí 112. Pak se vyšle tato událost:

1001.0000 0100.0000 0111.0000

Kterou lze číst takto:

1       - začátek události
001     - (1) - Událost NoteOn
0000    - (0) - Kanál číslo 0
0       - první datový byte (číslo noty)
1000000 - (64)
0       - druhý datový byte (rychlost stisknutí)
1110000 - (112)

Při používání pyPortMidi není potřeba vědět, který bit co znamená, ani znát dvojkovou soustavu, ale je potřeba vědět, jaké číslo má která událost a jaké má datové hodnoty.

Je výhodné si to zobrazovat v hexadecimální soustavě, protože ta má číslice pěkně po 4 bitech. Třeba 11110000 je hexadecimálně F0. Je zvykem před hexadecimální podobu dávat prefix 0x. Výše uvedená událost se hexadecimálně vyjádří takto:

0x90 0x40 0x70

Přičemž pokud je první znak za x roven 0 až 7, jedná se o data, pokud je 8 až F, jedná se o začátek události. Čísla událostí jsou tyto:


Hudálostparametr 1parametr 2
8xNoteOff / Nota vypnutač. notyrychlost stisku
9xNoteOn / Nota zapnutač. notyrychlost puštění
AxKey Aftertouchč. notysíla stisku
BxCC / Control Change / Kontrolérč. kontroleruhodnota kontroleru
CxPC / ProgramChange / Změna hlasuč. hlasu-
DxChannel Aftertouchsíla stisku-
ExPitchBend / Ohýbání tónuLSBMSB
FxSystem Messagesspeciální

PitchBend má dva parametry, které ale představují jednu 14 bitovou hodnotu. Jedná se o kontroler kolečko pro ohýbání tónu, které má střední polohu, do kter0 se vrací, když je puštěno. Tón lze ohýbat nahoru i dolů. V midi specifikaci je stanoveno, že tato střední poloha, kdy se tón neohýbá je 0x2000, což je (2^14)/2, přepočteno na 7 bit. hodnoty to je 0x40 0x00, binárně 100.0000 000.0000.

Systémové zprávy vypadají na pohled nevinně, ale ve skutečnosti je to brána do druhého vesmíru midi komunikace, takže je opatrně obejdeme.

Jak je vidět v tabulce, u události ProgramChange je pro číslo vyhrazeno štědře 7 bitů (jedna datová hodnota), to jest až 128 nástrojů. Koukněte do hudebnin na nějaký moderní keyboard a zjistíte, že obsahuje několik set hlasů různých nástrojů. Jak je to možné?

Že je 128 hlasů nástrojů málo se ukázalo velmi záhy, byť ještě nedávno platilo, že co jeden hudební nástroj, to jeden hlas. A zde se objevuje genialita návrhu midi protokolu, že si s takovou věcí umí poradit, aniž by se musela vydat nová nekompatibilní specifikace. Je to díky dvěma věcem, konceptu kontrolerů a pravidlu, že neznámé události/kontrolery se ignorují.

Kontroler je je další midi událost CC (ControlChange). Původně byla navržena pro specifické ovládání hudebních nástrojů jako jsou pedály, potenciometry, joysticky, fadery a podobně. Událost kontroler má dva parametry, číslo kontroleru a hodnotu kontroleru. Dejme tomu, že máme na keyboardu 4 potenciometry. Každý má svoje midi číslo kontroleru a hodnota je míra jejich pootočení. Dají se tak třeba v reálném čase ovládat různé efekty a informace o tomto ovládání posílat v midi komunikaci. Může to také být sustain pedál připojený ke keyboardu. Ten má dvě polohy 127 - sešlápnuto a 0 - nesešlápnuto.

Princip kontrolerů se využil i pro rozšíření počtu hlasů nástrojů. Fungují jako virtuální přepínač banky nástrojů BS (BankSelect). Výsledek eventu ProgramChange je ovlivněn tím, která banka nástrojů je aktivní. Můžeme mít až sadu 127 bank, což nám dává 127×127 adres nástrojů, to jest 16 129. To se zdá jako dostatečný počet, ale přesto se tento kontroler definoval jako párový a existují tedy dva, LSB-BS a MSB-BS. Nabízí se na ně dvojí pohled.

První pohled je ten, že se jedná o jeden kontroler, který se přenáší ve dvou událostech CC a s výslednou hodnotou o velikosti 14 bitů. Nebo se na to můžeme dívat tak, že máme jeden kontroler na přepínání hlasových bank, který vytváří sadu 127 bank a pak že máme další kontroler na přepínání těchto sad bank, kterých také může být až 127. Ať tak nebo tak máme k dispozici 127×127×127 (2 048 383, 21 bitů) adres pro hlasy nástrojů.

Je toho kolem MIDI komunikace mnohem víc, ale jako úvod to stačí. S ničím dalším byste se v prvních pokusech neměli potkat a pokud ano, je dnes  na internetu k dispozici mnoho informačních zdrojů.

Příjemce midi událostí informace nějakým způsobem zpracovává. Může je např. ukládat do souboru a tak pořizovat záznam hry nějakého špičkového hráče. Ale nejčastěji je interpretuje, na základě těchto informací hraje. Midi komunikace se nemusí jen vysílat z jednoho nástroje do druhého. MIDI komunikace je základním stavebním kamenem keyboardů, digitálních pián, syntezátorů a podobně. Když hráč hraje na klaviatuře, ta se zbytkem nástroje vždy komunikuje přes MIDI. Možnosti MIDI komunikace tak definují a omezují možnosti těchto nástrojů.

S výjimkou master keyboardů každý klávesový MIDI nástroj obsahuje zvukovou jednotku, která MIDI události převádí na zvuk a tu více či méně zdařile simuluje reálné hudební nástroje nebo alespoň vydává nějaké specifické zvuky.

I když se dnes nástroje většinou shodnou, že program 26 v GM bance je kytara, tak ta hudba z různých nástrojů zní různě. Je to jako když dva různí hráči hrají na kytaru dle stejných not. Jejich kytary nezní stejně, každá má jinou barvu zvuku a i jejich hra se technicky trochu liší. Stejně tak se u hudebních nástrojů liší kvalita simulace zvuku reálných nástrojů. Proto jedny a ty samé MIDI povely, které si můžeme z Pythonu posílat do nástroje  mohou na různých nástrojích znít různě. A nemusíme je z Pythonu posílat jen do nějakého fyzického nástroje. Můžeme je posílat i do virtuálního, softwarového, který běží v tom samém počítači, v kterém poběží náš program. Takže pro pokusí s MIDI v Pythonu žádný skutečný MIDI nástroj nepotřebujeme i když je mnohem lepší ho mít.  Pokud budete používat softwarový, tak pozor, mohou mít diametrálně rozdílnou kvalitu. Třeba ten výchozí ve Windows je mimořádně příšerný. Hudba z něj by mohla kohokoliv odradit od dalších pokusů s MIDI. Kvalitní MIDI nástroj může znít tařka k nerozeznání od toho skutečného.

Na soundcloud je několik nahrávek známeho souboru passport.mid, který byl a možná stále je součástí všech windows. Ukázky jsou z různých nástrojů a z PC s různými zvukovými bankami. Takže si lze poslechnout jak ty jedny a samé povely různá zařízení přehrávají různě. Třeba Casio PX-5S má výrazné bicí, NTONYX zní jak z koupelny přes stěnu, KORG Pa600 Factory asi nejlépe.

Úvod do pyPasportMidi

Začněme tím nejjednodušším příkladem:
 1 import sys
 2 from time import sleep
 3 
 4 import pypm as m
 5 m.Initialize()
 6 
 7 def getMidiInput(devName):
 8     for i in xrange(m.CountDevices()):
 9         iFace, name, inp, outp, opened = m.GetDeviceInfo(i)
10         if  inp:
11             if  devName in name:
12                 return m.Input(i)
13             else:
14                 print 'Skiped device:', name
15     return False
16 
17 def monitor(midi_input):
18     while True:
19         while not midi_input.Poll():
20             sleep(0.01)
21         md = midi_input.Read(1) # 1 massage only
22         print md
23 
24 if  __name__ == '__main__':
25     devName = 'Pa600'
26     if  len(sys.argv) > 1:
27         devName = sys.argv[1]
28     midiIn  = getMidiInput(devName)
29     if  midiIn:
30         print 'Device', devName, 'connected.'
31         monitor(midiIn)
32     else:
33         print 'Device', devName, 'not exist.'

Výstup z tohoto programu (začátek písničky 'Kočka leze dírou') je tento:

Žádné komentáře:

Okomentovat