BogaudioModules

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

commit ca51fbd4d8803cfe169a7f00d3e48c7c78086bef
parent acd42b6170eb431ea2f339aa280acddd94977b60
Author: Matt Demanett <matt@demanett.net>
Date:   Sun, 13 May 2018 21:27:37 -0400

Add linear mode to VCA; VCA visual updates; disable VCA-L; visual fixes for S&H to match VCA.

Diffstat:
Mres-src/SampleHold-src.svg | 10++++------
Mres-src/VCA-src.svg | 78++++++++++++++++++++++++++++++++++++------------------------------------------
Mres/SampleHold.svg | 0
Mres/VCA.svg | 0
Msrc/SampleHold.cpp | 16++++++++--------
Msrc/VCA.cpp | 48++++++++++++++++++++++++++++++------------------
Msrc/VCA.hpp | 4+++-
Msrc/bogaudio.cpp | 4+++-
8 files changed, 84 insertions(+), 76 deletions(-)

diff --git a/res-src/SampleHold-src.svg b/res-src/SampleHold-src.svg @@ -57,10 +57,9 @@ </g> </g> - <g transform="translate(0 25)"> - <text font-size="6pt" letterspacing="2px" transform="translate(5.5 0)">1</text> + <g transform="translate(0 27)"> + <!-- <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)"> <g transform="translate(5.5 0)"> <rect width="34" height="10" fill="#fafafa" transform="translate(0 58)" /> @@ -87,9 +86,8 @@ </g> </g> - <g transform="translate(0 185)"> - <text font-size="6pt" letterspacing="2px" transform="translate(4.4 0)">2</text> - + <g transform="translate(0 186)"> + <!-- <text font-size="6pt" letterspacing="2px" transform="translate(4.4 0)">2</text> --> <g transform="translate(0 5)"> <g transform="translate(5.5 0)"> <rect width="34" height="10" fill="#fafafa" transform="translate(0 58)" /> diff --git a/res-src/VCA-src.svg b/res-src/VCA-src.svg @@ -31,44 +31,32 @@ </g> </symbol> - <symbol id="knobguide" viewBox="0 0 45px 45px"> + <symbol id="knobguide-linear" viewBox="0 0 45px 45px"> <g transform="translate(22.5 22.5)"> - <g transform="rotate(-240) translate(15 0)"> - <text font-size="5.0pt" transform="translate(3 0) rotate(240) translate(-2.2 2.2)">0</text> - </g> - <g transform="rotate(-210) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(-180) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(-150) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(-120) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(-90) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(-60) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(-30) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(0) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(30) translate(15 0)"> - <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" /> - </g> - <g transform="rotate(60) translate(15 0)"> - <text font-size="5.0pt" transform="translate(3 0) rotate(-60) translate(-4 2.2)">10</text> - </g> + <text font-size="5.0pt" transform="rotate(-240) translate(18 0) rotate(240) translate(-2 2)">0</text> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-210) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-180) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-150) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-120) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-90) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-60) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(-30) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(0) translate(15 0)" /> + <polyline points="0,0 2.5,0" stroke-width="0.3" stroke="#333" transform="rotate(30) translate(15 0)" /> + <polyline points="0,0 3.5,0" stroke-width="1" stroke="#333" transform="rotate(60) translate(15 0)" /> </g> </symbol> + <symbol id="button" viewBox="0 0 9px 9px"> + <g transform="translate(4.5 4.5)"> + <circle cx="0" cy="0" r="4.1" 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> + <symbol id="input" viewBox="0 0 24px 24px"> <g transform="translate(12 12)"> <circle cx="0" cy="0" r="5" stroke-width="1" stroke="#0f0" fill="#0f0" /> @@ -102,13 +90,14 @@ </g> </g> - <g transform="translate(0 25)"> - <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">1</text> + <!-- <rect width="45" height="18" fill="#0f0" transform="translate(0 0)" /> --> + + <g transform="translate(0 19)"> <use id="LEVEL1_PARAM" xlink:href="#knob" transform="translate(0 -6)" /> - <use xlink:href="#knobguide" transform="translate(0 -6)" /> + <use xlink:href="#knobguide-linear" transform="translate(0 -6)" /> </g> - <g transform="translate(0 63)"> + <g transform="translate(0 57)"> <g transform="translate(5.5 0)"> <rect width="34" height="10" fill="#fafafa" transform="translate(0 63)" /> <rect width="34" height="70" rx="5" fill="#fafafa" /> @@ -125,13 +114,12 @@ </g> </g> - <g transform="translate(0 186)"> - <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">2</text> + <g transform="translate(0 178)"> <use id="LEVEL2_PARAM" xlink:href="#knob" transform="translate(0 -6)" /> - <use xlink:href="#knobguide" transform="translate(0 -6)" /> + <use xlink:href="#knobguide-linear" transform="translate(0 -6)" /> </g> - <g transform="translate(0 224)"> + <g transform="translate(0 216)"> <g transform="translate(5.5 0)"> <rect width="34" height="10" fill="#fafafa" transform="translate(0 63)" /> <rect width="34" height="70" rx="5" fill="#fafafa" /> @@ -147,4 +135,10 @@ <text font-size="5pt" letter-spacing="2px" transform="translate(8.3 32)">OUT</text> </g> </g> + + <g transform="translate(6.5 334)"> + <use id="LINEAR_LIGHT" xlink:href="#light-small" transform="translate(0 0.5)" /> + <text font-size="5pt" letter-spacing="1px" transform="translate(8 6)">LIN</text> + <use id="LINEAR_PARAM" xlink:href="#button" transform="translate(23 -1)" /> + </g> </svg> diff --git a/res/SampleHold.svg b/res/SampleHold.svg Binary files differ. diff --git a/res/VCA.svg b/res/VCA.svg Binary files differ. diff --git a/src/SampleHold.cpp b/src/SampleHold.cpp @@ -62,16 +62,16 @@ struct SampleHoldWidget : ModuleWidget { addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb - auto trigger1ParamPosition = Vec(13.5, 33.0); - auto trigger2ParamPosition = Vec(13.5, 193.0); + auto trigger1ParamPosition = Vec(13.5, 36.0); + auto trigger2ParamPosition = Vec(13.5, 195.0); - auto trigger1InputPosition = Vec(10.5, 56.0); - auto in1InputPosition = Vec(10.5, 93.0); - auto trigger2InputPosition = Vec(10.5, 216.0); - auto in2InputPosition = Vec(10.5, 253.0); + 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 out1OutputPosition = Vec(10.5, 131.0); - auto out2OutputPosition = Vec(10.5, 291.0); + auto out1OutputPosition = Vec(10.5, 133.0); + auto out2OutputPosition = Vec(10.5, 292.0); // end generated by svg_widgets.rb addParam(ParamWidget::create<Button18>(trigger1ParamPosition, module, SampleHold::TRIGGER1_PARAM, 0.0, 1.0, 0.0)); diff --git a/src/VCA.cpp b/src/VCA.cpp @@ -2,20 +2,26 @@ #include "VCA.hpp" void VCA::step() { - channelStep(inputs[IN1_INPUT], outputs[OUT1_OUTPUT], params[LEVEL1_PARAM], inputs[CV1_INPUT], _amplifier1); - channelStep(inputs[IN2_INPUT], outputs[OUT2_OUTPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT], _amplifier2); + bool linear = lights[LINEAR_LIGHT].value = params[LINEAR_PARAM].value > 0.5f; + channelStep(inputs[IN1_INPUT], outputs[OUT1_OUTPUT], params[LEVEL1_PARAM], inputs[CV1_INPUT], _amplifier1, linear); + channelStep(inputs[IN2_INPUT], outputs[OUT2_OUTPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT], _amplifier2, linear); } -void VCA::channelStep(Input& input, Output& output, Param& knob, Input& cv, Amplifier& amplifier) { +void VCA::channelStep(Input& input, Output& output, Param& knob, Input& cv, Amplifier& amplifier, bool linear) { if (input.active && output.active) { float level = knob.value; if (cv.active) { - level *= clamp(cv.value, 0.0f, 10.0f) / 10.0f; + level *= clamp(cv.value / 10.0f, 0.0f, 1.0f); + } + if (linear) { + output.value = level * input.value; + } + else { + level = 1.0f - level; + level *= Amplifier::minDecibels; + amplifier.setLevel(level); + output.value = amplifier.next(input.value); } - level = 1.0f - level; - level *= Amplifier::minDecibels; - amplifier.setLevel(level); - output.value = amplifier.next(input.value); } } @@ -34,20 +40,24 @@ struct VCAWidget : ModuleWidget { addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb - auto level1ParamPosition = Vec(9.5, 28.5); - auto level2ParamPosition = Vec(9.5, 189.5); + auto level1ParamPosition = Vec(9.5, 22.5); + auto level2ParamPosition = Vec(9.5, 181.5); + auto linearParamPosition = Vec(29.4, 332.9); - auto cv1InputPosition = Vec(10.5, 66.0); - auto in1InputPosition = Vec(10.5, 101.0); - auto cv2InputPosition = Vec(10.5, 227.0); - auto in2InputPosition = Vec(10.5, 262.0); + auto cv1InputPosition = Vec(10.5, 60.0); + auto in1InputPosition = Vec(10.5, 95.0); + auto cv2InputPosition = Vec(10.5, 219.0); + auto in2InputPosition = Vec(10.5, 254.0); - auto out1OutputPosition = Vec(10.5, 139.0); - auto out2OutputPosition = Vec(10.5, 300.0); + auto out1OutputPosition = Vec(10.5, 133.0); + auto out2OutputPosition = Vec(10.5, 292.0); + + auto linearLightPosition = Vec(6.5, 334.5); // end generated by svg_widgets.rb - addParam(ParamWidget::create<Knob26>(level1ParamPosition, module, VCA::LEVEL1_PARAM, 0.0, 1.0, 0.5)); - addParam(ParamWidget::create<Knob26>(level2ParamPosition, module, VCA::LEVEL2_PARAM, 0.0, 1.0, 0.5)); + addParam(ParamWidget::create<Knob26>(level1ParamPosition, module, VCA::LEVEL1_PARAM, 0.0, 1.0, 0.8)); + addParam(ParamWidget::create<Knob26>(level2ParamPosition, module, VCA::LEVEL2_PARAM, 0.0, 1.0, 0.8)); + addParam(ParamWidget::create<StatefulButton9>(linearParamPosition, module, VCA::LINEAR_PARAM, 0.0, 1.0, 0.0)); addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, VCA::CV1_INPUT)); addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, VCA::IN1_INPUT)); @@ -56,6 +66,8 @@ struct VCAWidget : ModuleWidget { addOutput(Port::create<Port24>(out1OutputPosition, Port::OUTPUT, module, VCA::OUT1_OUTPUT)); addOutput(Port::create<Port24>(out2OutputPosition, Port::OUTPUT, module, VCA::OUT2_OUTPUT)); + + addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(linearLightPosition, module, VCA::LINEAR_LIGHT)); } }; diff --git a/src/VCA.hpp b/src/VCA.hpp @@ -13,6 +13,7 @@ struct VCA : Module { enum ParamsIds { LEVEL1_PARAM, LEVEL2_PARAM, + LINEAR_PARAM, NUM_PARAMS }; @@ -31,6 +32,7 @@ struct VCA : Module { }; enum LightsIds { + LINEAR_LIGHT, NUM_LIGHTS }; @@ -40,7 +42,7 @@ struct VCA : Module { VCA() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} virtual void step() override; - void channelStep(Input& input, Output& output, Param& knob, Input& cv, Amplifier& amplifier); + void channelStep(Input& input, Output& output, Param& knob, Input& cv, Amplifier& amplifier, bool linear); }; } // namespace bogaudio diff --git a/src/bogaudio.cpp b/src/bogaudio.cpp @@ -100,8 +100,10 @@ void init(rack::Plugin *p) { #endif p->addModel(modelSwitch); p->addModel(modelVCA); -#ifdef EXPERIMENTAL +#if 0 p->addModel(modelVCAL); +#endif +#ifdef EXPERIMENTAL p->addModel(modelVCAmp); p->addModel(modelVU); #endif