Letzte Änderungen: 12.03.2009

Zur Hauptseite kurs9


Aufbau der MIDI-Schnittstelle und der MIDI-Events

Die MIDI-Spezifikation

MIDI steht für Musical Istrument Digital Interface, das Format wurde Anfang der 80er festgelegt. Es handelt sich hierbei eigentlich um ein sehr simples SERIELLES Ubertragungsformat.

Das MIDI-Kabel ist also eine Zweidrahtleitung ohne zusätzliche Synchron/Timing-Leitung.

Das gilt sowohl für den MIDI-In Port, als auch für den MIDI-Out Port. Grundsätzlich ist das MIDI-Format als 8 bit, serielles Format mit einer Geschwindigkeit von 31250 Baud (Bits/sekunde) ausgelegt (Toleranz 1%). Es werden hauptsächlich Bytes in serieller Reihenfolge (also nur 1 und 0) gesendet. Die Byte Zahl 2 z.B. kommt dann also als Startbit 0000 0010 Stopbit am MIDI- Port an, es werden demnach 10 BITS gesendet pro Byte. Man muss halt dran denken das Start- und Stopbit zu setzen, falls man eigene Port-Chips programmieren muss, z.b. beim Amiga.
Für die damalige Zeit war das schon schnell und reicht eigentlich auch für MIDI-Events aus, für grössere Datenmengen nicht

Die MIDI-Datentypen

Generell kann man die Bytes, die gesendet bzw. empfangen werden in STATUSBYTES und DATENBYTES unterteilen.

Die Statusbytes zeigen dem Empfänger an, dass nun eine "Message" oder "MIDI-Event" eintrifft. Die nachfolgenden Datenbytes sind dann die entsprechenden Daten für diese Events. Datenbytes ohne vorher gesendeten Statusbytes werden ignoriert-der Empfänger kann nichts damit anfangen.

Beim Statusbyte ist immer das höchste Bit gesetzt z.B. 10001 0000. Demnach sind Statusbytes, Bytes mit einem Wert von 128 und mehr. Entsprechend können Datenbytes nur einen Wert von 0-127 enthalten. Man unterteilt die eintreffenden Daten (MIDI-Events)in Channel-Messages und die System-Messages

Die Channel-Messages

Es gibt 7 verschiedene Channel Messages. Sie unterscheiden sich durch die obersten 4 Bits des Statusbytes. Die Channel-Messages werden immer mit einer Kanal-Kennung gesendet.

MIDI bietet 16 Kanäle. Es können also mit einem MIDI-Out max. 16 verschieden Instrumente/Sounds angesteuert werden. Der Kanal wird innerhalb des Status-Bytes in den untersten 4 Bits angegeben.

Statusbyte der Channel-Messages (in Bits): XXXXnnnn. XXXX ist also der Typ,nnnn der Kanal.

Die 7 verschiedenen Channel-Messages

Das 1. Byte ist das Statusbyte, danach folgen je nach Message 1 oder 2 Datenbytes

  1. HEX $8n (1000nnnn) Anzahl der folgenden Daten Bytes: 2 - NOTE OFF
  2. HEX $9n (1001nnnn) Anzahl der folgenden Daten Bytes: 2 - NOTE ON
  3. HEX $An (1010nnnn) Anzahl der folgenden Daten Bytes: 2 - Poly Key Pressure
  4. HEX $Bn (1011nnnn) Anzahl der folgenden Daten Bytes: 2 - Control Change
  5. HEX $Cn (1100nnnn) Anzahl der folgenden Daten Bytes: 1 - Program Change
  6. HEX $Dn (1101nnnn) Anzahl der folgenden Daten Bytes: 1 - Channel Pressure
  7. HEX $En (1110nnnn) Anzahl der folgenden Daten Bytes: 2 - Pitchbend
Die Tastennummern bei MIDI reichen von 0-127. #0 steht für C-2,#12 ist demnach C-1,#24 ist C 0,#36 ist C 1,#37 ist C# 1 usw...

$8n Note Off

Statusbyte: $8n,1. Datenbyte Key#,2. Datenbyte Note Off Velocity. Key # ist die Tastennummer 0-127.

$9n Note On

Statusbyte: $9n,1. Datenbyte Key#,2. Datenbyte Note On Velocity. Key # ist die Tastennummer 0-127.

Die Velocity bedeutet die Lautstärke mit der eine Note angeschlagen wird, bzw. losgelassen wird

$An Polyphonic Key Pressure (Poly Aftertouch)

Statusbyte: $9n,1. Datenbyte Key#,2. Datenbyte Pressure. Key # ist die Tastennummer 0-127.

$Bn Control Change

Statusbyte: $Bn,1. Datenbyte Controller #,2. Datenbyte Wert.

Es gibt diverse Control Change Befehle von Breath Controller bis Portamento, dieses Liste kann man in einem MIDI-Buch nachlesen.

Wichtig sind aber die Channel Mode Messages Controller # 121-127 ($79-$7F)

$Cn Program Change (Soundauswahl)

Statusbyte: $Cn,1. Datenbyte Program/Sound #

$Dn Channel Pressure (Aftertouch)

Statusbyte: $Dn,1. Datenbyte Pressure #

$En Pitch Bend (als 14 Bit Wert)

Statusbyte: $En,1. Datenbyte LSB #,2. Datenbyte MSB #. Der 14 Bit Wert setzt sich eben aus MSB+LSB Byte zusammen.

 

System Messages

$F0 System Exclusive Message (SysEx)

Diese Message besitzt keine definierte Länge und dient hauptsächlich zum Übertragen von Sounddateien an die entsprechenden Synthesizer. Diese Message beginnt stehts mit $F0 und muss durch $F7 beendet werden. Die Daten dazwischen können "frei" benutzt werden.
  1. $F0 - Statusbyte der SysEx Message
  2. ID - Identifikationsbyte des Herstellers. Falls dieses 0 ist, folgen noch 2 Sub-ID Bytes
  3. beliebig viele Datenbytes. Der Aufbau dieser Daten ist meisten im Handbuch der Synthesizer beschrieben.
  4. $F7 beendet diese Message. Eine SysEx Message ist nur dann komplett, wenn dieses Byte eingetroffen ist.

$F1 MIDI Timecode Quarter Frame

Statusbyte: $F1,1. Datenbyte 0nnndddd, nnn: Message Type ddd: Wert

Der MIDI Timecode dient zur Synchronisation des Sequencer mit anderen Geräten. Mit dem MIDI-Time-Code wird die exakte Position in der TV/Film-Studio üblichen Auflösung von Stunde, Minute, Sekunden, Frames übermittelt. Hierbei gibts es auch drei verschiedene Normen:

  1. EBU/SMPTE mit 24 Frames/sec
  2. EBU mit 25 Frames/sec
  3. TV NTSC mit 30 Frames/sec-hier wird noch in Drop Frame, Non Drop Frame unterschieden

$F2 Songposition Pointer (14 Bit Wert)

Statusbyte: $F2,1. Datenbyte LSB #, 2. Datenbyte MSB #,Der 14 Bit Wert setzt sich eben aus MSB+LSB Byte zusammen.

$F3 Songselect

Statusbyte: $F3,1. Datenbyte Songnummer

$F6 Tune Request

$F7 End of SysEx-Message

Es folgen System Real Time Messages, mit denen man andere Sequencer steuern kann, bzw. den eigenenen Sequencer extern steuern kann.

$F8 MIDI-Clock

Die Midi-Clock dient zur Geschwindigkeitssteuerung des Sequencers bzw. anderer Sequencer - ohne Datenbytes

$FA Start

$FB Continue

$FC Stop

$FE Active Sensing

Active Sensing wird von einigen Synthesizern gesendet, um zu zeigen, dass ein Gerät angeschlossen ist - kann man ignorieren.

$FF System Reset

Kompression von MIDI Daten

1. Der Running Status

Um Datenübertragung zu sparen werden bei der MIDI-Übertragung bei nacheinander folgenden und identischen MIDI-Messages das 2. Statusbyte weggelassen.

Beispiel: Es werden 2 Note On Befehle gesendet, für die Taste #64 und #65 und für den Kanal 1, dann würde man normalerweise $90,64,67 (67 ist die Anschlagsdynamik) und $90,65,88 (88 ist die Anschlagsdynamik) senden. Da nun aber das Statusbyte bei beiden gleich ist, braucht man nur $90,64,67,65,88 senden, man spart also 1 Byte ein. Falls zwischen diesen beiden Noten allerdings ein anderes Statusbyte gesendet wird, muss man natürlich wieder das passende Statusbyte mitsenden - Ausnahmen hier: System Real Time Messages haben keine Auswirkungen auf das letzte Statusbyte. Also kann man im obigen Fall $90,64,67,MIDI Clock, 65,88 senden.

Diese Form von Kompression macht schon Sinn, da man somit mehr Noten innerhalb einer kurzen Zeit übertragen kann, das ist gerade bei Akkorden wichtig.

2. Senden von Note On mit Velocity 0 statt Note Off

Um ebenfalls Daten einzusparen, werden NoteOff ($8n) Messages durch Note On ($9n) Messages mit Velocity (Lautstärke) 0 ersetzt. Diese machen alle Keyboard die sowieso kein Note Off Velocity Wert senden (also die Loslassgeschwindigkeit),

Beispiel:

Es wird eine Taste (z.B. #64) gedrückt und gleich wieder losgelassen. Dann würde normalerweise $90,64,89 (Note an) und dann 80$,64,0 (Note aus) gesendet werden. Falls nun der Note Off Velocity Wert nicht benötigt wird kann man $90,64,89,64,0 senden und spart somit auch ein Byte ein.