#include "SampleHold.hpp" void SampleHold::onReset() { _trigger1.reset(); _value1 = 0.0; _trigger2.reset(); _value1 = 0.0; } void SampleHold::step() { step( params[TRIGGER1_PARAM], inputs[TRIGGER1_INPUT], inputs[IN1_INPUT], outputs[OUT1_OUTPUT], _trigger1, _value1 ); step( params[TRIGGER2_PARAM], inputs[TRIGGER2_INPUT], inputs[IN2_INPUT], outputs[OUT2_OUTPUT], _trigger2, _value2 ); } void SampleHold::step( Param& triggerParam, Input& triggerInput, Input& in, Output& out, SchmittTrigger& trigger, float& value ) { if (trigger.process(triggerParam.value + triggerInput.value)) { if (in.active) { value = in.value; } else { value = abs(_noise.next()) * 10.0; } } out.value = value; } struct SampleHoldWidget : ModuleWidget { static constexpr int hp = 3; SampleHoldWidget(SampleHold* module) : ModuleWidget(module) { box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/SampleHold.svg"))); addChild(panel); } addChild(Widget::create(Vec(0, 0))); addChild(Widget::create(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 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, 133.0); auto out2OutputPosition = Vec(10.5, 292.0); // end generated by svg_widgets.rb addParam(ParamWidget::create(trigger1ParamPosition, module, SampleHold::TRIGGER1_PARAM, 0.0, 1.0, 0.0)); addParam(ParamWidget::create(trigger2ParamPosition, module, SampleHold::TRIGGER2_PARAM, 0.0, 1.0, 0.0)); addInput(Port::create(trigger1InputPosition, Port::INPUT, module, SampleHold::TRIGGER1_INPUT)); addInput(Port::create(in1InputPosition, Port::INPUT, module, SampleHold::IN1_INPUT)); addInput(Port::create(trigger2InputPosition, Port::INPUT, module, SampleHold::TRIGGER2_INPUT)); addInput(Port::create(in2InputPosition, Port::INPUT, module, SampleHold::IN2_INPUT)); addOutput(Port::create(out1OutputPosition, Port::OUTPUT, module, SampleHold::OUT1_OUTPUT)); addOutput(Port::create(out2OutputPosition, Port::OUTPUT, module, SampleHold::OUT2_OUTPUT)); } }; RACK_PLUGIN_MODEL_INIT(Bogaudio, SampleHold) { Model *modelSampleHold = createModel("Bogaudio-SampleHold", "S&H", "dual sample and hold", SAMPLE_AND_HOLD_TAG, DUAL_TAG); return modelSampleHold; }