Le contrôle et l’audio

Précédent Sommaire Suivant

Les générateurs unitaires (Ugens) sont des commandes de traitement ou de génération du signal. Les signaux peuvent être de l’audio, mais aussi du contrôle. Suivant les possibilités des générateurs cette différentiation s’effectue en ajoutant la méthode ar pour l’audio ou la méthode kr pour le contrôle. Par exemple, SinOsc génère des signaux audio et de contrôle, alors que MouseX ne produit que du contrôle. L’utilisation d’un signal audio à la place d’un signal de contrôle n’altérera pas le fonctionnement d’un code, mais augmentera sa consommation de calcul lors de son exécution. Dans l’interface de programmation pour accéder directement à la documentation d’une commande, positionnez le curseur sur son texte et appuyez sur Ctrl + d.

(
{
var vibrato = SinOsc.kr( MouseX.kr(0, 10), mul: MouseY.kr(0.1, 100) );SinOsc.ar(
69.midicps + vibrato,
mul: -6.dbamp
);
}.scope;
)

Comme le montre les exemples précédents, SuperCollider est un langage modulaire. les entrées/sorties de chaque expression peuvent s’interconnecter afin de réaliser des objets plus complexes. On peut explorer ces imbrications et fabriquer des instruments par synthèse additive, par modulation de fréquence ou d’amplitude, etc. La littérature de l’informatique musicale regorge d’exemples sous forme de diagramme que l’on peut facilement adapter sous SuperCollider.

Un exemple de synthèse granulaire additive.

Bruno Ruviaro regroupe des exemples de différentes techniques de synthèse à télécharger sur son github.

Pour aller plus loin :

Un traité de synthèse sonore par Guillaume Loizillon avec des exemples dans différents langages et quelques-uns sous SuperCollider : http://www.guillaume-loizillon.eu/synthese/traite1.htm

Charles Dodge, Thoma A. Jerse, Computer Music, Synthesis, Composition, and Performance, Schirmer , 1985.

Eduardo Reck Miranda, Computer Sound Design, Synthesis techniques and programming, Focal Press, 1998.

Andy Farnell, Designing Sound, The MIT Press, 2010.

Indication supplémentaires sur le contrôle : les enveloppes

Comme tous langage de programmation évoluée, SuperCollider possède ses structures de contrôles pour sophistiquer ses algorithmes musicaux, mais cette partie désire préciser les moyens de contrôle avec un objet en particulier. Effectivement, une enveloppe permet de formater l’intensité d’une note dans le temps, mais on peut aussi l’utiliser pour varier tous les paramètres d’une commande. Dans ce cas, ce type de contrôle ressemble à une automation des séquenceurs. Une enveloppe se construit à l’aide de la commande Env et se joue grâce à un générateur d’enveloppe EnvGen.

Il existe différentes méthodes de format d’enveloppe prédéfini, par exemple :

Env.triangle.plot;
Env.sine.plot;
Env.perc.plot;

On a la possibilité de créer son enveloppe segment par segment.

// Env(tableau de points, tableau de durées des segments, tableau de la forme des courbes)
Env([0, 1, 0.4, 0.7, 0], [0.5, 0.5, 0.3, 1], [-5, 0, 4, \sin]).plot;// Création aléatoire d’une enveloppe à 5 segments.
(
var nombreSegment = 5;

Env(
Array.fill(nombreSegment+1,{1.0.rand2}), // 6 nombres aléatoires entre -1.0 et 1.0
Array.fill(nombreSegment,{1.0.rand}), // 5 nombres aléatoires entre 0 et 1.0
Array.fill(nombreSegment,{rrand(-4.5,3)}), // 5 nombres aléatoires entre -4.5 et 3.0
).plot;
)

L’utilisation d’une enveloppe avec un générateur offre d’avantage d’options. On peut libérer le synthétiseur à la fin de la course de l’enveloppe, les durées peuvent s’exprimer en valeur relative ou absolue, etc.

(
{
var env, duree=3;
env = EnvGen.kr(Env.perc, levelScale:-9.dbamp, timeScale:duree, doneAction:2);
// doneAction : 2 permet de libérer le synthétiseur de la mémoire, plus besoin d’un Ctrl + ., plus de clic intempestif !Saw.ar * env ;
}.play
)(
{
var env, signal, duree=5;
env = EnvGen.kr(Env.sine, levelScale:-9.dbamp, timeScale:duree, doneAction:2);

// Utilisation d’Env avec des durées relatives des segments par rapport à la durée globale.
signal = Saw.ar( EnvGen.kr(Env([220, 440, 110], [2, 1].normalizeSum, \welch), timeScale:duree) );

// Une Env peut s’utiliser sans générateur, juste avec la méthode kr (uniquement grâce à la librairie wslib dans Quarks).
signal = Pan2.ar( signal, Env([1,-1], [duree], -5).kr );
signal = signal * env;
}.play
)

(
{
var env, signal, porte, duree=10;
// Le paramètre porte d’une enveloppe permet de la jouer plusieurs fois comme dans cet exemple ou d’effectuer la release d’une enveloppe de type ADSR (un exemple de ce type est donné dans le chapitre suivant).
porte = Impulse.kr( MouseX.kr(0.5, 3) );
env = EnvGen.kr(Env.perc, porte, levelScale:LFNoise2.kr.range(-21,-6).dbamp);

signal = Saw.ar(Line.kr(220, 440, duree, doneAction:2) ) * env;
signal = Pan2.ar(signal, Env([1,-1],[duree], \sin).kr );
}.play
)

Sébastien Clara – Avril 2013

Précédent Sommaire Suivant
Publicités