S11) En live

Modifier pendant que ça joue

Hot-swap, latence, granularité

La plupart des outils jouent une musique écrite à l’avance. Avec BPscript, la musique se dérive en temps réel selon des règles — et ces règles, on peut les modifier pendant que ça joue.

Où se situe cet article ?

C’est l’article de synthèse : après avoir vu le langage (S2S8), les couches (S9) et l’architecture (S10), on assemble le tout pour le live. Comment ça marche sur scène ?


Sept axes de modification indépendants

Le live coding avec BPscript, c’est modifier un ou plusieurs aspects de la scène pendant que la musique joue. Chaque couche est modifiable indépendamment :

Ce qu’on modifie Ce qui change Ce qui reste
Les acteurs (@actor) Les rattachements alphabet/tuning/transport La structure
La composition (règles, flags) La structure temporelle Les rattachements
L’alphabet (JSON) Les noms de notes Les fréquences
Le tuning (JSON) L’accordage Les noms de notes
Le tempérament (JSON) La grille d’intervalles La gamme
Le routage (JSON) La destination La musique
Les backticks (code) La logique algorithmique La structure

C’est la même pièce, sept façons de la transformer en direct. Changer le tuning de shruti 22 (intonation indienne) à 12-TET, c’est un seul fichier JSON — la grammaire ne bouge pas, seules les fréquences changent (S9).


Ce qui se passe quand on modifie

Quand le compositeur modifie le fichier .bps en live :

  1. Le compilateur recompile le source modifié → nouvelle grammaire BP3 (~10 ms)
  2. Le moteur BP3 dérive la nouvelle grammaire → nouvelle séquence de timed tokens (~50-100 ms pour une grammaire typique)
  3. Le runtime aval (hors dépôt — dispatcher, transports) commence à router les nouveaux événements
  4. Les sessions de code continuent — leurs variables et leurs imports sont conservés

Le temps total : 50-100 ms pour une grammaire typique. Un humain ne perçoit pas un changement structurel de moins de 100 ms — c’est transparent.

Pour les grammaires profondes (polymétries récursives, nombreuses alternatives), la dérivation peut prendre plus longtemps. Dans ce cas, le système utilise un buffer (tampon) : les événements de la séquence précédente continuent à jouer pendant que la nouvelle séquence se calcule.

Périmètre : le dépôt couvre la compilation et la dérivation BP3/WASM (sortie = timed tokens). Le dispatcher, les transports et les sessions de code sont le consommateur aval des timed tokens — leur implémentation vit hors du dépôt. Cet article décrit le système complet.


Granularité : quand le changement prend-il effet ?

Trois stratégies possibles :

Stratégie Comportement Analogie
Quantisé Le changement prend effet au prochain cycle de dérivation Comme TidalCycles qui quantise sur le cycle
Immédiat La dérivation en cours est interrompue et remplacée Plus réactif, risque de décrochage
Différé La nouvelle grammaire attend un point de synchronisation Le plus musical — transition propre

La stratégie choisie : quantisé — comme TidalCycles, le changement ne prend effet qu’au début du prochain cycle. Pas de coupure au milieu d’une phrase, pas de décrochage. Les autres modes sont des options pour les performeurs qui veulent plus de contrôle.


État : ce qui persiste, ce qui se réinitialise

Un point délicat du hot-swap (remplacement à chaud) :

Composant Au hot-swap
Flags BP3 Réinitialisés — la nouvelle grammaire repart de zéro
Sessions de code (SC, Python) Persistent — les SynthDefs, les variables, les imports restent
Poids des règles Réinitialisés — aux valeurs déclarées dans la nouvelle grammaire

C’est une asymétrie à connaître : les flags sont dans BP3, qui recompile. Les sessions de code sont des sessions externes, qui continuent. Si un synthétiseur SuperCollider tourne depuis le début de la performance, il n’est pas interrompu par un changement de grammaire — seuls les nouveaux événements suivront les nouvelles règles.


L’analogie Session View

La Session View d’Ableton a libéré la musique du temps linéaire. Le musicien ne suit plus une ligne de temps — il lance des clips dans une grille, les combine, les empile.

BPscript fait un pas de plus : on ne lance pas des clips, on modifie des grammaires. Le clip est figé — il joue toujours la même chose. La grammaire est vivante — elle peut produire quelque chose de différent à chaque dérivation.

Session View BPscript
Lancer un clip Activer un flag ([phase=2])
Empiler des clips Superposer des voix polymétriques ({A, B, C})
Modifier un clip Modifier une règle de grammaire
Muter une piste Changer le routage JSON
Changer le tempo Modifier @tempo:

La différence fondamentale : dans Ableton, le contenu est fixe (chaque clip est un enregistrement). Dans BPscript, le contenu est généré (chaque dérivation produit potentiellement une variation unique).


Que peut-on modifier en live ?

Exemples concrets de modifications en cours de performance :

 

// Changer la densité d'une voix
rythme -> -!dha - -!ti -!dha          // original
rythme -> -!dha -!ti -!dha -!ti       // plus dense → recompile, effet au prochain cycle

// Changer un flag pour basculer de section
[phase=2]                               // directement dans l'éditeur

// Ajouter une voix polymétrique
S -> { melodie, rythme }               // original
S -> { melodie, rythme, lumieres }     // ajout de lumières → recompile

// Changer le type de dérivation (directive de bloc)
@mode:ord                              // original : ordonné
@mode:random                           // aléatoire → chaque cycle est différent

// Modifier un backtick
`sc: SynthDef(\grain, {...}).add`      // changer le son sans toucher la structure

 

Chaque modification déclenche une recompilation. Le cycle entier (source modifié → nouvelle séquence → dispatch) prend moins de 100 ms.


Au-delà du navigateur

Aujourd’hui, le live coding BPscript fonctionne dans le navigateur : on modifie une scène .bps, elle se recompile et se redérive à chaud, et le son sort via Web Audio ou MIDI. C’est ce qui est démontrable.

Étendre ce live au-delà du navigateur — vers plusieurs runtimes (SuperCollider, Tidal…) pilotés depuis une même scène — est une direction de conception, pas encore réalisée.


Ce qu’il faut retenir

  1. 7 axes de modification indépendants : acteurs, composition, alphabet, tuning, tempérament, routage, backticks
  2. ~100 ms de latence pour un hot-swap typique — imperceptible
  3. Quantisé par défaut : le changement prend effet au prochain cycle (comme Tidal)
  4. Flags réinitialisés, sessions de code persistantes — asymétrie à connaître
  5. La grammaire est vivante : contrairement à un clip, chaque dérivation produit une variation unique
  6. Direction de conception : étendre le live au-delà du navigateur, vers plusieurs runtimes — pas encore réalisé

Glossaire

  • Hot-swap : Remplacement à chaud — modifier le code pendant que le système tourne, sans l’arrêter
  • Quantisation : alignement des changements sur une grille temporelle — le changement prend effet au prochain battement ou cycle
  • Buffer : Tampon — les événements en cours continuent à jouer pendant que la nouvelle séquence se calcule
  • Session View : Vue en grille d’Ableton Live où les clips sont lancés librement, sans ligne de temps
  • Live coding : Pratique artistique de programmation en direct sur scène

Liens dans la série

  • S1 — La vision — la filiation BP3 et le live coding
  • S6 — Les flags — l’outil principal du performeur pour piloter la structure en live
  • S9 — Les cinq couches — les axes de modification indépendants
  • S10 — Le pipeline — ce qui se passe lors d’un hot-swap

Prérequis : S1 à S10
Temps de lecture : 10 min
Tags : #BPscript #live-coding #hot-swap #performance


Prochain article : S12 — L’EBNF de BPscript : grammaire formelle du langage


Retour à l’index