/////////////////////////////////////////////////// // // Wave Folder VCV Module // // Strum 2017 // /////////////////////////////////////////////////// #include "mental.hpp" namespace rack_plugin_mental { ////////////////////////////////////////////////////// struct MentalClip : Module { enum ParamIds { THRESH1_PARAM, GAIN1_PARAM, THRESH2_PARAM, GAIN2_PARAM, NUM_PARAMS }; enum InputIds { INPUT1, THRESH1_CV_INPUT, GAIN1_CV_INPUT, INPUT2, THRESH2_CV_INPUT, GAIN2_CV_INPUT, NUM_INPUTS }; enum OutputIds { OUTPUT1, OUTPUT2, NUM_OUTPUTS }; MentalClip() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} void step() override; }; ///////////////////////////////////////////////////// void MentalClip::step() { float signal_in1 = inputs[INPUT1].value; float threshold1 = params[THRESH1_PARAM].value * 6 + inputs[THRESH1_CV_INPUT].value/2; float gain1 = params[GAIN1_PARAM].value * 5 + inputs[GAIN1_CV_INPUT].value / 2; float signal_in2 = inputs[INPUT2].value; float threshold2 = params[THRESH2_PARAM].value * 6 + inputs[THRESH2_CV_INPUT].value/2; float gain2 = params[GAIN2_PARAM].value * 5 + inputs[GAIN2_CV_INPUT].value / 2; float clipped1 = signal_in1; float clipped2 = signal_in2; if (std::abs(signal_in1) > threshold1) { if (signal_in1 > 0) { clipped1 = threshold1; } else { clipped1 = - threshold1; } } if (std::abs(signal_in2) > threshold2) { if (signal_in2 > 0) { clipped2 = threshold2; } else { clipped2 = - threshold2; } } outputs[OUTPUT1].value = clipped1 * gain1; outputs[OUTPUT2].value = clipped2 * gain2; } ////////////////////////////////////////////////////////////////// struct MentalClipWidget : ModuleWidget { MentalClipWidget(MentalClip *module); }; MentalClipWidget::MentalClipWidget(MentalClip *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/MentalClip.svg"))); // label addParam(ParamWidget::create(Vec(6, box.size.y / 2 - 169), module, MentalClip::THRESH1_PARAM, 0.0, 1.0, 1.0)); addInput(Port::create(Vec(3, box.size.y / 2 - 148), Port::INPUT, module, MentalClip::THRESH1_CV_INPUT)); // label addParam(ParamWidget::create(Vec(6, box.size.y / 2 - 112), module, MentalClip::GAIN1_PARAM, 0.0, 1.0, 0.5)); addInput(Port::create(Vec(3, box.size.y / 2 - 91), Port::INPUT, module, MentalClip::GAIN1_CV_INPUT)); // output addInput(Port::create(Vec(3, box.size.y / 2 - 55), Port::INPUT, module, MentalClip::INPUT1)); addOutput(Port::create(Vec(3, box.size.y / 2 - 28), Port::OUTPUT, module, MentalClip::OUTPUT1)); // label addParam(ParamWidget::create(Vec(6, box.size.y - 175), module, MentalClip::THRESH2_PARAM, 0.0, 1.0, 1.0)); addInput(Port::create(Vec(3, box.size.y - 154), Port::INPUT, module, MentalClip::THRESH2_CV_INPUT)); // label addParam(ParamWidget::create(Vec(6, box.size.y - 122), module, MentalClip::GAIN2_PARAM, 0.0, 1.0, 0.5)); addInput(Port::create(Vec(3, box.size.y - 101), Port::INPUT, module, MentalClip::GAIN2_CV_INPUT)); // output addInput(Port::create(Vec(3, box.size.y - 65), Port::INPUT, module, MentalClip::INPUT2)); addOutput(Port::create(Vec(3, box.size.y - 38), Port::OUTPUT, module, MentalClip::OUTPUT2)); } } // namespace rack_plugin_mental using namespace rack_plugin_mental; RACK_PLUGIN_MODEL_INIT(mental, MentalClip) { Model *modelMentalClip = Model::create("mental", "MentalClip", "Clipper", DISTORTION_TAG); return modelMentalClip; }