BogaudioModules

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

commit 4b37577c4a451c41c5784b2d6c2b1ba3368bd94a
parent 0546d1df93c943d1b5c2838809b086c73e28b173
Author: Matt Demanett <matt@demanett.net>
Date:   Tue, 17 Dec 2019 00:13:00 -0500

SWITCH: add lights to indicate state. #95

Diffstat:
Mres-src/Switch-src.svg | 28++++++++++++++++------------
Mres/Switch.svg | 0
Msrc/Switch.cpp | 34++++++++++++++++++++++++++++++----
Msrc/Switch.hpp | 17+++++++++++++++--
4 files changed, 61 insertions(+), 18 deletions(-)

diff --git a/res-src/Switch-src.svg b/res-src/Switch-src.svg @@ -48,6 +48,10 @@ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#f00" fill="none" /> </g> </symbol> + + <symbol id="light" viewBox="0 0 6.4px 6.4px"> + <rect width="6.4" height="6.4" fill="#0f0" /> + </symbol> </defs> <rect width="100%" height="100%" fill="#ddd" /> @@ -83,16 +87,16 @@ <g transform="translate(0 79)"> <g transform="translate(5.5 0)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 29)" /> - <rect width="34" height="35" rx="5" fill="#fafafa" /> + <rect width="34" height="74" rx="5" fill="#fafafa" /> + <rect width="34" height="10" fill="#fafafa" transform="translate(0 64)" /> <use id="HIGH1_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(6.0 35)">HIGH</text> + <text font-size="5pt" letter-spacing="1px" transform="translate(11.0 35)">HIGH</text> + <use id="HIGH1_LIGHT" xlink:href="#light" transform="translate(2 29.3)" /> </g> <g transform="translate(5.5 36)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 28)" /> - <rect width="34" height="35" rx="5" fill="#fafafa" /> <use id="LOW1_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(8.0 35)">LOW</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(11.0 35)">LOW</text> + <use id="LOW1_LIGHT" xlink:href="#light" transform="translate(2 29.3)" /> </g> <g transform="translate(5.5 77)"> <rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" /> @@ -104,16 +108,16 @@ <g transform="translate(0 196)"> <g transform="translate(5.5 0)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 29)" /> - <rect width="34" height="35" rx="5" fill="#fafafa" /> + <rect width="34" height="74" rx="5" fill="#fafafa" /> + <rect width="34" height="10" fill="#fafafa" transform="translate(0 64)" /> <use id="HIGH2_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(6.0 35)">HIGH</text> + <text font-size="5pt" letter-spacing="1px" transform="translate(11.0 35)">HIGH</text> + <use id="HIGH2_LIGHT" xlink:href="#light" transform="translate(2 29.3)" /> </g> <g transform="translate(5.5 36)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 28)" /> - <rect width="34" height="35" rx="5" fill="#fafafa" /> <use id="LOW2_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(8.0 35)">LOW</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(11.0 35)">LOW</text> + <use id="LOW2_LIGHT" xlink:href="#light" transform="translate(2 29.3)" /> </g> <g transform="translate(5.5 77)"> <rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" /> diff --git a/res/Switch.svg b/res/Switch.svg Binary files differ. diff --git a/src/Switch.cpp b/src/Switch.cpp @@ -7,10 +7,6 @@ void bogaudio::Switch::reset() { } } -bool bogaudio::Switch::active() { - return outputs[OUT1_OUTPUT].isConnected() || outputs[OUT2_OUTPUT].isConnected(); -} - int bogaudio::Switch::channels() { return inputs[GATE_INPUT].getChannels(); } @@ -26,6 +22,13 @@ void bogaudio::Switch::modulate() { _latch = params[LATCH_PARAM].getValue() > 0.5f; } +void bogaudio::Switch::processAll(const ProcessArgs& args) { + _high1LightSum = 0; + _low1LightSum = 0; + _high2LightSum = 0; + _low2LightSum = 0; +} + void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) { bool triggered = _trigger[c].process(params[GATE_PARAM].getValue() + inputs[GATE_INPUT].getVoltage(c)); if (_latch) { @@ -38,6 +41,9 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) { } if (_latchedHigh[c] || _trigger[c].isHigh()) { + ++_high1LightSum; + ++_high2LightSum; + if (_channels == 1) { outputs[OUT1_OUTPUT].setChannels(inputs[HIGH1_INPUT].getChannels()); outputs[OUT1_OUTPUT].writeVoltages(inputs[HIGH1_INPUT].getVoltages()); @@ -54,6 +60,9 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) { } } else { + ++_low1LightSum; + ++_low2LightSum; + if (_channels == 1) { outputs[OUT1_OUTPUT].setChannels(inputs[LOW1_INPUT].getChannels()); outputs[OUT1_OUTPUT].writeVoltages(inputs[LOW1_INPUT].getVoltages()); @@ -71,6 +80,13 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) { } } +void bogaudio::Switch::postProcess(const ProcessArgs& args) { + lights[HIGH1_LIGHT].value = _high1LightSum / (float)_channels; + lights[LOW1_LIGHT].value = _low1LightSum / (float)_channels; + lights[HIGH2_LIGHT].value = _high2LightSum / (float)_channels; + lights[LOW2_LIGHT].value = _low2LightSum / (float)_channels; +} + struct SwitchWidget : ModuleWidget { static constexpr int hp = 3; @@ -100,6 +116,11 @@ struct SwitchWidget : ModuleWidget { auto out1OutputPosition = Vec(10.5, 174.0); auto out2OutputPosition = Vec(10.5, 291.0); + + auto high1LightPosition = Vec(7.5, 126.3); + auto low1LightPosition = Vec(7.5, 162.3); + auto high2LightPosition = Vec(7.5, 243.3); + auto low2LightPosition = Vec(7.5, 279.3); // end generated by svg_widgets.rb addParam(createParam<Button18>(gateParamPosition, module, bogaudio::Switch::GATE_PARAM)); @@ -113,6 +134,11 @@ struct SwitchWidget : ModuleWidget { addOutput(createOutput<Port24>(out1OutputPosition, module, bogaudio::Switch::OUT1_OUTPUT)); addOutput(createOutput<Port24>(out2OutputPosition, module, bogaudio::Switch::OUT2_OUTPUT)); + + addChild(createLight<SmallLight<GreenLight>>(high1LightPosition, module, bogaudio::Switch::HIGH1_LIGHT)); + addChild(createLight<SmallLight<GreenLight>>(low1LightPosition, module, bogaudio::Switch::LOW1_LIGHT)); + addChild(createLight<SmallLight<GreenLight>>(high2LightPosition, module, bogaudio::Switch::HIGH2_LIGHT)); + addChild(createLight<SmallLight<GreenLight>>(low2LightPosition, module, bogaudio::Switch::LOW2_LIGHT)); } }; diff --git a/src/Switch.hpp b/src/Switch.hpp @@ -28,23 +28,36 @@ struct Switch : BGModule { NUM_OUTPUTS }; + enum LightsIds { + HIGH1_LIGHT, + LOW1_LIGHT, + HIGH2_LIGHT, + LOW2_LIGHT, + NUM_LIGHTS + }; + Trigger _trigger[maxChannels]; bool _latchedHigh[maxChannels] {}; bool _latch = false; + int _high1LightSum = 0; + int _low1LightSum = 0; + int _high2LightSum = 0; + int _low2LightSum = 0; Switch() { - config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); + config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); configParam(GATE_PARAM, 0.0f, 10.0f, 0.0f, "Gate"); configParam(LATCH_PARAM, 0.0f, 1.0f, 0.0f, "Latch"); reset(); } void reset() override; - bool active() override; int channels() override; void channelsChanged(int before, int after) override; void modulate() override; + void processAll(const ProcessArgs& args) override; void processChannel(const ProcessArgs& args, int _c) override; + void postProcess(const ProcessArgs& args) override; }; } // namespace bogaudio