Valentin Dupas

💡 If this is the first course you read from me, please read this small thing : about my courses

Introduction à Chataigne

Dans cette introduction, on va voir les 3 fonctionnalités principales de Chataigne. Le but n'est pas de tout voir, mais d’en voir suffisamment pour que vous puissiez explorer avec confiance la La documentation officielle ou d'autres tutos.

"Je vois Chataigne comme un chef d'orchestre"

Le titre de ce chapitre est une citation (traduite d'une présentation en anglais) de Benjamin Kuperberg l'auteur de Chataigne. Et bien évidemment, étant la personne que je suis, je ne suis pas d'accord 😄. Mais mon opinion on s'en fout, c'est juste un bon terreau d'explication que d'exposer les deux visions pour vous offrir la possibilité de mieux saisir l'intérêt.

Je vous spoile la conclusion, je n'ai pas particulierement raison et la vérité est probablement entre les deux.

...

Voilà ce que j'imagine quand on me parle de chef d'orchestre, un rôle de coordination et de direction dont la communication est unidirectionnelle.

...

Si on le ramène à Chataigne, ça me donne une image comme celle-ci, ou nous avons Chataigne d'un côté et toutes les choses avec lesquelles on peut interagir en face.

Gardons cette image en tête quelques instants et prenons un petit détour pour parler de votre ordinateur.

...

Vous savez tous que si votre ordinateur a un port HDMI et que votre TV a aussi un port HDMI ...

...

... il suffit juste de brancher un câble qui va faire transiter l'information de votre PC à votre TV.

Eh bien il faut savoir que vos logiciels aussi ont des ports!

...

Vous ne pouvez pas directement voir les ports de vos logiciels, mais c'est ce qui leur permet d'échanger des informations avec des choses qui leurs sont externes. Dans le cas de Reaper par exemple, nous avons un port MIDI pour y brancher des contrôleurs physiques et un port OSC pour recevoir des informations de la part d'interfaces de contrôle par exemple.

...

Lorsque vous branchez votre contrôleur MIDI, son driver (la partie logicielle qui prend en charge les communications de votre contrôleur) peut être connecté à Reaper.

...

Si on revient vite fait au chef Chataigne, on se rend compte que nos éléments étaient déjà organisés en groupes.

En haut à gauche nous avons les éléments qui nous donnent leurs informations, en bas les éléments qui font transiter l'information, et en haut à droite nous avons ceux qui utilisent cette information. Mais Chataigne dans tout ça?

...

Aucun Chataigne à l'horizon dans notre installation musicale.

...

Mais qu'est-ce qu'il se passe lorsque je veux faire une installation qui requiert d'être sur une page web? Les navigateurs web ne sont pas programmés pour accepter des messages MIDI, ils n'ont pas le port!

...

C'est là qu'arrive Super Chataigne! Les ports de Chataigne sont autant capables de recevoir que d'émettre, et il en offre une belle selection.

...

On peut donc faire la passerelle et régler notre souci.

...

Mais ce n'est pas juste l'équivalent du câble avec un HDMI d'un côté et un port DisplayPort de l'autre. On peut recevoir des infos de la part d'un paquet de trucs à la fois et les rediriger/mixer en fonction de nos besoins.

...

Et du coup c'est pour ça que je vois Chataigne plus comme une pieuvre multitâche,

...

Mais Chataigne peut faire plus que ça et notamment piloter une installation uniquement via des fonctionnalités qui sont incluses.

...

Et c'est pour cette raison qu'au final je vous propose de le voir comme une pieuvre cheffe d'orchestre avec une oreillette reliée à une régie.

À propos de l'interface

Puisque l'interface peut être arrangée comme bon vous semble, vous trouverez le seul screenshot qui prend toute l'interface ci-dessous. Pour le reste des images dans ce document, vous aurez juste à regarder le nom de l'onglet pour savoir où est ce que l'action se déroule.

...
  1. Les modules représentent et listent les différent éléments avec lesquels Chataigne interagit
  2. Les variables sont des valeurs qui sont propre à votre projet Chataigne, utile pour stocker des valeurs lues depuis vos module d'entrée
  3. La state machine représente l'état général de votre projet
  4. L'inspecteur permet de visualiser et modifier l'état d'un élément sélectionné
  5. Les séquences permettent de définir un enchaînement de modifications dans le temps, que ce soit des modifications de votre projet, de variables, de modules ...
  6. Le logger permet de voir des messages de la part de Chataigne à l'intention de l'utilisateur(vous), les messages en rouges sont des messages d'erreurs qui nous indiquent ce qu'il faut corriger, ceux en jaune nous previennent que quelque chose est à corriger mais que ça n'empêche pas le fonctionnement, et les autres nous donnent juste des infos sur ce qu'il se passe.
...

Si jamais vous faites une fausse manip' et que vous cassez l'interface vous pouvez aller dans "View > Layout > Load Default Layout" pour restaurer l'interface par défaut.

Les modules

Les modules sont les différents éléments avec lesquels Chataigne peut interagir.

Je ne vais les énumérer ici, la doc fait un excellent job là dessus https://benkuper.notion.site/The-Modules-abfdbd8f4dee43ed8c25d935b778fff8

Ce que je vous conseille, c'est de les voir au compte-goutte en fonction de vos besoins.

... ... ... ... ... ...

Vous remarquerez qu'on peut les éteindre en cliquant sur le bouton à leur gauche. Mais vous remarquerez aussi qu'ils ne sont pas tous égaux, certains présentent plus ou moins de badges dont vous trouverez l'explication ci-dessous.

... ... ...

Vous pouvez cliquer sur le badge d'émission ou de reception pour qu'il affiche dans le logger les valeurs qui sortent ou rentrent du module.

...

Les humbles generators

On va commencer par faire simple et utiliser le module “Signal” afin d'éviter toute erreur de manipulation extérieur à Chataigne qui pourrait perturber ce qu'on essaye d'apprendre.

... ...

Si vous cliquez sur votre signal vous pourrez voir les différents paramètres qui permettent de manipuler votre sortie. Le plus important étant le Type qui permet de générer facilement des formes de signaux assez courant. Par défaut il est sur "Sine" qui nous génère un signal sinusoïdal comme ceci.

... ...

On va aussi avoir besoin d'une sortie, et là il n'est pas possible d'avoir quelque chose qui reste dans Chataigne, donc je propose qu'on parte sur du MIDI.

// TEMP : je pars du principe que vous avez tous un logiciel d'édition de musique sous la main et que vous savez recevoir du MIDI. Si ce n'est pas le cas, téléchargez Sunvox et faites moi signe. Cette section sera peut être remplacée par une turbo introduction à Sunvox un jour.

...

Si vous cliquez sur votre module MIDI vous pourrez sélectionner l'appareil de sortie. De ce que je comprends, une limitation de MIDI est qu'il faut nécessairement recevoir et sortir ses données depuis/vers un appareil, donc on ne peux pas sortir directement de Chataigne, il nous faut utiliser un programme qui fait semblant d'être un appareil de sortie et d'entrée. Sur windows vous pouvez utiliser loopback MIDI et sur Mac le gestionnaire IAC.


Cool! On est prêts pour voir les states pour relier notre signal et notre sortie MIDI.

Les states

...

Pour ajouter un state faites un clic droit dans la state machine.

Un state peut contenir plusieurs "actions" et plusieurs "mapping". Voyons les actions dans un premier temps.

Les actions

...

Et via un clic droit dans notre tout nouveaux state, nous pouvons créer une action.

...

Si vous sélectionnez l'action et regardez dans l'inspecteur, on se rend compte que l'on a un bloc de condition et deux blocs de conséquences. Dans l'essentiel, les actions permettent de faire quelque chose lorsqu'une condition est remplie ou quand elle ne l'est pas. Notez que par défaut la condition TRUE ne se fait qu'une fois, lorsque la condition passe de "fausse" à "vraie" et l'inverse est valable pour FALSE. Par contre, si vous activez "Always Trigger" alors la conséquence TRUE sera effectuée si on passe d'une valeur qui valide la condition à une autre valeur qui valide aussi la condition.

...

Pour lier notre signal en tant que valeur d'entrée dans cette action il faut cliquer ici.

...

Puis sélectionnez "Signal > Value" parmi tout ce qui est disponible.

...

Nous pouvons ensuite ajuster notre condition, dans l'exemple ci-dessus nous vérifierons que la valeur de notre signal est supérieure ou égale à 0.9. Vous pouvez déjà constater que la condition fonctionne comme attendu puisque le bloc devient vert lorsqu'elle est validée.

...

Dans les conséquences on peut maintenant ajouter l'une des commandes de notre module MIDI comme "Note on" dans le bloc de conséquence TRUE. Ce qui fait que nous enverrons une note lorsque le signal passera au-dessus de 0.9.

...

Et si vous voyez ceci, mes félicitations, nous sommes en train d'envoyer des messages MIDI. Faites attention à vos oreilles, mais c'est l'heure de tester le résultat par vous même dans votre logiciel de musique.

...

Effectivement, ce n'est pas particulièrement agréable, par contre on peut juste envoyer un message "Note off" dans la conséquence FALSE pour arrêter de jouer la note lorsque le signal n'est pas supérieur ou égal à 0.9.

Exercice 1

Essayez de sortir une note midi avec une manette de xbox/joycon/la souris.

Solution : gamepad_midi.noisette

les mappings

Nous pouvons ponctuellement déclencher une action mais comment est-ce que nous pouvons continuellement mettre à jour une valeur avec une autre? Comment est-ce que je pourrais faire en sorte que la vélocité de ma note corresponde à la position du joystick de ma manette?
Grace aux mappings!

...

Avant de commencer on va vite fait éteindre (disable) notre action.

...

La création d'un mapping commence de la même manière qu'une action.

... ... ... ...

L'ajout du signal en entrée et du MIDI en sortie est similaire, quoique pas à 100% la même chose.

...

Jusqu'ici on a pas l'air trop mal, mais je vous propose que la valeur du signal serve pour la hauteur de la note et non la vélocité du signal MIDI.

...

Donc on va d'abord retirer le lien entre l'entrée du mapping (le signal)

...

Pour le moment, on spécifie la hauteur de la note en précisant laquelle on veut jouer et son octave, mais si l'on passe l'attribut "Note Mode" sur "Pitch" nous pouvons définir la hauteur de la note avec juste une valeur numérique.

...

Et du coup, on peut faire découler sa valeur de notre signal.

...

Le seul souci reste que notre signal va de 0 à 1 et que notre Pitch attend une valeur entre 0 et 127. On pourrait aller changer la plage de valeur du module signal mais vous remarquerez que l'on peut rapidement et localement le convertir sur la plage 0 - 127 en cochant "Remap to 0-127".


Là aussi je vous propose de tester sans ecouter puisque ça va essentiellement jouer toutes les notes.

Le début du fun

Exercice 2

Puisqu'on ne peut pas tous avoir une kinnect chez soi, je vous propose de visiter la page quinnekt ainsi que de télécharger le projet Chataigne préconfiguré qui va avec. Toute la configuration est faite dans le module “WebSocket Server", je vous laisse y jeter un œil.


À noter qu'il faut démarrer le projet Chatainge avant de cliquer sur le bouton "connect" de la quinnekt. Aussi, la quinnekt ne transmet plus d'information quand la page web n'est plus visible (changement d'onglet, minimisation de la fenêtre, verrouillage de session etc...).


Pour cet exercice je vous propose de changer la hauteur de la note en fonction de la hauteur de votre nez/main/epaule/...


Projet de base : setup_quinnekt.noisette

Liens vers la quinnekt : quinnekt.html

Liens vers la solution : noseX_to_MIDI.noisette

State machine (ou "comment ne pas tout faire en même temps")

Maintenant que vous avez toutes vos actions et vos mapping, il est possible que vous réalisiez que le jour J on veuille que notre système change de comportement dans le temps ou en réponse à certaines informations.

...

Evidemment, pour changer de statut il va nous en falloir un autre.

...

À partir de là, on peut faire un clic droit sur le fond de la state machine pour créer une transition entre nos deux states.

...

Et si on sélectionne notre transition on peut voir dans l'inspecteur qu'il s'agit tout simplement d'une action!

...

Il manque seulement la partie "Input" dans la condition.

...

Maintenant on peut utiliser un module "Keyboard" pour écouter l'appui sur la touche espace.

...

Et si on fait la même transition dans le sens inverse ...

...

... on peut alterner entre nos states en appuyant sur la barre espace.

You can go play with your things now

Et voilà, on a fait le tour du minimum pour pouvoir utiliser Chataigne. Il y a encore quelques trucs à voir ci-dessous (notamment le chapitre sur les séquences) mais c'est aussi le moment où vous pouvez commencer à jouer avec votre matos et logiciels.

Exercice Final

Je veux pouvoir être dans un état initial qui ne fait rien, puis aller sur https://trex-runner.com/, appuyer sur espace et à partir de là utiliser les données de la quinnekt pour faire sauter le dino. En appuyant sur la touche "echap" je retourne à mon etat initial qui n'utilise plus la quinnekt.


Projet solution : jumpy_dinosaur.noisette

OR et AND, des conditions un peu plus pointues

Dans l'exercice ci-dessus on utilise une touche du clavier pour changer l'état de notre système mais ce n'est pas très robuste quand on sait que Chataigne écoute notre clavier peu importe l'application qui est sélectionnée. Ce serait mieux si l'on pouvait utiliser une combinaison de touches.

...

Si on va dans notre transition/action on peut ajouter une deuxième valeur d'entrée.

...

Ce qui fait apparaître le champ "Operator" qui permet de choisir comment combiner nos valeurs d'entrées. Si vous sélectionnez "AND" il faudra que les deux conditions soient validées pour que la conséquence TRUE se fasse. Si vous utilisez l'opérateur "OR" la conséquence TRUE sera déclenchée si au moins l'une des deux conditions est validée.

Variables

Les variables sont des valeurs qui vivent dans Chataigne et lui appartiennent entièrement. Elles sont utiles pour stocker des informations tel que "combien de fois est-ce que l'on a activé quelque chose" par exemple.

...

Pour ajouter une variable il faut d'abord créer un groupe de variable dans laquelle la stocker dans l'onglet "Custom Variables".

...

Il existe plusieurs types de variables qui conditionnent ce qu'elles sont capables de contenir.

  • float : des nombres à virgule
  • int : des nombres entiers
  • Bool : ne peux contenir que 0 ou 1, pour dénoter "vrai"(1) ou "faux"(0) souvent écrit "true"(1) ou "false"(0)
  • String : du texte
  • Color : une couleur
  • Point2D : un vecteur 2D, essentiellement vous pouvez voir ça comme un paquet de 2 floats.
  • Point3D : un vecteur 3D, essentiellement vous pouvez voir ça comme un paquet de 3 floats.
  • Enum : une collection de label qui correspondent chacun à une valeur
  • Target : ça, je vais vous l'avouer je ne l’ai pas utilisé et il faudrait que je me penche sur la doc pour comprendre.
...

En admettant un module métronome sans modifications, voilà une action qui pourrait compter ses battements dans une variable.

Sequencing

Les séquences permettent de faire évoluer des valeurs via une timeline / frise chronologique.

...

Créer sa première timeline se fait en deux temps, d'abord il faut créer notre séquence...

...

... puis créez un/des layers, chaque layer pilotant sa propre valeur. Au même titre que les variables, les layers ont des types différents, conditionnant ce qu'ils gèrent comme valeur.

  • Trigger : des Actions dans le temps
  • Mapping : faire évoluer une nombre à virgule (pas la même chose que les mappings qui sont dans les state)
  • Mapping2D : faire évoluer une vecteur 2D
  • Audio : lance des fichiers audio dans le temps (je vous recommande d'aller voir la doc avant d'y toucher)
  • Color : fait évoluer une couleur
  • Sequence : permet de manipuler d'autres séquences
...

Dans un layer vous pouvez créer des points de contrôle en double cliquant.

...

Mais vous pouvez aussi dessiner l'évolution de votre information via "Ctrl + Shift + clique gauche" et en le dessinant.

...

Mais un truc qui est très intéressant est que l'on peut enregistrer les sorties de nos modules.

...

Donc en admettant ce sigal configuré comme ceci (Type: Perlin)

...

Il nous suffit de sélectionner un layer de type mapping et de lui donner en input la sortie du signal. Aussi, j'aime bien cocher l'auto disarm qui nous forcera à armer l'enregistrement avant chaque prise pour réduire nos chances d'écraser un enregistrement via une maladresse.

...

À partir de là il suffit d'aller dans la séquence, d'armer l'enregistrement d'appuyer sur le bouton de lecture pour lancer l'enregistrement.