aboutsummaryrefslogtreecommitdiffstats
path: root/SuperCollider
diff options
context:
space:
mode:
Diffstat (limited to 'SuperCollider')
-rw-r--r--SuperCollider/random241.scd106
1 files changed, 106 insertions, 0 deletions
diff --git a/SuperCollider/random241.scd b/SuperCollider/random241.scd
new file mode 100644
index 0000000..94afe4d
--- /dev/null
+++ b/SuperCollider/random241.scd
@@ -0,0 +1,106 @@
+(
+s.waitForBoot{
+// s.makeWindow;
+ s.record;
+ OSCFunc.trace(true);
+ OSCFunc.trace(false);
+ //Dictionary for storing timing and related synths
+ ~tasks = Dictionary.new();
+ //maximum allowed nodes on Server
+ ~maximumSynths = 55;
+ ~allowOSC = true;
+ ~test = 0;
+ // Filter SynthDef for post-processing
+ ~filter = SynthDef(\filter, {|in, mix = 0.68, room = 0.54, damp = 0.15, volume = 0.5|
+ in = In.ar(0, 2);
+ ReplaceOut.ar(0,
+ FreeVerb.ar(
+ in,
+ mix,
+ room,
+ damp
+ ) * volume
+ );
+ }).play;
+ // OSCFunc for putting a task to the Dictionary and playing it
+ OSCFunc({
+ |msg, time, address, receivingPort|
+ var task;
+ var synth;
+ var release = msg[1].asFloat;
+ var freqIn = msg[2].asFloat;
+ var ampIn = msg[3].asFloat;
+ if(~allowOSC, {
+// ("msg: "++msg++" at port "++receivingPort++" from address "++address).postln;
+ //randomized SynthDef to be played
+ synth = SynthDef(time.asSymbol, {|out=0, attackTime=0.01|
+ var freq = freqIn.linexp(0.0, 1.0, 20, 18000);
+ var amplitude = ampIn;
+ var releaseTime = release;
+ var env = EnvGen.kr(//envelope to automatically release the Synth
+ Env.perc(attackTime, releaseTime, amplitude, -4), doneAction:2
+ );
+ var position = LinLin.kr([freqIn, ampIn].median, 0.0, 1.0, -1.0, 1.0);
+// ("freq: "++freq++", amplitude: "++amplitude++", position: "++position).postln;
+ //TODO: make stereo by using pan!
+ Out.ar(
+ out,
+ Pan2.ar(// pan using median of freq and amplitude
+ Saw.ar(
+ freq, env, SinOsc.ar(//TODO: lower volume for bbb
+ freq, 0, env*0.5
+ );
+ );
+ ), position
+ );
+ }).add;
+ // Task for each SynthDef
+ task = Task.new({
+ {
+ //play the synth and loop in its own length
+ synth.play;
+ msg[1].wait;
+ }.loop;
+ });
+ NotificationCenter.notify(task, \stopped);
+ NotificationCenter.register(task, \stopped, ~test, {
+ ("Task has stopped").postln;
+ });
+ // Put to Task Dictionary and play task (in a loop)
+ ~tasks.add(time.asSymbol -> task);
+ ~tasks.at(time.asSymbol).play;
+ //if the maximum number of synths is reached, remove the oldest
+ if(s.numSynths > ~maximumSynths,{
+// //get all Tasks ordered, remove the oldest
+// ~tasks.atAll(~tasks.order).do({
+// arg item, i;
+// if(i < (~tasks.size.asInt - ~maximumSynths.asInt),{
+// item.stop;
+// });
+// });
+ // disable OSC handling for now
+ ~allowOSC = false;
+ ~tasks.atAll(~tasks.order).do({
+ arg item, i;
+ item.stop;
+ });
+ s.stopRecording;
+ });
+// ("Number of synths playing: "++s.numSynths.asString).postln;
+ });
+ }, '/random');
+ // OSCFunc for analog inputs to set
+ // maximum numbers of synths, FreeVerb setttings
+ OSCFunc({
+ |msg, time, address, receivingPort|
+ ("msg: "++msg++" at port "++receivingPort++" from address "++address).postln;
+ switch(msg[1].asSymbol,
+ \P9_39, ~filter.set(\mix, msg[2]),
+ \P9_40, ~filter.set(\room, msg[2]),
+ \P9_41, ~filter.set(\damp, msg[2]),
+ \P9_42, ~filter.set(\volume, msg[2]),
+ );
+ }, '/analog');
+};
+
+)