#include "cf.hpp" #include "dsp/digital.hpp" namespace rack_plugin_cf { struct EACH : Module { enum ParamIds { DIV_PARAM, BEAT_PARAM, ON_PARAM, NUM_PARAMS }; enum InputIds { DOUZE_INPUT, START_INPUT, ON_INPUT, DIV_INPUT, NUM_INPUTS }; enum OutputIds { DOUZE_OUTPUT, RESET_OUTPUT, BEAT_OUTPUT, START_OUTPUT, NUM_OUTPUTS }; enum LightIds { ON_LIGHT, BEAT_LIGHT, NUM_LIGHTS }; int max_EACH = 3 ; int stepa = 0 ; int lum = 0 ; int note = 0; SchmittTrigger stTrigger; SchmittTrigger dzTrigger; float or_gain ; int or_affi ; EACH() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} void step() override; }; void EACH::step() { if (!inputs[DIV_INPUT].active) { max_EACH = floor(params[DIV_PARAM].value); or_affi=0; } else { max_EACH = round(clamp((inputs[DIV_INPUT].value * 1.2)+1,1.0f,12.0f)); or_gain = round(clamp(inputs[DIV_INPUT].value,0.0f,10.0f)); or_affi=1; } if (inputs[START_INPUT].active) { outputs[START_OUTPUT].value = inputs[START_INPUT].value; outputs[RESET_OUTPUT].value = inputs[START_INPUT].value; if (dzTrigger.process(inputs[START_INPUT].value)) stepa = max_EACH-1 ; } if (stTrigger.process(inputs[DOUZE_INPUT].value)) stepa = stepa +1 ; if (inputs[DOUZE_INPUT].active) { if (stepa == max_EACH) { note = 5; stepa = 0; lum = 2000; } outputs[DOUZE_OUTPUT].value = inputs[DOUZE_INPUT].value; } if (note >0) {outputs[BEAT_OUTPUT].value = 10.f;note = note -1;} else outputs[BEAT_OUTPUT].value = 0.f; if (lum>0) {lights[BEAT_LIGHT].value = true;lum = lum -1;} else lights[BEAT_LIGHT].value = false; } struct NuDisplayWidget : TransparentWidget { int *value; std::shared_ptr font; NuDisplayWidget() { font = Font::load(assetPlugin(plugin, "res/Segment7Standard.ttf")); }; void draw(NVGcontext *vg) { // Background NVGcolor backgroundColor = nvgRGB(0x44, 0x44, 0x44); NVGcolor borderColor = nvgRGB(0x10, 0x10, 0x10); nvgBeginPath(vg); nvgRoundedRect(vg, 0.0, 0.0, box.size.x, box.size.y, 4.0); nvgFillColor(vg, backgroundColor); nvgFill(vg); nvgStrokeWidth(vg, 1.0); nvgStrokeColor(vg, borderColor); nvgStroke(vg); nvgFontSize(vg, 18); nvgFontFaceId(vg, font->handle); nvgTextLetterSpacing(vg, 2.5); std::string to_display = std::to_string(*value); while(to_display.length()<3) to_display = ' ' + to_display; Vec textPos = Vec(6.0f, 17.0f); NVGcolor textColor = nvgRGB(0xdf, 0xd2, 0x2c); nvgFillColor(vg, nvgTransRGBA(textColor, 16)); nvgText(vg, textPos.x, textPos.y, "~~~", NULL); textColor = nvgRGB(0xda, 0xe9, 0x29); nvgFillColor(vg, nvgTransRGBA(textColor, 16)); nvgText(vg, textPos.x, textPos.y, "\\\\\\", NULL); textColor = nvgRGB(0x28, 0xb0, 0xf3); nvgFillColor(vg, textColor); nvgText(vg, textPos.x, textPos.y, to_display.c_str(), NULL); } }; struct MOTORPOTDisplay : TransparentWidget { float d; float *gainX ; int *affich; MOTORPOTDisplay() { } void draw(NVGcontext *vg) { if (*affich==1) { float xx = d*sin(-(*gainX*0.17+0.15)*M_PI) ; float yy = d*cos((*gainX*0.17+0.15)*M_PI) ; nvgBeginPath(vg); nvgCircle(vg, 0,0, d); nvgFillColor(vg, nvgRGBA(0x00, 0x00, 0x00, 0xff)); nvgFill(vg); nvgStrokeWidth(vg,1.2); nvgStrokeColor(vg, nvgRGBA(0xff, 0xff, 0xff, 0xff)); { nvgBeginPath(vg); nvgMoveTo(vg, 0,0); nvgLineTo(vg, xx,yy); nvgClosePath(vg); } nvgStroke(vg); } } }; struct EACHWidget : ModuleWidget { EACHWidget(EACH *module); }; EACHWidget::EACHWidget(EACH *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/EACH.svg"))); addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(box.size.x-30, 0))); addChild(Widget::create(Vec(15, 365))); addChild(Widget::create(Vec(box.size.x-30, 365))); addInput(Port::create(Vec(11, 26), Port::INPUT, module, EACH::START_INPUT)); addOutput(Port::create(Vec(35, 275), Port::OUTPUT, module, EACH::RESET_OUTPUT)); addOutput(Port::create(Vec(11, 321), Port::OUTPUT, module, EACH::START_OUTPUT)); addInput(Port::create(Vec(54, 26), Port::INPUT, module, EACH::DOUZE_INPUT)); addOutput(Port::create(Vec(54, 321), Port::OUTPUT, module, EACH::DOUZE_OUTPUT)); addOutput(Port::create(Vec(35, 235), Port::OUTPUT, module, EACH::BEAT_OUTPUT)); addParam(ParamWidget::create(Vec(27, 107), module, EACH::DIV_PARAM, 1.0f, 12.1f, 3.1f)); addInput(Port::create(Vec(11, 141), Port::INPUT, module, EACH::DIV_INPUT)); { MOTORPOTDisplay *display = new MOTORPOTDisplay(); display->box.pos = Vec(46, 126); display->d = 19.1; display->gainX = &module->or_gain; display->affich = &module->or_affi; addChild(display); } addParam(ParamWidget::create(Vec(38, 197), module, EACH::BEAT_PARAM, 0.0f, 1.0f, 0.0f)); addChild(ModuleLightWidget::create>(Vec(42.4, 201.4), module, EACH::BEAT_LIGHT)); NuDisplayWidget *display = new NuDisplayWidget(); display->box.pos = Vec(20,56); display->box.size = Vec(50, 20); display->value = &module->max_EACH; addChild(display); } } // namespace rack_plugin_cf using namespace rack_plugin_cf; RACK_PLUGIN_MODEL_INIT(cf, EACH) { Model *modelEACH = Model::create("cf", "EACH", "Each", CLOCK_TAG); return modelEACH; }