/* * DISTRHO StereoEnhancer Plugin, based on StereoEnhancer by Michael Gruhn * Copyright (C) 2007 Michael Gruhn * Copyright (C) 2012-2013 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * For a full copy of the license see the LGPL.txt file */ #include "DistrhoPluginStereoEnhancer.hpp" #include static const float cfDC_ADD = 1e-30f; static const float cfPI = 3.141592654f; START_NAMESPACE_DISTRHO // ------------------------------------------------- DistrhoPluginStereoEnhancer::DistrhoPluginStereoEnhancer() : Plugin(paramCount, 1, 0) // 1 program, 0 states { // set default values d_setProgram(0); // reset d_deactivate(); } DistrhoPluginStereoEnhancer::~DistrhoPluginStereoEnhancer() { } // ------------------------------------------------- // Init void DistrhoPluginStereoEnhancer::d_initParameter(uint32_t index, Parameter& parameter) { switch (index) { case paramWidthLows: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Width Lows"; parameter.symbol = "width_lows"; parameter.unit = "%"; parameter.ranges.def = 0.0f; parameter.ranges.min = 100.0f; parameter.ranges.max = 200.0f; break; case paramWidthHighs: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "WidthHighs"; parameter.symbol = "width_highs"; parameter.unit = "%"; parameter.ranges.def = 0.0f; parameter.ranges.min = 100.0f; parameter.ranges.max = 200.0f; break; case paramCrossover: parameter.hints = PARAMETER_IS_AUTOMABLE; parameter.name = "Crossover"; parameter.symbol = "crossover"; parameter.unit = "%"; parameter.ranges.def = 0.0f; parameter.ranges.min = 27.51604f; parameter.ranges.max = 100.0f; break; } } void DistrhoPluginStereoEnhancer::d_initProgramName(uint32_t index, d_string& programName) { if (index != 0) return; programName = "Default"; } // ------------------------------------------------- // Internal data float DistrhoPluginStereoEnhancer::d_parameterValue(uint32_t index) { switch (index) { case paramWidthLows: return widthLP; case paramWidthHighs: return widthHP; case paramCrossover: return freqHP; default: return 0.0f; } } void DistrhoPluginStereoEnhancer::d_setParameterValue(uint32_t index, float value) { if (d_sampleRate() <= 0.0) return; switch (index) { case paramWidthLows: widthLP = value; widthCoeffLP = std::fmax(widthLP, 1.0f); break; case paramWidthHighs: widthHP = value; widthCoeffHP = std::fmax(widthHP, 1.0f); break; case paramCrossover: freqHPFader = value; freqHP = freqHPFader*freqHPFader*freqHPFader*24000.0f; xHP = std::exp(-2.0f * cfPI * freqHP / (float)d_sampleRate()); a0HP = 1.0f-xHP; b1HP = -xHP; break; } } void DistrhoPluginStereoEnhancer::d_setProgram(uint32_t index) { if (index != 0) return; // Default values widthLP = 100.0f; widthHP = 100.0f; freqHPFader = 27.51604f; // Internal stuff widthCoeffLP = 1.0f; widthCoeffHP = 1.0f; freqHP = 500.0f; // reset filter values d_activate(); } // ------------------------------------------------- // Process void DistrhoPluginStereoEnhancer::d_activate() { xHP = std::exp(-2.0f * cfPI * freqHP/ (float)d_sampleRate()); a0HP = 1.0f-xHP; b1HP = -xHP; } void DistrhoPluginStereoEnhancer::d_deactivate() { out1HP = out2HP = 0.0f; tmp1HP = tmp2HP = 0.0f; } void DistrhoPluginStereoEnhancer::d_run(float** inputs, float** outputs, uint32_t frames, uint32_t, const MidiEvent*) { float* in1 = inputs[0]; float* in2 = inputs[1]; float* out1 = outputs[0]; float* out2 = outputs[1]; for (uint32_t i=0; i < frames; ++i) { out1HP = in1[i]; out2HP = in2[i]; in1[i] = (tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + cfDC_ADD); in2[i] = (tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + cfDC_ADD); out1HP -= in1[i]; out2HP -= in2[i]; monoLP = (in1[i] + in2[i]) / 2.0f; stereoLP = in1[i] - in2[i]; (*in1) = (monoLP + stereoLP * widthLP) / widthCoeffLP; (*in2) = (monoLP - stereoLP * widthLP) / widthCoeffLP; monoHP = (out1HP + out2HP) / 2.0f; stereoHP = out1HP - out2HP; out1HP = (monoHP + stereoHP * widthHP) / widthCoeffHP; out2HP = (monoHP - stereoHP * widthHP) / widthCoeffHP; out1[i] = in1[i] + out1HP; out2[i] = in2[i] + out2HP; } } // ------------------------------------------------- Plugin* createPlugin() { return new DistrhoPluginStereoEnhancer(); } // ------------------------------------------------- END_NAMESPACE_DISTRHO