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
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);
|
|
)
|
|
|