IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Envoyer un sysex sur Midi Out avec WinMM.dll


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut Envoyer un sysex sur Midi Out avec WinMM.dll
    sté le 27 juin 2016 - 10:59
    Bonjour tout le monde,
    le sujet "Envoi de messages sur le Midi OUT

    Je cherche a envoyer un sysex vers un clavier Yamaha (Tyros 5) - pour faire monter un style avec le code suivant

    Code Windev : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    sSysexEnvoi est une chaîne = TABLE_StylesTyros5.COL_Sysex[TABLE_StylesTyros5] // Sysex a envoyer contient : F0 43 73 01 51 05 00 03 04 00 00 1C 6F F7
    // Il faut transformer la chaine en byte 
    nLongueur est un int = Dimension(sSysexEnvoi)
    tabByteArray est un tableau de nLongueur entier sur 1
     
    K est un int
     
    FOR K = 1 TO nLongueur
    tabByteArray[K] = Asc(Milieu(sSysexEnvoi, K, 1))
    END
     
    //For i est un entier = 1 To nLongueur
    // System.Runtime.InteropServices.Marshal.WriteByte(hdr.lpData, i, CByte(Val("&h" & ss(i)))) //mscorlib 
    // utiliser transfert(&cible,&source,longueur) pour remplacer cette ligne ?
    // Next
     
     
    nCodeSysex est un entier = TABLE_StylesTyros5.COL_CodeStyle[TABLE_StylesTyros5]
    sYMH_MSG est une chaîne // Yamaha SysEx ID 
    nResultat,nResultat1,nResultat2 est un entier
     
    STMIDIHDR est une structure
    DataPtr est une chaîne // Address of MIDI data
    BufferLength est un entier sur 8 // Size of the buffer
    BytesRecorded est un entier sur 8 // Actual amount of data in the buffer. This value should be less than or equalto the value given in the dwBufferLength member
    MhdrID est un entier sur 8 // Custom user data
    Flags est un entier sur 8 // Flags giving information about the buffer
    lpNext est un entier sur 8 // Reserved - do not use
    Reserved2 est un entier sur 8 // Reserved - do not use
    CallbackOffset est un entier //Type C : DWORD offset into Buffer WHEN callback is performed
    Reserved3a est un entier sur 8 octets //Type C : DWORD
    Reserved3b est un entier sur 8 octets //Type C : DWORD
    Reserved3c est un entier sur 8 octets //Type C : DWORD
    Reserved3d est un entier sur 8 octets //Type C : DWORD
    FIN
     
    MidiInHdr est un tableau fixe de NumSysexBuffers STMIDIHDR /// Pour recuperer les messages sur Midi IN
     
    hMidiIn est un entier 
    stHdr est un STMIDIHDR
     
    nSize est un entier = Taille(sSysexEnvoi)
    nCONTROL_CHANGE_INIT = CONTROL_CHANGE * 256
    nPROGRAM_CHANGE_CANAL = PROGRAM_CHANGE + gnCanalOut*256
     
    gnRetmidiOutOpen = API("WINMM.DLL","midiOutOpen",&gnHMidi,gnDeviceOut,0,0,0) // Ouverture Port clavier
    gnRetCC = API("WINMM.DLL","midiOutShortMsg",gnHMidi,nCONTROL_CHANGE_INIT)
    gnRetChangeCanal = API("WINMM.DLL","midiOutShortMsg",gnHMidi,nPROGRAM_CHANGE_CANAL)
     
     
    stHdr.BufferLength = nSize
    stHdr.BytesRecorded = nSize
    stHdr.DataPtr = &tabByteArray
     
    nResultat = API("WINMM.DLL","midiOutPrepareHeader",gnHMidi,&stHdr,nSize)
    SI nResultat <> 0 ALORS
    AfficheErreurMidiOUT(nResultat)
    FIN
     
    nResultat1 = API("WINMM.DLL","midiOutLongMsg",gnHMidi,&stHdr,nSize)
    Sleep(50)
    SI nResultat1 <> 0 ALORS
    AfficheErreurMidiOUT(nResultat1) // pour afficher un Info de l'erreur
    FIN
     
    nResultat2 = API("WINMM.DLL","midiOutUnprepareHeader",gnHMidi,&stHdr,nSize)
    SI nResultat2 <> 0 ALORS
    AfficheErreurMidiOUT(nResultat2)
    FIN
    gnRetmidiOutClose = API("WINMM.DLL","midiOutClose",gnHMidi)

    Tous les codes retour donnent bien 0, mais mon sysex n'est pas pris en compte. D'après ce que j'ai pu voir dans certains programmes en VB le sysex doit être transformé en Byte sur 2 octets.
    Ce que j'ai trouvé en VB :

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    '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) -de la librairie mscorlib
    For i As Integer = 0 To size - 1
    System.Runtime.InteropServices.Marshal.WriteByte(hdr.lpData, i, CByte(Val("&h" & ss(i)))) -de la librairie mscorlib
    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

    J'en appelle aux spécialistes MIDI/WINDEV pour des conseils éclairés avec mes chaleureux remerciements

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    As-tu essayé en jouant (sans jeu de mots) sur le type d'entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nCodeSysex est un entier sans signe // sur 1 octet / sur 2 octets etc...
    PS : belle bête le Tyros 5
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Effectivement le Tyros5 est une belle bête mais Yamaha est avare de documentation pour la programmation midi


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nCodeSysex est un entier = TABLE_StylesTyros5.COL_CodeStyle[TABLE_StylesTyros5]
    En fait cette ligne ne me sert pas ça contient un code en décimal qui me servait au depart a calculer les deux valeurs à mettre dans le sysex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    aa = PartieEntiere(nCodesSysex/128) ---> transformé en Hexa
    bb = Modulo(nCodeSysex;128)          ---> transformé en hexa
    Ce que doit recevoir le Tyros c'est le F0..........F7

    Je pense que ça doit être un problème de pointeur de data dans la structure MIDIHDR que je ne maîtrise pas et le MidiOutLongMsg ne trouve pas l'info à envoyer.

    Il doit falloir copier mon sysex F0 ..... F7 quelquepart dans cette structure, mais je ne sais pas comment, ni avec quel ordre ( Transfert(&ZoneRecetion,&ZoneSource ou un truc comme ça ?)

    Remerciements anticipés.

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Je pense que ta traduction de structure n'est pas mal, mais tu dois vérifier tes "types" d'entier. Il semble que le DWORD soit traduit en "entier sans signe sur 4 octets".

    J'avoue que je ne pourrai pas trop me pencher sur ton pb. Malgré tout, tu dois pouvoir t'en sortir en corrigeant tes types et en regardant les infos sur le msdn (https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx pour commencer).
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre à l'essai
    Homme Profil pro
    RETRAITE
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai trouvé la solution qui fonctionne :
    1- J'ai tenu compte de ta remarque pour les DWORD
    2- Il faut que la chaine Hexa Sysex soit de type Buffer :
    J'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SysexBuffer est un Buffer = sSysexEnvoi
    et dans ma stucture stHdr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stHdr.DataPtr = &SysexBuffer
    et là mon message sysex est bien exécuté

    Merci pour ton aide

    Je reviendrai certainement pour Mon probleme de décodage des messages MidiIn

Discussions similaires

  1. Envoyer des données sur un reseau, avec jeton
    Par pupucette dans le forum Réseau
    Réponses: 2
    Dernier message: 18/02/2013, 15h23
  2. Envoyer des objets sur le réseau avec une midlet
    Par asnaeb dans le forum Développement Mobile en Java
    Réponses: 3
    Dernier message: 26/08/2011, 19h40
  3. [phpMyAdmin] Comment envoyer des données sur ma bdd avec phpMyAdmin!
    Par webherbe dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 22/08/2011, 15h42
  4. Lire un mp3 avec winmm.dll
    Par DDante dans le forum C#
    Réponses: 1
    Dernier message: 06/02/2008, 11h06
  5. Envoyer une page sur internet avec delphi 7
    Par Stephane1 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 02/01/2006, 19h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo