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

C Discussion :

message midi et console lumiere


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut message midi et console lumiere
    bonjour tout le monde,

    voila j'ai fais un jeu en C avec la librairie SDL. Dedans j'y joue des mp3 en fonction de l'avancement du jeu.

    Mon problème est que en plus des mp3, je voudrai faire des effets de lumières. Pour cela je voudrai envoyer des messages midi à une console lumière. ET j'y connais rien en message midi
    J'ai beau chercher sur google je ne trouve rien de tres satisfaisant

    Alors si quelqu'un connait un tuto ou saurai m'expliquer ça serait sympa

    apparemment on peut gérer des messages midi avec FMOD ou l'apiwin32, mais rien de sûr. Je ne sais pas trop vers quelle solution m'orienter me please

    merci d'avance pour vos propositions


    PS:je ne sais pas si je suis dans le bon forums(vu que je développe en C), sinon redirigez le sujet

  2. #2
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    En principe, une console lumière ne se pilote pas en midi mais en DMX.

    A+

    Pfeuh

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    ba faut croire que si mon patron y arrive. il branche un clavier MIDI yamaha au PC via une interface midi usb (en midi out), et la console lumière a l'interface midi usb en midi in. mais il passe par un logiciel, il voudrai que j'envoie ce message midi " B10000C002 "

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Ok,

    C'est vrai que depuis quelques années on peut piloter à peu près n'importe quoi en midi. Alors "B1xx...xx", c'est un program change sur le canal midi 2. Sous windows, c'est relativement facile d'envoyer des codes midi, mais on ne peut pas envoyer octet par octet, il y a une fonction genre sendMessage() avec en paramètre les datas qui vont bien, channel, valeur, etc... Il faut inclure au projet la ddl "winmm.dll" de mémoire, il faudra que tu fasses quelques recherches, c'est juste l'idée. Bonne chance.

    A+

    Pfeuh

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    en fait je fais déjà 2 includes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <windows.h>
    #include <MMSYSTEM.H>
    qui sont dans winmm.dll.
    J'ai vu la doc sur msdn http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

    j'arrive à envoyer du son mais pas un program change :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    HMIDIOUT    handle;
     
    /* Open default MIDI Out device */
    if (!midiOutOpen(&handle, 1, 0, 0, CALLBACK_NULL) )
    {
        fprintf(stderr,"OUVERT");
        MMRESULT resultat;
        /* Output the C note (ie, sound the note) */
        resultat = midiOutShortMsg(handle, 0x00403C90);
     
        switch(resultat)
        {
            case MMSYSERR_NOERROR:
                    fprintf(stderr,"ENVOYERRRRRRRRRRR");
            break;
     
            case MIDIERR_BADOPENMODE:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, BADOPENMODE");
            break;
     
            case MIDIERR_NOTREADY:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, NOTREADY");
            break;
     
            case MMSYSERR_INVALHANDLE:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, INVALHANDLE");
            break;
     
            default:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, REPONSE PAR DEFAUT");
            break;
        }
     
     
     
         /* Close the MIDI device */
         midiOutClose(handle);
    }else
    {
        fprintf(stderr,"PAS OUVERT");
    }
    dans la fonction midiOutShortMsg(), le 2e paramètre attend une variable de type DWORD. mais quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    midiOutShortMsg(handle, (DWORD)"C0 02");
    il me dit que j'ai réussit à envoyer le message mais la console lumière ne repond pas ?

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    midiOutShortMsg(handle, (DWORD)"C0 02");
    C'est censé marcher, un cast d'une chaine en DWORD???

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    j'arrive toujours pas à envoyer des program change, c'est pas grave mon patron va se débrouiller autrement (parce que vraiment pas le temps). Il va se débrouiller avec les note
    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
    31
    32
    33
    34
    35
    36
    37
    38
    if (!midiOutOpen(&handle, 1, 0, 0, CALLBACK_NULL) )
    {
        fprintf(stderr,"OUVERT");
        MMRESULT resultat;
     
        /* Output the C note (ie, sound the note) */
        resultat = midiOutShortMsg(handle, 0x00403C90);
     
        switch(resultat)
        {
            case MMSYSERR_NOERROR:
                    fprintf(stderr,"ENVOYERRRRRRRRRRR");
            break;
     
            case MIDIERR_BADOPENMODE:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, BADOPENMODE");
            break;
     
            case MIDIERR_NOTREADY:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, NOTREADY");
            break;
     
            case MMSYSERR_INVALHANDLE:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, INVALHANDLE");
            break;
     
            default:
                fprintf(stderr,"PAAAAAAASSS ENVOYER, REPONSE PAR DEFAUT");
            break;
        }
     
     
         /* Close the MIDI device */
         midiOutClose(handle);
    }else
    {
        fprintf(stderr,"PAS OUVERT");
    }
    maintenant je cherche à RÉCEPTIONNER des notes.
    j'ai fait ça qui est FAUX mais je pense pense que je suis pas loin. si quelqu'un peut m'aider ?

    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
    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
    /****/
           if (!midiInOpen(&handleIn, 0, 0, 0, CALLBACK_NULL) )
           {
               fprintf(stderr,"ouvert IN\n");
               MMRESULT resultatIn;
               MMRESULT resultBuffer;
               //LPMIDIHDR buffer=NULL;
               //UINT tailleBuffer=NULL;
     
               resultatIn = midiInStart(handleIn);
     
               switch(resultatIn)
                {
                    case MMSYSERR_NOERROR:
                        fprintf(stderr,"IN start OK\n ");
     
                        resultBuffer = midiInPrepareHeader(handleIn,0,30);
     
                        switch(resultBuffer)
                        {
                            case MMSYSERR_NOERROR:
                                    fprintf(stderr,"RECU DANS BUFFER OK \n");
     
                            break;
     
                            case MMSYSERR_INVALHANDLE:
                                fprintf(stderr,"PAAAAAAASSS RECCUUU, INVALHANDLE\n");
                            break;
     
                            case MMSYSERR_INVALPARAM:
                                fprintf(stderr,"PAAAAAAASSS RECCUUUU, INVALPARAM\n");
                            break;
     
                            case MMSYSERR_NOMEM:
                                fprintf(stderr,"PAAAAAAASSS RECCUUU, NOMEM\n");
                            break;
     
                            default:
                                fprintf(stderr,"PAAAAAAASSS RECUCUCUCUCUCU, REPONSE PAR DEFAUT\n");
                            break;
                        }
     
     
                    break;
     
                    case MMSYSERR_INVALHANDLE:
                        fprintf(stderr,"PAAAAAAASSS , INVALHANDLE\n");
                    break;
            /***/
                    default:
                        fprintf(stderr,"PAAAAAAASSS REEECCCUUUU, REPONSE PAR DEFAUT\n");
                    break;
                }
     
     
           }
           /****/
    merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    alors j'ai fait une fonction de callback pour récupérer la note envoyée depuis mon clavier midi mais ça me donne pas le résultat escompté

    ma fonction callback:
    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
    void CALLBACK MidiInProc(HMIDIIN hMidiIn,UINT wMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2)
    {
        /**code ???**/
        unsigned err;
        fprintf(stderr,"je suis dans ma fonction callback\n");
        LPMIDIHDR lpMidiHeader  = (LPMIDIHDR)dwParam1;
        char param1[50]="";
        char param2[50]="";
        char instance[50]="";
     
        param1[50]= dwParam1;
        param2[50]= dwParam2;
        instance[50]=dwInstance;
     
     
        fprintf(stderr,"MON MESSSSSSAAAAAAAGGGGEEE : %u\n",wMsg);
        fprintf(stderr,"MON param1 : %s\n",param1);
        fprintf(stderr,"MON param2 : %s\n",param2);
        fprintf(stderr,"MON Instance : %s\n",instance);
     
        //lpMidiHeader->dwBytesRecorded=0 ;
            //if (0 != (err = midiInAddBuffer(handleIn, lpMidiHeader, sizeof(MIDIHDR))))
              //fprintf(stderr,"probleme midiInAddBuffer\n");
     
    }
    je récupère mes notes comme ceci :
    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
    31
    32
    33
    34
    35
    36
    37
    //init de la variable globale
             //et allocation en memoire d'un buffer
             midiHdr.dwFlags =0;
             midiHdr.lpData = (char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 50);
             midiHdr.dwBufferLength = 50;
     
            //ouverture du port midi In à l'indice 0
           if (!midiInOpen(&handleIn, 0, (DWORD)MidiInProc, 0, CALLBACK_FUNCTION | MIDI_IO_STATUS) )
           {
               fprintf(stderr,"ouvert IN\n");
               MMRESULT resultatIn;
     
                //preparation du buffer
               midiInPrepareHeader(handleIn, &midiHdr, sizeof(MIDIHDR));
               //lien entre le port midi In et le buffer pr reception info note
               midiInAddBuffer(handleIn, &midiHdr, sizeof(MIDIHDR));
               //ecoute du port Midi In
               midiInStart(handleIn);
     
               resultatIn = midiInStart(handleIn);
     
               switch(resultatIn)
                {
                    case MMSYSERR_NOERROR:
                        fprintf(stderr,"IN start OK\n ");
                    break;
     
                    case MMSYSERR_INVALHANDLE:
                        fprintf(stderr,"PAAAAAAASSS , INVALHANDLE\n");
                    break;
     
                    default:
                        fprintf(stderr,"PAAAAAAASSS REEECCCUUUU, REPONSE PAR DEFAUT\n");
                    break;
                }
     
           }
    et ça me donne ça comme résultat(petit extrait) :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 961
    MON param1 :
    MON param2 :
    MON Instance :
    ouvert IN
    IN start OK
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : 
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : '
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : <
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : Q
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : f
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : {
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 :
    MON param2 :
    MON Instance :
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : ¥
    MON param2 :
    MON Instance :

    pourquoi wMsg est tout le temps égal à 963 ?
    j'ai vraiment besoin d'aide s'il vous plait

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    midiOutShortMsg(handle, (DWORD)"C0 02");
    C'est censé marcher, un cast d'une chaine en DWORD???
    nan ça marche pas

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    c'est bon j'ai réussit:

    en fait c'est parce que j'affichais mal mon param1 il fallait l'afficher en unsigned long.

    ma fonction callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CALLBACK MidiInProc(HMIDIIN hMidiIn,UINT wMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2)
    {
        if (wMsg == MIM_DATA && (unsigned long)dwParam1!=248 && (unsigned long)dwParam1<25000)
        {
            fprintf(stderr,"je suis dans ma fonction callback\n");
            fprintf(stderr,"MON MESSSSSSAAAAAAAGGGGEEE : %u\n",wMsg);
            fprintf(stderr,"MON param1 : %lu\n",dwParam1);
            note = dwParam1;
        }
     
    }
    je met mon port midi In en écoute:

    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
    31
    32
    33
    34
    35
    36
    37
    //init de la variable globale
             //et allocation en memoire d'un buffer
             midiHdr.dwFlags =0;
             midiHdr.lpData = (char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 50);
             midiHdr.dwBufferLength = 50;
     
            //ouverture du port midi In à l'indice 0
           if (!midiInOpen(&handleIn, 0, (DWORD)MidiInProc, 0, CALLBACK_FUNCTION ) )
           {
               fprintf(stderr,"ouvert IN\n");
               MMRESULT resultatIn;
     
                //preparation du buffer
               midiInPrepareHeader(handleIn, &midiHdr, sizeof(MIDIHDR));
               //lien entre le port midi In et le buffer pr reception info note
               midiInAddBuffer(handleIn, &midiHdr, sizeof(MIDIHDR));
               //ecoute du port Midi In
               midiInStart(handleIn);
     
               resultatIn = midiInStart(handleIn);
     
               switch(resultatIn)
                {
                    case MMSYSERR_NOERROR:
                        fprintf(stderr,"IN start OK\n ");
                    break;
     
                    case MMSYSERR_INVALHANDLE:
                        fprintf(stderr,"PAAAAAAASSS , INVALHANDLE\n");
                    break;
     
                    default:
                        fprintf(stderr,"PAAAAAAASSS REEECCCUUUU, REPONSE PAR DEFAUT\n");
                    break;
                }
     
           }
    il faut avoir préalablement déclarer ses variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //variables globales pr la reception des notes midi
    HMIDIIN handleIn;
    MIDIHDR midiHdr;
    et ça me donne ça :
    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
    ouvert IN
    IN start OK
     je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : 13968
    OUVERT dep
    OUVERT ega
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : 12688
    OUVERT rouge mène
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : 12432
    OUVERT ega
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : 12688
    OUVERT rouge mène
    je suis dans ma fonction callback
    MON MESSSSSSAAAAAAAGGGGEEE : 963
    MON param1 : 12432
    OUVERT ega
    pour chaque touche il y 2 messages:

    1)qui concerne la force d'enfoncement de la touche(je pense) sur 7chiffres.

    2) qui est la note elle même sur 5 chiffres.

    ici j'ai filtré les messages lorsque dwparam1=248 (valeur lorsqu'il ne se passe rien) et lorsque dwparam1<25000 pour ne récupérer que les notes.

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récuperer les messages d'erreurs console
    Par A.SISSA dans le forum Delphi
    Réponses: 9
    Dernier message: 15/06/2007, 11h09
  2. message d'erreur console javascript: cur_combobox has no proprieties
    Par eclipse012 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/01/2007, 14h59
  3. Réponses: 5
    Dernier message: 07/06/2006, 12h11
  4. [VS 2003]récupérer des messages midi
    Par NiamorH dans le forum Visual Studio
    Réponses: 2
    Dernier message: 05/05/2006, 11h49
  5. messages dans la console au cours de l'execution
    Par meli0207 dans le forum MFC
    Réponses: 10
    Dernier message: 13/06/2005, 14h15

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