Most recent edit on 2007-07-10 16:14:35 by SuperCollider
Additions:
Création d'un empilage de filtres grâce à la récursion :
Deletions:
Création d'un filtre avec réinjection :
Edited on 2007-07-09 15:41:27 by SuperCollider
Additions:
~f0 = 40; fondamentale
f = (1..n)*~f0;
Deletions:
f = 40; fondamentale
f = (1..n).collect {|i| f * i}.postln; ! la variable f est transformée
Edited on 2007-07-07 16:27:59 by SuperCollider
Additions:
f = {arg x; x2};
f.value(2);
comme on l'a déjà vu, les fonctions acceptent des méthodes permettant de générer un signal audio:
- play
- scope
Elles sont délimitées par des crochets [ et ]
{ {Mix.ar( SinOsc.ar( f, 0, {LFNoise0.kr(6, 1/n/2, 1/n/2)}!n ) ).distort}!2 }.play;
Deletions:
f = { 3+5};
f.value;
comme on l'a déjà vu, les fonctions acceptent des méthodes permettant de générer un signal audio: play, scope
Elles sont délimitées par les signes [ et ]
{Mix.ar( SinOsc.ar( f, 0, 1/n).scope ) }.scope;
{ {Mix.ar( SinOsc.ar( f, 0, {LFNoise0.kr(6, 1/n/2, 1/n/2)}!n ) ).distort}!2 }.scope;
Edited on 2007-07-06 19:20:31 by SuperCollider
Additions:
Le champ d'action de ~maVariable est le currentEnvironnement , proche d'une variable globale (tant que le langage n'est pas recompilé, ou currentEnvironnement redéfini) : Ce type de association est très pratique pour définir des processus à la volée, dans le contexte du 'live-coding' par exemple. [...]
Deletions:
Le champ d'action de ~maVariable est le document dans lequel elle a été définie (tant que le langage n'est pas recompilé, ou currentEnvironnement redéfini) : Ce type de association est très pratique pour définir des processus à la volée, dans le contexte du 'live-coding' par exemple. [...]
Edited on 2007-07-05 18:51:09 by SuperCollider
Additions:
Supercollider propose un grand choix de systèmes de liste, suivant le type de classement que vous voulez donner à votre groupe d'objets. Listes non ordonnées (Bag, Set), ordonnées (SequenceableCollection, ArrayedCollection, etc), de taille fixe ou modulable, etc. Voir [Collections]
Deletions:
Supercollider propose un grand choix de systèmes de liste, suivant le type de classement que vous voulez donner à votre groupe d'objets. Listes non ordonnées (Bag, Set), ordonnées (SequenceableCollection, ArrayedCollection, etc), de taille fixe ou modulable, etc. Voir [Collections]
Edited on 2007-07-04 18:01:58 by SuperCollider
Additions:
Aperçu < Index > Aide
Aperçu < Index > Aide
Deletions:
< Index >
< Index >
Edited on 2007-07-04 17:57:45 by SuperCollider
No differences.
Edited on 2007-07-04 17:57:29 by SuperCollider
Additions:
< Index >
Oldest known version of this page was edited on 2007-05-29 22:32:17 by SuperCollider []
Page view:
le langage, suite
Les fonctions
- Elles permettent de stocker une procédure, évaluable en temps voulu.
- Elles sont délimitées par les signes { et }
par exemple:
f = { 3+5};
(sclang)
l'adresse de la fonction est stockée (ici, une simple opération) dans la variable globale
f;
On peut l'appeler, l'évaluer plus tard:
f.value;
comme on l'a déjà vu, les fonctions acceptent des méthodes permettant de générer un signal audio: play, scope
Les listes, les collections
Elles sont délimitées par les signes [ et ]
Supercollider propose un grand choix de systèmes de liste, suivant le type de classement que vous voulez donner à votre groupe d'objets. Listes non ordonnées (Bag, Set), ordonnées (
SequenceableCollection,
ArrayedCollection, etc), de taille fixe ou modulable, etc. Voir [Collections]
(
a = [1, 2, 4, 8];
a.postln;
a[2].postln; //appel d'un élément à l'index 2
a[2] = 20; //modification d'un emplacement
a * 2 // opération sur une liste (voir plus tard)
)
Les dictionnaires
Permettent d'associer à une 'clé' une valeur. Les dictionnaires ne sont pas ordonnés. Les éléments ont une clef, mais pas d'index (pas d'emplacement défini dans l'ensemble)
d = ( \ga: 2, \bu: 4, \zo: 8); //les clefs sont ici \ga, \bu, et \zo
d[\bu]; //appel d'un élément avec l'invocation de sa clef
Les environnements [...]
C'est un type spécial de dictionnaire, permettant de créer un 'contexte' doté d'un champ particulier Il existe un environnement (global) par défaut au lancement de l'application: currentEnvironment il permet de créer des (fausses) variables sans typage: on place un tilde avant le nom choisi :
~maVariable = 12;
Le champ d'action de
~maVariable est le document dans lequel elle a été définie (tant que le langage n'est pas recompilé, ou currentEnvironnement redéfini) : Ce type de association est très pratique pour définir des processus à la volée, dans le contexte du 'live-coding' par exemple. [...]
Les Itérations
Comme tout langage, SC est doté de méthodes permettant d'agir sur des listes.
Un des avantages de l'utilisation d'un langage est l'efficacité et la concision dans les tâches répétitives:
(
10.0.rand.postln;
10.0.rand.postln;
10.0.rand.postln;
10.0.rand.postln;
10.0.rand.postln;
10.0.rand.postln;
10.0.rand.postln;
)
Il devrait sauter aux yeux qu'il y a ici un problème d'efficacité .
do
7.do( { 10.0.rand.postln; } )
7.do { 10.0.rand.postln; } //présentation alternative
.do execute
n fois le bloc
{}(ici 7)
autre utilisation de .do:
["ga", "bu", "zo"].do {|syllabe, i| (syllabe ++ i).postln };"";
deux arguments ici pour le bloc.
do opère le bloc sur chaque élément (syllabe) du receveur, et associe à chaque opération un index (i)
collect
["ga", "bu", "zo"].collect {|syllabe, i| (syllabe ++ i) }
retourne un nouvel Array construit avec chaque résultat de l'itération
(
{SinOsc.ar(40, 0, 1/6)}.play;
{SinOsc.ar(80, 0, 1/6)}.play;
{SinOsc.ar(120, 0, 1/6)}.play;
{SinOsc.ar(160, 0, 1/6)}.play;
{SinOsc.ar(200, 0, 1/6)}.play;
{SinOsc.ar(240, 0, 1/6)}.play;
)
berk.
Et si je veux changer ma fondamentale ?
(
f = 40; //fondamentale
n = 8; //nb d'harmoniques
f = (1..n).collect {|i| f * i}.postln; //! la variable f est transformée
{Mix.ar( SinOsc.ar( f, 0, 1/n).scope ) }.scope;
//{ {Mix.ar( SinOsc.ar( f, 0, {LFNoise0.kr(6, 1/n/2, 1/n/2)}!n ) ).distort}!2 }.scope;
)
l'utilisation de l'itération et de variables permet de construire un système modulable: une seule opération sur le code est maintenant nécessaire pour changer la fondamentale ;
autres méthodes :
select, reject, inject, detect, etc: voir [_Collection_]
La récursion
on peut utiliser la récursion dans sc :
( //fib
l = [];
f = {|n|
if(n > 1){f.(n-1) + f.(n-2)}{n};
};
f.(10);
)
Création d'un filtre avec réinjection :
//si possible (mac):
s = Server.internal.boot;
// création d'un analyseur
FreqScope.new(300, 0);
)
(
f = {| input, freq = 1000, n = 3 |
if (n>0){f.(BPF.ar(input, freq, 0.4), freq, n-1)}{input}
};
p = NodeProxy.audio(s, 2);
p.play;
p.source = {f.(WhiteNoise.ar, MouseX.kr(20, 8000), 10)}
)