OpenMusic et CSound: interaction avancée
Nous avons vu dans le premier article la façon de contrôler un orchestre CSound élémentaire et produire un score assez complexe.
Dans le deuxième article, nous avons ajouté des effets: réverb et delay. Nous avons appris à les rendre vraiment stéréo.
Nous avons évalué la façon dont le contrôle par OpenMusic change la façon de pratiquer CSound en utilisant des orchestres simples et en produisant des scores complexes.
Nous allons aujourd’hui améliorer encore l’orchestre en lui ajoutant une composante de bruit contrôlable par OpenMusic via le score.
Nous allons ensuite ajouter une fonction de filtrage qui sera entièrement contrôlable par OpenMusic c’est à dire comportant comme paramètres: l’enveloppe, la fréquence de coupure et la largeur de bande.
Une composante de bruit
Voici le nouveau patch:
Il apparait d’abord, au centre du patch, que le fichier texte permettant d’afficher le score calculé par OpenMusic et ne servant jusqu’à présent qu’à vérifier et débugger celui-ci est à présent inséré dans la chaine et connecté à csound-synth. Ceci permet, lorsque l’écriture du score est dépendante de processus aléatoires, ce qui est largement le cas ici, d’éditer le score à tel ou tel endroit tout en gardant ce qui mérite de l’être. C’est ici que l’aléatoire prend toute sa dimension heuristique(qui donne des idées), on peut changer seulement des détails si l’ensemble du résultat nous plait, ou l’inverse, bien entendu. Des idées précises peuvent naître du hasard et l’on n’est plus obligé de tout accepter ou refuser en bloc. Le textfile est automatiquement verrouillé lorsqu’on le quitte.
On voit également que le patch a gagné trois nouvelles boîtes et une courbe bpf.
Ces boites: osc-noise ratio, bwnoise, envelnoise contrôlent respectivement la balance oscillateur/bruit via la courbe bpf, la largeur de bande du bruit et son enveloppe qui sera choisie parmi les enveloppes déjà disponibles pour l’oscillateur mais dans un ordre différent.
Je vais détailler chacune d’elles:
Osc-noise ratio
La courbe bpf connectée à la deuxième entrée du sous-patch détermine l’évolution de la balance entre oscillateur et bruit sur toute la durée de la séquence.
Elle est suffisamment simple pour se passer d’autres commentaires.
Bwnoise
Ici c’est la largeur de bande du bruit, centrée sur la fréquence de chaque note, qui est calculée aléatoirement entre les valeurs 0.05 et 0.5 exprimées en pourcentage de la fréquence centrale.
Envelnoise
Ce sous-patch est le même que choix enveloppes qui détermine l’enveloppe de chaque son d’oscillateur. Comme le tirage est soumis au hasard les enveloppes du bruit seront donc différentes de celles de l’oscillateur.
Il faut noter également que l’indexation des enveloppes commence ici à 50 et ceci pour laisser un peu de place à d’éventuelles tables d’ondes indexées de 1 à 49. Je vais revenir sur cette indexation dans la boîte enveloppes.
Pour le reste, il y a, en fait, beaucoup de boites qui ont été modifiées depuis le patch précédent, les voici.
Wave
Le sous-patch wave a changé dans ses valeurs plus que dans son principe.
Il calcule maintenant 96 partiels avec une inharmonicité de 1.15. La phase de chaque partiel est tirée au hasard entre 0 et 360° et, détail important, la table ainsi générée comporte maintenant 65536 points contre 1024 dans les articles précédents. La résolution est 65 fois plus importante. Entendez-vous la différence? Elle est importante. A noter que ce paramètre n’accepte que des puissances de 2: (1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 etc…). N’hésitez pas à mettre des valeurs hautes (au moins 16384) nos machines actuelles ont bien assez de mémoire disponible.
Votre son n’en sera que meilleur…
Enveloppes
Rien de différent ici, c’est surtout la boucle omloop d’attribution de n° aux tables d’enveloppes qui a changé comme expliqué plus haut.
Il n’y a finalement que trois valeurs ayant changé, c’est l’index de départ des tables d’enveloppes qui passe maintenant à 50, il était auparavant à 2. Ceci permet à d’éventuelles tables d’ondes(waves) de venir se ranger entre 1 et 49 dans un esprit d’ergonomie.
Le nombre de points à également changé dans pargen57 et dans table pour passer à 8193 ce qui donne une résolution plus fine aux tables d’enveloppes.
On peut noter que les tables d’enveloppes ont moins besoin de résolution fine que les tables d’ondes.
Onsets
On reste identique dans le principe par rapport aux précédents articles. Maintenant, une note est générée toutes les trois secondes avec un perturbation de 20%. La liste est ensuite ordonnée par valeurs ascendantes. Mais ça n’est pas absolument nécessaire.
61 notes sont générées pour une durée totale approximative de 215 secondes avec les résonances de réverb et delay.
Durs
Les durées de chaque note seront choisies dans une liste de 5 valeurs. On peut en rajouter d’autres. En secondes bien entendu comme toutes les durées dans CSound.
Pitchs
On génère une liste faite principalement de tierces majeures et mineures (3 3 3 3 3 -3 -3 -3 -3 4 4 4 4 4 -4 -4 -4 -4 5). Chaque valeur est tirée aléatoirement dans cette liste.
Elles sont ensuite ordonnées et converties en hauteurs à partir de la note 24 qui correspond à un Do0. Ces valeurs MIDI sont ensuite converties en Hertz puis permutées aléatoirement pour leur ordre d’apparition. Un filtre, exprimé en Hertz, permet de recentrer les valeurs hors limites. Des bpf permettent d’évaluer la composition des listes à différentes étapes.
Amps
Les amplitudes sont tirées aléatoirement à gauche. Si l’on veut un mouvement des amplitudes déterminé « en arche » on peut connecter la sortie de om-scale à la sortie du patch.
Choix enveloppes
Ici rien n’a changé si ce n’est l’index de départ des tables d’enveloppe comme expliqué plus haut.
Il faut juste ne pas oublier d’ajuster la valeur.
Les patches et n’ont pas changé si ce n’est l’étendue des valeurs qui va de 0.0 à 1.0 en entrée de om-random dans les deux patches.
Orchestre
C’est principalement l’orchestre CSound qui a changé:
sr= 44100
kr= 44100
ksmps= 1
nchnls= 2
;;; Initialisation du bus Reverb en stéréo
gaverbl init 0 ; réverb canal gauche
gaverbr init 0 ; réverb canal droit
girevsend = 0 ; parametre global d’envoi dans la réverb utilisé par le delay
;;; Initialisation du bus Delay en stéréo
gadell init 0 ; delay
gadelr init 0 ; delay
instr 1
iamp = p4
ifq = p5
ipan = p6
ienv = p7
irev = p8
idel = p9
iampratio= p10
iampn= iamp*iampratio
iamps= iamp*(1-iampratio)
ibwn = p11*ifq
ienvn= p12
girevsend = irev*2
;;décliquage
idampattack = .003
idamprelease = .005
iduration = p3
p3 = iduration + idampattack + idamprelease
adamping linseg 0.0, idampattack, 1.0, iduration, 1.0, idamprelease, 0.0
idur = p3
; oscillateur
k1 oscil1 0, 1 ,idur,ienv
asig oscili iamps,ifq,1
asig = asig*k1
; noise component
kn oscil1 0, 1 ,idur,ienvn
anoise rand iampn ; white noise
asign = anoise*kn*0.6 ; enveloppe
;filtrage
asigmix = asig+asign
asigtot reson asigmix, ifq, ibwn,0 ; filter
asigtot balance asigtot, asigmix ; normalisation du niveau
; mixage et pan
asigl = asigtot*ipan*adamping ; décliquage par adamping
asigr = asigtot*(1-ipan)*adamping ; décliquage par adamping
outs asigl,asigr
gaverbl = gaverbl + (asigl*irev) ; reverb send gauche
gaverbr = gaverbr + (asigr*irev) ; reverb send droit
gadell = gadell + (asigl*idel) ; delay send
gadelr = gadelr + (asigr*idel) ; delay send
endin
;***** GLOBAL DELAY INSTRUMENT *****
instr 100
kDelaydecay init .5 ; feedback
iDelaytime init 1.3 ; délai en secondes
aSigl delayr iDelaytime
aSigr delayr iDelaytime
delayw kDelaydecay * (gadell + aSigl)
delayw kDelaydecay * (gadelr + aSigr)
asgdell = aSigl + gadell
asgdelr = aSigr + gadelr
asigdell dcblock2 asgdell ; décliquage
asigdelr dcblock2 asgdelr ; décliquage
gaverbl = gaverbl + (asigdell*girevsend) ; reverb send gauche
gaverbr = gaverbr + (asigdelr*girevsend) ; reverb send droit
ipresence = 0.5
outs asigdell*ipresence, asgdelr*ipresence ; signal direct du delay controlé par le paramètre ipresence
gadell = 0
gadelr = 0
endin
;;;*****REVERB SEAN COSTELLO*****
instr 101
denorm gaverbl
denorm gaverbr
arvl, arvr reverbsc gaverbl, gaverbr, 0.85, 12000, sr, 0.5, 1
arevl dcblock2 arvl ; décliquage
arevr dcblock2 arvr ; décliquage
outs arevl, arevr
clear gaverbl
clear gaverbr
endin
Il a, en fait, nettement maigri en raison de l’utilisation de la réverb sous forme d’opcode. C’est comme si tout l’instrument réverb du patch précédent était réduit à une seule ligne: arvl, arvr reverbsc gaverbl, gaverbr, 0.85, 12000, sr, 0.5, 1.
Cet effet quasi légendaire qui est certainement la réverb la plus convaincante qu’on puisse trouver dans CSound à été conçu par Sean Costello et utilisé durant des années par des milliers de CSounders. Il a été, plus récemment compilé sous la forme de l’opcode reverbsc par Istvan Vargas.
On voit que la composante de bruit est filtrée par la fonction reson(filtre résonnant) et que les deux signaux (oscillateur et bruit) sont additionnés et placés dans la stéréo par les variables asigl et asigr.
La machine à Delay passe maintenant dans la réverb pour éviter son charactère trop cru et empécher qu’elle n’écrase l’ensemble. On peut toujours la rendre plus présente à l’aide du paramètre ipresence dans l’orchestre.
Je ne détaillerai pas plus le fichier orchestre, on peut le modifier à volonté mais il me semble plus intéressant, dans un premier temps, de travailler sur le score. On s’aperçoit, en effet, à chaque rendu du fichier audio, qu’on obtient un assez grand nombre de sons différents, au regard de la simplicité de l’orchestre. Un travail intéressant, parmi tant d’autres, serait donc de dupliquer le textfile du score, d’ouvrir cette copie et de ne garder que les lignes correspondant à des évènements à notre goût. On recommence et l’on se retrouve, au bout d’un certain temps avec une collection d’objets sonores sous forme de scores. Il suffira ensuite de les combiner en un seul, en éditant les onsets et peut-être le reste des paramètres. Cette façon d’opérer nous permet de ne pas entièrement nous livrer au hasard et d’apprendre à connaître notre patch CSound.
Jean-Michel Darrémont
Liens
- CSound, un incroyable système de synthèse sonore mon précédent article en introduction à CSound
- Site Officiel de CSound Téléchargement gratuit, FAQs, manuels, examples de codes, programmes graphiques associés, etc… La mailing list et son archive est un bon endroit pour trouver des informations détaillées.
- Open Music Home le site d’OM et de l’Équipe de Représentations Musicales de l’IRCAM
- Téléchargement d’OPEN MUSIC logiciel gratuit y compris la librairie OM2CSound