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
=
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
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 Statement — a (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 Statement — s (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-statement — f 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 Statement — t (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.
ar
rand
xamp[, iseed]
ar
tone
asig, khp[,
istor]
ar
butterlp
asig, kfreq[,
iskip]
ar
butterbp
asig, kfreq,
kband[, iskip]
ar
delayr
idlt[, istor]
ar
comb
asig, krvt,
ilpt[, istor]
ar
vdelay
asig, adel,
imaxdel [, iskip]
a1[,
a2[,
diskin
ifilcod, kpitch[,
iskiptim][, iwraparound][, iformat]
a3,
a4]]
• 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
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
• 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.
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.