Hallo Community!
Hab schon lange nix mehr mit Delphi gemacht, jetzt bin ich aber wieder hier gelandet und zwar mit folgendem problem: Ich möchte mit der midi-bibliothek von
hier SysEx Daten verschicken. Allerdings erhalte ich bei folgendem Aufruf
Code:
if not MIDIOutput.IsOpen(MidiOutputDevices.ItemIndex) then
begin
showmessage('Device not opened!');
exit;
end;
str := 'f0 00 00 7e 32 00 00 01 f7';
MidiOutput.SendSysEx(MidiOutputDevices.ItemIndex, str );
einen Fehler vom Typus "MMSYSERR_INVALPARAM". Gemäß
dieser Seite bedeutet das, dass der vorzubereitende MIDIheader bzw. dessen Adresse nicht korrekt ist.
Die aufgerufene Funktion tut folgendes:
Code:
procedure TMidiOutput.SendSysEx(const aDeviceIndex: integer;
const aStream: TMemoryStream);
var
lSysExHeader: TMidiHdr;
begin
aStream.Position := 0;
lSysExHeader.dwBufferLength := aStream.Size;
lSysExheader.lpData := aStream.Memory;
lSysExHeader.dwFlags := 0;
MidiResult := midiOutPrepareHeader(GetHandle(aDeviceIndex), @lSysExHeader, SizeOf(TMidiHdr));
MidiResult := midiOutLongMsg( GetHandle(aDeviceIndex), @lSysExHeader, SizeOf(TMidiHdr));
MidiResult := midiOutUnprepareHeader(GetHandle(aDeviceIndex), @lSysExHeader, SizeOf(TMidiHdr));
end;
Ich weiß nicht genau, was ich da falsch mache, vielleicht könnt ihr mir helfen. Ich arbeite mit Lazarus, aber ich glaube, das sollte hier nicht ausschlaggebend sein.
Danke,
Bääääär
[Edit:] Noch etwas zur Klärung: Im Beispiel übergebe ich einen String an eine Funktion, die einen Stream erwartet. Es exisieren jedoch zwei Versionen dieser Funktion, wovon eine den übergebenen String umwandelt und dann die abgebildete Variante aufruft. Das hat also seine Richtigkeit