Problématique : comment faire pour que l'on puisse interagir avec un patch Pure Data via un navigateur web ?

Que faut il ?

Pour une configuration minimum

  • Pure data
  • un langage serveur ( PHP Python ou Javascript)

Voir le projet WebPd : mais nombre d'objet très limité : https://github.com/sebpiq/WebPd

Voir également le projet Libpd http://libpd.cc/ https://github.com/libpd/libpd

En utilisant la librairie javascript Nexus et en connectant ces éléments graphiques à un patch Pd via OSC

Voir le système de sonification de l'acvitié réseau via un Patch Pure Data coté serveur : https://ressources.labomedia.org/scripts_bash_linux_audiovisuel?s[]=sonification&s[]=serveur#sonification_serveur

Voir également la librairie JS Icecream qui permet d'envoyer un flux audio à un serveur Icecast via le navigateur web https://gitlab.com/jamie/icecream

Ce tuto comporte deux niveaux d'utilisation : le premier mets en place des scripts les plus simples possibles, le deuxieme mets en place une abstraction PHP ( une classe ) écrite il y a qques années par Alexandre Quessy ).

Pour info : les exemples suivants ont été mis en place sur un système Linux

Principe

  • Pour envoyer des données depuis PureData : il faut démarrer un daemon PHP/PYTHON ( = création d'une sockect permanente ) côté serveur qui va écouter le port 3006 ( ou autre ) pour des messages envoyés depuis l'objet NetSend.
  • Pour envoyer des données vers PureData: on ouvre une socket avec PHP/PYTHON sur le port 3005 par lequel on envoie de la donnée.

Dans un premier temps, on va utiliser un exemple le plus simple possible écrit avec les fonctions de base de PHP: J'ai placé ce fichier dans mon répertoire web ( /var/www ).

Pré-requis : Avoir installé PHP5 et PHP5-cli sur sa machine sur sa machine

sudo apt-get install PHP5 PHP5-cli
 error_reporting(E_ALL); // pas obligatoire, reporte toute erreur PHP
 $port = 3003;           
 $adresse = '127.0.0.1';
 // on test la précense d'un agument, si pas d'argument le message par défaut sera l'entier '999'.
 $message = empty($_SERVER['argv'][1])? 999 :$_SERVER['argv'][1] ;
 // creation d'une nouvelle socket
 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 if ($socket < 0) 
  echo "error " . socket_strerror ($socket);
 // on se connecte à Puredata via cette socket 
 $resultat = socket_connect($socket, $adresse, $port);
 if ($resultat < 0)
  echo "error: ($result) " . socket_strerror($result);
 $envoi1 = "example $message;"; // !!! syntaxe FUDI
 // on envoi le message à Puredata
 socket_write($socket, $envoi1, strlen($envoi1));
 socket_close($socket);

Ce script fonctionne avec le patch suivant (version ultra simplifiée du demo-simple-receive.pd - tiré des exemples d'Alexandre Quessy - voir plus bas ).

 #N canvas 1743 118 314 235 10;
 #X obj 49 29 netreceive 3003;
 #X obj 49 85 route example;
 #X symbolatom 49 186 10 0 0 0 - - -;
 #X obj 49 153 symbol;
 #X floatatom 133 186 5 0 0 0 - - -;
 #X text 150 20 Numero de port present;
 #X text 143 35 dans le fichier php;
 #X connect 0 0 1 0;
 #X connect 1 0 3 0;
 #X connect 1 0 4 0;
 #X connect 3 0 2 0;

Une fois le patch lancé, il suffit de taper cette ligne dans un terminal pour récupérer l'argument dans Puredata :

php -f /var/www/php2pd.php

ou

php -f /var/www/php2pd.php [argument]

Il est en effet possible d'jouter un argument = la valeur à envoyer à PD en lien et place du motif [argument]

Mise en place rapide pour causer de Puredata à PHP

Il nous faut un serveur qui va écouter le socket créé par l'objet netsend de puredata.

 error_reporting(E_ALL);
 /* Autorise l'exécution infinie du script, en attente de connexion. */
 set_time_limit(0);
 /* Active le vidage implicite des buffers de sortie, pour que nous
 * puissions voir ce que nous lisons au fur et à mesure. */
 ob_implicit_flush();
 $address = '127.0.0.1';
 $port = 3005;
 if (($socksend = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
     echo "socket_create() : " . socket_strerror(socket_last_error()) . "\n";
 }
 if (socket_connect($socksend, "127.0.0.1", 3006) === false) {
     echo "socket_bind() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
 }
 if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
     echo "socket_create() a échoué : raison : " . socket_strerror(socket_last_error()) . "\n";
 }
 if (socket_bind($sock, $address, $port) === false) {
     echo "socket_bind() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
 }
 if (socket_listen($sock, 5) === false) {
     echo "socket_listen() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
 }
 do {
     if (($msgsock = socket_accept($sock)) === false) {
         echo "socket_accept() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
         break;
     }
     /* Send instructions. */
     $msg = "server started; ";
     socket_write($msgsock, $msg, strlen($msg));
     do {
         if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
             echo "socket_read() a échoué : raison : " . socket_strerror(socket_last_error($msgsock)) . "\n";
             break; //break 2;
         }
         if (!$buf = trim($buf)) {
             continue;
         }
         if ($buf == 'quit') {
             break;
         }
         if ($buf == 'shutdown') {
             socket_close($msgsock);
             break 2;
         }
         $talkback = "response '$buf'.; ";
         socket_write($socksend, $talkback, strlen($talkback));
         echo "$buf\n";
     } while (true);
     socket_close($msgsock);
 } while (true);
 socket_close($sock);

Il faudra peut ê faire un

sudo chmod u + x pd2php.php

Il faut ensuite lancer le serveur en ligne de commande

php -f pd2pgp.php & 

Il faudra faire un

CTRL-C

pour stopper le serveur

<br> Je me suis servi du Patch d'Alexandre qui contient déjà un objet netsend&nbsp;:

 #N canvas 342 245 512 575 10;
 #X obj 130 400 select 0 1;
 #X obj 129 489 print PHP_error;
 #X obj 161 420 print PHP_RECEIVE_connected;
 #X obj 130 442 print PHP_RECEIVE_disconnected;
 #X obj 130 350 tgl 45 0 empty empty empty 0 -6 0 8 -24198 -1 -1 3 3;
 #X obj 31 509 nbx 4 30 -1e+37 1e+37 0 0 empty empty empty 0 -7 0 24 -24198 -1 -1 0 256;
 #X obj 31 487 f;
 #X obj 32 157 netsend;
 #X obj 31 306 cnv 5 444 5 empty empty empty 20 12 0 14 -128992 -66577 0;
 #X floatatom 32 30 5 0 0 0 - - -;
 #X obj 32 203 print send_to_PHP;
 #X obj 32 181 f;
 #X obj 118 88 loadbang;
 #X text 245 31 Send to PHP;
 #X text 225 322 Receive from PHP;
 #X msg 118 112 disconnect \, connect localhost 3005;
 #X obj 30 324 netreceive 3006;
 #X obj 30 465 route example_value PHP_error;
 #X msg 32 50 send example \$1;
 #X text 41 254 In this example. PD sends data to PHP. Then \, the PHP server answers to PD (below).;
 #X obj 28 16 cnv 5 444 5 empty empty empty 20 12 0 14 -128992 -66577 0;
 #X text 165 133 Click to reset connection.;
 #X connect 0 0 3 0;
 #X connect 0 1 2 0;
 #X connect 6 0 5 0;
 #X connect 7 0 11 0;
 #X connect 9 0 18 0;
 #X connect 11 0 10 0;
 #X connect 12 0 15 0;
 #X connect 15 0 7 0;
 #X connect 16 0 17 0;
 #X connect 16 1 0 0;
 #X connect 16 1 4 0;
 #X connect 17 0 6 0;
 #X connect 17 1 1 0;
 #X connect 18 0 7 0;

Pour info '127.0.0;1' = 'localhost', on peut utiliser l'un ou l'autre.

Il est possible de modifier le serveur PHP ( pd2php.php) pour causer dans les deux sens. Eneffet le patch çi dessus contient également une boite netreceive connecté sur le port 3006. Dans le script précedent il est possible de créer une deuxieme socket ( socket_create + socket_connect ) sur le port 3006.

une classe PHP pour causer avec Puredata

On va utiliser une série d'objet PHP écrits par Alexandre Quessy pour causer et recevoir des données en PHP cf (http://alexandre.quessy.net/?q=code).

Cette classe a le mérite de nous mâcher le travail et de produire rapidemment un proof of concept. Elle prend en charge la traduction des messages envoyés en syntaxe FUDI. Il est cependant toujours possible de faire plus simple et aussi efficace sans avoir recours à des dépendances PEAR (cf infra).

installer le packetage d'Alexandre&nbsp;:

sudo pear install --alldeps http://alexandre.quessy.net/pd/Audio_PureData-0.10.0.tgz

PHP et PUREDATA

très simple: 1 ouvrir dans un navigateur l'adresse http://localhost/puredata/demo-simple-send.php 2 ouvri le patch 'demo-silple-receive.pd'

Il est maintenant possible d'envoyer des valeurs à Puredata depuis la page web, voir les resultats dans PD.

PureData et PHP

Les exemples doivent se trouver le dossier d'installation:

/usr/share/php/Audio/PureData/Audio_PureData

Sinon il est possible de les trouver directement ici : http://alexandre.quessy.net/pd/Audio_PureData-0.10.0.tgz ou ici audio_puredata-0.10.0.tgz

il faut copier ces fichiers dans un /var/www/puredata ( en tous cas un répertoire web ) 4 fichiers : demo-server.php demo-server-sender.pd demo-server.php demo-simple-receive.pd demo-simple-send.php

en ligne de commande

cd /var/www/puredata
chmod u+x demo-server.php

puis toujours dans la console&nbsp;:

./demo-server.php

Désormais, ouvrir le demo-server-sender.pd, faire qques manipulations depuis le patch et voir le résultat dans la console

  • pure_data_interface_web.txt
  • Dernière modification: 2019/07/21 13:34
  • par Benjamin Labomedia