Hi,
ich habe das damals so gemacht:
Delphi-Quellcode:
uses MMSystem;
var fHandle:Hwnd;
//startet den Empfang der MIDI-Signale
// Verarbeitung in midiInCallback, für mididevnum siehe unten
procedure InitMidi(mididevnum);
begin
midierror:=midiInOpen(@fHandle, mididevnum, Cardinal(@midiInCallback), mididevnum, CALLBACK_FUNCTION);
if MMSYSERR_NOERROR<>midierror then
case midierror of
MMSYSERR_ALLOCATED: ShowMessage('The specified resource is already allocated.');
MMSYSERR_BADDEVICEID: ShowMessage('The specified device identifier is out of range.');
MMSYSERR_INVALFLAG: ShowMessage('The flags specified by dwFlags are invalid.');
MMSYSERR_INVALPARAM: ShowMessage('The specified pointer or structure is invalid.');
end;
midiinstart(fHandle);
end;
procedure MidiEnd();
begin
MidiInStop(fHandle);
MidiInClose(fHandle);
end;
procedure midiInCallback(aMidiInHandle: PHMIDIIN; aMsg: Cardinal; aInstance, aMidiData, aTimeStamp: integer);stdcall;
begin
//Hier verarbeitest du das Zeug, alles wichtige ist in aMidiData enthalten
end;
//Gibt dir eine Liste der MIDI-Geräte aus in eine Listbox names lbmidi, der Index des Eintrags entspricht der Gerätenummer, die du dann an InitMidi weitergeben kannst.
procedure ListMidiDevices;
function GetMidiDeviceName(id:Integer):String;
var caps: TMidiInCaps;
begin
midiInGetDevCaps(id,@caps, sizeof(TMidiInCaps));
result:=caps.szPname;
end;
var count:Integer;
i: Integer;
midiname:String;
begin
count:=midiInGetNumDevs;
lbMidi.Items.Clear;
for i := 0 to count - 1 do
begin
midiname:=GetMidiDeviceName(i);
lbMidi.Items.Add(midiname);
end;
end;
Aber natürlich kannst du das auch eleganter in eine Klasse kapseln
Die MIDI Daten(aMidiData) sind in Wikipedia sehr gut erklärt:
http://de.wikipedia.org/wiki/MIDI#Protokoll
Was der BeatDetector genau sendet weiß ich nicht mehr, das siehst du wenn du die Daten checkst aber recht schnell.
Ich glaube es war erst ein Note On, dann ein Note Off in sehr kurzem Abstand.
Viel Erfolg,
Benjamin