Patch with parameterized filter

I wanted to see if I could figure out how to parameterize filters a bit more expressively. I came up with this patch which exposes several different parameters for opening and closing a filter in different proportions and cycles through different permutations. I thought it sounded nice so I thought I would share. I believe it only requires SC3Plugins.

(
Ndef(\aace).clear;
Ndef(\aace).clock_(TempoClock.new(45/60).permanent_(true));
Ndef(\aace).play(fadeTime:4);
Ndef(\aace).put(0, {

	var wet;
	var beatdur = \beatdur.kr(1);
	var trig = \trig.tr(0);
	var ddepth = \ddepth.kr(0.1);
	var detune = [ddepth, ddepth.neg].midiratio;
	var freq = \freq.ar(261).lag(\lag.kr(0.0));

	var osc1 = {arg freq;
		var sig = Saw.ar(freq);
		sig * AmpCompA.kr(freq);
	};

	var adsr = {arg da=Done.none;
		var atk = \atk.kr(0.01);
		var sus = \sus.kr(0);
		var dec = \dec.kr(0.1);
		var rel = \rel.kr(0.1);
		var curve = \curve.kr(-4);
		var suslevel = \suslevel.kr(0.5);
		var ts = \ts.kr(1);
		var env = Env(
			[0, 1, suslevel, suslevel, 0],
			[atk, dec, sus, rel],
			curve
		).ar(doneAction:da, gate:trig, timeScale:ts);
		env;
	};

	var filter = {arg sig, aeg, cutoff=1200, vel=1, res=0, freqamt=0;
		var famt = \freqamt.kr(freqamt);
		var ffreq = \cutoff.kr(cutoff) + (freq * famt);
		var fvel = max(\fvel.kr(vel), 0.001);
		var fcurve = K2A.ar(\fcurve.kr(-4));
		var fres = \res.kr(res);
		var feg = aeg.lincurve(0, 1, ffreq, ffreq * fvel, curve:fcurve).clip(20, 20000);
		sig = DFM1.ar(sig, feg, fres.clip(0.001, 1.0));
		//sig = BLowPass4.ar(sig, feg, (1-fres).clip(0.001, 1.0));
		//sig = RLPF.ar(sig, feg, (1-fres).clip(0.001, 1.0));
		//sig = BLowPass.ar(sig, feg, (1-fres).clip(0.001, 1.0));
		sig;
	};

	var sig = [
		osc1.(freq * detune),
		osc1.(freq * detune * 2) * 0.2,
		osc1.(freq * detune * 1.5) * 0.1,
		osc1.(freq * detune * 4) * 0.1
	].flatten;

	var aeg = adsr.();
	sig = sig * aeg;
	sig = Splay.ar(sig, \spread.kr(0), center:\center.kr(0));
	sig = filter.(sig, aeg);
	sig = LeakDC.ar(sig);

	sig = sig.blend(NHHall.ar(sig, 2), 0.2);
	// feedback loop for fun
	wet = sig;
	wet = DelayC.ar(
		PitchShift.ar(LocalIn.ar(2), 2, [2, 1.5], 0.01, 0.01),
		beatdur * 1,
		beatdur * (5/8)
	) * 0.5 + wet;
	LocalOut.ar(wet.reverse);

	sig = sig.blend(wet, 0.6);
	sig = Balance2.ar(sig[0], sig[1], \pan.kr(0));
	sig = sig * \vel.kr(1) * \amp.kr(-3.dbamp);
	sig;
});

Ndef(\aace).put(10, \set -> Pbind(
	\trig, 1,
	\dur, 0.125,
	\octave, Pseq([5, 4, 5, 5, 4, 5, 5, 4], inf), //Pbjorklund(5, 8, inf).linlin(0, 1, 4, 5),
	\degree, Ppatlace([Pseq([0, 7], inf), Pseq([2, 6, 4, 1], inf)], inf),
	\atk, Pseq([0.01, 0.05, 0.1, 0.5], inf).stutter(31 * 2),
	\rel, 1,
	\sus, Pseq([0.1, 0.3, 0.6, 1], inf).stutter(17 * 2),
	\lag, 0.0,
	\cutoff, Pseq([200, 400, 800, 1200], inf).stutter(5 * 2),
	\fvel, Pseq([0.5, 1, 2, 3, 4], inf).stutter(7 * 2),
	\fcurve, Pseq([-4, -1, 2, 4], inf).stutter(13 * 2),
	\freqamt, Pseq([0.1, 0.5, 0.7, 1], inf).stutter(10 * 2),
	\res, Pseq([0.1, 0.5, 0.8], inf).stutter(9 * 2),
	\pan, 0,
	\amp, 0.dbamp,
	\vel, Pseq([1, 0.8, 0.8, 1, 0.8, 0.8, 1, 0.8], inf), //Pbjorklund(3, 8, inf).linlin(0, 1, 0.8, 1),
	\beatdur, Pfunc({thisThread.clock.beatDur})
));
)
Ndef(\aace).stop;
1 Like