AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi MIDI-Komponenten, Teil 1: TMidiOutput

MIDI-Komponenten, Teil 1: TMidiOutput

Ein Tutorial von FAlter · begonnen am 3. Mai 2008 · letzter Beitrag vom 27. Aug 2015
Antwort Antwort
Benutzerbild von FAlter
FAlter
Registriert seit: 21. Jul 2004
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)
 
Benutzerbild von FAlter
FAlter

 
Delphi 10.2 Tokyo Starter
 
#2
  Alt 5. Mai 2008, 15:47
Hi,

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

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
Angehängte Dateien
Dateityp: txt midi-instrumente_872.txt (1,8 KB, 113x aufgerufen)
Felix Alter
  Mit Zitat antworten Zitat
shmia

 
Delphi 5 Professional
 
#3
  Alt 5. Mai 2008, 16:22
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);
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

 
Delphi 10.2 Tokyo Starter
 
#4
  Alt 5. Mai 2008, 16:44
Hi,

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

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
PfWSkip

 
Delphi 7 Professional
 
#5
  Alt 26. Jan 2011, 16:11
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
  Mit Zitat antworten Zitat
beanbear6

 
Delphi 7 Enterprise
 
#6
  Alt 8. Feb 2012, 20:46
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
Reiner
  Mit Zitat antworten Zitat
storlo
 
#7
  Alt 27. Aug 2015, 15:54
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!
  Mit Zitat antworten Zitat
beanbear6

 
Delphi 7 Enterprise
 
#8
  Alt 27. Aug 2015, 16:19
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
Reiner
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 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