You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.2 KiB
Plaintext

(
SynthDef(\rhubarb, {
|freq = 440, gate = 1, cutoff = 600, rq = 0.3, amp = 4, modDepth = 0.3, modDepth2 = 0.5, noiseLevel = 0.8, ringFreq = 400|
var env, sig1, sig2, sig3, filt1, filt2, filt3, lfo, lfo2, pan1, pan2, pan3, mix, saturatedSig;
// Using GrainBuf for granular synthesis
var grainBuf1, grainBuf2, grainBuf3;
// Grains for the three channels, modulating playback speed for pitch control
grainBuf1 = GrainBuf.ar(
2,
Impulse.ar(10), // Control grain density
0.1, // Grain duration
~klezmer, // Sound source buffer
2, // Pitch shift factor
1.19, // Frequency modulation
2, // Grain density variation
0, // Start position (set dynamically for random play)
-1, // Reverse playback (for added texture)
512 // Buffer size
);
grainBuf2 = GrainBuf.ar(
2,
Dust.ar(10),
0.08,
~klezmer,
-2, // Different pitch for variety
1.25,
2,
0,
-1,
512
);
grainBuf3 = GrainBuf.ar(
2,
Dust.ar(10),
0.8,
~klezmer,
2, // Higher pitch for more brightness
1.25,
2,
0,
-1,
512
);
// LFO to modulate filter frequency (similar to previous LFO setup)
lfo = LFNoise0.kr(10).range(1 - modDepth, 1 + modDepth);
lfo2 = LFNoise2.kr(4).range(1 - modDepth, 1 + modDepth);
// Apply Different Filters to Each GrainBuf Signal
filt1 = SVF.ar(grainBuf1, cutoff * lfo, rq);
filt2 = LPF.ar(grainBuf2, 400 * lfo, rq);
filt3 = HPF.ar(grainBuf3, cutoff * lfo2, rq);
// ADSR Envelope for modulation
env = EnvGen.kr(Env.adsr(0.0, 0.3, 0.3, 0.1), gate, doneAction: 2);
// Panning each signal for stereo effect
pan1 = Pan2.ar(filt1 * env * amp, -0.3); // Slightly left
pan2 = Pan2.ar(filt2 * env * amp, 0.3); // Slightly right
pan3 = Pan2.ar(filt3 * env * amp, 0); // Centered
// Mixing the signals together
mix = pan1 + pan2 + pan3; // Add all three signals
saturatedSig = mix.tanh;
// Output the final mixed signal
Out.ar(0, saturatedSig);
}).play;
)