Enterprise MIDI
Contents
Az alapok
A midi (kiterjesztése: *.mid) PC-s zenei formátum (is). Szintetizátorok is használják. Nem tartalmaz a midi fájl hangmintát, hanem csak "kottát", és a kottához meg van adva, hogy az egyes szólamok milyen hangszereken szólaljanak meg. Ezek a hangszerhangok már előre be vannak építve az operációs rendszerbe (már Win95-ben is volt midi) vagy a szintetizátorba. A midiben akár 16 szólam (midi sáv) is szólhat egyszerre, és egy midi sávon belül is szólhat egyszerre több hang, akkordok. Megkülönböztetett midi sáv a 10-es számú, ahol dobhangok szólaltathatók meg. A célunk midi fájlok megszólaltatása az EP Dave hangchipjén keresztül. Mivel a Dave összesen 3+1 csatornát tud használni, a netről letölthető midi fájlok közül szinte mindet át kell alakítani, hogy EP-n elfogadható hangzást kapjunk.
A midihez hardver is létezik EP-hoz, de nincs belőle túl sok példány. Egyelőre az EP128Emu emulátorral lehet egy midit lejátszó/szerkesztő PC-s programot összekötni, így szólaltathatjuk meg a midit az EP hangzásaival. Amire ehhez szükség van:
- Midi port telepítése, például a loopMIDI. Linuxon használható a Midi Through port, illetve a szerkesztő programok (pl. Qtractor) is létrehozhatnak portot, amellyel az emulátor közvetlenül összeköthető. Hardveres MIDI billentyűzet használatára is lehetőség van, ilyenkor a loopMIDI-re nincs szükség
- Az EP128Emu olyan verziójára, amely támogatja a midi bemenetet. (A legfrissebb emulátor a sourceforge oldaláról letölthető, ezt az itt található újabb béta verzióval kell frissíteni, tehát csak kibontani, és a fájljaival felülírni a már telepített emulátor fájljait.)
- A midiplay nevű, Enterprise-on futtatható alkalmazásra ([ aktuális verzió], régebbiek itt és itt találhatók)
Ha ez megvan, az emulátorban az Options -> Sound -> Configure menüpontjában be kell állítani a midi bemenetet (loopMIDI port (I MMSystem) felirata van) Mindezek után indítsunk el egy midi lejátszót, szerkesztőt vagy virtuális billentyűzetet a PC-n, ahol kimenetnek a loopMIDI OUT-ot állítjuk be. Indítsuk el az emulátort, töltsük be a midiplay nevű alkalmazást rajta. Ezek után a midi lejátszó hangjai az EP-n fognak szólni, a DAVE képességeit használva.
A hang késésének és az időzítési hibáknak a minimalizálása céljából érdemes az alapértelmezett Latency beállítást (70 ms) csökkenteni, és alacsony szintű audio API-t (ALSA vagy WASAPI) használó kimeneti eszközt választani, különösen MIDI billetyűzet használatakor. Szintén célszerű kerülni a nagy CPU igényű vagy várakozást igénylő OpenGL video módokat (pl. "resample to monitor refresh rate").
A midiplay nevű EP-s alkalmazáshoz több fájl is tartozik, pl. envelope.txt, lásd lejjebb.
A midiplay EP-s alkalmazás használata emulátoron
Ezzel az alkalmazással tehát megszólaltatható a midi fájl EP-s hangszerelésben. Ha midi szerkesztőt használunk (pl. Cakewalk, Sonar, egyebek), közben az emulátoron keresztül is hallható ügyködésünk. Lehetőség van készre szerkesztett midi fájlt EP-n betölthető és lejátszható fájllá konvertálni (midiconv, lásd lejjebb). A midiplay induláskor automatikusan megnézi, az alapértelmezett mappában van-e mididata.bin nevű (konvertált midi, amely legfeljebb 20479 bájt méretű lehet) fájl, és ha igen, azt játssza le, végtelenségig ismételve a lejátszást. Ha nincs ilyen fájl, akkor várja a program, milyen hangokat küldünk neki a loopMIDIn keresztül. A program futása közben a képernyő teljesen sötét, de nincs is szükség különösebb megjelenítésre. Célszerű turbósított (pl. 10 MHz-es) konfiguráción futtatni, de működik 4 MHz-en is.
Indítás után használható gombok:
F1: a program újraindítása, újraolvassa az envelope.txt-t és (ha van) a mididata.bin-t
F4: minden hang kikapcsolása, hasznos "beragadt" hang esetén. A 123-as MIDI vezérlő is használható hasonló célra
F6: teljes MIDI reset, minden hang kikapcsolása mellett a vezérlőket, hajlítást és hangszereket is alaphelyzetbe állítja, fájl lejátszás esetén a fájl pozíciót is. A vezérlők és a hajlítás alaphelyzetbe állíthatók a 121-es vezérlővel is
F8: kilépés
Melyik MIDI csatorna (1-16) melyik Dave csatorna lesz? A midi csatornákat a lejátszó "logikai" csatornákként kezeli. Tehát mind a tizenhatnak külön tárolja a teljes állapotát:
- a 128 billentyűt, hogy éppen melyik van lenyomva, és ha igen, akkor a hozzá rendelt DAVE csatornát
- a programot (hangszert)
- 4 vezérlőt (7, 10, 76, 77)
- a hajlítást (csak a felső 8 bitet veszi figyelembe, a tartomány fix +/- 2 félhang)
Ez az információ független a DAVE csatornáitól, hogy egy MIDI hang melyik DAVE csatornára kerül, azt az alábbi algoritmus dönti el:
- a dob csatorna (10) esetén feltétel nélkül a 3-as DAVE csatornára, az esetleges korábbi hangot azonnal megszakítva
- egyébként a 0-2. csatorna közül ha az egyik jobb választás a másik kettőnél a burkológörbe fázis alapján (off > release > attack/decay > sustain), akkor arra
- ha így nem sikerült dönteni, és aktív hangot kell megszakítani mert már mind a 3 zenei csatorna foglalt, akkor a régebbi (illetve release módban a régebben lecsengő) hang helyére kerül
- ha ez is egyenlő, akkor egy fix sorrend alapján:
- 1-es MIDI csatorna: 0 > 2 > 1
- 2-es MIDI csatorna: 2 > 0 > 1
- 3-es MIDI csatorna: 0 > 2 > 1
- 4-es MIDI csatorna: 2 > 0 > 1
- ...stb.
Ezért az 1-es DAVE csatornát csak akkor használja, ha 3 zenei hang aktív egyszerre. Pontosan kettőnél pedig biztosan a 0.-t és 2.-t. Bármelyik logikai MIDI csatornán lehet tetszőleges számú hang, de összesen mindig legfeljebb 3 + 1 dob.
A bal és jobb csatorna hangereje a következő módon számítható közelítően:
Bal = ENV_L * ((VELOCITY + 1) / 128) * ((VOLUME + 1) / 128) * cos(PAN * (PI / 2) / 127.5) * sqrt(2) Jobb = ENV_R * ((VELOCITY + 1) / 128) * ((VOLUME + 1) / 128) * sin(PAN * (PI / 2) / 127.5) * sqrt(2)
Ahol ENV_L = bal burkológörbe, ENV_R = jobb burkológörbe, VELOCITY = billentyű leütés erőssége, VOLUME = hangerő (7-es vezérlő), PAN = sztereó pozíció (10-es vezérlő). Ha burkológörbét a kettő négyzetgyökével való szorzás miatt 1-nél nagyobb értékkel kellene szorozni, akkor a szorzó 1-re korlátozott. Tehát a sztereó pozíció állítása csak akkor működik helyesen, ha a VELOCITY és VOLUME együttesen legalább 3 dB hangerőcsökkenést eredményeznek. A hangerő szorzás ténylegesen csak 1/128 felbontású.
A MIDI fájl speciális beállításai
A midiplay lejátszó tehát az egyes midi sávokat bizonyos logika alapján párosítja a Dave csatornákhoz. Azonban mi is meghatározhatjuk, hogy egy adott sáv egy adott Dave csatornának feleljen meg. Így a dinamikus foglaláson kívül fix csatornafoglalást is be lehet állítani. Sőt, erre a legtöbb esetben szükség is van, ha ki akarjuk használni a Dave képességeit, és a netről letöltött midi fájlt EP-n is értelmes hangzásúra akarjuk konvertálni.
Ehhez a midi fájlban a különböző vezérlőkben különböző, Dave specifikus beállításokat hajthatunk végre. (A vezérlők a midi szerkesztő programokban általában a Controllers menüpontban érhetők el.)
71-es (Harmonic Content) és 76-os vezérlő: STYLE paraméter / 4
A Style paraméter ugyanaz, mint amit basic-ben kell megadni a STYLE után, csak 4-gyel el kell osztani. Tehát pl. ha 16 (alacsony torzítás), akkor 16/4=4-et kell megadni. Ha 144-et (gyűrűmoduláció+alacsony torzítás), akkor 144/4=36-ot kell megadni. Négyszögjel 4 bites torzításánál 2 hozzáadása módosítja a frekvencia korrekciót, az alapértelmezett 15 helyett 5 hosszúságú mintát (magasabb hangot) eredményez.
70-es (Sound Variation) és 77-es vezérlő: csatorna vezérlés, csak a 2..4 biteknek van hatása:
- 0 = dinamikus foglalás
- 4 = fix 0. csatorna (csak egy szólamú)
- 8 = fix 1. csatorna
- 12 = fix 2. csatorna
- 16, 24 = 0-s csatorna, legfeljebb 3 hang időosztásos rendszerben (ez több ugyanilyen módú MIDI csatorna között is lehetséges)
- 20, 28 = 1-es csatorna, itt is legfeljebb 3 hang váltakozhat hasonló módon
A DAVE csatornák fix hozzárendelése nem kizárólagos, ezeket a dinamkius foglalású MIDI csatornák továbbra is használhatják.
Az ENVELOPE.TXT használata
A midi fájlok különféle hangszerek hangját szólaltatják meg. Az envelope.txt ezekhez a hangszerekhez társít hangzást (burkológörbét), ezt felhasználva fog megszólalni a Dave képességeit használva EP-n. Csak valós idejű bemenetnél (MIDI port) van szükség a használatára, a konvertált fájlok már tartalmazzák ezt az információt bináris formátumban.
Egy "hangszer" definíciója így néz ki:
HANGSZER[P][:+CSATORNA,+MAGASSÁG][,HANGSZER2...] { [L|R|S] IDŐTARTAM, BAL, JOBB, HAJLÍTÁS, TORZÍTÁS; ... }
Több hangszer is használhatja ugyanazt a burkológörbét, több számot megadva vesszővel elválasztva. A hangszer száma vagy 0 és 127 közötti a normál csatornákhoz, vagy -1 és -127 közötti a dobokhoz. Ezt opcionálisan követheti 'P' karakter (lásd lent), illetve kettősponttal elválasztva megadható még két további paraméter, ilyenkor a hangszer használatakor a hangjegyről másolat készül a MIDI csatorna számának és a hangmagasságnak a módosításával. Például 1:2,12-nél az 1-es hangszer a kettővel nagyobb számú MIDI csatornán is megszólaltat egy oktávval magasabb hangot.
A hangszer száma utáni 'P' karakter esetén a hangok sztereó pozíciója változik a hangmagasságtól függően, dobnál nincs hatása. Alapértelmezés szerint a 48..79 tartományba eső hangok kerülnek 1..125 pozícióra, ez a 10-es vezérlővel módosítható. A 9-es hangszernél (Glockenspiel) az effektus alapértelmezés szerint bekapcsolt állapotú és a 'P' tiltja.
Az időtartam (ami video megszakítás egységekben adható meg, 0 esetén a paraméterek változása azonnali) előtt az 'S' karakter azt jelenti, hogy az adott szegmens kezdete "sustain" pozíció, ahonnan a lejátszó csak a billentyű elengedésekor lép tovább. Ennek doboknál nincs értelme. A burkológörbe egy szakasza ismételhető is az 'L' karakter használatával, amely önmagában a burkológörbe további részét végteleníti elengedési fázis hozzáadása nélkül. Az 'R' hatása hasonló az 'S'-hez, de azzal ellentétben a burkológörbe mindig lefut a végéig, 'S'-nél viszont az azzal megadott pont elérése előtt azonnal megszakad. Az 'L' és 'R' együttes használatakor az ezek közötti szakasz ismétlődik (az L-es szegmens elejétől az R-es előtti végéig), elengedéskor pedig az ismétlődés megszűnik és a burkológörbe lefut a végéig.
Az EXOS-tól eltérően a hangerők abszolút értékek 0 és 63 között, azt adják meg, hogy mi lesz az új hangerő a következő szegmens elején, amit lineáris interpolációval ér el. Lehetőség van azonban exponenciális burkológörbék definiálására is, ha a hangerő érték előtt '*' karakter található, akkor a megadott szám / 128-al szorzódik a hangerő minden megszakításnál. Tehát például *96 esetén 0.75 a szorzó, *128-nál nem változik a hangerő, stb. A hajlítás egy -2048 és +2047 közötti egész, 64 felel meg egy zenei félhangnak. Itt is lineáris interpoláció történik, és a megadott értéket a következő szegmens elejére éri el. Dobokat nem lehet hajlítani.
A torzítás (STYLE) a többi paraméterrel ellentétben nem interpolálható, hanem az értéke azonnal módosul, erre figyelni kell ha változik a hang közben.
Szóközök, Tab karakterek és új sorok tetszőlegesen használhatók, a program ezeket figyelmen kívül hagyja. '#' karakter esetén a sor további részét megjegyzésnek tekinti és szintén figyelmen kívül hagyja.
A lejátszó program a lefordított (bináris) burkológörbe adatot automatikusan menti egy envelope.bin nevű fájlba. Ennek a formátuma:
- 256 bájt a normál hangszerek másolását definiálja, csatorna és magasság eltolás felváltva (csak az alsó 4 illetve 7 biten), FFFFh esetén ez a funkció tiltott
- a következő 256 bájt ugyanez a dobokhoz, azonos formátumban
- 256 bájt burkológörbe kezdő pozíció a normál hangszerekhez: alsó, felső bájt felváltva, a burkológörbe adat kezdetéhez képesti eltolás / 2, vagy FFFFh ha a hangszer nem definiált. A felső 4 bit speciális funkciót tölt be, ezért a címezhető burkológörbe adat maximális mérete 8192 bájt. Az alapértelmezés 2000h, amit az 'S' használata nem változtat.
- 15. bit: tiltja a hangszert
- 14. bit: hangmagasságtól függő sztereó pozíció (P)
- 13. bit: ismétlődő szakasz (L) hiányát jelzi
- 12. bit: elengedéskor kényszeríti a teljes burkológörbe lefutását (R)
- 256 bájt burkológörbe pozíció a dobokhoz
- legfeljebb 8192 bájt burkológörbe adat, minden 50 Hz-es megszakítás 4 bájt:
- bal hangerő, 0 és 63 között. A 6. bit beállítása ismétlődő szakasz kezdetét (L) jelzi, a 8. pedig a végét ami már nem ismétlődik. A két bit együttesen beállítva az aktuális minta tartását, majd elengedési szakaszt jelez (csak R, vagy S). Speciális eset ha mindkét hangerő FFh, ez a burkológörbe végét és a hang kikapcsolását jelenti
- jobb hangerő 0 és 63 között, vagy 255 a burkológörbe végén
- hajlítás alsó 8 bit, a felbontása egy félhang 1/64-ed része. Doboknál nem használt
- torzítás, és (csak normál hangszereknél) a hajlítás felső 4 bitje előjelesen. Dob esetén a teljes bájt torzítást definiál
A MIDI fájl konvertálása EP-n lejátszható formátumúra
Ha készre szerkesztettünk egy midi fájlt, ami már jól szól a Dave hangzásokkal, átkonvertálhatjuk, hogy EP-be betöltve lehessen hallgatni. A midiconv (régebbi verzió) egy parancssoros alkalmazás. A parancssort Windowson a start menüben lehet megtalálni. A dos-os CD paranccsal abba a könyvtárba kell lépni, ahol a midiconv.com van, és így kell használni:
midiconv INFILE.MID OUTFILE.BIN ENVELOPE.BIN [IRQFREQ]
Alapértelmezés szerint az IRQFREQ 50.0363 Hz. Ha a zene tempója 125 vagy 150 BPM, vagy más érték ahol a negyedhangok időtartama 20 ms pontos többszöröse, akkor célszerűbb lehet 50-re állítani. A parancs kiadása után azonnal megjelenik az adott mappában a bin fájl, amelyet a midiplay.com EP-s alkalmazással lehet EP-n lejátszani.
A konvertált fájl formátuma:
- 16 bájt EXOS fejléc:
- 00h, 6Dh
- 2 bájt fájl méret a fejléc nélkül (az alsó bájt az első), későbbi tömörített formátumnál ez a tömörített adat teljes mérete
- 2 bájt tömörítetlen burkológörbe adat méret
- 2 bájt tömörítetlen MIDI adat méret
- 8 bájt fenntartva későbbi verziók számára, mindig 00h
- burkológörbe adat (envelope.bin) a fent leírt formátumban
- MIDI adat, ennek a formátuma hasonló a szabványos MIDI-hez, de csak csatornaüzeneteket tartalmaz egy sávon, fejléc nélkül, és az események közötti időtartam EP megszakítás egységekben adható meg. Ez az adat például az első csatornán a 440 Hz-es "A" hangot szólaltatja meg egy másodpercig maximális hangerővel a 11-es hangszeren:
- 00 C0 0B 00 90 45 7F 32 45 00