L’OSC est l’acronyme d’Open Sound Control. C’est un format de message (ce qui permet de faire communiquer différents périphériques) via un réseau informatique, qu’il soit filaire ou wifi. Il utilise le réseau au travers des protocoles UDP ou TCP et apporte des améliorations en termes de rapidité et flexibilité par rapport à l’ancienne norme MIDI.
Il a été mis au point par Matthew Wright et Adrian Feed au CNMAT (Center for New Music and Audio Technologies), centre de recherche multidisciplinaire au cein du departement de musique de l’université de Berkeley. Il a été originellement conçu pour partager des données de performances musicales (gestes, paramètres, séquence) entre différents supports multimedia, d’où son nom. Très utile aujourd’hui pour faire communiquer des terminaux sans connectique ou doté de peu de connectique (tablettes (iPad, android…), smartphones…) soit avec un (des) ordinateur(s) ou avec un autre terminal mobile.
Exemples
Lemur
Le Lemur est un périphérique, une srte de tablette dédiée, utilisant l’OSC comme format d’échange de message. Bien avant l’iPad, il propose une surface tactile multipoint très utilisé en live pour le performance en temps réél des musiciens (les Daft Punk notamment). L’avantage du Lemur, par rapport à des interfaces physique MIDI plus traditionnelles est qu’il propose une interface graphique totalement modulaire et tactile. Les utilisateurs peuvent choisirent et programmer les éléments de jeu qu’ils souhaitent utiliser (boutons rotatifs, sliders, pad..). Avec le succès de l’iPad, Jazzmutant (les fabricants du Lemur) a transposé les différentes fonctions de leur interface physique sous forme d’appli pour la tablette d’Apple.
Touch OSC
Touch OSC est une application pour iOS (iPad, iPhone) qui reprend les grands principes d’interfaçages graphiques du Lemur. Mêmes principes modulaires (directement éditables sur ordinateurs pour les exporter vers les périphériques mobiles). Cette appli permet d’envisager les périphériques mobiles comme des télécommandes de logiciels audio (Ableton Live, MAX MSP, Pure Data) ou de VJing (Resolume).
Plus d’expliactions sur TouchOSC et son éditeur sur ordinateur :
http://www.creativeapplications.net/iphone/touchosc-editor-iphone-mac-windows/
MSA Fluid
MSA FLuid est un exemple d’utilisation de l’OSC. Il montre comment utiliser un dessin réalisé sur un smartphone pour controler la génération d’un système de particules distant.
Utilisation des capteurs d’une tablette pour intergair sur un modèle 3D
Pratique
Outil
OSCulator est un logiciel qui peut s’avérer très utile quand on manipule des messages OSC. C’est un outil d’analyse et de routage des messages. Le routage permet notamment de transformer des message OSC en message MIDI.
1 – Faire communiquer 2 applets Processing via OSC
!! S’assurer de la désactivation du pare-feu de vos ordinateurs (Menu Pomme > Sécurité > Coupe-Feu)
Processing permet d’utiliser l’OSC facilement. Il faut préalablement installer la bibliothèque externe OSCP5.
Avant de commencer cet exemple, il est nécessaire de connaître les différentes adresses IP des périphériques que nous souhaitons faire communiquer. En effet, chaque périphérique informatique sur un réseau est identifié par une adresse IP. Pour pouvoir envoyer un message d’un périphérique vers un autre il est nécessaire d’indiquer la location (ici sous forme d’une adresse IP) vers laquelle nous souhaitons l’envoyer.
Pour cet exemple pratique, nous allons utiliser la position du curseur de la souris dans une applet Processing sur un ordinateur pour déplacer un cercle sur une Applet Processing sur un autre ordinateur présents sur un même réseau.
Voici le schéma et les adresses IP, des messages OSC et variables des différents que nous souhaitons faire communiquer dans notre exemple.
Et voici la video montrant ce que nous allons parvenir à réaliser :
Sketch à lancer sur l’ordinateur 1 (serveur) :
// on importe la bibliothèque OscP5 import oscP5.*; import netP5.*; //création d'un objet OscP5 appelé 'oscP5' OscP5 oscP5; NetAddress myRemoteLocation; void setup() { size(600,600); frameRate(25); //paramétrage de l'objet oscP5 qui recevra les données // sur le port 9000 oscP5 = new OscP5(this, 9000); //on créée une adresse IP '192.168.1.12' (adresse IP ordinateur 2) et un port (7000) // où envoyer les données myRemoteLocation = new NetAddress("192.168.1.12", 7000); } void draw() { background(127); //on créee un message osc avec l'adress pattern '/positionsCurseur' OscMessage myMessage = new OscMessage("/positionsCurseur"); //et on ajoute la valeur de la poisition X et position Y du curseur de la souris sur la scene du sketch au message myMessage.add(mouseX); myMessage.add(mouseY); //on envoie le message oscP5.send(myMessage, myRemoteLocation); }
Sketch à lancer sur l’ordinateur 2 (Client) :
// on importe la bibliothèque OscP5 import oscP5.*; import netP5.*; //création d'un objet OscP5 appelé 'oscP5' OscP5 oscP5; //on créée 2 variables qui vont nous //permettre d'assigner les valeurs des fader de touchOSC //aux coordonnées de notre cercle float positionX, positionY; void setup() { size(600, 600); //paramétrage de l'objet oscP5 qui recevra les données // sur le port 7000 oscP5 = new OscP5(this, 7000); //au départ, on place notre cercle au centre positionX = width/2; positionY = height/2; //on desactive les dessin des contours noStroke(); } void draw() { //arriere plan blanc background(255); //on lisse notre affichage smooth(); //on donne la couleur rouge à notre cercle fill(255, 0, 0); //on assigne les coordonnées variables à notre cercle ellipse(positionX, positionY, 20, 20); } /* methode oscevent permettant d'ecouter les evenements OSC */ void oscEvent(OscMessage theOscMessage) { // si l'applet reçoit un messag OSC avec l'address pattern "/positionsCurseur" if (theOscMessage.checkAddrPattern("/positionsCurseur")==true) { //on assigne les valeurs de l'index 0, de type integer (.intValue) du message OSC //à la variable positionX que l'on assignera à la coordonnée x de notre cercle positionX = theOscMessage.get(0).intValue(); //on assigne les valeurs de l'index 1, de type integer (.intValue) du message OSC //à la variable positionY que l'on assignera à la coordonnée y de notre cercle positionY = theOscMessage.get(1).intValue(); } }
2 – Faire communiquer TouchOSC et une applet Processing via OSC
Nous allons créer une applet Processing qui va recevoir les données de l’appli TouchOSC lancée sur un smartphone.
Nous allons réaliser ce sketch (déplacement d’un cercle rouge : fader 5 fait déplacer le cercle selon l’axe X, et fader1 fait déplacer le cercle selon l’axe Y) :
Voici le schéma de communication entre les périphériques :
Réglages de l’appli TouchOSC sur le smartphone :
Une fois réglé, nous allons pouvoir choisir le layout Simple. Voici ce que nous aurons à l’écran et les correspondances de l’interface graphique avec les fader 1 et fader 5 :
Et voici le code de l’applet qui recevra les données de touchOSC sur l’ordinateur :
// on importe la bibliothèque OscP5 import oscP5.*; import netP5.*; //création d'un objet OscP5 appelé 'oscP5' OscP5 oscP5; //création d'un objet permettant l'échange d'information //à partir d'une adresse IP // et d'un port NetAddress myRemoteLocation; //on créée 2 variables qui vont nous //permettre d'assigner les valeurs des fader de touchOSC //aux coordonnées de notre cercle float positionX, positionY; void setup() { size(600, 600); frameRate(25); //paramétrage de l'objet oscP5 qui recevra les données // sur le port 7000 (paramétrer ToucOsc - menu options : 'outgoing port : 7000') oscP5 = new OscP5(this, 7000); //au départ, on place notre cercle au centre positionX = width/2; positionY = height/2; //on desactive les dessin des contours noStroke(); } void draw() { //arriere plan blanc background(255); //on lisse notre affichage smooth(); //on donne la couleur rouge à notre cercle fill(255, 0, 0); //on assigne les coordonnées variables à notre cercle ellipse(positionX, positionY, 20, 20); } /* methode oscevent permettant d'ecouter les evenements OSC */ void oscEvent(OscMessage theOscMessage) { if (theOscMessage.checkAddrPattern("/1/fader5")==true) { //on assigne les valeurs du fader5 de touchOSC à la positionX de notre cercle // la fonction 'map' nous permet de transformer l'echelle des valeurs du fader 5 (de 0 à 1) // à la largeur de notre scene (de 0 à width) positionX = map(theOscMessage.get(0).floatValue(), 0, 1, 0, width); } if (theOscMessage.checkAddrPattern("/1/fader1")==true) { //on assigne les valeurs du fader1 de touchOSC à la positionY de notre cercle // la fonction 'map' nous permet de transformer l'echelle des valeurs du fader1 (de 1 à 0) // à la hauteur de notre scene (de 0 à hauteur) positionY = map(theOscMessage.get(0).floatValue(), 1, 0, 0, height); } }