Le routage

Précédent Sommaire Suivant

SuperCollider est un langage orienté objet et peut se structurer en différents modules. La communication entre les modules s’effectue par des bus. Il en existe deux types, les bus de contrôle et les bus audio. Les modules peuvent se classifier suivant quatre familles. Les modules de contrôle, les instruments, les effets et les modules de mouvement et de position dans l’espace. Les bus de contrôles sont redirigés sur un ou des modules et ainsi synchroniser une chaîne hétéroclite par un contrôle particulier. De plus, le chaînage audio doit suivre un certain ordre pour fonctionner correctement. Les instruments sont en amont du bus, les effets au milieu et le module de spatialisation en aval.

routageDesModules

On peut complexifier ses routages en réaffectant la sortie d’un bus à une autre chaîne d’effet (InFeedback) et raffiner ses mixages.

// Définition des différents modules.
(
SynthDef(\instru, { arg out=0, krFrequence, amp=0.5, duree=3;
var env, signal;
env = EnvGen.kr(Env([0,1,1,0],[1,9,1].normalizeSum,\welch), levelScale:amp, timeScale:duree, doneAction:2);
signal = SinOsc.ar( In.kr(krFrequence), mul:env );Out.ar(out, signal);
}).add;

SynthDef(\unEffet, { arg out=0, in, amp=1;
var signal;
signal = In.ar(in).clip.distort;

ReplaceOut.ar(out, signal);
}).add;

SynthDef(\mouvementStereo, { arg in, krAzimut, amp=1;
var w, x, y, z;
var signal = In.ar(in);

#w, x, y, z = BFEncode1.ar(signal, In.kr(krAzimut), 0, 1 );
Out.ar(0, BFDecode1.ar(w, x, y, z, [-0.25*pi, 0.25*pi], 0) );
}).add;
)

(
{
var duree = 5;
var busAudioA, busControlFrequence, busControlAzimut;
var effet, mouvement;

// Allocation des bus.
busAudioA = Bus.audio(s, 1);
busControlFrequence = Bus.control(s, 1);
busControlAzimut = Bus.control(s, 1);

// Effets.
effet = Synth(\unEffet,[\out,busAudioA, \in,busAudioA,], addAction: \addToTail);
mouvement = Synth(\mouvementStereo, [\in,busAudioA, \krAzimut,busControlAzimut], addAction: \addToTail);

// Instrument.
Synth(\instru, [\amp,0.5, \out,busAudioA, \krFrequence,busControlFrequence, \duree,duree ], addAction: \addToHead);

// Contrôles.
{Out.kr(busControlAzimut, EnvGen.kr(Env([-1/4*pi,1/4*pi],[duree],0), doneAction: 2) )}.play(addAction: \addToHead);
{Out.kr(busControlFrequence, EnvGen.kr(Env([220,880],[duree],-5), doneAction: 2) )}.play(addAction: \addToHead);

// Attente de la fin de l’événement pour désallouer les bus et les synthétiseurs qui n’ont pas de doneAction:2.
duree.wait;

// Déallocation des bus.
busAudioA.free; busControlFrequence.free; busControlAzimut.free;
// Déallocation des synthétiseurs.
effet.free; mouvement.free;
}.fork
)

Ce principe permet de sauvegarder un module et de la réutiliser à tout moment sans plus d’adaptation. Lors de la définition d’un synthétiseur (SynthDef), à la place de la méthode add utilisez la méthode store. Cela permettra de sauvegarder votre définition et elle se chargera à chaque démarrage du serveur.

Pour aller plus loin.

Architecture du serveur : http://doc.sccode.org/Reference/Server-Architecture.html

Le tutoriel des bus : http://doc.sccode.org/Tutorials/Getting-Started/11-Busses.html

Sébastien Clara – Avril 2013

Précédent Sommaire Suivant