Pure Data vs PHP

Ce wiki a été archivé en 2018.

Le nouveau wiki se trouve à: ressources.labomedia.org

Les fonctionnalités sont désactivées: vous pouvez faire une recherche sur Google site:https://wiki.labomedia.org et découvrir La Labomedia.

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

PureData <-> PHP

Problématique : comment faire pour que PureData puisse causer à un serveur web et inversemment.

Que faut il ?

Pour une configuration minimum

  • Pure data
  • un langage serveur ( PHP dans ce cas mais on pourrait également utiliser Python )

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 parlequel on envoie de la donnée.

Solution 1 : Causerie Pd php via ajax

Solution 2 : Mise en place de sockets pour causer à Puredata via du PHP

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
  <?php
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.

 <?php
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


Je me suis servi du Patch d'Alexandre qui contient déjà un objet netsend :

 #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 :

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

PHP -> 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 -> 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

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 :

 ./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

TODO

faire un exemple simple pour recevoir de la données transcrire les exemples simples en Python

Solutions alternatives