Le Live Coding : la performance artistique par le code

Introduction au Live Coding

L'industrie numérique a, au travers des décennies, apporté de nombreuses solutions dans le monde corporatif : grâce à l'amélioration continue des technologies de communication, nous sommes à présent capables de stocker des données personnelles concernant les utilisateurs de services en ligne, et de produire une gamme intensive de services numériques professionnels.

Lors d'une performance artistique telle qu'un concert, les techniciens son et lumière travaillent dans l'ombre, avec des machines, dans le but de permettre à la performance scénique de vivre : gestion du matériel sonore, gestion des sources lumineuses, affichage des clips vidéo.

L'intérêt croissant pour la programmation au sein de la population, a permis de faire voir le jour à une perspective artistique du métier de programmeur : le Live Coding.

Cela désigne le fait d'exécuter une performance artistique en direct, par l'écriture de code. Le Live Coding se partage en deux savoirs-faire clef : le son et l'image. Là où l'ingénieur son n'opérait que dans le but d'exprimer l'univers artistique d'un chanteur ou d'un groupe de musique, le Live Coder, lui, a la compétence technique et artistique pour animer son propre univers. Différents environnements de programmation permettent de fabriquer en direct des clips vidéo : Kodelife, fluxus, Hyperyarn,... Mais nous allons parler ici du Live Coding appliqué à la musique. Les environnements consacrés sont entre autres  : SuperCollider, TidalCycles, Sonic Pi, ixi lang, ChucK, FoxDot.

Lors d'une performance de Live Coding, le ou les créateurs projettent sur grand écran leurs lignes de code, ainsi que le résultat escompté.

Live Coding
Le code est projeté à l'écran.

Le Live Coding plébiscite une communauté internationale de concepteurs et d’artistes en tous genres, au Brésil, au Canada, au Royaume-Uni, aux USA, en Allemagne, en Espagne. Des performances sont organisées également sur les plateformes Internet consacrées, comme Twitch ou Youtube Live. La scène musicale issue de cette pratique est désignée par le nom d’Algorave. La communauté des Live Coders se regroupe sous la bannière du site Internet Toplap.

Un des langages les plus évolués pour le Live Coding musical est SuperCollider. SuperCollider est un moteur musical extrêmement complet disposant de son propre langage de programmation. Son défaut est qu’il intègre des fonctions de synthèse complexes, qu’il faut prendre le temps de bien maîtriser avant de pouvoir espérer composer un morceau. En réponse à cela, les autres environnements qui ont été crées sont des modules additionnels permettant de piloter SuperCollider avec des paramètres personnalisables.

Penchons-nous à présent sur l'un de ces environnements : FoxDot.

FoxDot a été créé en 2015 par Ryan Kirkbride. Ce doctorant en musique à l’Université de Leeds avait commencé à le conceptualiser après des tentatives jugées insatisfaisantes sur TidalCycles et sur SuperCollider. En effet, FoxDot se démarque de ses congénères par le fait qu’il base son fonctionnement sur l’utilisation de python. Python est un langage très répandu, et a la réputation d’être simple à enseigner. FoxDot offre un appel de synthétiseurs et de percussions élégant et simple à écrire.

Principe de fonctionnement de FoxDot avec SuperCollider

Pour se lancer sur FoxDot, il faut disposer des deux environnements : SuperCollider et python. SuperCollider dispose de son propre environnement de travail et exécute des commandes spécifiques. Ce qu'il apporte à FoxDot est son serveur de son, qu'il faut connecter pour rendre possible la transmission des sons, ainsi que le compilateur permettant de garder en mémoire les différents "instruments de musique" que FoxDot propose.

FoxDot est disponible comme package python, pour l’installer il suffit donc d’utiliser le pip. A son exécution, FoxDot propose son propre IDE. Chaque commande peut être écrite et exécutée avec le raccourci Ctrl+Enter, et un terminal intégré écrit les retours de chacune des instructions. FoxDot et SuperCollider doivent fonctionner en même temps car chaque commande écrite sous FoxDot va être interprétée et transmise à SuperCollider !

Le mieux reste de suivre la procédure d'installation (en anglais).

Comment faire de la musique avec FoxDot ?

Ce paragraphe va survoler quelques notions techniques ainsi qu'un exemple de démonstration, afin de vous donner envie d'en savoir plus. Néanmoins, pour trouver les informations détaillées, veuillez vous référer à mon guide en français, ainsi qu'aux différentes ressources de documentation officielles (en anglais) : documentation, tutorials intégrés de FoxDot, chaîne youtube de Ryan Kirkbride, chaîne annexe des tutorials.

Initialisation de FoxDot

Une fois SuperCollider, python et FoxDot installés, l'action à effectuer pour acc&der à l'espace de travail sera toujours la même :

1/ Ouvrir SuperCollider et lancer un FoxDot.start

2/ Ouvrir un terminal de commande et lancer un python -m FoxDot

3/ Configurer les différents éléments de départ comme le tempo, la signature de temps, le tempérament, la tonalité.

Par défaut, la signature de temps est 4/4, le tempo est 120, et la tonalité est Do Majeur.

Fenêtre de travail

Fenêtre de FoxDot
L'interface de FoxDot : éditeur de code et terminal

Comme vu sur l'image jointe, FoxDot se décompose en deux parties : l'éditeur de code, et le terminal de résultat. Celui-ci est très utile pour afficher les fichiers d'aide et les listes. Voici quelques commandes utiles. Pour les exécuter, il suffit de presser Ctrl et Enter.

print(Clock.bpm) # montre le tempo

print(Scales.names()) # montre la liste des tonalités disponibles

print(SynthDefs) # montre la liste des instruments (players) disponibles

print(Samples) # montre la liste des effets sonores disponibles

print(Player.get_attributes()) # montre la liste des attributs disponibles (volume, panoramique, durée des notes,...)

print(FxList) # montre la liste des effets spéciaux à appliquer (distorsion, filtre passe-haut, etc...)

help(Clock) # montre le contenu commenté de la classe Clock

# de manière générale, help(Object) ou help(Object.method) apportent des informations.
# l'utilisation de print pour afficher l'état d'une variable ou d'un player est très utile

Le terminal de résultat dispose d'une option pour enregistrer toutes les opérations de la session en cours, pour cela il suffit de cliquer Edit, puis Export Terminal Log.

Faire jouer des motifs percussifs

Pour faire jouer n'importe quel motif percussif ou instrument, il suffit de créer un nom de variable, suivi de deux chevrons droits. Les noms de variable réservés pour ce faire sont toutes les combinaisons de chiffres et de lettres minuscules. Attention, les noms commençant par un chiffre (ex : 8d, 9f) ou ne contenant qu'un caractère (ex : a, b, 6), ne sont pas valides. On peut ensuite taper une combinaison de caractères ainsi que plusieurs propriétés, et exécuter la ligne de commande.

p1 >> play("<x o ><->", sample = 5, pan = [1,-1], amp = 0.8, room = 0.5)

Le code ci-dessus appelle un motif grosse claire-caisseclaire-charlets basique, utilisé dans la musique rock et pop. Le sample 5 désigne l'utilisation d'un dossier de samples différents, le pan est le panoramique (gauche ou droite), l'amp et le volume et le room est l'effet de réverbération.

Faire jouer des instruments

Pour faire jouer des instruments, nous disposons d'un arsenal de paramètres que nous pouvons prendre en compte. Il est ainsi possible de définir un instrument (ou SynthDef), de lui associer une suite de notes, chacune disposant d'une hauteur et d'une durée. Plusieurs outils sont là pour automatiser la création des listes, et opérer des changements sur nos notes. On dispose aussi de plusieurs effets.

g1 >> blip(P[0,P[:8:2],9], dur = 1/2, sus = 1/4, formant = 0.03) + (0, 2, 5)

Ici, nous appelons un blip jouant une suite de notes, de durée 1/2 (donc des croches), en appliquant un filtre "formant". Le tuple apposé à la fin de la déclaration signifie que l'ont veut l'accord mineur pour chacune de ces notes, sachant qu'on leur appose la deuxième et la cinquième note de notre tonalité.

Mon expérimentation

Au cours de mon apprentissage de FoxDot et de l'écriture de ces documents, j'ai eu le plaisir d'en explorer les différentes facettes. N'étant pas moi-même un musicien aguerri, j'ai tout de même réussi à tirer quelques notes harmonieuses de ce superbe langage de programmation. Ci-dessous le résultat. Il peut être copié tel quel et exécuté ligne par ligne depuis chez vous !

Clock.bpm = 120

Scale.default.set("minor")

Root.default.set(5)

u1 >> play("hihi",sample=var([4,7],3),dur=P[1/2,1,1/2],room=0.3)

po >> klank(P[1,5,3],dur=2,formant=var([0.02,0.05],8))

lu >> karp(dur=PDur(5,8), pan=PSine()).follow(po)

lu.every(4,"stutter",4,lpf=1000,oct=7, scale=Scale.major, root=6)

pi >> sawbass(var([0,-2,-4,1],8),dur=1,formant=0.05)

lk >> dirt(dur=PDur(5,8),oct=5, drive=0.05,lpf=1000).follow(lu)

lu.never("stutter")

Clock.bpm = linvar([120,140],8)

Scale.default.set("locrian")

lu.amplify=0

oi >> orient(P[0,5,6,8,7],dur=4,amp=[0,1],oct=4) + P(0,3,5)

ol >> play("#",dur=8, sample=4,room=0.5)

oi.stop()

li >> karp(dur=PDur(2,3)).follow(lk)

Scale.default.set("mixolydian")

ol.stop()

li.solo()

li.dur=PDur(1,2)

Clock.bpm=90

Clock.clear()

Voilà, en quelques lignes de code on peut tirer un morceau de musique assez sympathique.

Enfin, voyons aussi comment FoxDot est exploité par son créateur, Ryan Kirkbride. La vidéo ci-dessous offre une vision plus complète d'une vraie démonstration Live : lien video

Conclusion

FoxDot est un outil de composition musicale puissant et exigeant. Bien qu'on puisse s'en servir pour composer des morceaux basiques, il est nécessaire d'accumuler beaucoup de pratique afin d'exploiter au mieux son potentiel.

Voici une liste des quelques fonctionnalités de FoxDot et de SuperCollider :

  • Importation de Samples
  • Création et importation de SynthDefs
  • Création et utilisation de fonctions personnalisées
  • Planification de l'exécution de script en fonction du temps de playback
  • Utilisation de variables qui changent de valeur en fonction du temps
  • Algorithmes de création automatisée de motifs
  • Effet spéciaux et manipulation des mélodies
  • Envoi de signaux midi sur un instrument physique
  • Enregistrement des sessions en wav
  • Socket pour utilisation d'un serveur distant (sessions collaboratives)

Les fonctionnalités offertes par FoxDot vont au-delà de la composition musicale, puisque grâce aux différents outils d'algorithmie dont nous disposons, il est rendu possible de créer des chansons aux rendus aléatoires en quelques lignes à peine, qui peuvent s'auto-piloter sur une durée indéterminée.

Je remercie M. Ryan Kirkbride ainsi que ses collaborateurs pour l'énorme effort déployé ces dernières années en conception, documentation et démonstration de ce projet, et j'espère qu'il fédèrera plus d'utilisateurs à travers le monde.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *