BogaudioModules

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

commit 24c2ceecc78cf0fd2237a0e54e6fceab4e41a712
parent 6f7b9602b70a2673b1cb4273ea5f5b2505ea27e3
Author: Matt Demanett <matt@demanett.net>
Date:   Sun, 19 Jul 2020 21:22:33 -0400

MIX4/8: add DIM button, to toggle a reduction in the master output; amount defaults to -12dB and is settable on the menu. #118

Diffstat:
Mres-src/Mix4-src.svg | 2++
Mres-src/Mix8-src.svg | 2++
Mres/Mix4.svg | 0
Mres/Mix8.svg | 0
Msrc/Mix4.cpp | 16+++++++++++++---
Msrc/Mix4.hpp | 4+++-
Msrc/Mix8.cpp | 16+++++++++++++---
Msrc/Mix8.hpp | 4+++-
Msrc/mixer.cpp | 29+++++++++++++++++++++++++++++
Msrc/mixer.hpp | 11+++++++++++
10 files changed, 76 insertions(+), 8 deletions(-)

diff --git a/res-src/Mix4-src.svg b/res-src/Mix4-src.svg @@ -222,6 +222,8 @@ <use id="MIX_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> <use id="MIX_MUTE_PARAM" xlink:href="#button" transform="translate(12.5 165)" /> <text font-size="5pt" letter-spacing="2px" transform="translate(10 192)">MUTE</text> + <use id="MIX_DIM_PARAM" xlink:href="#button" transform="translate(12.5 198)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(14.5 225)">DIM</text> <g transform="translate(5.5 229)"> <rect width="34" height="50" rx="5" fill="#fafafa" /> <use id="MIX_CV_INPUT" xlink:href="#input" transform="translate(5 3)" /> diff --git a/res-src/Mix8-src.svg b/res-src/Mix8-src.svg @@ -310,6 +310,8 @@ <use id="MIX_PARAM" xlink:href="#slider" transform="translate(13.5 12)" /> <use id="MIX_MUTE_PARAM" xlink:href="#button" transform="translate(12.5 165)" /> <text font-size="5pt" letter-spacing="2px" transform="translate(10 192)">MUTE</text> + <use id="MIX_DIM_PARAM" xlink:href="#button" transform="translate(12.5 198)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(14.5 225)">DIM</text> <g transform="translate(5.5 229)"> <rect width="34" height="50" rx="5" fill="#fafafa" /> <use id="MIX_CV_INPUT" xlink:href="#input" transform="translate(5 3)" /> diff --git a/res/Mix4.svg b/res/Mix4.svg Binary files differ. diff --git a/res/Mix8.svg b/res/Mix8.svg Binary files differ. diff --git a/src/Mix4.cpp b/src/Mix4.cpp @@ -4,12 +4,13 @@ #define POLY_OFFSET "poly_channel_offset" json_t* Mix4::dataToJson() { - json_t* root = json_object(); + json_t* root = DimmableMixerModule::dataToJson(); json_object_set_new(root, POLY_OFFSET, json_integer(_polyChannelOffset)); return root; } void Mix4::dataFromJson(json_t* root) { + DimmableMixerModule::dataFromJson(root); json_t* o = json_object_get(root, POLY_OFFSET); if (o) { _polyChannelOffset = json_integer_value(o); @@ -100,6 +101,9 @@ void Mix4::processAll(const ProcessArgs& args) { } level *= MixerChannel::maxDecibels - MixerChannel::minDecibels; level += MixerChannel::minDecibels; + if (params[MIX_DIM_PARAM].getValue() > 0.5f) { + level = std::max(Amplifier::minDecibels, level - _dimDb); + } } _amplifier.setLevel(_slewLimiter.next(level)); @@ -152,7 +156,7 @@ void Mix4::processAll(const ProcessArgs& args) { } } -struct Mix4Widget : ModuleWidget { +struct Mix4Widget : DimmableMixerWidget { static constexpr int hp = 15; Mix4Widget(Mix4* module) { @@ -186,6 +190,7 @@ struct Mix4Widget : ModuleWidget { auto pan4ParamPosition = Vec(147.5, 223.0); auto mixParamPosition = Vec(189.5, 32.0); auto mixMuteParamPosition = Vec(189.2, 185.7); + auto mixDimParamPosition = Vec(189.2, 218.7); auto cv1InputPosition = Vec(14.5, 255.0); auto pan1InputPosition = Vec(14.5, 290.0); @@ -223,6 +228,11 @@ struct Mix4Widget : ModuleWidget { b->setRandomize(false); addParam(b); } + { + auto b = createParam<MuteButton>(mixDimParamPosition, module, Mix4::MIX_DIM_PARAM); + b->setRandomize(false); + addParam(b); + } addInput(createInput<Port24>(cv1InputPosition, module, Mix4::CV1_INPUT)); addInput(createInput<Port24>(pan1InputPosition, module, Mix4::PAN1_INPUT)); @@ -251,9 +261,9 @@ struct Mix4Widget : ModuleWidget { } void appendContextMenu(Menu* menu) override { + DimmableMixerWidget::appendContextMenu(menu); auto m = dynamic_cast<Mix4*>(module); assert(m); - menu->addChild(new MenuLabel()); OptionsMenuItem* mi = new OptionsMenuItem("Input 1 poly spread"); mi->addItem(OptionMenuItem("None", [m]() { return m->_polyChannelOffset == -1; }, [m]() { m->_polyChannelOffset = -1; })); mi->addItem(OptionMenuItem("Channels 1-4", [m]() { return m->_polyChannelOffset == 0; }, [m]() { m->_polyChannelOffset = 0; })); diff --git a/src/Mix4.hpp b/src/Mix4.hpp @@ -6,7 +6,7 @@ using namespace bogaudio::dsp; namespace bogaudio { -struct Mix4 : ExpandableModule<Mix4ExpanderMessage, BGModule> { +struct Mix4 : ExpandableModule<Mix4ExpanderMessage, DimmableMixerModule> { enum ParamsIds { LEVEL1_PARAM, PAN1_PARAM, @@ -22,6 +22,7 @@ struct Mix4 : ExpandableModule<Mix4ExpanderMessage, BGModule> { MUTE4_PARAM, MIX_PARAM, MIX_MUTE_PARAM, + MIX_DIM_PARAM, NUM_PARAMS }; @@ -78,6 +79,7 @@ struct Mix4 : ExpandableModule<Mix4ExpanderMessage, BGModule> { configParam(MUTE4_PARAM, 0.0f, 3.0f, 0.0f, "Channel 4 mute"); configParam(MIX_PARAM, 0.0f, 1.0f, levelDefault, "Master level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(MIX_MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Master mute"); + configParam(MIX_DIM_PARAM, 0.0f, 1.0f, 0.0f, "Master dim"); _channels[0] = new MixerChannel(params[LEVEL1_PARAM], params[MUTE1_PARAM], inputs[CV1_INPUT]); _channels[1] = new MixerChannel(params[LEVEL2_PARAM], params[MUTE2_PARAM], inputs[CV2_INPUT]); diff --git a/src/Mix8.cpp b/src/Mix8.cpp @@ -4,12 +4,13 @@ #define POLY_OFFSET "poly_channel_offset" json_t* Mix8::dataToJson() { - json_t* root = json_object(); + json_t* root = DimmableMixerModule::dataToJson(); json_object_set_new(root, POLY_OFFSET, json_integer(_polyChannelOffset)); return root; } void Mix8::dataFromJson(json_t* root) { + DimmableMixerModule::dataFromJson(root); json_t* o = json_object_get(root, POLY_OFFSET); if (o) { _polyChannelOffset = json_integer_value(o); @@ -108,6 +109,9 @@ void Mix8::processAll(const ProcessArgs& args) { } level *= MixerChannel::maxDecibels - MixerChannel::minDecibels; level += MixerChannel::minDecibels; + if (params[MIX_DIM_PARAM].getValue() > 0.5f) { + level = std::max(Amplifier::minDecibels, level - _dimDb); + } } _amplifier.setLevel(_slewLimiter.next(level)); @@ -160,7 +164,7 @@ void Mix8::processAll(const ProcessArgs& args) { } } -struct Mix8Widget : ModuleWidget { +struct Mix8Widget : DimmableMixerWidget { static constexpr int hp = 27; Mix8Widget(Mix8* module) { @@ -206,6 +210,7 @@ struct Mix8Widget : ModuleWidget { auto pan8ParamPosition = Vec(326.5, 223.0); auto mixParamPosition = Vec(369.5, 32.0); auto mixMuteParamPosition = Vec(369.2, 185.7); + auto mixDimParamPosition = Vec(369.2, 218.7); auto cv1InputPosition = Vec(14.5, 255.0); auto pan1InputPosition = Vec(14.5, 290.0); @@ -267,6 +272,11 @@ struct Mix8Widget : ModuleWidget { b->setRandomize(false); addParam(b); } + { + auto b = createParam<MuteButton>(mixDimParamPosition, module, Mix8::MIX_DIM_PARAM); + b->setRandomize(false); + addParam(b); + } addInput(createInput<Port24>(cv1InputPosition, module, Mix8::CV1_INPUT)); addInput(createInput<Port24>(pan1InputPosition, module, Mix8::PAN1_INPUT)); @@ -307,9 +317,9 @@ struct Mix8Widget : ModuleWidget { } void appendContextMenu(Menu* menu) override { + DimmableMixerWidget::appendContextMenu(menu); auto m = dynamic_cast<Mix8*>(module); assert(m); - menu->addChild(new MenuLabel()); OptionsMenuItem* mi = new OptionsMenuItem("Input 1 poly spread"); mi->addItem(OptionMenuItem("None", [m]() { return m->_polyChannelOffset == -1; }, [m]() { m->_polyChannelOffset = -1; })); mi->addItem(OptionMenuItem("Channels 1-8", [m]() { return m->_polyChannelOffset == 0; }, [m]() { m->_polyChannelOffset = 0; })); diff --git a/src/Mix8.hpp b/src/Mix8.hpp @@ -6,7 +6,7 @@ using namespace bogaudio::dsp; namespace bogaudio { -struct Mix8 : ExpandableModule<Mix8ExpanderMessage, BGModule> { +struct Mix8 : ExpandableModule<Mix8ExpanderMessage, DimmableMixerModule> { enum ParamsIds { LEVEL1_PARAM, MUTE1_PARAM, @@ -34,6 +34,7 @@ struct Mix8 : ExpandableModule<Mix8ExpanderMessage, BGModule> { PAN8_PARAM, MIX_PARAM, MIX_MUTE_PARAM, + MIX_DIM_PARAM, NUM_PARAMS }; @@ -114,6 +115,7 @@ struct Mix8 : ExpandableModule<Mix8ExpanderMessage, BGModule> { configParam(MUTE8_PARAM, 0.0f, 3.0f, 0.0f, "Channel 8 mute"); configParam(MIX_PARAM, 0.0f, 1.0f, levelDefault, "Master level", " dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels); configParam(MIX_MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Master mute"); + configParam(MIX_DIM_PARAM, 0.0f, 1.0f, 0.0f, "Master dim"); _channels[0] = new MixerChannel(params[LEVEL1_PARAM], params[MUTE1_PARAM], inputs[CV1_INPUT]); _channels[1] = new MixerChannel(params[LEVEL2_PARAM], params[MUTE2_PARAM], inputs[CV2_INPUT]); diff --git a/src/mixer.cpp b/src/mixer.cpp @@ -38,6 +38,35 @@ void MixerChannel::next(float sample, bool solo, int c) { } +#define DIM_DB "dim_decibels" + +json_t* DimmableMixerModule::dataToJson() { + json_t* root = json_object(); + json_object_set_new(root, DIM_DB, json_real(_dimDb)); + return root; +} + +void DimmableMixerModule::dataFromJson(json_t* root) { + json_t* o = json_object_get(root, DIM_DB); + if (o) { + _dimDb = json_real_value(o); + } +} + + +void DimmableMixerWidget::appendContextMenu(Menu* menu) { + auto m = dynamic_cast<DimmableMixerModule*>(module); + assert(m); + menu->addChild(new MenuLabel()); + OptionsMenuItem* da = new OptionsMenuItem("Dim amount"); + da->addItem(OptionMenuItem("-6 dB", [m]() { return m->_dimDb == 6.0f; }, [m]() { m->_dimDb = 6.0f; })); + da->addItem(OptionMenuItem("-12 dB", [m]() { return m->_dimDb == 12.0f; }, [m]() { m->_dimDb = 12.0f; })); + da->addItem(OptionMenuItem("-18 dB", [m]() { return m->_dimDb == 18.0f; }, [m]() { m->_dimDb = 18.0f; })); + da->addItem(OptionMenuItem("-24 dB", [m]() { return m->_dimDb == 24.0f; }, [m]() { m->_dimDb = 24.0f; })); + OptionsMenuItem::addToMenu(da, menu); +} + + void MuteButton::randomize() { if (_randomize) { ToggleButton::randomize(); diff --git a/src/mixer.hpp b/src/mixer.hpp @@ -48,6 +48,17 @@ struct MixerChannel { void next(float sample, bool solo, int c = 0); // outputs on members out, rms. }; +struct DimmableMixerModule : BGModule { + float _dimDb = 12.0f; + + json_t* dataToJson() override; + void dataFromJson(json_t* root) override; +}; + +struct DimmableMixerWidget : ModuleWidget { + void appendContextMenu(Menu* menu) override; +}; + struct MuteButton : ToggleButton { bool _randomize = true;