Skip to content
Permalink
haven
Go to file
 
 
Cannot retrieve contributors at this time
128 lines (104 sloc) 2.87 KB
/*
2019, Till Bovermann
http://tai-studio.org
*/
Engine_Haven : CroneGenEngine {
*specs {
^(
\freq1: [1, 800, \exp, 0.0, 20].asSpec,
\freq2: [400, 12000, \exp, 0.0, 4000, "Hz"].asSpec,
\amp1: [-90, 0, \linear, 0.0, 0, ""].asSpec,
\amp2: [-90, 0, \linear, 0.0, 0, ""].asSpec,
\inAmp: [-90, 0, \linear, 0.0, 0, ""].asSpec,
\fdbck: [0, 1, \linear, 0.0, 0.03, ""].asSpec,
\fdbckSign: [-1, 1, \linear, 1, 0, ""].asSpec
)
}
*synthDef { // TODO: move ugenGraphFunc to here...
^SynthDef(\haven, {|in = 0, out = 0, freq1, freq2, amp1, amp2, inAmp, fdbck, fdbckSign = 1|
var freqs, freqRanges;
var inputs, oscAmps;
var dyns, dynIns;
var xxx, snd, lIns;
var rotate = {|in, pos = 0.0|
Rotate2.ar(in[0], in[1], pos)
};
oscAmps = max(0, [amp1, amp2].dbamp - (-90.dbamp)); // ensure mute when at -90 db;
inAmp = max(0, inAmp .dbamp - (-90.dbamp)); // ensure mute when at -90 db;
// combine fdbck with its sign
fdbck = fdbck.varlag(0.3) * fdbckSign.lag(2.0 / SampleRate.ir);
lIns = LocalIn.ar(2);
inputs = (In.ar(in, 2) * inAmp);
dynIns = Amplitude.ar(inputs, 0.1, 0.1);
// magic (>:)
xxx = Limiter.ar(
CombL.ar(
lIns + inputs,
0.5,
(LFNoise1.ar(0.1, 0.5, 0.5) + dynIns).tanh * 0.5,
-10
)
);
dyns = Impulse.ar(0).lag(0.001, 0.1)
+ Amplitude.ar(
in: xxx.reverse,
attackTime: LFNoise1.kr(dynIns[0].lag(1) * 0.1).abs * 5,
releaseTime: LFNoise1.kr(dynIns[0].lag(3) * 0.5).abs * 15
);
freqRanges = [0.85, 0.4];
freqs = [freq1, freq2].varlag(0.5);
freqs = freqs -
(
dyns.lag(0.003235246)
* (
(freqRanges * freqs)
)
);
// oscAmps = [amp1, amp2].dbamp.poll;
oscAmps = oscAmps.lag(0.2) * AmpCompA.kr(freqs);
snd = [
SinOscFB.ar(
freq: freqs[0],
feedback: (dyns[0] * 2).fold(0, 1.5)
) * oscAmps[0] * 10,
RHPF.ar(
Pulse.ar(
freq: freqs[1],
width: (dyns[1].lag(0.01) * 200.1 + Decay.kr(Dust.kr(50 * (1-dyns[0])), 0.05)).wrap(0, 1),
) * oscAmps[1] * 4,
8 * freqs[1].varlag(10, 20, start: 400), 0.3
)
];
// mix
snd = (inputs + snd).tanh;
// amp modulation
snd = snd * SinOsc.ar(
(0.01 + dyns.varlag(2, 1, 5, 1)) * 0.5,
{Rand()}!2
).range((dyns.varlag(2, 1, 5, 10) * 0.5) + 0.5, 1);/* * SinOsc.ar(
(1-dyns.lag([1, 1.2])) * 20,
{Rand()}!2
).range(0.01, 1);
*/
//stereo rotate
snd = rotate.(
in: snd,
pos: (dynIns + LFSaw.kr(0.001, 0.23))%1 // (2, 2)
);
snd = (fdbck * xxx) // feedback
+ snd;
// collapse to stereo
snd = snd.sum;
snd = LeakDC.ar(snd);
LocalOut.ar(snd);
snd = (snd * 0.8) - (0.5 * MoogLadder.ar(rotate.(snd, dyns.sum.lag(0.01)), ffreq: (1-dyns.lag(0, 10)) * 1100 + 50, res: 0.2));
snd = snd.tanh;
Out.ar(out, snd);
},
metadata: (specs: this.specs)
)
}
}
/*
Engine_Haven.generateLuaEngineModuleSpecsSection
*/