Ich brauche Hilfe bei dem midiOutLongMsg Befehl
Verfasst: 14.06.2005 17:03
Hallo Leute,
ich habe ein Problem mit der Wiedergabe von Sysex Daten bei der MIDI wiedergabe. Für diesen Zweck gibt es einen WINAPI Befehl, midiOutLongMsg_
Man übergibt einer Structur MIDIHDR einen Pointer auf einen String. In dem String befinden sich die SYSEX Daten. Die SYSEX Daten können pro Byte $00-$FF betragen. Der String muss damit auch $00 enthalten, was aber im Normalfall String Ende bedeutet und ich die Länge des Strings damit nicht über den Len Befehl erhalten kann. Was tun sprach Zeus... Der midiOutLongMsg_ Befehl gibt bei mir nichts raus und ich weiß nicht warum. Ich hoffe Ihr könnt mir helfen.
Als Grundlage habe ich das MIDICONECTOR.PB Programm aus dem Purebasic Archive benutzt. Ich mache sicherlich Fehler bei den Pointern und Structuren und bin vor lauter @ und * verwirrt...
Ich hoffe Ihr könnt helfen
...
Ein Visual Basic Programm als funktionierendes Beispiel liegt bei.
Gruß Michael
Visual Basic code:
Ende Visual Basic code
Mein nicht funktionierender PureBasic Befehl:
Edit by NicTheQuick: Code-Tags gesetzt
ich habe ein Problem mit der Wiedergabe von Sysex Daten bei der MIDI wiedergabe. Für diesen Zweck gibt es einen WINAPI Befehl, midiOutLongMsg_
Man übergibt einer Structur MIDIHDR einen Pointer auf einen String. In dem String befinden sich die SYSEX Daten. Die SYSEX Daten können pro Byte $00-$FF betragen. Der String muss damit auch $00 enthalten, was aber im Normalfall String Ende bedeutet und ich die Länge des Strings damit nicht über den Len Befehl erhalten kann. Was tun sprach Zeus... Der midiOutLongMsg_ Befehl gibt bei mir nichts raus und ich weiß nicht warum. Ich hoffe Ihr könnt mir helfen.
Als Grundlage habe ich das MIDICONECTOR.PB Programm aus dem Purebasic Archive benutzt. Ich mache sicherlich Fehler bei den Pointern und Structuren und bin vor lauter @ und * verwirrt...
Ich hoffe Ihr könnt helfen

Ein Visual Basic Programm als funktionierendes Beispiel liegt bei.
Gruß Michael
Visual Basic code:
Code: Alles auswählen
'
'My MIDIHDR Structure.. declared in a module
'
Structure MIDIHDR
Dim lpData As String
Dim dwBufferLength As Integer
Dim dwBytesRecorded As Integer
Dim dwUser As Integer
Dim dwFlags As Integer
Dim lpNext As Integer
Dim Reserved As Integer
End Structure
'
' This occurs in a click event
'
Dim myhdr As MIDIHDR
Dim sysex As String
sysex = chr$(&HF0) & chr$(&H56) & chr(&H64) & chr$(&H4F) & chr$(&H6C) & chr$(&HF7)
With myhdr
.lpData = sysex
.dwBufferLength = Len(sysex)
.dwBytesRecorded = Len(sysex)
End With
midiOutPrepareHeader(myhandle, hdr, Len(hdr))
midiOutLongMsg(myhandle, hdr, Len(hdr))
midiOutUnprepareHeader(myhandle, hdr, Len(hdr))
Ende Visual Basic code
Mein nicht funktionierender PureBasic Befehl:
Code: Alles auswählen
;Structure MIDIHDR ; Structur in Purebasic schon definiert
; lpData.s
; dwBufferLength.l
; dwBytesRecorded.l
; dwUser.l
; dwFlags.l
; lpNext.l
; Reserved.l
;EndStructure
Procedure Notesysex ()
*MemoryID = AllocateMemory(19)
PokeS(*MemoryID, Chr( $f0 )+Chr($00)+Chr($01)+Chr($40)+Chr($10)+Chr($00)+Chr($14)+Chr($48)+Chr($65)+Chr($6c)+Chr($6c)+Chr($6f)+Chr($20)+Chr($57)+Chr($6f)+Chr($72)+Chr($6c)+Chr($64)+Chr($f7))
test.s = Chr( $f0 )+Chr($00)+Chr($01)+Chr($40)+Chr($10)+Chr($00)+Chr($14)+Chr($48)+Chr($65)+Chr($6c)+Chr($6c)+Chr($6f)+Chr($20)+Chr($57)+Chr($6f)+Chr($72)+Chr($6c)+Chr($64)+Chr($f7)
Shared HandleOut
Protected Notensys.MIDIHDR, NoteDat.MIDIData, Notens.MIDIHDR
; Notensys\lpData = @*MemoryID ! not working
Notensys\lpData = @test ; not working
Notensys\dwBufferLength = 19 ; Len (test)
Notensys\dwBytesRecorded = 19 ; Len (test)
Notensys\dwFlags = 0
midiOutPrepareHeader_(HandleOut,Notensys,SizeOf(Notensys))
midiOutLongMsg_(HandleOut,Notensys,SizeOf(Notensys))
midiOutUnprepareHeader_(HandleOut,Notensys,SizeOf(Notensys))
EndProcedure