Interface-Z
Interface-Z

Notions de base de Pure Data

Pour télécharger un patch, clic droit sur l'image et choisir "Enregistrer la cible sous...".

01 - Entrée chaude, entrée froide, trigger, bang
02 - Print, profondeur d'abord
03 - Délais
04 - Métronome
05 - Changement de durées
06 - Pack, unpack, route
07 - Dollar 1
08 - Send / receive
09 - Netsend
10 - Set

01 - Entrée chaude, entrée froide, trigger, bang

Entrées chaude et froide.
Objets, messages et nombres en Pure Data.

a - Slider et nombre

Explorez les propriétés des sliders et nombres : clic droit / Properties. La possibilité de limiter les nombres utilisés entre un minimum et un maximum est très utile.

b - Entrée chaude et entrée froide - Zone rose

Bang : un message bang provoque l'activation des éléments (objet, nombre, message) sur lesquels il est connecté, il déclenche un événement.
+ :
objet qui ajoute deux nombres (donnés dans les deux entrées)
Entrée chaude d'un objet : c'est l'entrée la plus à gauche, elle permet de fournir un paramètre à l'objet (ici un nombre) et d'activer l'objet (ici l'activation provoque le calcul de la somme et l'apparition du résultat en sortie). Elle est aussi sensible à un bang en entrée ; en ce cas, le calcul s'effectue avec les dernières valeurs mémorisées dans chacune des entrées.
Entrée froide d'un objet : il peut y avoir plusieurs entrées froides par objets, elles sont à droite de l'entrée chaude. Une entrée froide permet de fournir un paramètre à l'objet (ici un nombre). Ce paramètre est mis en mémoire et n'est pas utilisé immédiatement. Il sera utilisé lorsque l'entrée chaude sera activée.

Dans le patch fourni, un nombre est connecté à chaque entrée du +. Faire varier les deux nombres en entrée du + et observer...

L'ordre dans lequel les entrées d'un objet sont utilisées est extrêmement important.

Quand le nombre de l'entrée chaude varie, il est immédiatement ajouté à celui de l'entrée froide. Quand le nombre de l'entrée froide varie, il est conservé en mémoire, mais l'opération n'est pas effectuée et le total sous l'objet + ne change pas.
L'intérêt des entrées chaudes/froides est de fournir tous ses paramètres à un objet avant de l'exécuter, sans que l'arrivée progressive de ces paramètres ne perturbe son fonctionnement et provoque des calculs intermédaires inattendus.

-> Exemple d'application : échantillonnage de données.

Echantillonnage de valeurs de capteur.
Valeur d'un capteur.

Regardez le patch de visualisation de données au cours du temps avec des sliders. En haut à gauche de la fenêtre un objet f (float) est utilisé. Cet objet emmagasine un nombre. Les valeurs venues d'un capteur entrent continuellement dans l'entrée froide du f. Chaque valeur est mémorisée par le f jusqu'à ce que la suivante la remplace. Le nombre mémorisé est envoyé sur la sortie (branchée sur un slider qui l'affiche) seulement lorsque l'entrée chaude reçoit, dans cet exemple, un bang venue du metro au-dessus. Ce metro envoie un bang toutes les 20 ms. L'objet f envoie donc un nombre toutes les 20 ms et pas à chaque fois qu'il reçoit une information d'un capteur.

Quelle est la différence par rapport au flux de données non échantilloné ? Si les valeurs arrivent plus fréquemment qu'une fois toutes les 20 ms, l'objet f n'en enverra qu'une partie au slider, seulement celle qui est mémorisée juste avant l'arrivée du bang. Si les valeurs arrivent plus lentement, une même valeur sera envoyée plusieurs fois successivement car elle reste en permanence en mémoire dans le f en absence de nouvelle arrivée d'une donnée.

c - Trigger - Zone bleue

trigger bang float = t b f : cascade des événements dans un ordre précis.

L'objet trigger provoque l'envoi ponctuel de quelque chose. Ce quelque chose peut être un bang (b), un nombre (f), un symbol (s), une list (l) ou anything (a, n'importe quoi qui entre dans l'objet). Nous l'utilisons ici avec un bang et un nombre. Un trigger séquentiel envoie plusieurs informations quasi simultanément mais dans un ordre précis. Les sorties du trigger sont activées successivement de la droite vers la gauche.

Ici, le trigger prend en entrée un nombre. Il est automatiquement activé à chaque changement de ce nombre. Le f du trigger transmettre d'abord ce nombre, le b envoie ensuite un bang. Cet objet permet de transformer l'entrée froide du + en entrée chaude : la somme est calculée quand n'importe lequel des deux nombres en entrée du + est modifié.

02 - Print - Profondeur d'abord

a - Print

Observez la fenêtre texte de PD en faisant varier les deux nombres.

Intérêt du print Pure Data.
Utilité de l'objet print.

Print permet de contrôler ce qui se passe. Il s'exprime dans la fenêtre Dos / Terminal.

C'est un objet très utile pour chercher les erreurs dans un patch et pour comprendre étape par étape ce qui se passe le long d'une chaîne de calcul. Il permet aussi de voir dans quel ordre sont exécutés les objets.

Par exemple ici, le print marqué nb apparaît toujours avant celui qui est marqué sortie.

b - Indétermination apparente

Ce patch permet de voir l'utilité du trigger pour maîtriser l'ordre des événements.

En effet, les print marqués nb sont toujours affichés avant le print sortie grâce au t f f, mais l'ordre n'est pas aussi déterminé pour les print nb, nb2 et nb3. La deuxième sortie f, la plus à gauche, n'est connectée qu'à une chaîne d'objets mais la première sortie f, la plus à droite, est connectée sur deux chaînes d'objets différentes. Selon comment les patchs ont été construits, l'ordre d'affichage des print peut être :

nb
nb2
nb3
sortie

ou bien :

nb2
nb3
nb
sortie

alors que les patchs paraissent identiques.

En fait, l'ordre d'exécution n'est pas indéterminé mais dépend de l'ordre dans lequel les ficelles ont été tirées à partir du trigger. Les objets liés à la première ficelle dessinée sont exécutés en premier. Si les ficelles sont effacées et reconnectées dans un autre ordre, l'ordre des print change...

Cet exemple montre qu'il vaut mieux toujours utiliser un trigger séquenciel plutôt que de brancher plusieurs ficelles sur une même sortie, dès qu'un ordre logique doit être respecté dans l'activation des objets.

c - Profondeur d'abord

Cet exemple permet également d'aborder l'idée de profondeur d'abord, inhérente au fonctionnement de PD. Attention, les autres logiciels de gestion temps réel ne fonctionnent pas forcément sur ce principe.

Lorsqu'un objet (appelé ici premierobjetdupatch) a plusieurs sorties, des enchaînements parallèles d'objets y sont connectés. Ces chaînes de connexions peuvent être consituées d'un ou deux objets ou bien de multitudes d'éléments et de sous-patchs. On peut imaginer différentes façons d'activer ces objets : par exemple, tous les objets branchés directement sur premierobjetdupatch sont exécutés, puis tous les objets branchés sur ces deuxièmes objets sont exécutés, puis tous ceux qui d??pendent d'une troisième génération de branchement, etc. Ce n'est pas ainsi que cela se passe dans PD.

Lorsque premierobjetdupatch est activé, il entraîne l'activation d'un premier élément en sortie. Ensuite, tous les objets qui sont connectés à ce premier élément sont exécutés. Tant qu'il y a des objets connectés sur des sorties d'une chaîne, l'activation se continue et se propage sur cette chaîne (y compris dans ces propres embranchements et sur le même principe). Quand il n'y a plus de connexion sur les sorties, PD rend la main au premier objet qui a appelé la chaîne premierobjetdupatch et à qui il reste des sorties connectées sur quelque chose. La sortie suivante de premierobjetdupatch, et tout ce qui en découle, est alors activée.

-> Exemple de lecture d'un patch :

Profondeur d'abord
Exécution des objets dans le temps.

Dans cet extrait de patch, suivons l'ordre d'exécution des objets.

- CE N'EST PAS "t f f f, puis Bucket, puis -, puis spigot".

- Des données sortent du huit_ana_mode_7bits et activent le trigger.
- La première sorite f est activée et transmet la valeur au Bucket, qui à son tour envoie la valeur qu'il avait en mémoire dans l'objet -. Comme la valeur est envoyée sur une entrée froide, le - mémorise la valeur mais n'exécute pas l'opération. La chaîne d'exécution dépendant de la première sortie du t f f f s'arrête ici. PD rend la main au tfff.
- La deuxième sortie du trigger peut alors s'activer : la valeur du capteur est envoyée dans l'entrée chaude du -, qui fait l'opération. Le résultat est comparé à 0 par l'objet >, qui envoie sa réponse (vrai 1 ou faux 0) dans un route, lequel trie ces réponses et envoie soit un message 1 au spigot (et la chaîne s'arrête ici) soit un message 0 à un t b f et l'exécution des objets continue jusqu'au s vmem. Chaque objet rend la main à celui qui l'a appelé quand il n'a plus rien à faire (pas d'autre sortie connectée ailleurs). PD remonte alors à l'objet qui a appelé toute la chaîne, c'est-à-dire le premier t f f f.
- La troisième sortie du trigger est alors utilisée et envoie la valeur du capteur dans le spigot.

03 - Délais

delay et pipe, objets de puredata.
Objets temporels.

L'argument est un paramètre que l'on écrit après le nom de l'objet lorsqu'on veut lui donner une valeur fixe. Par exemple dans delay 5000, delay est l'objet et 5000 l'argument, qui correspond à un nombre que l'on peut aussi envoyer par la deuxième entrée de l'objet. Certains objets acceptent plusieurs arguments.

L'objet delay provoque une attente de la durée donnée dans l'argument ou dans l'entrée de droite. La durée est indiquée en millisecondes. Un bang sur un delay en cours le réinitialise sans provoquer de sortie.

Delay est activé par un bang ou par un message ou bien une variation de nombre en entrée. En sortie, il envoie systématiquement un bang. Un message stop en entrée l'arrête.

L'objet pipe transmet en décalé tout ce qui lui arrive. Le décalage est donnée par l'argument ou par l'entrée de droite (en millisecondes).

Tester ces deux objets en les activant rapidement ou lentement pour voir leur différence de fonctionnement.

Dans ce patch, un bang graphique est utilisé pour visualiser l'effet des objets. C'est un carré contenant un disque, qui change de couleur quand le bang est activé. Cet objet visuellement pratique est néanmoins à éviter pour autre chose qu'un contrôle au cours de la création d'un patch, car il est beaucoup plus lent à exécuter qu'un simple message bang.

-> Exemple d'application : lecture d'un fichier son

Lecture d'un fichier son en PD.
read soundfile...

L'objet readsf~ permet de lire un fichier son au format aif ou wav. Pour lire un fichier, il faut deux étapes : ouvrir le fichier son (message open avec le nom du fichier) puis lancer la lecture (message 1). Ces deux étapes doivent se faire successivement car readsf~ ne peut lire un fichier s'il n'est pas d'abord ouvert, même si c'est le même fichier qu'il a lu juste avant. Un message 0 permet d'arrêter la lectrure du son.

Il n'est pourtant en général pas possible d'utiliser directement un trigger bang bang qui activerait le message open puis immédiatement après le message 1. En effet il faut un petit temps pour que le fichier soit effectivement ouvert. Ce temps nécessaire d'attente avant de pouvoir lancer la lecture dépend de la taille du fichier. Là intervient l'objet delay : un délai d'1 à 25 ms (selon le fichier) assure que le message 1 est envoyé au bon moment et pas trop tôt au readsf~.

04 - Métronome

a - Le toggle

Le toggle envoie une valeur différente de 0 une fois lorsqu'il est activé et un 0 lorsqu'il est désactivé. Par défaut la valeur envoyée à l'activation est 1. Il permet par exemple de lancer et d'arrêter un metro.

Il est activé soit par un clic sur le carré soit par l'arrivée sur son entrée d'un bang ou d'un quelconque nombre différent de 0. Il reste activé si d'autres nombres non 0 continuent à arriver. Il est désactivé soit par un 0 soit par un bang. Les messages bang donc alternativement l'activent et le désactivent.

Le toggle peut éventuellement être remplacé par deux messages, 1 et 0.

Oscillation contrôlée par metro et delay.
Cet exemple est détaillé plus loin.

b - L'objet metro

L'objet metro crée un métronome : une fois activé, il envoie régulièrement un bang à la fréquence donnée par son argument en millisecondes. Un metro 3000 envoie un bang toutes les trois secondes.

Il peut être contrôlé par un toggle : l'activation du toggle lance le metro, son inactivation arrête le metro. Le metro peut aussi être lancé par un bang, mais pas être arrêté par un bang suivant. Un autre bang décalera le metro dans le temps en donnant le moment de l'appui comme instant de départ. Enfin, le metro peut être contrôlé par des nombres : un 0 l'arrête alors que n'importe quel autre nombre se comporte comme un bang et relance le chronomètre.

c - Comportement de delay et pipe selon la fréquence du metro

metro, delay et pipe.
Objets temporels.

Activer les deux metro et observer ce qu'il se passe au niveau des bang. Désactiver les deux metro et observer le résultat, comparer delay et pipe.

Le metro 2000 envoie un bang toutes les deux secondes, comme on le voit sur le bang graphique qui lui est directement connecté. Les deux bang du dessous se comportent de façon identique : celui qui est branché sous le pipe 500 comme celui qui est sous le delay 500. Ils sont activés une demie-seconde après que le metro ait envoyé son bang.

Le metro 500 envoie un bang toutes les 0,5 secondes. Le comportement de delay et pipe est maintenant différent. Sous le pipe 2000, le bang commencent à pulser deux secondes après le lancement du metro puis envoie régulièrement des bang toutes les demie-secondes. En revanche, le bang sous le delay 2000 reste muet. En effet, il n'est jamais activé car le metro le relance tout le temps avant qu'il soit arrivé à la fin de ses 2 secondes.

Lorsque l'on arrête le metro 2000, on voit un dernier bang arriver sous pipe et delay 0,5 seconde après la fin du metro.

Lorsque l'on arrête le metro 500, le bang sous le pipe continue à pulser pendant deux secondes puis s'arrête. Le bang sous le delay, quant à lui, est enfin activé une seule fois, 2 secondes après la fin du metro : le dernier lancement du delay n'a pas été interrompu et il peut aller jusqu'au bout.

-> Exemple d'application : création d'une oscillation

Oscillation contrôlée par metro et delay.
Rampe de valeurs.

Cette fonction est utilisée dans le patch de test de la carte 8 Transistors (pilotage de lampes et moteurs CC). Elle crée une oscillation régulière de valeurs entre 4 et 127.

Le metro envoie un bang toutes les 3 secondes. Il active à la fois :
- un delay de 1500 ms
- et un message 127 1500 connecté sur un objet line.

L'objet line crée une rampe de valeurs pour rejoindre la valeur donnée par le premier nombre du message (127) en une durée donnée par le deuxième nombre (1500). Les valeurs envoyées par le line augmentent donc jusqu'à 127. A ce moment, le delay envoie un bang, puisque sa durée est la même que celle du line. Le delay active alors un message 4 1500 lui aussi connecté sur le line. Les valeurs en sortie du line diminuent donc jusqu'à 4 pendant une seconde et demie. Les durées cumulées faisant trois secondes, les valeurs arrivent à leur minimum au moment où le metro relance le processus.

05 - Changements de durée

Changements de durées.
Durée de metro, delay, pipe.

a - Changement manuel de l'argument

Il suffit de réécrire la durée dans les objets delay, pipe et metro pour changer leur comportement. Cependant, si c'est faisable lors de test, ce n'est pas très pratique, en particulier pour le metro qu'il faut à ce moment désactiver et réactiver pour qu'il prenne le changement en compte.

b - Changement de durée par l'entrée droite

L'objet loadbang envoie un bang à l'ouverture du patch. Dans notre cas, il active des messages pour configurer les durées de delay et pipe. Bon, dans ce cas précis il y a peu d'intérêt à utiliser un loadbang puisque la durée inscrite en argument dans les objets est la même.

Un nombre connecté à l'entrée droite permet de changer la durée. L'affichage de l'argument ne change pas, alors que la durée prise en compte a varié. Il ne faut donc plus se fier à l'argument écrit une fois que la durée a été modifiée. Toute modification par l'entrée droite devient permanente jusqu'à la fermeture du patch ou la modification suivante.

La multiplication par 10 avant d'entrer dans l'objet permet d'amplifier l'effet des variations et de les rendre plus visibles. La nouvelle durée est prise en compte seulement après que l'ancienne soit arrivée à terme et que le bang ait été envoyée.

Faire varier la durée du metro et observer l'effet sur le delay. Selon que le metro est plus rapide ou plus lent que le delay, celui-ci se finit ou pas.

c - L'objet random

Random envoie un nombre au hasard entre 0 et son argument - 1. Ici par exemple, quand le métro envoie un bang sur random, celui-ci donne un nombre entre 0 et 2999. La sortie du random étant connectée sur l'entrée droite du metro, la durée entre les bangs change continuellement.

Etape par étape : Lorsque le toggle est activé, le metro démarre avec 1500 comme paramètre. Un premier bang est immédiatement envoyé au random, qui donne par exemple 2144. Le 2144 est enregistré dans le metro, mais celui-ci envoi son deuxième bang à 1500 ms, avant de prendre en compte 2144, qui sera la durée utilisée ensuite pour le troisième bang. Il y a donc toujours un décalage d'un intervalle entre la valeur affichée pour le random (ajouter un nombre sous le random pour vérifier) et la valeur prise en compte par le metro.

06 - pack, unpack, route

pack unpack et route

 

07 - Dollar 1

Dollar 1 $1

 

08 - send / receive

Objets send receive
Les objets send / receive.

send et receive d'un patch à un autre.
Transmission d'information par send / receive.

 

09 - netsend

Communication netsend
Objets réseau.

 

10 - set

Message set
Modification de message par set.