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