Publicité

Annonce

Réduire
Aucune annonce.

Réception Midi en C

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Réception Midi en C

    bonjour à tous,

    je cherche à réceptionner des notes midi envoyées depuis un clavier midi
    via une interface midi usb.

    j'ai fais ça :

    Code:
    //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;
    Code:
     [COLOR=black]       //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;
    
    [/COLOR] [COLOR=black]             //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);
    
    [/COLOR] [COLOR=black]            resultatIn = midiInStart(handleIn);
    
    [/COLOR] [COLOR=black]            switch(resultatIn)
                {
                    case MMSYSERR_NOERROR:
                        fprintf(stderr,"IN start OK\n ");
                    break;
    
    [/COLOR] [COLOR=black]                 case MMSYSERR_INVALHANDLE:
                        fprintf(stderr,"PAAAAAAASSS , INVALHANDLE\n");
                    break;
    
    [/COLOR] [COLOR=black]                 default:
                        fprintf(stderr,"PAAAAAAASSS REEECCCUUUU, REPONSE PAR DEFAUT\n");
                    break;
                }
    
    [/COLOR] [COLOR=black]        }[/COLOR]
    et ma fonction callback :
    Code:
    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]="";
    Code:
     [COLOR=black]     param1[50]= dwParam1;
        param2[50]= dwParam2;
        instance[50]=dwInstance;
    
    [/COLOR] [COLOR=black]     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);
    
    [/COLOR] [COLOR=black]     //lpMidiHeader->dwBytesRecorded=0 ;
            //if (0 != (err = midiInAddBuffer(handleIn, lpMidiHeader, sizeof(MIDIHDR))))
              //fprintf(stderr,"probleme midiInAddBuffer\n");
    
    }[/COLOR]
    et je vous donne un petit extrait de mon fichier texte :
    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 toujours égal à 963 ?

    après mon programme doit continuer en fonction des notes jouées

    pouvez-vous m'aider s'il vous plait ? je trouve pas grand chose comme explication sur internet à part la doc sur msdn

    merci

  • #2
    Salut,

    Je n'utilise pas winmm et ses API en direct, mais plutôt des library comme RTMidi (C++) ou portmidi (C),qui en plus, sont open source et portables.
    J'ai donné mon exemple dans un autre post. Il fonctionne avec des call-backs. Essaie celui-là pour voir.
    Hello, World!

    Commentaire


    • #3
      Salut,

      Je n'utilise plus winmm et ses API en direct, mais plutôt des library comme RTMidi (C++) ou portmidi (C),qui en plus, sont open source et portables.
      J'ai donné mon exemple dans un autre post. Il fonctionne avec des call-backs. Essaie celui-là pour voir.

      PS: as-tu cherché dans des forums plus adéquats, orientés programmation : programmez, hardware.fr, ... ?
      Dernière modification par alchemist, 07 janvier 2011, 12h03.
      Hello, World!

      Commentaire


      • #4
        PS: as-tu cherché dans des forums plus adéquats, orientés programmation : programmez, hardware.fr, ... ?
        bah justement on me répond pas sur les sites de programmation (site du zero, developpez.com, cppfrance). la ou on m'aide le plus c'est pas sur ces sites, il y en a un qui m'aide beaucoup sur ipsonorisation.fr. sur cppfrance on me dit "regarde mon code " mais vu que je ne connais pas trop la librairie
        winmm et encore moins en programmation midi. c'est pas facile de comprendre un code sans connaitre la logique à avoir pour récupérer un message midi.

        J'ai donné mon exemple dans un autre post. Il fonctionne avec des call-backs. Essaie celui-là pour voir.
        Justement je m'appuie sur ton extrait de code mais c'est pas facile et en plus tu gère des system-exclusive je crois mais moi je veux réceptionner des messages midi normaux.

        Commentaire


        • #5
          Un sysex est un message midi comme un autre, tous passent par le call-back. J'insiste pour que tu utilises un call-back.

          Cherche aussi du côté de code C#, car les appels sont en Win32, donc en C.
          Hello, World!

          Commentaire


          • #6
            j'ai fais ça dans ma fonction callback :

            Code:
            if (wMsg == MIM_DATA)
                {
                    fprintf(stderr,"MON MESSSSSSAAAAAAAGGGGEEE : %u\n",wMsg);
                    fprintf(stderr,"MON param1 : %lu\n",dwParam1);
                }
            wMsg est toujours égal à 963 mais dwParam1 est souvent égal à 248 mais change des fois "13456" "4666512" sais tu ce que ça signifie ?

            Commentaire


            • #7
              alors j'ai compris :8), 248 c'est la valeur du param1 quand il ne se passe rien.
              après j'ai remarqué en les filtrant que lorsque j'appuie UNE fois sur UNE touche il y a 2 messages : le premier qui est sur 7 chiffres je pense qu'il représente la force d'appuie sur la touche et le 2e message qui est sur 4 chiffres représente la note.

              Et maintenant je voudrai filtrer le 1er messages mais je sais pas trop comment faire :mefie.

              Commentaire


              • #8
                248 est un message MIDI, F8 = Active sensing, envoyé par ton clavier plusieurs fois par secondes.
                Hello, World!

                Commentaire


                • #9
                  c'est bon j'ai réussit:

                  alchemist
                  248 est un message MIDI, F8 = Active sensing, envoyé par ton clavier plusieurs fois par secondes.
                  t'as raison alchemist

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

                  ma fonction callback:
                  Code:
                  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:
                  //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:
                  //variables globales pr la reception des notes midi
                  HMIDIIN handleIn;
                  MIDIHDR midiHdr;
                  et ça me donne ça :
                  Code:
                  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

                  Commentaire


                  • #10
                    As-tu lis les spécifications MIDI ? Il me semble que tu n'as pas idée des messages qui transitent...
                    Hello, World!

                    Commentaire


                    • #11
                      Lors de l'appui d'une touche, tu as un message "note on" à l'appui et un message "note off" lorsque que tu relâches.

                      Voici le site que je suis : http://home.roadrunner.com/~jgglatt/tech/midispec.htm

                      Affiche en hexa les valeurs que tu reçois ça sera plus simple.
                      http://www.luxaeternaband.com/

                      Matos : Kurzweil PC3K8

                      Ma video pour le Kurzweil Forte Video Contest : https://www.youtube.com/watch?v=u_Fvc7UWGyI

                      Commentaire


                      • #12
                        merci mais moi ça me va très bien comme ça, parce que en fait mon programme fonctionne avec un clavier midi à la place d'un clavier de PC. Comme t'as dû le voir je met mon dwParam1 dans une variable "note" de type unsigned long. Ensuite je test "note" dans un switch. Tout ça pour remplacer la gestion des touches avec la SDL. Sachant que la "note off" est unique à chaque touche du clavier midi, ça me suffit pour tester sur quelle touche de ce clavier j'appuie, pas besoin d'hexa.

                        Commentaire


                        • #13
                          non mais c'est juste pour faciliter la reconnaissance d'un message pour toi, pour savoir si tu reçois la bonne chose et/ou comprendre ce que tu reçois.
                          http://www.luxaeternaband.com/

                          Matos : Kurzweil PC3K8

                          Ma video pour le Kurzweil Forte Video Contest : https://www.youtube.com/watch?v=u_Fvc7UWGyI

                          Commentaire

                          Chargement...
                          X