Voici un exemple de code source qui permet d'envoyer des messages long (par exemple des SysEx) à un périphérique Midi.
Malheureusement, il n'y a pas de fonctionnalités simple dans le Framework qui permettent de recevoir ou d'envoyer des infos sur les ports.
Il faut utiliser la DLL "winmm.dll"
L'élément le plus important est de réussir à transmettre les données à la fonction par l'intermédiaire de 'hdr.lpData'.
J'ai choisi d'utiliser 'System.Runtime.InteropServices.Marshal.AllocHGlobal'
mais bien sûr, il existe plein d'autres méthode tout aussi valable.
Source / Exemple :
Structure MIDIHDR
Dim lpData As IntPtr
Dim dwBufferLength As Integer
Dim dwBytesRecorded As Integer
Dim dwUser As Integer
Dim dwFlags As Integer
Dim lpNext As Integer
Dim Reserved As Integer
Dim dwOffset As Integer
Dim dwReserved1 As Integer
Dim dwReserved2 As Integer
Dim dwReserved3 As Integer
Dim dwReserved4 As Integer
End Structure
Private Declare Function midiOutOpen Lib "winmm.dll" (ByRef lphMidiOut As Integer, ByVal uDeviceID As Integer, ByVal dwCallback As Integer, ByVal dwInstance As Integer, ByVal dwFlags As Integer) As Integer
Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOUT As Integer) As Integer
Private Declare Function midiOutMessage Lib "winmm.dll" (ByVal hMidiOUT As Integer, ByVal Msg As Integer, ByVal dw1 As Integer, ByVal dw2 As Integer) As Integer
Private Declare Function midiOutPrepareHeader Lib "winmm.dll" (ByVal hMidiOUT As Integer, ByRef lpMidiOutHdr As MIDIHDR, ByVal uSize As Integer) As Integer
Private Declare Function midiOutUnprepareHeader Lib "winmm.dll" (ByVal hMidiOUT As Integer, ByRef lpMidiOutHdr As MIDIHDR, ByVal uSize As Integer) As Integer
'Envoie un message long
Public Sub MidiSendLong(ByVal hMidiOut As Integer, ByVal text_msg As String)
Dim hdr As MIDIHDR
Dim result As Integer
Dim ss() As String = text_msg.Split(" ")
Dim size As Integer = ss.Length
hdr.lpData = System.Runtime.InteropServices.Marshal.AllocHGlobal(size)
For i As Integer = 0 To size - 1
System.Runtime.InteropServices.Marshal.WriteByte(hdr.lpData, i, CByte(Val("&h" & ss(i))))
Next
hdr.dwBufferLength = size
hdr.dwBytesRecorded = size
result = midiOutPrepareHeader(hMidiOut, hdr, 48)
result = midiOutLongMsg(hMidiOut, hdr, 48)
result = midiOutUnprepareHeader(hMidiOut, hdr, 48)
System.Runtime.InteropServices.Marshal.FreeHGlobal(hdr.lpData)
End Sub
'Exemple d'utilisation
Dim hMidiOut as integer
Dim deviceID as integer = 0 'numéro du périphérique
midiOutOpen(hMidiOut, deviceID, 0, 0, 0)
MidiSendLong(hMidiOut, "F0 54 78 03 7F F7")
midiOutClose(hMidiOut)
Conclusion :
Bonne programmation à tous.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.