/* * 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