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 0 4097 20 2 1
f4 0 0 1 "sing.aif" 0 4 0

Figure 1.6 Tables des différentes fonctions définies dans le fichier "partition" de l'etude1.sco.

Les quatre fonctions sont chargées au temps 0f 1 et f 2 utilisent toutes deux GEN10 pour remplir des tables de 4 K (4096 valeurs).  f 1 trace un cycle d'une sinusoïde,  f 2 les 16 premiers harmoniques d'une onde en dents de scie. GEN20 remplit une table de 4 K (f 3) avec une fenêtre Hanning qui sera utilisée par l'opcode grain. Pour finir,  f 4 utilise GEN1 pour remplir une table avec le fichier audio d'un vocaliste masculin chantant le mot "la" à une hauteur de A440 pendant 3 secondes (fichier échantillonné à 44.1 Khz, mono, 16-bit, format AIFF). Ce sample est utilisé par l'opcode loscil. (Notez que la longueur de table de f 4 est égale à 0. Cela conduit le sous-programme GEN1 à prendre sa longueur dans l'"entête" même du fichier audio "sing.aif". Ici, cette longueur est de 132300 échantillons — soit 44100 échantillons-par-seconde * 3 secondes.)

La Liste De Notes

Dans la seconde partie du fichier "partition", nous écrivons les notes-événements. Comme dans le fichier "orchestre", chacune de ces déclarations de note occupe une seule ligne. Elles activent un instrument à un temps et pour une durée donnés. De plus, chaque déclaration de note peut être utilisée pour transmettre un nombre virtuellement illimité de paramètres à l'instrument, paramètres qui peuvent être modifiés d'une note à l'autre.

Comme l'"orchestre" rend le son ligne par ligne, de même la "partition" est lue ligne par ligne (note par note). Cependant, plusieurs notes peuvent avoir le même temps de départ, et ainsi être jouées simultanément. En utilisant Csound, chacun doit avoir à l'esprit que deux notes ou plus, jouées simultanément ou se chevauchant, voient leurs amplitudes s'ajouter. Cela peut occasionner un phénomène d'écrêtage lorsque les échantillons dépassent une certaine limite (nous discuterons cela en détail un peu plus loin).

Vous avez peut-être remarqué que dans l'"orchestre", des virgules séparaient les arguments d'un opcode. Ici dans la "partition", les arguments des f-tables et des déclarations de notes (les p-fields) sont séparés par des espaces ou des tabulations. Les virgules ne sont pas utilisées. 

Afin de conserver une organisation claire, les designers de sons utilisent souvent la tabulation pour séparer leurs p-fields. Ainsi ces p-fields restent alignés en colonnes régulières, ce qui facilite la lecture et la correction de possibles erreurs.  Ceci n'est pas nécessaire au bon fonctionnement de Csound — il s'agit juste d'une recommandation!

Les Trois Premiers P-Fields

Pour chacune des déclarations de notes ou i-statements, la nature des trois premiers p-fields est réservée. Ils définissent le numéro de l'instrument, le temps d'initialisation et la durée de la note.

; p1 p2 p3
i # instrument temps d'initialisation
durée

Vous — le designer de sons, déterminez la fonction des autres p-fields. Traditionnellement, p4 est réservé à la définition de l'amplitude, et p5 à celle de la fréquence. Cette convention a été adoptée dans ce chapitre. Dans notre première partition de l'etude1.sco, une seule note de 3 secondes est jouée successivement par les  instr 101 106. Le temps d'initialisation de chaque note étant espacé de 4 secondes, chaque événement audio sera séparé par 1 seconde de silence.   

; P1 P2 P3
; instrument # temps d'initialisation durée
i 101 0 3
i 102 4 3
i 103 8 3
i 104 12 3
i 105 16 3
i 106 20 3

Figure 1.7 Partition simple utilisée pour jouer les instr 101 106,  représentés dans les figures 1.2 et 1.4.

Exercises pour l'Etude 1

• Rendez les fichiers "orchestre" et "partition" : etude1.orc & etude1.sco.

• Jouez et écoutez les particularités sonores de chaque instrument.  

• Modifiez la "partition" et changez la durée de chaque note.

• Faites débuter toutes les notes ensembles.

• Placez plusieurs notes en commentaires, de sorte qu'elles ne "jouent" plus du tout.

• Coupez, copiez et collez de nombreuses notes, changez leur temps d'initialisation (p2) et leur durée (p3), et faites commencer et finir les mêmes instruments à différents moments.

• Créez un canon à l'unisson avec l'instr 106.

Dans le Csound Reference Manual, cherchez et lisez la documentation des opcodes utilisés dans les instruments 101 — 106.

• Dans l'"orchestre", modifiez les paramètres de fréquence et d'amplitude de chaque instrument.

• Changez le ratio c:m dans l'instrument foscil.

• Changez le nombre d'harmoniques de l'instrument buzz.

• Changez la fonction de l'instrument pluck.

• Changez la densité et la durée de l'instrument grain.

• Faites trois copies de f 4, et nommez-les f 5, f 6 et f 7. Chargez vos propres samples ("mesSons1.aif," "mesSons2.aif," "mesSons3.aif"). Créez plusieurs copies de l'instr 106 et attribuez-leurs les numéros suivants :  instr 66, instr 67 et instr 68. Construisez les instruments afin que chacun d'eux "lise" un fichier audio différent à une hauteur différente. Jouez les différents samples simultanément.

• A partir de l'etude1.orc dupliquez, et numérotez chaque instrument dupliqué. Choisissez pour chacun des paramètres de ces instruments des valeurs distinctes. Jouez l'ensemble des douzes instruments simultanément. Ajustez les amplitudes de telle sorte que ne soient pas produits des échantillons hors de la plage de conversion.

Sons, Signaux et Echantillonnage

Afin d'acquérir une meilleure compréhension de Csound, assurons-nous de bien comprendre les propriétés acoustiques du son, et leurs représentations dans un ordinateur.

L'expérience du son est une réponse sympathique de notre tympan à la compression et à la raréfaction des molécules d'air, projetées en toutes directions, à partir d'une source vibratoire. Ces variations de pression occasionnent un phénomène appelé ondes. La figure 1.8 montre le cycle d'une onde carrée, à la fois dans le domaine temporel (a) et fréquentiel (b). Nous y retrouvons shématisé le parcours de l'onde dans le temps (1.8a). Les molécules d'air compressées correspondent au passage de l'onde au-dessus de l'axe horizontal (positif) et leur raréfaction au passage de l'onde au-dessous de cet axe (négatif).


Figure 1.8 Représentation d'une onde carrée dans le domaine temporel (a) et fréquentiel (b).

Dans le domaine temporel (a), l'axe vertical indique l'amplitude de l'onde d'un signal, qui se déploit dans le temps le long de l'axe horizontal. Dans le domaine fréquentiel (b), l'axe horizontal représente les fréquences d'un signal donné, et l'axe vertical l'amplitude de chacun des composants du spectre.

Nous ressentons les sons dans le domaine temporel comme des variations de pression, mais nous percevons ces mêmes sons dans le domaine fréquentiel comme des variations de hauteur. L'oreille agit comme un transducteur qui transmet le mouvement mécanique du tympan (au travers des osselets : le marteau, l'enclume, et l'étrier) à la membrane de la fenêtre ovale, dont l'onde se diffuse dans le liquide de la cochlée, excitant les cellules ciliées de la membrane basilaire. Ces cellules ciliées discernent très finement les fréquences, et les transmettent au cerveau au travers de nerfs qui leurs sont attachés. Munis de cet ensemble de capteurs, transducteurs et transmetteurs, continuellement nous analysons, codifions, classifions et percevons les caractéristiques complexes des fréquences des ondes sonores, alors que nous résonnons avec le monde qui nous entoure. 

Afin de convertir une onde sonore en signaux que nous pouvons voir et manipuler dans l'ordinateur, nous utilisons un transducteur particulier, le microphone. Cette procédure de conversion, illustrée à la figure 1.9, est appelée l'échantillonnage.

Pour échantillonner une onde, nous utilisons un microphone qui convertit la pression acoustique d'une onde sonore en une pression électrique analogique. Ce signal analogique est alors passé dans un filtre passe-bas anti-aliasing pour en retirer les fréquences supérieures à la moitié du taux d'échantillonnage. Ceci est rendu nécessaire par la nature même du système numérique, incapable de représenter fidèlement une fréquence de valeur supérieure à la moitié du taux d'échantillonnage (cette "fréquence mirroir" est appelée fréquence de Nyquist). Ainsi, après avoir filtré les fréquences élevées qui se situent hors de la plage de conversion, nous "mesurons" ou "échantillonnons" l'amplitude du signal à l'aide d'un convertisseur analogique/numérique (CAN en anglais ADC, pour Analog-to-Digital Converter).

 


Figure 1.9 Numérisation d'un signal par prélèvement d'échantillons, retour dans le domaine analogique, et restitution effective du signal par les hauts-parleurs .

Avec un système linéaire 16 bits, vous allez mesurer ou quantifier l'amplitude d'un signal analogique avec des valeurs comprises entre -32768 et 32767 (soit 216) prises à intervalles réguliers, la fréquence d'échantillonnage. Dans l'entête par défaut de Csound, elle est fixée à 44100 fois par seconde. L'échantillonnage est donc une quantisation du signal analogique continu, en une série de petits instantanés (ou pas) — littéralement, nous avons pris des milliers de "petits échantillons" à partir du signal. Vous pouvez voir clairement la quantisation de l'onde simple, présentée à la figure 1.5, où chaque nouvelle adresse reçoit une donnée d'amplitude qui lui est propre.

Pour écouter un son à partir de notre ordinateur, nous convertissons le signal numérique (cette séquence d'échantillons) en signal analogique (une variation continue de différents voltages) à l'aide d'un convertisseur numérique/analogique (CNA en anglais DAC, pour Digital-to-Analog Converter), puis nous le lissons en le passant au travers d'un filtre passe-bas. Bien, assez de connaissances théoriques pour l'instant. Retournons à Csound. 

Création Sonore Etude 2: Les P-Fields

etude2.orc etude2.sco

Dans notre seconde étude, nous modifions les instr 101 — 106 de telle sorte qu'ils puissent être mis à jour et modifiés à partir du fichier "partition". Plutôt que de donner une valeur fixe aux arguments des différents opcodes de l'orchestre, comme dans notre etude1.orc, nous leurs attribuons des parameter fields ou p-fields (p4, p5, p6, ...) qui correspondent aux p-fields (numéros de colonne) de la partition. Ainsi, chaque p-fields de l'orchestre reçoit des valeurs qui peuvent être différentes d'une note à l'autre.

Si nous prenons l'exemple de l'instr 107 (figure 1.10), nous voyons que des p-fields sont définis pour chacun des arguments de l'opcode oscil : amplitude (p4), fréquence (p5), et la table d'onde (p6).

Figure 1.10 Diagramme de l'instr 107,  un instrument constitué d'un simple oscillateur avec des p-fields comme entrées.

  instr 107 ;P-Field Oscil
a1 oscil  p4, p5, p6
  out  a1
  endin  

Figure 1.11 Code de l'orchestre pour l'instr 107, constitué d'un simple oscillateur avec des p-fields comme entrées.

  instr 107 ;P-Field Oscil
a1 oscil  p4, p5, p6
  out  a1
  endin  

.

Ainsi à partir du fichier "partition" (figure 1.12), nous sommes capables de réutiliser le même instrument pour jouer une séquence de trois octaves descendantes, suivie d'un arpège de LA majeur. 

; P1 P2 P3 P4 P5 P6
; ins init dur amp freq table d'onde
 
i 107 0 1 10000 440 1
i 107 1.5 1 20000 220 2
i 107 3 3 10000 110 2
i 107 3.5 2.5 10000 138.6 2
i 107 4 2 5000 329.6 2
i 107 4.5 1.5 6000 440 2

Figure 1.12 Liste des notes de l'instr 107 , qui utilise les p-fields pour "jouer" 6 notes (présence de quelques chevauchements) avec différentes fréquences, amplitudes, et formes d'onde.

Dans notre prochain exemple de p-fields (figures 1.13, 1.14 et 1.15), notre sommaire instr 102 a été modifié en un instrument plus musical et souple, l'instr 108, capable de produire une large palette de couleurs.


Figure 1.13 Diagramme de l'instr 108, un simple instrument FM avec une série de p-fields comme entrées.

  instr 108 ;P-Field FM
a1 foscil  p4, p5, p6, p7, p8, p9
  out  a1
  endin

Figure 1.14 Code de l'orchestre pour l'instr 108, un simple instrument FM avec une série de p-fields comme entrées.

; p1 p2 p3 p4 p5 p6 p7 p8 p9
; ins init dur amp freq c m index table d'onde
 
i 108 7 1 10000 440 1 2 3 1
i 108 8.5 1 20000 220 1 .5 8 1
i 108 10 3 10000 110 1 1 13 1
i 108 10.5 2.5 10000 130.8 1 2.001 8 1
i 108 11 2 5000 329.6 1 3.003 5 1
i 108 11.5 1.5 6000 440 1 5.005 3 1

Figure 1.15 Notes de l'instr 108 dans lequel 9 p-fields sont utilisés pour "jouer" un synthétiseur FM avec différents temps d'initialisation, durées, amplitudes, fréquences, rapports de fréquences, et index de modulation.

Dans l'extrait de la "partition" présenté à la figure 1.15, chacun des arguments de foscil  s'est vu assigné un p-field particulier, et peut ainsi être modifié d'une note à l'autre. Ici,  p4 = amplitude, p5 = fréquence, p6 = valeur de la fréquence porteuse ("carrier"), p7 = valeur de la fréquence modulante ("modulator"), p8 = index de modulation et p9 = table d'onde. Ainsi, devenant actif à la septième seconde de l'etude2.sco, l'instr 108 joue six notes consécutives. L'ensemble des notes utilise la fonction  f 1 (une sinusoïde, en p9 ). Les deux premières notes, par exemple, sont séparées d'une octave (p5 = 440 et 220) et possèdent un rapport c:m distinct (p7 = 2 et 0.5) et différents index de modulation (p8 = 3 et 8). Les timbres produits sont très différents. Manifestement, l'utilisation de p-fields dans l'orchestre autorise une grande variété de hauteurs et de timbres, même avec le plus simple des instruments.

Exercises pour l'Etude 2

• Rendez les fichiers "orchestre" et "partition" : etude2.orc & etude2.sco.

Jouez et écoutez les particularités sonores de chaque note et instrument.

• Modifiez le fichier "partition" et changez les temps d'initialisation, les durées, les amplitudes et les fréquences de chaque note.

• A nouveau cherchez et lisez la documentation des opcodes employés dans les instr 107 — 112 dans le Csound Reference Manual, et concentrez votre étude et vos expérimentations sur une technique de synthèse à la fois.

• Explorez les effets produits par différents ratios c:m dans l'instr 108.

• Sans modifier le ratio c:m, explorez les effets d'un index de modulation faible, puis élevé. 

• Comparez les différences de timbre entre une modulation avec une sinusoïde (f 1) et une modulation avec une onde en dents de scie (f 2).

• En utilisant l'instr 109, composez une progression d'accords à 4 voix, dans laquelle la basse et le ténor produisent plus d'harmoniques que l'alto et le soprano.

• En utilisant les instr 109 et 112 simultanément, jouez la même partition composée pour l'instr 109 en doublant les parties. 

• En utilisant l'instr 110, expérimentez différentes méthodes de l'opcode pluck (voir le Csound Reference Manual pour les arguments additionnels).

• En utilisant l'instr 110, expérimentez en chargeant différentes tables de fonctions — f 1 et f 2.

• Explorez les divers paramètres de l'opcode grain.

• Créez un ensemble de courtes études convoquant chacune un instrument.

• Créez un ensemble de courtes études mobilisant plusieurs instruments. Pensez à ajuster vos niveaux d'amplitudes de telle sorte que ne soient pas produits des échantillons hors de la plage de conversion!

• Baissez le taux d'échantillonnage et le taux de contrôle de l'entête. Recompilez quelques-uns de vos instruments modifiés. Remarquez-vous une différence dans la qualité du son ? Remarquez-vous un changement de brillance ? Remarquez-vous des artefacts (l'apparition de nouveaux bruits) ? Remarquez-vous des "alias" (Nous discuterons la théorie propre à ce phénomène un peu plus tard) ? 

Amplitudes et Ecrêtage

Comme nous l'avons vu précédemment, si le système de votre ordinateur accueille un convertisseur 16 bits (ce qui est commun), vous avez le choix entre 216 valeurs d'amplitudes brutes possibles (soit 65536 valeurs allant de -32768 à +32767). Cela équivaut à une amplitude de plus de 90 dB (1 bit de résolution correspond à 6 dB). Si vous avez mis en pratique les exercices, vous avez alors probablement remarqués que les amplitudes des notes dans Csound s'ajoutent les unes aux autres. Si un instrument possède une amplitude de 20000, et que vous jouiez simultanément deux notes de cet instrument, vous demandez à votre convertisseur de produire un signal d'amplitude égal à  ± 40000. Hors, votre convertisseur ne peut traiter fidèlement que des valeurs dont la limite se situe autour de 32000. Csound vous indiquera alors le nombre d'échantillons hors de la plage de conversion et le signal audio produit sera écrêté, comme la figure 1.16 le montre. 


Figure 1.16 Ecrêtage résultant de l'addition de deux ondes d'amplitude élevée. 

Contrôler les amplitudes est l'un des aspects les plus problématiques du travail avec Csound. Il n'y a pas de solutions simples. Le problème réside dans le fait que les amplitudes dans Csound sont de simples représentations mathématiques d'un signal. Ces valeurs ne prennent pas en compte la nature acoustique et perceptuelle du son. 

Exprimé simplement, un signal dont l'amplitude est multipliée par deux ne sera pas forcément perçu deux fois plus fort. Un bon livre sur les lois acoustiques pourrait vous aider à apprécier la complexité du problème. Dans l'environnement Csound, gardez en mémoire le principe additionnel de l'amplitude de chaque note : dans tous les cas où deux ou plusieurs notes sonnent ensemble, leurs amplitudes s'ajoutent. Si les valeurs additionnées dépassent ensemble 32000, votre signal sera écrêté. Cela dit, Csound possède quelques opcodes et outils qui vous aiderons à traiter ce problème, mais aucun des opcodes actuels ou des convertisseurs de valeurs ne permettent de le résoudre. La plupart du temps, vous aurez juste à baisser les niveaux d'amplitude, et à rendre le fichier à nouveau (encore et encore) jusqu'à obtenir un niveau accepté par votre système. 

Renouvellement Des Données

Comme vous l'avez vu au cours des deux premières études d'orchestre, nous pouvons définir et mettre à jour des paramètres avec des chiffres décimaux, soit directement dans l'orchestre, soit au travers des p-fields de la partition.  Mais le réel pouvoir de Csound réside dans le fait que chacun de ces paramètres peut être mis à jour en utilisant des variables qui produisent de nouvelles valeurs à l'un des quatre taux suivants : setup, i-rate, k-rate, et a-rate, où :

les variables i-rate sont remplacées et mises à jour à chaque nouvelle note.

les variables k-rate sont remplacées et mises à jour au taux de contrôle (kr).

les variables a-rate sont remplacées et mises à jour au taux d'échantillonnage ou taux audio (sr).

Les variables i-rate et k-rate sont "scalaires". Pour l'essentiel, elles prennent une valeur à un temps donné, et la gardent un certain temps. Les variables i-rate sont principalement utilisées pour définir la hauteur et la durée des notes. Elles prennent leur valeur au temps d'initialisation, et demeurent constantes pour la durée de chaque note. Les variables k-rate sont principalement utilisées pour stocker et mettre à jour des enveloppes et tous les signaux sub-audios. Ces variables sont recalculées au taux de contrôle (4410 fois par seconde), tel que définies dans l'entête de l'orchestre (kr). Les variables a-rate sont des "vecteurs" d'informations. Elles sont utilisées pour stocker et mettre à jour des données telles que les signaux de sortie des oscillateurs et des filtres, qui changent aux taux audio (44100 fois par seconde) défini dans l'entête de l'orchestre (sr).

Chacun peut déterminer et identifier le taux auquel une variable sera mise à jour par la première lettre du nom de la variable (i, k, ou a). Par exemple, la seule différence entre les deux oscillateurs ci-dessous réside dans fait que l'un calcule au taux audio, et l'autre au taux de contrôle. Les deux utilisent le même opcode, oscil , et les deux possèdent les mêmes arguments. Seule diffère la résolution de l'échantillon du signal de sortie (sa précision).

; sortie opcode amp, frq, fonc ; commentaire
 
ksig oscil 10000, 1000, 1 ; 1000 Hz Sinusoïde - f 1
asig oscil 10000, 1000, 1 ; 1000 Hz Sinusoïde - f 1

Figure 1.17 Deux opcodes oscil avec une version asig et une version ksig.

Suivant la configuration de notre entête par défaut (sr = 44100 et kr = 4410), ksig rendra les données à un taux d'échantillonnage de 4 K et asig à un taux d'échantillonnage de 44.1K. Dans le cas présent, le résultat à l'audition sera équivalent, car les deux possèdent une résolution d'échantillons suffisante pour calculer précisément une sinusoïde de 1000 Hz. Cependant, si les arguments étaient différents, et si les ondes possédaient des harmoniques supplémentaires, comme l'onde en dents de scie définie par f 2 dans la figure 1.18, le k-rate choisi de 4410 échantillons par seconde ne serait pas suffisamment élevé pour reproduire l'onde dans son intégrité. Le signal de sortie présenterait des "alias" (nous aborderons plus précisément cette question un peu plus tard).

; sortie opcode amp, frq, fonc ; commentaire
 
ksig oscil 10000, 1000, 2 ; 1000 Hz dents de scie - f 2
asig oscil 10000, 1000, 2 ; 1000 Hz dents de scie - f 2

Figure 1.18 Une onde en dents de scie "sous-échantillonnée" (étant donné kr = 4410 et une fréquence de 1000), produisant un signal de sortie ksig avec des "alias".

Notez bien que c'est à vous qu'il revient de déterminer le plus approprié et le plus efficace des taux pour rendre vos opcodes. Par exemple, vous pouvez choisir de rendre tous vos oscillateurs de basse fréquence (LFOs) et vos enveloppes au taux audio, mais alors le temps de calcul des signaux de sortie sera rallongé, et dans la plupart des cas, le gain en résolution sera imperceptible à l'audition. 

Nom Des Variables

Dans nos créations d'instruments, nous avons jusqu'ici parlé de et utilisé a1, asig, k1 et ksig — dans bien des cas indifféremment! Pourquoi ces noms différents pour une même chose ? Csound est assez difficile comme cela. Pourquoi ne pas être plus clair ?

Bien, lorsqu'il s'agit de nommer une variable, la seule exigence de Csound concerne la première lettre du nom de la variable : elle doit être un i, un k, ou un a. Ceci afin que le programme puisse déterminer le taux auquel sera rendu une ligne de code. Après cela, tout peut convenir. 

Par exemple, vous pouvez nommer la sortie de l'opcode loscil ci-dessous a1, asig, asample, ou acoolsound. Chacun de ces noms de variables sera reconnu par Csound, qui fonctionnera sans erreur. Etant donné que les lignes de code sont identiques, le rendu sonore sera exactement le même — peut importe le nom que vous leurs donnerez! C'est donc au designer sonore qu'il revient de définir des noms de variables clairs et informatifs...pour vous même. 

a1 loscil 10000, 440, 4 ; lecture d'un sample f 4 à A440
  out a1
 
asig loscil 10000, 440, 4 lecture d'un sample f 4 à A440
  out asig
 
asample loscil 10000, 440, 4 lecture d'un sample f 4 à A440
  out asample
 
acoolsound loscil 10000, 440, 4 lecture d'un sample f 4 à A440
  out acoolsound

Théorème de l'Echantillonnage et Repliement de Spectre

Rentrons plus avant dans les questions de théorie avant de concevoir des instruments plus complexes. Nous avons vu précédemment que l'onde en dents de scie de la figure 1.18, "sous-échantillonnée" (ksig), engendrait la production d'"alias", phénomène appelé "aliasing" ou repliement de spectre. Cet exemple corrobore le "théorème de l'échantillonnage". Il énonce le principe suivant : dans le domaine numérique, pour reconstruire fidèlement (tracer ou reproduire) une forme d'onde à une fréquence donnée, vous avez besoin de deux fois plus d'échantillons que la fréquence elle-même. Pour être rendue dans son intégrité, une fréquence ne doit pas dépasser la moitié du taux d'échantillonnage, cette limite étant connue comme la fréquence de Nyquist. Avec un taux d'échantillonnage de 44100 Hz, vous pouvez rendre des spectres complexes avec des fréquences (ou partiels) allant jusqu'à 22050 Hz — ce qui est bien au-dessus du champ auditif de l'homme. Et avec un taux de contrôle fixé à 4410 Hz, vous pouvez rendre fidèlement des spectres sonores allant jusqu'à 2205 Hz. Cela représenterait un LFO incroyablement rapide, et semblerait un peu élevé pour des signaux qui évoluent lentement dans le temps. Mais vous devez reconnaître que certains segments des enveloppes d'amplitude changent très rapidement. Des contrôleurs "haute-résolution" peuvent réduire  les bruits de "zip" produits parfois lors de rapides transitions. 

La figure 1.19 illustre graphiquement le phénomène du repliement de spectre. Ici, parce qu'une fréquence est "sous-échantillonnée", un alias (une fréquence de substitution) est produit. Dans ce cas précis, nous avons à rendre une sinusoïde de 5 Hz (a). Nous échantillonnons cette onde à 4 Hz (b) (rappellez-vous que la fréquence requise pour une reproduction fidèle aurait dû être 10 Hz — 2 fois la plus haute fréquence du signal), avec pour résultat la production d'une onde de 1 Hz (c)! Comme vous pouvez le constater, les valeurs retournées par le processus d'échantillonnage tracent la ligne d'une sinusoïde de 1 Hz, et non de 5 Hz. Cet alias est égal à la différence entre la fréquence à échantillonner et le taux d'échantillonnage. 


 Figure 1.19 Repliement de spectre. Une sinusoïde de5 Hz (a) est sous-échantillonnée -  4 fois par seconde (b) avec pour conséquence la production d'une sinusoïde de 1 Hz (c).

Afin de bien comprendre ce phénomène, il vous serait profitable d'essayer des taux de variables différents, en utilisant les premiers instruments de ce chapitre. (Je vous recommande de dupliquer tous les instruments, et de leur attribuer un numéro différent. Changez alors toutes les variables asig et a1 en variables ksig et k1, et rendez à nouveau. Vous serez surpris, et peut-être même séduits, par certains des résultats sonores!) Pour l'heure, poursuivons notre chemin. 

Création Sonore Etude 3: Quatre techniques pour créer des enveloppes

etude3.orc etude3.sco

Il est souvent dit qu'un ordinateur est capable de produire tous les sons imaginables. Et d'un point de vue mathématique, c'est vrai. Mais dans ce cas, pourquoi ces sons sont-ils si souvent "stériles", "monotones", et "ennuyeux"? A mon oreille, un son devient intéressant et séduisant lorsque ses trois principaux paramètres — hauteur, timbre et intensité, sont contrôlés de manière subtile, dynamique et interdépendante. Et ce qui fait de Csound un langage logiciel de synthèse très puissant tient au fait qu'il y est possible de patcher la sortie d'un opcode, quel qu'il soit, avec pratiquement n'importe lequel des arguments d'entrée d'un autre opcode — poussant ainsi le contrôle dynamique des paramètres à un degré sans égal. En modifiant subtilement (ou grossièrement) chacun des arguments d'entrée de vos opcodes, vos sons "synthétiques" prendront vie!

Jusqu'ici nous avons pour l'essentiel successivement ouverts puis fermés brutalement nos instruments Csound — ils ont été joué à plein volume. Je ne pense pas que l'on puisse trouver un seul instrument acoustique qui fonctionne comme cela. Sans aucun doute nous rendrions ces instruments plus "musicaux" en leur appliquant  une enveloppe globale. Et en contrôlant dynamiquement les paramètres d'entrée des opcodes, nous produirions des sons plus que jamais séduisants. 

Dans l'instr 113 (figures 1.20 et 1.21), l'opcode linen est utilisé pour contrôler dynamiquement l'amplitude de l'oscillateur, générant une enveloppe AR classique à deux paramètres (Attaque-Relâchement).

Figure 1.20 Diagramme de l'instr 113, ici la sortie d'un opcode contrôle un des arguments d'entrée d'un autre. Nous contrôlons dynamiquement l'amplitude en modifiant l'argument d'amplitude de l'opcode oscil avec la sortie de l'opcode linen.

  instr 113 ; SIMPLE OSCILLATEUR AVEC ENVELOPPE
k1 linen p4, p7, p3, p8 ; p3=dur, p4=amp, p7=attaque, p8=relâchement
a1 oscil k1, p5, p6 ; p5=freq, p6=table d'onde
  out a1  
  endin    

Figure 1.21 Code de l'orchestre pour l'instr 113, un simple oscillateur avec une enveloppe d'amplitude. 

Dans l'instr 115 (figures 1.22 et 1.23), l'opcode linen est à nouveau utilisé pour appliquer une enveloppe dynamique de l'amplitude. Mais cette fois l'"enveloppement" est réalisé en multipliant la sortie de l'opcode linen (k1) par la sortie de l'opcode buzz  (a1). Cette multiplication est réalisée dans les arguments d'entrée de l'opcode out (k1 * a1). Non seulement nous voyons ici une nouvelle façon d'appliquer une enveloppe à un signal (en le multipliant par un contrôleur), mais nous voyons aussi qu'il est possible d'exécuter des opérations mathématiques avec des variables, où chaque opération a la valeur d'un argument.

Dans la figure 1.22, nous voyons aussi que l'opcode expon est utilisé pour faire évoluer exponentiellement la valeur de p10 vers celle de p11 sur la durée de la note (p3), balayant ainsi le nombre d'harmoniques (des "cosines") que produit buzz. L'effet ressemble à un filtre résonant passe-bas que l'on fermerait progressivement. C'est un moyen simple pour réaliser un contrôle dynamique du timbre. 

Figure 1.22 Diagramme de l'instr 115 décrivant un contrôle de l'amplitude par la multiplication de deux sorties, et le contrôle dynamique d'un argument. 

  instr 115 ; Balayage  Harmonique de Buzz avec une Enveloppe
k1 linen p4, p7, p3, p8
k2 expon p9, p3, p10
a1 buzz 1, p5, k2+1, p6
  out k1*a1
  endin  

Figure 1.23 Code de l'orchestre pour l'instr 115, un instrument avec une amplitude dynamique et un contrôle harmonique. 

Si vous avez parcouru le Csound Reference Manual, vous avez probablement remarqué que beaucoup d'opcodes, tels que oscil, proposaient une version k-rate et une version a-rate. Dans l'instr 117 (figure 1.24), nous utilisons un opcode linen au taux audio pour générer une enveloppe d'amplitude globale. Pour cela, nous "patchons" la sortie de l'opcode grain dans le paramètre d'amplitude linen (regardez a1 dans la figure 1.25). Cette approche utilise l'opcode linen pour "envelopper" le signal provenant du synthétiseur granulaire. En fait, nous plaçons littéralement le signal dans une "enveloppe" avant de l'envoyer! 

Figure 1.24 Diagramme de l'instr 117 avec un contrôle de l'amplitude réalisé en envoyant le signal (a1) dans une enveloppe au taux a-rate (a2).

  instr 117 ; Grains envoyés dans une Enveloppe
k2 linseg p5, p3/2, p9, p3/2, p5
k3 line p10, p3, p11
k4 line p12, p3, p13
k5 expon p14, p3, p15
k6 expon p16, p3, p17
a1 grain p4, k2, k3, k4, k5, k6, 1, p6, 1
a2 linen a1, p7, p3, p8
  out a2
  endin  

Figure 1.25 Code de l'orchestre pour l'instr 117, un instrument de synthèse granulaire avec contrôle dynamique de nombreux paramètres. Notez que la sortie de grain (a1) est "patchée" dans l'argument d'amplitude d'un  linen au taux audio, pour envelopper le son dans une amplitude globale. 

Enveloppes

Je dois admettre que jeune étudiant en musique électronique, j'étais troublé par l'usage du terme "enveloppe" dans le domaine de l'audio et de la synthèse sonore. Je pensais les "enveloppes" comme des paquets de papier fin dans lesquels vous pouviez glisser une lettre pour un ami, ou un chèque pour la compagnie de téléphone, et ne pus jamais faire tout à fait le lien. Mais l'algorithme utilisé dans l'instr 117 m'a rendu claire la métaphore. J'espère qu'il en est de même pour vous. Ici nous voyons que l'opcode linen "emballe" l'ensemble du signal dans une boîte à la forme singulière (AR), avant de l'envoyer vers la sortie. La figure 1.26 permet de voir autrement ce processus. Tout d'abord, nous voyons un signal audio bipolaire brut. Puis nous voyons une enveloppe unipolaire d'amplitude à quatre segments : attack-decay-sustain-release (ADSR). Puis nous voyons cette enveloppe appliquée au signal audio. Et finalement nous voyons le signal audio bipolaire dont l'amplitude a été modifiée, suivant le "contour" de l'ADSR. 


 Figure 1.26 "Enveloppement" d'un signal.

Une autre façon de voir la figure 1.26 serait de considérer que notre signal bipolaire est mis à l'échelle (multiplié) par une enveloppe ADSR unipolaire, qui symmétriquement trace le profil du signal unipolaire. Le signal est ainsi "enveloppé" dans un paquet ADSR. Appliquons ces nouvelles connaissances dans un autre modèle d'instrument. 

Dans l'instr 118 (figures 1.27 et 1.28) nous illustrons encore une autre façon d'appliquer une enveloppe à un signal. Cette fois-ci, nous utilisons un oscillateur dont l'argument de fréquence est fixé à 1/p3. Passons à un exemple pratique pour comprendre comment cette expression simple va nous aider à calculer la bonne fréquence qui transformera notre oscillateur périodique en un générateur d'enveloppe "apériodique". 

Si la durée de la note est de 10 secondes, et la fréquence de notre oscillateur fixée à 1/10 Hz, "lire" un cycle complet de la table de fonction précisée en p7 prend 10/10 Hz . Ainsi, fixer la fréquence d'un oscillateur à 1 divisé par la durée de la note (1/p3),  garantie que le générateur de signal périodique calculera  seulement une période, ou lira seulement un cycle de sa f-table durant le cours de chaque note. 

Figure 1.27 Diagramme de l'instr 118, un instrument avec un oscillateur comme générateur d'enveloppe. 

  instr 118 ; Loscil avec une Enveloppe Oscil
k1 oscil p4, 1/p3, p7
k2 expseg p5, p3/3, p8, p3/3, p9, p3/3, p5
a1 loscil k1, k2, p6
  out a1
  endin  

Figure 1.28 Code de l'orchestre pour l'instr 118, un instrument qui lit des samples, avec un oscillateur générateur d'enveloppe et une modulation dynamique de la hauteur.

Dans l'instr 118 les fonctions d'enveloppes appelées par p7 (f 6, f 7 et f 8) utilisent GEN7 et GEN5 pour dessiner une variété de profils unipolaires linéaires et exponentiels. Il est important de noter qu'il est illégal d'utiliser une valeur de 0 dans une fonction exponentielle calculée par le sous-programme GEN5 ou l'opcode expseg. Vous remarquerez par conséquent que f 8, qui utilise GEN5, commence et finie avec une valeur de 0.001 à la place de 0.

f 6 0 1024 7 0 10 1 1000 1 14 0 ; enveloppe linéaire AR 
f 7 0 1024 7 0 128 1 128 .6 512 .6 256 0 ; enveloppe linéaire ADSR 
f 8 0 1024 5 .001 256 1 192 .5 256 .5 64 .001 ; enveloppe exponentielle ADSR

Figure 1.29 Fonctions linéaires et exponentielles utilisant GEN5 et GEN7.

La technique employée dans l'instr 118 pour appliquer une enveloppe (l'utilisation d'un oscillateur comme générateur d'enveloppe) a plusieurs avantages. Premièrement, vous pouvez créer une librairie entière de formes d'enveloppe (des "presets"), que vous pourrez ensuite modifier d'une note à l'autre. Deuxièmement, puisque le générateur d'enveloppe est un oscillateur, vous pouvez lire l'enveloppe en boucle, l'"appeler à nouveau" durant le cours de la note pour créer des effets intéressants de modulation d'amplitude de type LFO. Dans l'instr 119 (figure 1.30), p8 détermine le nombre de répétitions effectives durant le cours de la note. Si p8 est fixé à 10 et  p3 à 5 secondes, l'instrument "appellera" l'enveloppe 2 fois par seconde (1/5 * 10 = 2). Alors que si la durée de la note était de 1 seconde (p3 = 1), l'enveloppe serait "appelée" 10 fois par seconde ( 1/1 * 10 = 10). 

  instr 119 ; Rappel de l'enveloppe générée par oscil avec Foscil
k1 oscil p4, 1/p3 * p8, p7 ; P8= taux de rappel par durée de note
k2 line p11, p3, p12
a1 foscil k1, p5, p9, p10, k2, p6
  out a1
  endin

Figure 1.30 Code de l'orchestre de l'instr 119, un instrument FM avec un "oscillateur-enveloppe" dans lequel p8 détermine la fréquence de "rappel". 

Fonctions Unipolaires et Bipolaires

Habituellement nous pensons à un oscillateur comme quelque chose qui produit un son en jouant différentes formes d'onde ou des samples. Cependant, nous avons vu que dans Csound, un oscillateur à lecture de tables peut lire toutes fonctions unipolaires ou bipolaires, et cela à n'importe quelle vitesse. Ce générateur de signal peut être utilisé soit comme une source de contrôle (avec de nouvelles valeurs produites au taux de contrôle kr), soit comme une source audio (avec de nouvelles valeurs produites au taux audio ar). A la différence des synthétiseurs commercialisés, dans Csound la "fonction" d'un opcode est définie par l'usage et par l'utilisateur. Jusqu'ici, nous avons utilisé divers sous-programmes GENS pour calculer des fonctions unipolaires et bipolaires, et il est important de s'assurer que nous comprenons bien leurs différences. 

La plupart des formes d'onde audio, comme celles crées par GEN10, sont bipolaires — elles courent symmétriquement au-dessus et au-dessous de 0. D'un autre côté, la plupart des fonctions d'enveloppe, comme celles que nous avons crées en utilisant GEN5 et GEN7, sont unipolaires — elles courent dans une seule direction, généralement au-dessus de 0. Dans Csound, les fonctions bipolaires sont par défaut normalisées sur une plage allant de -1 à +1, et les fonctions unipolaires sont normalisées sur une plage allant de 0 à +1 (figure 1.31).


 Figure 1.31 Une fonction bipolaire (-1 à +1) et une fonction unipolaire (0 à +1).

Si vous souhaitez contourner cette normalisation par défaut des données contenues dans vos fonctions, vous devez faire précéder le numéro du sous-programme GEN par le signe moins (-), comme le montre la figure 1.32 (f 3 et f 4).

f 1 0 512 10 1 ; Sinusoïde bipolaire normalisée 
f 2 0 512 7 0 6 1 500 1 6 0 ; Enveloppe unipolaire normalisée
f 3 0 512 -10 .3 .013 .147 .026 ; Somme de sinusoïdes non-normalisées
f 4 0 512 -7 440 256 220 256 440 ; Enveloppe unipolaire non-normalisée

Figure 1.32 Deux fonctions normalisées (f 1 et f 2) et deux fonctions non-normalisées (f 3 et f 4).

Exercises pour l'Etude 3

• Rendez les fichiers "orchestre" et "partition" : etude3.orc & etude3.sco.

Jouez et écoutez les particularités sonores et les formes d'enveloppes de chaque note et instrument.

• Modifiez le fichier "orchestre" et renommez les variables de telle sorte que les noms soient plus explicites. Renommez par exemple toutes les variables a1  asig1 , et les variables k1  kenv1.

• Dans le Csound Reference Manual, cherchez les nouveaux opcodes utilisés dans les instr 113 — 119, et lisez leur documentation :

• Modifiez le temps d'attaque (p7) et le temps de relâchement (p8) de l'opcode linen dans les instr 113 —117.

• Ajoutez une enveloppe de hauteur pour les instr 113, 114 et 115 avec l'opcode linseg , et ajoutez sa sortie à p5.

• Expérimentez divers contrôles dynamiques pour les paramètres de l'opcode grain dans l'instr 117.

• Substituez les enveloppes générées avec oscil par des enveloppes générées avec linen dans les instr 113 — 117.

• Utilisez GEN5 et GEN7 pour créer des fonctions d'enveloppes additionnelles. Essayez d'imiter l'attaque caractéristique d'un piano — f 9, d'une mandoline — f 10, d'un tuba — f 11, d'un violon — f 12 et d'une voix d'homme chantant un "la" — f 13. Appliquez ces enveloppes aux versions des instr 113 — 117 nouvellement créés.

• En suivant l'exemple des diagrammes d'instruments que vous avez étudiés jusque là, dessiner le shéma des instr 112, 113, 114 et 119.

Création sonore Etude 4 : Mixage, Chorus, Trémolo et Vibrato

etude4.orc etude4.sco

Maintenant, nous allons améliorer la qualité de nos instruments en mixant et en "désaccordant" légèrement nos oscillateurs, pour créer un riche effet de chorus. Les opcodes vont se rejoindre, créant un algorithme de synthèse hybride qui ne ressemble à aucun des algorithmes proposés sur le marché. Et nous allons animer nos instruments par l'adjonction de modulations d'amplitude et de fréquence à des taux audios et sub-audios (AM et FM). Nous allons employer aussi plusieurs opcodes de représentation graphique implémentés dans Csound, pour visualiser ces enveloppes temporelles et spectrales complexes. 

Dans l'instr 120 (figures 1.33 et 1.34), nous mixons ensemble trois oscillateurs "désaccordés" (ou "détunés") qui utilisent tous l'opcode envlpx pour appliquer une enveloppe d'amplitude. L'opcode display dessine cette enveloppe sur l'écran selon une fréquence fixée par l'utilisateur. Ici, cette fréquence correspond à la longueur de chaque note (p3).

Figure 1.33 Diagramme de l'instr 120 illustrant trois oscillateurs "détunés", avec une enveloppe commune et une représentation graphique.

  instr 120 ; SIMPLE CHORUS
idur = p3 ; BLOC D'INITIALISATION 
iamp = ampdb(p4)
ifrq = cpspch(p5)
ifun = p6
iatk = p7
irel = p8
iatkfun = p9
kenv envlpx iamp, iatk, idur, irel, iatkfun, .7, .01
asig3 oscil kenv, ifrq*.99, ifun ; BLOC DE SYNTHESE 
asig2 oscil kenv, ifrq*1.01, ifun
asig1 oscil kenv, ifrq, ifun
amix = asig1+asig2+asig3 ; MIXAGE
  out amix
  display kenv, idur
  endin

Figure 1.34 Code de l'orchestre pour l'instr 120, un instrument "chorussant" dans lequel les p-fields portent le nom de variables données à  i-time. Et un envlpx, représenté graphiquement, est utilisé comme enveloppe d'amplitude commune.

Bien que l'instr 120 soit encore assez simple de construction, il préfigure la façon dont sont organisés et présentés les instruments plus complexes dans Csound. Dans la figure 1.34, vous pouvez voir que les variables sont initialisées au début de l'instrument dans le bloc d'initialisation , avec des noms qui doivent nous aider à identifier leurs fonctions (le style de codage est ainsi personnalisé). Vous pouvez clairement lire que le temps d'attaque est assigné à iatk, avec la valeur de p7 (iatk = p7), et que le temps de relâchement est assigné à irel, avec la valeur de p9 (irel = p9). Et plus important, en regardant où ils sont "patchés" dans l'opcode envlpx , vous pouvez voir  et vous rappeler quels arguments correspondent à ces paramètres particuliers. La lecture de l'opcode en est facilitée.

Notez aussi que dans Csound le signe égal (=) possède une fonction d'attribution. C'est en réalité un opcode! Attribuer des noms de variables clairs au temps d'initialisation i-time est hautement recommandé, l'instrument gagnant en lisibilité.

Fusion Spectrale

Nous allons examiner maintenant l'instr 122 (figures 1.35 et 1.36). Cet instrument utilise des opcodes expon indépendants pour dynamiser le spectre fréquentiel des opcodes foscil et buzz. Ces derniers sont "fusionnés" (dé-formés/mixés/transfigurés) avec l'attaque de l'opcode pluck, avec pour résultat la production d'un beau timbre hybride. Cet instrument utilise l'opcode dispfft pour calculer et représenter graphiquement la FFT (Fast Fourier Transform), de 512 points et remise à jour toutes les 250 millisecondes, d'un signal complexe. Bien que les opcodes display et dispfft soient une merveilleuse façon de jeter un regard sur le fonctionnement de vos instruments, ils ont un impact significatif sur les performances de votre système. Il est donc important de penser à "mettre en commentaires" ces opcodes display et dispfft quand vous utilisez vos instruments pour produire de la musique. Ils ont un caractère informatif et pédagogique, mais sont aussi de réels outils de correction d'erreurs. Vous devez les considérer comme tel. 

Figure 1.35 Diagramme de l'instr 122 illustrant la représentation graphique d'une FFT de 3 opcodes mixés (fondus) et "joints ensemble" (dé-formés).

  instr 122 ; Simple Fusion Spectrale 
idur = p3
iamp = ampdb(p4)
ifrq = cpspch(p5)
ifun = p6
iatk = p7
irel = p8
iatkfun = p9
index1 = p10
index2 = p11
kenv envlpx iamp, iatk, idur, irel, iatkfun, .7, .01
kmodswp expon index1, idur, index2
kbuzswp expon 20, idur, 1
asig3 foscil kenv, ifrq, 1, 1, kmodswp, ifun
asig2 buzz kenv, ifrq*.99, kbuzswp+1, ifun
asig1 pluck iamp, ifrq*.5, ifrq, 0, 1
amix = asig1+asig2+asig3
  out amix
  dispfft amix, .25, 1024
  endin

Figure 1.36 Code de l'orchestre pour l'instr 122, un instrument qui fusionne trois tehniques de synthèse — pluck, foscil, et buzz.

Plutôt que de simplement mixer ou fusionner les opcodes comme nous l'avons fait pour les instruments 120 et 122, une autre approche populaire consiste à moduler un opcode audio avec la fréquence et l'amplitude d'un autre. Par exemple dans l'instr 124 (figures 1.37 et 1.38), un  oscil au taux a-rate (asig) a son amplitude modulée par la sortie d'un autre oscil au taux a-rate (alfo) dont la fréquence est dynamiquement modifiée par l'opcode line et dont l'amplitude est contrôlée par un expon.

Figure 1.37 Diagramme de l'instr 124, un instrument dont l'amplitude est modulée dynamiquement.

  instr 124 Modulation d'Amplitude par un oscil
idur = p3
iamp = ampdb(p4)
ifrq = cpspch(p5)
ifun = p6
iatk = p7
irel = p8
iatkfun = p9
imodp1 = p10
imodp2 = p11
imodfr1 = p12
imodfr2 = p13
imodfun = p14
kenv envlpx iamp, iatk, idur, irel, iatkfun, .7, .01
kmodpth expon imodp1, idur, imodp2
kmodfrq line cpspch(imodfr1), idur, cpspch(imodfr2)
alfo oscil kmodpth, kmodfrq, imodfun
asig oscil alfo, ifrq, ifun
  out asig*kenv
  endin

Figure 1.38 Code de l'orchestre pour l'instr 124, un instrument dont l'amplitude est modulée dynamiquement avec une enveloppe d'amplitude indépendante et un LFO variable. 

Cette simple combinaison d'oscillateurs peut produire une grande variété de timbres harmoniques et inharmoniques évoluant dynamiquement. 

Dans l'instrument suivant, le 126 (figures 1.39 et 1.40), nous présentons un simple instrument-vibrato qui utilise un opcode linseg pour envelopper le vibrato. Ainsi, le vibrato paraît plus naturel.

Figure 1.39 Diagramme de l'instr 126, un instrument de synthèse additive avec un vibrato "enveloppé".

  instr 126 ; Simple Vibrato "enveloppé" 
idur = p3
iamp = ampdb(p4)
ifrq = cpspch(p5)
iatk = p6
irel = p7
ivibdel = p8
imoddpt = p9
imodfrq = p10
iharm = p11
kenv linen iamp, iatk, idur, irel
kvibenv linseg 0, ivibdel, 1, idur-ivibdel, .3
klfo oscil kvibenv*imoddpt, imodfrq, 1
asig buzz kenv, ifrq+klfo, iharm, 1
  out asig
  endin

Figure 1.40 Code de l'orchestre pour l'instr 126, un intrument buzz avec un vibrato "enveloppé".

Même ces instruments, d'une conception relativement simple, peuvent produirent une palette de couleurs incroyablement riche et diverse. Prenez le temps de les explorer et de les modifier. 

Convertisseurs de valeur

Dans le "bloc" d'initialisation de l'instr 120 (figure 1.34), et cela est valable pour l'ensemble des instruments de cette étude, vous avez peut-être remarqué que deux des convertisseurs de valeurs de Csound, ampdb et cpspch étaient utilisés (iamp = ampdb(p4) et ifrq = cpspch(p5)). Jusqu'à présent, nous avions employés des fréquences exprimées en Hz et des amplitudes linéaires. Ces convertisseurs nous donnent la possiblité d'exprimer ces données de fréquence et d'amplitude dans un format plus familier et intuitif. 

Le convertisseur cpspch va lire un chiffre en notation d'octaves et demi-tons, et le convertir en Hz (soit, 8.09 = A4 = 440 Hz). C'est un type de notation dans lequel les octaves sont représentées par des nombres entiers (8.00 = C moyen ou C4, 9.00 = C5, 10.00 = C6, etc.) et les 12 tempéraments égaux de la gamme par des chiffres à deux décimales qui suivent l'octave (8.01 = C#4, 8.02 = D4, 8.03 = D#4, etc.). La gamme présentée dans la figure 1.41 devrait vous rendre explicite ce système. 

NOTE # Hertz (Hz) CPSPCH NUMERO DE NOTE MIDI
 
C4 261.626 8.00 60
C#4 277.183 8.01 61
D4 293.665 8.02 62
D#4 311.127 8.03 63
E4 329.628 8.04 64
F4 349.228 8.05 65
F#4 369.994 8.06 66
G4 391.955 8.07 67
G#4 415.305 8.08 68
A4 440.000 8.09 69
A#4 466.164 8.10 70
B4 493.883 8.11 71
C5 523.251 9.00 72

Figure 1.41 Une gamme chromatique commençant au C moyen, avec ses valeurs exprimées en Hz et en notation d'octaves et demi-tons.

Par l'ajout de décimales supplémentaires, il est possible de spécifier des micro-intervalles (figure 1.42).

Comme vous pouvez le voir, cpspch assure la conversion des valeurs au format pch dans le format cps (cycles-par-seconde). Si vous écrivez de la musique tonale ou microtonale avec Csound, vous pourrez trouver ces convertisseurs de valeurs particulièrement utiles. 

NOTE # CPSPCH
 
C4 8.00
C4+ 8.005
C#4 8.01
C#4+ 8.015
D4 8.02
D4+ 8.025
D#4 8.03
D#4+ 8.035
E4 8.04
E4+ 8.045
F4 8.05
F4+ 8.055
F#4 8.06
F#4+ 8.065
G4 8.07
G4+ 8.075
G#4 8.08
G#4+ 8.085
A4 8.09
A4+ 8.095
A#4 8.10
A#4+ 8.105
B4 8.11
B4+ 8.115
C5 9.00

Figure 1.42 Une octave divisée en tempéraments égaux de quarts de tons, utilisant le convertisseur de valeurs cpspch.

De même, le convertisseur de valeurs ampdb lira une valeur exprimée en décibel, et la convertira en une valeur d'amplitude brute (figure 1.43).

ampdb(42) = 125
ampdb(48) = 250
ampdb(54) = 500
ampdb(60) = 1000
ampdb(66) = 2000
ampdb(72) = 4000
ampdb(78) = 8000
ampdb(84) = 16000
ampdb(90) = 32000
ampdb(96) = 64000 ; ATTENTION : ECHANTILLONS HORS DE LA PLAGE DE CONVERSION!!!

Figure 1.43 Conversion d'amplitudes avec ampdb.

Bien que l'échelle logarithmique des décibels (dB) soit perçue comme linéaire, vous devez noter que Csound n'"utilise" pas vraiment les dB. Le convertisseur ampdb applique une conversion directe, sans mise à l'échelle. Malheureusement, vous aurez à passer beaucoup de temps pour ajuster, normaliser, et mettre à l'échelle vos niveaux d'amplitude même si vous utilisez le convertisseur ampdb, car la conversion est réalisée avant que le signal ne soit rendu.

Exercises pour l'Etude 4

• Rendez les fichiers "orchestre" et "partition" : etude4.orc & etude4.sco.

Jouez et écoutez les timbres dynamiques et les effets de modulations de chaque note et instrument.

• Modifiez l'instr 120 en "mettant en choeur" (effet de chorus) trois opcodes foscil à la place des trois opcodes oscil.

• Comme dans l'instr 126, ajoutez un vibrato "enveloppé" aux trois foscil que vous venez de créer dans l'instr 120.

• Dessinez le diagramme de l'instr 121 (qui n'a pas été étudié dans cette section), et ajoutez un vibrato "enveloppé", et placez un de vos samples dans ce synthétiseur à table d'ondes. 

• Modifiez l'instr 122 pour en faire un synthétiseur hybride totalement différent. Peut-être pouvez-vous ajouter un grain ou un loscil?

Dessinez le diagramme de l'instr 123 (qui n'a pas été étudié dans cette section), et changez les rythmes et les hauteurs. Essayez une modulation au taux audio. Pour finir, réalisez et utilisez vos propres fonctions de modulation d'amplitudes. 

• Modifiez l'instr 124 en réduisant le "balayage" des fréquences. Ajoutez un "chorus" et un vibrato "enveloppé". 

Dessinez le diagramme de l'instr 125 (qui n'a pas été étudié dans cette section). Changez la fréquence et la profondeur de modulation en utilisant les fonctions présentes. Modulez quelques-uns de vos propres samples. 

• Modifiez l'instr 126 de telle sorte que ces "voix synthétiques" chantent des mélodies et des harmonies microtonales. 

• Dessinez le diagramme de l'instr 127 (qui n'a pas été étudié dans cette section). Amusez-vous à le modifier avec chacune des techniques et morceaux de code développés et maîtrisés jusqu'ici.  

• Dans le Csound Reference Manual, cherchez les nouveaux opcodes convoqués dans les instr 120 — 127 :

kr envlpx kamp, irise, idur, idec, ifn, iatss, iatdec[, ixmod]
  print iarg[, iarg, ...]
  display xsig, iprd[, inprds][, iwtflg]
  dispfft xsig, iprd, iwsiz[, iwtyp][, idbouti][, iwtflg]

• Créez un nouvel ensemble de fonctions d'attaque envlpx , et utilisez-les dans tous les instruments. 

• Ajoutez les opcodes print, display et dispfft aux instr 123 — 127 (Mais pensez à les "mettre en commentaire" lorsque votre préoccupation est orientée sur la production du signal sonore).

Un peu de théorie sur le filtrage

Dans la prochaine étude de création sonore, nous commencerons à explorer quelques opcodes de filtrage implémentés dans Csound. Au préalable, il pourrait être utile d'examiner certains principes de base du filtrage. Les quatres catégories de filtres les plus communes sont : le passe-bas, le passe-haut, le passe-bande, et le coupe-bande. Nous voyons dans la figure 1.44 un signal composé de 12 partiels harmoniques de même intensité (a), d'abord traité par un filtre passe-bas 1 pôle (b), un filtre passe-haut 1 pôle (c), un filtre passe-bande 2 pôles (d), et un filtre coupe-bande 2 pôles (e). Les verticales en pointillées sont dans la bande rejetée du signal, et les verticales continues sont dans la bande passante. Sur chacune des courbes d'enveloppe spectrale, la fréquence de coupure est la fréquence à partir de laquelle le filtre applique une atténuation de -3 dB.   


 Figure 1.44 Un signal source (a) modifié par quatres filtres communs : tone — un filtre passe-bas 1 pôle (b), atone — un filtre passe-haut 1 pôle (c), reson — un filtre passe-bande 2 pôles (d) et areson — un filtre coupe-bande 2 pôles (e).

Dans Csound ces filtres correspondent aux opcodes tone (b), atone (c), reson (d) et areson (e). Remarquez que la ligne pointillée horizontale à -3 dB indique la fréquence de coupure du filtre. Pourquoi -3 dB? La pente du filtre étant en réalité progressive, la fréquence de coupure d'un filtre (fc) est située "quelque part sur la courbe", et a été définie comme le point, dans cette succession de fréquences, où la bande passante est atténuée de -3 dB.

Création Sonore Etude 5: Bruit, Filtres, Délais et Flangers

etude5.orc etude5.sco

Ce nouvel ensemble d'instruments utilise plusieurs modificateurs de signal implémentés dans Csound, en parallèle ou en série, pour façonner et transformer un bruit et des tables d'ondes. Dans l'instr 128 (figures 1.45 et 1.46), nous filtrons dynamiquement un "bruit blanc" produit par l'opcode rand. Les opcodes expon et line sont utilisés pour modifier de manière indépendante la fréquence de coupure et la largeur de bande du filtre passe-bande 2 pôles reson. De plus, l'opcode expseg applique une enveloppe d'amplitude globale au signal. Cette enveloppe est représentée graphiquement par l'opcode display


 Figure 1.45 Diagramme de l'instr 128, un instrument générateur de bruit passé à travers un filtre passe-bande. 

  instr 128 ; Bruit Passé à Travers Un Filtre Passe-Bande
idur = p3
iamp = p4
ifrq = p5
iatk = p6
irel = p7
icf1 = p8
icf2 = p9
ibw1 = p10
ibw2 = p11
kenv expseg .01,iatk,iamp,idur/6,iamp*.4,idur(iatk+irel+idur/6),iamp*.6,irel,.01
anoise rand ifrq
kcf expon icf1, idur, icf2
kbw line ibw1, idur, ibw2
afilt reson anoise, kcf, kbw, 2
  out afilt*kenv
  display kenv, idur
  endin

Figure 1.46 Code de l'orchestre pour l'instr 128, un instrument générateur de bruit passé à travers un filtre passe-bande, avec une fréquence de coupure et une largeur de bande variables.

Un Réseau De Filtres En Cascade

De l'instr 129 à 132 (figure 1.47), un bruit blanc (rand) est passé à travers une série de filtres passe-bas 1 pôle (tone). La contribution significative de chaque pôle supplémentaire doit apparaître clairement dans cette série d'exemples. En fait, chaque pôle accroît la pente du filtre de 6 dB par octave à partir de la fréquence de coupure. Un motif de filtres en cascade comme celui-ci accentue proportionnellement la raideur de la pente à chaque tone ajouté, produisant ainsi un filtre plus "efficace". Avec notre motif en cascade, l'instr 129 aura une pente correspondant à une atténuation de 6 dB par octave; l'instr 130 aura une pente de 12 dB par octave; l'instr 131 aura une pente de 18 dB par octave; et l'instr 132 aura une pente de 24 dB par octave. L'opcode dispfft montrera clairement, pour chaque instrument, l'effet progressif de ce filtrage sur le spectre du bruit.

  instr 129 ; Filtre Passe-Bas 1 Pôle
anoise rand ifrq
afilt tone anoise, kcut
  dispfft afilt, idur, 4096
 
  instr 130 ; Filtre Passe-Bas 2 Pôles
anoise rand ifrq
afilt2 tone anoise, kcut
afilt1 tone afilt2, kcut
  dispfft afilt1, idur, 4096
 
  instr 131 Filtre Passe-Bas 3 Pôles 
anoise rand ifrq
afilt3 tone anoise, kcut
afilt2 tone afilt3, kcut
afilt1 tone afilt2, kcut
  dispfft afilt1, idur, 4096
 
  instr 132 Filtre Passe-Bas 4 pôles
anoise rand ifrq
afilt4 tone anoise, kcut
afilt3 tone afilt4, kcut
afilt2 tone afilt3, kcut
afilt1 tone afilt2, kcut
  dispfft afilt1, idur, 4096

Figure 1.47 Extraits du code de l'orchestre pour les instr 129 — 132, un bruit blanc passé à travers une cascade de filtres passe-bas 1 pôle.

Représentations Graphiques

Depuis quelques exemples déjà, nous utilisons les opcodes display et dispfft pour visualiser les signaux. Mais que voyons nous?  Et en quoi ces opcodes sont-ils différents les uns des autres? 

Comme vous le savez, les signaux peuvent être représentés soit dans le domaine temporel, soit dans le domaine fréquentiel. En fait, ce sont des représentations complémentaires illustrant l'évolution d'un signal en amplitude et en fréquence au cours du temps. L'opcode display dessine les signaux dans le domaine temporel (sur un graphique "amplitude versus temps"), alors que l'opcode dispfft dessine les signaux dans le domaine fréquentiel en utilisant la méthode FFT (Fast Fourier Transform). Les deux nous permettent de spécifier la fréquence de la mise à jour de la représentation, et ainsi de regarder l'évolution d'un signal sur la durée d'une note, à la fois dans le domaine temporel et fréquentiel. Nous avons ainsi utilisé display dans l'instr 128 pour regarder la forme de l'amplitude d'enveloppe expseg, et voir la façon dont cette amplitude variait au cours de la note.

Dans les instr 129 — 132 nous utilisons l'opcode dispfft pour regarder la façon dont les fréquences sont "atténuées" par notre réseau de filtres. En spécifiant une valeur de 4096 pour la FFT, nous divisons la plage des fréquences en 2048 boîtes de 21.5 Hz chacune (44100/2048 = 21.533). Mais nous aurions pu choisir de diviser le spectre en 8 boîtes (avec une largeur de 5512 Hz chacune), ou toute autre valeur jusqu'à 2048 boîtes (avec une largeur de 21.5 Hz chacune). Nous continuerons à utiliser ces opcodes pour regarder dans les domaines temporel et fréquentiel les caractéristiques des sons que nos instruments produisent. L'opcode dispfft nous aidera en particulier à mieux comprendre l'effet produit par les différents filtres de Csound sur les signaux ainsi traités.

Les filtres tone et reson que nous avons utilisés jusqu'à présent étaient parmi les premiers implémentés dans Csound. Ils sont remarquables pour leur efficacité (ils calculent vite), et pour leur instabilité (ils "explosent"). De fait, il a toujours été de bon conseil de patcher la sortie de ces filtres dans l'opcode balance afin de garder les échantillons hors de la plage de conversion sous contrôle. 

Au cours des années, cependant, plusieurs nouveaux filtres ont été ajoutés au langage Csound. Au début de la synthèse analogique, ce sont les filtres qui définissaient le son de ces instruments "classiques" si rares et si convoités aujourd'hui. La famille des filtres Butterworth (butterlp, butterhp, butterbp et butterbr) sonne très bien, et prend de plus en plus de place dans les designs d'instruments. Cela s'explique en partie par le fait que les filtres Butterworth possèdent : plus de pôles (ils sont plus raides et plus efficaces dans le filtrage), une réponse en fréquence plate dans le passe-bande (ils sont particuièrement propres et lisses), et ils sont nettement plus stables (vous n'avez pas à vous inquiéter autant des échantillons hors de la plage de conversion). Dans l'instr 133 (figures 1.48 et 1.49), nous utilisons des filtres montés en parallèle, un butterbp 4 pôles et un butterlp 4 pôles, pour modéliser le "classique" filtre résonant passe-bas présent dans la plupart des synthétiseurs analogiques de première génération. 

Figure 1.48 Diagramme de l'instr 133, un butterbp et un butterlp dans une configuration parallèle, produisant un "classique" filtre résonant passe-bas.

  instr 133 ; Filtre Résonant Passe-Bas
idur = p3
iamp = ampdb(p4)
ifrq = p5
icut1 = p6
icut2 = p7
iresgn = p8
kcut expon icut1, idur, icut2
aplk pluck iamp, ifrq, ifrq, 0, 1
abpf butterbp aplk, kcut, kcut*.2
alpf butterlp aplk, kcut
amix = alpf+(abpf*iresgn)
  out amix
  dispfft amix, idur, 1024
  endin  

Figure 1.49 Code de l'orchestre pour l'instr 133, un "classique" design de filtre résonant passe-bas.

Comme vous pouvez le voir et l'entendre dans l'ensemble des exemples précédents, le contrôle dynamique des paramètres des opcodes de filtrage, combinés en série ou en parallèle, ouvre la porte à un vaste champ de possibilités de création sonore par synthèse soustractive.

Un Résonateur-Echo

Tournons nous à présent vers un autre groupe de modificateurs de signal de Csound — comb et vdelay.

Un filtre comb est essentiellement une ligne de retard avec rebouclage (figure 1.50). Comme vous pouvez le voir, le signal pénètre la ligne de retard, et sa sortie est retardée en fonction de la longueur de la ligne (25 millisecondes dans ce cas). Quand il atteint la sortie, il est réinjecté dans l'entrée, après avoir été multiplié par un facteur gain.  


 Figure 1.50 Graphique d'un filtre comb et sa réponse en fréquences.

Le temps nécessaire au signal pour faire un tour complet avant d'être réinjecté dans l'entrée est appelé le temps de boucle. Dans l'instr 135 (figures 1.51, 1.52 et 1.53), un opcode diskin est utilisé pour lire et transposer un fichier audio. Ce signal est passé ensuite dans un filtre comb. Lorsque le temps de boucle est long, nous percevons des échos discrets, mais lorsque le temps de boucle est court, le filtre comb fonctionne davantage comme un résonateur. Comme il est montré dans la figure 1.50,  la réponse en fréquences d'un filtre comb est un train d'impulsions espacées régulièrement dans le temps, séparées par le temps de boucle. La fréquence résonante de ce filtre est donc égale à 1/temps de boucle. Dans l'instr 135 elle est spécifiée en millisecondes. En commentaires, dans la partition, vous verrez les fréquences résonantes (spécifiées en Hz) produites par les différents temps de boucle (spécifiés en millisecondes). 


Figure 1.51 Diagramme de l'instr 135, un fichier audio lu directement avec diskin sans passer par une table de fonction, et un filtre comb pour retarder ou faire résoner le signal. 

  instr 135 ; DISKIN AVEC ECHO-RESONATEUR
idur = p3
iamp = p4
irvt = p5
iloopt = p6
kenv linen iamp, .01, idur, .01
ain diskin "hellorcb.aif", 1
acomb comb ain*kenv, irvt, iloopt, 0
  out ain+acomb
  endin  

Figure 1.52 Code de l'orchestre pour l'instr 135, un instrument "écho-résonateur" utilisant l'opcode comb.

; ins init dur amp gain temps de boucle fréquence résonante 
i 135 0 5 .4 10 .5 ; 1/.5 = 2 Hz
i 135 5 5 .3 5 .25 ; 1/.25 = 4 Hz
i 135 10 5 .3 5 .125 ; 1/.125 = 8 Hz
i 135 15 5 .2 2 .0625 ; 1/.0625 = 16 Hz
i 135 20 5 .2 2 .03125 ; 1/.03125 = 32 Hz
i 135 25 5 .2 2 .015625 ; 1/.015625 = 64 Hz
i 135 30 5 .04 2 .001 ; 1/.001 = 1000 Hz

Figure 1.53 Code de la partition pour l'instr 135, le temps de boucle (p6) fixe la période et la fréquence résonante de cette ligne de retard.

Bien qu'il nous soit possible de modifier le temps de boucle de l'instr 135 d'une note à l'autre, l'opcode comb utilisé dans ce design ne nous donne pas la possibilité de modifier dynamiquement ce paramètre durant le cours d'une note. Pour cela, nous employons l'opcode vdelay. Des lignes de retards variables vont nous permettre de créer un des effets les plus populaires — le "flanger".

Dans l'instr 136 (figures 1.54 et 1.55), un bruit passe à travers une série de lignes de retards variables pour produire un "flanger." En patchant la sortie d'un opcode vdelay dans l'entrée d'un autre, la force et le centre de la résonance sont accentués (à l'image de l'exemple ci-dessus utilisant l'opcode tone). De plus, ce pic de résonance parcourt rapidement le spectre des fréquences sous le contrôle d'un LFO, dont la fréquence est modifiée dynamiquement par l'opcode line.

Figure 1.54 Diagramme de l'instr 136, un vdelay "flanger."

  instr 136 ; VDELAY FLANGER
idur = p3
iamp = p4
ifrq = p5
iatk = p6
irel = p7
irat1 = p8
irat2 = p9
imsdel = p10
kenv expseg .001,iatk,iamp,idur/8,iamp*.3,idur-(iatk+irel+idur/8),iamp*.7,irel,.01
krate line irat1, idur, irat2
alfo oscil imsdel, krate/idur, 19
anoise rand ifrq
adel4 vdelay anoise, alfo, imsdel
adel3 vdelay adel4, alfo, imsdel
adel2 vdelay adel3, alfo, imsdel
adel1 vdelay adel2, alfo, imsdel
adel0 vdelay adel1, alfo, imsdel
amix = adel0+adel1+adel2+adel3+adel4
  out kenv*amix
  dispfft amix, idur, 1024
  endin

Figure 1.55 Code de l'orchestre pour l'instr 136, un instrument "flanger" avec une ligne de délai variable.

Les Déclarations De Notes Et Les Raccourcis

Il faut reconnaître que créer et éditer dans un format texte des listes de notes n'ai pas une partie de plaisir. Bien que ce soit encore un des aspects les plus ennyeux et non-musicaux du travail avec Csound, le principe du listage de notes vous permet de contrôler de manière très précise et directe le comportement de vos instruments.

Comme il a été dit au tout début de ce chapitre, Csound lit les fichiers MIDI, et cela peut se révéler être une façon plus intuitive de générer des notes, et de jouer vos instruments. Cependant, les instruments Csound doivent être conçus pour travailler avec le format MIDI, et vous aurez à adapter vos instruments "classiques" avant de pouvoir les intégrer dans un dispositif MIDI.

Bien que ce sujet ne soit pas abordé dans le Csound Book, plusieurs chapitres du CD-ROM sont dédiés au contrôle de Csound par claviers MIDI et fichiers MIDI. De fait, j'ai écrit un complément à ce chapitre intitulé An Introduction to MIDI-based Instrument Design in Csound pour le CD-ROM, et j'espère qu'il vous aidera à construire de grands instruments MIDI.

Même sans avoir recours au MIDI, Csound dispose d'une collection de Score Statements et Score Symbols (raccourcis) pour simplifier la création et l'édition des listes de notes. Comme les f-statements, ces commandes de partition commencent par une lettre spécifique, et sont parfois suivies par un ensemble d'arguments. J'emploie plusieurs d'entre eux dans l'etude5.sco.

La première commande de partition que j'utilise dans l'etude5.sco est l' Advance Statementa (figure 1.56). Cette déclaration permet d'avancer dans une partition (en spécifiant un nombre de temps) sans générer aucun échantillon. Ici, elle est utilisée pour sauter les deux premières notes, et commencer le rendu de la partition à 10 secondes à l'intérieur de la "pièce". Cette déclaration d'avance peut être particulièrement utile lorsque vous travaillez sur une composition longue et complexe, et que vous voulez en affiner une partie située au milieu ou à la toute fin. Plutôt que d'attendre le rendu de la pièce entière pour entendre la dernière note, vous pouvez avancer jusqu'à la fin et rendre seulement cette partie — vous économisant des heures et des heures. La syntaxe de la déclaration d'avance est présentée dans les commentaires de la figure 1.56.

; AVANCE SANS SENS TEMPS D'ACTIVATION DE LA COMMANDE TEMPS D'AVANCE
a 0 0 10
 
; ins init dur amp frq atk rel cf1 cf2 bw1 bw2
 
i 128 1 5 .5 20000 .5 2 8000 200 800 30
i 128 6 5 .5 20000 .25 1 200 12000 10 200
 
i 128 10 5 .5 20000 .5 2 8000 200 800 30
i 128 14 5 .5 20000 .25 1 200 12000 10 200
i 128 18 3 .5 20000 .15 .1 800 300 300 40

Figure 1.56 Extrait de la partition de l' etude5.sco comportant un advance statement.

La deuxième déclaration que j'emploie dans l'etude5.sco est la Section Statements (figure 1.57). La déclaration de section n'a pas d'arguments. Elle divise simplement une partition en sections, et vous permet en quelque sorte de remettre le compteur des temps à 0 au début de la nouvelle section. Ceci est particulièrement utile si vous voulez répéter un passage. Il suffit pour cela d'insérer un s à la fin de la première section, de copier cette section, et de la coller après le s. La figure 1.57, tirée de l'etude5.sco, montre exactement cela.

; ins init dur amp frq atk rel cut1 cut2
 
i 129 0 1.5 3 20000 .1 .1 500 500
i 130 2 1.5 3 20000 .1 .1 500 500
i 131 4 1.5 3 20000 .1 .1 500 500
i 132 6 1.5 3 20000 .1 .1 500 500
i 129 8 1.2 1 20000 .01 .01 5000 40
i 130 11 1.2 1 20000 .01 .01 5000 40
i 131 12 1.2 1 20000 .01 .01 5000 40
i 132 13 1.2 1 20000 .01 .01 5000 40
s
; ins init dur amp frq atk rel cut1 cut2
 
i 129 0 1.5 3 20000 .1 .1 500 500
i 130 2 1.5 3 20000 .1 .1 500 500
i 131 4 1.5 3 20000 .1 .1 500 500
i 132 6 1.5 3 20000 .1 .1 500 500
i 129 8 1.2 1 20000 .01 .01 5000 40
i 130 11 1.2 1 20000 .01 .01 5000 40
i 131 12 1.2 1 20000 .01 .01 5000 40
i 132 13 1.2 1 20000 .01 .01 5000 40
s

Figure 1.57 Le coupé-collé d'une section, extrait de la partition de l'etude5.sco, comportant une section statement.

La troisième déclaration de partition que j'utilise dans l'etude5.sco est la Dummy f-statementf 0 (figure 1.58). Dans Csound vous pouvez utiliser la partition pour charger des tables de fonctions (f-tables) à n'importe quel moment. Vous pouvez ainsi remplacer la nature d'une forme d'onde ou d'un sample durant le cours d'un morceau, tout en conservant le même numéro de table dans l'orchestre. Vous pouvez aussi charger une table muette (f 0) pour prolonger la longueur d'une section particulière, ou pour insérer un silence entre deux sections. Dans la figure 1.58, j'utilise une déclaration f 0 pour introduire deux secondes de silence entre deux sections.

; ins init dur amp frq atk rel cut1 cut2
 
i 129 0 1.5 3 20000 .1 .1 500 500
i 130 2 1.5 3 20000 .1 .1 500 500
i 131 4 1.5 3 20000 .1 .1 500 500
i 132 6 1.5 3 20000 .1 .1 500 500
i 129 8 1.2 1 20000 .01 .01 5000 40
i 130 11 1.2 1 20000 .01 .01 5000 40
i 131 12 1.2 1 20000 .01 .01 5000 40
i 132 13 1.2 1 20000 .01 .01 5000 40
 
s
f 0 2 ; DECLARATION DE TABLE MUETTE F0 - 2 SECONDES DE SILENCE ENTRE LES SECTIONS
s
 
; ins init dur amp frq atk rel cf1 cf2 bw1 bw2
 
i 128 0 5 .5 20000 .5 2 8000 200 800 30
i 128 4 5 .5 20000 .25 1 200 12000 10 200
i 128 8 3 .5 20000 .15 .1 800 300 300 40
i 128 10 11 .5 20000 1 1 40 90 10 40
s

Figure 1.58 Extrait de la partition de l'etude5.sco convoquant un dummy f0 statement qui introduit 2 secondes de silence entre deux sections.

Le quatrième ensemble de raccourcis que j'emploie dans l'etude5.sco comprend le Carry, le Ramp et le + Symbols (figure 1.59). Le symbole carry ( . ) copie la valeur d'un paramètre propre à une note à la note suivante. Le symbole ramp ( < ) interpole linéairement entre deux valeurs d'un même paramètre, sur un nombre quelconque de notes (le nombre de notes détermine le nombre de points créés par interpolation). Le symbole + est réservé au p-field p2. Il calcule automatiquement le temps de commencement de la note courante, en additionnant le temps de commencement et la durée de la note précédente (p2 + p3). Ainsi la note courante suivra directement la précédente, sans chevauchement et sans temps mort. Ces trois symboles sont utilisés dans la figure 1.59, et les valeurs correspondantes rendues claires dans la figure 1.60.

; ins init dur ampdb frq fc1 fc2 reson gain
 
i 134 0 .1 90 8.09 8000 80 1
i . + . < 8.095 < < <
i . . . . 8.10 . . .
i . . . . 8.105 . . .
i . . . . 8.11 . . .
i . . . . 8.115 . . .
i . . . . 9.00 . . .
i . . . . 9.005 . . .
i . . . . 9.01 . . .
i . . . . 9.015 . . .
i . . . 80 9.02 9000 60 50

Figure 1.59 Extrait de la partition de l'etude5.sco convoquant les symboles carry ( . ), p2 increment ( + ), et ramp ( < ).

; ins init dur ampdb frq fc1 fc2 reson gain
 
i 134 0 .1 90 8.09 8000 80 1
i 134 .1 .1 89 8.095 8100 78 5
i 134 .2 .1 88 8.10 8200 76 10
i 134 .3 .1 87 8.105 8300 74 15
i 134 .5 .1 86 8.11 8400 72 20
i 134 .5 .1 85 8.115 8500 70 25
i 134 .6 .1 84 9.00 8600 68 30
i 134 .7 .1 83 9.005 8700 66 35
i 134 .8 .1 82 9.01 8800 64 40
i 134 .9 .1 81 9.015 8900 62 45
i 134 1 .1 80 9.02 9000 60 50

Figure 1.60 Une autre vue de l'extrait de l'etude5.sco de la figure 1.59 , dans lequel les symboles ramp ( < ), carry ( . ) et + sont remplacés par les valeurs réelles qu'ils représentent.

La dernière déclaration de partition que j'emploie dans l'etude5.sco est la Tempo Statementt (figure 1.61). L'horloge de la partition de Csound fonctionne à 60 battements par minute. C'est la fréquence par défaut que Csound utilise, qui équivaut à une déclaration de  t 0 60. Cela signifie que lorsque vous spécifiez une durée de 1 dans p3, la note durera une seconde. Par chance, la déclaration de tempo vous permet de modifier cette valeur par défaut, soit par une constante, soit par une variable. La figure 1.61 illustre les deux possibilités.

La déclaration de tempo  t 0 120 fixera un tempo constant de 120 battements par minute. L'horloge interne de Csound tournera deux fois plus vite, et toutes les valeurs de temps inscrites dans la partition seront divisées de moitié.

La déclaration de tempo t 0 120 1 30 est utilisée pour appliquer un tempo variable. Dans ce cas le tempo est fixé à 120 au temps 0, et en 1 seconde il atteint par paliers la nouvelle valeur de 30. Il va sans dire que l'utilisation d'un tempo variable rend vos partitions beaucoup moins mécaniques et plus "musicales".

; t 0 120 ; DECLARATION DE TEMPO FIXE : DEUX FOIS PLUS RAPIDE QUE LE TEMPO PAR DEFAUT
 
; ins init dur ampdb frq fc1 fc2 reson gain
 
i 134 0 .1 90 8.09 8000 80 1
i . + . < 8.095 < < <
i . . . . 8.10 . . .
i . . . . 8.105 . . .
i . . . . 8.11 . . .
i . . . . 8.115 . . .
i . . . . 9.00 . . .
i . . . . 9.005 . . .
i . . . . 9.01 . . .
i . . . . 9.015 . . .
i . . . 80 9.02 9000 60 50
s
; t 0 120 1 30 ; TEMPO VARIABLE : DEUX FOIS MOINS RAPIDE QUE LE TEMPO PAR DEFAUT
 
; ins init dur ampdb frq fc1 fc2 reson gain
 
i 134 0 .1 90 8.09 8000 80 1
i . + . < 8.095 < < <
i . . . . 8.10 . . .
i . . . . 8.105 . . .
i . . . . 8.11 . . .
i . . . . 8.115 . . .
i . . . . 9.00 . . .
i . . . . 9.005 . . .
i . . . . 9.01 . . .
i . . . . 9.015 . . .
i . . . 80 9.02 9000 60 50
s

Figure 1.61 Extrait de la fin de l'etude5.sco dans lequel le tempo statement est utilisé à la fois sur le mode fixe et sur le mode variable.

Elaborer ses partitions Csound dans le format texte peut être extrêmement laborieux. Cela à pousser beaucoup d'étudiants à apprendre le langage de programmation C, afin de générer leurs listes de notes algorithmiquement. Le temps-réel et le MIDI sont une solution. Mais en recourant aux raccourcis, vous pouvez rendre votre travail beaucoup plus simple, et rendre vos gestes, phrases et textures beaucoup plus expressifs.

Exercises Pour l'Etude 5

• Rendez les fichiers "orchestre" et "partition" : etude5.orc & etude5.sco.

• Jouez et écoutez les qualités sonores des différents filtres et configurations de filtres.

• Dans le Csound Reference Manual, cherchez et lisez les informations concernant les nouveaux opcodes utilisés dans les instr 128 — 136.

• Dans l'instr 128, substituez l'opcode loscil par un opcode rand , et filtrez dynamiquement quelques-uns de vos samples.

• Dans l'instr 128, substituez un butterbp pour un reson , et écoutez la différence de qualité.

• Substituez les filtres butterlp par des filtres tone dans les instr 129 — 132. Comparez l'"efficacité" de ces filtres.  

• Transformez l'instr 133 en un instrument possédant un filtre résonant passe-haut.

• Elaborez un instrument qui combine le motif de filtres en série de l'instr 132 avec le motif de filtres en parallèle de l'instr 133.

• Dessinez le diagramme de l'instr 134, un instrument possédant une ligne de retard (non abordé dans le texte).

• En ajoutant davantage d'opcodes delay transformez l'instr 134 pour en faire un instrument possédant une ligne de retard "multi-tap".

• Modifiez l'instr 135 pour en faire un résonateur multi-bandes.

• Ajoutez davantage de combs et vdelays à l'instr 135, et créez une ligne de retard complexe (multi-tap).

• En utilisant les déclarations de partition abordées dans cette section, retournez aux études 3 et 4. Répétez alors quelques sections, insérez des silences, variez le tempo au cours des sections, utilisez les déclarations advance et ramp pour explorer davantage l'étendue des possibilités offertes par ces instruments.

• Dans l'instr 136, substitutez l'opcode diskin par l'opcode rand , et "flangez" vos samples.

• Dans l'instr 136, ajoutez et testez pour votre oscillateur des contrôles dynamiques de fréquence et d'amplitude différents.

• Changez les formes d'onde de l'oscillateur de contrôle dans l'instr 136. (Essayez randh!)

• Ajoutez un filtre résonant passe-bas à votre instrument modifié "flanger".

• Faites une ballade, et écoutez le monde.

Les Variables Globales

Jusqu'à présent, nous avons utilisé uniquement les variables locales i-rate, k-rate et a-rate. Elles appartiennent à un instrument. Vous pouvez utiliser le même nom de variables locales dans plusieurs instruments successifs sans corrompre vos données asig ou amix, et sans provoquer d'interférences entre les différents signaux. En fait, les délimiteurs instr et endin isolent réellement les blocs des signaux traités les uns des autres — même s'ils possèdent exactement les mêmes "labels" et noms d'arguments.

Cependant, vous voudrez parfois faire communiquer les instruments entre eux, et faire passer par exemple un instrument de synthèse dans un instrument de réverbération. Le signal va circuler alors comme il le ferait à partir d'une console de mixage, qui envoit le signal vers les unités d'effets en utilisant le canal des effets "sends" et le canal des effets "returns". Dans Csound, cette opération est réalisée par l'emploi de variables globales, qui sont accessibles par l'ensemble des instruments. Et comme pour les variables locales, les variables globales peuvent être mises à jour à l'un des quatre taux de base : setup, gi, gk et ga, où :

les variables gi-rate sont modifiées et mises à jour à chaque nouvelle note. 

les variables gk-rate sont modifiées et mises à jour au taux de contrôle.

les variables ga-rate sont modifiées et mises à jour au taux audio.

Appartennant à la fois à tous les instruments et à aucun, les variables globales doivent être initialisées. Une variable globale est généralement initialisée dans l'instrument 0 et "remplie" à l'intérieur d'un instrument local. Où se trouve ce mystérieux "instrument 0"? En fait, cet instrument 0 se situe entre la section d'entête et la déclaration du premier instrument de l'orchestre, et se limite aux lignes définissant les différentes variables globales. Dans la figure 1.62, immédiatement après l'entête, dans l'instrument 0, les variables gacmb et garvb (nos 2 bus d'effets globaux) sont nettoyées et initialisées à 0.

sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
 
 
gacmb init 0
garvb init 0
 
 
  instr 137

Figure 1.62 Les deux variables globales gacmb et garvb sont initialisées dans l'instrument 0 après l'entête et avant le premier instrument.

Création sonore Etude 6: Réverbération et Panoramique

etude6.orc etude6.sco

Définissons les variables globales à utiliser, et ajoutons un traitement "externe" pour nos instruments.

A partir de l'instr 137 (figures 1.63 et 1.64), le signal sec de loscil est ajouté (mixé) avec le signal traité sur un bus séparé de réverbération et d'écho.

asig loscil kenv, ifrq, ifun
  out asig
garvb = garvb+(asig*irvbsnd)
gacmb = gacmb+(asig*icmbsnd)

Notez que le signal sec est encore envoyé directement, en utilisant l'opcode out, comme nous l'avons fait depuis le début. Mais ensuite ce même signal est passé globalement dans deux autres instruments, l'instr 198 (un écho) et l'instr 199 (une réverbération), comme il est montré dans les figures 1.63 et 1.64.

Figure 1.63 Diagramme des instr 137, 198 et 199, un instrument de synthèse à table d'onde (instr 137) et deux effets globaux (instr 198 et 199).

  instr 137 ; LOSCIL ET GLOBAL REVERB/COMB 
idur = p3
iamp = ampdb(p4)
ifrq = cpspch(p5)
ifun = p6
iatk = p7
irel = p8
irvbsnd = p9
icmbsnd = p10
kenv linen iamp, iatk, idur, irel
asig loscil kenv, ifrq, ifun
  out asig
garvb = garvb+(asig*irvbsnd)
gacmb = gacmb+(asig*icmbsnd)
  endin
 
  instr 198 ;  ECHO GLOBAL
idur = p3
itime = p4
iloop = p5
kenv linen 1, .01, idur, .01
acomb comb gacmb, itime, iloop, 0
  out acomb*kenv
gacmb = 0
  endin
 
  instr 199 ;  REVERB GLOBALE
idur = p3
irvbtim = p4
ihiatn = p5
arvb nreverb garvb, irvbtim, ihiatn
  out arvb
garvb = 0
  endin

Figure 1.64 Code de l'orchestre pour les trois instruments qui opèrent ensemble pour ajouter à un opcode qui lit en boucle des échantillons (instr 137) une réverbération (instr 199) et un écho (instr 198).

Il est important de noter que dans le fichier partition (figure 1.65), ces trois instruments doivent être activés. Pour éviter des bruits transitoires et artefacts, les instruments globaux sont habituellement laissés en activité pour la durée entière de la section, et les variables globales sont toujours nettoyées quand l'instrument récepteur est désactivé (gacmb = 0 et garvb = 0).

; ins strt dur rvbtime diffusion hautes fréquences
i 199 0 12 4.6 .8
 
; ins strt dur time temps de boucle(loop)
i 198 0 6 10 .8
i 198 0 6 10 .3
i 198 0 6 10 .5
 
; ins strt dur amp frq1 sample atk rel rvbsnd cmbsnd
i 137 0 2.1 70 8.09 5 .01 .01 .3 .6
i 137 1 2.1 70 8.09 5 .01 .01 .5 .6

Figure 1.65 Le fichier partition pour notre instrument global "comb/nreverb /loscil". L'instrument global nreverb, instr 199 est activé au commencement de la partition pour la durée entière du passage. Trois copies de notre instrument global comb, instr 198 sont activées simultanément avec des temps de boucle différents. Pour finir, deux copies de notre instrument loscil, instr 137 commencent l'un après l'autre.

Notre prochain instrument, l'instr 138 (figures 1.66 et 1.67), est basé sur un modèle FM utilisé précédemment, mais ici l'instrument est développé, de telle sorte à pouvoir appliquer un panoramique au signal.

Figure 1.66 Diagramme de l'instr 138, un instrument FM dynamique avec un panoramique et une réverbération globale.


instr 138
idur = p3
iamp = ampdb(p4)
ifrq = cpspch(p5)
ifc = p6
ifm = p7
iatk = p8
irel = p9
indx1 = p10
indx2 = p11
indxtim = p12
ilfodep = p13
ilfofrq = p14
ipan = p15
irvbsnd = p16
kampenv expseg .01,iatk,iamp,idur/9,iamp*.6,idur/(iatk+irel+idur/9),iamp*.7,irel,.01
klfo oscil ilfodep, ilfofrq, 1
kindex expon indx1, indxtim, indx2
asig foscil kampenv, ifrq+klfo, ifc, ifm, kindex, 1
  outs asig*ipan, asig*(1-ipan)
garvb = garvb+(asig*irvbsnd)
  endin

Figure 1.67 Code de l'orchestre pour l'instr 138, un instrument FM dynamique avec un vibrato, un panoramique discret et une réverbération globale.

Remarquez que dans l'instr 138, le panoramique est réalisé avec une simple variable qui fonctionne comme un bouton de panoramique sur une console de mixage traditionnelle. Comment cela est-il réalisé?

Comme vous le savez à présent, si nous multiplions un signal par une échelle de valeurs allant de 0 à 1, nous contrôlons en réalité l'amplitude de ce signal entre 0 et 100%. Donc, si nous multiplions simultanément un signal par une échelle et son contraire (0.2 et 0.8 par exemple), nous obtenons deux sorties dont les amplitudes peuvent aller de 0 à 100%, mais qui demeurent inversement proportionnelles.

Par exemple, si l'échelle est fixée à 1, et que notre sortie gauche prenne la valeur de 1, nous aurons 100% de notre signal à la gauche, et 0% (1-1) à droite. Maintenant, si la sortie gauche prend la valeur de 0.2, alors nous aurons 20% de notre signal à gauche, et 80% (1 - 0.2) à droite. Cet algorithme fournit un moyen simple de contrôler la répartition gauche/droite d'un signal avec une seule valeur. Il est utilisé dans l'instr 138.orc et instr 138.sco , et illustré dans les figures 1.66 et 1.67.

Le fichier etude6.orc contient quatre instruments additionnels "globo-spatiaux". Ils sont tous basés sur ceux présentés dans les études précédentes. Vous devez reconnaitre les algorithmes. Mais tous ont été pourvus d'une fonction de panoramique et d'une réverbération globale. Je vous invite à dessiner les diagrammes de ces instruments, et à les étudier. Chacun applique une méthode différente pour réaliser un panoramique et une réverbération. Je vous invite aussi à reprendre tous les instruments que nous avons étudiés jusqu'à présent, et de leur ajouter une fonction de panoramique et une réverbération globale.

Pour clore ce chapitre, je vais présenter l' instr 141.orc et instr141.sco (figures 1.68 et 1.69), qui adaptent un modèle de modulation d'amplitudes rencontré précédemment, et ajoute un panoramique basé sur un LFO, et une réverbération globale.


Figure 1.68 Diagramme de l'instr 141, un instrument AM (modulation d'amplitude) avec un panoramique LFO et une réverbération globale.

  instr 141 ; AM PANORAMIQUE LFO
idur = p3
iamp = ampdb(p4)
ifrq = cpspch(p5)
ifun = p6
iatk = p7
irel = p8
iatkfun = p9
imodpth = p10
imodfrq = p11
imodfun = p12
ipanfrq = p13
irvbsnd = p14
kenv envlpx iamp, iatk, idur, irel, iatkfun, .7, .01
kpan oscil .5, ipanfrq, 1
klfo oscil imodpth, imodfrq, imodfun
asig oscil klfo*kenv, ifrq, ifun
kpanlfo = kpan+.5

outs asig*kpanlfo, asig*(1-kpanlfo)
garvb = garvb+(asig*irvbsnd)
  endin  

Figure 1.69 Code de l'orchestre pour l'instr 141, un instrument AM (modulation d'amplitude) avec un panoramique LFO et une réverbération globale.

Remarquez que l'amplitude du panoramique LFO est fixée à 0.5. Cela signifie que la plage de cette onde bipolaire s'étend de -0.5 à +0.5. Remarquez alors que je modifie le centre de ce signal bipolaire en lui ajoutant 0.5 (kpanlfo = kpan + .5). Le signal devient ainsi unipolaire! L'onde prend différentes valeurs entre 0 et 1, avec son centre à 0.5. Et cela n'est-il pas ce dont nous avons besoin pour notre "bouton de panoramique", des valeurs allant de 0 à 1 ? Des enveloppes de panoramique, des oscillateurs de panoramique, et des panoramiques aléatoires peuvent tous être réalisés en appliquant cette simple solution!

Exercises Pour l'Etude 6

etude6.orc etude6.sco

• Ecrivez un ensemble de courtes études "musicales" en utilisant vos instruments Csound, modifiés au cours de ce chapitre, et envoyez-les moi à : rboulanger@berklee.edu.

Conclusion

Dans ce chapitre introductif, j'ai essayé de présenter la syntaxe du langage Csound, tout en abordant quelques notions de création sonore. Avec ces connaissances de base, les chapitres suivants rédigés par les meilleurs professeurs, créateurs de sons, programmateurs et compositeurs, vous révèleront les pouvoirs cachés de Csound, et vous aideront à trouver les richesses qui s'y trouvent. Sur ce chemin, j'espère sincèrement que vous ne découvrirez pas seulement des nouvelles sonorités exquises, mais que votre travail avec Csound vous apportera à la fois une meilleure compréhension de vos synthétiseurs-machines et une meilleure appréciation et conscience de la nature et de l'esprit du son musical...le langage de l'âme.

Références

Cage, J. 1976. Silence. Middletown, CT: Wesleyan University Press.

Chadabe, J. 1997. Electric Sound: The Past and Promise of Electronic Music. New York: Prentice Hall.

De Poli, G., A. Piccialli, and C. Roads. 1991. Representations of Musical Signals. Cambridge, MA: M.I.T. Press.

De Poli, G., A. Piccialli, S. T. Pope, Stephen and C. Roads. 1997. Musical Signal Processing. The Netherlands: Swets and Zeitlinger.

Dodge, C. and T. Jerse. 1997. Computer Music. 2nd rev. New York: Schirmer Books.

Eliot, T.S. 1971. Four Quartets. New York: Harcourt Brace & Company.

Mathews, Max V. 1969. The Technology of Computer Music. Cambridge, MA: M.I.T. Press.

Mathews, Max V. and J. R. Pierce. 1989. Current Directions in Computer Music Research. Cambridge, MA: M.I.T. Press.

Moore, R. F. 1990. Elements of Computer Music. New York: Prentice Hall.

Pierce, J. R. 1992. The Science of Musical Sound. 2nd rev. edn. New York: W. H. Freeman.

Pohlmann, Ken C. 1995. Principles of Digital Audio. 3d edn. New York: McGraw-Hill.

Roads, C. 1989.The Music Machine. Cambridge, MA: M.I.T. Press.

Roads, C. 1996. The Computer Music Tutorial. Cambridge, MA: M.I.T. Press.

Roads, C. and J. Strawn. 1987. Foundations of Computer Music. 3d edn. Cambridge, MA: M.I.T. Press.

Steiglitz, K. 1996. A Digital Signal Processing Primer. Reading, MA: Addison-Wesley.






traduction de laurent pessin     /mars 2005/    laurent.pessin@free.fr