( s.waitForBoot { ~buf1 = Buffer.read(s, "/home/lcoogan/snd/samples/freesound/vocals/ymaaela/333264__ymaaela__female-vocal-cut-ups-collage.mono.wav"); ~buf2 = Buffer.read(s, "/home/lcoogan/snd/samples/scarlett/clickin.mono.wav"); ~buf3 = Buffer.read(s, "/home/lcoogan/snd/samples/scarlett/scarlett singing.mono.wav"); SynthDef(\crossfade3Buf, { |out=0, buf1, buf2, buf3, gain1=1, gain2=0, gain3=0, rate=1.2| var sig1 = PlayBuf.ar(1, buf1, rate * BufRateScale.kr(buf1), loop: 1); var sig2 = PlayBuf.ar(1, buf2, rate * BufRateScale.kr(buf2), loop: 1); var sig3 = PlayBuf.ar(1, buf3, rate * BufRateScale.kr(buf3), loop: 1); var mix = sig1 * gain1 + sig2 * gain2 + sig3 * gain3; mix = GVerb.ar(mix, damping:1); Out.ar(out, mix ! 2); }).add; s.sync; ~synth = Synth(\crossfade3Buf, [ \buf1, ~buf1.bufnum, \buf2, ~buf2.bufnum, \buf3, ~buf3.bufnum, \gain1, 0, \gain2, 0, \gain3, 1 ]); Routine({ var prevGains = [1.0, 0.0, 0.0]; loop { var newGains = Array.fill(3, { rrand(0.0, 1.0) }); var sum = newGains.sum; newGains = newGains.collect { |g| g / sum }; // normalize gains to sum to 1 // Smoothly interpolate each gain from prev to new over 1 second using \lag ~synth.set(\gain1, newGains[0], \lag, 0); ~synth.set(\gain2, newGains[1], \lag, 0); ~synth.set(\gain3, newGains[2], \lag, 0); prevGains = newGains; 0.1.wait; } }).play; }; )