BogaudioModules

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

commit e08eb9407a06f7e0a86bf6117678af7ce19f1002
parent 2cc5686dfb5a205c572ad04c7b214cd9bc07b0d5
Author: Matt Demanett <matt@demanett.net>
Date:   Sun,  7 Jan 2018 20:30:04 -0500

VCA: simplify to a single CV input; make dual channel.

Diffstat:
Mres-src/VCA-src.svg | 97+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mres/VCA.svg | 0
Msrc/BogaudioModules.cpp | 4+---
Msrc/VCA.cpp | 61+++++++++++++++++++++++++++++++++++++------------------------
4 files changed, 96 insertions(+), 66 deletions(-)

diff --git a/res-src/VCA-src.svg b/res-src/VCA-src.svg @@ -27,46 +27,44 @@ <g transform="translate(22.5 22.5)"> <polyline points="-5,0 5,0" stroke-width="1" stroke="#00f" /> <polyline points="0,-5 0,5" stroke-width="1" stroke="#00f" /> - <circle cx="0" cy="0" r="14" stroke-width="1" stroke="#00f" fill="none" /> + <circle cx="0" cy="0" r="12.5" stroke-width="1" stroke="#00f" fill="none" /> </g> </symbol> <symbol id="knobguide" viewBox="0 0 45px 45px"> <g transform="translate(22.5 22.5)"> - <g transform="rotate(-240) translate(17 0)"> - <!-- <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> --> - <text font-size="6.5pt" transform="translate(4 0) rotate(240) translate(-2.5 3)">0</text> + <g transform="rotate(-240) translate(15 0)"> + <text font-size="5.0pt" transform="translate(2 0) rotate(240) translate(-2.2 2.2)">0</text> </g> - <g transform="rotate(-210) translate(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> + <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(17 0)"> - <!-- <polyline points="0,0 3,0" stroke-width="0.3" stroke="#333" /> --> - <text font-size="6.5pt" transform="translate(4 0) rotate(-60) translate(-5 3)">10</text> + <g transform="rotate(60) translate(15 0)"> + <text font-size="5.0pt" transform="translate(2 0) rotate(-60) translate(-4 2.2)">10</text> </g> </g> </symbol> @@ -105,26 +103,47 @@ </g> <g transform="translate(0 25)"> - <text font-size="6pt" letter-spacing="2px" transform="translate(7 0)">LEVEL</text> - <use id="LEVEL_PARAM" xlink:href="#knob" transform="translate(0 1)" /> - <use xlink:href="#knobguide" transform="translate(0 1)" /> + <text font-size="6pt" letter-spacing="2px" transform="translate(7 0)">1</text> + <use id="LEVEL1_PARAM" xlink:href="#knob" transform="translate(0 -2)" /> + <use xlink:href="#knobguide" transform="translate(0 -2)" /> </g> - <g transform="translate(0 180)"> + <g transform="translate(0 67)"> <g transform="translate(5.5 0)"> - <rect width="34" height="10" fill="#fafafa" transform="translate(0 98)" /> - <rect width="34" height="105" rx="5" fill="#fafafa" /> - <use id="EXP_INPUT" xlink:href="#input" transform="translate(5 3)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(9 35)">EXP</text> - <use id="LIN_INPUT" xlink:href="#input" transform="translate(5 38)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(10 70)">LIN</text> - <use id="IN_INPUT" xlink:href="#input" transform="translate(5 73)" /> - <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 105)">IN</text> + <rect width="34" height="10" fill="#fafafa" transform="translate(0 63)" /> + <rect width="34" height="70" rx="5" fill="#fafafa" /> + <use id="CV1_INPUT" xlink:href="#input" transform="translate(5 3)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">CV</text> + <use id="IN1_INPUT" xlink:href="#input" transform="translate(5 38)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 70)">IN</text> </g> - <g transform="translate(5.5 111)"> + <g transform="translate(5.5 76)"> <rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" /> <rect width="34" height="35" rx="5" fill="#bbb" /> - <use id="OUT_OUTPUT" xlink:href="#output" transform="translate(5 0)" /> + <use id="OUT1_OUTPUT" xlink:href="#output" transform="translate(5 0)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 32)">OUT</text> + </g> + </g> + + <g transform="translate(0 191)"> + <text font-size="6pt" letter-spacing="2px" transform="translate(7 0)">2</text> + <use id="LEVEL2_PARAM" xlink:href="#knob" transform="translate(0 -2)" /> + <use xlink:href="#knobguide" transform="translate(0 -2)" /> + </g> + + <g transform="translate(0 232)"> + <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" /> + <use id="CV2_INPUT" xlink:href="#input" transform="translate(5 3)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">CV</text> + <use id="IN2_INPUT" xlink:href="#input" transform="translate(5 38)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 70)">IN</text> + </g> + <g transform="translate(5.5 76)"> + <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)" /> <text font-size="5pt" letter-spacing="2px" transform="translate(8.5 32)">OUT</text> </g> </g> diff --git a/res/VCA.svg b/res/VCA.svg Binary files differ. diff --git a/src/BogaudioModules.cpp b/src/BogaudioModules.cpp @@ -25,7 +25,5 @@ void init(rack::Plugin *p) { p->addModel(createModel<ReftoneWidget>("Bogaudio", "Bogaudio-Reftone", "Reftone", UTILITY_TAG)); p->addModel(createModel<SampleHoldWidget>("Bogaudio", "Bogaudio-SampleHold", "S&H", SAMPLE_AND_HOLD_TAG, DUAL_TAG, UTILITY_TAG)); p->addModel(createModel<SwitchWidget>("Bogaudio", "Bogaudio-Switch", "Switch", UTILITY_TAG)); -#ifdef EXPERIMENTAL - p->addModel(createModel<VCAWidget>("Bogaudio", "Bogaudio-VCA", "VCA", UTILITY_TAG, AMPLIFIER_TAG)); -#endif + p->addModel(createModel<VCAWidget>("Bogaudio", "Bogaudio-VCA", "VCA", UTILITY_TAG, DUAL_TAG, AMPLIFIER_TAG)); } diff --git a/src/VCA.cpp b/src/VCA.cpp @@ -3,19 +3,22 @@ struct VCA : Module { enum ParamsIds { - LEVEL_PARAM, + LEVEL1_PARAM, + LEVEL2_PARAM, NUM_PARAMS }; enum InputsIds { - EXP_INPUT, - LIN_INPUT, - IN_INPUT, + CV1_INPUT, + IN1_INPUT, + CV2_INPUT, + IN2_INPUT, NUM_INPUTS }; enum OutputsIds { - OUT_OUTPUT, + OUT1_OUTPUT, + OUT2_OUTPUT, NUM_OUTPUTS }; @@ -26,21 +29,25 @@ 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); }; void VCA::step() { - if (inputs[IN_INPUT].active && outputs[OUT_OUTPUT].active) { - float level = clampf(params[LEVEL_PARAM].value, 0.0, 1.0); - if (inputs[EXP_INPUT].active) { - level *= powf(clampf(inputs[EXP_INPUT].value, 0.0, 10.0) / 10.0, 1.5); - } - else if (inputs[LIN_INPUT].active) { - level *= clampf(inputs[LIN_INPUT].value, 0.0, 10.0) / 10.0; + channelStep(inputs[IN1_INPUT], outputs[OUT1_OUTPUT], params[LEVEL1_PARAM], inputs[CV1_INPUT]); + channelStep(inputs[IN2_INPUT], outputs[OUT2_OUTPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT]); +} + +void VCA::channelStep(Input& input, Output& output, Param& knob, Input& cv) { + if (input.active && output.active) { + float level = clampf(knob.value, 0.0, 1.0); + if (cv.active) { + level *= clampf(cv.value, 0.0, 10.0) / 10.0; } - outputs[OUT_OUTPUT].value = level * inputs[IN_INPUT].value; + level = powf(level, 2.0); + output.value = level * input.value; } else { - outputs[OUT_OUTPUT].value = 0.0; + output.value = 0.0; } } @@ -61,20 +68,26 @@ VCAWidget::VCAWidget() { addChild(createScrew<ScrewSilver>(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb - auto levelParamPosition = Vec(8.0, 34.0); + auto level1ParamPosition = Vec(9.5, 32.5); + auto level2ParamPosition = Vec(9.5, 198.5); - auto expInputPosition = Vec(10.5, 183.0); - auto linInputPosition = Vec(10.5, 218.0); - auto inInputPosition = Vec(10.5, 253.0); + auto cv1InputPosition = Vec(10.5, 70.0); + auto in1InputPosition = Vec(10.5, 105.0); + auto cv2InputPosition = Vec(10.5, 235.0); + auto in2InputPosition = Vec(10.5, 270.0); - auto outOutputPosition = Vec(10.5, 291.0); + auto out1OutputPosition = Vec(10.5, 143.0); + auto out2OutputPosition = Vec(10.5, 308.0); // end generated by svg_widgets.rb - addParam(createParam<Knob29>(levelParamPosition, module, VCA::LEVEL_PARAM, 0.0, 1.0, 0.5)); + addParam(createParam<Knob26>(level1ParamPosition, module, VCA::LEVEL1_PARAM, 0.0, 1.0, 0.5)); + addParam(createParam<Knob26>(level2ParamPosition, module, VCA::LEVEL2_PARAM, 0.0, 1.0, 0.5)); - addInput(createInput<Port24>(expInputPosition, module, VCA::EXP_INPUT)); - addInput(createInput<Port24>(linInputPosition, module, VCA::LIN_INPUT)); - addInput(createInput<Port24>(inInputPosition, module, VCA::IN_INPUT)); + addInput(createInput<Port24>(cv1InputPosition, module, VCA::CV1_INPUT)); + addInput(createInput<Port24>(in1InputPosition, module, VCA::IN1_INPUT)); + addInput(createInput<Port24>(cv2InputPosition, module, VCA::CV2_INPUT)); + addInput(createInput<Port24>(in2InputPosition, module, VCA::IN2_INPUT)); - addOutput(createOutput<Port24>(outOutputPosition, module, VCA::OUT_OUTPUT)); + addOutput(createOutput<Port24>(out1OutputPosition, module, VCA::OUT1_OUTPUT)); + addOutput(createOutput<Port24>(out2OutputPosition, module, VCA::OUT2_OUTPUT)); }