BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit d361345c974c383d3d39fb5a81603f51f7a5ff6e
parent be0b43922bdf0311dc8463de57f02e9467892bdd
Author: Matt Demanett <matt@demanett.net>
Date:   Fri, 15 Nov 2019 18:00:31 -0500

Poly support for CLPR. #78

Diffstat:
Msrc/Clpr.cpp | 55++++++++++++++++++++++++++++++++++++++-----------------
Msrc/Clpr.hpp | 24++++++++++++++++--------
2 files changed, 54 insertions(+), 25 deletions(-)

diff --git a/src/Clpr.cpp b/src/Clpr.cpp @@ -5,39 +5,60 @@ bool Clpr::active() { return outputs[LEFT_OUTPUT].isConnected() || outputs[RIGHT_OUTPUT].isConnected(); } +int Clpr::channels() { + return std::max(inputs[LEFT_INPUT].getChannels(), inputs[RIGHT_INPUT].getChannels()); +} + +void Clpr::addEngine(int c) { + _engines[c] = new Engine(); +} + +void Clpr::removeEngine(int c) { + delete _engines[c]; + _engines[c] = NULL; +} + void Clpr::modulate() { - _thresholdDb = params[THRESHOLD_PARAM].getValue(); + _softKnee = params[KNEE_PARAM].getValue() > 0.5f; +} + +void Clpr::modulateChannel(int c) { + Engine& e = *_engines[c]; + + e.thresholdDb = params[THRESHOLD_PARAM].getValue(); if (inputs[THRESHOLD_INPUT].isConnected()) { - _thresholdDb *= clamp(inputs[THRESHOLD_INPUT].getVoltage() / 10.0f, 0.0f, 1.0f); + e.thresholdDb *= clamp(inputs[THRESHOLD_INPUT].getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); } - _thresholdDb *= 30.0f; - _thresholdDb -= 24.0f; + e.thresholdDb *= 30.0f; + e.thresholdDb -= 24.0f; float outGain = params[OUTPUT_GAIN_PARAM].getValue(); if (inputs[OUTPUT_GAIN_INPUT].isConnected()) { - outGain = clamp(outGain + inputs[OUTPUT_GAIN_INPUT].getVoltage() / 5.0f, 0.0f, 1.0f); + outGain = clamp(outGain + inputs[OUTPUT_GAIN_INPUT].getPolyVoltage(c) / 5.0f, 0.0f, 1.0f); } outGain *= 24.0f; - if (_outGain != outGain) { - _outGain = outGain; - _outLevel = decibelsToAmplitude(_outGain); + if (e.outGain != outGain) { + e.outGain = outGain; + e.outLevel = decibelsToAmplitude(e.outGain); } - - _softKnee = params[KNEE_PARAM].getValue() > 0.5f; } -void Clpr::processChannel(const ProcessArgs& args, int _c) { - float leftInput = inputs[LEFT_INPUT].getVoltageSum(); - float rightInput = inputs[RIGHT_INPUT].getVoltageSum(); +void Clpr::processChannel(const ProcessArgs& args, int c) { + Engine& e = *_engines[c]; + + float leftInput = inputs[LEFT_INPUT].getPolyVoltage(c); + float rightInput = inputs[RIGHT_INPUT].getPolyVoltage(c); float env = fabsf(leftInput + rightInput); float detectorDb = amplitudeToDecibels(env / 5.0f); - float compressionDb = _compressor.compressionDb(detectorDb, _thresholdDb, Compressor::maxEffectiveRatio, _softKnee); - _amplifier.setLevel(-compressionDb); + float compressionDb = e.compressor.compressionDb(detectorDb, e.thresholdDb, Compressor::maxEffectiveRatio, _softKnee); + e.amplifier.setLevel(-compressionDb); if (outputs[LEFT_OUTPUT].isConnected()) { - outputs[LEFT_OUTPUT].setVoltage(_saturator.next(_amplifier.next(leftInput) * _outLevel)); + outputs[LEFT_OUTPUT].setChannels(_channels); + outputs[LEFT_OUTPUT].setVoltage(e.saturator.next(e.amplifier.next(leftInput) * e.outLevel), c); } if (outputs[RIGHT_OUTPUT].isConnected()) { - outputs[RIGHT_OUTPUT].setVoltage(_saturator.next(_amplifier.next(rightInput) * _outLevel)); + outputs[RIGHT_OUTPUT].setChannels(_channels); + outputs[RIGHT_OUTPUT].setVoltage(e.saturator.next(e.amplifier.next(rightInput) * e.outLevel), c); } } diff --git a/src/Clpr.hpp b/src/Clpr.hpp @@ -35,14 +35,18 @@ struct Clpr : BGModule { NUM_LIGHTS }; - float _thresholdDb = 0.0f; - float _outGain = -1.0f; - float _outLevel = 0.0f; - bool _softKnee = true; + struct Engine { + float thresholdDb = 0.0f; + float outGain = -1.0f; + float outLevel = 0.0f; + + Compressor compressor; + Amplifier amplifier; + Saturator saturator; + }; - Compressor _compressor; - Amplifier _amplifier; - Saturator _saturator; + Engine* _engines[maxChannels] {}; + bool _softKnee = true; Clpr() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); @@ -52,8 +56,12 @@ struct Clpr : BGModule { } bool active() override; + int channels() override; + void addEngine(int c) override; + void removeEngine(int c) override; void modulate() override; - void processChannel(const ProcessArgs& args, int _c) override; + void modulateChannel(int c) override; + void processChannel(const ProcessArgs& args, int c) override; }; } // namespace bogaudio