@@ -116,9 +116,9 @@ class Dsp {
116116 double fRec30 [3 ];
117117 double fRec29 [3 ];
118118 double fRec35 [2 ];
119- bool flush_to_zero;
120-
121-
119+ # ifdef DEBUG
120+ inline void check_state_f ( double v);
121+ # endif
122122public:
123123 float fVslider0 ;
124124 float fVslider1 ;
@@ -198,6 +198,15 @@ inline void Dsp::clear_state_internal()
198198 for (int l40 = 0 ; l40 < 2 ; l40 = l40 + 1 ) fRec35 [l40] = 0.0 ;
199199}
200200
201+ #ifdef DEBUG
202+ inline void Dsp::check_state_f (double v)
203+ {
204+ if (std::fpclassify (v) == FP_SUBNORMAL) {
205+ fprintf (stderr, " subnormal detected\n " );
206+ }
207+ }
208+ #endif
209+
201210inline void Dsp::init (uint32_t sample_rate)
202211{
203212 fSampleRate = sample_rate;
@@ -266,7 +275,6 @@ inline void Dsp::init(uint32_t sample_rate)
266275 fConst62 = 1.0 - fConst37 / fConst21 ;
267276 fConst63 = 1.0 / (fConst38 / fConst21 + 1.0 );
268277 fConst64 = 1.0 / (fConst29 * fConst33 );
269- flush_to_zero = true ;
270278 clear_state_f ();
271279 clear_state_internal ();
272280}
@@ -279,10 +287,8 @@ inline void Dsp::compute(int count, float *input0, float *output0)
279287 double fSlow3 = 0.0010000000000000009 * std::pow (1e+01 , 0.05 * double (fVslider3 ));
280288 double fSlow4 = 0.0010000000000000009 * std::pow (1e+01 , 0.05 * double (fVslider4 ));
281289 double fSlow5 = 0.0010000000000000009 * std::pow (1e+01 , 0.05 * double (fVslider5 ));
282- double sm = 0.0 ;
283290 for (int i0 = 0 ; i0 < count; i0 = i0 + 1 ) {
284291 double fTemp0 = double (input0[i0]);
285- sm += std::fabs (fTemp0 );
286292 fVec0 [0 ] = fTemp0 ;
287293 fRec9 [0 ] = -(fConst36 * (fConst35 * fRec9 [1 ] - (fTemp0 + fVec0 [1 ])));
288294 fRec8 [0 ] = fRec9 [0 ] - fConst34 * (fConst32 * fRec8 [2 ] + fConst30 * fRec8 [1 ]);
@@ -300,42 +306,42 @@ inline void Dsp::compute(int count, float *input0, float *output0)
300306 fRec2 [0 ] = fRec3 [0 ] - fConst13 * (fConst11 * fRec2 [2 ] + fConst9 * fRec2 [1 ]);
301307 double fTemp4 = fRec2 [2 ] + fRec2 [0 ] + 2.0 * fRec2 [1 ];
302308 fVec4 [0 ] = fTemp4 ;
303- fRec1 [0 ] = - (fConst49 * (fConst47 * fRec1 [1 ] - fConst46 * (fTemp4 - fVec4 [1 ])));
309+ fRec1 [0 ] = 1e-18 - (fConst49 * (fConst47 * fRec1 [1 ] - fConst46 * (fTemp4 - fVec4 [1 ]))) + 1e-18 ;
304310 fRec0 [0 ] = fRec1 [0 ] - fConst6 * (fConst5 * fRec0 [2 ] + fConst3 * fRec0 [1 ]);
305311 fRec10 [0 ] = fSlow0 + 0.999 * fRec10 [1 ];
306312 fRec12 [0 ] = -(fConst49 * (fConst47 * fRec12 [1 ] - fConst13 * (fTemp4 + fVec4 [1 ])));
307313 fRec11 [0 ] = fRec12 [0 ] - fConst6 * (fConst5 * fRec11 [2 ] + fConst3 * fRec11 [1 ]);
308314 fRec13 [0 ] = fSlow1 + 0.999 * fRec13 [1 ];
309315 double fTemp5 = fConst3 * fRec14 [1 ];
310- fRec16 [0 ] = - (fConst45 * (fConst43 * fRec16 [1 ] - fConst52 * (fTemp3 - fVec3 [1 ])));
311- fRec15 [0 ] = fRec16 [0 ] - fConst13 * (fConst11 * fRec15 [2 ] + fConst9 * fRec15 [1 ]);
316+ fRec16 [0 ] = 1e-18 - (fConst45 * (fConst43 * fRec16 [1 ] - fConst52 * (fTemp3 - fVec3 [1 ]))) + 1e-18 ;
317+ fRec15 [0 ] = 1e-18 + fRec16 [0 ] - fConst13 * (fConst11 * fRec15 [2 ] + fConst9 * fRec15 [1 ]) - 1e-18 ;
312318 fRec14 [0 ] = fConst53 * (fRec15 [2 ] + (fRec15 [0 ] - 2.0 * fRec15 [1 ])) - fConst51 * (fConst50 * fRec14 [2 ] + fTemp5 );
313319 fRec17 [0 ] = fSlow2 + 0.999 * fRec17 [1 ];
314320 double fTemp6 = fConst3 * fRec18 [1 ];
315321 double fTemp7 = fConst9 * fRec19 [1 ];
316- fRec21 [0 ] = - (fConst42 * (fConst40 * fRec21 [1 ] - fConst56 * (fTemp2 - fVec2 [1 ])));
317- fRec20 [0 ] = fRec21 [0 ] - fConst20 * (fConst18 * fRec20 [2 ] + fConst16 * fRec20 [1 ]);
318- fRec19 [0 ] = fConst57 * (fRec20 [2 ] + (fRec20 [0 ] - 2.0 * fRec20 [1 ])) - fConst55 * (fConst54 * fRec19 [2 ] + fTemp7 );
322+ fRec21 [0 ] = 1e-18 - (fConst42 * (fConst40 * fRec21 [1 ] - fConst56 * (fTemp2 - fVec2 [1 ]))) + 1e-18 ;
323+ fRec20 [0 ] = 1e-18 + fRec21 [0 ] - fConst20 * (fConst18 * fRec20 [2 ] + fConst16 * fRec20 [1 ]) - 1e-18 ;
324+ fRec19 [0 ] = 1e-18 + fConst57 * (fRec20 [2 ] + (fRec20 [0 ] - 2.0 * fRec20 [1 ])) - fConst55 * (fConst54 * fRec19 [2 ] + fTemp7 ) - 1e-18 ;
319325 fRec18 [0 ] = fRec19 [2 ] + fConst55 * (fTemp7 + fConst54 * fRec19 [0 ]) - fConst51 * (fConst50 * fRec18 [2 ] + fTemp6 );
320326 fRec22 [0 ] = fSlow3 + 0.999 * fRec22 [1 ];
321327 double fTemp8 = fConst3 * fRec23 [1 ];
322328 double fTemp9 = fConst9 * fRec24 [1 ];
323329 double fTemp10 = fConst16 * fRec25 [1 ];
324- fRec27 [0 ] = - (fConst39 * (fConst37 * fRec27 [1 ] - fConst60 * (fTemp1 - fVec1 [1 ])));
325- fRec26 [0 ] = fRec27 [0 ] - fConst27 * (fConst25 * fRec26 [2 ] + fConst23 * fRec26 [1 ]);
326- fRec25 [0 ] = fConst61 * (fRec26 [2 ] + (fRec26 [0 ] - 2.0 * fRec26 [1 ])) - fConst59 * (fConst58 * fRec25 [2 ] + fTemp10 );
327- fRec24 [0 ] = fRec25 [2 ] + fConst59 * (fTemp10 + fConst58 * fRec25 [0 ]) - fConst55 * (fConst54 * fRec24 [2 ] + fTemp9 );
330+ fRec27 [0 ] = 1e-18 - (fConst39 * (fConst37 * fRec27 [1 ] - fConst60 * (fTemp1 - fVec1 [1 ]))) + 1e-18 ;
331+ fRec26 [0 ] = 1e-18 + fRec27 [0 ] - fConst27 * (fConst25 * fRec26 [2 ] + fConst23 * fRec26 [1 ]) - 1e-18 ;
332+ fRec25 [0 ] = 1e-18 + fConst61 * (fRec26 [2 ] + (fRec26 [0 ] - 2.0 * fRec26 [1 ])) - fConst59 * (fConst58 * fRec25 [2 ] + fTemp10 ) - 1e-18 ;
333+ fRec24 [0 ] = 1e-18 + fRec25 [2 ] + fConst59 * (fTemp10 + fConst58 * fRec25 [0 ]) - fConst55 * (fConst54 * fRec24 [2 ] + fTemp9 ) - 1e-18 ;
328334 fRec23 [0 ] = fRec24 [2 ] + fConst55 * (fTemp9 + fConst54 * fRec24 [0 ]) - fConst51 * (fConst50 * fRec23 [2 ] + fTemp8 );
329335 fRec28 [0 ] = fSlow4 + 0.999 * fRec28 [1 ];
330336 double fTemp11 = fConst3 * fRec29 [1 ];
331337 double fTemp12 = fConst9 * fRec30 [1 ];
332338 double fTemp13 = fConst16 * fRec31 [1 ];
333339 double fTemp14 = fConst23 * fRec32 [1 ];
334340 fRec34 [0 ] = -(fConst36 * (fConst35 * fRec34 [1 ] - fConst31 * (fTemp0 - fVec0 [1 ])));
335- fRec33 [0 ] = fRec34 [0 ] - fConst34 * (fConst32 * fRec33 [2 ] + fConst30 * fRec33 [1 ]);
336- fRec32 [0 ] = fConst64 * (fRec33 [2 ] + (fRec33 [0 ] - 2.0 * fRec33 [1 ])) - fConst63 * (fConst62 * fRec32 [2 ] + fTemp14 );
337- fRec31 [0 ] = fRec32 [2 ] + fConst63 * (fTemp14 + fConst62 * fRec32 [0 ]) - fConst59 * (fConst58 * fRec31 [2 ] + fTemp13 );
338- fRec30 [0 ] = fRec31 [2 ] + fConst59 * (fTemp13 + fConst58 * fRec31 [0 ]) - fConst55 * (fConst54 * fRec30 [2 ] + fTemp12 );
341+ fRec33 [0 ] = 1e-18 + fRec34 [0 ] - fConst34 * (fConst32 * fRec33 [2 ] + fConst30 * fRec33 [1 ]) - 1e-18 ;
342+ fRec32 [0 ] = 1e-18 + fConst64 * (fRec33 [2 ] + (fRec33 [0 ] - 2.0 * fRec33 [1 ])) - fConst63 * (fConst62 * fRec32 [2 ] + fTemp14 ) - 1e-18 ;
343+ fRec31 [0 ] = 1e-18 + fRec32 [2 ] + fConst63 * (fTemp14 + fConst62 * fRec32 [0 ]) - fConst59 * (fConst58 * fRec31 [2 ] + fTemp13 ) - 1e-18 ;
344+ fRec30 [0 ] = 1e-18 + fRec31 [2 ] + fConst59 * (fTemp13 + fConst58 * fRec31 [0 ]) - fConst55 * (fConst54 * fRec30 [2 ] + fTemp12 ) - 1e-18 ;
339345 fRec29 [0 ] = fRec30 [2 ] + fConst55 * (fTemp12 + fConst54 * fRec30 [0 ]) - fConst51 * (fConst50 * fRec29 [2 ] + fTemp11 );
340346 fRec35 [0 ] = fSlow5 + 0.999 * fRec35 [1 ];
341347 output0[i0] = float (fRec35 [0 ] * (fRec29 [2 ] + fConst51 * (fTemp11 + fConst50 * fRec29 [0 ])) + fRec28 [0 ] * (fRec23 [2 ] + fConst51 * (fTemp8 + fConst50 * fRec23 [0 ])) + fRec22 [0 ] * (fRec18 [2 ] + fConst51 * (fTemp6 + fConst50 * fRec18 [0 ])) + fRec17 [0 ] * (fRec14 [2 ] + fConst51 * (fTemp5 + fConst50 * fRec14 [0 ])) + fConst6 * (fRec13 [0 ] * (fRec11 [2 ] + fRec11 [0 ] + 2.0 * fRec11 [1 ]) + fConst2 * fRec10 [0 ] * (fRec0 [0 ] + fRec0 [2 ] - 2.0 * fRec0 [1 ])));
@@ -401,14 +407,6 @@ inline void Dsp::compute(int count, float *input0, float *output0)
401407 fRec29 [1 ] = fRec29 [0 ];
402408 fRec35 [1 ] = fRec35 [0 ];
403409 }
404- if (sm < 1e-18 ) {
405- if (flush_to_zero) {
406- clear_state_f ();
407- flush_to_zero = false ;
408- }
409- } else if (!flush_to_zero) {
410- flush_to_zero = true ;
411- }
412410}
413411
414412Dsp *plugin () {
0 commit comments