/*
* Author: Harry van Haaren 2013
* harryhaaren@gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef OPENAV_DSP_REVERB_H
#define OPENAV_DSP_REVERB_H
#include
#include
#include
template inline float faustpower(float x) { return powf(x,N); }
template inline double faustpower(double x) { return pow(x,N); }
template inline int faustpower(int x) { return faustpower(x) * faustpower(x); }
template <> inline int faustpower<0>(int x) { return 1; }
template <> inline int faustpower<1>(int x) { return x; }
class Reverb // : Effect
{
public:
Reverb(int sr)
{
init( sr );
}
int getNumInputs() { return 2; }
int getNumOutputs(){ return 2; }
void damping(float d)
{
if( d > 1.0 ) d = 1.0f;
if( d < 0.0 ) d = 0.0f;
_damping = (1-d) * 18500 + 1500.f;
}
void rt60(float rt)
{
if( rt > 1.0 ) rt = 1.0f;
if( rt < 0.0 ) rt = 0.0f;
_rt60 = 1 + rt * 5;
}
void dryWet(float dw)
{
if( dw > 1.0 ) dw = 1.0f;
if( dw < 0.0 ) dw = 0.0f;
_dryWet = dw;
}
void process (int count, float** input, float** output)
{
float fSlow0 = _rt60;
float fSlow1 = expf((fConst2 / fSlow0));
float fSlow2 = faustpower<2>(fSlow1);
float fSlow3 = (1.0f - fSlow2);
float fSlow4 = cosf((fConst3 * _damping));
float fSlow5 = (1.0f - (fSlow4 * fSlow2));
float fSlow6 = sqrtf(max(0.f, ((faustpower<2>(fSlow5) / faustpower<2>(fSlow3)) - 1.0f)));
float fSlow7 = (fSlow5 / fSlow3);
float fSlow8 = (fSlow7 - fSlow6);
float fSlow9 = (fSlow0 - 0.5f);
float fSlow10 = ((expf((fConst2 / fSlow9)) / fSlow1) - 1);
float fSlow11 = (fSlow1 * ((1.0f + fSlow6) - fSlow7));
float fSlow12 = expf((fConst12 / fSlow0));
float fSlow13 = faustpower<2>(fSlow12);
float fSlow14 = (1.0f - fSlow13);
float fSlow15 = (1.0f - (fSlow4 * fSlow13));
float fSlow16 = sqrtf(max(0.f, ((faustpower<2>(fSlow15) / faustpower<2>(fSlow14)) - 1.0f)));
float fSlow17 = (fSlow15 / fSlow14);
float fSlow18 = (fSlow17 - fSlow16);
float fSlow19 = ((expf((fConst12 / fSlow9)) / fSlow12) - 1);
float fSlow20 = (fSlow12 * ((1.0f + fSlow16) - fSlow17));
float fSlow21 = expf((fConst17 / fSlow0));
float fSlow22 = faustpower<2>(fSlow21);
float fSlow23 = (1.0f - fSlow22);
float fSlow24 = (1.0f - (fSlow4 * fSlow22));
float fSlow25 = sqrtf(max(0.f, ((faustpower<2>(fSlow24) / faustpower<2>(fSlow23)) - 1.0f)));
float fSlow26 = (fSlow24 / fSlow23);
float fSlow27 = (fSlow26 - fSlow25);
float fSlow28 = ((expf((fConst17 / fSlow9)) / fSlow21) - 1);
float fSlow29 = (fSlow21 * ((1.0f + fSlow25) - fSlow26));
float fSlow30 = expf((fConst22 / fSlow0));
float fSlow31 = faustpower<2>(fSlow30);
float fSlow32 = (1.0f - fSlow31);
float fSlow33 = (1.0f - (fSlow4 * fSlow31));
float fSlow34 = sqrtf(max(0.f, ((faustpower<2>(fSlow33) / faustpower<2>(fSlow32)) - 1.0f)));
float fSlow35 = (fSlow33 / fSlow32);
float fSlow36 = (fSlow35 - fSlow34);
float fSlow37 = ((expf((fConst22 / fSlow9)) / fSlow30) - 1);
float fSlow38 = (fSlow30 * ((1.0f + fSlow34) - fSlow35));
float fSlow39 = expf((fConst27 / fSlow0));
float fSlow40 = faustpower<2>(fSlow39);
float fSlow41 = (1.0f - fSlow40);
float fSlow42 = (1.0f - (fSlow4 * fSlow40));
float fSlow43 = sqrtf(max(0.f, ((faustpower<2>(fSlow42) / faustpower<2>(fSlow41)) - 1.0f)));
float fSlow44 = (fSlow42 / fSlow41);
float fSlow45 = (fSlow44 - fSlow43);
float fSlow46 = ((expf((fConst27 / fSlow9)) / fSlow39) - 1);
float fSlow47 = (fSlow39 * ((1.0f + fSlow43) - fSlow44));
float fSlow48 = expf((fConst32 / fSlow0));
float fSlow49 = faustpower<2>(fSlow48);
float fSlow50 = (1.0f - fSlow49);
float fSlow51 = (1.0f - (fSlow4 * fSlow49));
float fSlow52 = sqrtf(max(0.f, ((faustpower<2>(fSlow51) / faustpower<2>(fSlow50)) - 1.0f)));
float fSlow53 = (fSlow51 / fSlow50);
float fSlow54 = (fSlow53 - fSlow52);
float fSlow55 = ((expf((fConst32 / fSlow9)) / fSlow48) - 1);
float fSlow56 = (fSlow48 * ((1.0f + fSlow52) - fSlow53));
float fSlow57 = expf((fConst37 / fSlow0));
float fSlow58 = faustpower<2>(fSlow57);
float fSlow59 = (1.0f - fSlow58);
float fSlow60 = (1.0f - (fSlow4 * fSlow58));
float fSlow61 = sqrtf(max(0.f, ((faustpower<2>(fSlow60) / faustpower<2>(fSlow59)) - 1.0f)));
float fSlow62 = (fSlow60 / fSlow59);
float fSlow63 = (fSlow62 - fSlow61);
float fSlow64 = ((expf((fConst37 / fSlow9)) / fSlow57) - 1);
float fSlow65 = (fSlow57 * ((1.0f + fSlow61) - fSlow62));
float fSlow66 = expf((fConst42 / fSlow0));
float fSlow67 = faustpower<2>(fSlow66);
float fSlow68 = (1.0f - fSlow67);
float fSlow69 = (1.0f - (fSlow67 * fSlow4));
float fSlow70 = sqrtf(max(0.f, ((faustpower<2>(fSlow69) / faustpower<2>(fSlow68)) - 1.0f)));
float fSlow71 = (fSlow69 / fSlow68);
float fSlow72 = (fSlow71 - fSlow70);
float fSlow73 = ((expf((fConst42 / fSlow9)) / fSlow66) - 1);
float fSlow74 = (fSlow66 * ((1.0f + fSlow70) - fSlow71));
float* input0 = input[0];
float* input1 = input[1];
float* output0 = output[0];
float* output1 = output[1];
for (int i=0; i