BogaudioModules

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

commit ed8926384888a592c060ff97e59ec1a7f9abfa7c
parent 5eff65f1614b2b080d8bc4676a98a7300b833957
Author: Matt Demanett <matt@demanett.net>
Date:   Mon, 17 Aug 2020 10:04:57 -0400

MUMIX: add averaging mode, from UMIX. #135

Diffstat:
MREADME-prerelease.md | 4+++-
Msrc/Mumix.cpp | 18++++++++++++++++--
Msrc/Mumix.hpp | 5+++--
Msrc/UMix.cpp | 25+------------------------
Msrc/UMix.hpp | 7++-----
Asrc/sum_average.cpp | 28++++++++++++++++++++++++++++
Asrc/sum_average.hpp | 21+++++++++++++++++++++
7 files changed, 74 insertions(+), 34 deletions(-)

diff --git a/README-prerelease.md b/README-prerelease.md @@ -526,7 +526,9 @@ _Polyphony:_ <a href="#polyphony">Polyphonic</a>, with polyphonic channels defin #### <a name="mumix"></a> MUMIX -Essentially identical to UMIX, but with mute buttons for each input, and with no averaging mode. +Essentially identical to UMIX, but with mute buttons for each input. + +If averaging mode is enabled, note that the averaging is based on how many inputs are connected and not muted. For example, if three inputs are connected, and one is muted, the output will be the sum of the two unmuted channels, divided by two. _Polyphony:_ same as UMIX. diff --git a/src/Mumix.cpp b/src/Mumix.cpp @@ -34,8 +34,19 @@ void Mumix::modulate() { } void Mumix::processAlways(const ProcessArgs& args) { + int active = 0; for (int i = 0; i < 8; ++i) { - _amplifiers[i].setLevel(_slewLimiters[i].next(_muted[i] ? minDecibels : maxDecibels)); + float level = _slewLimiters[i].next(_muted[i] ? minDecibels : maxDecibels); + _amplifiers[i].setLevel(level); + if (!_sum && inputs[IN1_INPUT + i].isConnected() && level > minDecibels + 1.0f) { + ++active; + } + } + if (_sum) { + _invActive = 0.0f; + } + else { + _invActive = active > 0 ? 1.0f / (float)active : 0.0f; } } @@ -46,6 +57,9 @@ void Mumix::processChannel(const ProcessArgs& args, int c) { for (int i = 0; i < 8; ++i) { out += _inputGainLevel * _amplifiers[i].next(inputs[IN1_INPUT + i].getPolyVoltage(c)); } + if (!_sum && _invActive > 0.0f) { + out *= _invActive; + } if (_clippingMode == HARD_CLIPPING) { outputs[OUT_OUTPUT].setVoltage(clamp(out, -12.0f, 12.0f), c); } @@ -54,7 +68,7 @@ void Mumix::processChannel(const ProcessArgs& args, int c) { } } -struct MumixWidget : MatrixBaseModuleWidget { +struct MumixWidget : SumAverageModuleWidget { static constexpr int hp = 6; MumixWidget(Mumix* module) { diff --git a/src/Mumix.hpp b/src/Mumix.hpp @@ -1,7 +1,7 @@ #pragma once #include "bogaudio.hpp" -#include "matrix_base.hpp" +#include "sum_average.hpp" #include "dsp/signal.hpp" using namespace bogaudio::dsp; @@ -10,7 +10,7 @@ extern Model* modelMumix; namespace bogaudio { -struct Mumix : MatrixBaseModule { +struct Mumix : SumAverageModule { enum ParamsIds { MUTE1_PARAM, MUTE2_PARAM, @@ -48,6 +48,7 @@ struct Mumix : MatrixBaseModule { Amplifier _amplifiers[maxChannels]; bogaudio::dsp::SlewLimiter _slewLimiters[maxChannels]; bool _muted[8] {}; + float _invActive = 0.0f; Mumix() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); diff --git a/src/UMix.cpp b/src/UMix.cpp @@ -1,22 +1,6 @@ #include "UMix.hpp" -#define SUM "sum" - -json_t* UMix::toJson(json_t* root) { - root = MatrixBaseModule::toJson(root); - json_object_set_new(root, SUM, json_boolean(_sum)); - return root; -} - -void UMix::fromJson(json_t* root) { - MatrixBaseModule::fromJson(root); - json_t* s = json_object_get(root, SUM); - if (s) { - _sum = json_is_true(s); - } -} - bool UMix::active() { return outputs[OUT_OUTPUT].isConnected(); } @@ -64,7 +48,7 @@ void UMix::processChannel(const ProcessArgs& args, int c) { } } -struct UMixWidget : MatrixBaseModuleWidget { +struct UMixWidget : SumAverageModuleWidget { static constexpr int hp = 3; UMixWidget(UMix* module) { @@ -97,13 +81,6 @@ struct UMixWidget : MatrixBaseModuleWidget { addOutput(createOutput<Port24>(outOutputPosition, module, UMix::OUT_OUTPUT)); } - - void contextMenu(Menu* menu) override { - auto m = dynamic_cast<UMix*>(module); - assert(m); - MatrixBaseModuleWidget::contextMenu(menu); - menu->addChild(new OptionMenuItem("Average", [m]() { return !m->_sum; }, [m]() { m->_sum = !m->_sum; })); - } }; Model* modelUMix = bogaudio::createModel<UMix, UMixWidget>("Bogaudio-UMix", "UMIX", "8-input unity mixer", "Mixer", "Polyphonic"); diff --git a/src/UMix.hpp b/src/UMix.hpp @@ -1,7 +1,7 @@ #pragma once #include "bogaudio.hpp" -#include "matrix_base.hpp" +#include "sum_average.hpp" #include "dsp/signal.hpp" using namespace bogaudio::dsp; @@ -10,7 +10,7 @@ extern Model* modelUMix; namespace bogaudio { -struct UMix : MatrixBaseModule { +struct UMix : SumAverageModule { enum ParamsIds { NUM_PARAMS }; @@ -32,15 +32,12 @@ struct UMix : MatrixBaseModule { NUM_OUTPUTS }; - bool _sum = true; Saturator _saturator[maxChannels]; UMix() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); } - json_t* toJson(json_t* root) override; - void fromJson(json_t* root) override; bool active() override; int channels() override; void processChannel(const ProcessArgs& args, int c) override; diff --git a/src/sum_average.cpp b/src/sum_average.cpp @@ -0,0 +1,28 @@ + +#include "sum_average.hpp" + +using namespace bogaudio; + +#define SUM "sum" + +json_t* SumAverageModule::toJson(json_t* root) { + root = MatrixBaseModule::toJson(root); + json_object_set_new(root, SUM, json_boolean(_sum)); + return root; +} + +void SumAverageModule::fromJson(json_t* root) { + MatrixBaseModule::fromJson(root); + json_t* s = json_object_get(root, SUM); + if (s) { + _sum = json_is_true(s); + } +} + + +void SumAverageModuleWidget::contextMenu(Menu* menu) { + auto m = dynamic_cast<SumAverageModule*>(module); + assert(m); + MatrixBaseModuleWidget::contextMenu(menu); + menu->addChild(new OptionMenuItem("Average", [m]() { return !m->_sum; }, [m]() { m->_sum = !m->_sum; })); +} diff --git a/src/sum_average.hpp b/src/sum_average.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "bogaudio.hpp" +#include "matrix_base.hpp" + +using namespace rack; + +namespace bogaudio { + +struct SumAverageModule : MatrixBaseModule { + bool _sum = true; + + json_t* toJson(json_t* root) override; + void fromJson(json_t* root) override; +}; + +struct SumAverageModuleWidget : MatrixBaseModuleWidget { + void contextMenu(Menu* menu) override; +}; + +} // namespace bogaudio