BogaudioModules

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

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:
Ares-src/button_18px_1_green-src.svg | 28++++++++++++++++++++++++++++
Ares/button_18px_1_green.svg | 0
Msrc/Mix4.cpp | 21+++++++++++++--------
Msrc/Mix8.cpp | 41+++++++++++++++++++++++++----------------
Msrc/Mute8.cpp | 27++++++++++++++++-----------
Msrc/Mute8.hpp | 2+-
Msrc/mixer.cpp | 53+++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/mixer.hpp | 13++++++++++++-
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