Hi,
mein
MIDI-Klavier erfreut sich großer Beliebtheit. Da werde ich manchmal von Leuten, meist per Mail, gefragt, wie man denn mit MIDI arbeitet. Daher werde ich hier ein paar Tutorials schreiben. Ich fange mit dem wahrscheinlich interessantesten an - dem MIDI-Ausgang.
Das MIDI-Klavier war damals eigentlich ein Testprojekt. Ich habe irgendwo eine Komponente gefunden und heruntergeladen, sie aber dann doch nicht genutzt. Als ich sie dann auf einer Sicherungs-CD wiedergefunden habe, habe ich das MIDI-Klavier erstellt, um es mal auszuprobieren. Als ich das Midi-Klavier hier in der
DP vorgestellt habe, war
turboPASCAL so freundlich, sie für neuere Delphiversionen anzupassen. Die angepassten Versionen habe ich hier angehangen. Kopiert die Dateien einfach in euer Programmverzeichnis oder in ein anderes Verzeichnis in eurem Suchpfad.
MIDI-Ausgang
Für die Turbo-Delphi-Kompatiblität erstelle ich die Komponente "per Hand":
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MidiOut;
//Unit MidiOut hinzufügen!
type
TForm1 =
class(TForm)
private
{ Private-Deklarationen }
MidiOut: TMidiOutput;
//Feld MidiOut hinzufügen
public
{ Public-Deklarationen }
end;
Es muss die
Unit "MidiOut" eingebunden und ein Feld für die Komponente erstellt werden. OnCreate/OnDestroy können z. B. so aussehen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
MidiOut := TMidiOutput.Create(self);
MidiOut.DeviceID := -1; //MIDI-Mapper
MidiOut.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MidiOut.Close;
//Freigabe übernimmt Owner
//Wurde beim Erzeugen nil übergeben:
//MidiOut.Free;
end;
Der MIDI-Mapper übergibt die MIDI-Signale an das Standardgerät (unter Systemsteuerung, Multimedia/Sounds und Audiogeräte, (Audio,) Midi (je nach
OS) und sollte eigentlich immer funktionieren, wenn ihr im WMP MIDIs hören könnt. Unter älteren OSsen können unterschiedliche MIDI-Kanäle per MIDI-Mapper sogar an unterschiedliche Geräte weitergeleitet werden.
Wollt ihr stattdessen andere Geräte verwenden, so könnt ihr den User diese Geräte z. B. in einer ComboBox (Style = csDropDownList) zur Auswahl anzeigen:
Delphi-Quellcode:
procedure TForm1.DeviceComboBoxChange(Sender: TObject);
begin
MidiOut.Close;
MidiOut.DeviceID := DeviceComboBox.ItemIndex - 1;
MidiOut.Open;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
MidiOut := TMidiOutput.Create(self);
for I := -1 to MidiOut.Numdevs - 1 do
begin
MidiOut.DeviceID := I;
DeviceComboBox.Items.Add(MidiOut.ProductName);
end;
DeviceComboBox.ItemIndex := 0;
MidiOut.DeviceID := -1; //MIDI-Mapper
MidiOut.Open;
end;
Und nun soll ein Ton ausgegeben werden. Dazu muss man MIDI-Messages senden. Das geht besonders einfach mit der procedure PutShort:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
MidiOut.PutShort($90, 64, 127);
sleep(500);
MidiOut.PutShort($80, 64, 64);
end;
Die wichtigsten Messages sind:
Code:
X = Kanal (0..F)
NN = Note (0 = C (Oktave 0), 1 = C#-0 usw., "Normal" ist Oktave 4)
?? = nicht belegt
$8X NN AA - Note off ("Klaviertaste loslassen"), AA = Ausschaltdynamik
$9X NN AA - Note on ("Klaviertaste drücken"), AA - Anschlagstärke
$CX II ?? - Instrumentenwechsel (II - neues Instrument für diesen Kanal)
Hinweis: Für Kanal 9 gelten Sonderregeln, dieser ist das Drum set.
Messages sind immer >= 128 ($80..$FF), Datenbytes < 128 (0..127).
Wer Sucht, findet sicherlich ausführliche
Tabellen wie diese hier.
Das wars soweit schon mal zum MIDI-Ausgang. Ihr seht, es ist gar nicht schwer.
Mfg
FAlter