// live buffer recording SynthDef(\bufRec, { arg buf, recLevel = 1.0, preLevel = 0, loop = loop; RecordBuf.ar(SoundIn.ar(0), buf, recLevel: recLevel, preLevel: preLevel, loop:loop, doneAction:2) }).add; SynthDef(\bufPlay, { arg out = 0, buf, rate0 = 1, rateRate = 0.01, rateAmp = 0, posRate = 0.5, posAmp = 0.5, panRate = 0.5, panAmp = 0.5, loop = 1, amp = 1.0, mix = 0.25, room = 0.15, damp = 0.5; // var rate = rate0; // + LFNoise0.kr(rateRate, rateAmp, 1); var snd = PlayBuf.ar(1, buf, rate, loop: loop) * amp; // mono *** doneAction: 2 remove, so can loop snd = FreeVerb.ar(snd, mix, room, damp); OffsetOut.ar(out, Pan2.ar(snd, LFNoise1.kr(panRate, panAmp, 0))); }).add; b = Buffer.alloc(s, s.sampleRate * 5); // create new recorder for every loop // preLevel 0.95 means gradual fading of buffer contents r = Synth(\bufRec, [\buf, b, \preLevel, 0.95, \loop, 1]); // loop = 0: deletes synth at the end of recording r // collect all recordors in array - then can delete individual rec m = [] m = m.add(Synth(\bufRec, [\buf, b, \preLevel, 0.5, \loop, 1])); m = m.add(Synth(\bufRec, [\buf, b, \preLevel, 0.999995, \loop, 0])); m = m.add(Synth(\bufRec, [\buf, b, \preLevel, 0, \loop, 1])); m[0].free m p = Synth(\bufPlay, [\buf, b]); p.set(\loop, 0) p.free b = Buffer.read(s, Platform.resourceDir +/+ "sounds/a11wlk01-44_1.aiff"); b = Buffer.read(s, Platform.resourceDir +/+ "sounds/trump/name.wav"); b = Buffer.read(s, Platform.resourceDir +/+ "sounds/trump/landslide.wav"); SynthDef(\buf_grain_test, { |out, gate = 1, amp = 1, sndbuf, envbuf| var pan, env, freqdev; // use mouse x to control panning pan = MouseX.kr(-1, 1); env = EnvGen.kr( Env([0, 1, 0], [1, 1], \sin, 1), gate, levelScale: amp, doneAction: Done.freeSelf); Out.ar(out, GrainBuf.ar(2, Impulse.kr(MouseY.kr(1, 100)), 0.1, sndbuf, LFNoise1.kr.range(05, 20), LFNoise2.kr(0.1).range(0, 1), 2, pan, envbuf) * env) }).add; SynthDef(\buf_grain_test, { arg out, gate = 1, amp = 1, sndbuf, envbuf, dur = 0.5, rate0 = 10, rateDelta = 5, pos1 = 0.6, pos2 = 0.7; var pan, env, freqdev; var rate; // use mouse x to control panning pan = MouseX.kr(-1, 1); env = EnvGen.kr( Env([0, 1, 0], [1, 10], \sin, 1), gate, levelScale: amp, doneAction: Done.freeSelf); rate = Impulse.kr( rate0 + LFNoise1.kr(1).range(rate0, rate0 + rateDelta) ); // dur = 0.1; // LFNoise0.kr(10).range(0.02, 1.0); Out.ar(out, GrainBuf.ar(2, rate, dur, sndbuf, LFNoise1.kr.range(5, 200), LFNoise2.kr(0.1).range(pos1, pos2), 2, pan, envbuf) * env) }).add; // use built-in env x = Synth(\buf_grain_test, [\sndbuf, b, \envbuf, -1]) y = Synth(\buf_grain_test, [\sndbuf, b, \envbuf, -1]) x.set(\rateDelta, 100) x.set(\rate0, 1) x.set(\pos1, 0.) x.set(\pos2, 0.8) x.set(\sndbuf, b) x.set(\dur, 0.01) x.release x.free w = Env([0, 1, 0], [0.5, 0.5], [8, -8]); z = Buffer.sendCollection(s, w.discretize, 1); x.set(\envbuf, z)