Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi MIDI-Komponenten, Teil 1: TMidiOutput (https://www.delphipraxis.net/113144-midi-komponenten-teil-1-tmidioutput.html)

FAlter 3. Mai 2008 11:31


MIDI-Komponenten, Teil 1: TMidiOutput
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

FAlter 5. Mai 2008 15:47

Re: MIDI-Komponenten, Teil 1: TMidiOutput
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

wo es sich gerade ergibt, falls ihr eine ComboBox/ListBox/... mit den Instrumenten füllen wollt, sodass ihr mit

Delphi-Quellcode:
MidiOut.PutShort($C0, ComboBox.ItemIndex, 0);
ganz einfach das Instrument (hier für Kanal 0) setzen könnt, füllt sie mit den angehangenen Werten einfach per Copy&Paste.

Mfg
FAlter

shmia 5. Mai 2008 16:22

Re: MIDI-Komponenten, Teil 1: TMidiOutput
 
Ich würde Methoden für die häufigsten Befehle wie z.B. NoteOn(), NoteOff(), ChangeProg(),... hinzufügen.
Das erleichtert die Benutzung und der Sourcecode des Anwenders wird besser lesbar:
Delphi-Quellcode:
MidiOut.NoteOn(chan, 75, 80); // sieht doch besser aus als .PutShort()
Sleep(100);
MidiOut.NoteOff(chan, 75, 80);

FAlter 5. Mai 2008 16:44

Re: MIDI-Komponenten, Teil 1: TMidiOutput
 
Hi,

es spricht nichts dagegen, wenn du die Klasse entsprechend erweiterst. Dann kannst du das Ergebnis ja unter OpenSource posten. :D

Mfg
FAlter

PfWSkip 26. Jan 2011 16:11

AW: MIDI-Komponenten, Teil 1: TMidiOutput
 
Unter Windows 7 scheinen die Komponenten nicht mehr richtig zu laufen.
Unter XP hat alles super und Problemlos geklappt, Eingabe wie Ausgabe.
Doch wenn ich die Komponenten jetzt unter Windows 7 ausprobiere, erhalte ich keine Eingabe (Event wird nicht ausgelöst) UND bekomme bei dem Versuch ein Signal mit PutShort auszugeben "Das angegebene Geräthandle ist ungültig!", obwohl die DeviceID gesetzt und Numdevs größer null ist.

Bei midiInput wird 1 Gerät gefunden: das keybard
Bei midioutput werden 2 Geräte gefunden: das keyboard und microsoft gs waveable synth.
Setze ich auf eine DeviceID die nicht existiert, erhalte ich logierweise einen Fehler.

Finden tut er sie anscheinend, nur beim Ansprechen scheint er ein Problem zu haben.
Ich habe die exe bereits als Administrator und unter verschiedenen Kompatibilitätsmodi ausprobiert, doch nichts ändert sich.

Bitte um Hilfe, danke ;)

beanbear6 8. Feb 2012 20:46

AW: MIDI-Komponenten, Teil 1: TMidiOutput
 
Hallo an alle Midifans,
ich hab die MidiCompo mit D7 installiert.
Hab dann die Kompos MidiIn MidiOut und MidiFile.

Beim Setzen der MidiIn krieg ich den Fehler: Invalid Device ID

und ich kann die Kompo nicht setzen. Kann mir jemand helfen??
Weis nicht was ich da tun kann..
Gruß beanbear

storlo 27. Aug 2015 15:54

AW: MIDI-Komponenten, Teil 1: TMidiOutput
 
Herzlichen Dank für diese Tutorial!

Ich habe es eben in Windows X mit Delphi XE4 in mein DMX-Steuerungsprogramm eingebaut und es funktioniert noch immer hervorragend!

beanbear6 27. Aug 2015 16:19

AW: MIDI-Komponenten, Teil 1: TMidiOutput
 
Hi Storlo,
hast Du Dir ein DMX Programm gemacht? Hast da Screenshots? Würd mich interessieren wie Du das aufgebaut hast... Wär schön wenn du was posten würdest...
Gruß beanbear6


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz