SynthDefs <
Index >
Ordre d'exécution
Messages
Pour rester au plus près du fonctionnement réel de sc (dialogue par OSC), JmC préconise l'utilisation du
"messaging style" dans la syntaxe du client:
Soit un SynthDef:
s.boot;
SynthDef(\test, { | freq = 400, mul = 0.1|
Out.ar(0, SinOsc.ar(freq, 0, mul))!2
}).send(s)
On envoie au serveur des messages pour la création et le paramétrage des synths: voir
Server-Command-Reference∞
s.sendMsg(\s_new, \test, 1000);
- le message \s_new invoque la création d'un synth
- \test est le nom du synthdef à utiliser
- 1000 est l'index du synth sur le serveur
- Ce type de passage de message nécessite beaucoup de rigueur dans la programmation.
- Vous êtes responsable de l'ordre d'exécution des synths, de leur destruction.
- Un index étant par nécessité unique, vous êtes aussi responsable de la bonne gestion des id lors de l'envoi au serveur.
Par exemple, réévaluer tel quel la ligne s_new ci-dessus provoque une erreur:
FAILURE s_new duplicate node ID
on peut générer automatiquement un id unique en utilisant la méthode nextNodeID:
(
i = s.nextNodeID;
s.sendMsg(\s_new, \test, i);
)
//une alternative consiste à mettre -1 en tant que ID:
s.sendMsg(\s_new, \test, -1);
Gestion des paramètres
le synthdef
\test possède deux arguments,
freq, et
mul, dotés de valeurs par défaut. On peut donner d'autres valeurs (statiques) lors de la création du synth:
i = s.nextNodeID;
s.sendMsg(\s_new, \test, i, 0, 0, \freq, 800, \mul, 0.4);
on peut envoyer des messages par la suite au serveur pour changer ces valeurs, à l'aide du message
\n_set:
s.sendMsg(\n_set, i, \freq, 100);
s.sendMsg(\n_set, i, \freq, 400, \mul, 0.2 );
L'envoi de message peut être différé, en utilisant le message
.sendBundle : le premier argument de sendBundle est un temps "logique", sc écrit un
timestamp dans le message osc destiné au serveur
(
s.sendBundle(0.2, //temps
["/s_new", "test", x = s.nextNodeID, 1, 1, "freq", 800],
["/s_new", "test", y = s.nextNodeID, 1, 1, "freq", 1001],
["/s_new", "test", z = s.nextNodeID, 1, 1, "freq", 1202]
);
s.sendBundle(1.2, ["/n_free", x],["/n_free", y],["/n_free", z]);
)
(
SynthDef(\test2, {|freq = 200, mul = 0.1|
Out.ar(0, Formant.ar(freq, freq * Rand(1, 3.0), freq * Rand(1, 3.0))!2 * EnvGen.kr(Env.perc(releaseTime: 0.02), doneAction: 2) * mul)
}).send(s)
)
Routine({
inf.do {0.1.wait;
s.sendMsg(\s_new, \test2, s.nextNodeID.postln, 1, 1, \freq, exprand(100, 1000), \mul, 0.2.rand)
}
}).play
voir gestion du temps:
Temps logique, temps physique
SynthDefs <
Index >
Ordre d'exécution
There are no comments on this page. [Add comment]