← ST-Computer 12 / 1990

MIDITALK - StandardMIDI-Files

Grundlagen

Ende 1988 wurde von der MMA (MIDI Manufacturers Association) ein Standardformat fĂŒr MIDI-Dateien angenommen: SMF. Damit sollte der Austausch von MIDI-Daten zwischen verschiedenen Programmen, sogar verschiedenen GerĂ€teklassen ermöglicht werden. Songs, die mit dem ATARI-ST aufgenommen wurden, können auf dem „Umweg“ ĂŒber SMF durch ein Programm auf einem MS-DOS-GerĂ€t oder dem Macintosh ausgedruckt werden und umgekehrt. Nur die Phantasie des Anwenders setzt Grenzen.

Verschiedene Programme erlauben den Import bzw. Export der SMFs. Komplette MusikstĂŒcke aus der Pop-Szene und aus dem klassischen Bereich sind fĂŒr 30 bis 60. DM neben Notator-Format u.a. in diesem Format zu kaufen.

Wer seinen eigenen Sequenzer oder irgendeine Spezialanwendung programmieren wollte fĂŒr SMFs, der stand vor der Schwierigkeit: Im deutschsprachigen Raum gibt es bisher keine leicht zugĂ€ngliche Dokumentation des Formates der SMFs. Eine Anforderung bei The International MIDI Association, 5316 W.57th St., Los Angeles, CA 90056 USA, ist nicht jedermanns Sache. Außerdem soll es nach meinen Informationen sehr lange dauern, bis eine Antwort vorliegt. SĂ€mtliche MIDI-BĂŒcher auf dem deutschen Markt - und das sind nicht wenige! - schweigen sich ĂŒber dieses Thema aus.

Im folgenden möchte ich daher eine kurze Darstellung geben, die auf einem kaum zugĂ€nglichen Artikel in einer amerikanischen Zeitschrift fußt. Alle Zahlen sind als Hexadezimalzahlen dargestellt. VollstĂ€ndigkeit sollte nicht erreicht wer den. Manche Dinge sind mir auch unklar geblieben, insbesondere was den Zeitaufbau angeht. GewĂ€hr fĂŒr die Richtigkeit kann ich nicht geben. Aber immerhin ha ben Sie damit wenigstens eine Arbeitsgrundlage. Sie werden damit einen Import bzw. Export von SMFs programmieren können. Mir gelang der Einbau in mein Programm (ST-Computer-PD-Disks 313 & 314).

Jede SMF besteht aus sog. Chunks (wörtlich: „Klötzen“). Erinnerungen an Electronic Arts IFF-Format können aufsteigen. Mindestens 2 Chunks mĂŒssen enthalten sein: Header Chunk und Track Chunk. Beide „Klötze“ sind sehr Ă€hnlich aufgebaut: Auf eine 4-Buchstabenkennung folgt die LĂ€nge in 32 Bits (4 Bytes) und dann die eigentlichen Daten, die dieser LĂ€nge entsprechen:

Kennung: 4 ASC II LĂ€nge: 4 Bytes Daten ...

Der Header Chunk hat als Kennung MThd, die LÀnge 0 0 0 6 (immer?), die Daten Format (2 Bytes), Anzahl der Tracks (2 Bytes) und Auflösung (2 Bytes).

Die SMF-Definition kennt (bisher) 3 Formate: 0, 1 und 2. Format 0 muß jedes Programm lesen können, das von sich behauptet, SMF lesen zu können. Format 0 enthĂ€lt alle MIDI-Daten in 1 Track, gleichgĂŒltig, wieviele Spuren/Tracks Ihr Song ursprĂŒnglich im Sequenzer hatte! Eine SMF in Format 0 enthĂ€lt damit nur Header- und Track-Chunk, die Format-Bytes lauten 0 0, die Track-Anzahl wird durch 0 1 dargestellt.

Format 1 ist weitverbreitet (bei kÀuflichen Songs!) und legt die verschiedenen Sequenzerspuren auch in verschiedenen Tracks ab. Die Kennung lautet 0 1.

Format 2 wird meines Wissens bisher von keinem ĂŒblichen Sequenzer geschrieben und verstanden. WĂ€hrend Format 0 und 1 fĂŒr alle Tracks dasselbe Timing zugrunde legen, darf dieses im Format 2 verschieden sein. Mit Format 2 ließen sich Abbilder Ihrer Daten in Pattern-Form erzeugen. Am besten bauen Sie in Ihr eigenes Programm eine Abweisung des Formates 2 ein, z.B. in Form einer ALERT-Box.

Die letzten Daten im Header-Chunk betreffen die zeitliche Auflösung. Inden Track-Chunks gibt es die Möglichkeit, das Tempo zu setzen. Es muß aber noch ein „absolutes“ Maß fĂŒr die ZeiteintrĂ€ge bei den eigentlichen MIDI-Daten angegeben werden. Ist das HIGH Byte kleiner als 128, gibt das WORD die Auflösung in „Ticks“ pro Viertelnote an:

Auflösungs-Bytes HIGH LOW Bit 76543210 76543210 0hhhhhhh 11111111

h..l stellt die „Ticks/Viertel“ dar. 00 60 ist die Darstellung fĂŒr 96 Ticks/Viertel der „Standard“ MIDI-Clock. Ist das höchstwertige Bit 1, liefert das Highbyte das SMPTE-Format h..h, das Lowbyte 1..1 die „Ticks/Frame“.

Kommen wir nun zu den Track-Chunks. Sie haben als Kennung die Buchstaben MTrk. Nach der 32-Bit LĂ€ngenangabe folgen die eigentlichen MIDI-Daten, zu denen am Schluß die Byte-Folge FF 2F 00 gehört, die „Ende-Kennung“.

Diese Byte-Folge ist schon ein sog. META-Event. Die MIDI-Daten werden alle als Event bezeichnet. Der Track-Chunk ist nur eine Aneinanderreihung vieler Events, denen eine Zeitangabe vorangeht. Diese Zeitangabe bezieht sich auf den vorhergehenden Event.

Ein einfaches NOTE-ON fĂŒr Kammerton a auf MIDI-Kanal 1 in der LautstĂ€rke mezzoforte (64) im Normalmodus lautet:

90 45 40

Soll dieser Ton sofort nach dem vorhergehenden Event eingeschaltet werden, steht im SMF:

00 90 45 40

StĂŒnde 60 90 45 40 dort, wĂŒrde das bedeuten: Schalte den Kammerton a eine Viertelnote NACH dem vorhergehenden Event ein.

Auf diese zeitlichen Differenzangabe, die sog. Delta Time, werde ich unten nĂ€her eingehen, da sie ein wenig kompliziert ist. Immerhin können Sie sich nun vorstellen, wie „normale“ NOTEON bzw. NOTE-OFF in SMF dargestelll werden.

Neben diesen einfachen MIDI-Events gibt es noch die System Exclusive Events und die bereits erwĂ€hnten Meta Events. System Exclusive Events werden durch das Byte F0 eingeleitet. Da System Exclusive-Daten sehr unterschiedlich lang sein können, folgt dann die 32-Bit-LĂ€nge in 4 Bytes. In dieser LĂ€nge ist die „Ende-Kennung“ F7 schon enthalten.

F0 LĂ€nge 4 Bytes System-Daten ... F7

Die dritte und letzte Form von Events sind die Meta Events. Auch sie werden zeitlich mit einer vorangestellten Delta-Time eingeordnet. Meist ist aber das vorgelagerte Byte 00.

Das Kenn-Byte lautet FF. Das nĂ€chste Byte gibt die Nummer des Meta Events an. Da Meta Events sehr unterschiedlich lang sein können, muß die LĂ€nge angegeben werden, jetzt reicht aber 1 Byte. Dann kommen die Daten:

FF Typ 1 Byte LĂ€nge 1 Byte Daten ...

In Tabelle 1 sehen Sie eine Auflistung der momentan gĂŒltigen Meta Events. Es kann gut sein, daß in Zukunft andere dazukommen. Sie tun also gut daran, in eigenen Programmen auch mit anderen Meta Events zu rechnen. „Überlesen“ Sie diese einfach. Durch die Struktur der Meta Events ist das sehr leicht.

Nun kommt das schwierige Kapitel ĂŒber die Delta-Times, die jedem Event in SMF vorangehen mĂŒssen. Sie geben die Zeit in „Ticks“ an, die seit dem vorhergehenden Event vergangen sind. Eine Delta Time von 00 bedeutet: gleich anschließend. Die Angabe der Delta-Time kann eine LĂ€nge von 1 bis 4 Bytes haben. Mindestens 1 Byte ist erforderlich, höchstens 32 Bits oder ein Lang wort werden gebraucht.

Das letzte Byte hat auf jeden Fall einen Wert kleiner als dez. 128, hex. 80. Die eventuell anderen, vorhergehenden Bytes der Delta-Time haben das höchste Bit gesetzt. Daran lĂ€ĂŸt sich das letzte Byte gut erkennen.

Sie mĂŒssen aus der tatsĂ€chlich verstrichenen Zeit eine Zahl formen, die nur 7 Bits benutzt. Das 8.Bit dient ja schon zur Unterscheidung fĂŒr das letzte Byte. Zum VerstĂ€ndnis ist es gut. sich die Zahlen dezimal, hexadezimal und binĂ€r jeweils auch in Nibbel-Form (4 Bits) aufzuschreiben und neu aufzuteilen. Zwei Beispiele mögen helfen:

Die Delta-Time betrĂ€gt 8192 Ticks. Welcher Eintrag muß in der SMF vor dem nĂ€chsten Event stehen?

dez: 8192 hex: 2 0 0 0 bin: 0010 0000 0000 0000 (Nibble-Form) 00 1000000 0000000 (In 7-Bit Form) 11000000 00000000 (Bit 8 gesetzt in Byte 1 gelöscht im letzte Byte) 1100 0000 0000 0000 (wieder in Nibble-Form) hex: C 0 0 0

Sie finden CO 00 im SMF!

  1. Beispiel: Bis zum nÀchsten Event sollen 16383 Ticks vergehen.

    dez: 16383 hex: 3 F F F bin: 0011 1111 1111 1111 (in Nibbles) 00 1111111 1111111 (7-Bit-ReprÀsentation) 11111111 01111111 (Bit 8 nach Vorschrift gesetzt) 1111 1111 0111 1111 (in Nibbles) hex: F F 7 F

In Ihrer SMF stehen die 2 Bytes FF 7F.

BeschrĂ€nken Sie sich auf maximal 3 Bytes fĂŒr Ihre Delta-Times, d.h. 16383 Ticks, gilt folgender „rechnerischer“ Zusammenhang, dargestellt als kleines Roh-BASIC-Programm (s. Listing 1).

Umgekehrt verfahren Sie bei der Bestimmung der Delta-Time aus den Werten, die in einer vorhandenen SMF stehen. Auch hier finden Sie in Listing 2 ein kleines BASIC Programm, nur zur Anregung.

Zum Abschluß dieser kurzen EinfĂŒhrung möchte ich Ihnen ein SMF Byte fĂŒr Byte darstellen. Der zugrunde liegende „Song“ hat folgende Struktur:

C-Dur. 3/4-Takt, 2 Takte:

  1. Takt: Noten h‘ 1/2 dann A 1/4
  2. Takt: Akkord a 1/2 + V 1/2 + d’ 1/2 + D 1/2 dann Pause 1/4

In der hexadezimalen Darstellung der zugehörigen SMF (s. Tabelle 2) steht hinter dem letzten Delta-Time-Byte immer ein Punkt. Die Kommentare sind in einem anderen Schriftsatz gehalten. Die Reihenfolge der NOTE-ON-Befehle bei einem Akkord spielt dann keine Rolle, wenn nicht sofort wieder derselbe Ton eingeschaltet wird. Sonst kĂ€me es zu Überlappungen.

Sie können diesen Beispiel-"Song“ einmal ĂŒber DATA-Zeilen, einen Disk-Monitor oder ein kleines Hilfsprogramm eingeben und damit Ihren Sequenzer testen! Manche Sequenzer kommen durch Meta-Events durcheinander. Die Grundform mit Format 0 ohne Meta-Events bis auf EOT mĂŒĂŸte er aber lesen können. Sie können in dem Beispiel-“Song“ Time Signature und Set Tempo entfernen. Dann mĂŒssen Sie aberdieTrack Chunk-LĂ€nge anpassen. Probieren Sie es einmal!

Literatur:

Michael Cxelsperger Introducing Standard MIDI File, Electronic Musician, April 1989, S50ff

Liste der Meta Events

Typ LĂ€nge Name Inhalt
00 02 Sequence Number 2-Byte-Nummer, nur zulÀssig VOR irgendeiner NICHT NULL Delta Time und irgendeinem normalen MIDI-Event
01 var Text Event irgendein Text
02 var Copyright Notice Dieser Text sollte ein ‘C’, das Jahr und den Namen enthalten. Der Event sollte ganz am Anfang stehen
03 var Sequence Track Name irgendein Text
04 var Instrument Name irgendein Text
05 var Lyric irgendein Text zur gleichzeitigen Silbenanzeige beim Abspielen eines Songs
06 var Marker irgendein Text, z.B. 1.Strophe“
07 var Cue Point irgendein Text
20 01 MIDI Channel Prefix ordnet MIDI-Daten. die keine Kanalbezeichnung enthalten (System-Exklusiv, Running-Mode), einem bestimmten Kanal zu.
2F 00 End Of Track muß am Ende stehen
51 03 Set Tempo Die 3-Byte-Zahl gibt die Mikrosekunden pro Viertelnote an: 16 E3 60 * 1,5 Sek./Viertel - Tempo MM40
58 04 Time Signature 4-Byte Zahl mit folgendem Aufbau: nn dd cc bb. wobei nn der ZĂ€hler, dd die 2er-Potenz des Nenners ist Ein 6/8-Takt wĂŒrde dargestellt als 58 04 06 03 cc bb. wobei 6/2 hoch 3 eben 6/8 ergibt. Die Bedeutung von cc und bb ist mir nicht klar. Ich kann nur eine Übersetzung geben: cc ist die Anzahl der MIDI-Clocks fĂŒr einen Metronomschlag, bb die Zahl der notierten 32stel in einer MIDI-Viertelnote. d.h. 24 MIDI-Clocks. bb mĂŒĂŸte meiner Meinung nach immer 8 sein, da 1/4 durch 8 1/32 ergibt.
59 02 Key Signature Das erste Byte gibt die Anzahl der Kreuze/Bs an. Ist die Zahl positiv, sind es Kreuze, andernfalls Bs. Das zweite Byte entscheidet ĂŒber DUR oder moll. Ein 00 bedeutet DUR. ein 01 moll.
7F var Sequencer Specific Ein Sequenzer, der NUR SMF lĂ€dt und speichert, kann Informationen ĂŒber Pattern-Struktur und andere notwendige Daten unter diesem Event ablegen. Das erste Byte sollte die ID des Sequencers enthalten.

All diese Meta Events sind bis auf EOT optional, d.h. sie mĂŒssen nicht in Ihrer SMF stehen.

Tabelle 1

INPUT „Geben Sie die zu wandelnde DELTA-Time ein:";delta lsb=delta AND &7F ' 7F hex = 127 dez dsb=(delta DIV &80) AND &7F ' 80 128 msb=(delta DIV &4000) AND &7F ' 4000 = 16384 IF msb>0 THEN PRINT msb+&80 IF dsb>0 THEN PRINT dsb+&80 PRINT lab

Listing 1: Delta-Time-Wandlung

DIM wert(4),faktor(4) faktor (1)=1 : faktor(2)=128 : faktor(3)=16384 i=0 REPEAT i=i+1 INPUT "Geben Sie ein Byte ein:";wert(i) UNTIL wert(i)<&80 or i=3 delta=0 j=0 REPEAT j=j+1 delta=delta+(wert(i+1-j)AND &7F)*faktor(j) UNTIL i+1-j=1 PRINT delta

Listing 2. Bestimmung der Delta-Time

**Header Chunk** 4D 54 68 64 Kennung MThd 00 00 00 06 Header Chunk LĂ€nge 00 00 Format 0 00 01 1 Track 00 60 96 Ticks/Viertel **Track Chunk** 4D 54 72 6B Kennung MTrk 00 00 00 3B Track Chunk LĂ€nge 00 FF 58 04 03 02 18 08 nach 00 Ticks Meta Time Signature 3/2 hoch 2 00 FF 51 03 16 E3 60 nach 00 Ticks Meta Set Tempo 1,5 Sek./Viertel 00 90 47 40 nach 00 Note h' auf Kanal 1 mezzoforte On 81 40 47 00 nach 192 Ticks Note h’ Off 00 2D 40 sofort Note A mezzoforte On 60 2D 00 nach 96 Ticks Note A Off 00 26 40 sofort Note D mezzoforte On 00 3E 40 d' 00 41 40 f' 00 45 40 a' 81 40.3E 00 nach 192 Ticks Note d' Off 00 41 00 f' 00 45 00 a' 00 26 00 D' 60 FF 2F 00 nach 96 Ticks "Schweigen" Meta EOF

Tabelle 2

Siegfried Just