/////////////////////////////////////////////////// // // Gates VCV Module // // Strum 2017 // /////////////////////////////////////////////////// #include "mental.hpp" #include "dsp/digital.hpp" ///////////////////////////////////////////////// namespace rack_plugin_mental { struct MentalGates : Module { enum ParamIds { BUTTON_PARAM, NUM_PARAMS = BUTTON_PARAM + 4 }; enum InputIds { INPUT, GATE_INPUT = INPUT + 4, NUM_INPUTS = GATE_INPUT + 4 }; enum OutputIds { OUTPUT, NUM_OUTPUTS = OUTPUT + 4 }; enum LightIds { BUTTON_LIGHTS, ON_LEDS = BUTTON_LIGHTS + 4, NUM_LIGHTS = ON_LEDS + 4 }; SchmittTrigger button_triggers[4]; bool button_on[4] = {0,0,0,0}; float signal[4] = {0.0,0.0,0.0}; float on[4] = {0.0,0.0,0.0}; MentalGates() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} void step() override; json_t *toJson() override { json_t *rootJ = json_object(); // button states json_t *button_statesJ = json_array(); for (int i = 0; i < 4; i++) { json_t *button_stateJ = json_integer((int) button_on[i]); json_array_append_new(button_statesJ, button_stateJ); } json_object_set_new(rootJ, "buttons", button_statesJ); return rootJ; } void fromJson(json_t *rootJ) override { // button states json_t *button_statesJ = json_object_get(rootJ, "buttons"); if (button_statesJ) { for (int i = 0; i < 4; i++) { json_t *button_stateJ = json_array_get(button_statesJ, i); if (button_stateJ) button_on[i] = !!json_integer_value(button_stateJ); } } } }; ///////////////////////////////////////////////////// void MentalGates::step() { for (int i = 0 ; i < 4 ; i++) { signal[i] = inputs[INPUT + i].value; on[i] = inputs[GATE_INPUT + i].value; if (button_triggers[i].process(params[BUTTON_PARAM + i].value)) { button_on[i] = !button_on[i]; } lights[BUTTON_LIGHTS + i ].value = (button_on[i]) ? 1.0 : 0.0; if (button_on[i] || ( on[i] > 0.0)) { outputs[OUTPUT + i].value = 0.0; lights[ON_LEDS + i].value = 1.0; } else { outputs[OUTPUT + i].value = signal[i]; lights[ON_LEDS + i].value = 0.0; } } } ////////////////////////////////////////////////////////////////// struct MentalGatesWidget : ModuleWidget { MentalGatesWidget(MentalGates *module); }; MentalGatesWidget::MentalGatesWidget(MentalGates *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/MentalGates.svg"))); int group_spacing = 85; for (int i = 0 ; i < 4 ; i++) { addInput(Port::create(Vec(3, group_spacing * i + 60), Port::INPUT, module, MentalGates::INPUT + i)); addInput(Port::create(Vec(3, group_spacing * i + 28), Port::INPUT, module, MentalGates::GATE_INPUT + i)); addOutput(Port::create(Vec(32, group_spacing * i + 60), Port::OUTPUT, module, MentalGates::OUTPUT + i)); addChild(ModuleLightWidget::create>(Vec(26, group_spacing * i + 17), module, MentalGates::ON_LEDS + i)); addParam(ParamWidget::create(Vec(35, group_spacing * i + 31), module, MentalGates::BUTTON_PARAM + i, 0.0, 1.0, 0.0)); addChild(ModuleLightWidget::create>(Vec(35+5, group_spacing * i + 31+5), module, MentalGates::BUTTON_LIGHTS + i)); } } } // namespace rack_plugin_mental using namespace rack_plugin_mental; RACK_PLUGIN_MODEL_INIT(mental, MentalGates) { Model *modelMentalGates = Model::create("mental", "MentalGates", "Gates", UTILITY_TAG); return modelMentalGates; }