#include "Bidoo.hpp" #include "BidooComponents.hpp" #include "dsp/digital.hpp" #include using namespace std; namespace rack_plugin_Bidoo { struct LATE : Module { enum ParamIds { SWING_PARAM, CVCOEFF_PARAM, NUM_PARAMS }; enum InputIds { SWING_INPUT, CLOCK_INPUT, RESET_INPUT, NUM_INPUTS }; enum OutputIds { CLOCK_OUTPUT, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; bool odd = true; bool armed = false; SchmittTrigger clockTrigger; SchmittTrigger resetTrigger; clock_t tCurrent = clock(); clock_t tPrevious = clock(); LATE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } void step() override; }; void LATE::step() { outputs[CLOCK_OUTPUT].value = 0; clock_t now = clock(); if (resetTrigger.process(inputs[RESET_INPUT].value)) { odd=true; } if (clockTrigger.process(inputs[CLOCK_INPUT].value)) { tPrevious = tCurrent; tCurrent = now; if (odd) { outputs[CLOCK_OUTPUT].value = 10.0f; odd = false; armed = false; } else { armed = true; } } float lag = rescale(clamp(params[SWING_PARAM].value + params[CVCOEFF_PARAM].value * inputs[SWING_INPUT].value,0.0f,9.0f),0.0f,10.0f,0.0f,(float)tCurrent-(float)tPrevious); if (armed && !odd && (((float)now - (float)tCurrent) >= lag)) { outputs[CLOCK_OUTPUT].value = 10.0f; armed = false; odd = true; } } struct LATEWidget : ModuleWidget { LATEWidget(LATE *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/LATE.svg"))); addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addParam(ParamWidget::create(Vec(8, 70), module, LATE::SWING_PARAM, 0, 9, 0)); addParam(ParamWidget::create(Vec(13, 105), module, LATE::CVCOEFF_PARAM, -1.0f, 1.0f, 0.0f)); addInput(Port::create(Vec(10, 130), Port::INPUT, module, LATE::SWING_INPUT)); addInput(Port::create(Vec(10, 186.33f), Port::INPUT, module, LATE::RESET_INPUT)); addInput(Port::create(Vec(10, 242.66f), Port::INPUT, module, LATE::CLOCK_INPUT)); addOutput(Port::create(Vec(10, 299), Port::OUTPUT, module, LATE::CLOCK_OUTPUT)); } }; } // namespace rack_plugin_Bidoo using namespace rack_plugin_Bidoo; RACK_PLUGIN_MODEL_INIT(Bidoo, LATE) { Model *modelLATE = Model::create("Bidoo", "lATe", "lATe clock modulator", CLOCK_MODULATOR_TAG); return modelLATE; }