From eb4fd136c2b83cf0799839ec63356a3a6c02a1d1 Mon Sep 17 00:00:00 2001 From: Leo Coogan Date: Wed, 21 May 2025 10:09:39 -0400 Subject: [PATCH] tonal grain sample --- tonal_grain.scd | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tonal_grain.scd diff --git a/tonal_grain.scd b/tonal_grain.scd new file mode 100644 index 0000000..a066ba5 --- /dev/null +++ b/tonal_grain.scd @@ -0,0 +1,48 @@ +s.boot; +b = Buffer.read(s, "/home/lcoogan/Misc/grave.wav"); + +( +SynthDef("tonal_grain_sample", { + arg freq = 220, gate = 1, outBus = 0, gain = 0.1; + var env, t, grainDur, pos, rate, sig, baseFreq; + + // Envelope to shape amplitude + env = EnvGen.kr( + Env.adsr(0.01, 0.1, 0.6, 1.5, curve: -4), + gate, + doneAction: 2 + ); + + // Trigger for grains + t = Impulse.ar(freq); + + // Duration of each grain + grainDur = 0.1; + + // Playback rate controls pitch: freq / base pitch of sample + baseFreq = 220; // You can adjust this depending on your sample + rate = freq / baseFreq; + + // Position in buffer: random or LFO modulation + pos = LFNoise1.kr(1).range(0, 0.3); // pick random spots in the buffer + + // Granulate the sample buffer tonally + sig = GrainBuf.ar( + numChannels: 2, + trigger: t, + dur: grainDur, + sndbuf: b, // use your sample buffer + rate: rate, + pos: pos, + interp: 2 + ); + + sig = sig * env; + sig = FreeVerb.ar(sig, 0.3, 0.9); + sig = LeakDC.ar(sig); + + Out.ar(outBus, sig * gain); +}).add; +) + +Synth(\tonal_grain_sample, [ \grainDur, 0.3, \freq, [50].midicps]);