MIDI-Komponenten, Teil 1: TMidiOutput
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Es muss die Unit "MidiOut" eingebunden und ein Feld für die Komponente erstellt werden. OnCreate/OnDestroy können z. B. so aussehen:
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;
Delphi-Quellcode:
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.
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; 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:
Und nun soll ein Ton ausgegeben werden. Dazu muss man MIDI-Messages senden. Das geht besonders einfach mit der procedure PutShort:
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;
Delphi-Quellcode:
Die wichtigsten Messages sind:
procedure TForm1.Button1Click(Sender: TObject);
begin MidiOut.PutShort($90, 64, 127); sleep(500); MidiOut.PutShort($80, 64, 64); end;
Code:
Hinweis: Für Kanal 9 gelten Sonderregeln, dieser ist das Drum set.
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) 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 |
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:
ganz einfach das Instrument (hier für Kanal 0) setzen könnt, füllt sie mit den angehangenen Werten einfach per Copy&Paste.
MidiOut.PutShort($C0, ComboBox.ItemIndex, 0);
Mfg FAlter |
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); |
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 |
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 ;) |
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 |
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! |
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