In unserem MIDI-Exkurs geht's diesmal um System-Exklusive, System-Timing und Tempi. Programmbeispiele zeigen den Unterschied zwischen relativer und absoluter Tempoprogrammierung.
Die Funktion prg_change() verarbeitet Standardnachrichten. Ihnen wird die Klangnummer im Parameter s übergeben und mit Hilfe der Betriebssystemfunktion »Bconout()« an den MIDI-Port weitergeleitet. Die Funktionen bank_change() und user_set() hingegen verarbeiten System-Exklusiv-Nachrichten. Hier sind nun die erwähnten Beispiele für den System-Exklusiv-Code wiederzufinden. Jeweils der zweite Parameter in der Funktion Bconout() besteht genau aus diesen Daten. Der erste Parameter 3 schaltet bekanntlich Bconout() auf den MIDI-Port um. Herstelleridentifikations- und MIDI-Kanal-Nr. werden nicht als Parameter übergeben, sondern als globale Variable verarbeitet. Sie müssen deshalb vorher und außerhalb jeder Funktion deklariert werden. Bei der Herstelleridentifikations-Nr. ist dies ebenfalls im Header fb_01.h geschehen. Die MIDI-Kanal-Nr. hingegen ist im Header midi.h extern deklariert.
Deshalb muß auch midi.h vor fb_01.h eingezogen werden. Entsprechendes gilt selbstverständlich für alle anderen Soundmodul-Header. Den allgemeinen MIDI-Header midi.h finden Sie in Listing A.
Der Header midi.h wurde in einigen Details verbessert. So erhielten die einzelnen Gruppen Kommentarüberschriften, um sie besser voneinander zu unterscheiden. Vor allem die Funktion tondauer() wurde weiterentwickelt. In ihr wird nur noch die Tondauer td als Parameter übergeben, da die Metronomzahl eine globale Variable ist und unmittelbar zur Verfügung steht. Weiterhin hat man eine Konstante eingeführt, die mit der Stoppuhr ermittelt wurde, so daß die Werte für M wirklich die entsprechende Zahl ¼-Noten pro Minute darstellen. Sie können dies überprüfen, indem Sie die Metronomzahl auf 60 stellen. Dann muß jede ¼-Note genau eine Sekunde lang sein. Eine weitere Verbesserungsmöglichkeit:
Man könnte die Tondauer über den System-Timer ermitteln. Dies hätte den Vorteil, daß sich die Zeiten nicht verändern, unabhängig davon, ob der Computer nur zählt oder etwas anderes tut. So ist z. B. das Multitasking in meinem Musikprogramm ORCHEST programmiert. Hier wird während der Tondauer die aufwendige Notengrafik gezeichnet. Dadurch kann die Rechnerleistung ungleich besser ausgenützt werden (Listing B).
Die Funktion test() für den FB-01 unterscheidet sich von den vorhergehenden nur durch die Bankwahl, die zusätzlich zur Klangwahl hier erforderlich ist. Damit auch eindeutig feststeht, daß sie funktioniert, wurden Sounds aus Bank 3 verwendet. Sounds aus Bank 1 würden schließlich auch angesteuert werden, wenn keine Bank angegeben wäre. Alles andere bleibt wie bei den vorhergehenden Testfunktionen.
Für ein abwechslungsreich gestaltetes Musikstück sind neben verschiedenen Klängen auch unterschiedliche Tempi erforderlich. Dazu gibt es zwei Angaben, eine absolute und eine relative.
Die absolute stellt die Metronomzahl M dar, wir kennen sie aus den bisherigen Programmbeispielen. Die relativen Änderungen heißen accelerando, abgekürzt »acc« für beschleunigen, und ritardando, abgekürzt »rit« für verlangsamen. Sie werden durch Erhöhung bzw. Erniedrigung der Metronomzahl um 20 Prozent realisiert. Dazu ist in die MIDI-Datei MIDI.H folgender Zusatz, nach der Deklaration der Metronomzahl M, einzufügen (Listing C)
Um den Effekt deutlicher werden zu lassen, habe ich hier 20 Prozent als Änderungswert gewählt. In meinem Musikprogramm ORCHEST verwende ich jedoch bewußt nur 10 Prozent, um die Geschwindigkeitsänderung nicht als Stufe wahrnehmbar werden zu lassen. Man kann dann acc und rit mehrfach wiederholen und so entsteht ein kontinuierlicher »Geschwindigkeits-Zoom«. Das Musikbeispiel zur Demonstration der Tempoänderung für das MIDI-Soundmodul SX-16 sehen Sie in Listing D.
Hier wird zu Beginn der Funktion test() die Metronomzahl auf den Wert 100, als Absolutangabe, gesetzt. Danach - auf den MIDI-Kanälen 1 bis 4 - stellen wir die Sounds Chorus-Organ-1 und Trumpet ein. Wenn Sie dieses Beispiel für ein anderes Soundmodul umschreiben, sind hier andere Sound-, bzw. Klangbank-Nr. zu verwenden, wie in den Beispielen für die Soundmodule SX-16, K1/m und FB-01 gezeigt. Danach geben wir einige Töne aus.»Acc« erhöht nun das Tempo. Die Melodiefolge erklingt nun schneller. Danach dasselbe für Ritardando. Am Schluß ist keine Pause erforderlich - der Akkord wird eine 1/1,-Note gehalten, damit die Bewegung organisch ausschwingen kann.
Dieses Beispiel zeigt, daß man von jeder Grundgeschwindigkeit aus, die als Absolutwert am Anfang eines Stücks angegeben ist, die Geschwindigkeit nach musikalischen Erfordernissen relativ erhöhen und erniedrigen kann.
Abschließend noch ein paar Sätze zur Problematik des MIDI-Standard-Files:
Bekanntlich gibt es eine Fülle von MIDI-Programmen und fast jeder Hersteller speichert seine Daten im eigenen Format. Dadurch ist es zunächst unmöglich, Songs oder Pattern zwischen verschiedenen MIDI-Programmen auszutauschen. Die MIDI-Association hat als Lösung des Problems das Standard-MIDI-File 1.0 vorgeschlagen. Es handelt sich hierbei um eine Datei im Hexadezimal-Format. Ein Texteditor zeigt da meist nur die in den ASCII-Code passenden Zeichen. In dieser Form ist das Standard-MIDI-File völlig unleserlich. Allerdings zeigt sich ein interessanter Aspekt: Das Standard-MIDI-File ist nämlich in erster Linie platzsparend konzipiert. Es soll schnell auf Diskette gesichert oder von dort geladen werden. Dazu muß es üblicherweise erst in eine wiedergabefähige Form gebracht werden. Dies geschieht sofort beim Einlesen bzw. beim Sichern.
Was aber steckt nun genau hinter dem MIDI-Standard-File? Um die Einzelheiten möglichst anschaulich zu erläutern, besprechen wir im Anschluß an diese Serie die einzelnen Teile direkt anhand des Quelltextes.
Wer übrigens etwas noch nicht so ganz verstanden hat, darf sich ruhig mal eine Vorlesung von Prof. Walz an der FH-München Fachbereich 06 zu dem Kapitel Musik & Computer zu Gemüte führen. Diese Vorlesung steht auch Gasthörern offen. Bis dahin viel Spaß beim Ausprobieren der Beispiele.