I've made it in this way: SinOsc s1 => g => dac; 220.0 => s1.freq; spork ~ loop1(); SinOsc s2 => g ; spork ~ loop2(); 0.4 => g.gain ; 0.01 => g.mix; spork ~ loop3(); <<<"waiting on main shred">>>; 2::minute => now; fun void loop3() { for (0 => int ca; ca < 10; ca++) { 0.2 => g.gain; 10::second => now; 0.0 => g.gain; 1::second => now; 0.2 => g.gain; 10::second => now; 0.0 => g.gain; 1::second => now; } } fun void loop1() { <<<"sporked loop1">>>; for (0 => int i; i < 21; i++) { Std.rand2f(130.0, 440.0) => s1.freq; 0.2 => s1.gain; 0.5::second => now; 0.0 => s1.gain; 0.5::second => now; } <<<"loop1 done">>>; } fun void loop2() { <<<"sporked loop2">>>; for (0 => int i; i < 21; i++) { Std.rand2f(130.0, 440.0) => s2.freq; 0.2 => s2.gain; 0.5::second => now; 0.0 => s2.gain; 0.5::second => now; } } Is it a good way, or are there other ways more elegant and simpler?