Einzelnen Beitrag anzeigen

Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

MIDI-Komponenten, Teil 1: TMidiOutput

  Alt 3. Mai 2008, 11:31
Hi,

mein Hier im Forum suchenMIDI-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
Angehängte Dateien
Dateityp: zip midicomp6_306.zip (54,5 KB, 305x aufgerufen)
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat