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.

229 lines
5.2 KiB
Plaintext

b = Buffer.read(s, "/home/lcoogan/snd/demos/desolation.wav");
(
{
PlayBuf.ar(2, b, 1, loop: 1) * 0.3
}.play;
)
/*add springverb and dubecho
split break and pad*/
(
SynthDef(\grainFMPad, {
|out=0, bufnum=0, rate=1, centerFreq=200, dur=6, amp=0.3, pan=0|
var trigRate = 20; // how many grains per second
var grainDur = 0.1; // duration of each grain
var snd;
snd = GrainFM.ar(
numChannels: 2,
trigger: Impulse.kr(trigRate),
dur: grainDur,
carfreq: LFNoise1.kr(0.2).range(centerFreq * 0.5, centerFreq * 1.5),
modfreq: LFNoise1.kr(0.1).range(100, 300),
index: LFNoise1.kr(0.05).range(1, 10),
pan: LFNoise1.kr(0.5),
envbufnum: -1,
sndbuf: bufnum,
rate: rate
);
// Smoothing the pad
snd = snd * EnvGen.kr(Env.linen(2, dur-4, 2), doneAction: 2) * amp;
Out.ar(out, snd);
}).add;
)
(
// play it with your buffer b
x = Synth(\grainFMPad, [
\bufnum, b,
\centerFreq, 250,
\dur, 12,
\amp, 0.3
]);
)
(
~midiToFreq = { |note| note.midicps };
)
(
t = TempoClock(86/60);
Pbind(
\instrument, \grainFMPad,
\bufnum, b, // your loaded buffer
\dur, 2, // time between notes (longer since your grains are pad-like)
\centerFreq, Pseq([60, 62, 65, 67, 69, 72].collect(~midiToFreq), inf),
\amp, 0.05,
\rate,1,
\pan, 0,
).play(t);
)
(
SynthDef(\grainFMPad, {
|out=0, bufnum=0, rate=1, centerFreq=200, dur=6, amp=0.3, pan=0|
var trigRate = 20;
var grainDur = 0.1;
var snd;
// Subtle detuning of carrier freq (optional)
var carfreq = centerFreq * LFNoise1.kr(0.1).range(0.98, 1.02);
snd = GrainFM.ar(
numChannels: 2,
trigger: Impulse.kr(trigRate),
dur: grainDur,
carfreq: carfreq, // More stable, but still a little alive
modfreq: LFNoise1.kr(0.1).range(100, 300),
index: LFNoise1.kr(0.05).range(1, 10),
pan: LFNoise1.kr(0.5),
envbufnum: -1,
sndbuf: bufnum,
rate: rate
);
snd = snd * EnvGen.kr(Env.linen(2, dur - 4, 2), doneAction: 2) * amp;
Out.ar(out, snd);
}).add;
)
(
SynthDef(\grainFMPadBlended, {
|out=0, bufnum=0, rate=1, centerFreq=500, dur=6, amp=0.3, pan=0, toneMix=1|
var trigRate = 20;
var grainDur = 0.1;
var snd, tone, blend;
// GrainFM layer
snd = GrainFM.ar(
numChannels: 2,
trigger: Impulse.kr(trigRate),
dur: grainDur,
carfreq: centerFreq,
modfreq: centerFreq * 2,
index: 1.0,
pan: pan,
envbufnum: -1,
sndbuf: bufnum,
rate: rate
);
// Clean tone layer (can also try Saw or Pulse for edge)
tone = SinOsc.ar(centerFreq ! 2); // stereo
// Blend between grainy texture and clean tone
blend = XFade2.ar(snd, tone, (toneMix * 2 - 1)); // toneMix: 0 = all grains, 1 = all tone
// Envelope
blend = blend * EnvGen.kr(Env.linen(2, dur - 4, 2), doneAction: 2) * amp;
Out.ar(out, blend);
}).add;
)
(
SynthDef(\grainFMPadShifted, {
|out=0, bufnum=0, rate=1, centerFreq=200, dur=6, amp=0.3, pan=0, pitchRatio=20.0|
var trigRate = 20;
var grainDur = 0.1;
var snd, shifted;
snd = GrainFM.ar(
numChannels: 2,
trigger: Impulse.kr(trigRate),
dur: grainDur,
carfreq: centerFreq,
modfreq: centerFreq * 2,
index: 1.0,
pan: pan,
envbufnum: -1,
sndbuf: bufnum,
rate: rate
);
// Pitch shift output toward stable tone
shifted = PitchShift.ar(snd, windowSize: 0.2, pitchRatio: pitchRatio, pitchDisp: 0.0);
shifted = shifted * EnvGen.kr(Env.linen(2, dur - 4, 2), doneAction: 2) * amp;
Out.ar(out, shifted);
}).add;
)
(
SynthDef(\grainFMPadPV, {
|out=0, bufnum=0, rate=1, centerFreq=1, dur=1, amp=0.3, pan=0, shiftBins=20, gate 1, env|
var trigRate = 20;
var grainDur = 0.1;
var snd, chain, shifted;
snd = GrainFM.ar(
numChannels: 1, // FFT works on mono
trigger: Impulse.kr(trigRate),
dur: grainDur,
carfreq: centerFreq,
modfreq: centerFreq * 1,
index: 1.0,
pan: 0,
envbufnum: -1,
sndbuf: b,
rate: rate
);
env = EnvGen.kr(Env.asr(0.1, 1.0, 0.1, -4), gate, doneAction:2);
// FFT and PV shift
chain = FFT(LocalBuf(2048), snd);
// chain = PV_MagShift(chain, shiftBins, 0); // shifts bins upward
chain = PV_BinScramble(chain, 1, 1, 0);
chain = PV_BinDelay(chain, 1, 1, 1, 0.5);
chain = PV_PitchShift(chain, -2000);
chain = PV_BrickWall(chain, -20000);
chain = PV_NoiseSynthF(chain, 80, 2, 0);
shifted = IFFT(chain);
shifted = Pan2.ar(shifted, pan); // stereo output
shifted = RLPF.ar(shifted, 800, 0.1);
shifted = CombL.ar(shifted);
// shifted = shifted * EnvGen.kr(Env.linen(2, dur - 4, 2), doneAction: 2) * amp;
shifted = shifted * amp;
Out.ar(out, shifted);
}).add;
)
(
~midiToFreq = { |note| note.midicps };
)
(
t = TempoClock(86/60);
Pbind(
\instrument, \grainFMPad,
\bufnum, b, // your loaded buffer
\dur, 2, // time between notes (longer since your grains are pad-like)
\centerFreq, Pseq([60].collect(~midiToFreq), inf),
\amp, 0.05,
\rate,1,
\pan, 0,
).play(t);
)