#include "LindenbergResearch.hpp" namespace rack_plugin_LindenbergResearch { using namespace lrt; struct ReShaper : Module { enum ParamIds { RESHAPER_AMOUNT, RESHAPER_CV_AMOUNT, NUM_PARAMS }; enum InputIds { RESHAPER_INPUT, RESHAPER_CV_INPUT, NUM_INPUTS }; enum OutputIds { RESHAPER_OUTPUT, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; ReShaper() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} void step() override; }; void ReShaper::step() { // normalize signal input to [-1.0...+1.0] float x = clamp(inputs[RESHAPER_INPUT].value * 0.1f, -1.f, 1.f); float cv = inputs[RESHAPER_CV_INPUT].value * params[RESHAPER_CV_AMOUNT].value; float a = clamp(params[RESHAPER_AMOUNT].value + cv, 1.f, 50.f); // do the acid! float out = x * (fabs(x) + a) / (x * x + (a - 1) * fabs(x) + 1); outputs[RESHAPER_OUTPUT].value = out * 5.0f; } /** * @brief Reshaper Panel */ struct ReShaperWidget : LRModuleWidget { ReShaperWidget(ReShaper *module); }; ReShaperWidget::ReShaperWidget(ReShaper *module) : LRModuleWidget(module) { // setPanel(SVG::load(assetPlugin(plugin, "res/ReShaper.svg"))); panel = new LRPanel(); panel->setBackground(SVG::load(assetPlugin(plugin, "res/ReShaper.svg"))); addChild(panel); box.size = panel->box.size; // ***** SCREWS ********** addChild(Widget::create(Vec(15, 1))); addChild(Widget::create(Vec(box.size.x - 30, 1))); addChild(Widget::create(Vec(15, 366))); addChild(Widget::create(Vec(box.size.x - 30, 366))); // ***** SCREWS ********** // ***** MAIN KNOBS ****** addParam(ParamWidget::create(Vec(32, 216), module, ReShaper::RESHAPER_AMOUNT, 1.f, 50.f, 1.f)); addParam(ParamWidget::create(Vec(48, 126), module, ReShaper::RESHAPER_CV_AMOUNT, 0.f, 5.f, 0.f)); // ***** MAIN KNOBS ****** // ***** INPUTS ********** addInput(Port::create(Vec(21, 60), Port::INPUT, module, ReShaper::RESHAPER_INPUT)); addInput(Port::create(Vec(71, 60), Port::INPUT, module, ReShaper::RESHAPER_CV_INPUT)); // ***** INPUTS ********** // ***** OUTPUTS ********* addOutput(Port::create(Vec(46, 320), Port::OUTPUT, module, ReShaper::RESHAPER_OUTPUT)); // ***** OUTPUTS ********* } } // namespace rack_plugin_LindenbergResearch using namespace rack_plugin_LindenbergResearch; RACK_PLUGIN_MODEL_INIT(LindenbergResearch, ReShaper) { Model *modelReShaper = Model::create("Lindenberg Research", "ReShaper", "ReShaper Wavefolder", WAVESHAPER_TAG); return modelReShaper; }