Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1026 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1913157
The matrix
Chacun fait ce qu'il en veut.
Posté le 09-08-2009 à 15:31:25  profilanswer
 

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
mood
Publicité
Posté le 09-08-2009 à 15:31:25  profilanswer
 

n°1913230
The matrix
Chacun fait ce qu'il en veut.
Posté le 09-08-2009 à 21:48:29  profilanswer
 

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
n°1913268
The matrix
Chacun fait ce qu'il en veut.
Posté le 10-08-2009 à 09:40:37  profilanswer
 

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
n°1913592
The matrix
Chacun fait ce qu'il en veut.
Posté le 10-08-2009 à 16:43:13  profilanswer
 

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
n°1913607
The matrix
Chacun fait ce qu'il en veut.
Posté le 10-08-2009 à 16:53:45  profilanswer
 

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
n°1922051
The matrix
Chacun fait ce qu'il en veut.
Posté le 07-09-2009 à 23:13:06  profilanswer
 

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
n°1922055
The matrix
Chacun fait ce qu'il en veut.
Posté le 07-09-2009 à 23:37:17  profilanswer
 

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
n°1922066
The matrix
Chacun fait ce qu'il en veut.
Posté le 08-09-2009 à 04:26:26  profilanswer
 

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
n°1922237
The matrix
Chacun fait ce qu'il en veut.
Posté le 08-09-2009 à 16:07:44  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

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

 

Sujets relatifs
inserer lien sur forum avec lecture uniquement du mp3[LaTeX][resolu] package listings et utilisation de emphstyle
lecture/écriture fichier texte et conversion en données numériquesLa mémoire ne peut pas être read
PL/SQL : utilisation de variable pour liste de valeur dans requête[Résolu]VBA comment optimiser l'utilisation CPU dans un loop?
limite des cas d'utilisation en POO[Résolu] Utilisation d'une application winform en réseau
[Resolu][ASP.NET] deployement sur serveur IIS / pb de bibliothequeSoucis d'utilisation d'une DLL sous php avec objet COM
Plus de sujets relatifs à : [Divers][Lecture]Utilisation de la bibliothèque portmidi : Pm_Read()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR