Midi - (sysex) - envoie de message long à un contrôleur midi

Contenu du snippet

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.

A voir également

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.