#include "HetrickCV.hpp" namespace rack_plugin_HetrickCV { struct Delta : Module { enum ParamIds { AMOUNT_PARAM, SCALE_PARAM, NUM_PARAMS }; enum InputIds { MAIN_INPUT, AMOUNT_INPUT, NUM_INPUTS }; enum OutputIds { GT_GATE_OUTPUT, GT_TRIG_OUTPUT, LT_GATE_OUTPUT, LT_TRIG_OUTPUT, CHANGE_OUTPUT, DELTA_OUTPUT, NUM_OUTPUTS }; enum LightIds { GT_LIGHT, LT_LIGHT, CHANGE_LIGHT, NUM_LIGHTS }; Delta() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } TriggerGenWithSchmitt ltTrig, gtTrig; float lastInput = 0.0f; bool rising = false; bool falling = false; void step() override; // For more advanced Module features, read Rack's engine.hpp header file // - toJson, fromJson: serialization of internal data // - onSampleRateChange: event triggered by a change of sample rate // - reset, randomize: implements special behavior when user clicks these from the context menu }; void Delta::step() { float input = inputs[MAIN_INPUT].value; float delta = input - lastInput; lastInput = input; rising = (delta > 0.0f); falling = (delta < 0.0f); float boost = params[AMOUNT_PARAM].value + (inputs[AMOUNT_INPUT].value * params[SCALE_PARAM].value); boost = clampf(boost, 0.0f, 5.0f) * 8000.0f + 1; outputs[GT_TRIG_OUTPUT].value = gtTrig.process(rising) ? 5.0f : 0.0f; outputs[LT_TRIG_OUTPUT].value = ltTrig.process(falling) ? 5.0f : 0.0f; outputs[GT_GATE_OUTPUT].value = rising ? 5.0f : 0.0f; outputs[LT_GATE_OUTPUT].value = falling ? 5.0f : 0.0f; float allTrigs = outputs[GT_TRIG_OUTPUT].value + outputs[LT_TRIG_OUTPUT].value; allTrigs = clampf(allTrigs, 0.0f, 5.0f); const float deltaOutput = clampf(delta * boost, -5.0f, 5.0f); outputs[CHANGE_OUTPUT].value = allTrigs; outputs[DELTA_OUTPUT].value = deltaOutput; lights[GT_LIGHT].setBrightnessSmooth(outputs[GT_GATE_OUTPUT].value); lights[LT_LIGHT].setBrightnessSmooth(outputs[LT_GATE_OUTPUT].value); lights[CHANGE_LIGHT].setBrightnessSmooth(allTrigs); } struct DeltaWidget : ModuleWidget { DeltaWidget(Delta *module); }; DeltaWidget::DeltaWidget(Delta *module) : ModuleWidget(module) { box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT); { auto *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/Delta.svg"))); addChild(panel); } addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(box.size.x - 30, 0))); addChild(Widget::create(Vec(15, 365))); addChild(Widget::create(Vec(box.size.x - 30, 365))); //////PARAMS////// addParam(ParamWidget::create(Vec(27, 62), module, Delta::AMOUNT_PARAM, 0.0, 5.0, 0.0)); addParam(ParamWidget::create(Vec(36, 112), module, Delta::SCALE_PARAM, -1.0, 1.0, 1.0)); //////INPUTS////// addInput(Port::create(Vec(12, 195), Port::INPUT, module, Delta::MAIN_INPUT)); addInput(Port::create(Vec(33, 145), Port::INPUT, module, Delta::AMOUNT_INPUT)); //////OUTPUTS////// addOutput(Port::create(Vec(53, 195), Port::OUTPUT, module, Delta::DELTA_OUTPUT)); addOutput(Port::create(Vec(12, 285), Port::OUTPUT, module, Delta::LT_GATE_OUTPUT)); addOutput(Port::create(Vec(53, 285), Port::OUTPUT, module, Delta::GT_GATE_OUTPUT)); addOutput(Port::create(Vec(12, 315), Port::OUTPUT, module, Delta::LT_TRIG_OUTPUT)); addOutput(Port::create(Vec(53, 315), Port::OUTPUT, module, Delta::GT_TRIG_OUTPUT)); addOutput(Port::create(Vec(32.5, 245), Port::OUTPUT, module, Delta::CHANGE_OUTPUT)); //////BLINKENLIGHTS////// addChild(ModuleLightWidget::create>(Vec(22, 275), module, Delta::LT_LIGHT)); addChild(ModuleLightWidget::create>(Vec(62, 275), module, Delta::GT_LIGHT)); addChild(ModuleLightWidget::create>(Vec(42, 275), module, Delta::CHANGE_LIGHT)); } } // namespace rack_plugin_HetrickCV using namespace rack_plugin_HetrickCV; RACK_PLUGIN_MODEL_INIT(HetrickCV, Delta) { Model *modelDelta = Model::create("HetrickCV", "Delta", "Delta", LOGIC_TAG); return modelDelta; }