Die MIDI Einheit Positionsangabe und Taktpositionsangabe (Takt.Beat.Ticks) und Zeitpositionsangabe (Millisekunde) werden in Kommentaren vor jedem Kommando angezeigt:
/* U7765 */ /* M10.1.085 */ /* 34085ms */
Kommentare sind innerhalb von /* ... */ und Zeilenkommentare beginnen mit // bis zum Ende der Datei.
Pausen sind optional vor den Kommandos entweder in MIDI Einheiten ( 47; ) oder in Taktnotation ( 536/4; ) angegeben.
MIDI Noten bestehen aus zwei Befehlen: Note ein wird als + und Note aus als - vor dem Notennamen vorangestellt.
MIDI Kanäle werden im Spurbeginn voreingestellt mtrk(Kanalnummer) oder können mit [Kanalnummer] innerhalb einer Spur vor einem Kommando umschalten (die Kanalnummer gilt bis zur nächsten Umschaltung oder Spurende).
Werte werden dezimal (0-127) oder hexadezimal ($00 - $7F) angezeigt.
Die meisten Kommandos beginnen mit einem Schlüsselwort und haben Parameter z.B.:
Das folgende Schema [nur für Fortgeschrittene MIDI Benutzer] beschreibt die Syntax von MIDI ASCII Texten in E-BNF (Erweiterter Backus-Naur-Form).
Beschreibung von Regeln in Erweiterte BNF:
symbol ::= expr ; ein Symbol auf der linken Seite wird mit dieser Regel durch den Ausdruck auf der rechten Seite ersetzt
expr kann folgende Ausdrücke sein:
expr* optionale Folge von expr
expr+ Wiederholung von expr (mindestens einmal)
[expr] optionale expr (0 oder 1 mal)
expr1 expr2 ... exprN Sequenz von expr1 ... exprN (in dieser Reihenfolge)
expr1|expr2|...|exprN Alternativen zwischen expr1...exprN (genau eine davon)
(expr) geklammerte expr (z.B. ("+"|"-")*
"mthd" "(" Schlüsselwörter und Operatoren (Groß/Kleinschreibung signifikant, werden im Ausdruck ohne Hochkommas benutzt)
// text Kommentar bis zum Ende der Zeile
literal ::= Zeichenkette in Hochkommas "..." eingeschlossen z.B. "Spur 1"
(Spezialzeichen können durch Voranstellen von \ umschrieben werden, z.B. "...\"..." ist das " Zeichen selbst in der Zeichenkette
Lexikographische Symbole (in E-BNF):
digit ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;
hexdigit ::= digit|"A"|"B"|"C"|"D"|"E"|"F"|"a"|"b"|"c"|"d"|"e"|"f" ;
decnumber ::= digit+ ;
hexnumber ::= "0" ("x"|"X") hexdigit+
| "$" hexdigit+
;
number ::= decnumber | hexnumber ;
floatnumber ::= decnumber | decnumber "." decnumber ;
notekey ::= "C"|"D"|"E"|"F"|"G"|"A"|"H"|"B"
| "c"|"d"|"e"|"f"|"g"|"a"|"h"|"b" ;
// notekey "h" wird in Deutsch verwendet, es ist dasselbe wie
// notekey "b" in Englisch
notename ::= notekey ["#" | "is" | "b" | "es"] decnumber ;
// nur gültige Noten aus der Musiktheorie sind hier erlaubt
// die Suffixes "is" und "es" werden in Deutsch benutzt
// "is" ist gleich wie "#"
// "es" ist gleich wie "b"
// Ausnahmen in deutscher Sprache:
// As is gleich wie Ab
// Es ist gleich wie Eb
// Benutzen Sie F anstelle von Eis
// Benutzen Sie C anstelle von His
// Benutzen Sie As anstelle von Aes
// Benutzen Sie Es anstelle von Ees
// Benutzen Sie H anstelle von Ces
// Benutzen Sie E anstelle von Fes
version ::= "version" number // standardmäßig Version 1
// derzeit sind nur die Versionen 0-2 erlaubt
// version 0 = eine Spur die alle Kanäle enthält
// version 1 = mehrere Spuren spielen zusammen, jede Spur sollte nur einen Kanal benutzen
// version 2 = mehrere Spuren werden hintereinander gespielt (selten benutzt)
midievent ::=
"seqnumber" number
| "text" literal
| "copyright" literal
| "trackname" literal
| "instrument" literal
| "lyric" literal
| "prefixchannel" channel // folgende Sysex oder META Kommandos gehören zu diesem Kanal
| "prefixport" number // folgende Sysex oder META Kommandos gehören zu diesem Port
| "smpteofs" number number ":" number ":" number ":" number ":" number
// SMPTE mode hour:minute:second:frame:fractional_frame
// mode 0: 24 frames/second
// mode 1: 25 frames/second
// mode 2: 30 frames/second allow dropping frames
// mode 3: 30 frames/second no dropping allowed
| "tact" number "/" number number number // tactnom / (2 ^^ tactdenom) clicks/beat 32th/beat
| "tempo" number // Mikrosekunden pro Viertelnote
| "beats" floatnumber // gleich wie 60.000.000/tempo
// Viertelnoten pro Minute
| "key" literal // literal muß ein gültiger Notenschlüssel sein:
// "Cmin" "Cmaj" "1bmin" "1bmaj" ... "7bmaj" ... "7#min" "7#maj"
| "event" // Kommandobytes ohne Änderungen einfügen
bytes // keine Länge ist angegeben
"end" "event"
| "metaevent" number // META Kommandonummer 0-127
bytes // Länge nicht angeben, wird automatisch angefügt
"end" "metaevent" // META Kommandos beginnen mit FF
| "psrmeta" "chord" literal psrbasschord // special meta events für Yamaha PSR Akkorde
| "sysevent" // Sysexkommandos (0xf0)
bytes // Länge wird automatisch angefügt
"end" "sysevent"
// Sysexende Kommando F7 wird automatisch angehängt!
| "syshex" // Sysex Kommando (F0)
hexbytes // Länge wird automatisch angefügt
"eox"
// Ende F7 wird automatisch angefügt!
| "gmreset" // common sysex command to set GM mode on
| "gsreset" // common sysex command to set GS mode on (mainly used for Roland, Yamaha)
| "gsenter" // same as command gsreset
| "gsexit" // common sysex command to set GS mode off (mainly used for Roland, Yamaha)
| "program" (programname | number | ("A"|"B"|"C"|"D") number
| "control" number number
| "hbank" number
| "lbank" number
| "banka"
| "bankb"
| "bankc"
| "bankd"
| "bankdrum" // bank*: korg i2/i3 only!
| "balance" ("left" | "right" | number)
// Zahl zwischen 0 und 127: 0 ist left, und 127 ist right, 64 ist Mitte
| "hold" ("on" | "off" | number)
| "reverb" number
| "chorus" number
| "brightness" number
| "expression" number
| "pitchmodulation" number
| "wheel" number
| "breath" number
| "foot" number
| "portamentotime" number
| "portamento" number
| "data" number
| "volume" number
| "sustain" number
| "sostenuto" number
| "softpedal" number
| "datainc" number
| "datadec" number
| "highRPN" number
| "lowRPN" number
| "pitchbendrange" number
| "localon"
| "localoff"
| "silent"
| "allnotesoff"
| "omnioff"
| "omnion"
| "monoon"
| "polyon"
| "songpos" number
| "songselect" number
| "tunerequest"
| "timingclock"
| "start"
| "continue"
| "stop"
| "activesensing"
| "polyaftertouch" note number
| "aftertouch" number
| "pitchbend" number
| notename duration number sep
| "+" notename (number|"velocyon") sep
| "-" notename (number|"velocyoff) sep
| "+" number number sep // Note ein mit Anschagstärke
| "-" number number sep // Note aus mit Anschlagstärke
;
duration ::=
number // Einheiten wie im Header definiert
| number "/" number // Takteinheiten, z.B. 3/4
;
program ::= number | programname ;
bytes ::= (number|literal)+ ;
hexsequence ::= (hexdigits|literal)+ ;
hexdigits ::= hexdigit+ ;
Hinweis: Um die Syntax der Text Dateien zu verstehen (und damit kleine MIDI Datei Änderungen mit einem Texteditor vorzunehmen) sollten Sie sich einige Beispieldateien ansehen und mit der E-BNF Beschreibung vergleichen. Lösen Sie nach und nach das Symbol midifile anhand der Regeln auf.