#include "DS.hpp" namespace rack_plugin_SubmarineFree { struct LD_106 : DS_Module { static const int deviceCount = 6; enum ParamIds { PARAM_CUTOFF_1, PARAM_CUTOFF_2, PARAM_CUTOFF_3, PARAM_CUTOFF_4, PARAM_CUTOFF_5, PARAM_CUTOFF_6, PARAM_WIDTH_1, PARAM_WIDTH_2, PARAM_WIDTH_3, PARAM_WIDTH_4, PARAM_WIDTH_5, PARAM_WIDTH_6, NUM_PARAMS }; enum InputIds { INPUT_1, INPUT_2, INPUT_3, INPUT_4, INPUT_5, INPUT_6, NUM_INPUTS }; enum OutputIds { OUTPUT_1, OUTPUT_2, OUTPUT_3, OUTPUT_4, OUTPUT_5, OUTPUT_6, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; DS_Schmitt schmittState[deviceCount]; LD_106() : DS_Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} void step() override; }; void LD_106::step() { for (int i = 0; i < deviceCount; i++) { outputs[OUTPUT_1 + i].value = output(schmittState[i].state(params[PARAM_CUTOFF_1 + i].value - params[PARAM_WIDTH_1 + i].value, params[PARAM_CUTOFF_1 + i].value + params[PARAM_WIDTH_1 + i].value, inputs[INPUT_1 + i].value)); } } struct LD106 : ModuleWidget { ParamWidget *cutoffWidgets[LD_106::deviceCount]; ParamWidget *widthWidgets[LD_106::deviceCount]; LD106(LD_106 *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/LD-106.svg"))); for (int i = 0; i < LD_106::deviceCount; i++) { int offset = 58 * i; addInput(Port::create(Vec(4,19 + offset), Port::INPUT, module, LD_106::INPUT_1 + i)); addOutput(Port::create(Vec(62,19 + offset), Port::OUTPUT, module, LD_106::OUTPUT_1 + i)); cutoffWidgets[i] = ParamWidget::create(Vec(4, 47 + offset), module, LD_106::PARAM_CUTOFF_1 + i, -10.0f, 10.0f, 5.0f); addParam(cutoffWidgets[i]); widthWidgets[i] = ParamWidget::create(Vec(62, 47 + offset), module, LD_106::PARAM_WIDTH_1 + i, 0.0f, 5.0f, 1.0f); addParam(widthWidgets[i]); } } void appendContextMenu(Menu *menu) override; }; struct LDMenuItem: MenuItem { LD106 *ld106; float cutoff; float width; void onAction(EventAction &e) override { for (int i = 0; i < LD_106::deviceCount; i++) { ld106->cutoffWidgets[i]->setValue(cutoff); ld106->widthWidgets[i]->setValue(width); } } }; void LD106::appendContextMenu(Menu *menu) { menu->addChild(MenuEntry::create()); LD106 *ld106 = dynamic_cast(this); assert(ld106); LDMenuItem *menuItem = MenuItem::create("Cutoff 5V"); menuItem->ld106 = ld106; menuItem->cutoff = 5.0f; menuItem->width = 1.0f; menu->addChild(menuItem); menuItem = MenuItem::create("Cutoff 0V"); menuItem->ld106 = ld106; menuItem->cutoff = 0.0f; menuItem->width = 0.0f; menu->addChild(menuItem); menuItem = MenuItem::create("Cutoff 2.5V"); menuItem->ld106 = ld106; menuItem->cutoff = 2.5f; menuItem->width = 0.5f; menu->addChild(menuItem); menuItem = MenuItem::create("TTL Levels"); menuItem->ld106 = ld106; menuItem->cutoff = 1.4f; menuItem->width = 0.6f; menu->addChild(menuItem); ((LD_106 *)module)->appendContextMenu(menu); } } // namespace rack_plugin_SubmarineFree using namespace rack_plugin_SubmarineFree; RACK_PLUGIN_MODEL_INIT(SubmarineFree, LD106) { Model *modelLD106 = Model::create("SubmarineFree", "LD-106", "LD-106 Schmitt Trigger Line Drivers", LOGIC_TAG, MULTIPLE_TAG); return modelLD106; }