Skip to content
 

Willkommen bei CCTzur Galerie

CCTeam - Home | Peter Munk

Projekt: Midi


Ich habe probiert, Midi-Töne im einem Programm zu erzeugen, und dann direkt an die Schnittstelle für den Synthesizer zu leiten. Das Problem dabei war, dass es in der von mir gewählten Programmiersprache Delphi keinen Befehl für die Ausgabe an Ports gibt. Dieses Problem löste ich durch die Einbindung von Assembler Routinen. Eine Routine:
x : byte;
x := 100;
asm
push ax
push dx
mov al,byte ptr(x)
mov dx,$330
out dx,al
pop dx
pop ax
end;
delay(200);
Mit dem Befehl „asm" wird die Routine eingeleitet.
Mit dem Befehl „push ax" sowie „push dx" werden die Inhalte der Speicher ax und dx in den Stack verschoben. Wichtig ist, das man am Ende des Programms diese Speicherinhalte wieder in umgekehrter Reihenfolge aus dem Stack heraus nimmt, da sonst das Programm abstürzt, weil der Computer diesen Platz braucht.
Mit dem Befehl „mov al,byte ptr(x)" wird der Wert der Variablen x, der ich vor der Assembler Routine den Wert 100 zugewiesen habe, in die untere Hälfte (die 1. 8 Bit) des Speichers ax übertragen. Definiert man die Variable x als word Variable, so müsste „mov ax,word ptr(x)" dastehen.
Mit dem Befehl "mov dx,$330" wird der Wert 330 Hex in dem Speicher dx verschoben. Das $-Zeichen bedeutet , dass der Computer die Zahl als Hex Zahl lesen soll. Der Wert 330 h ist die Adresse, an der der Synthsizer angeschlossen ist.
Mit dem Befehl "out dx,al" wird der Wert des al Speichers auf den Port geschickt, wobei dx die Abresse beinhaltet.
Mit dem Befehl " pop dx" und "pop ax" werden die Speicherinhalte wieder aus dem Stack gehohlt, und zwar in umgekehrter Reihenfolge, wie sie vorher mit "push ..." hineingeschoben wurden.
Mit dem Befehl "end" wird die Routine beendet.
Mit dem Befehl "delay(200)" wird die Prozedur "delay" 200mal wiederhohlt. Diese Prozedur beinhaltet nur eine sehr schwierige Mathematikaufgabe, um den Computer eine Zeitlang zu beschäftigen, da sonst die Ausgabe von Werten viel zu schnell ginge, und der Synthesizer die Angaben nicht erkennen könnte.
Um diese Kernroutine wurde nun das Programm geschrieben. Um dem Synthesizer auch die richtigen Werte zu geben, muss man die Strucktur beachten (Siehe Tabelle 1).
 
 
Tabelle 1: Strutur
Name:
Werte:
Pause (delay):
 
Init
209 (FF h)
1000
Soundindex bereitschalten
192 (0C0 h)
200
Soundindex (Klangfarbe)
1 bis 127
200
Midi Through
63 (3F h)
200
Tonkannal
1 bis 128
200
Tonhöhe
0 bis 128
200
Lautstärke
0 bis 128
200
Tonlänge
(1 bis 1000) * 1000
1000
Nun muss man alles ab Soundindex nochmals machen, aber mit der Lautstärke 0 und ohne Tonlänge, um den Ton wieder aufhören zu lassen.
Das Programm wurde nun soweit entwickelt, dass es Töne, Tonleitern auf- und abwärts und sogar die Werte aus speziellen Dateien auslesen und abspielen kann. Das alles funktionierte auf dem Computer und Synthesizer der Musikhochschule und auf dem Computer und Synthesizer von Herr Deffner, aber nicht mit meiner Austattung. Dies liegt höchstwahrscheinlich daran, dass ich keine Terratek Soundkarte haben, und das Programm die Töne nicht auf Soundblasterkarten abspielen kann. Nach langem herumprobieren und testen gelang es mir immer noch nicht die Töne abzuspielen, und weil ich den geliehen Synthsizer wieder zurückbringen musste, konnte ich meine Arbeit daran nicht fortsetzen.
(c) 2001 Peter Munk
P.S.: Ich entschuldige mich für das schlimme Schriftbild. Falls sie sich weiterhin dafür interressieren, können sie gerne die Quelltexte und die Dokumentation von mir bekommen.Hier geht es zum Download(400 KB).

Screenshot
Hier geht's zum Autor dieses Programms.

Zuletzt geändert am 2.5.2006
Von diesem Server wird auf zahlreiche Seiten anderer Anbieter verwiesen, für die wir nicht verantwortlich sind und nicht haften.