GNMIDI

Inhaltsverzeichnis Stichwortindex

ASCII Text Syntax
Previous  Top  Next

Die MIDI Einheit Positionsangabe und Zeitpositionsangabe werden in Kommentaren vor jedem Kommando angezeigt:
/* U7765 */  /* 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.:
beats 142.38051    
text "Contact: info@gnmidi.com"  
program Ensmble1

Programmnamen (von GM Instrumentklänge) können entweder per Nummer 0-127 angegeben werden oder aus folgender GM Instrumentenliste:
          0 GrandPno
          1 BritePno
          2 El.Grand
          3 HnkyTonk
          4 ElPiano1
          5 ElPiano2
          6 Harpsich
          7 Clavi.
          8 Celesta
          9 Glocken
         10 MusicBox
         11 Vibes
         12 Marimba
         13 Xylophon
         14 TubulBel
         15 Dulcimer
         16 DrawOrgn
         17 PercOrgn
         18 RockOrgn
         19 ChrcOrgn
         20 ReedOrgn
         21 Acordion
         22 Harmnica
         23 TangoAcd
         24 NylonGtr
         25 SteelGtr
         26 JazzGtr
         27 CleanGtr
         28 MuteGtr
         29 Ovrdrive
         30 Distortd
         31 Harmnics
         32 WoodBass
         33 FngrBass
         34 PickBass
         35 Fretless
         36 SlapBas1
         37 SlapBas2
         38 SynBass1
         39 SynBass2
         40 Violin
         41 Viola
         42 Cello
         43 Contra
         44 TremStrg
         45 Pizzicto
         46 Harp
         47 Timpani
         48 Ensmble1
         49 Ensmble2
         50 SynStrg1
         51 SynStrg2
         52 AahChoir
         53 OohChoir
         54 SynChoir
         55 OrchHit
         56 Trumpet
         57 Trombone
         58 Tuba
         59 MuteTrum
         60 FrenchHr
         61 BrasSect
         62 SynBras1
         63 SynBras2
         64 SprnoSax
         65 AltoSax
         66 TenorSax
         67 BariSax
         68 Oboe
         69 EnglHorn
         70 Bassoon
         71 Clarinet
         72 Piccolo
         73 Flute
         74 Recorder
         75 PanFlute
         76 Bottle
         77 Shakhchi
         78 Whistle
         79 Ocarina
         80 SquareLd
         81 SawLd
         82 CaliopLd
         83 ChiffLd
         84 CharanLd
         85 VoiceLd
         86 FifthLd
         87 Bass&Ld
         88 NewAgePd
         89 WarmPd
         90 PolySyPd
         91 ChoirPd
         92 BowedPd
         93 MetalPd
         94 HaloPd
         95 SweepPd
         96 Rain
         97 SoundTrk
         98 Crystal
         99 Atmosphr
        100 Bright
        101 Goblin
        102 Echoes
        103 SciFi
        104 Sitar
        105 Banjo
        106 Shamisen
        107 Koto
        108 Kalimba
        109 Bagpipe
        110 Fiddle
        111 Shanai
        112 TnklBell
        113 Agogo
        114 StlDrum
        115 WoodBlok
        116 TaikoDrm
        117 MelodTom
        118 SynthTom
        119 RevCymbl
        120 FretNoiz
        121 BrthNoiz
        122 Seashore
        123 Tweet
        124 Telphone
        125 Helicptr
        126 Applause
        127 Gunshot
Die Namen müssen genau so geschrieben werden.


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

note ::= notename | number ;

programname ::=
// folgende Drumkits gelten nur für KORG i2/i3:
"Dr1"|"Dr2"|"Dr3"|"Dr4"|"Dr5"|"Dr6"|"Dr7"|"Dr8"|
// new program names
"GrandPno"|"BritePno"|"El.Grand"|"HnkyTonk"|"ElPiano1"|"ElPiano2"|
"Harpsich"| "Clavi."|"Celesta"|"Glocken"|"MusicBox"|"Vibes"|"Marimba"|
"Xylophon"|"TubulBel"|"Dulcimer"|"DrawOrgn"|"PercOrgn"|"RockOrgn"|"ChrcOrgn"|
"ReedOrgn"|"Acordion"|"Harmnica"|"TangoAcd"|"NylonGtr"|"SteelGtr"|"JazzGtr"|
"CleanGtr"|"MuteGtr"|"Ovrdrive"|"Distortd"|"Harmnics"|"WoodBass"|"FngrBass"|
"PickBass"|"Fretless"|"SlapBas1"|"SlapBas2"|"SynBass1"|"SynBass2"|"Violin"|
"Viola"|"Cello"|"Contra"|"TremStrg"|"Pizzicto"|"Harp"|"Timpani"|"Ensmble1"|
"Ensmble2"|"SynStrg1"|"SynStrg2"|"AahChoir"|"OohChoir"|"SynChoir"|"OrchHit"|
"Trumpet"|"Trombone"|"Tuba"|"MuteTrum"|"FrenchHr"|"BrasSect"|"SynBras1"|
"SynBras2"|"SprnoSax"|"AltoSax"|"TenorSax"|"BariSax"|"Oboe"|"EnglHorn"|
"Bassoon"|"Clarinet"|"Piccolo"|"Flute"|"Recorder"|"PanFlute"|"Bottle"|
"Shakhchi"|"Whistle"|"Ocarina"|"SquareLd"|"SawLd"|"CaliopLd"|"ChiffLd"|
"CharanLd"|"VoiceLd"|"FifthLd"|"Bass&Ld"|"NewAgePd"|"WarmPd"|"PolySyPd"|
"ChoirPd"|"BowedPd"|"MetalPd"|"HaloPd"|"SweepPd"|"Rain"|"SoundTrk"|
"Crystal"|"Atmosphr"|"Bright"|"Goblin"|"Echoes"|"SciFi"|"Sitar"|"Banjo"|
"Shamisen"|"Koto"|"Kalimba"|"Bagpipe"|"Fiddle"|"Shanai"|"TnklBell"|
"Agogo"|"StlDrum"|"WoodBlok"|"TaikoDrm"|"MelodTom"|"SynthTom"|"RevCymbl"|
"FretNoiz"|"BrthNoiz"|"Seashore"|"Tweet"|"Telphone"|"Helicptr"|"Applause"|
"Gunshot"|
// old general midi programs (GM):
"Piano"| "BritePiano"| "HammerPiano"| "HonkeyTonk"| "NewTines"| "DigiPiano"| "Harpsicord"| "Clav"|
"Celesta"| "Glocken"| "MusicBox"| "Vibes"| "Marimba"| "Xylophon"| "Tubular"| "Santur"|
"FullOrgan"| "PercOrgan"| "BX-3Organ"| "ChurchPipe"| "Positive"| "Musette"| "Harmonica"| "Tango"|
"ClassicGtr"| "A.Guitar"| "JazzGuitar"| "CleanGtr"| "MuteGuitar"| "OverDrive"| "DistGuitar"| "RockMonics"|
"JazzBass"| "DeepBass"| "PickBass"| "FretLess"| "SlapBass1"| "SlapBass2"| "SynthBass1"| "SynthBass2"|
"Violin"| "Viola"| "Cello"| "ContraBass"| "TremoloStr"| "Pizzicato"| "Harp"| "Timpani"|
"Marcato"| "SlowString"| "AnalogPad"| "StringPad"| "Choir"| "DooVoice"| "Voices"| "OrchHit"|
"Trumpet"| "Trombone"| "Tuba"| "MutedTrumpet"| "FrenchHorn"| "Brass"| "SynBrass1"| "SynBrass2"|
"SopranoSax"| "AltoSax"| "TenorSax"| "BariSax"| "SweetOboe"| "EnglishHorn"| "BasoonOboe"| "Clarinet"|
"Piccolo"| "Flute"| "Recorder"| "PanFlute"| "Bottle"| "Shakuhachi"|"Whistle"| "Ocarina"|
"SquareWave"| "SawWave"| "SynCalinope"| "SynChiff"| "Charang"| "AirChorus"| "Rezzo4ths"| "Bass&Lead"|
"Fantasia"| "WarmPad"| "PolyPad"| "GhostPad"| "BowedGlas"| "MetalPad"| "HaloPad"| "Sweep"|
"IceRain"| "SoundTrack"| "Crystal"| "Atmosphere"| "Brightness"| "Goblin"| "EchoDrop"| "StarTheme"|
"Sitar"| "Banjo"| "Shamisen"| "Koto"| "Kalimba"|"Scotland"|"Fiddle"| "Shanai"|
"MetalBell"| "Agogo"| "SteelDrums"| "Woodblock"| "Taiko"| "Tom"| "SynthTom"| "RevCymbal"|
"FretNoise"| "NoiseChiff"| "Seashore"| "Birds"| "Telephone"| "Helicopter"| "Stadium!!"| "GunShot"
;

MIDI Datei Grammatik in Erweiterter BNF
midifile ::= midisong
;

midisong ::= songoption* midihead songoption* miditrack+
;

songoption ::= "mute" channel+ // diese Kanäle werden ignoriert
| "solo" channel+ // nur dieser Kanal wird benutzt
;

channel ::= number // nur 1-16 sind gültige Kanäle
; // Kanal 10 ist in GM für Schlagzeug reserviert

midihead ::= "mthd" [version] [unit] "end" "mthd"
;

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)

unit ::= "unit" number // standardmäßig: 192
;

miditrack ::= "mtrk" [ "(" channel ")" ]
       event*
    "end" "mtrk"
    ;

event ::= [ "[" channel "]" ] midievent
| "velocyon" number // standardmäßig 127
| "velocyoff" number // standardmäßig 0
| duration sep // pause zwischen Kommandos
| "print" sep
| "transpose" ["+"|"-"] number sep
| sep
| "copy" "part" literal ;
| "part" literal
   event*
"end" "part" literal
;
| "loop" number
   event*
"end" "loop"
;

sep ::= ";";

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
;

psrbasschord ::= // optional
| "basschord" literal ;

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.