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.
scd/spectral test.scd

65 lines
2.1 KiB
Plaintext

(
// ========== Spectral SynthDef with PV_Control and expanded modulation ==========
SynthDef(\pv16knob, {
arg bufnum, fftSize = 1024,
amp = 0.3, smearAmt = 5, randRate = 6, binScrambleAmt = 0.5,
pvRouting = 0, grainSize = 0.1,
delTime = 0.3, delFeedback = 0.4, verbMix = 0.2,
lfoFreq = 0.2, bitcrushAmt = 0.0, distAmt = 1.0,
ringFreq = 200, freezeAmt = 0.5,
transpose = 1.0, filterCutoff = 8000;
var in, chain, dry, fx, delay, verb;
var chain0, chain1, chain2, chain3, chain4, chain5;
var lfo = SinOsc.kr(lfoFreq).range(0.1, 1.0);
var controlBuf = LocalBuf(fftSize); // for PV_Control output
// Audio input and bitcrushing
in = PlayBuf.ar(1, bufnum, BufRateScale.kr(bufnum) * transpose, loop: 1);
in = Decimator.ar(in, (1 - bitcrushAmt).linexp(0, 1, 44100, 1000), 8 - (bitcrushAmt * 7));
// FFT and spectral freeze
chain = FFT(LocalBuf(fftSize), in);
chain = PV_MagFreeze(chain, freezeAmt);
// Spectral processing chains
chain0 = PV_BinScramble(PV_MagSmear(PV_RandComb(chain, 0.1, Impulse.kr(randRate)), smearAmt + lfo), binScrambleAmt, 0);
chain1 = PV_BrickWall(chain, lfo.range(0.05, 0.2));
chain2 = PV_BinShift(chain, lfo * 20, 0.5);
chain3 = PV_BinWipe(chain, lfo);
chain4 = PV_SpectralEnhance(chain, 0.8, 1.5, 0.2);
// PV_Control dynamic bin suppression
PV_Control.new(chain, controlBuf,
thresh: 0.5,
mulFactor: 0.8,
limiter: 10,
attackReleaseFrames: 50,
sustainZeroFrames: 100,
waitGoFrames: 50,
tripCount: 2,
tripBlockFrames: 500,
highestBin: 400
);
chain5 = PV_MagMul(chain, controlBuf);
// Select branch
chain = SelectX.kr(pvRouting.clip(0, 5), [chain0, chain1, chain2, chain3, chain4, chain5]);
dry = IFFT(chain);
// Post-PV grain, distortion, filter
dry = TGrains.ar(2, Impulse.ar(20), bufnum, 1, Phasor.ar(0, 1, 0, BufFrames.ir(bufnum)), grainSize, 0, 0.1, 1);
dry = Ringz.ar(dry, ringFreq, 0.2);
dry = (dry * distAmt).tanh;
dry = LPF.ar(dry, filterCutoff);
// Delay and reverb
delay = CombC.ar(dry, 1, delTime, delFeedback);
verb = FreeVerb.ar(dry, verbMix, 0.8, 0.3);
// Output
fx = Mix([dry, delay, verb]);
Out.ar(0, fx.dup * amp);
}).add;
)