Ausgabe 24, März 1999
Und was ist eine MIDI-Faderbox ?
Nun soll mit Hilfe des Entwicklungssystems ES535 eine kleine Box gebaut werden (eine sogenannte Faderbox), die (erst einmal) ein Potentiometer beinhaltet, mit welchem Controllerdaten generiert werden, so dass beliebige elektronische Klangerzeuger, Software-Synthesizer und sonstige Midi-Geräte fernbedient werden können. Die Controllernummer (1-128), sowie die Midi-Kanalnummer, auf welcher gesendet wird (1-16), sind dabei frei wählbar.
Elektrische Eigenschaften der MIDI-Schnittstelle
Die Midi-Schnittstelle ist eine serielle Schnittstelle (RS 232 C), mit einer Übertragungsrate von 31,25 Kbaud. Es gibt 1 Startbit, 8 Datenbits und 1 Stopbit, also insgesamt 10 Bits für eine übertragene Midi-Informationseinheit.
Der Midi-Schaltkreis ist ein geschlossener Stromkreis (5 mA). Der logischen 0 entspricht Strom an. Ein Ausgang steuert einen Empfänger an. Um Brummschleifen und Datenfehlern vorzubeugen, ist der Midi-Eingang mit einem Optokoppler ausgestattet.
Midi-Kabel haben an beiden Enden einen 5-poliger DIN-Stecker. Für Midi-In und -Out müssen verschiedene Kabel verwendet werden, die maximale Kabellänge beträgt 15 m.
Neben Midi-In- und -Out-Buchsen gibt es an vielen Geräten auch noch eine Midi-Through-Buchse, zu der das am Eingang anliegende Signal unverändert durchgeschliffen wird.
Aufbau der MIDI-Befehle
Ein MIDI-Befehl besteht in seiner einfachsten Form aus 1-3 Bytes. Das erste Byte wird als Status-Byte bezeichnet, ihm können mehrere Daten-Bytes folgen. Controller-Meldungen benötigen z. B. zwei Daten-Bytes.
Das Status-Byte legt die Aktion fest, die stattfinden soll (z. B. "Note on") und gibt außerdem den Kanal an, auf welchem dies geschehen soll (1-16).
Die Daten-Bytes enthalten dann die dazugehörigen Werte (z. B. die Lautstärke des erzeugten Tons).
Bei einem Status-Byte ist immer das 8. Bit (Bit 7 bei Zählung von 0) gesetzt, d. h. ein Status-Byte ist immer größer als 127 (= 7F Hex). Das kleinste Status-Byte ist also 80h (was bedeutet: "Note off"). Demzufolge ist das 8. Bit bei Daten-Bytes nie gesetzt, sie sind also nie größer als 127.
Die Status-Bytes von 80h bis EFh werden Voice Messages genannt und können Informationen auf einem der 16 Kanäle übertragen.
Die Bedeutung des höherwertigen Nibbles (den ersten vier Bits) ist wie folgt:
8 = Note Off, 9 = Note On, A = Aftertouch, B = Control Change, C = Program Change, D = Channel Pressure, E = Pitch Wheel
Die Kanalnummer wird im unteren Nibble (also den 4 niederwertigen Bits) des Statusbytes übertragen, z. B. bedeutet bei 9Fh die 9h-"Note on", und Fh-15 (entspricht - von Null an gezählt - Kanal 16). Die 16 möglichen Werte, die ein Nibble annehmen kann, begrenzen die Anzahl der Midi-Kanäle.
Um die Anzahl der Kanäle zu vergrößern, benötigt man hardwaremäßig getrennte Ports, über die man jeweils 16 weitere Midi-Kanäle ansprechen kann.
Der Midi-Befehl Control Change
Es gibt 128 mögliche Controller-Nummern (0-127). Einige sind bestimmten physikalischen Eingabehilfen zugewiesen - wie etwa Controller 1 dem Modulation Wheel, Contr. 7 - Lautstärke, Contr. 10 - Panning, andere sind frei verfügbar.
Mit frei wählbaren Controller-Nummern können also viele Parameter von Midi-Equipment ferngesteuert werden, auch wenn diese Geräte z. B. im Rack stehen oder keine eigenen physikalischen Regler haben.
Das Statusbyte ist B0h bis BFh.
Dann folgen zwei Datenbytes: ersteres beinhaltet die Controllernummer und zeigt an, welcher Controller von der Midi-Message betroffen ist.
Das zweite Datenbyte ist der Wert, welcher eingestellt werden soll.
Der Bau der Box
Neben der Entwicklungsplatine 535 mit stabilisierter Spannungsversorgung (5 Volt) werden folgende Bauteile benötigt:
Das Poti schließen wir an den Analogeingangsport (Port P6) an. Dabei werden die Enden des Potis mit Ground, bzw. mit Vcc verbunden. Der Schleifer geht an den entsprechenden Pin des Ports 8 (in diesem Beispiel Pin 1).
Das Poti schließen wir an den Analogeingangsport (Port P6) an. Dabei werden die Enden des Potis mit Ground, bzw. mit Vcc verbunden. Der Schleifer geht an den entsprechenden Pin des Ports 8 (in diesem Beispiel Pin 1).
Die Midi-Out-Schaltung:
Dem TxD-Anschluß des 80535-Prozessors (Pin 22) wird ein zweifacher Inverter nachgeschaltet. Diese Impedanzwandlung ist nötig, um den Port gegen Potentialunterschiede und mögliche Spannungsspitzen zu schützen. Dazu müssen die zu sendenden Daten vor dem Pegelwandler MAX 232 abgegriffen werden, der sie auf MIDI-unbrauchbare 12 Volt wandelt. Dann wird ein 220 Ohm-Widerstand zwischen den Inverter und die Midi-Buchse (Pin 5) geschaltet, ein weiterer zwischen Pin 4 und +5V, Pin 2 wird mit Ground verbunden. Pins 1 und 3 der Midi-Buchse bleiben frei.
Ferner werden noch Pin 1 (Vcc) des Pfostensteckers St1 mit Pin 3 (VAREF), sowie Pin 2 (GND) mit Pin 4 (VAGND) verbunden.
Die Programmierung der Faderbox
Unser Programm soll den Potentiometerwert auslesen und, wenn er sich ändert, als Midi-Controllerbefehl senden. Controllernummer und Kanal werden im Programm selbst als Variablen eingegeben.
Zur Programmierung wird der Macrocompiler MC535 verwendet.
Als erstes werden die Timer so initialisiert, dass mit Timer 1 die Midi-Baudrate (31,25 kB) generiert werden kann. Dies ist nötig, da der eingebaute Baudratengenerator nur 4800 oder 9600 Bps erzeugen kann.
Procedure init Define BSY DCh Define TI 99h ;SCON.1 WrPCON 10000000b ;SMOD=1 WrTMOD 00100001b ;Timer0; 16-Bit-Zeitgeber, Timer1: ;8-Bit-Auto-Reload WrTH0 252 ;942 bis Überlauf: ca. 1 ms WrTL0 122 ;122 - 10 Zyklen Zeitausgleich WrTH1 254 ;2 bis Überlauf: 31,25 kB WrTL1 254 WrTCON 01010000b ;Timer 0 & 1 starten WrSCON 01010010b ;Init RS232 (TI) WrADCON 00000000b ;ADCON=0, BD=0 EndProc
Dann müssen noch die Prozeduren RdAD und send-byte definiert werden, da die im Betriebssystem des EPROMS vorhandenen Routinen RdAnalog und WrCOM Routinen verwenden, die sich mit der Midi-Baudrateneinstellung nicht vertragen.
Procedure RdAD AND 7 WrADCON WrDAPR 00h ;Messung starten WhileBit BSY EndWhile RdADDAT ;Messwert auslesen EndProc Procedure send-byte WhileNotBit TI ;Warten bis Sender leer EndWhile ClearBit TI WrSBUF ;Ausgeben (TxD) EndProc
Die Abfrage des Potis geschieht in einer Endlosschleife (Procedure abfrage).
Wenn sich ein Wert verändert, wird Procedure send-midi angesprungen,
welche die drei Midi-Bytes sendet.
Procedure send-midi RdMEM 0 ;Speicher 0 (Statusbyte) auslesen send-byte ;und senden RdMEM 1 ;Speicher 1 (Controller-Nr.) auslesen send-byte ;und senden SwapAB ;zwischengespeicherten Wert zurück zu A send-byte ;und senden WrMEM 2 ;speichern EndProc Procedure abfrage RdAD 0 ;Analogport 1 auslesen B 2 ;B=2 /B ;A/B (um 7-Bit-Wert zu erhalten) WrB ;in B speichern RdMEM 2 ;letzten gesendeten Wert auslesen IfA<>B send-midi ;ins Unterprogramm wenn sich Wert verändert hat EndProc
Im Hauptprogramm werden erst noch die Speicherplätze mit der vorgegebenen Controller- und Channelnummer definiert. Das Statusbyte reicht von B0h für Kanal 1 bis BFh für Kanal 16 (siehe 'Aufbau der Midi-Befehle'). Der Wert des Controllerbytes entspricht den Controllern 1-128.
Begin init A B0h ;Status - Kanal 1 WrMEM 0 A 7 ;Controller-Nr. (1-128), hier Lautstärke WrMEM 1 Loop abfrage End
Das Programm kann im Macrocompiler MC535 (in vorgegebener Reihenfolge) eingegeben, compiliert, zum System übertragen und anschließend direkt gestartet werden. Das Midi-Kabel kann nun mit beliebigen Klangerzeugern (oder sonstigen Midi-Geräten) verbunden werden (bitte erst nach dem Programmstart !), und sorgt (mit den vorgegebenen Variablen) dafür, dass auf dem Midi-Kanal 1 die Lautstärke verändert wird. Es ist eine sehr einfache Version des Programms und als Basis für Weiterentwicklungen gedacht. Beispielsweise können mehrere Potis oder andere Eingabeelemente angeschlossen werden.
Weitere Informationen - unter anderem über Details der Midi-Spezifikation
- können im Internet eingesehen werden. Hier ein paar Adressen:
www.harmony-central.com/MIDI
www.midiweb.com
www.midi.org (die Seite der MIDI Manufacturers Association)
Viel Spaß !
Diesen Text im Wordformat laden.