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:
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