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 :

Utilisation ActivX MIDIio32.OCX mabry


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 Utilisation ActivX MIDIio32.OCX mabry
    Bonjour
    Je voudrais capture des infos sysex provenant d'un clavier

    Pour celà j'utilise l'activX Mabry MIDIio32.OCX
    Le nom de mon activX : MIDIInput2

    Je sélectionne mon port Midi

    MIDIInput2>>deviceId = nLeDevice-1
    MIDIInOpen2()

    La Procédure MidiOpen2()
    //-------------------------------------------------
    SI form_receveivesysex1.MIDIInput2>>State >= MIDISTATE_OPEN ALORS
    form_receveivesysex1.MIDIInput2>>Action = MIDIIN_CLOSE
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_F9) = Faux
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_ACTIVE_SENSE) = Faux
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_CLOCK) = Faux
    FIN
    form_receveivesysex1.MIDIInput2>>Action = MIDIIN_OPEN
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_F9) = Vrai
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_ACTIVE_SENSE) = Vrai
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_CLOCK) = Vrai

    Je lance l'écoute du port

    MIDIInput2>>Action = MIDIIN_START
    Multitâche(-1)

    Ma procédure qui doit traiter les messages
    //-----------------------------------------------------

    //----------------------------------------------------------------------------------------------
    PROCEDURE MIDIInput2_Message()
    //----------------------------------------------------------------------------------------------
    n est entier
    SysexListCount est entier
    robert est une chaîne
    nMaxLong est un entier

    TANTQUE MIDIInput2>>MessageCount > 0 AND Dimension(MIDIInput2>>Buffer) > 0
    // DisplayBufferString[SysexListCount] = Hex(Caract(Gauche(MIDIInput2.Buffer, 1))) ça c'était en VB6
    DisplayBufferString[SysexListCount] = NumVersHexa(Caract(Gauche(MIDIInput2>>Buffer, 1)))
    nMaxLong = Taille(MIDIInput2>>Buffer)
    POUR n = 2 A nMaxLong
    // gsRobert = Hex(Caract(Milieu(MIDIInput2.Buffer, n, 1)))
    robert = NumVersHexa(Caract(Milieu(MIDIInput2>>Buffer, n, 1)))
    // SI Hex(Caract(Milieu(MIDIInput2>>Buffer, n, 1))) < 10 ALORS
    SI NumVersHexa(Caract(Milieu(MIDIInput2>>Buffer, n, 1))) < 10 ALORS
    robert = "0" + robert
    FIN
    DisplayBufferString[SysexListCount] = DisplayBufferString[SysexListCount] + " " + robert
    robert = ""
    FIN
    ListeAjoute(List1, DisplayBufferString[SysexListCount])
    form_receveivesysex1..Libellé = "Sysex -> Je reçois quelque chose! = " + DisplayBufferString[SysexListCount]
    MIDIInput2>>Action = MIDIIN_REMOVE
    FIN

    SI Taille(DisplayBufferString[SysexListCount]) > 0 ALORS
    FIN
    MIDIInput2>>Action = MIDIIN_REMOVE

    //----------------------------------------------------------------------------------
    PROCEDURE NumVersHexa(Number)
    //-----------------------------------------------------------------------------------
    Hex est une chaîne
    nTaille est un entier
    i est un entier

    nTaille = Taille(Number)
    POUR i = 1 A nTaille
    Hex += NumériqueVersChaîne(Asc(Number[[i]]),"2X")
    FIN

    RENVOYER Hex


    Le souci c'est que je reçois rien et n'accède pas à la procédure : comment vient-on dans ma procédure ?

    Avec Winmm.dll il y a une fonction Callback qui intervient

    Là ça devrait être pareil ? mais comment indiquer à l'activX ou est ma fonction CallBack ?

    J'ai pu faire marcher ça en VB6 mais ça marche pas en Windev, je n'accède jamais à MIDIInput_message()


    Autre question
    comment affecte-t-on un filtre avec Winnmm.dll pour recevoir les infos sysex
    comme ci-dessous mais dans l'API
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_F9) = Vrai
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_ACTIVE_SENSE) = Vrai
    form_receveivesysex1.MIDIInput2>>Filter(FILTER_CLOCK) = Vrai

    Merci d'avance pour vos conseils éclairés

  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
    ta procédure d'écoute doit être lancée régulièrement : un timer devrait faire l'affaire (après le code d'ouverture du port). Ou tu peux mettre ta procédure sur timer automatique (1:30 dans le bandeau en haut de ta procédure).

    Sinon, il faudra utiliser un thread. Tu y viendras car ta procédure va bloquer ta fenêtre...
    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,
    Merci pour l'intéret que tu portes à mon problème.

    Effectivement le thread sera la solution finale car le but de mon truc c'est un logiciel d'affichage de partitions musicales (j'utilise l'activX PDF)
    et je veux capter l'appui sur un bouton du clavier pour tourner les pages
    donc il y a bien de l'attente d'info pendant que l'on joue la partition et l'info sysex peut arriver à tout moment

    Le premier problème que j'ai à solutionner c'est récupérer le message envoyé par ce bouton

    Si j'utilise Winmm.dll je sais capter les note de musique jouées avec :

    nRetFonc = API("WINMM.DLL","midiInOpen",&RiSysex,nLeDevice, &MIDIInput_Callback,0,CALLBACK_FUNCTION)

    et un MidiInStart
    ma fonction CallBack est bien utilisée

    Mais pour avoir les infos Sysex autres que les notes je doit mettre des filtres :
    Dans la routine VB qui fonctionne il y a ça
    MIDIInput2>>Filter(FILTER_F9) = Vrai
    MIDIInput2>>Filter(FILTER_ACTIVE_SENSE) = Vrai
    MIDIInput2>>Filter(FILTER_CLOCK) = Vrai
    ( dans mes Constantes j'ai FILTER_F9 = 0xF9 , FILTER_ACTIVE_SENSE = 0xFE , FILTER_CLOCK = 0xF8)
    et je sais pas comment winnmm.dll peut prendre ça en compte

    Je dois récupérer une info du type "F0 43 10 4C 02 01 40 40 00 F7"
    C'est le sysex envoyé (Récupéré avec MidiOx)
    c'est normalement le but de la procédure MIDIInput_Message

    Faudrais que j'arrive à avoir ça

    TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT
    131947 1 -- 240 Buffer: 10 Bytes System Exclusive
    SYSX: 240 67 16 76 4 0 0 89 87 247
    141896 1 -- 240 Buffer: 10 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 64 64 0 247
    141902 1 -- 240 Buffer: 10 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 64 64 0 247
    141902 1 -- 240 Buffer: 10 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 84 0 127 247
    141902 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 86 64 247
    141903 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 87 64 247
    141904 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 88 0 247
    141904 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 89 0 247
    141904 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 90 1 247
    141905 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 91 127 247
    141905 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 92 64 247
    141905 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 93 64 247
    141906 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 94 64 247
    141906 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 95 64 247
    141906 1 -- 240 Buffer: 9 Bytes System Exclusive
    SYSX: 240 67 16 76 2 1 96 64 247


    En VB cette procédure est à priori appelée automatiquement une fois le start lancé

    en utilisant un thread ça serait :
    ThreadExecute("THREADNAME", threadNormal, "MIDIInput_Message") ?

    Mais il n'y a rien dans MIDIInput2>>Buffer qui est à 0 donc on sort de la procédure

    J'ai cherché de la doc sur Winmm.dll et MIDIio32.OCX de Mabryet j'ai rien trouvé ni en français ni en anglais

    Le seul exemple que j'ai trouvé c'est la routine que j'ai pu faire fonctionner en VB

    ça utilise cette structure en VB

    Typedef struct tagMIDIIN
    {
    int iDeviceID;
    int iMID;
    int iPID;
    int iVersion;
    HLSTR hlstrName;
    int iMessageCount; // not used - see lpMidiQueue->count
    int iMessage;
    int iData1;
    int iData2;
    long lTime;
    BOOL fMessageEventEnable;
    BOOL fFiringMessageEvent;
    BOOL fMessageNotified;
    HLSTR hlstrBuffer;
    int hMidiDevice;
    WORD wState;
    int OLDiMaxSysexSize; // not used anymore
    MIDIHDR FAR * sysexBuffers[SYSEX_BUFS];
    LPMidiInFuncParams lpParams;
    long safe;
    long lMaxSysexSize;
    }

    que je traduirais comme ça



    HMIDIIN est une structure
    iDeviceID est un entier sans signe
    iMID est un entier sans signe
    iPID est un entier sans signe
    iVersion est un entier sans signe
    hlstrName est une chaîne
    iMessageCount est un entier sans signe // not used - see lpMidiQueue->count
    iMessage est un entier sans signe
    iData1 est un entier sans signe
    iData2 est un entier sans signe
    lTime est un entier
    fMessageEventEnable est un booléen
    fFiringMessageEvent est un booléen
    fMessageNotified est un booléen
    hlstrBuffer est une chaîne
    hMidiDevice est un entier sans signe
    wState est un entier
    OLDiMaxSysexSize est un entier sans signe // not used anymore
    sysexBuffers est un Tableau de 10 MIDIHDR

    lpParams est un MidiInFuncParams
    safe est un entier
    MaxSysexSize est un entier sans signe
    FIN

    et MIDIHDR c'est ça

    MIDIHDR est une structure
    lpData est une chaîne // Address of MIDI data
    dwBufferLength est un entier sur 8 // Size of the buffer
    dwBytesRecorded 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
    dwUser est un entier sur 8 // Custom user data
    dwFlags est un entier sur 8 // Flags giving information about the buffer
    lpNext est un entier sur 8 // Reserved - do not use
    Reserved est un entier sur 8 // Reserved - do not use
    nDwOffset est un entier //Type C : DWORD
    dwReserved est un entier //Type C : DWORD
    FIN

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadExecute("THREADNAME", threadNormal, "MIDIInput2_Message")
    C'est ok.

    Par contre, ta procédure doit comporter une boucle :
    Code : 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
    PROCEDURE MIDIInput2_Message()
    n est entier
    SysexListCount est entier
    robert est une chaîne
    nMaxLong est un entier
    Boucle
     
    TANTQUE MIDIInput2>>MessageCount > 0 AND Dimension(MIDIInput2>>Buffer) > 0
    // DisplayBufferString[SysexListCount] = Hex(Caract(Gauche(MIDIInput2.Buffer, 1))) ça c'était en VB6
    DisplayBufferString[SysexListCount] = NumVersHexa(Caract(Gauche(MIDIInput2>>Buffer, 1))) 
    nMaxLong = Taille(MIDIInput2>>Buffer)
    POUR n = 2 A nMaxLong
    // gsRobert = Hex(Caract(Milieu(MIDIInput2.Buffer, n, 1))) 
    robert = NumVersHexa(Caract(Milieu(MIDIInput2>>Buffer, n, 1))) 
    // SI Hex(Caract(Milieu(MIDIInput2>>Buffer, n, 1))) < 10 ALORS
    SI NumVersHexa(Caract(Milieu(MIDIInput2>>Buffer, n, 1))) < 10 ALORS
    robert = "0" + robert
    FIN 
    DisplayBufferString[SysexListCount] = DisplayBufferString[SysexListCount] + " " + robert
    robert = ""
    FIN
    ListeAjoute(List1, DisplayBufferString[SysexListCount])
    form_receveivesysex1..Libellé = "Sysex -> Je reçois quelque chose! = " + DisplayBufferString[SysexListCount]
    MIDIInput2>>Action = MIDIIN_REMOVE
    FIN
     
    SI Taille(DisplayBufferString[SysexListCount]) > 0 ALORS
    FIN 
    MIDIInput2>>Action = MIDIIN_REMOVE
    FIN
    Il te faudra trouver une condition de sortie "propre" lorsque tu voudra quitter ton programme.

    A tester, je n'ai pas trop le temps de regarder en détail...
    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

Discussions similaires

  1. [C#]Type Mismatch lors de l'utilisation d'un Ocx
    Par Anthares dans le forum Développement Windows
    Réponses: 3
    Dernier message: 18/02/2011, 02h18
  2. Utilisation d'un OCX avec Jawin
    Par Bruno5995 dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 14/12/2009, 11h26
  3. utilisation d'un OCX en C#
    Par leo2v2o dans le forum C#
    Réponses: 6
    Dernier message: 17/12/2007, 17h33
  4. Utilisation du Mscomm32.ocx avec un vbscript
    Par Abyss dans le forum VBScript
    Réponses: 6
    Dernier message: 23/05/2007, 11h38
  5. [VB.NET] Utilisation d'ocx
    Par zen_ dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/05/2006, 09h35

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