commit dc75f5e1dc93d3225e4c3030d72030a515d80239
parent 14ee1e2573dbda2b22edf9c44b82ef9a1f82ea1b
Author: Matt Demanett <matt@demanett.net>
Date: Sun, 17 Mar 2019 00:57:42 -0400
MIX4, MIX8, MUTE8: right-click on mute buttons solo the corresponding channel. #38
Diffstat:
8 files changed, 146 insertions(+), 39 deletions(-)
diff --git a/res-src/button_18px_1_green-src.svg b/res-src/button_18px_1_green-src.svg
@@ -0,0 +1,28 @@
+<svg
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="18"
+ height="18"
+ viewBox="0 0 18 18"
+>
+ <g transform="translate(9 9)">
+ <circle r="8.9" fill="#888" />
+ <circle r="8.4" fill="#333" />
+
+ <circle r="8.1" fill="#5f5" />
+ <circle r="8.1" fill="#666" fill-opacity="0.5" />
+
+ <circle r="7.8" fill="#5f5" />
+ <circle r="7.8" fill="#777" fill-opacity="0.5" />
+
+ <circle r="7.5" fill="#5f5" />
+ <circle r="7.5" fill="#888" fill-opacity="0.5" />
+
+ <circle r="7.2" fill="#5f5" />
+ <circle r="7.2" fill="#999" fill-opacity="0.5" />
+
+ <circle r="6.9" fill="#5f5" />
+ <circle r="6.9" fill="#aaa" fill-opacity="0.5" />
+ </g>
+</svg>
diff --git a/res/button_18px_1_green.svg b/res/button_18px_1_green.svg
Binary files differ.
diff --git a/src/Mix4.cpp b/src/Mix4.cpp
@@ -13,10 +13,15 @@ void Mix4::onSampleRateChange() {
void Mix4::step() {
bool stereo = outputs[L_OUTPUT].active && outputs[R_OUTPUT].active;
- _channel1.next(stereo);
- _channel2.next(stereo);
- _channel3.next(stereo);
- _channel4.next(stereo);
+ bool solo =
+ params[MUTE1_PARAM].value > 1.5f ||
+ params[MUTE2_PARAM].value > 1.5f ||
+ params[MUTE3_PARAM].value > 1.5f ||
+ params[MUTE4_PARAM].value > 1.5f;
+ _channel1.next(stereo, solo);
+ _channel2.next(stereo, solo);
+ _channel3.next(stereo, solo);
+ _channel4.next(stereo, solo);
float level = Amplifier::minDecibels;
if (params[MIX_MUTE_PARAM].value < 0.5f) {
@@ -116,16 +121,16 @@ struct Mix4Widget : ModuleWidget {
addSlider(level1ParamPosition, module, Mix4::LEVEL1_PARAM, module->_channel1.rms);
addParam(ParamWidget::create<Knob16>(pan1ParamPosition, module, Mix4::PAN1_PARAM, -1.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute1ParamPosition, module, Mix4::MUTE1_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute1ParamPosition, module, Mix4::MUTE1_PARAM, 0.0, 3.0, 0.0));
addSlider(level2ParamPosition, module, Mix4::LEVEL2_PARAM, module->_channel2.rms);
addParam(ParamWidget::create<Knob16>(pan2ParamPosition, module, Mix4::PAN2_PARAM, -1.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute2ParamPosition, module, Mix4::MUTE2_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute2ParamPosition, module, Mix4::MUTE2_PARAM, 0.0, 3.0, 0.0));
addSlider(level3ParamPosition, module, Mix4::LEVEL3_PARAM, module->_channel3.rms);
addParam(ParamWidget::create<Knob16>(pan3ParamPosition, module, Mix4::PAN3_PARAM, -1.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute3ParamPosition, module, Mix4::MUTE3_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute3ParamPosition, module, Mix4::MUTE3_PARAM, 0.0, 3.0, 0.0));
addSlider(level4ParamPosition, module, Mix4::LEVEL4_PARAM, module->_channel4.rms);
addParam(ParamWidget::create<Knob16>(pan4ParamPosition, module, Mix4::PAN4_PARAM, -1.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute4ParamPosition, module, Mix4::MUTE4_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute4ParamPosition, module, Mix4::MUTE4_PARAM, 0.0, 3.0, 0.0));
addSlider(mixParamPosition, module, Mix4::MIX_PARAM, module->_rmsLevel);
addParam(ParamWidget::create<MuteButton>(mixMuteParamPosition, module, Mix4::MIX_MUTE_PARAM, 0.0, 1.0, 0.0));
diff --git a/src/Mix8.cpp b/src/Mix8.cpp
@@ -17,14 +17,23 @@ _rms.setSampleRate(sr);
void Mix8::step() {
bool stereo = outputs[L_OUTPUT].active && outputs[R_OUTPUT].active;
- _channel1.next(stereo);
- _channel2.next(stereo);
- _channel3.next(stereo);
- _channel4.next(stereo);
- _channel5.next(stereo);
- _channel6.next(stereo);
- _channel7.next(stereo);
- _channel8.next(stereo);
+ bool solo =
+ params[MUTE1_PARAM].value > 1.5f ||
+ params[MUTE2_PARAM].value > 1.5f ||
+ params[MUTE3_PARAM].value > 1.5f ||
+ params[MUTE4_PARAM].value > 1.5f ||
+ params[MUTE5_PARAM].value > 1.5f ||
+ params[MUTE6_PARAM].value > 1.5f ||
+ params[MUTE7_PARAM].value > 1.5f ||
+ params[MUTE8_PARAM].value > 1.5f;
+ _channel1.next(stereo, solo);
+ _channel2.next(stereo, solo);
+ _channel3.next(stereo, solo);
+ _channel4.next(stereo, solo);
+ _channel5.next(stereo, solo);
+ _channel6.next(stereo, solo);
+ _channel7.next(stereo, solo);
+ _channel8.next(stereo, solo);
float level = Amplifier::minDecibels;
if (params[MIX_MUTE_PARAM].value < 0.5f) {
@@ -159,28 +168,28 @@ struct Mix8Widget : ModuleWidget {
// end generated by svg_widgets.rb
addSlider(level1ParamPosition, module, Mix8::LEVEL1_PARAM, module->_channel1.rms);
- addParam(ParamWidget::create<MuteButton>(mute1ParamPosition, module, Mix8::MUTE1_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute1ParamPosition, module, Mix8::MUTE1_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan1ParamPosition, module, Mix8::PAN1_PARAM, -1.0, 1.0, 0.0));
addSlider(level2ParamPosition, module, Mix8::LEVEL2_PARAM, module->_channel2.rms);
- addParam(ParamWidget::create<MuteButton>(mute2ParamPosition, module, Mix8::MUTE2_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute2ParamPosition, module, Mix8::MUTE2_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan2ParamPosition, module, Mix8::PAN2_PARAM, -1.0, 1.0, 0.0));
addSlider(level3ParamPosition, module, Mix8::LEVEL3_PARAM, module->_channel3.rms);
- addParam(ParamWidget::create<MuteButton>(mute3ParamPosition, module, Mix8::MUTE3_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute3ParamPosition, module, Mix8::MUTE3_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan3ParamPosition, module, Mix8::PAN3_PARAM, -1.0, 1.0, 0.0));
addSlider(level4ParamPosition, module, Mix8::LEVEL4_PARAM, module->_channel4.rms);
- addParam(ParamWidget::create<MuteButton>(mute4ParamPosition, module, Mix8::MUTE4_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute4ParamPosition, module, Mix8::MUTE4_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan4ParamPosition, module, Mix8::PAN4_PARAM, -1.0, 1.0, 0.0));
addSlider(level5ParamPosition, module, Mix8::LEVEL5_PARAM, module->_channel5.rms);
- addParam(ParamWidget::create<MuteButton>(mute5ParamPosition, module, Mix8::MUTE5_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute5ParamPosition, module, Mix8::MUTE5_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan5ParamPosition, module, Mix8::PAN5_PARAM, -1.0, 1.0, 0.0));
addSlider(level6ParamPosition, module, Mix8::LEVEL6_PARAM, module->_channel6.rms);
- addParam(ParamWidget::create<MuteButton>(mute6ParamPosition, module, Mix8::MUTE6_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute6ParamPosition, module, Mix8::MUTE6_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan6ParamPosition, module, Mix8::PAN6_PARAM, -1.0, 1.0, 0.0));
addSlider(level7ParamPosition, module, Mix8::LEVEL7_PARAM, module->_channel7.rms);
- addParam(ParamWidget::create<MuteButton>(mute7ParamPosition, module, Mix8::MUTE7_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute7ParamPosition, module, Mix8::MUTE7_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan7ParamPosition, module, Mix8::PAN7_PARAM, -1.0, 1.0, 0.0));
addSlider(level8ParamPosition, module, Mix8::LEVEL8_PARAM, module->_channel8.rms);
- addParam(ParamWidget::create<MuteButton>(mute8ParamPosition, module, Mix8::MUTE8_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute8ParamPosition, module, Mix8::MUTE8_PARAM, 0.0, 3.0, 0.0));
addParam(ParamWidget::create<Knob16>(pan8ParamPosition, module, Mix8::PAN8_PARAM, -1.0, 1.0, 0.0));
addSlider(mixParamPosition, module, Mix8::MIX_PARAM, module->_rmsLevel);
addParam(ParamWidget::create<MuteButton>(mixMuteParamPosition, module, Mix8::MIX_MUTE_PARAM, 0.0, 1.0, 0.0));
diff --git a/src/Mute8.cpp b/src/Mute8.cpp
@@ -20,14 +20,19 @@ void Mute8::onSampleRateChange() {
}
void Mute8::step() {
+ bool solo = false;
for (int i = 0; i < 8; ++i) {
- stepChannel(i);
+ solo = solo || params[MUTE1_PARAM + i].value > 1.5f;
+ }
+ for (int i = 0; i < 8; ++i) {
+ stepChannel(i, solo);
}
}
-void Mute8::stepChannel(int i) {
+void Mute8::stepChannel(int i, bool solo) {
_triggers[i].process(inputs[MUTE1_INPUT + i].value);
- if (params[MUTE1_PARAM + i].value > 0.5f || _triggers[i].isHigh()) {
+ bool muted = solo ? params[MUTE1_PARAM + i].value < 2.0f : (params[MUTE1_PARAM + i].value > 0.5f || _triggers[i].isHigh());
+ if (muted) {
lights[MUTE1_LIGHT + i].value = 1.0f;
_amplifiers[i].setLevel(_slewLimiters[i].next(minDecibels));
}
@@ -102,14 +107,14 @@ struct Mute8Widget : ModuleWidget {
auto mute8LightPosition = Vec(100.5, 324.8);
// end generated by svg_widgets.rb
- addParam(ParamWidget::create<MuteButton>(mute1ParamPosition, module, Mute8::MUTE1_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute2ParamPosition, module, Mute8::MUTE2_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute3ParamPosition, module, Mute8::MUTE3_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute4ParamPosition, module, Mute8::MUTE4_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute5ParamPosition, module, Mute8::MUTE5_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute6ParamPosition, module, Mute8::MUTE6_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute7ParamPosition, module, Mute8::MUTE7_PARAM, 0.0, 1.0, 0.0));
- addParam(ParamWidget::create<MuteButton>(mute8ParamPosition, module, Mute8::MUTE8_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute1ParamPosition, module, Mute8::MUTE1_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute2ParamPosition, module, Mute8::MUTE2_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute3ParamPosition, module, Mute8::MUTE3_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute4ParamPosition, module, Mute8::MUTE4_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute5ParamPosition, module, Mute8::MUTE5_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute6ParamPosition, module, Mute8::MUTE6_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute7ParamPosition, module, Mute8::MUTE7_PARAM, 0.0, 3.0, 0.0));
+ addParam(ParamWidget::create<SoloMuteButton>(mute8ParamPosition, module, Mute8::MUTE8_PARAM, 0.0, 3.0, 0.0));
addInput(Port::create<Port24>(input1InputPosition, Port::INPUT, module, Mute8::INPUT1_INPUT));
addInput(Port::create<Port24>(input2InputPosition, Port::INPUT, module, Mute8::INPUT2_INPUT));
diff --git a/src/Mute8.hpp b/src/Mute8.hpp
@@ -82,7 +82,7 @@ struct Mute8 : Module {
void onReset() override;
void onSampleRateChange() override;
void step() override;
- void stepChannel(int i);
+ void stepChannel(int i, bool solo);
};
} // namespace bogaudio
diff --git a/src/mixer.cpp b/src/mixer.cpp
@@ -12,13 +12,14 @@ void MixerChannel::setSampleRate(float sampleRate) {
_rms.setSampleRate(sampleRate);
}
-void MixerChannel::next(bool stereo) {
+void MixerChannel::next(bool stereo, bool solo) {
if (!_inInput.active) {
rms = out = left = right = 0.0f;
return;
}
- if (_muteParam.value > 0.5f) {
+ bool muted = solo ? _muteParam.value < 2.0f : _muteParam.value > 0.5f;
+ if (muted) {
_amplifier.setLevel(_levelSL.next(minDecibels));
}
else {
@@ -42,3 +43,51 @@ void MixerChannel::next(bool stereo) {
_panner.next(out, left, right);
}
}
+
+
+SoloMuteButton::SoloMuteButton() {
+ shadow = new CircularShadow();
+ addChild(shadow);
+
+ _svgWidget = new SVGWidget();
+ addChild(_svgWidget);
+
+ auto svg = SVG::load(assetPlugin(plugin, "res/button_18px_0.svg"));
+ _frames.push_back(svg);
+ _frames.push_back(SVG::load(assetPlugin(plugin, "res/button_18px_1_orange.svg")));
+ _frames.push_back(SVG::load(assetPlugin(plugin, "res/button_18px_1_green.svg")));
+ _frames.push_back(SVG::load(assetPlugin(plugin, "res/button_18px_1_green.svg")));
+
+ _svgWidget->setSVG(svg);
+ box.size = _svgWidget->box.size;
+ shadow->box.size = _svgWidget->box.size;
+ shadow->blurRadius = 1.0;
+ shadow->box.pos = Vec(0.0, 1.0);
+}
+
+void SoloMuteButton::step() {
+ FramebufferWidget::step();
+}
+
+void SoloMuteButton::onMouseDown(EventMouseDown& e) {
+ if (value >= 2.0f) {
+ setValue(value - 2.0f);
+ }
+ else if (e.button == 1) { // right click
+ setValue(value + 2.0f);
+ }
+ else {
+ setValue(value > 0.5f ? 0.0f : 1.0f);
+ }
+
+ e.consumed = true;
+ e.target = this;
+}
+
+void SoloMuteButton::onChange(EventChange &e) {
+ assert(_frames.size() == 4);
+ assert(value >= 0.0f && value <= 3.0f);
+ _svgWidget->setSVG(_frames[(int)value]);
+ dirty = true;
+ ParamWidget::onChange(e);
+}
diff --git a/src/mixer.hpp b/src/mixer.hpp
@@ -52,7 +52,7 @@ struct MixerChannel {
}
void setSampleRate(float sampleRate);
- void next(bool stereo); // input from _in; outputs on out, left, right, rms.
+ void next(bool stereo, bool solo); // input from _in; outputs on out, left, right, rms.
};
struct MuteButton : ToggleButton {
@@ -62,4 +62,15 @@ struct MuteButton : ToggleButton {
}
};
+struct SoloMuteButton : ParamWidget, FramebufferWidget {
+ std::vector<std::shared_ptr<SVG>> _frames;
+ SVGWidget* _svgWidget; // deleted elsewhere.
+ CircularShadow* shadow = NULL;
+
+ SoloMuteButton();
+ void step() override;
+ void onMouseDown(EventMouseDown& e) override;
+ void onChange(EventChange &e) override;
+};
+
} // namespace bogaudio