Enterprise MIDI English

From Enterprise Wiki
Revision as of 08:39, 9 September 2017 by Gflorez (talk | contribs)

Jump to: navigation, search

Introduction

A *.mid file doesn't contain any wav sample sound but only the "notes" themselves. The notes can be associated to musical instrument sounds. These instrument sounds are built into the operating system or synthesizer. Midi can sound even 16 layers (channels) at the same time and within one channel even more voices, chords. A special midi channel is the 10th where drums can sound. Our aim is to sound midi files through the EP Dave sound chip. As Dave can handle 3+1 channels altogether most midi files from the net need conversion to get suitable sounding.

Midi hardware also exists for the Enterprise but there are not many pieces. Now a PC midi player/editor application can be connected to the EP128Emu to get the EP sounding midi. To do this you need:

  • Installing a midi port e.g. loopMIDI. In Linux the Midi Through port can be used or editor programs (e.g. Qtractor) also can create a port that can be directly connected to the emulator. A hardware midi keyboard can also be used, in this case loopMIDI is not needed.
  • An EP128Emu version that supports midi input. (The latest emulator can be downloaded from sourceforge, this should be updated with this newer beta version. So it only needs unpacking and you should overwrite the existing files of the emulator.)

If using Windows is the case, you need to configure the midi input (loopMIDI port (I MMSystem)) in the Options -> Sound -> Configure menu item. After that, start a midi player, editor, or virtual keyboard on the PC where output the loopMIDI OUT is set. Start the emulator, load the application called Midiplay on it. After that, the midi player's will sound on the emulated EP, using DAVE's capabilities.

To minimize audio delay and timing errors, you should reduce the default latency setting (70 ms) and select an output device using a low audio API (ALSA or WASAPI), especially when using a MIDI keyboard. Also, it is advisable to avoid OpenGL video emulator modes requiring high CPUs or waiting (eg "resample to monitor refresh rate").

The EP application, Midiplay, includes several files, for example, envelope.txt, see below.

How to use Midiplay in the emulator?

With this application you can play the midi file with the emulated EP as the instrument. If you are using a midi editor (eg Cakewalk, Sonar, etc.), you can also hear the notes through the emulator. It is possible to convert an edited midi file into a loadable and playable EP file (midiconv, see below). Midiplay will automatically check if the default folder contains a converted file called mididata.bin (the maximum size is 1040 bytes of header + 8192 bytes of envelope + 28671 bytes of MIDI data) and, if it is found, the song will be played indefinitely in a loop. If there is no such file, the app will wait for notes received via loopMIDI. While the program is running, the screen will stay completely dark, as no special display is required. It is desirable to run the app on a turbocharged (eg 10 MHz) configuration, but it also works at 4 MHz.

Once started the app, you can use these buttons:

F1: Restarts the program, rewrites envelope.txt and (if available) mididata.bin .

F4: Switches off all sounds, useful for "stuck" sounds. The MIDI controller 123 can also be used for similar purposes.

F6: Full MIDI reset, with the exception of all sounds, the controls, bend and instruments are reset, and the playback position is also returned to the start of the file. The controls and bending can also be reset with the 121 controller.

F8: Exit.


Which MIDI channel (1-16) correspond to each Dave channel? Midi channels are managed by the player as "logical" channels. So each of the eleven(sixteen?) stores their entire status separately:

  • from the 128 keys, which one is pressed and, if so, the assigned DAVE channel.
  • the program (instrument).
  • 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 + AFTERTOUCH + 1) / 128) * ((VOLUME + 1) / 128) * cos(PAN * (PI / 2) / 127.5) * sqrt(2)
Jobb = ENV_R * ((VELOCITY + AFTERTOUCH + 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, AFTERTOUCH = extra nyomás erősség, VOLUME = hangerő (7-es vezérlő), PAN = sztereó pozíció (10-es vezérlő). Ha a burkológörbét 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ényez. A hangerő szorzás ténylegesen csak 1/128 felbontású. Az AFTERTOUCH paramétert az Axh és Dxh MIDI események állítják, az előbbi billentyűnként külön, az utóbbi az adott csatornán minden aktív hangnál egyszerre. Új hangnál (9xh esemény) mindig nulla a kezdeti értéke.

Special settings for the MIDI files

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.

How to use ENVELOPE.TXT

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) és fejléc nélküli mididata.bin lejátszásánál van szükség a használatára, az újabb formátumú konvertált fájlok tartalmazzák a hangszereket is.

Egy "hangszer" definíciója így néz ki:

HANGSZER[D][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 'D' karakter kényszeríti a burkológörbe teljes lefutását a billentyű korai elengedésekor is, doboknál és 'R' szegmenst tartalmazó burkológörbéknél ez az alapértelmezés, így ott értelmetlen a használata, 'L' vagy 'S' esetén pedig hibát eredményez. A 'P' a hangok sztereó pozícióját változtatja 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 8080h 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). It is a special case when the left volume has bit 7 set and the right volume is FFh, this indicates the end of the envelope and turning off the sound.
    • 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

Converting MIDI files to midiplay format

Once we are done editing a MIDI file, and it sounds good with DAVE instruments, it can be converted so that it can be listened to on the EP. midiconv (older version 1, 2) is a command line application. On Windows, the command line interface (cmd.exe) can be accessed via the Start Menu. After entering the directory where midiconv.exe is with the CD command, it can be used as follows:

midiconv INFILE.MID OUTFILE.BIN ENVELOPE.BIN|ENVELOPE.TXT|-raw [IRQFREQ]

By default, IRQFREQ is 50.0363 Hz. If the tempo of the music is 125 or 150 BPM, or other value where the duration of a quarter note is an exact integer multiple of 20 ms, it is recommended to set IRQFREQ to 50. After running the command, the .bin file immediately appears in the same folder, and it can be played with the midiplay.com or midi_asm.com application on the Enterprise.

The format of the converted files:

  • 16 bytes EXOS header:
    • 00h, 6Dh
    • 2 bytes: file size without the header (LSB first), in the case of future compressed formats, this would be the total size of the compressed data
    • 2 bytes: uncompressed envelope data size
    • 2 bytes: uncompressed MIDI data size
    • 8 bytes: reserved for future versions, currently always 00h
  • envelope data (envelope.bin) in the above described format, midiconv automatically removes any unused envelopes
  • MIDI data, the format is similar to standard MIDI files (SMF), but it contains only channel messages on a single track without header, and the delta time between events has a fixed resolution of 1/IRQFREQ seconds. For example, the following sequence of bytes plays the 440 Hz "A" note on the first MIDI channel for one second, using instrument 11:
    • 00 C0 0B 00 90 45 7F 32 45 00

When using the -raw parameter, the program converts to a simple headerless format that includes only the raw MIDI data. In this case, it is not necessary to specify a path to an envelope file on the command line.

Egyéb

A midi hangszerek neve és sorszáma