22#include < cassert>
33#include < algorithm>
44
5- Dattorro1997Tank::Dattorro1997Tank (const double initSampleRate,
6- const double initMaxLfoDepth,
7- const double initMaxTimeScale) :
8- maxTimeScale(initMaxTimeScale)
5+ Dattorro1997Tank::Dattorro1997Tank ()
96{
10- timePadding = initMaxLfoDepth;
11- setSampleRate (initSampleRate);
7+ timePadding = 16 ;
128
139 leftOutDCBlock.setCutoffFreq (20.0 );
1410 rightOutDCBlock.setCutoffFreq (20.0 );
@@ -104,8 +100,8 @@ void Dattorro1997Tank::freeze(bool freezeFlag) {
104100
105101void Dattorro1997Tank::setSampleRate (const double newSampleRate) {
106102 sampleRate = newSampleRate;
107- sampleRate = sampleRate > maxSampleRate ? maxSampleRate : sampleRate ;
108- sampleRate = sampleRate < 1 . f ? 1 . f : sampleRate;
103+ assert ( sampleRate >= 1 . 0f ) ;
104+
109105 sampleRateScale = sampleRate / dattorroSampleRate;
110106
111107 fadeStep = 1.0 / sampleRate;
@@ -114,8 +110,8 @@ void Dattorro1997Tank::setSampleRate(const double newSampleRate) {
114110 rightOutDCBlock.setSampleRate (sampleRate);
115111
116112 rescaleTapTimes ();
117- setTimeScale (timeScale);
118113 initialiseDelaysAndApfs ();
114+ setTimeScale (timeScale);
119115 clear ();
120116}
121117
@@ -211,7 +207,7 @@ void Dattorro1997Tank::initialiseDelaysAndApfs() {
211207 auto maxScaledOutputTap = *std::max_element (scaledOutputTaps.begin (),
212208 scaledOutputTaps.end ());
213209 auto calcMaxTime = [&](double delayTime) -> long {
214- return (long )(sampleRateScale * (delayTime * maxTimeScale +
210+ return (long )(sampleRateScale * (delayTime * 4 +
215211 maxScaledOutputTap + timePadding));
216212 };
217213
@@ -235,14 +231,15 @@ void Dattorro1997Tank::initialiseDelaysAndApfs() {
235231}
236232
237233void Dattorro1997Tank::tickApfModulation () {
238- leftApf1.delay1 .setDelayTime (lfo1.process () * lfoExcursion + scaledLeftApf1Time);
239- leftApf1.delay2 .setDelayTime (lfo1.process () * lfoExcursion + scaledLeftApf1Time);
240- leftApf2.delay1 .setDelayTime (lfo2.process () * lfoExcursion + scaledLeftApf2Time);
241- leftApf2.delay2 .setDelayTime (lfo2.process () * lfoExcursion + scaledLeftApf2Time);
242- rightApf1.delay1 .setDelayTime (lfo3.process () * lfoExcursion + scaledRightApf1Time);
243- rightApf1.delay2 .setDelayTime (lfo3.process () * lfoExcursion + scaledRightApf1Time);
244- rightApf2.delay1 .setDelayTime (lfo4.process () * lfoExcursion + scaledRightApf2Time);
245- rightApf2.delay2 .setDelayTime (lfo4.process () * lfoExcursion + scaledRightApf2Time);
234+ double scaleFactor = timeScale;
235+ leftApf1.delay1 .setDelayTime (lfo1.process () * lfoExcursion * scaleFactor + scaledLeftApf1Time);
236+ leftApf1.delay2 .setDelayTime (lfo1.process () * lfoExcursion * scaleFactor + scaledLeftApf1Time);
237+ leftApf2.delay1 .setDelayTime (lfo2.process () * lfoExcursion * scaleFactor + scaledLeftApf2Time);
238+ leftApf2.delay2 .setDelayTime (lfo2.process () * lfoExcursion * scaleFactor + scaledLeftApf2Time);
239+ rightApf1.delay1 .setDelayTime (lfo3.process () * lfoExcursion * scaleFactor + scaledRightApf1Time);
240+ rightApf1.delay2 .setDelayTime (lfo3.process () * lfoExcursion * scaleFactor + scaledRightApf1Time);
241+ rightApf2.delay1 .setDelayTime (lfo4.process () * lfoExcursion * scaleFactor + scaledRightApf2Time);
242+ rightApf2.delay2 .setDelayTime (lfo4.process () * lfoExcursion * scaleFactor + scaledRightApf2Time);
246243}
247244
248245void Dattorro1997Tank::rescaleApfAndDelayTimes () {
@@ -270,26 +267,9 @@ void Dattorro1997Tank::rescaleTapTimes() {
270267 }
271268}
272269
273- Dattorro::Dattorro (const double initMaxSampleRate,
274- const double initMaxLfoDepth,
275- const double initMaxTimeScale)
276- : tank(initMaxSampleRate, initMaxLfoDepth, initMaxTimeScale)
270+ Dattorro::Dattorro ()
271+ : tank()
277272{
278- sampleRate = initMaxSampleRate;
279- dattorroScaleFactor = sampleRate / dattorroSampleRate;
280-
281- preDelay = InterpDelay<double >(192010 , 0 );
282-
283- inputLpf = OnePoleLPFilter (22000.0 );
284- inputHpf = OnePoleHPFilter (0.0 );
285-
286- inApf1 = AllpassFilter<double >(dattorroScale (8 * kInApf1Time ), dattorroScale (kInApf1Time ), inputDiffusion1);
287- inApf2 = AllpassFilter<double >(dattorroScale (8 * kInApf2Time ), dattorroScale (kInApf2Time ), inputDiffusion1);
288- inApf3 = AllpassFilter<double >(dattorroScale (8 * kInApf3Time ), dattorroScale (kInApf3Time ), inputDiffusion2);
289- inApf4 = AllpassFilter<double >(dattorroScale (8 * kInApf4Time ), dattorroScale (kInApf4Time ), inputDiffusion2);
290-
291- leftInputDCBlock.setCutoffFreq (20.0 );
292- rightInputDCBlock.setCutoffFreq (20.0 );
293273}
294274
295275void Dattorro::process (double leftInput, double rightInput) {
@@ -327,8 +307,6 @@ void Dattorro::clear() {
327307}
328308
329309void Dattorro::setTimeScale (double timeScale) {
330- constexpr double minTimeScale = 0.0001 ;
331- timeScale = timeScale < minTimeScale ? minTimeScale : timeScale;
332310 tank.setTimeScale (timeScale);
333311}
334312
@@ -341,6 +319,17 @@ void Dattorro::setSampleRate(double newSampleRate) {
341319 assert (newSampleRate > 0 .);
342320
343321 sampleRate = newSampleRate;
322+
323+ preDelay = InterpDelay<double >(std::ceil (sampleRate*0.5 ), 0 );
324+
325+ inputLpf = OnePoleLPFilter (22000.0 );
326+ inputHpf = OnePoleHPFilter (0.0 );
327+
328+ inApf1 = AllpassFilter<double >(dattorroScale (8 * kInApf1Time ), dattorroScale (kInApf1Time ), inputDiffusion1);
329+ inApf2 = AllpassFilter<double >(dattorroScale (8 * kInApf2Time ), dattorroScale (kInApf2Time ), inputDiffusion1);
330+ inApf3 = AllpassFilter<double >(dattorroScale (8 * kInApf3Time ), dattorroScale (kInApf3Time ), inputDiffusion2);
331+ inApf4 = AllpassFilter<double >(dattorroScale (8 * kInApf4Time ), dattorroScale (kInApf4Time ), inputDiffusion2);
332+
344333 tank.setSampleRate (sampleRate);
345334 dattorroScaleFactor = sampleRate / dattorroSampleRate;
346335 setPreDelay (preDelayTime);
0 commit comments