Introduction à la création sonore avec Csound

Richard Boulanger

Téléchargez  ICI les instruments et les fichiers audio qui accompagnent ce chapitre.

Csound est un programme de synthèse sonore versatile et très puissant. Avec plus de 450 modules de traitements sonores à sa disposition, l'utilisateur de Csound possède les outils pour modéliser n'importe lequel des synthétiseurs ou des multieffets disponibles sur le marché. Csound transforme un ordinateur personnel en une station de traitement audionumérique haut de gamme s'y rejoignent les univers de la création sonore, de la recherche acoustique, de la production audionumérique, et de la composition assistée par ordinateur. Cependant, il en est de Csound comme de tout autre instrument : une pratique assidue et du talent sont requis pour acquérir une réelle virtuosité. Vous découvrirez bientôt que Csound est l'instrument de musique le plus sophistiqué qui soit. Mais vous devez pratiquer! La récompense de votre engagement sera la production de timbres et de textures d'une beauté peu commune. Avec Csound, la connaissance et l'expérience sont la clé...et votre imagination, la seule limite.

Ce chapitre est conçu comme un parcours d'initiation à Csound. Le long du chemin, nous étudierons de nombreuses techniques de traitements et de synthèses sonores, et nous verrons comment elles sont implémentées dans Csound. Je vous encourage à rendre, écouter, étudier et modifier chacun des simples instruments présents dans ce tutoriel. Ce faisant, vous acquérirez une claire compréhension  du langage Csound, et des bases solides pour construire votre propre librairie d'instruments. De plus, travailler les bases exposées ici vous permettra d'apprécier et d'appliquer les modèles de traitements et de synthèses sonores plus avancés, présentés par mes collègues et amis dans les chapitres suivants de ce livre.

Le CD-ROM qui accompagne ce texte contient des milliers d'instruments et des centaines de compositions Csound. Chacun ouvre une porte sur l'un des nombreux mondes de Csound. En fait, une vie entière serait nécessaire pour explorer pleinement chacun d'eux. Une approche possible serait de compiler tous les orchestres présents dans le CD-ROM, de sélectionner ceux qui vous semblent les plus intéressants, et de les sampler afin de les utiliser dans vos compositions. Cette librairie serait juste une collection de sons uniques, et votre chemin serait à son terme.

Cependant, je conseille de lire, de rendre, d'écouter les exemples donnés, et ensuite d'étudier les techniques de traitements et de synthèses sonores qui vous séduisent le plus, en modifiant les orchestres Csound qui en font usage. Vous appliquerez ensuite ces nouvelles connaissances dans vos compositions  vos propres "paysages et collages sonores". Au cours de cet apprentissage actif, vous commencerez à construire votre propre librairie Csound, et en fin de compte votre propre voie.

Afin de suivre le chemin que je propose, vous aurez besoin de comprendre la structure et la syntaxe du langage Csound. Avec cette connaissance, je vous crois capable de transcrire vos expériences sonores intimes dans de beaux et originaux instruments Csound, et dans de vivantes sculptures sonores réellement uniques.

A cette fin, nous allons commencer par apprendre la structure et la syntaxe du langage avec lesquelles sont élaborés, dans un format texte, les fichiers "orchestre" et "partition" . Nous poursuivrons ensuite par l'exploration d'une variété d'algorithmes de synthèses et de techniques de programmation propres à Csound. Pour finir, nous aborderons quelques exemples de traitements sonores. En chemin, nous étudierons quelques concepts de base de numérisation, et apprendrons quelques astuces de programmation. Pour faciliter la compréhension des algorithmes et du chemin du signal, nous représenterons les instruments Csound sous forme de diagrammes. De plus, je vous donnerais des exercices qui vous aideront à comprendre pleinement les diverses façons de "travailler" avec le programme.

Ne sautez pas les exercices. Et ne vous contentez pas de les lire. Faites-les ! Ils vous permettront d'acquérir l'aisance de ce langage. En fait, vous pourriez être surpris de constater que ces exercises vous "enseignent" plus sur la manière de "travailler" avec Csound que les descriptions littéraires qui les précèdent. Arrivés au terme de ce premier chapitre, vous devriez posséder les connaissances requises pour élaborer votre propre librairie de sons Csound, et le chemin vous sera ouvert pour aborder les chapitres suivants.

Ainsi, suivez les instructions du CD-ROM; installez le programme Csound sur votre ordinateur, rendez et écoutez quelques orchestres tests pour être sûr que tout fonctionne correctement; et alors, lancez-vous!

La nature de Csound, et ses principes de base

Csound est un compilateur musical logiciel ou "renderer". Dans un premier temps, Csound traduit les instruments conçus textuellement par l'utilisateur dans le fichier "orchestre". Puis il joue ces instruments en interprétant une liste de notes-événements, que le programme peut "lire" soit à partir d'un fichier "partition" rédigé au format texte, soit à partir d'un fichier MIDI généré par un séquenceur. Il est aussi possible de fournir les différents paramètres des notes-événements en temps-réel, par le biais de contrôleurs MIDI ou à partir d'un fichier audio, ou avec un dispositif non-MIDI tel qu'un clavier ASCII ou une souris.

Selon la puissance de l'ordinateur (et la complexité des instruments de votre fichier "orchestre") la performance de la "partition" peut être écoutée en temps-réel, ou écrite directement sur le disque dur dans un fichier audio. Cette suite d'opérations est dénommée "sound rendering", par analogie avec le concept de l'"image rendering" propre au domaine du graphisme.

Une fois rendu, vous écouterez le fichier audio en l'ouvrant avec votre éditeur audio préféré, et le jouerez en utilisant le convertisseur numérique/analogique (CNA) de votre carte-mère ou de votre carte son.

Ainsi, avec Csound, nous travaillons essentiellement avec deux fichiers texte interdépendants et complémentaires, le fichier "orchestre" et le fichier "partition". Ces fichiers sont nommés librement par l'utilisateur. Dans la pratique, nous donnons aux deux fichiers un nom identique, différenciés alors par leur extension  .orc pour le fichier "orchestre" et .sco pour le fichier "partition" (sco pour l'abréviation de "score"). Dans ce chapitre j'ai nommé les fichiers d'étude : etude1.orc et etude1.sco, etude2.orc et etude2.sco, etude3.orc et etude3.sco, etc. Chacune de ces études d'orchestre contient six instruments (instr 101 106, instr 107  112, instr 113 118 , etc.). A partir de ces études, j'ai individualisé chacun des instruments pour qu'il vous soit plus facile d'expérimenter. Ces fichiers d'étude portent le nom du numéro de l'instrument (101.orc et 101.sco, 102.orc et 102.sco, 103.orc et 103.sco, etc.). Faire correspondre le nom des fichiers "partition" et des fichiers "orchestre" vous aidera à garder une librairie organisée, et je vous recommande vivement de procéder ainsi. Tous les fichiers "partition" et "orchestre" du Csound book et du CD-ROM qui l'accompagne suivent cette convention.

Le Fichier "Orchestre"

Le fichier "orchestre" comprend deux sections : une section entête et une section instruments.

La Section Entête

Dans la section entête vous définissez le taux d'échantillonnage (sr) et le taux de contrôle (kr) auxquels les instruments seront rendus, ainsi que le nombre de canaux de sortie (nchnls). L'entête du fichier "orchestre" que nous utiliserons tout au long de ce texte se présente ainsi :


sr = 44100
kr = 4410
ksmps = 10
nchnls = 1

Figure 1.1 l'entête par défaut de Csound

Le code de cette entête définit un taux d'échantillonnage à 44100 Hz (44.1 Khz), un taux de contrôle à 4410 Hz, avec un rapport des deux égal à 10 (ksmps = sr/kr). Le nombre de canaux de sortie étant fixé à 1, le fichier audio rendu par cet orchestre sera en mono (si nous voulions rendre un fichier audio stéréo, nous fixerions simplement la valeur de nchnls à 2).

La Section Instruments 

Dans l'environnement Csound, les instruments sont connectés les uns aux autres comme autant de "modules" ou opcodes qui soit génèrent des signaux, soit les modifient. Ces signaux sont représentés par des symboles, des vignettes (labels), ou par des noms de variable qui peuvent être "patchés" d'un opcode à l'autre. Chacun des instruments est numéroté et délimité par ces déclarations :  instr et endin. Le nombre d'instruments à l'intérieur d'un orchestre n'est pas limité. En fait, dans Csound "tout" est instrument — vos 8000 voies de sampling, vos 4000 voies de synthèse FM, vos 2000 voies de synthèse par guides d'ondes, vos 1000 bandes EQ, vos 500 canaux de mixage automatisés, vos 250 lignes de délai, n'importe quoi... Pour Csound, ces éléments de synthèse, de traitement de signaux, sont simplement instr 1, instr 2, instr 3, instr 4, etc.

La Syntaxe De l'Orchestre

Dans le fichier "orchestre" de Csound, la syntaxe utilisée pour définir un opcode est la suivante :

Sortie Opcode Arguments, ... , ... ; Commentaires (optionnels)


Si nous prenons l'exemple de l'opcode oscil, nous avons la syntaxe suivante :

Sortie   Amplitude Fréquence F-table # ; Commentaire
a1 oscil 10000, 440, 1 ; oscillateur

Création Sonore Etude 1: Un Orchestre composé de Six Instruments

etude1.orc etude1.sco

Dans notre premier fichier orchestre l'instr 101 utilise l'opcode oscil, un oscillateur à lecture de table, pour calculer une sinusoïde à 440 Hz, d'amplitude 10000. La figure 1.2 shématise l'instr 101 , et la figure 1.3 présente le code de cet intrument. 

Figure 1.2 Diagramme de l'instr 101, un simple oscillateur à lecture de table, de fréquence et d'amplitude fixes.

  instr 101 ;OSCILLATEUR SIMPLE 
a1 oscil  10000, 440, 1
  out  a1
  endin

Figure 1.3 Code pour l'instr 101, un simple oscillateur à lecture de table, de fréquence et d'amplitude fixes, l'opcode oscil.

Le diagramme de l'instr 101 montre clairement comment la sortie de l'oscillateur (a1) est "patchée" dans l'entrée de l'opcode out qui écrit le signal sur le disque dur.

Csound rend les instruments ligne par ligne, et de haut en bas. Les entrées sont situées à droite de l'opcode, et les sorties à gauche. Les mots qui suivent un point-virgule, considérés comme commentaires, ne sont pas pris en compte dans le calcul. 

Pour l'instr 101 (figure 1.3), les arguments d'entrée de l'oscillateur sont fixés à 10000 (amplitude), 440 (fréquence) et 1 (numéro de la table de fonction contenant la forme d'onde que l'oscillateur "lit"). L'opcode de l'oscillateur rend le son 44100 fois par seconde avec ces paramètres, et écrit le résultat dans la variable a1.  La valeur des échantillons inscrite dans la variable locale a1 peut alors être lue comme une entrée par les opcodes suivants, tel que l'opcode out. Ainsi, les noms de variables fonctionnent comme les "patchs d'accords" d'un synthétiseur analogique traditionnel. Avec ces "patchs d'accords virtuels", chacun peut diriger les signaux audio et de contrôle vers n'importe quel autre opcode les utilisant comme paramètres d'entrée. Cela permet de contrôler dynamiquement un paramètre (l'équivalent de tourner un bouton) durant le cours d'une note, ou de fournir des données audio à un opcode de traitement sonore.

Dans la figure 1.4, vous pouvez constater que les instr 102 — 106 utilisent le même motif que l'instr 101 (un générateur de signal écrivant sur le disque dur). Nous avons remplacé l'opcode oscil par des opcodes de synthèse plus puissants, comme foscil — un simple synthétiseur FM à 2 oscillateurs, buzz — qui produit un ensemble de "cosines" possédant un lien harmonique, pluck — un simple synthétiseur par guides d'ondes basé sur l'algorithme Karplus-Strong, grain — un synthétiseur granulaire asynchrone, et loscil — un synthétiseur à table d'ondes qui lit les samples en boucle.

 


  instr 102 ;SIMPLE FM
a1 foscil  10000, 440, 1, 2, 3, 1
  out  a1
  endin
  instr 103 ;SIMPLE BUZZ
a1 buzz  10000, 440, 10, 1
  out  a1
  endin
  instr 104 ;SIMPLE MODELAGE PHYSIQUE
a1 pluck  10000, 440, 440, 2, 1
  out  a1
  endin
  instr 105 ;SIMPLE GRANULATION
a1 grain  10000, 440, 55, 10000, 10, .05, 1, 3, 1
  out  a1
  endin
  instr 106 ;SIMPLE LECTURE D'UN SAMPLE 
a1 loscil  10000, 440, 4
  out  a1
  endin

Figure 1.4 Diagrammes et codes de l'orchestre pour les instr 102 — 106, une série d'instruments à fréquences et amplitudes fixes qui utilisent différentes techniques de synthèse pour produire une seule note de même amplitude (10000) et de même fréquence (440). 

La structure identique de ces générateurs de signaux apparaît clairement. Mais lorsque nous écoutons le rendu de chacun, nous percevons leurs sons comme tout à fait uniques. Bien qu'ils partagent une même fréquence de 440 Hz et une amplitude de 10000, l'algorithme de synthèse utilisé par chacun des opcodes est fondamentalement différent — exigeant la spécification d'un ensemble de paramètres qui leurs sont propres. En fait, ces six opcodes générateurs de signaux (oscil, foscil, buzz, pluck, grain et loscil) sont au coeur des techniques de synthèse proposées par les plus populaires des synthétiseurs présents sur le marché. On peut dire que dans Csound, un seul opcode est un synthétiseur complet! D'accord...peut-être moins excitant et versatile, mais...combiné avec d'autres opcodes, Csound peut, et en effet vous emmènera plus loin que toute implémentation commerciale. 

Le Fichier "Partition"

Regardons à présent le fichier "partition" qui "joue" cet orchestre d'instruments. Comme le fichier "orchestre", le fichier "partition" a deux sections : les tables et les notes. Dans la première section, nous utilisons des sous-programmes (les GENS) pour directement "générés" des tables-fonctions ("f-tables") et/ou pour remplir ces tables de fichiers audio "lus" depuis le disque dur. Dans la seconde partie, nous écrivons les notes-événements ou déclarations de notes (appelés aussi i-statements). Ces notes-événements "jouent" les instruments et leur transmettent les paramètres de jeu tels que les fréquences, les niveaux d'amplitude, les taux de vibrato, et la durée des attaques (chacun de ces paramètres de jeu constitue un "p-fields").

Les sous-programmes GEN

Dans Csound, les sous-programmes qui génèrent des fonctions sont appelés GENS. Chacun d'eux (plus de 20) est optimisé pour calculer une catégorie spécifique de fonctions ou tables d'onde. Par exemple, les sous-programmes GEN5 et GEN7 sont utilisés pour tracer des fonctions composées de segments de courbes exponentielles et de lignes droites; les sous-programmes GEN9 et GEN10 génèrent des formes d'onde complexes constituées d'une somme de simples sinusoïdes pondérées; le sous-programme GEN20 génère des fenêtres standards tels que les fenêtres "Hanning" et "Kaiser" qui sont traditionnellement employées pour l'analyse spectrale et l'enveloppe des grains; le sous-programme GEN21 produit des tables avec différentes distributions aléatoires telles que Gaussian, Cauchy et Poisson; et le sous-programme GEN1 transfère les données d'un fichier audio préenregistré dans une table, données qui seront traitées ensuite par l'un des opcodes de Csound, tel que l'oscillateur loscil, dont la fonction est de lire ce type de fichiers en boucle.

La définition des tables-fonctions, ainsi que leur utilisation par les instruments de l'orchestre, est laissée à votre entière liberté — le designer de sons. Quelquefois, c'est une question de bon sens. D'autres fois une question de préférences ou d'habitudes. Par exemple, l'instr 106 utilise un oscillateur qui lit des samples en boucle, loscil. J'ai choisi GEN1 pour charger un sample dans l'orchestre. Pour l'instr 102, utilisant l'opcode foscil, j'aurais pu choisir de moduler les fréquences de deux formes d'onde quelconques, mais j'ai opté pour une approche traditionnelle et modulé deux sinusoïdes définies par GEN10.

La Syntaxe Du Fichier "Partition"

Dans le fichier "partition", la syntaxe pour définir une fonction est la suivante :                                

f numéro temps d'initialisation taille de la table GEN Sous-programme paramètre1 paramètre2... ; commentaire

Si nous voulons générer une sinusoïde de 16 points, nous devons écrire la déclaration de table (ou f-statement) suivante : 

f 101 0 16 10 1 ; une sinusoïde

Alors, la table 101 génèrera la fonction de la figure 1.5.

Figure 1.5 Une table de 16 points traçant une sinusoïde, définie par GEN10 avec les arguments: f 101 0 16 10 1

Comme vous pouvez le voir, une sinusoïde dessinée avec une résolution de 16 points n'est pas particulièrement lisse. La plupart des tables doivent avoir une longueur dont le nombre de points est un " pouvoir-de-2".  Pour des ondes synthétisées, nous définissons typiquement des tables allant de 512 (5K) à 8192 (8K) points. Dans notre première partition, etude1.sco, nous définissons les fonctions suivantes en utilisant GEN10, GEN20 et GEN1:

f1 0 4096 10 1
f2 0 4096 10 1 .5 .333 .25 .2 .166 .142 .125 .111 .1 .09 .083 .076 .071 .066 .062
f3