BogaudioModules

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

commit c1e652e648f1285fe02404dad98a64b43083c3dd
parent e60237c7cc0ff6a0a62e08e10fcde88b7fbb1a6e
Author: Matt Demanett <matt@demanett.net>
Date:   Mon, 31 Dec 2018 00:44:58 -0500

S&H: add track-and-hold mode per channel. #32

Diffstat:
Mres-src/SampleHold-src.svg | 50++++++++++++++++++++++++++++++++++++++++----------
Mres/SampleHold.svg | 0
Msrc/SampleHold.cpp | 64+++++++++++++++++++++++++++++++++++++++++-----------------------
Msrc/SampleHold.hpp | 4++++
4 files changed, 85 insertions(+), 33 deletions(-)

diff --git a/res-src/SampleHold-src.svg b/res-src/SampleHold-src.svg @@ -42,6 +42,16 @@ <circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#f00" fill="none" /> </g> </symbol> + + <symbol id="button-small" viewBox="0 0 9px 9px"> + <g transform="translate(4.5 4.5)"> + <circle r="4" stroke-width="1" stroke="#00f" fill="#f00" /> + </g> + </symbol> + + <symbol id="light-small" 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" /> @@ -57,7 +67,7 @@ </g> </g> - <g transform="translate(0 27)"> + <g transform="translate(0 18)"> <!-- <text font-size="6pt" letterspacing="2px" transform="translate(5.5 0)">1</text> --> <!-- <polyline points="0,0 21,0" stroke-width="1" stroke="#333" transform="translate(14 -3)" /> --> <g transform="translate(0 5)"> @@ -66,18 +76,27 @@ <rect width="34" height="62" rx="5" fill="#fafafa" /> <use id="TRIGGER1_PARAM" xlink:href="#button" transform="translate(8 4)" /> <use id="TRIGGER1_INPUT" xlink:href="#input" transform="translate(5 26)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(6.6 58)">TRIG</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(5.5 58)">GATE</text> </g> </g> <g transform="translate(0 65)"> <g transform="translate(5.5 0)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 28)" /> - <rect width="34" height="35" rx="5" fill="#fafafa" /> + <rect width="34" height="10" fill="#fafafa" transform="translate(0 41)" /> + <rect width="34" height="48" rx="5" fill="#fafafa" /> <use id="IN1_INPUT" xlink:href="#input" transform="translate(5 3)" /> <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">IN</text> </g> - <g transform="translate(5.5 41)"> + + <g transform="translate(7 41)"> + <!-- <polyline points="0,3.2 70,3.2" stroke="#0f0" stroke-width="1" fill="none" /> --> + <use id="TRACK1_PARAM" xlink:href="#button-small" transform="translate(22 -1.3)" /> + <use id="TRACK1_LIGHT" xlink:href="#light-small" transform="translate(0 0)" /> + <text font-size="5pt" letter-spacing="0.5px" transform="translate(7.3 5.5)">TRK</text> + <!-- <rect width="90" height="5" fill="#0f0" transform="translate(0 -6)" /> --> + </g> + + <g transform="translate(5.5 54)"> <rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" /> <rect width="34" height="35" rx="5" fill="#bbb" /> <use id="OUT1_OUTPUT" xlink:href="#output" transform="translate(5 0)" /> @@ -85,8 +104,9 @@ </g> </g> </g> + <!-- <rect width="90" height="13" fill="#0f0" transform="translate(0 172)" /> --> - <g transform="translate(0 186)"> + <g transform="translate(0 181)"> <!-- <text font-size="6pt" letterspacing="2px" transform="translate(4.4 0)">2</text> --> <g transform="translate(0 5)"> <g transform="translate(5.5 0)"> @@ -94,18 +114,27 @@ <rect width="34" height="62" rx="5" fill="#fafafa" /> <use id="TRIGGER2_PARAM" xlink:href="#button" transform="translate(8 4)" /> <use id="TRIGGER2_INPUT" xlink:href="#input" transform="translate(5 26)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(6.6 58)">TRIG</text> + <text font-size="5pt" letter-spacing="2px" transform="translate(5.5 58)">GATE</text> </g> </g> <g transform="translate(0 65)"> <g transform="translate(5.5 0)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 28)" /> - <rect width="34" height="35" rx="5" fill="#fafafa" /> + <rect width="34" height="10" fill="#fafafa" transform="translate(0 41)" /> + <rect width="34" height="48" rx="5" fill="#fafafa" /> <use id="IN2_INPUT" xlink:href="#input" transform="translate(5 3)" /> <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">IN</text> </g> - <g transform="translate(5.5 41)"> + + <g transform="translate(7 41)"> + <!-- <polyline points="0,3.2 70,3.2" stroke="#0f0" stroke-width="1" fill="none" /> --> + <use id="TRACK2_PARAM" xlink:href="#button-small" transform="translate(22 -1.3)" /> + <use id="TRACK2_LIGHT" xlink:href="#light-small" transform="translate(0 0)" /> + <text font-size="5pt" letter-spacing="0.5px" transform="translate(7.3 5.5)">TRK</text> + <!-- <rect width="90" height="5" fill="#0f0" transform="translate(0 -6)" /> --> + </g> + + <g transform="translate(5.5 54)"> <rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" /> <rect width="34" height="35" rx="5" fill="#bbb" /> <use id="OUT2_OUTPUT" xlink:href="#output" transform="translate(5 0)" /> @@ -113,4 +142,5 @@ </g> </g> </g> + <!-- <rect width="90" height="13" fill="#0f0" transform="translate(0 335)" /> --> </svg> diff --git a/res/SampleHold.svg b/res/SampleHold.svg Binary files differ. diff --git a/src/SampleHold.cpp b/src/SampleHold.cpp @@ -9,25 +9,33 @@ void SampleHold::onReset() { } void SampleHold::step() { - if (_trigger1.process(params[TRIGGER1_PARAM].value + inputs[TRIGGER1_INPUT].value)) { - if (inputs[IN1_INPUT].active) { - _value1 = inputs[IN1_INPUT].value; - } - else { - _value1 = fabs(_noise.next()) * 10.0; + { + lights[TRACK1_LIGHT].value = params[TRACK1_PARAM].value; + bool triggered = _trigger1.process(params[TRIGGER1_PARAM].value + inputs[TRIGGER1_INPUT].value); + if (params[TRACK1_PARAM].value > 0.5f ? _trigger1.isHigh() : triggered) { + if (inputs[IN1_INPUT].active) { + _value1 = inputs[IN1_INPUT].value; + } + else { + _value1 = fabs(_noise.next()) * 10.0; + } } + outputs[OUT1_OUTPUT].value = _value1; } - outputs[OUT1_OUTPUT].value = _value1; - if (_trigger2.process(params[TRIGGER2_PARAM].value + inputs[TRIGGER2_INPUT].value)) { - if (inputs[IN2_INPUT].active) { - _value2 = inputs[IN2_INPUT].value; - } - else { - _value2 = fabs(_noise.next()) * 10.0; + { + lights[TRACK2_LIGHT].value = params[TRACK2_PARAM].value; + bool triggered = _trigger2.process(params[TRIGGER2_PARAM].value + inputs[TRIGGER2_INPUT].value); + if (params[TRACK2_PARAM].value > 0.5f ? _trigger2.isHigh() : triggered) { + if (inputs[IN2_INPUT].active) { + _value2 = inputs[IN2_INPUT].value; + } + else { + _value2 = fabs(_noise.next()) * 10.0; + } } + outputs[OUT2_OUTPUT].value = _value2; } - outputs[OUT2_OUTPUT].value = _value2; } struct SampleHoldWidget : ModuleWidget { @@ -47,20 +55,27 @@ struct SampleHoldWidget : ModuleWidget { addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb - auto trigger1ParamPosition = Vec(13.5, 36.0); - auto trigger2ParamPosition = Vec(13.5, 195.0); + auto trigger1ParamPosition = Vec(13.5, 27.0); + auto track1ParamPosition = Vec(29.0, 122.7); + auto trigger2ParamPosition = Vec(13.5, 190.0); + auto track2ParamPosition = Vec(29.0, 285.7); - auto trigger1InputPosition = Vec(10.5, 58.0); - auto in1InputPosition = Vec(10.5, 95.0); - auto trigger2InputPosition = Vec(10.5, 217.0); - auto in2InputPosition = Vec(10.5, 254.0); + auto trigger1InputPosition = Vec(10.5, 49.0); + auto in1InputPosition = Vec(10.5, 86.0); + auto trigger2InputPosition = Vec(10.5, 212.0); + auto in2InputPosition = Vec(10.5, 249.0); - auto out1OutputPosition = Vec(10.5, 133.0); - auto out2OutputPosition = Vec(10.5, 292.0); + auto out1OutputPosition = Vec(10.5, 137.0); + auto out2OutputPosition = Vec(10.5, 300.0); + + auto track1LightPosition = Vec(7.0, 124.0); + auto track2LightPosition = Vec(7.0, 287.0); // end generated by svg_widgets.rb addParam(ParamWidget::create<Button18>(trigger1ParamPosition, module, SampleHold::TRIGGER1_PARAM, 0.0, 1.0, 0.0)); addParam(ParamWidget::create<Button18>(trigger2ParamPosition, module, SampleHold::TRIGGER2_PARAM, 0.0, 1.0, 0.0)); + addParam(ParamWidget::create<StatefulButton9>(track1ParamPosition, module, SampleHold::TRACK1_PARAM, 0.0, 1.0, 0.0)); + addParam(ParamWidget::create<StatefulButton9>(track2ParamPosition, module, SampleHold::TRACK2_PARAM, 0.0, 1.0, 0.0)); addInput(Port::create<Port24>(trigger1InputPosition, Port::INPUT, module, SampleHold::TRIGGER1_INPUT)); addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, SampleHold::IN1_INPUT)); @@ -69,7 +84,10 @@ struct SampleHoldWidget : ModuleWidget { addOutput(Port::create<Port24>(out1OutputPosition, Port::OUTPUT, module, SampleHold::OUT1_OUTPUT)); addOutput(Port::create<Port24>(out2OutputPosition, Port::OUTPUT, module, SampleHold::OUT2_OUTPUT)); + + addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(track1LightPosition, module, SampleHold::TRACK1_LIGHT)); + addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(track2LightPosition, module, SampleHold::TRACK2_LIGHT)); } }; -Model* modelSampleHold = createModel<SampleHold, SampleHoldWidget>("Bogaudio-SampleHold", "S&H", "dual sample and hold", SAMPLE_AND_HOLD_TAG, DUAL_TAG); +Model* modelSampleHold = createModel<SampleHold, SampleHoldWidget>("Bogaudio-SampleHold", "S&H", "dual sample (or track) and hold", SAMPLE_AND_HOLD_TAG, DUAL_TAG); diff --git a/src/SampleHold.hpp b/src/SampleHold.hpp @@ -13,6 +13,8 @@ struct SampleHold : Module { enum ParamIds { TRIGGER1_PARAM, TRIGGER2_PARAM, + TRACK1_PARAM, + TRACK2_PARAM, NUM_PARAMS }; @@ -31,6 +33,8 @@ struct SampleHold : Module { }; enum LightsIds { + TRACK1_LIGHT, + TRACK2_LIGHT, NUM_LIGHTS };