MIDI In/Out im Interrupt

Haben Sie sich schon einmal mit der Programmlerung von MIDI-Software befaßt? Dann wird Ihnen sicherlich auch aufgefallen sein, dass ATARI seinerzeit zwar eine MIDI- Buchse standardmäßig vorgesehen, aber das parallele Empfangen von MIDI-Daten und Ausüben einer anderen Funktion nicht im Betriebssystem vorgesehen hat. Doch zur Lösung dieses Problems gibt es einen einfachen Weg.

Die Firma ATARI hat seinerzeit die Musikwelt zwar mit integrierten MIDI Verbindungen gesegnet, aber damals war Multitasking noch eher ein Fremdwort - zumindest haben die Entwickler des TOS die Fähigkeiten der 68000er CPU nicht wirklich genutzt. Und so ergeben sich ernsthafte Probleme, MIDI-Daten zu versenden und gleichzeitig etwas anderes zu tun, z.B. eine neue Datei auszusuchen oder auf dem Falcon Audio Dateien nachzuladen. Professionelle Programme schreiben einfach Teile des Betriebssystems neu und verbiegen dann die Vektoren, aber das ist nicht jedermanns Sache und auch nicht immer notwendig. Für unser Problem, MIDI-Daten zu empfangen und zu senden, genügt eine einfachere Lösung, zumindest für den Hausgebrauch.

Der VBL-Interrupt

Wenn der Rechner eine andere Aufgabe übernehmen soll, muss die MIDI-Übertragung also im Hintergrund erledigt werden. Dafür bietet sich der VBL- Interrupt an. Je nach Monitor wird er ca. 60mal pro Sekunde aufgerufen, und das sollte in Bezug auf Genauigkeit für MIDI-Daten an sich reichen.

Man könnte auch den HBL nutzen, der nach dem Zeichnen jeder Zeile auf den Monitor auftritt, allerdings bietet selbst er für einen Computer nur eine kurze Zeitspanne. Zudem ist auch der Zugang zum VBL recht einfach und vom TOS praktisch bereitgestellt. Allerdings ist die Nutzung der Interrupts mit Bedingungen verbunden. So zum Beispiel sind BIOS Routinen nicht erlaubt. Das heißt, daß die übliche Methode, mit Bconin(3) Zeichen von der MIDI-Schnittstelle einzulesen, tabu ist. Dafür gibt es aber noch lorec(2).

Über diesen Betriebssystem-Aufruf erfahren wir nämlich die Adresse des Buffers, in den die Daten eingelesen und zwischengespeichert werden. Bconin(3) liest selbst aus diesem Buffer. Es ist jedoch zu beachten, daß man, wenn man selbst ausliest, den internen Füllstand-Zeiger wieder auf den Anfang setzt, wenn er das Ende erreicht hat. Das erledigt nämlich normalerweise Bconin(3). Damit wäre das Problem also gelöst.

Bleibt noch die Ausgabe der Daten. Dies gestaltet sich etwas schwieriger, denn wenn man sich anschaut, was das Betriebssystem in Bconout(3) macht, geht das in einem Interrupt schlichtweg nicht - er wartet nämlich, bis das Zeichen entgegengenommen werden kann. Im schlimmsten Fall wird es das nie, zum Beispiel immer dann, wenn das Gerät nicht eingeschaltet ist. Aber auch das ist kein Problem, man braucht nämlich nur die Warteschleife zu limitieren mit einer maximalen Anzahl von Versuchen. Soweit die Theorie, schreiten wir nun zum praktischen Teil.

Die Praxis

Wie man eigene Routinen im VBL einhängt, ist schon mehrfach beschrieben worden - diesmal eine Variante in C (interrupt_init()). Wichtig ist, das Ganze im Supervisor Modus zu erledigen und den Vector nach getaner Arbeit wieder freizugeben. Man muß auch mit der Möglichkeit rechnen, daß kein Vector mehr frei ist. Es empfiehlt sich, in einem Programm möglichst mit den Standard Routinen wie Bconout(3), etc. zu arbeiten und nur bei Bedarf kurzfristig die Funktion midi_in_out() über den Interrupt aufrufen zu lassen. Wenn der Vector nicht freigegeben wird, werden Sie das dann sehr bald merken. Zum Einlesen der Daten habe ich allerdings der Einfachheit halber für beide Fälle die gleiche Prozedur verwendet.

Bei der Ausgabe dagegen können im Interrupt schon Ungenauigkeiten auftreten, wenn viel Daten anliegen. Weniger in dem Beispielprogramm, aber wenn Sie z.B. 32 Tracks mit vielen Daten haben, kann es durchaus sein, daß sich ein Stau bildet, weil die Zeit pro lnterrupt einfach nicht ausreicht.

Und die Aussichten

Das Beispielprogramm gibt zeitlich versetzt das wieder, was Sie spielen. Für ein echtes MIDI-Programm müssten die Daten aus dem temporären Buffer zwischendurch in handliche Strukturen übertragen werden. Wenn Sie dann zum Beispiel noch 16 Tracks anlegen und das Ganze auf dem Bildschirm grafisch darstellen, haben Sie schon den Grundstock für einen MIDI-Sequenzer und können ihn um all die Möglichkeiten, die MIDI bietet, erweitern.
In diesem Sinne viel Spaß beim Experimentieren.

Anmerkung:

Begleitend zu diesem Artikel erhalten Sie das Beispiellisting sowie die Beispieldatei über die Spezial-Diskette 3/98. Auf Wunsch können Sie die Daten auch über das Internet herunterladen.


W. Schlisong
Aus: ST-Computer 03 / 1998, Seite 22

Links

Copyright-Bestimmungen: siehe Über diese Seite