#include "Befaco.hpp" struct DualAtenuverter : Module { enum ParamIds { ATEN1_PARAM, OFFSET1_PARAM, ATEN2_PARAM, OFFSET2_PARAM, NUM_PARAMS }; enum InputIds { IN1_INPUT, IN2_INPUT, NUM_INPUTS }; enum OutputIds { OUT1_OUTPUT, OUT2_OUTPUT, NUM_OUTPUTS }; enum LightIds { OUT1_POS_LIGHT, OUT1_NEG_LIGHT, OUT2_POS_LIGHT, OUT2_NEG_LIGHT, NUM_LIGHTS }; DualAtenuverter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} void step() override; }; void DualAtenuverter::step() { float out1 = inputs[IN1_INPUT].value * params[ATEN1_PARAM].value + params[OFFSET1_PARAM].value; float out2 = inputs[IN2_INPUT].value * params[ATEN2_PARAM].value + params[OFFSET2_PARAM].value; out1 = clamp(out1, -10.0f, 10.0f); out2 = clamp(out2, -10.0f, 10.0f); outputs[OUT1_OUTPUT].value = out1; outputs[OUT2_OUTPUT].value = out2; lights[OUT1_POS_LIGHT].value = fmaxf(0.0, out1 / 5.0); lights[OUT1_NEG_LIGHT].value = fmaxf(0.0, -out1 / 5.0); lights[OUT2_POS_LIGHT].value = fmaxf(0.0, out2 / 5.0); lights[OUT2_NEG_LIGHT].value = fmaxf(0.0, -out2 / 5.0); } struct DualAtenuverterWidget : ModuleWidget { DualAtenuverterWidget(DualAtenuverter *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/DualAtenuverter.svg"))); addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(15, 365))); addParam(ParamWidget::create(Vec(20, 33), module, DualAtenuverter::ATEN1_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(Vec(20, 91), module, DualAtenuverter::OFFSET1_PARAM, -10.0, 10.0, 0.0)); addParam(ParamWidget::create(Vec(20, 201), module, DualAtenuverter::ATEN2_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(Vec(20, 260), module, DualAtenuverter::OFFSET2_PARAM, -10.0, 10.0, 0.0)); addInput(Port::create(Vec(7, 152), Port::INPUT, module, DualAtenuverter::IN1_INPUT)); addOutput(Port::create(Vec(43, 152), Port::OUTPUT, module, DualAtenuverter::OUT1_OUTPUT)); addInput(Port::create(Vec(7, 319), Port::INPUT, module, DualAtenuverter::IN2_INPUT)); addOutput(Port::create(Vec(43, 319), Port::OUTPUT, module, DualAtenuverter::OUT2_OUTPUT)); addChild(ModuleLightWidget::create>(Vec(33, 143), module, DualAtenuverter::OUT1_POS_LIGHT)); addChild(ModuleLightWidget::create>(Vec(33, 311), module, DualAtenuverter::OUT2_POS_LIGHT)); } }; RACK_PLUGIN_MODEL_INIT(Befaco, DualAtenuverter) { Model *modelDualAtenuverter = Model::create("Befaco", "DualAtenuverter", "Dual Atenuverter", ATTENUATOR_TAG, DUAL_TAG); return modelDualAtenuverter; }