SuperCollider : RouTines

SuperCollider :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register
Temps logique, temps physique < Index > Patterns


Streams


Routines



fonctionnement d'une routine



// modèle
Routine( { ....contenu de la fonction  .... } );




r = Routine({ "hello, world".yield.postln });




r.next;



r.next;


la routine retournera 'nil'

r.next;     // retourne nil
r.reset;        // reset de la routine
r.next;     // ça marche de nouveau




(
r = Routine({
    "je ".yield;
    "m'approche".yield;
    "du neant...".yield;
});
)


Les trois premiers yield retournent les chaînes respectives
r.next
r.next
r.next
r.next// retourne 'nil'

Reset:
r.reset;

r.next;
r.next;
r.next;
r.next;





(
r = Routine({

    var array;
    array = [ "hello, world", "what a world", "i am a world" ];

    // l'itération
    3.do({ array.choose.yield })
   
});
)



opérations sur les Routines

Les Streams, et donc les Routines, peuvent revevoir des opérateurs unaires et binaires
(
var a, b;
// a est un stream contant de 0 à 9
a = Routine.new({
        10.do({ arg i; i.yield; })
    });
b = a + 100;    // ajout d'une valeur constante (100) à a
12.do({ b.next.postln; });
)



Le temps dans les routines




(
r = Routine({

    var array;
    array = [ "hello, world", "what a world", "i am a world" ];

    3.do({
        1.wait;                 // pause d'une seconde
        array.choose.postln;
    })
   
});
)



r.play



r.reset.play;




routines et horloges




r.play

est équivalent à
SystemClock.play(r)




Création de synths gérée par des routines



// EXECUTION DE LA ROUTINE
r.reset.play;




Des synths, créés dans une routine, sont passés dans un effet extérieur à la routine


(
// DEFINITION DU SYNTH
SynthDef("fm2", {
  arg bus = 0, freq = 440, carPartial = 1, modPartial = 1, index = 3, mul = 0.2, ts = 1;
  // index entre 0 et 24
  // carPartial :: modPartial => car/mod ratio
  var mod;
  var car;
  mod = SinOsc.ar(
    freq * modPartial,0,
    freq * index * LFNoise1.kr(5.reciprocal).abs
  );
  car = SinOsc.ar(
    (freq * carPartial) + mod,0,mul
  );
  Out.ar(
    bus,
    car * EnvGen.kr(Env.sine(1), doneAction: 2, timeScale: ts)
  )
}).load(s);
)
(
// DEFINITION DE LA  ROUTINE
r = Routine({

    12.do({
        Synth(
            "fm2",
            [
                \bus, 2.rand, \freq, 400.0.rrand(1200),
                \carPartial, 0.5.rrand(2), \ts, rrand(0.5, 11)
            ]
        );
        s.queryAllNodes;
        "".postln.postln.postln.postln.postln;
        2.wait;
    })
});
)

// EXECUTION DE LA ROUTINE
r.reset.play;
(
// définition du synthdef
SynthDef("echoplex", {
    ReplaceOut.ar(
        0,
        CombN.ar(
            In.ar(0, 1),
            0.35,
            [Rand(0.05, 0.3), Rand(0.05, 0.3)],
            // génère des valeur aléatoires à chaque création de synth
            7,
            0.5
        )
    )
}).load(s);

// GROUPES POUR CONTROLER L'ORDRE D'EXECUTION
~source = Group.head(s);
~effect = Group.tail(s);

// DEFINITION DE ROUTINE
r = Routine({

    // loop est synonyme de **inf.do**
    loop({
        Synth.head( // attache le synth à la tête de ~source
            ~source,
            "fm2",
            [
                \outbus, 0, \freq, 400.0.rrand(1200), \modPartial, 0.3.rrand(2.0),
                \carPartial, 0.5.rrand(11), \ts, 0.1.rrand(0.2)]
        );
        s.queryAllNodes;
        2.wait;
    })
});

//  EFFETS
Synth.head(~effect, "echoplex");
Synth.tail(~effect, "echoplex");
)
// EXECUTION DE LA ROUTINE
r.reset.play;




Task



s.boot;

(
SynthDef( \form, { |outBus = 0, freq = 440, portaTime = 1, gate = 1,  mul = 1, genLevel = 1, ampLfoFreq = 1, ampLfoAmp  = 0
    lfoAmp = 20 ,bpf = 6000, attack = 0.001, decay = 1, sustain = 0.5, release = 0.1 |
    var in, synth, env, out, ampLfo;
    env = EnvGen.kr(Env.adsr(attack, decay, sustain, release), gate, doneAction: 2) ;
    in = Blip.ar(SinOsc.kr(MouseX.kr(1, freq), 0, MouseY.kr(0, 1), (EnvGen.kr(Env.adsr(0, 0, 1, portaTime, curve: -2), gate)) 1).abs*freq+11.66, 1000, mul);
    synth = Formlet.ar(in,  [freq, freq+0.1.midiratio], 0.005, 1, mul/ 3 );
    synth = BPF.ar(synth, bpf);
    ampLfo = SinOsc.kr(ampLfoFreq, 0, ampLfoAmp, (ampLfoAmp-1).abs);
    synth = synth*[ampLfo, (ampLfo-1).abs]*env;
                Out.ar(outBus, synth * genLevel);
}).send(s)
)   
   
z = Synth(\form);

t = Task({
    var pent = [0, 3, 5, 7, 10];
    pent = pent+60;
        inf.do({ arg i;
        z.set(\freq, pent[i%5].midicps * [1, 2].choose, \bpf, exprand(1000, 5000));
            0.2.wait
        });
    });

t.start;
t.pause;
t.resume;
t.reset;
t.stop;



Temps logique, temps physique < Index > Patterns

There are no comments on this page. [Add comment]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.3
Page was generated in 0.2443 seconds