Zenegenerálás valós időben MIDI protokoll segítségével
Tartalomjegyzék: 1. Feladat ismertetése 2.1 MIDI-ről általában 2.2 MIDI hardver 2.3 MIDI protokoll 2.4 Fontosabb MIDI jelek/üzenetek 2.5 General MIDI 2.6 MID kiterjesztésű filek 2.7 Általános MIDI rendszer 2.8 Sampler 2.9 MIDI kontroller 2.10 MIDI szekvenszer
2.11 Zenei információk - MIDI file 3. Munkához felhasználtak 4. Programunk elvi felépítése
1. Feladat ismertetése Feladatunk egy olyan rendszer létrehozása volt, amely virtuális személyi edzőként egy tetszőlegesen választható edzésterv mentén különböző stílusú és intenzítású változatos zenékkel, egyéb utasításokkal és információkkal segíti, illetve ösztönzi a fejlődni/edzeni kívánó személyt. Teljesítményét, bizonyos biológiai/testi reakciót visszacsatoljuk azaz inputként kezeljük szenzorhálózat segítségével. Jelenleg a szenzorrendszer nem áll készen és nem is volt a feladatunk része. Az inputokat egy GUI-n keresztül adjuk egyenlőre.
2.1 MIDI-ről általában A MIDI (Musical Instrument Digital Interface) zenei információk átvitelére szolgáló hardver interfész és átviteli protokoll. 1980-ban több szintetizátort gyártó cég szövetsége hozta létre. A MIDI olyan protokoll, amellyel zenei események juttathatók egyik eszköből a másikba. Egyikük master, a másik slave szerepet tölt be. A legtöbb esetben vezérlő és szinkronizálójelek jutnak egy audiolejátszó egységhez. Ezek a jelek egységesek, így minden MIDI-jelet használó berendezés egyezményesen megérti egymást. Fontos, hogy a midiben audio média nem kerül feldolgozásra, csak instrukciók annak fogadására, felvételére, tulajdonságainak változtatására.
2.2 MIDI hardver Az átvitel aszinkron és soros, sebessége 31,25 kBaud (+/-1%). 1 start bit, 8 adat bit és 1 stop bit (10 bit összesen) azaz 320 mikroszekundum/byte. A MIDI áramkörben, 5 mA az áramerősség. Egy kimenet csakis egy bemenetet vezérel. A földhurok és egyéb adatvesztés elkerülése végett a bemenet optoizolált. Kevesebb mint 5mA szükséges a bekapcsoláshoz. A Sharp PC-900 és HP 6N138 optoizolátorok megfelelőek erre a célra., reakcióidejüknek 2 mikroszekundumnál kisebbnek kell lenni.
A szabványos MIDI csatlakozó 5 tűs DIN. Külön kábel és csatlakozó létezik az INPUT és OUTPUT részére, ezt értelemszerűen jelölik a kábeleken. Maximális ajánlott hossz 15,5 méter árnyékolt csavart érpár esetén. A 4-es és 5-ös tűt használják adatátvitelre, az 1-es és 3-as nem bekötöttek, a 2-es a az árnyékolást köti össze. Gyakran használatos MIDI THRU csatlakozó is, amely a MIDI IN jelet továbbítja egy másik eszközbe. Lehetséges a továbbításban némi késés a az optoizolátorok kapcsolási ideje miatt éppen ezért korlátozott a MIDI THRUval összekapcsolt eszközök száma.
MIDI IN/OUT interface http://www.borg.com/~jglatt/tech/midispec/midi.gif
2.3 MIDI protokoll Fontos megjegyezni elsősorban, hogy a MIDI protokoll parancsüzenetek küldésére szolgál. Audiomédiumok továbbítása nem történik és nem is lehetséges, viszont az üzenetekkel azokat kontrollálhatjuk, lejátszhatjuk, állíthatjuk bizonyos tulajdonságait egy megfelelő eszközön keresztül. Egy MIDI üzenet byteokból áll. Az elsőt status bytenak hívják, melynek a hetedik bitje egyesre van állítva. Az összes utánna következő byte nem használja a hetedik bitet, azaz nullázva van. Ezeket adat byteoknak hívják. Számuk tetszőleges lehet. Ha egy MIDI üzenet befejeződött a következő egy újabb status byteal kezdődik. Tehát egy MIDI üzenetben status byte esetén a 0-127-ig terjedő intervallumban adatbytek találhatók, a fennmaradó 128255-ig tartó rész pedig a status byte jele A status byteok 128-239-es tartományban szórhatóak mind a 16 MIDI csatornán, ez esetben voice üzenetnek hívjük őket. Ezek alapján egy példa: 0x92-es status byte esetén a byte 2db 4 bites részre bontható, 9-esre(felső nibble) és 2-esre(also nibble). A felső nibble azt jelzi milyen típusú az üzenet. A példa esetén a következő típusok lehetnek: 8 = Note Off 9 = Note On A = AfterTouch (ie, key pressure) B = Control Change C = Program (patch) change D = Channel Pressure E = Pitch Wheel Az also nibble azt mutatja hányas MIDI csatornát használjuk. A MIDI szabvány szerint 16 MIDI csatorna áll rendelkezésre. A MIDI üzenetek más besorolás szerint két csoportba oszthatóak. „voice” üzenetek, amelyek zenei hangokat továbbítanak. Értéktarománya a zenei C0 hangtól G10-ig terjed. „mode” üzenetek, amelyek bizonyos paraméterek értékeit továbbítják.
2.4 Fontosabb MIDI jelek/üzenetek • Note On/Off: ilyen jelet küld a kontroller, ha a játékos leüt egy billentyűt a billentyűzeten, illetve felengedi azt. A hang leütésének idejéből a hang zenei időértékét tudjuk meg. • Velocity: a leütés erejét mutatja. Ezt általában gép, vagy midikotta által generál zene estén randomizálják bizonyos korlátok között, hogy élő érzetet keltsen. • Aftertouch: miközben a játékos lenyomva tart egy hangot, változtathatja nyomásának erejét. Ez használható pl. egy másik hangszín megszólaltatására. • Pitch-bend wheel: gyakran használatos effekt a pitch, amely a megszólaló hang magasságát állítja folytonos módon. Ezt a kontrolleren egy kerékkel állíthatjuk. Zenében használatos „hang nyújtás” hatás érhető el vele. • Pan: Panoráma (stereo hangredszer esetén) • SysEx: System exclusive üzenet. Midi eszköz konfigurációját tartalmazza. • Modulation wheel: A pitch bend wheel-hez hasonlóan ez is egy kerék, amelynek mozgatásával általában modulációs effektek paramétereinek értékeit szokás állítani. • Main volume: a midifile mesterhangereje. • Program change: hangszínek/hangszerek közötti váltás. • „continous controller”: több tetszőlegesen címezhető forgópotméter.
2.5 General MIDI 1991-ben létrehozott hullámforma szintézisen alapuló hangbank, amely szinte az összes hangszer hangját tartalmazza. Nem túl jó minősége ellenére még manapság is használják. A hangbankban található hangszerek kiosztása mára ajánlott szabvánnyá vált. Mostanában kezdték el kidolgozni a HDMIDI hangbakot, amelyben komolyabb minőséget ígérnek.
2.6 MID kiterjesztésű filek Komplett zeneszámot tartalmaz. A kotta midiformátumban, úgynevezett midimapon tárolódik, mellette az egyéb midiüzenetekkel, hangszer(program change) váltó üzenetekkel, illetve tempo értékkel, ütemmutatókkal és annak változásaival, a dal nevével, szerzőjével, információkkal. A mid fileban általában a különböző hangszerek különböző sávokon (track) találhatók, a sávokban van a hangszer szólama, azaz a hozzá tartozó „voice üzenetek” Ezeket eventeknek nevezzük. Egy dalban szereplő hangszerek összessége, együttes megszólalásáva hallhatjuk magát a zenét. Az összes hangszer sávjait szekvenciának nevezzük. MID kiterjesztésű filek lejátszhatók program és tetszőleges hangbank segítségével, ami kompatibilis a Gerenal midi-ben található hangszerek kiosztásával. Ha saját mid fájlt készítünk természetesen eltérhetünk a GM kiosztásától és tetszőleges audiomédiákat vezérelhetünk, tehát nem csak egy adott hangszer húrjának egyszeri megszólalását, hanem egy komplett audiomédiát is elindíthatunk vele.
2.7 Általános MIDI rendszer Egy általános MIDI rendszer a következőkből állhat: 1. Midikontroller: Feladata MIDI vezérlőjelek kibocsátása. 2. MIDI csatlakoztató: Manapság USB, vagy Firewire, régebben soros 5 tűs kábel, összeköti a midikontrollert a fogadó egységgel. 3. MIDI in/out/thru aljzatok: Manapság USB, vagy Firewire, régebben soros aljzat, Pc-ken általában hangkártya game portja, hangszereken az 5 tűst kábelt befogadó, régebbi billentyűzet porthoz hasonló. 4. MIDI jeleket fogadó/audio lejátszó egység: fogadja a jeleket, a parancsoknak megfelelően feldolgozza a hangbankban található audiomintákat és lejátsza azokat. 5. Hangbank: Zenei hangoknak megfelelően csoportosított hangminták.
2.8 Sampler Általában a midijeleket fogadó egység és a hangbank egy egységet képez. Ezt a berendezést nevezzük samplernek. A sampler hangszerek (instrument) hangjait tartalmazza, amelyek ideális esetben a 12 fokú hangskálának megfelelő magasságú audio mintavételezett hangok. (C,C#,D,D#,E,F,F#,G,G#,A,A#,H) Egyéb esetekben a 12 fokú hangskála nem kerül felvételre például helytakarékosság miatt, hanem csak a 8 fokú skála hangjai (C,D,E,F,G,A,H,C) Ekkor a módosított hangokat pitcheléssel érik el. Pitchelés esetén gyorsabban vagy lassaban játszanak le egy audiomédiát, így a módosított hangok is elérhetőek. Igényesebb rendszerekben ez a technika kerülendő. Egy manapság használatos sampler azonban jóval többet tud szimpla hangok lejátszásánál. Képes a hangminták effektezésére DSP segítségével hardveres, vagy szoftveres formában, hangmagasságuk állítására (pitchelés), hangszerek (instrument)/programok( programs) valós idejű változtatására (program change). Ezeket mind támogatják különféle midi jelek.
2.9 MIDI kontroller Általában szintetizátorhoz hasonló, azonban saját hangja nincs. Van zongorabillentyűzete, illetve szabadon címezhető potméter-rendszere. A MIDI kontrollerrel a samplerben lévő hangbank hangfiléit szólaltathatja meg a játékos, a potméterekkel pedig effektek paramétereit állíthatja, programot válthat valós időben stb.
2.10 MIDI szekvenszer Valós időben lejátszik, illetve felvesz midi hangokat és üzeneteket maximum 16 sávon egyszerre. Felvétel esetén eltárolódnak a zenei hangok, zenei időértékek, illetve a játék egyéb tulajdonságai (velocity, hangerő, stb…) A sávokon általában különböző hangszerek vannak. Ezek külön editálhatóak, lehallgathatóak, effektezhetőek stb. A sávok szinkronizálását a midi clokcra alapozza a rendszer. A kapcsolatban master szerepet betöltő (kontroller) eszköz bizonyos időközönként jelet küld. Általában audioszekvenszerrel egybeépítettek. Gyakran használatos szekvenszerek: Cubase, Sonar, ProTools, Logic Pro rendszerek. Szekvenszerben lehetséges a lejátszani való információ szerkesztése is, azaz nem kell egy adott kontrollerrel feljátszani, hanem klasszikus kotta formájában is bevihetőek a hangok és az üzenetek. Az üzenetek által vezérelt paraméter értékek az idő függvényében tetszőlegesen változhatnak. Ezt hívják a legtöbb szekvenszerben automationnak. A tempo változtatása is lehetséges az idő függvényében. Mértékegysége a bpm (beats/minute) azaz ütés/perc. A MIDI egyik tulajdonsága, hogy a tempó minőségromlás nélkül lassulhat ill. gyorsulhat (a pitcheléssel ellentétben), mivel az azonos sávon található lejátszani kívánt audiomédiák közti szünet változik, nem pedig az egész dal lejátszása gyorsul, vagy lassul.
MIDI Note-k számozása, zenei hangok, illetve ahhoz tartozó frekvencia értékek
2.11 Zenei információk - MIDI file Az edzésterv alatt szóló zenei információk zenei stílusonként (drum and bass, house, stb...) egy-egy általunk összeállított MIDI fileban találhatók. Az edzésterveket különböző részekre osztotják, mint például: bemelegítés, felvezetés, kemény erősítés, pihentetés, levezetés. Ennek megfelelően a különböző edzésrészekhez különböző típusú zenét rendeltünk. A bemelegítéshez például egy lassabb ütemű lágy zene generálódik, a kemény erősítéshez pedig egy gyors ütemű hevesebb, dallamdúsabb zene társul. A MIDI file-ban ezeket a felosztásokat markerek segítségével valósítottuk meg. A felosztásokon belül található zenei információkat tovább osztottuk markerekkel zenei ütem szinten, ezeket neveztük el patterneknek. A patternek zeneileg úgy állnak össze, hogy tetszőleges sorrendiséget és számosságot követve is élvezhető és a zeneelmélet szabályainak megfelelő zene generálódik. A patternek közül valószínűségek alapján választ a programunk. Bizonyos edzésrészek közötti zenei váltás zökkenőmentessége miatt átvezető részeket is definiáltunk, például gyorsból lassú tempóba, illetve vissza. Programunk lehetővé teszi, a bizonyos edzésrészek közötti átjárhatóságot is. Tehát ha a visszacsatolt input szerint az edzést végzőnek elég volt pulzusszám alapján az erősítő edzésrész, azonnal visszavált pihentető edzésrészre, tehát egy lassabb ritmusú zenére. Tetszőleges időpontokban lehetőség van instrukciók megszólaltatására is. Ez előre rögzített audioformátumú fájlok lejátszásával történik. A MIDI file létrehozása a GuitarPro nevű kottázó program segítségével történik, egyéb editálásra pedig a Cubase audio és MIDI szekvenszer programot használjuk.
3. Munkához felhasználtak • • • • • •
JAVA JDK JAVA sound API NetBeans feljesztő környezet BEATNIK hangbank készítő program GuitarPro 5.2 kottázó program Cubase SX 3 szekvenszer editálásokra
4. Programunk elvi felépítése
A program három három fő kategóriába csoportosítja az edzést: bemelegítés(1), „szeletelés”(2) és pihi(3). Az edzéstervet ezekből állíthatjuk fel. A sorrend tetszőleges, valamint az egyes fázisok tetszőleges számban használhatóak. Kivétel ezalól a bemelegítés, melyre nem lehet visszatérni. Az edzésterv kizárólag bemelegítéssel kezdődhet! Példa egy edzéstervre: 1,2,3,2,3. Az egyes fázisok közötti váltáskor nem közvetlenül az edzéstervben rögzítet következőre lép, hanem előbb egy átvezetőt játszik, ami egy a MIDI fájlban megfelelő markerrel jelölt speciális pattern. Az edzés egyes fázisainak időtartamát tetszés szerint állíthatjuk, minden egyes fázishoz saját időzítő tartozik. Az edzéstervet és a hozzá kapcsolódó időtartamokat egy XML fáljban tároljuk. A minden edzés fázishoz kiválaszthatjuk, hogy az adott fázisban milyen stílusokat játszon a program. A kiválasztott stílusok közti átmeneti valószínűségeket szintén markov modellek definiálják (minden fázisnak külön modell).
Ezek a modellek az összes átmenet valószínűségét tartalmazzák, természetesen az adott edzésfázisban nem szereplő stílusokra mutató valószínűségek nullák. Az egyes stílusokhoz időtartamok is tartoznak, hogy a stílust milyen hosszan játsza. A markov modelleket (3 db) és a stílusok időtartamát a fájlnév2.XML fálj definiálja, ez tetszés szerint modosítható. Az egyes stílusok patternekből épülnek fel. Ezeket a patterneket a MIDI fáljból olvassuk. A patternek kezdetét egy marker jelöli, mely beazonosítja, hogy az egyes pattern melyik stílusba tartozik. Ez a MIDI üzenetek egyenkénti vizsgálatával, fajtájuk ellenőrzésével történik. A stílusokon belüli patternek közötti átmeneti valószínűségeket egy markov modell írja le, ezeket a valószínűségeket a fájlnév.XML fájlból olvassa be. A program által definiált markerek: -start -felvezet -vers -kiállás -zúz -levezet -end Valamint négy darab átvezető (speciális) marker, melyek az egyes átvezető részeket jelölik az egyes edzésfázisok között (késöbb részletesen): -átvezet1 (bemelegítés -> szeletelés) -átvezet2 (pihi -> szeletelés) -átvezet3 (szeletelés -> pihi) -átvezet4 (bemelegítés -> pihi)
Az alap markerekből a MIDI fájl minimum egyet kell hogy tartalmazzon, maximális érték nincs. A MIDI fájlban a markerek tetszőleges sorrendben fordulhatnak elő. Tehát a program három egymásba ágyazott modellből épül fel. A legfelső magát az edzéstervet vezérli. A középső az egyes stílusok közti ugrásokat vezérli. Az alsó pedíg a patternek közti váltásokat vezérli. Az itt Ezeken felül a program bemenete az edzésalany pulzusa. Minden edzésfázishoz definiálni lehet egy pulzustartományt, a program ebben a tartományban igyekszik tartani az alany pulzusát. Ezt úgy teszi, hogy ha a pulzus az adott tartományon kívül esik, akkor a zenét gyorsítja illetve lassítja (BPM). Ezenkívül kontrollt is végez, ha a gyorsítás illetve lassítás ellenére sem következik be változás akkor előre rögzített hangmintákat (sample) játszik be, utasítva ezzel az alanyt az iram csökkentésére illetve növelésére.