Enterprise MIDI

From Enterprise Wiki
Revision as of 16:49, 26 August 2017 by IstvanV (talk | contribs) (Az alapok)

Jump to: navigation, search

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 fájl (amelynek a maximális mérete 1040 bájt fejléc + 8192 bájt burkológörbe + 28671 bájt MIDI adat), é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