#include "AddrSeq.hpp" void AddrSeq::onReset() { _step = 0; _clock.reset(); _reset.reset(); } void AddrSeq::step() { int steps = clamp(params[STEPS_PARAM].value, 2.0f, 8.0f); int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f); _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps; _step += (_step < 0) * steps; _step -= _step * _reset.process(inputs[RESET_INPUT].value); int step = _step + (int)params[SELECT_PARAM].value; step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f); step = step % 8; float out = 0.0f; for (int i = 0; i < 8; ++i) { out += params[OUT1_PARAM + i].value * (step == i); lights[OUT1_LIGHT + i].value = step == i; } outputs[OUT_OUTPUT].value = out * 10.0f; } struct AddrSeqWidget : ModuleWidget { static constexpr int hp = 6; AddrSeqWidget(AddrSeq* 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/AddrSeq.svg"))); addChild(panel); } addChild(Widget::create(Vec(0, 0))); addChild(Widget::create(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb auto stepsParamPosition = Vec(15.5, 131.5); auto directionParamPosition = Vec(16.0, 167.5); auto selectParamPosition = Vec(9.0, 230.0); auto out1ParamPosition = Vec(58.5, 36.0); auto out2ParamPosition = Vec(58.5, 77.3); auto out3ParamPosition = Vec(58.5, 118.6); auto out4ParamPosition = Vec(58.5, 159.9); auto out5ParamPosition = Vec(58.5, 201.1); auto out6ParamPosition = Vec(58.5, 242.4); auto out7ParamPosition = Vec(58.5, 283.7); auto out8ParamPosition = Vec(58.5, 325.0); auto clockInputPosition = Vec(11.5, 35.0); auto resetInputPosition = Vec(11.5, 72.0); auto selectInputPosition = Vec(11.5, 270.0); auto outOutputPosition = Vec(11.5, 324.0); auto out1LightPosition = Vec(66.5, 58.5); auto out2LightPosition = Vec(66.5, 99.8); auto out3LightPosition = Vec(66.5, 141.1); auto out4LightPosition = Vec(66.5, 182.4); auto out5LightPosition = Vec(66.5, 223.6); auto out6LightPosition = Vec(66.5, 264.9); auto out7LightPosition = Vec(66.5, 306.2); auto out8LightPosition = Vec(66.5, 347.5); // end generated by svg_widgets.rb { auto w = ParamWidget::create(stepsParamPosition, module, AddrSeq::STEPS_PARAM, 2.0, 8.0, 8.0); dynamic_cast(w)->snap = true; addParam(w); } addParam(ParamWidget::create(directionParamPosition, module, AddrSeq::DIRECTION_PARAM, 0.0, 1.0, 1.0)); { auto w = ParamWidget::create(selectParamPosition, module, AddrSeq::SELECT_PARAM, 0.0, 7.0, 0.0); dynamic_cast(w)->snap = true; addParam(w); } addParam(ParamWidget::create(out1ParamPosition, module, AddrSeq::OUT1_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out2ParamPosition, module, AddrSeq::OUT2_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out3ParamPosition, module, AddrSeq::OUT3_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out4ParamPosition, module, AddrSeq::OUT4_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out5ParamPosition, module, AddrSeq::OUT5_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out6ParamPosition, module, AddrSeq::OUT6_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out7ParamPosition, module, AddrSeq::OUT7_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(out8ParamPosition, module, AddrSeq::OUT8_PARAM, -1.0, 1.0, 0.0)); addInput(Port::create(clockInputPosition, Port::INPUT, module, AddrSeq::CLOCK_INPUT)); addInput(Port::create(resetInputPosition, Port::INPUT, module, AddrSeq::RESET_INPUT)); addInput(Port::create(selectInputPosition, Port::INPUT, module, AddrSeq::SELECT_INPUT)); addOutput(Port::create(outOutputPosition, Port::OUTPUT, module, AddrSeq::OUT_OUTPUT)); addChild(ModuleLightWidget::create>(out1LightPosition, module, AddrSeq::OUT1_LIGHT)); addChild(ModuleLightWidget::create>(out2LightPosition, module, AddrSeq::OUT2_LIGHT)); addChild(ModuleLightWidget::create>(out3LightPosition, module, AddrSeq::OUT3_LIGHT)); addChild(ModuleLightWidget::create>(out4LightPosition, module, AddrSeq::OUT4_LIGHT)); addChild(ModuleLightWidget::create>(out5LightPosition, module, AddrSeq::OUT5_LIGHT)); addChild(ModuleLightWidget::create>(out6LightPosition, module, AddrSeq::OUT6_LIGHT)); addChild(ModuleLightWidget::create>(out7LightPosition, module, AddrSeq::OUT7_LIGHT)); addChild(ModuleLightWidget::create>(out8LightPosition, module, AddrSeq::OUT8_LIGHT)); } }; RACK_PLUGIN_MODEL_INIT(Bogaudio, AddrSeq) { Model* modelAddrSeq = createModel("Bogaudio-AddrSeq", "ADDR-SEQ", "voltage-addressable sequencer", SEQUENCER_TAG); return modelAddrSeq; }