#include "cf.hpp" #include "dsp/digital.hpp" using namespace std; namespace rack_plugin_cf { struct ALGEBRA : Module { enum ParamIds { OP_PARAM, NUM_PARAMS = OP_PARAM+6 }; enum InputIds { IN1_INPUT, IN2_INPUT, NUM_INPUTS }; enum OutputIds { OUT_OUTPUT, NUM_OUTPUTS }; enum LightIds { LED_LIGHT, NUM_LIGHTS = LED_LIGHT+6 }; int OP_STATE = 0 ; SchmittTrigger trTrigger[6]; ALGEBRA() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } void step() override; json_t *toJson() override { json_t *rootJ = json_object(); json_object_set_new(rootJ, "opstate", json_integer(OP_STATE)); return rootJ; } void fromJson(json_t *rootJ) override { json_t *opstateJ = json_object_get(rootJ, "opstate"); if (opstateJ) OP_STATE = json_integer_value(opstateJ); } }; void ALGEBRA::step() { for (int i=0; i<6; i++) { if (trTrigger[i].process(params[OP_PARAM+i].value)) OP_STATE= i; if (OP_STATE == i) lights[LED_LIGHT+i].value=1; else lights[LED_LIGHT+i].value=0; } if (OP_STATE==0) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value + inputs[IN2_INPUT].value; if (OP_STATE==1) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value - inputs[IN2_INPUT].value; if (OP_STATE==2) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value * inputs[IN2_INPUT].value; if ((OP_STATE==3) & (inputs[IN2_INPUT].value!=0)) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value / inputs[IN2_INPUT].value; if (OP_STATE==4) { if (inputs[IN1_INPUT].value>=inputs[IN2_INPUT].value) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value; else outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value; } if (OP_STATE==5) { if (inputs[IN1_INPUT].value<=inputs[IN2_INPUT].value) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value; else outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value; } } struct plusButton : SVGSwitch, MomentarySwitch { plusButton() { addFrame(SVG::load(assetPlugin(plugin, "res/plusButton.svg"))); addFrame(SVG::load(assetPlugin(plugin, "res/plusButton.svg"))); sw->wrap(); box.size = sw->box.size; } }; struct minusButton : SVGSwitch, MomentarySwitch { minusButton() { addFrame(SVG::load(assetPlugin(plugin, "res/minusButton.svg"))); addFrame(SVG::load(assetPlugin(plugin, "res/minusButton.svg"))); sw->wrap(); box.size = sw->box.size; } }; struct multButton : SVGSwitch, MomentarySwitch { multButton() { addFrame(SVG::load(assetPlugin(plugin, "res/multButton.svg"))); addFrame(SVG::load(assetPlugin(plugin, "res/multButton.svg"))); sw->wrap(); box.size = sw->box.size; } }; struct divButton : SVGSwitch, MomentarySwitch { divButton() { addFrame(SVG::load(assetPlugin(plugin, "res/divButton.svg"))); addFrame(SVG::load(assetPlugin(plugin, "res/divButton.svg"))); sw->wrap(); box.size = sw->box.size; } }; struct maxButton : SVGSwitch, MomentarySwitch { maxButton() { addFrame(SVG::load(assetPlugin(plugin, "res/maxButton.svg"))); addFrame(SVG::load(assetPlugin(plugin, "res/maxButton.svg"))); sw->wrap(); box.size = sw->box.size; } }; struct minButton : SVGSwitch, MomentarySwitch { minButton() { addFrame(SVG::load(assetPlugin(plugin, "res/minButton.svg"))); addFrame(SVG::load(assetPlugin(plugin, "res/minButton.svg"))); sw->wrap(); box.size = sw->box.size; } }; struct ALGEBRAWidget : ModuleWidget { ALGEBRAWidget(ALGEBRA *module); //void step() override; }; ALGEBRAWidget::ALGEBRAWidget(ALGEBRA *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/ALGEBRA.svg"))); addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(box.size.x-30, 365))); addInput(Port::create(Vec(3, 31), Port::INPUT, module, ALGEBRA::IN1_INPUT)); addInput(Port::create(Vec(3, 95), Port::INPUT, module, ALGEBRA::IN2_INPUT)); int i = 0; addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i)); addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1; addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i)); addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1; addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i)); addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1; addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i)); addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1; addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i)); addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1; addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i)); addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); addOutput(Port::create(Vec(3, 321), Port::OUTPUT, module, ALGEBRA::OUT_OUTPUT)); } } // namespace rack_plugin_cf using namespace rack_plugin_cf; RACK_PLUGIN_MODEL_INIT(cf, ALGEBRA) { Model *modelALGEBRA = Model::create("cf", "ALGEBRA", "Algebra", UTILITY_TAG); return modelALGEBRA; }