BogaudioModules

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

commit e9cd6d844bef1a4a78857d949f244181c1abee9e
parent ee8cfbf5db9f008152d0cf37a5fd45e3a95aea08
Author: Matt Demanett <matt@demanett.net>
Date:   Tue,  1 Oct 2019 22:26:24 -0400

POLY: MIX1.

Diffstat:
Msrc/Mix1.cpp | 50+++++++++++++++++++++++++++++++++++++++++++++-----
Msrc/Mix1.hpp | 26++++++++++----------------
Msrc/mixer.cpp | 8++++----
Msrc/mixer.hpp | 2+-
4 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/src/Mix1.cpp b/src/Mix1.cpp @@ -2,12 +2,52 @@ #include "Mix1.hpp" void Mix1::sampleRateChange() { - _channel->setSampleRate(APP->engine->getSampleRate()); + float sr = APP->engine->getSampleRate(); + for (int c = 0; c < _channels; ++c) { + _engines[c]->setSampleRate(sr); + } +} + +bool Mix1::active() { + return outputs[OUT_OUTPUT].isConnected(); +} + +int Mix1::channels() { + return inputs[IN_INPUT].getChannels(); +} + +void Mix1::addEngine(int c) { + _engines[c] = new MixerChannel( + params[LEVEL_PARAM], + params[LEVEL_PARAM], // not used + params[MUTE_PARAM], + inputs[LEVEL_INPUT], + inputs[LEVEL_INPUT], // not used + 1000.0f, + &inputs[MUTE_INPUT] + ); + _engines[c]->setSampleRate(APP->engine->getSampleRate()); +} + +void Mix1::removeEngine(int c) { + delete _engines[c]; + _engines[c] = NULL; +} + +void Mix1::always(const ProcessArgs& args) { + _rmsSum = 0.0f; +} + +void Mix1::processChannel(const ProcessArgs& args, int c) { + MixerChannel& e = *_engines[c]; + e.next(inputs[IN_INPUT].getVoltage(c), false, false, c); + _rmsSum += e.rms; + outputs[OUT_OUTPUT].setChannels(_channels); + outputs[OUT_OUTPUT].setVoltage(e.out, c); } -void Mix1::processChannel(const ProcessArgs& args, int _c) { - _channel->next(inputs[IN_INPUT].getVoltageSum(), false, false); - outputs[OUT_OUTPUT].setVoltage(_channel->out); +void Mix1::postProcess(const ProcessArgs& args) { + _rms = _rmsSum / (float)_channels; } struct Mix1Widget : ModuleWidget { @@ -41,7 +81,7 @@ struct Mix1Widget : ModuleWidget { { auto slider = createParam<VUSlider151>(levelParamPosition, module, Mix1::LEVEL_PARAM); if (module) { - dynamic_cast<VUSlider*>(slider)->setVULevel(&module->_channel->rms); + dynamic_cast<VUSlider*>(slider)->setVULevel(&module->_rms); } addParam(slider); } diff --git a/src/Mix1.hpp b/src/Mix1.hpp @@ -33,30 +33,24 @@ struct Mix1 : BGModule { NUM_LIGHTS }; - MixerChannel* _channel = NULL; + MixerChannel* _engines[maxChannels] {}; + float _rmsSum = 0.0f; + float _rms = 0.0f; Mix1() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(LEVEL_PARAM, 0.0f, 1.0f, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels), "Level", "dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Mute"); - - _channel = new MixerChannel( - params[LEVEL_PARAM], - params[LEVEL_PARAM], // not used - params[MUTE_PARAM], - inputs[LEVEL_INPUT], - inputs[LEVEL_INPUT], // not used - 1000.0f, - &inputs[MUTE_INPUT] - ); - sampleRateChange(); - } - virtual ~Mix1() { - delete _channel; } void sampleRateChange() override; - void processChannel(const ProcessArgs& args, int _c) override; + bool active() override; + int channels() override; + void addEngine(int c) override; + void removeEngine(int c) override; + void always(const ProcessArgs& args) override; + void processChannel(const ProcessArgs& args, int c) override; + void postProcess(const ProcessArgs& args) override; }; } // namespace bogaudio diff --git a/src/mixer.cpp b/src/mixer.cpp @@ -12,10 +12,10 @@ void MixerChannel::setSampleRate(float sampleRate) { _rms.setSampleRate(sampleRate); } -void MixerChannel::next(float sample, bool stereo, bool solo) { +void MixerChannel::next(float sample, bool stereo, bool solo, int c) { float mute = _muteParam.getValue(); if (_muteInput) { - mute += clamp(_muteInput->getVoltage(), 0.0f, 10.0f); + mute += clamp(_muteInput->getPolyVoltage(c), 0.0f, 10.0f); } bool muted = solo ? mute < 2.0f : mute > 0.5f; if (muted) { @@ -24,7 +24,7 @@ void MixerChannel::next(float sample, bool stereo, bool solo) { else { float level = clamp(_levelParam.getValue(), 0.0f, 1.0f); if (_levelInput.isConnected()) { - level *= clamp(_levelInput.getVoltage() / 10.0f, 0.0f, 1.0f); + level *= clamp(_levelInput.getPolyVoltage(c) / 10.0f, 0.0f, 1.0f); } level *= maxDecibels - minDecibels; level += minDecibels; @@ -36,7 +36,7 @@ void MixerChannel::next(float sample, bool stereo, bool solo) { if (stereo) { float pan = clamp(_panParam.getValue(), -1.0f, 1.0f); if (_panInput.isConnected()) { - pan *= clamp(_panInput.getVoltage() / 5.0f, -1.0f, 1.0f); + pan *= clamp(_panInput.getPolyVoltage(c) / 5.0f, -1.0f, 1.0f); } _panner.setPan(_panSL.next(pan)); _panner.next(out, left, right); diff --git a/src/mixer.hpp b/src/mixer.hpp @@ -52,7 +52,7 @@ struct MixerChannel { } void setSampleRate(float sampleRate); - void next(float sample, bool stereo, bool solo); // outputs on out, left, right, rms. + void next(float sample, bool stereo, bool solo, int c = 0); // outputs on out, left, right, rms. }; struct MuteButton : ToggleButton {