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;