#include "NauModular.hpp" namespace rack_plugin_NauModular { struct Function : Module{ enum ParamIds { A_PARAM, NUM_PARAMS }; enum InputIds { X_INPUT, NUM_INPUTS }; enum OutputIds{ ELLIPSE_OUTPUT, PARABOLA_OUTPUT, HYPERBOLA_OUTPUT, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; Function() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS){} void step() override; }; void Function::step(){ float v = inputs[X_INPUT].value; float a = params[A_PARAM].value; outputs[ELLIPSE_OUTPUT].value = sqrt((a*a)-(v*v)); outputs[HYPERBOLA_OUTPUT].value = a/v; outputs[PARABOLA_OUTPUT].value = v*v*a; } struct FunctionWidget : ModuleWidget{ FunctionWidget(Function *module); }; FunctionWidget::FunctionWidget(Function *module) : ModuleWidget(module){ box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/Function.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))); addParam(ParamWidget::create(Vec(50, 87), module, Function::A_PARAM, -5.0, 5.0, 0.0)); addInput(Port::create(Vec(15, 87), Port::INPUT, module, Function::X_INPUT)); addOutput(Port::create(Vec(15,150), Port::OUTPUT, module, Function::HYPERBOLA_OUTPUT)); addOutput(Port::create(Vec(15,220), Port::OUTPUT, module, Function::PARABOLA_OUTPUT)); addOutput(Port::create(Vec(15,300), Port::OUTPUT, module, Function::ELLIPSE_OUTPUT)); }; } // namespace rack_plugin_NauModular using namespace rack_plugin_NauModular; RACK_PLUGIN_MODEL_INIT(NauModular, Function) { Model *modelFunction = Model::create("NauModular", "Function", "Function", FUNCTION_GENERATOR_TAG); return modelFunction; }