[Divers][Lecture]Utilisation de la bibliothèque portmidi : Pm_Read()

Utilisation de la bibliothèque portmidi : Pm_Read() [Divers][Lecture] - Divers - Programmation

Marsh Posté le 09-08-2009 à 15:31:25    

Bonjour,
 
Je souhaite écrire un programme qui compose et pilote des instrument pour jouer ses compo et je cherche les langage qui fournisse une MIDI (Musical Instrument Digital Interface).
Merc
i.
 
Bon je réutilise un topic pour vous demandez comment je fais pour connaître l'adresse du mon port midi.
 
Voir le 5iemme post


Message édité par The matrix le 08-09-2009 à 04:17:09

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 09-08-2009 à 15:31:25   

Reply

Marsh Posté le 09-08-2009 à 21:48:29    

Pour le moment, j'ai installé un lib C libportmidi en standard sur ma Gnu/Linux Debian Lenny.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 10-08-2009 à 09:40:37    

j'ai rien trouvé de mieux pour le moment.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 10-08-2009 à 16:43:13    

4


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 10-08-2009 à 16:53:45    

5,  
 
Bonjour donc, j'ai importé avec Ada la bibliothèque ou en partie, portmidi.
 
Mais j'ai un soucis, pour l'utilisation, je trouve pas comment connaître les arguent à passer.
 
J'ai fais ça :
 

Code :
  1. with System;
  2. with Interfaces.C;
  3.  
  4. package Portmidi is
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.   type PmError is (pmNoErro,
  12.                    PmHostError,
  13.                    pmInvalidDeviceId,
  14.                    pmInsufficientMemory,
  15.                    pmBufferTooSmall,
  16.                    pmBufferOverflow,
  17.                    pmBadPtr,
  18.                    pmBadData,
  19.                    pmInternalError,
  20.                    PmBufferMaxSize);
  21.  
  22.   function Pm_GetDefaultInputDeviceID return Interfaces.C.int;
  23.   pragma Import (C, Pm_GetDefaultInputDeviceID, "Pm_GetDefaultInputDeviceID" );
  24.  
  25.   function Pm_GetDefaultOutputDeviceID return Interfaces.C.Int;
  26.   pragma Import (C, Pm_GetDefaultOutputDeviceID, "Pm_GetDefaultOutputDeviceID" );
  27.  
  28.  
  29.   function Pm_Initialize return PmError;
  30.   pragma Import (C, Pm_Initialize, "Pm_Initialize" );
  31.  
  32.   function Pm_Terminate return PmError;
  33.   pragma Import (C, Pm_Terminate, "Pm_Terminate" );
  34.  
  35.  
  36.  
  37.   function Pm_OpenInput(PortMidiStream : System.address;
  38.                         PmDeviceID : Integer;
  39.                         InputDriverInfo : Integer;
  40.                         BufferSize : Long_Integer;
  41.                         PmTimeProcPtr : System.address;
  42.                         time_info : integer) return PmError;
  43.   pragma Import (C, Pm_OpenInput, "Pm_OpenInput" );
  44.  
  45.  
  46.   function Pm_OpenOutput( PortMidiStream :System.address;
  47.                           OutputDevice : Integer;
  48.                           outputDriverInfo : System.address;
  49.                           BufferSize : Long_Integer;
  50.                           Time_Proc : Integer;
  51.                           Time_Info : System.address;
  52.                           latency : Long_integer) return PmError;
  53.   pragma Import (C, Pm_OpenOutput, "Pm_OpenOutput" );
  54.  
  55.   function Pm_SetFilter(PortMidiStream : System.address;
  56.                         filters : Long_Integer) return PmError;
  57.   pragma Import (C, Pm_SetFilter, "Pm_SetFilter" );
  58.  
  59.   function Pm_SetChannelMask(PortMidiStream : System.address;
  60.                              Mask : integer) return PmError;
  61.   pragma Import (C, Pm_SetChannelMask, "Pm_SetChannelMask" );
  62.  
  63.   function Pm_Abort( PortMidiStream : System.address) return PmError;
  64.   pragma Import (C, Pm_Abort, "Pm_Abort" );
  65.  
  66.   function Pm_Close( PortMidiStream : System.address) return PmError;
  67.   pragma Import (C, Pm_Close, "Pm_Close" );
  68.  
  69.  
  70.   function Pm_Read( PortMidiStream : System.address;
  71.                     PmEvent : Integer;
  72.                     Length :Long_integer) return PmError;
  73.   pragma Import (C, Pm_Read, "Pm_Read" );
  74.  
  75.   function Pm_Poll( PortMidiStream : System.address) return PmError;
  76.   pragma Import (C, Pm_Poll, "Pm_Poll" );
  77.  
  78.   function Pm_Write( PortMidiStream : System.address;
  79.                      PmEvent : System.address;
  80.                      length : Long_integer) return PmError ;
  81.   pragma Import (C, Pm_Write, "Pm_Write" );
  82.  
  83.  
  84.   function Pm_WriteShort( PortMidiStream :System.address;
  85.                           PmTimestamp : Float;
  86.                           Msg : Long_integer) return PmError;
  87.   pragma Import (C, Pm_WriteShort, "Pm_WriteShort" );
  88.  
  89.   function Pm_WriteSysEx( PortMidiStream : System.address;
  90.                           PmTimestamp : Float;
  91.                           Msg : integer) return PmError;
  92.   pragma Import (C, Pm_WriteSysEx, "Pm_WriteSysEx" );


 
Puis :  
 

Code :
  1. with System;
  2. use System;
  3. with Portmidi;
  4. use Portmidi;
  5. package body Orchestration is
  6.  
  7.   procedure Play is
  8.  
  9.      Error : PmError;
  10.  
  11.      PortMidiStream_Ptr,
  12.      OutputDriverInfo_Ptr,
  13.      Time_Info_Ptr  : System.Address;
  14.  
  15.  
  16.   begin
  17.      Error := Pm_Initialize;
  18.  
  19.      Error := Pm_OpenOutput( PortMidiStream => PortMidiStream_Ptr,
  20.                              OutputDevice => 1,
  21.                              outputDriverInfo => OutputDriverInfo_ptr,
  22.                              BufferSize => 10,
  23.                              Time_Proc => 1,
  24.                              Time_Info => Time_Info_ptr,
  25.                              latency => 2);
  26.  
  27.      Error := Pm_Close(PortMidiStream => PortMidiStream_ptr);
  28.      Error := Pm_Terminate;
  29.  
  30.   end Play;
  31. end Orchestration;


 
Et j'obtien :

startPortMidi call failed...
  PortMidi: `Bad pointer'


Tu m'étonnes... Bref, comment connaître la la valeur de l'adresse de PortMidiStream ?
S'il vous plaît, merci.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 07-09-2009 à 23:13:06    

Bonjour, bonsoir  :hello:  
 
J'ai un petit souci dans l'écriture de deux binding en C utilisant la bibliothèque portmidi...
 
En effet, j'écris un binding pour l'ouverture de port d'entrée et un pour les port de sortie.
 
Mais à la compilation du programme utilisateurs, j'ai une erreur comme quoi une variable serait déjà définie dans l'autre binding ... En plus la variable n'est déclaré que dans un.
 
Voici les deux code des deux binding.
 

Code :
  1. #include <stdio.h>
  2. #include <portmidi.h>
  3. #include <porttime.h>
  4.  
  5. #define DRIVER_INFO NULL
  6. #define INPUT_BUFFER_SIZE 0
  7. #define TIME_PROC ((long (*)(void *)) Pt_Time)
  8. #define TIME_INFO NULL
  9. #define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
  10.  
  11. PmStream * midi;
  12.  
  13. long Input_Open_Handler (int device) {
  14.  
  15.  
  16.  
  17.  TIME_START;
  18.  
  19.  Pm_OpenInput(&midi,
  20.            device,
  21.            DRIVER_INFO,
  22.            INPUT_BUFFER_SIZE,
  23.            TIME_PROC,
  24.            TIME_INFO);
  25.    return midi;
  26. }


 
 

Code :
  1. #include <stdio.h>
  2. #include <portmidi.h>
  3. #include <porttime.h>
  4.  
  5. #define DRIVER_INFO NULL
  6. #define OUTPUT_BUFFER_SIZE 0
  7. #define TIME_PROC ((long (*)(void *)) Pt_Time)
  8. #define TIME_INFO NULL
  9. #define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
  10.  
  11. PmStream * midi;
  12.  
  13. long latency = 0;
  14.  
  15. long Output_Open_Handler (int device) {
  16.  
  17.  
  18.  
  19.  TIME_START;
  20.  
  21.  Pm_OpenOutput(&midi,
  22.         device,
  23.         DRIVER_INFO,
  24.         OUTPUT_BUFFER_SIZE,
  25.         (latency == 0 ? NULL : TIME_PROC),
  26.         (latency == 0 ? NULL : TIME_INFO),
  27.         latency);
  28.  return midi;
  29. }


 
Voici le Makefile
 


all: output_open_handler.o input_open_handler.o
 gnatmake -gnatf -O2 -o harmonie src/main.adb -D src -largs output_open_handler.o input_open_handler.o -lportmidi -lporttime
 
output_open_handler.o:
 gcc -c src/output_open_handler.c
input_open_handler.o:
 gcc -c src/input_open_handler.c
 
html:
 ./sh/make_html.sh
 
clean:
 rm -f src/*.ali src/*.o
 
mrproper:
 rm -f open_handler.o src/*~ harmonie src/b~* index.html
 rm -f src_html/*


 
 
Et le message d'erreur à l'appel de make all

Citation :

gnatmake -gnatf -O2 -o harmonie src/main.adb -D src -largs output_open_handler.o input_open_handler.o -lportmidi -lporttime
gnatbind -aOsrc -x src/main.ali
gnatlink src/main.ali -o harmonie output_open_handler.o input_open_handler.o -lportmidi -lporttime
input_open_handler.o:(.bss+0x0): multiple definition of `latency'
output_open_handler.o:(.bss+0x0): first defined here
collect2: ld a retourné 1 code d'état d'exécution
gnatlink: error when calling /usr/bin/gcc-4.3
gnatmake: *** link failed.
make: *** [all] Erreur 4


 
Que puis-je faire pour remédier au problème ? S'il vous plaît, merci ! Bien à vous.


Message édité par The matrix le 07-09-2009 à 23:20:19

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 07-09-2009 à 23:37:17    

Arff ! Désolé... Plus d'erreur !
 
J'ai fait un make mrproper et tout est bon finalement. Sorry !
 :o


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 08-09-2009 à 04:26:26    

Yep !
 
 
Finalement, j'ai encore un petit problème.... Pourtant, il semble que j'eu fait ce qu'il faille...
 
Encore un binding pour importer la fonction Pm_Read de la bibliothèque portmidi...
 
Mais de toute manière au test de présence de donnée sur le port Midi,... rien
 
J'ai testé tout les entrée midi, rien. Et j'ai vérifié, avec un autre soft,... Les donnée passe bien.
 
 
Voici le code C de mon binding.
 

Code :
  1. #include <stdio.h>
  2. #include <portmidi.h>
  3. #include <porttime.h>
  4.  
  5. #define DRIVER_INFO NULL
  6. #define INPUT_BUFFER_SIZE 1
  7. #define TIME_PROC ((long (*)(void *)) Pt_Time)
  8. #define TIME_INFO NULL
  9. #define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
  10.  
  11. PmError error;
  12. long width;
  13. PmStream *local;
  14. PmEvent My_Event;
  15.  
  16. long Read_Handler (Void)
  17. {
  18.  
  19.  
  20.  
  21.  TIME_START;
  22.  
  23.  error = Pm_OpenInput(&local,
  24.                7,
  25.                DRIVER_INFO,
  26.                INPUT_BUFFER_SIZE,
  27.                TIME_PROC,
  28.                TIME_INFO);
  29.  
  30.  if (Pm_Poll(local))
  31.    {
  32.      printf("Read message...." );
  33.      error = Pm_Read(local,
  34.               &My_Event,
  35.               1);  
  36.      if (error < 0)
  37.     printf("Errno : %d \n", error);
  38.      else if (error > 0)
  39.     printf("Message : %d \n", My_Event.message);
  40.    }
  41.  else
  42.    printf("No message...." );
  43.  Pm_Close(local);
  44.  return My_Event.message;
  45. }


 
Mais bon, je ne sais pas d'ou ça vient....
 
Merci pour votre aide.
 
J'ai même vérifié avec l'utilitaire de test de la bibliothèque qui fonctionne très bien, .... Je vois pas mon erreur.


Message édité par The matrix le 08-09-2009 à 06:34:53

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 08-09-2009 à 16:07:44    

Yep !
 
J'ai scrupuleusement copié le code du test et ça marche...
 
Le code ad hoc en partie au moins...
 

Code :
  1. #include "portmidi.h"
  2.  
  3. #include "porttime.h"
  4.  
  5. #include "stdio.h"
  6.  
  7.  
  8. #define INPUT_BUFFER_SIZE 100
  9.  
  10. #define OUTPUT_BUFFER_SIZE 0
  11.  
  12. #define DRIVER_INFO NULL
  13.  
  14. #define TIME_PROC ((long (*)(void *)) Pt_Time)
  15.  
  16. #define TIME_INFO NULL
  17.  
  18. #define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */
  19.  
  20.  
  21.  
  22.  
  23. long Read_Handler(int i) {
  24.    PmStream * midi;
  25.    PmError status, length;
  26.    PmEvent buffer[1];
  27.    int num = 1;
  28.    /* It is recommended to start timer before Midi; otherwise, PortMidi may
  29.       start the timer with its (default) parameters
  30.     */
  31.    TIME_START;
  32.  
  33.    /* open input device */
  34.    Pm_OpenInput(&midi,
  35.                 i,
  36.                 DRIVER_INFO,
  37.                 INPUT_BUFFER_SIZE,
  38.                 TIME_PROC,
  39.                 TIME_INFO);
  40.  
  41.    printf("Midi Input opened. Reading %d Midi messages...\n",num);
  42.    Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK);
  43.    /* empty the buffer after setting filter, just in case anything
  44.       got through */
  45.    while (Pm_Poll(midi)) {
  46.        Pm_Read(midi, buffer, 1);
  47.    }
  48.    /* now start paying attention to messages */
  49.    i = 0; /* count messages as they arrive */
  50.    while (i < num) {
  51.        status = Pm_Poll(midi);
  52.        if (status == TRUE) {
  53.            length = Pm_Read(midi,buffer, 1);
  54.            if (length > 0) {
  55.                printf("Got message %d: time %ld, %2lx %2lx %2lx\n",
  56.                       i,
  57.                       buffer[0].timestamp,
  58.                       Pm_MessageStatus(buffer[0].message),
  59.                       Pm_MessageData1(buffer[0].message),
  60.                       Pm_MessageData2(buffer[0].message));
  61.                i++;            
  62.            }
  63.        }
  64.      
  65.    }
  66.  
  67.    /* close device (this not explicitly needed in most implementations) */
  68.    printf("ready to close..." );
  69.  
  70.    Pm_Close(midi);
  71.    printf("done closing..." );
  72.    return buffer[0].message;
  73. }


 
Merci !


Message édité par The matrix le 08-09-2009 à 16:08:34

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed