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:
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