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
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 0. f 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.
ar
oscil
xamp,
xcps,
ifn[,
iphs]
ar
foscil
xamp,
kcps,
kcar,
kmod,
kndx,
ifn[,
iphs]
ar
buzz
xamp,
xcps,
knh,
ifn[,
iphs]
ar
pluck
kamp,
kcps,
icps,
ifn,
imeth[,
iparm1,
iparm2]
ar
grain
xamp,
xpitch,
xdens,
kampoff,
kpitchoff,
kgdur,
igfn,
iwfn,
imgdur
ar
loscil
xamp,
kcps,
ifn[,
ibas][,
imod1,
ibeg1,
iend1][,
imod2,
ibeg2,
iend2]
• 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
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
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 :
kr
linen
kamp,
irise,
idur,
idec
ar
linen
xamp,
irise,
idur,
idec
kr
line
ia,
idur1,
ib
kr
expon
ia,
idur1,
ib
kr
linseg
ia,
idur1,
ib[,
idur2,
ic[...]]
kr
expseg
ia,
idur1,
ib[,
idur2,
ic[...]]
• 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
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