#include "ML_modules.hpp" #include "../freeverb/revmodel.hpp" #include "dsp/digital.hpp" namespace rack_plugin_ML_modules { struct FreeVerb : Module { enum ParamIds { ROOMSIZE_PARAM, DAMP_PARAM, FREEZE_PARAM, NUM_PARAMS }; enum InputIds { IN_INPUT, ROOMSIZE_INPUT, DAMP_INPUT, FREEZE_INPUT, NUM_INPUTS }; enum OutputIds { OUT1_OUTPUT, OUT2_OUTPUT, NUM_OUTPUTS }; enum LighIds { FREEZE_LIGHT, NUM_LIGHTS }; revmodel reverb; float roomsize, damp; bool freeze=false; SchmittTrigger buttonTrigger; FreeVerb() : Module( NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS ) { float gSampleRate = engineGetSampleRate(); reverb.init(gSampleRate); }; void step() override; void onSampleRateChange() override; }; void FreeVerb::onSampleRateChange() { float gSampleRate = engineGetSampleRate(); reverb.init(gSampleRate); reverb.setdamp(damp); reverb.setroomsize(roomsize); }; void FreeVerb::step() { float out1, out2; out1 = out2 = 0.0; float old_roomsize = roomsize; float old_damp = damp; bool old_freeze = freeze; float input = clamp(inputs[IN_INPUT].value,-10.0f,10.0f); if(inputs[ROOMSIZE_INPUT].active) { roomsize = clamp(inputs[ROOMSIZE_INPUT].value/8.0f, 0.0f, 1.0f); } else { roomsize = params[ROOMSIZE_PARAM].value; }; if(inputs[DAMP_INPUT].active) { damp = clamp(inputs[DAMP_INPUT].value/8.0f, 0.0f, 1.0f); } else { damp = params[DAMP_PARAM].value; }; if(inputs[FREEZE_INPUT].active) { freeze = inputs[FREEZE_INPUT].value > 1.0; } else { if(buttonTrigger.process(params[FREEZE_PARAM].value)) freeze = !freeze; }; if( old_damp != damp ) reverb.setdamp(damp); if( old_roomsize != roomsize) reverb.setroomsize(roomsize); lights[FREEZE_LIGHT].value = freeze?10.0:0.0; if(freeze != old_freeze) reverb.setmode(freeze?1.0:0.0); reverb.process(input, out1, out2); outputs[OUT1_OUTPUT].value = out1; outputs[OUT2_OUTPUT].value = out2; }; struct FreeVerbWidget : ModuleWidget { FreeVerbWidget(FreeVerb *module); }; FreeVerbWidget::FreeVerbWidget(FreeVerb *module) : ModuleWidget(module) { box.size = Vec(15*6, 380); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin,"res/FreeVerb.svg"))); addChild(panel); } addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(15, 365))); addInput(Port::create(Vec(33, 50), Port::INPUT, module, FreeVerb::IN_INPUT)); addInput(Port::create(Vec(53, 120), Port::INPUT, module, FreeVerb::ROOMSIZE_INPUT)); addInput(Port::create(Vec(53, 183), Port::INPUT, module, FreeVerb::DAMP_INPUT)); addInput(Port::create(Vec(53, 246), Port::INPUT, module, FreeVerb::FREEZE_INPUT)); addParam(ParamWidget::create(Vec(10, 122), module, FreeVerb::ROOMSIZE_PARAM, 0.0, 1.0, 0.5)); addParam(ParamWidget::create(Vec(10, 186), module, FreeVerb::DAMP_PARAM, 0.0, 1.0, 0.5)); addParam(ParamWidget::create(Vec(14, 250), module, FreeVerb::FREEZE_PARAM, 0.0, 10.0, 0.0)); addChild(ModuleLightWidget::create>(Vec(18,254), module, FreeVerb::FREEZE_LIGHT)); addOutput(Port::create(Vec(11, 313), Port::OUTPUT, module, FreeVerb::OUT1_OUTPUT)); addOutput(Port::create(Vec(55, 313), Port::OUTPUT, module, FreeVerb::OUT2_OUTPUT)); } } // namespace rack_plugin_ML_modules using namespace rack_plugin_ML_modules; RACK_PLUGIN_MODEL_INIT(ML_modules, FreeVerb) { Model *modelFreeVerb = Model::create("ML modules", "FreeVerb", "FreeVerb", REVERB_TAG); return modelFreeVerb; }