*Pure Data est utilisé dans tous les champs de la création (musique, arts visuels, danse, théâtre, robotique, etc.) pour des performances visuelles et sonores ou la création d'installations interactives, participatives et génératives. Il possède des capacités particulières dans les domaines de la musique acoustique et de la musique audio-numérique : il sert à modéliser des instruments électroniques comme les synthétiseurs. Il permet la gestion d'échantillonneurs (samplers) et d'effets, la composition musicale, ou encore, la création de séquenceur MIDI, etc. Il peut également gérer des applications vidéo et 3D.*
*Avec Pure Data, il est possible également d'interfacer un programme avec le monde physique en utilisant des capteurs (caméras, détecteurs de présence, etc.) pour commander des robots, interagir avec des sites internet, ou encore effectuer une visualisation de données. En art appliqué, il est utilisé en design d'interaction, en architecture et pour créer des jeux.*
Source : [Manuel de PureData en français](https://fr.flossmanuals.net/puredata/introduction/)
### Obtenir PureData
Télécharger gratuitement depuis [le site web officiel](http://puredata.info/downloads/pure-data). La version à utiliser pour ce cours est PureData Vanilla, que l'on pourra compléter avec des plug-ins si besoin.
#### Versions
There are a few different versions of puredata available in the wild.
Below is a small list but I would *highly* advise to start with puredata vanilla.
The extended version is *very* dated now and I would not advise to use that one.
* puredata vanilla (the **main** version)
* puredata extended (up until a few years ago the go-to version for most people)
* Pd-L2Ork (same engine as vanilla but with different GUI)
#### libpd : pour intégrer PureData dans d'autres applications
PureData peut être intégré à d'autres application comme moteur audio. Cette technique est très utilisée par les développeurs d'applications et game designers.
Cela requière des compétences de programmations qui vont au-delà de cette courte formation, mais il est important de noter que PureData est utilisé, et utilisable en dehors du pur *sound design*.
Lien utiles :
* [libpd github](https://github.com/libpd)
* [libpd in unity3D](https://github.com/Magicolo/uPD)
* [camomille - VST creating with libpd](https://github.com/pierreguillot/Camomile)
## Interface
À l'ouverture, Pure Data n'affiche que la fenêtre principale, avec une barre de menu et un espace blanc en-dessous. Cette espace blanc sera la **console**, qui va afficher des infos utiles, des erreurs, ...
La fenêtre de programme audio, appelée fenêtre de **patch**, s'affiche lorsque l'on va dans le menu "Fichier" -> "Nouveau". C'est dans cette fenêtre que l'on va créer les boîtes, et les connections entre ces boîtes, pour créer graphiquement un programme audio.
* Créer un patch vide, ajouter une boîte Message (depuis le menu "Ajouter") et écrire à l'intérieur le texte : "hello world"
* Enregistrer le patch
* Fermer PureData, réouvrir le patch et vérifier que le message est toujours là.
---
## Exemple 1: Hello World
PureData propose cinq types de boîtes de base pour la programmation graphique - toutes disponibles depuis le menu "Ajouter".
Les deux types dont nous avons besoin pour cet exemple sont :
* Les boîtes **Objet**
* les boîtes **Message**
Pour faire fonctionner ce "hello world", il faut connecter la sortie (*outlet* en anglais) de la boîte message "hello world" vers l'entrée (*inlet* en anglais) de la boîte objet "print".
![hello world](./resources/xgr1.jpg)
Ce principe est valable pour toutes les boîtes : on relie la sortie d'une boîte à l'entrée d'une autre. S'il y a une incompatibilité de connection, PureData refusera de faire la connection - et un message d'erreur devrait s'afficher dans la console.
Les entrées des boîtes sont toujours en haut, les sorties sont en bas. En général, on écrit donc des patches Pure Data de haut en bas, avec les informations qui sont transmises des boîtes du haut vers les boîtes du bas.
Pour expliquer comment fonctionnent les objets, PureData fournit de l'aide en faisant un **clic droit**, puis en cliquant sur **Aide**.
La fenêtre d'aide qui va s'ouvrir est elle-même un patch PureData : il est donc possible de le tester (en cliquant sur les boutons, en modifiant les valeurs) et de copier les boîtes pour les mettres dans ses propres patches.
![help view](./resources/59e9.jpg)
PureData a deux **modes** de fonctionnement :
* Le mode d'**édition** (pour éditer les boîtes et les connections)
* Le mode **normal**, ou mode de **jeu** (pour interagir avec les boîtes)
Pour passer d'un mode à l'autre, il faut utiliser le raccourci **Ctrl+E**.
Toutefois, il est possible de jouer avec une boîte alors qu'on est en mode d'édition, est maintenant la touche **Ctrl** appuyée (par exemple : **Ctrl+Clic** sur une boîte, un slider, ...).
Pour faire des calculs arithmétiques (additions, soustractions, ... et des fonctions ) PureData contient des boîtes d'objets pour les opérations +, -, etc... Pour donner des valeurs à ces boîtes-objet, on peut utiliser des boîtes de message, mais aussi des boîtes de **nombres** (depuis le menu Ajouter).
* L'intérêt est que l'on peut cliquer sur ces nombres (en mode normal, pas en mode d'édition) pour modifier facilement le nombre l'intérieur.
* Le problème des nombres est qu'il ne sont pas sauvegardés lorsque l'on ferme le patch (alors que les messages, eux, sont bien sauvegardés)
Dans Pure Data, les entrées et sorties (*inlets* et *outlets*) des boîtes n'ont pas toutes exactement le même comportement. Concernant les entrées, il existe des **entrées chaudes et froides** (*hot/cold*). Pour chaque boîte, on a :
* à gauche 1 seule entrée chaude
* toutes les entrées restantes à droite sont des entrées froides
Pour gérer ceci, il est très utile d'utiliser les deux objets suivants :
Le "Bang" (disponible de puis le menu "Ajouter") est une fonctionnalité essentielle de Pure Data. Un Bang permet à la fois de déclencher (*trigger* en anglais) des boîtes reliées à sa sortie, et de donner un retour visuel sur les actions des boîtes reliées à son entrée.
Les "Triggers" prennent une donnée (nombre, bang, list, message, ...) en entrée, et envoient les sorties **les unes après les autres, de droite à gauche**.
En ajoutant des objets trigger dans nos patches, on peut définir précisément **l'ordre des opérations**.
Cet objet metro peut prendre un temps sur **l'entrée froide**, ou bien (ne pas utiliser les deux méthodes) en lui envoyant un argument (via un message "tempo 500 msec" par exemple);
Ci-dessous, voici un grille de quelques exemple de conversion de *BPM* (tempo) en longueur de notes (noire/*quarter*, croche/*8ths*, etc.)
Depuis le menu **media**, sélectionner les Paramètres Audio. Les paramètres vont dépendre de la carte son de l'ordinateur, et du système d'exploitation.
Une bonne valeur est en général 512 échantillons (*samples*).
Lorsqu'un patch audio sera prêt, il ne faudra pas oublier de cocher la case DSP (*digital signal processing*) pour lancer le moteur de calcul audio de Pure Data.
Attention : PureData permet de créer n'importe quel son, et il n'y a donc pas de limitation du volume en sortie. Il faut d'abord ne jamais mettre le casque trop fort, et on mettra systématiquement un limiteur en sortie (vu juste après).
<pstyle="text-align:center;color:red;">Attention : Ne jamais mettre les écouteurs trop fort, et toujours mettre un limiteur (objet "clip") à 0.5 avant le bloc de sortie audio. Vos tympans sont très précieux, prenez-en soin !</p>
Jusqu'à maintenant, nous n'avons utilisé que des connexions de **données** entre les boîtes. Pour créer du son, nous allons maintenant créer des connexions de **signaux audio** entre des blocs de traitement du signal. Ces blocs sont facilement reconnaissables car ils commencent par un **tilde : ~**.
Des objets de contrôle très répandus en audio sont les **sliders** (voir ci-dessous). Il peuvent être configurés en faisant un **clic droit** sur eux.
Pour utiliser des sliders comme contrôle de volume audio, il est très important de modifier leur intervalle de valeurs (leur *range*). En effet, il renvoient par défaut des valeurs entre 0 et 127, alors que les signaux audio dans Pure Data sont des flux de **nombres à virgule entre -1,0 et +1,0**.
Pour ne pas avoir de saturation, et pour ne pas avoir de volumes audio trop importants (attention à vos oreilles !) on va régler le slider principal de volume sur la plage de valeurs de 0,0 à 0,1.
Cela correspond à gains de moins l'infini à -20 dB (décibels).
## Exemple 6 : Un peu de théorie musicale... et MIDI
Le MIDI permet de représenter des notes (Do, Ré, Mi, .. ou bien *C, D, E*, ...) avec des nombres sur 7 bits, entre 0 et 127. C'est une vieille norme - qui date des années 1980 - qui est toujours très utilisée aujourd'hui.
En musique occidentale, le **système tonal** propose une manière de décomposer de mélodies en **gammes (majeures, mineures, ...)** basées sur 1 note principale : **la tonique**.
Même si maîtriser toutes les subtilités des gammes et des modes requière une très bonne connaissance du solfège, on va quand même pouvoir utiliser ces gammes de manière simple pour créer des séquences de notes dans Pure Data.
Par exemple, une des gammes les plus utilisées est la **gamme majeure**. À partir d'une note tonique définie, la gamme majeure est composée des 6 **degrés** suivants :
| Degré | Nom | Écart degré précédente | Écart total en échelle MIDI |
While it is very important and satisfying to make your own puredata patches from scratch, there are a lot of extra libraries that can provide you with essential building blocks.
Most of these can be installed with the build in package manager in puredata vanilla.
You can access it by going to the menu **help** and choosing **find externals**.
Some very useful ones are:
* mrpeach (for everything network and OSC related)
* list-abs (list abstractions that make manipulating and searching lists very easy)
* cyclone (a bunch of useful little gems)
* comport (for interfacing with arduino and other serial devices)
* hid (useful for gamepads and joysticks)
![installing externals](./resources/dniz.jpg)
You can see all the externals that you have installed by going to the **help** menu and choosing the **browser**.
Most libraries come with extensive help files to get you going in no time.
![externals browser](./resources/f33w.jpg)
Now, a *very* powerful collection of synthesizer building blocks is called **automatonism**.
This is more than a library of abstractions, it makes puredata an easy to use modular synth.
While I absolutely love this software, a basic understanding of puredata vanilla will go a long way.
You can download automatonism from the link below.