/////////////////////////////////////////////////// // // Wave Folder VCV Module // // Strum 2017 // /////////////////////////////////////////////////// #include "mental.hpp" namespace rack_plugin_mental { ////////////////////////////////////////////////////// struct MentalFold : Module { enum ParamIds { THRESH_PARAM, GAIN_PARAM, THRESH_PARAM2, GAIN_PARAM2, NUM_PARAMS }; enum InputIds { INPUT_1, THRESH_CV_INPUT, GAIN_CV_INPUT, INPUT_2, THRESH_CV_INPUT2, GAIN_CV_INPUT2, NUM_INPUTS }; enum OutputIds { OUTPUT_1, OUTPUT_2, NUM_OUTPUTS }; MentalFold() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} void step() override; }; ///////////////////////////////////////////////////// void MentalFold::step() { float signal_in_1 = inputs[INPUT_1].value; float signal_in_2 = inputs[INPUT_2].value; float threshold_fold = params[THRESH_PARAM].value * 6 + inputs[THRESH_CV_INPUT].value; float threshold_fold2 = params[THRESH_PARAM2].value * 6 + inputs[THRESH_CV_INPUT2].value; float gain = params[GAIN_PARAM].value * 5 + inputs[GAIN_CV_INPUT].value / 2; float gain2 = params[GAIN_PARAM2].value * 5 + inputs[GAIN_CV_INPUT2].value / 2; float modified = signal_in_1; float modified2 = signal_in_2; if (std::abs(signal_in_1) > threshold_fold ) { if (signal_in_1 > 0) { modified = threshold_fold - (signal_in_1 - threshold_fold ); } else { modified = - threshold_fold - (signal_in_1 + threshold_fold ); } } if (std::abs(signal_in_2) > threshold_fold2 ) { if (signal_in_2 > 0) { modified2 = threshold_fold2 - (signal_in_2 - threshold_fold2 ); } else { modified2 = - threshold_fold2 - (signal_in_2 + threshold_fold2 ); } } outputs[OUTPUT_1].value = modified * gain; outputs[OUTPUT_2].value = modified2 * gain2; } ////////////////////////////////////////////////////////////////// struct MentalFoldWidget : ModuleWidget { MentalFoldWidget(MentalFold *module); }; MentalFoldWidget::MentalFoldWidget(MentalFold *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/MentalFold.svg"))); // label addParam(ParamWidget::create(Vec(6, box.size.y / 2 - 169), module, MentalFold::THRESH_PARAM, 0.0, 1.0, 1.0)); addInput(Port::create(Vec(3, box.size.y / 2 - 148), Port::INPUT, module, MentalFold::THRESH_CV_INPUT)); // label addParam(ParamWidget::create(Vec(6, box.size.y / 2 - 112), module, MentalFold::GAIN_PARAM, 0.0, 1.0, 0.5)); addInput(Port::create(Vec(3, box.size.y / 2 - 91), Port::INPUT, module, MentalFold::GAIN_CV_INPUT)); // output addInput(Port::create(Vec(3, box.size.y / 2 - 55), Port::INPUT, module, MentalFold::INPUT_1)); addOutput(Port::create(Vec(3, box.size.y / 2 - 28), Port::OUTPUT, module, MentalFold::OUTPUT_1)); // label addParam(ParamWidget::create(Vec(6, box.size.y - 177), module, MentalFold::THRESH_PARAM2, 0.0, 1.0, 1.0)); addInput(Port::create(Vec(3, box.size.y - 156), Port::INPUT, module, MentalFold::THRESH_CV_INPUT2)); // label addParam(ParamWidget::create(Vec(6, box.size.y - 120), module, MentalFold::GAIN_PARAM2, 0.0, 1.0, 0.5)); addInput(Port::create(Vec(3, box.size.y - 99), Port::INPUT, module, MentalFold::GAIN_CV_INPUT2)); // output addInput(Port::create(Vec(3, box.size.y - 65), Port::INPUT, module, MentalFold::INPUT_2)); addOutput(Port::create(Vec(3, box.size.y - 38), Port::OUTPUT, module, MentalFold::OUTPUT_2)); } } // namespace rack_plugin_mental using namespace rack_plugin_mental; RACK_PLUGIN_MODEL_INIT(mental, MentalFold) { Model *modelMentalFold = Model::create("mental", "MentalFold", "Wave Folder", DISTORTION_TAG); return modelMentalFold; }