Ponts OSC entre logiciels
Entre Processing et Max
|
![]() |
Les codes Processing ont été faits avec la version 3 de Processing sur Windows. Si vous ne pouvez l’ouvrir directement (dans une version précédente de Processing par exemple), il suffit de le recopier, les objets utilisés étant présents dans toutes les versions de Processing. De même, le patcher Max a été fait dans la version 8 mais est compatible avec les versions précédentes.
Principe
Peu d’objets sont nécessaires pour communiquer en OSC : un récepteur reçoit les données de l’extérieur du logiciel et un transmetteur en envoie d’autres. Chacun de ces objets prend en compte des paramètres de numéro de port, d’identification de machine sur le réseau et de tri des données.
Si vous souhaitez plus de renseignements sur les paramètres OSC, vous pouvez vous reporter aux explications données dans le manuel de Processing et dans les docs respectives des objets Max.
Nous vous invitons à consulter le fichier .zip fourni en début de page pour mieux comprendre comment le sketch Processing est construit.
Paramètres OSC nécessaires
1 - Adresse de la machine
Dans cette page, nous utilisons deux logiciels installés sur une même machine. L’adresse réseau est donc "localhost" ou 127.0.0.1 . Quel que soit le logiciel, ce paramètre est utilisé dans l’envoi vers l’extérieur. Il est nécessaire pour préciser la destination du message. Le récepteur n’en a pas besoin, il écoute ce qui arrive de partout.
2 - Numéro de Port OSC
Le numéro de port est arbitrairement donné par l’utilisateur et permet d’identifier le logiciel cible. Plusieurs ports différents sont utilisables avec Max, un seul avec Processing. Ce ne doit pas être le même.
Dans Processing, il est nécessaire de télécharger la bibliothèque oscP5 et netP5 avant d'établir une connexion avec Max. Dans notre exemple, nous avons gardé le numéro par défaut 1234. Il faut ensuite les définir dans notre sketch Processing et les initier dans la fonction setup() pour pouvoir les utiliser dans le reste de notre sketch Processing. L'adressage dans le logiciel Processing est détaillé plus loin.
Dans Max, les numéros de port sont mentionnés à la fois dans l’objet OSC envoyeur et dans le récepteur. Ils n’est pas nécessaire de les déclarer ailleurs dans un menu. L’adresse de Processing (1349) est donnée en paramètre de l’objet udpsend. Le port choisi pour Max (1234, par exemple) est utilisé dans l’objet udpreceive. Ces deux objets sont détaillés plus loin.
3 - Adressage des données
Les données envoyées sont des nombres ou des signaux comme trigger. Il est possible d’envoyer en même temps des messages distincts, adressés à des récepteurs différents. Chaque flot de données est donc envoyé à une adresse OSC précise dans le logiciel cible. Cette adresse OSC est mentionnée (complète ou partielle) à la fois dans les objets envoyeurs et dans les objets récepteurs.
Dans Processing, le transmetteur envoie ses données sur une adresse OSC identifiée par une adresse comportant une adresse IP et un numéro de port. Cette adresse sera défini dans la fonction setup() et sera utilisée plus tard comme paramètre dans la fonction oscP5.send(). Pour la réception de données Max vers Processing, il nous faut ouvrir un port (ce numéro de port est arbitraire ; dans notre exemple celui-ci correspond au numéro 1349) et la fonction oscEvent() nous permettra de lire ces données. La construction du sketch Processing est détaillée plus loin.
Dans Max, les adresses correspondantes sont utilisées par le récepteur OSC udpreceive (/truc) et par l’émetteur udpsend (/slidercapteur1 $1). Les détails sont donnés ci-dessous.
Transmission Processing vers Max
1 - A partir de Processing
Tout d'abord, nous devons importer les bibliothèques que nous avons téléchargés, elles sont appelées en début de sketch grâce à import.
Ensuite nous allons initier un port réseau et une adresse réseau dans la fonction setup() du sketch.
L’objet nécessaire pour envoyer des données en OSC est la fonction oscP5.send() comme mentionné plus haut. Cette partie du sketch devrait ressembler à cela :
Dans l'exemple donné ici, nous construisons le message OSC à envoyer vers Max dans la fonction draw() du sketch. Celui-ci peut se décomposer en 3 parties :
- On précise à qui s'adresser (ex : "/truc")
- On associe une valeur au message (ex: la valeur de la souris)
- On envoie le message.
2 - La réception dans Max
Du côté de Max, deux objets sont nécessaires pour la réception des données. Il n’est pas nécessaire de se connecter. L’objet udpreceive permet de recevoir tout message OSC. Le message qui vient de Processing est adressé au port UDP 1349. L’objet udpreceive prend en paramètre ce numero de port. Le message est marqué par l’adresse /truc. L’objet suivant, route, permet de trier les messages arrivant à l’aide de cette adresse. Sur la sortie de gauche (sur laquelle est branché un nombre dans l’exemple) sortent les valeurs marquées par l'adresse /truc. Sur la sortie de droite passent d’éventuels autres messages marqués différemment.
Lorsque les deux fichiers sont ouverts en même temps, vous devriez observer l’arrivée régulière de données dans Max.
Transmission de Max vers Processing
1 - Connexion et envoi des informations depuis Max
L’objet crucial est udpsend. Il doit recevoir successivement plusieurs informations pour envoyer des données vers Processing.
Il n’est pas nécessaire de se connecter activement. L’argument localhost indique à udpsend qu’on s’adresse à un logiciel sur la même machine que le patch et que le logiciel cible est Processing (identifié par l’adresse UDP 1234).
Le message branché sur udpsend précise à quel logiciel et à quelle adresse OSC le message doit être envoyé, grâce au paramètre /slidercapteur1. Il est obligatoire de respecter la syntaxe du paramètre. Le $1 de notre exemple est remplacé par tout ce qui est envoyé sur ce message, ici des données de capteurs analogiques.
2 - Réception des données dans Isadora
Pour recevoir des données dans Processing depuis Max, il est nécessaire d'utiliser la fonction oscEvent().
Dans cet exemple, nous mettons en place la fonction oscEvent avec les paramètres nécessaires pour son bon fonctionnement (ces paramètres sont définis dans les parenthèses de la fonction, ici : "OscMessage message_max), ceux-là seront appelés plus tard dans la fonction.
Ensuite, nous utilisons une fonction if() pour trier les messages arrivant de Max. Nous vérifions si les messages venant de Max proviennent bien de l'adresse "/slidercapteur1" que nous avions défini au préalable dans notre patch Max. Si cette condition est vraie alors nous associons cette donnée du message à une variable du même type (ici slider1 car nous recevons des données d'un slider depuis Max) et nous imprimons cette valeur grâce à la fonction println() pour la voir dans notre console Processing.
Ainsi, lorsque nous manipulons le slider dans notre patch Max, ses données seront envoyées à Processing grâce à l'adressage que nous avons mis en place plus tôt, et notre sketch Processing va pouvoir les lire et les imprimer dans sa console.
Pensez bien à exécuter votre code sketch Processing pour que des résultats puissent être affichés la console.
Echange de plusieurs flots de données d’un logiciel à l’autre
Dans les exemples précédents, nous avons montré comment envoyer, dans un sens ou dans l’autre, un seul flux de données depuis Processing et Max. Chaque logiciel utilise un seul port (différent entre les deux logiciels). Plusieurs flots de données sont envoyés en parallèle sur ces ports, c’est-à-dire les données de plusieurs capteurs ou de plusieurs sliders. Le tri se fait par les différentes adresses et les fonctions définies dans le sketch Processing.
Il est possible d'ouvrir plusieurs ports différents pour distinguer plusieurs données. La réception de ces données est basé sur le même principe que nous avons explicité plus haut. Il nous suffit de dupliquer les objets de réceptions et de modifier pour chacun d'entre eux, les numéros de ports, leurs adresses et leurs filtres (si il y en a un).
Veillez bien à vérifier les numéros de vos ports et à bien vérifier que vos adressages sont orthographiés correctement avant d'exécuter votre sketch Processing.