MIDITALK - StandardMIDI-Files

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
Aus: ST-Computer 12 / 1990, Seite 144

Links

Copyright-Bestimmungen: siehe Über diese Seite