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