#include "cf.hpp" #include "dsp/digital.hpp" namespace rack_plugin_cf { struct CUTS : Module { enum ParamIds { POTF_PARAM, POTR_PARAM, LINK_PARAM, POLE_PARAM, NUM_PARAMS }; enum InputIds { IN_INPUT, IN2_INPUT, F_INPUT, R_INPUT, NUM_INPUTS }; enum OutputIds { OUT_OUTPUT, OUT2_OUTPUT, NUM_OUTPUTS }; enum LightIds { LINK_LIGHT, NUM_LIGHTS }; int poles = 4; float prevf1[8]; float prevf2[8]; float prevf3[8]; float prevf4[8]; float delta=0.0; float temp1=0.0; float temp2=0.0; float temp3=0.0; float temp4=0.0; float rin=0; bool rv =false; float fin=0; bool fv =false; bool LINK_STATE =false; float link_delta; SchmittTrigger linkTrigger; CUTS() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {reset();} void step() override; json_t *toJson() override { json_t *rootJ = json_object(); json_object_set_new(rootJ, "linkstate", json_integer(LINK_STATE)); json_object_set_new(rootJ, "linkdelta", json_real(link_delta)); return rootJ; } void fromJson(json_t *rootJ) override { json_t *linkstateJ = json_object_get(rootJ, "linkstate"); if (linkstateJ) LINK_STATE = json_integer_value(linkstateJ); json_t *ldJ = json_object_get(rootJ, "linkdelta"); if (ldJ) link_delta = json_real_value(ldJ); } }; struct Slide : LEDSliderBlue { float *deltax ; bool *visi ; float xorigin = 0.0; Slide() { //setSVG(SVG::load(assetPlugin(plugin, "res/spiral.svg"))); } void step() override{ if (xorigin==0) xorigin=box.pos.x; dirty = true; if(*visi) {value= *deltax; box.pos.x = xorigin;} else {value =value; box.pos.x = xorigin+100;} LEDSliderBlue::step(); } //void draw(NVGcontext *vg) override {LEDSliderBlue::draw(vg);} }; void CUTS::step() { poles = int(params[POLE_PARAM].value); if (linkTrigger.process(params[LINK_PARAM].value)) {if (LINK_STATE == 0) {LINK_STATE = 1; link_delta = fin-rin;} else LINK_STATE = 0;} lights[LINK_LIGHT].value=LINK_STATE; if (inputs[R_INPUT].active) { rv = true; rin = clamp(inputs[R_INPUT].value,0.0,10.0)/10.0; } else { rv = false; rin = params[POTR_PARAM].value; } if (!LINK_STATE) { if (inputs[F_INPUT].active) { fv = true; fin = clamp(inputs[F_INPUT].value,0.0,10.0)/10.0; } else { fv = false; fin = params[POTF_PARAM].value; } } else { if (inputs[R_INPUT].active) { fv = true; fin = clamp(inputs[R_INPUT].value/10.0+link_delta,0.0f,1.0f); } else { if (inputs[F_INPUT].active) { rv = true; rin = clamp(inputs[F_INPUT].value/10-link_delta,0.0f,1.0f); fv = true; fin = clamp(inputs[F_INPUT].value/10,0.0f,1.0f); } else { fv = true; fin = clamp(params[POTR_PARAM].value+link_delta,0.0f,1.0f); } } } if (inputs[IN_INPUT].active) { temp1 = inputs[IN_INPUT].value; for (int i=0;i(Vec(15, 0))); addChild(Widget::create(Vec(15, 365))); addInput(Port::create(Vec(3, 308), Port::INPUT, module, CUTS::IN_INPUT)); addInput(Port::create(Vec(3, 334), Port::INPUT, module, CUTS::IN2_INPUT)); addOutput(Port::create(Vec(32, 308), Port::OUTPUT, module, CUTS::OUT_OUTPUT)); addOutput(Port::create(Vec(32, 334), Port::OUTPUT, module, CUTS::OUT2_OUTPUT)); addParam(ParamWidget::create(Vec(15.5, 54), module, CUTS::POLE_PARAM, 1.0f, 8.0f, 4.0f)); addParam(ParamWidget::create(Vec(5, 131), module, CUTS::POTR_PARAM, 0.0f, 1.0f, 0.0f)); addInput(Port::create(Vec(3, 252), Port::INPUT, module, CUTS::R_INPUT)); addParam(ParamWidget::create(Vec(35, 131), module, CUTS::POTF_PARAM, 0.0f, 1.0f, 1.0f)); addInput(Port::create(Vec(32, 252), Port::INPUT, module, CUTS::F_INPUT)); Slide *rslider = new Slide(); rslider->box.pos = Vec(5,131); rslider->deltax = &module->rin; rslider->visi = &module->rv; addChild(rslider); Slide *fslider = new Slide(); fslider->box.pos = Vec(35,131); fslider->deltax = &module->fin; fslider->visi = &module->fv; addChild(fslider); addParam(ParamWidget::create(Vec(21.5, 104), module, CUTS::LINK_PARAM, 0.0, 1.0, 0.0)); addChild(ModuleLightWidget::create>(Vec(25.9, 108.4), module, CUTS::LINK_LIGHT)); } } // namespace rack_plugin_cf using namespace rack_plugin_cf; RACK_PLUGIN_MODEL_INIT(cf, CUTS) { Model *modelCUTS = Model::create("cf", "CUTS", "Cuts", FILTER_TAG); return modelCUTS; }