diff --git a/res/SEQ3.svg b/res/SEQ3.svg index 025d557..6a82e29 100644 --- a/res/SEQ3.svg +++ b/res/SEQ3.svg @@ -1,6 +1,4 @@ - - - - - - + id="svg485" + sodipodi:docname="SEQ3.svg" + inkscape:version="0.92.3 (2405546, 2018-03-11)"> + id="metadata489"> image/svg+xml - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="display:none"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mutes.cpp b/src/Mutes.cpp index 063ee46..059be81 100644 --- a/src/Mutes.cpp +++ b/src/Mutes.cpp @@ -69,7 +69,7 @@ struct Mutes : Module { } void onRandomize() override { for (int i = 0; i < 10; i++) { - state[i] = (random::uniform() < 0.5f); + state[i] = random::get(); } } @@ -98,6 +98,12 @@ struct Mutes : Module { } } } + + void invertMutes() { + for (int i = 0; i < 10; i++) { + state[i] ^= true; + } + } }; @@ -144,6 +150,17 @@ struct MutesWidget : ModuleWidget { addOutput(createOutputCentered(mm2px(Vec(33.332, 102.987)), module, Mutes::OUT_OUTPUTS + 8)); addOutput(createOutputCentered(mm2px(Vec(33.332, 113.115)), module, Mutes::OUT_OUTPUTS + 9)); } + + void appendContextMenu(Menu* menu) override { + Mutes* module = dynamic_cast(this->module); + assert(module); + + menu->addChild(new MenuSeparator); + + menu->addChild(createMenuItem("Invert mutes", "", + [=]() {module->invertMutes();} + )); + } }; diff --git a/src/SEQ3.cpp b/src/SEQ3.cpp index 78db0c1..034ed05 100644 --- a/src/SEQ3.cpp +++ b/src/SEQ3.cpp @@ -3,39 +3,45 @@ struct SEQ3 : Module { enum ParamIds { - PARAM_CLOCK, - PARAM_RUN, - PARAM_RESET, - PARAM_STEPS, - ENUMS(PARAM_ROW1, 8), - ENUMS(PARAM_ROW2, 8), - ENUMS(PARAM_ROW3, 8), - ENUMS(PARAM_GATE, 8), + TEMPO_PARAM, + RUN_PARAM, + RESET_PARAM, + STEPS_PARAM, + ENUMS(ROW_PARAMS, 3 * 8), + ENUMS(GATE_PARAMS, 8), + // added in 2.0 + TEMPO_CV_PARAM, + STEPS_CV_PARAM, NUM_PARAMS }; enum InputIds { - INPUT_CLOCK, - INPUT_EXT_CLOCK, - INPUT_RESET, - INPUT_STEPS, + TEMPO_INPUT, + CLOCK_INPUT, + RESET_INPUT, + STEPS_INPUT, + // added in 2.0 + RUN_INPUT, NUM_INPUTS }; enum OutputIds { - OUTPUT_GATES, - OUTPUT_ROW1, - OUTPUT_ROW2, - OUTPUT_ROW3, - ENUMS(OUTPUT_GATE, 8), + GATE_OUTPUT, + CV1_OUTPUT, + CV2_OUTPUT, + CV3_OUTPUT, + ENUMS(STEP_OUTPUTS, 8), + // added in 2.0 + STEPS_OUTPUT, + CLOCK_OUTPUT, + RUN_OUTPUT, + RESET_OUTPUT, NUM_OUTPUTS }; enum LightIds { - LIGHT_RUN, - LIGHT_RESET, - LIGHT_GATES, - LIGHT_ROW1, - LIGHT_ROW2, - LIGHT_ROW3, - ENUMS(LIGHT_GATE, 8), + CLOCK_LIGHT, + RUN_LIGHT, + RESET_LIGHT, + ENUMS(GATE_LIGHTS, 8), + ENUMS(STEP_LIGHTS, 8), NUM_LIGHTS }; @@ -51,29 +57,30 @@ struct SEQ3 : Module { SEQ3() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam(PARAM_CLOCK, -2.f, 6.f, 2.f, "Clock tempo", " bpm", 2.f, 60.f); - configButton(PARAM_RUN, "Run"); - configButton(PARAM_RESET, "Reset"); - configParam(PARAM_STEPS, 1.f, 8.f, 8.f, "Steps"); - paramQuantities[PARAM_STEPS]->snapEnabled = true; - for (int i = 0; i < 8; i++) - configParam(PARAM_ROW1 + i, 0.f, 10.f, 0.f, string::f("Row 1 step %d", i + 1), " V"); - for (int i = 0; i < 8; i++) - configParam(PARAM_ROW2 + i, 0.f, 10.f, 0.f, string::f("Row 2 step %d", i + 1), " V"); - for (int i = 0; i < 8; i++) - configParam(PARAM_ROW3 + i, 0.f, 10.f, 0.f, string::f("Row 3 step %d", i + 1), " V"); - for (int i = 0; i < 8; i++) - configButton(PARAM_GATE + i, string::f("Gate step %d", i + 1)); - configInput(INPUT_CLOCK, "Clock rate"); - configInput(INPUT_EXT_CLOCK, "External clock"); - configInput(INPUT_RESET, "Reset"); - configInput(INPUT_STEPS, "Steps"); - configOutput(OUTPUT_GATES, "Gate"); - configOutput(OUTPUT_ROW1, "Row 1"); - configOutput(OUTPUT_ROW2, "Row 2"); - configOutput(OUTPUT_ROW3, "Row 3"); + configParam(TEMPO_PARAM, -2.f, 4.f, 1.f, "Tempo", " bpm", 2.f, 60.f); + configParam(TEMPO_CV_PARAM, 0.f, 1.f, 1.f, "Tempo CV", "%", 0, 100); + configButton(RUN_PARAM, "Run"); + configButton(RESET_PARAM, "Reset"); + configParam(STEPS_PARAM, 1.f, 8.f, 8.f, "Steps"); + configParam(STEPS_CV_PARAM, 0.f, 1.f, 1.f, "Steps CV", "%", 0, 100); + paramQuantities[STEPS_PARAM]->snapEnabled = true; + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 8; i++) { + configParam(ROW_PARAMS + 8 * j + i, -10.f, 10.f, 0.f, string::f("Row %d step %d", j + 1, i + 1), " V"); + } + } + configInput(TEMPO_INPUT, "Clock rate"); + configInput(CLOCK_INPUT, "External clock"); + configInput(RESET_INPUT, "Reset"); + configInput(STEPS_INPUT, "Steps"); + configOutput(GATE_OUTPUT, "Gate"); + configOutput(CV1_OUTPUT, "Row 1"); + configOutput(CV2_OUTPUT, "Row 2"); + configOutput(CV3_OUTPUT, "Row 3"); for (int i = 0; i < 8; i++) - configOutput(OUTPUT_GATE + i, string::f("Gate %d", i + 1)); + configOutput(STEP_OUTPUTS + i, string::f("Step %d", i + 1)); + + configLight(CLOCK_LIGHT, "Clock trigger"); onReset(); } @@ -124,7 +131,7 @@ struct SEQ3 : Module { } void setIndex(int index) { - int numSteps = (int) clamp(std::round(params[PARAM_STEPS].getValue() + inputs[INPUT_STEPS].getVoltage()), 1.f, 8.f); + int numSteps = (int) clamp(std::round(params[STEPS_PARAM].getValue() + inputs[STEPS_INPUT].getVoltage()), 1.f, 8.f); phase = 0.f; this->index = index; if (this->index >= numSteps) @@ -133,22 +140,22 @@ struct SEQ3 : Module { void process(const ProcessArgs& args) override { // Run - if (runningTrigger.process(params[PARAM_RUN].getValue())) { + if (runningTrigger.process(params[RUN_PARAM].getValue())) { running = !running; } bool gateIn = false; if (running) { - if (inputs[INPUT_EXT_CLOCK].isConnected()) { + if (inputs[CLOCK_INPUT].isConnected()) { // External clock - if (clockTrigger.process(inputs[INPUT_EXT_CLOCK].getVoltage())) { + if (clockTrigger.process(inputs[CLOCK_INPUT].getVoltage())) { setIndex(index + 1); } gateIn = clockTrigger.isHigh(); } else { // Internal clock - float clockTime = std::pow(2.f, params[PARAM_CLOCK].getValue() + inputs[INPUT_CLOCK].getVoltage()); + float clockTime = std::pow(2.f, params[TEMPO_PARAM].getValue() + inputs[TEMPO_INPUT].getVoltage()); phase += clockTime * args.sampleTime; if (phase >= 1.f) { setIndex(index + 1); @@ -158,30 +165,26 @@ struct SEQ3 : Module { } // Reset - if (resetTrigger.process(params[PARAM_RESET].getValue() + inputs[INPUT_RESET].getVoltage())) { + if (resetTrigger.process(params[RESET_PARAM].getValue() + inputs[RESET_INPUT].getVoltage())) { setIndex(0); } // Gate buttons for (int i = 0; i < 8; i++) { - if (gateTriggers[i].process(params[PARAM_GATE + i].getValue())) { + if (gateTriggers[i].process(params[GATE_PARAMS + i].getValue())) { gates[i] = !gates[i]; } - outputs[OUTPUT_GATE + i].setVoltage((running && gateIn && i == index && gates[i]) ? 10.f : 0.f); - lights[LIGHT_GATE + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), args.sampleTime); + outputs[STEP_OUTPUTS + i].setVoltage((running && gateIn && i == index && gates[i]) ? 10.f : 0.f); + lights[GATE_LIGHTS + i].setSmoothBrightness((gateIn && i == index) ? (gates[i] ? 1.f : 0.33) : (gates[i] ? 0.66 : 0.0), args.sampleTime); } // Outputs - outputs[OUTPUT_ROW1].setVoltage(params[PARAM_ROW1 + index].getValue()); - outputs[OUTPUT_ROW2].setVoltage(params[PARAM_ROW2 + index].getValue()); - outputs[OUTPUT_ROW3].setVoltage(params[PARAM_ROW3 + index].getValue()); - outputs[OUTPUT_GATES].setVoltage((gateIn && gates[index]) ? 10.f : 0.f); - lights[LIGHT_RUN].setBrightness(running); - lights[LIGHT_RESET].setSmoothBrightness(resetTrigger.isHigh(), args.sampleTime); - lights[LIGHT_GATES].setSmoothBrightness(gateIn, args.sampleTime); - lights[LIGHT_ROW1].setBrightness(outputs[OUTPUT_ROW1].getVoltage() / 10.f); - lights[LIGHT_ROW2].setBrightness(outputs[OUTPUT_ROW2].getVoltage() / 10.f); - lights[LIGHT_ROW3].setBrightness(outputs[OUTPUT_ROW3].getVoltage() / 10.f); + outputs[CV1_OUTPUT].setVoltage(params[ROW_PARAMS * 8 + 0 + index].getValue()); + outputs[CV2_OUTPUT].setVoltage(params[ROW_PARAMS * 8 + 1 + index].getValue()); + outputs[CV3_OUTPUT].setVoltage(params[ROW_PARAMS * 8 + 2 + index].getValue()); + outputs[GATE_OUTPUT].setVoltage((gateIn && gates[index]) ? 10.f : 0.f); + lights[RUN_LIGHT].setBrightness(running); + lights[RESET_LIGHT].setSmoothBrightness(resetTrigger.isHigh(), args.sampleTime); } }; @@ -196,81 +199,83 @@ struct SEQ3Widget : ModuleWidget { addChild(createWidget(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(createWidget(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); - addParam(createParamCentered(mm2px(Vec(10.381, 23.626)), module, SEQ3::PARAM_CLOCK)); - addParam(createParamCentered(mm2px(Vec(23.38, 23.538)), module, SEQ3::PARAM_RUN)); - addParam(createParamCentered(mm2px(Vec(36.38, 23.538)), module, SEQ3::PARAM_RESET)); - addParam(createParamCentered(mm2px(Vec(49.381, 23.626)), module, SEQ3::PARAM_STEPS)); - - addParam(createParamCentered(mm2px(Vec(10.381, 57.712)), module, SEQ3::PARAM_ROW1 + 0)); - addParam(createParamCentered(mm2px(Vec(23.38, 57.712)), module, SEQ3::PARAM_ROW1 + 1)); - addParam(createParamCentered(mm2px(Vec(36.38, 57.712)), module, SEQ3::PARAM_ROW1 + 2)); - addParam(createParamCentered(mm2px(Vec(49.381, 57.712)), module, SEQ3::PARAM_ROW1 + 3)); - addParam(createParamCentered(mm2px(Vec(62.38, 57.712)), module, SEQ3::PARAM_ROW1 + 4)); - addParam(createParamCentered(mm2px(Vec(75.381, 57.712)), module, SEQ3::PARAM_ROW1 + 5)); - addParam(createParamCentered(mm2px(Vec(88.38, 57.712)), module, SEQ3::PARAM_ROW1 + 6)); - addParam(createParamCentered(mm2px(Vec(101.38, 57.712)), module, SEQ3::PARAM_ROW1 + 7)); - - addParam(createParamCentered(mm2px(Vec(10.381, 71.734)), module, SEQ3::PARAM_ROW2 + 0)); - addParam(createParamCentered(mm2px(Vec(23.38, 71.734)), module, SEQ3::PARAM_ROW2 + 1)); - addParam(createParamCentered(mm2px(Vec(36.38, 71.734)), module, SEQ3::PARAM_ROW2 + 2)); - addParam(createParamCentered(mm2px(Vec(49.381, 71.734)), module, SEQ3::PARAM_ROW2 + 3)); - addParam(createParamCentered(mm2px(Vec(62.38, 71.734)), module, SEQ3::PARAM_ROW2 + 4)); - addParam(createParamCentered(mm2px(Vec(75.381, 71.734)), module, SEQ3::PARAM_ROW2 + 5)); - addParam(createParamCentered(mm2px(Vec(88.38, 71.734)), module, SEQ3::PARAM_ROW2 + 6)); - addParam(createParamCentered(mm2px(Vec(101.38, 71.734)), module, SEQ3::PARAM_ROW2 + 7)); - - addParam(createParamCentered(mm2px(Vec(10.381, 85.711)), module, SEQ3::PARAM_ROW3 + 0)); - addParam(createParamCentered(mm2px(Vec(23.38, 85.711)), module, SEQ3::PARAM_ROW3 + 1)); - addParam(createParamCentered(mm2px(Vec(36.38, 85.711)), module, SEQ3::PARAM_ROW3 + 2)); - addParam(createParamCentered(mm2px(Vec(49.381, 85.711)), module, SEQ3::PARAM_ROW3 + 3)); - addParam(createParamCentered(mm2px(Vec(62.38, 85.711)), module, SEQ3::PARAM_ROW3 + 4)); - addParam(createParamCentered(mm2px(Vec(75.381, 85.711)), module, SEQ3::PARAM_ROW3 + 5)); - addParam(createParamCentered(mm2px(Vec(88.38, 85.711)), module, SEQ3::PARAM_ROW3 + 6)); - addParam(createParamCentered(mm2px(Vec(101.38, 85.711)), module, SEQ3::PARAM_ROW3 + 7)); - - addParam(createParamCentered(mm2px(Vec(10.381, 96.945)), module, SEQ3::PARAM_GATE + 0)); - addParam(createParamCentered(mm2px(Vec(23.381, 96.945)), module, SEQ3::PARAM_GATE + 1)); - addParam(createParamCentered(mm2px(Vec(36.38, 96.945)), module, SEQ3::PARAM_GATE + 2)); - addParam(createParamCentered(mm2px(Vec(49.381, 96.945)), module, SEQ3::PARAM_GATE + 3)); - addParam(createParamCentered(mm2px(Vec(62.381, 96.945)), module, SEQ3::PARAM_GATE + 4)); - addParam(createParamCentered(mm2px(Vec(75.381, 96.945)), module, SEQ3::PARAM_GATE + 5)); - addParam(createParamCentered(mm2px(Vec(88.381, 96.945)), module, SEQ3::PARAM_GATE + 6)); - addParam(createParamCentered(mm2px(Vec(101.38, 96.945)), module, SEQ3::PARAM_GATE + 7)); - - addInput(createInputCentered(mm2px(Vec(10.381, 37.331)), module, SEQ3::INPUT_CLOCK)); - addInput(createInputCentered(mm2px(Vec(23.38, 37.331)), module, SEQ3::INPUT_EXT_CLOCK)); - addInput(createInputCentered(mm2px(Vec(36.38, 37.331)), module, SEQ3::INPUT_RESET)); - addInput(createInputCentered(mm2px(Vec(49.381, 37.331)), module, SEQ3::INPUT_STEPS)); - - addOutput(createOutputCentered(mm2px(Vec(62.38, 37.329)), module, SEQ3::OUTPUT_GATES)); - addOutput(createOutputCentered(mm2px(Vec(75.38, 37.329)), module, SEQ3::OUTPUT_ROW1)); - addOutput(createOutputCentered(mm2px(Vec(88.38, 37.329)), module, SEQ3::OUTPUT_ROW2)); - addOutput(createOutputCentered(mm2px(Vec(101.381, 37.329)), module, SEQ3::OUTPUT_ROW3)); - - addOutput(createOutputCentered(mm2px(Vec(10.381, 107.865)), module, SEQ3::OUTPUT_GATE + 0)); - addOutput(createOutputCentered(mm2px(Vec(23.38, 107.865)), module, SEQ3::OUTPUT_GATE + 1)); - addOutput(createOutputCentered(mm2px(Vec(36.38, 107.865)), module, SEQ3::OUTPUT_GATE + 2)); - addOutput(createOutputCentered(mm2px(Vec(49.381, 107.865)), module, SEQ3::OUTPUT_GATE + 3)); - addOutput(createOutputCentered(mm2px(Vec(62.38, 107.865)), module, SEQ3::OUTPUT_GATE + 4)); - addOutput(createOutputCentered(mm2px(Vec(75.38, 107.865)), module, SEQ3::OUTPUT_GATE + 5)); - addOutput(createOutputCentered(mm2px(Vec(88.38, 107.865)), module, SEQ3::OUTPUT_GATE + 6)); - addOutput(createOutputCentered(mm2px(Vec(101.381, 107.865)), module, SEQ3::OUTPUT_GATE + 7)); - - addChild(createLightCentered>(mm2px(Vec(23.38, 23.538)), module, SEQ3::LIGHT_RUN)); - addChild(createLightCentered>(mm2px(Vec(36.38, 23.538)), module, SEQ3::LIGHT_RESET)); - addChild(createLightCentered>(mm2px(Vec(62.38, 23.538)), module, SEQ3::LIGHT_GATE)); - addChild(createLightCentered>(mm2px(Vec(75.38, 23.538)), module, SEQ3::LIGHT_ROW1)); - addChild(createLightCentered>(mm2px(Vec(88.38, 23.538)), module, SEQ3::LIGHT_ROW2)); - addChild(createLightCentered>(mm2px(Vec(101.381, 23.538)), module, SEQ3::LIGHT_ROW3)); - - addChild(createLightCentered>(mm2px(Vec(10.381, 96.945)), module, SEQ3::LIGHT_GATE + 0)); - addChild(createLightCentered>(mm2px(Vec(23.381, 96.945)), module, SEQ3::LIGHT_GATE + 1)); - addChild(createLightCentered>(mm2px(Vec(36.38, 96.945)), module, SEQ3::LIGHT_GATE + 2)); - addChild(createLightCentered>(mm2px(Vec(49.381, 96.945)), module, SEQ3::LIGHT_GATE + 3)); - addChild(createLightCentered>(mm2px(Vec(62.381, 96.945)), module, SEQ3::LIGHT_GATE + 4)); - addChild(createLightCentered>(mm2px(Vec(75.381, 96.945)), module, SEQ3::LIGHT_GATE + 5)); - addChild(createLightCentered>(mm2px(Vec(88.381, 96.945)), module, SEQ3::LIGHT_GATE + 6)); - addChild(createLightCentered>(mm2px(Vec(101.38, 96.945)), module, SEQ3::LIGHT_GATE + 7)); + addParam(createParamCentered(mm2px(Vec(11.753, 26.755)), module, SEQ3::TEMPO_PARAM)); + addParam(createParamCentered(mm2px(Vec(32.077, 26.782)), module, SEQ3::STEPS_PARAM)); + addParam(createParamCentered(mm2px(Vec(49.372, 34.066)), module, SEQ3::TEMPO_CV_PARAM)); + addParam(createLightParamCentered>>(mm2px(Vec(88.424, 33.679)), module, SEQ3::RUN_PARAM, SEQ3::RUN_LIGHT)); + addParam(createParamCentered(mm2px(Vec(62.39, 34.066)), module, SEQ3::STEPS_CV_PARAM)); + addParam(createLightParamCentered>>(mm2px(Vec(101.441, 33.679)), module, SEQ3::RESET_PARAM, SEQ3::RESET_LIGHT)); + + addParam(createParamCentered(mm2px(Vec(10.319, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 0)); + addParam(createParamCentered(mm2px(Vec(23.336, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 1)); + addParam(createParamCentered(mm2px(Vec(36.354, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 2)); + addParam(createParamCentered(mm2px(Vec(49.371, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 3)); + addParam(createParamCentered(mm2px(Vec(62.389, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 4)); + addParam(createParamCentered(mm2px(Vec(75.406, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 5)); + addParam(createParamCentered(mm2px(Vec(88.424, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 6)); + addParam(createParamCentered(mm2px(Vec(101.441, 46.563)), module, SEQ3::ROW_PARAMS + 8 * 0 + 7)); + + addParam(createParamCentered(mm2px(Vec(10.319, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 0)); + addParam(createParamCentered(mm2px(Vec(23.336, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 1)); + addParam(createParamCentered(mm2px(Vec(36.354, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 2)); + addParam(createParamCentered(mm2px(Vec(49.371, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 3)); + addParam(createParamCentered(mm2px(Vec(62.389, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 4)); + addParam(createParamCentered(mm2px(Vec(75.406, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 5)); + addParam(createParamCentered(mm2px(Vec(88.424, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 6)); + addParam(createParamCentered(mm2px(Vec(101.441, 60.607)), module, SEQ3::ROW_PARAMS + 8 * 1 + 7)); + + addParam(createParamCentered(mm2px(Vec(10.319, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 0)); + addParam(createParamCentered(mm2px(Vec(23.336, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 1)); + addParam(createParamCentered(mm2px(Vec(36.354, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 2)); + addParam(createParamCentered(mm2px(Vec(49.371, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 3)); + addParam(createParamCentered(mm2px(Vec(62.389, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 4)); + addParam(createParamCentered(mm2px(Vec(75.406, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 5)); + addParam(createParamCentered(mm2px(Vec(88.424, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 6)); + addParam(createParamCentered(mm2px(Vec(101.441, 74.605)), module, SEQ3::ROW_PARAMS + 8 * 2 + 7)); + + addParam(createLightParamCentered>>(mm2px(Vec(10.319, 85.801)), module, SEQ3::GATE_PARAMS + 0, SEQ3::GATE_LIGHTS + 0)); + addParam(createLightParamCentered>>(mm2px(Vec(23.336, 85.801)), module, SEQ3::GATE_PARAMS + 1, SEQ3::GATE_LIGHTS + 1)); + addParam(createLightParamCentered>>(mm2px(Vec(36.354, 85.801)), module, SEQ3::GATE_PARAMS + 2, SEQ3::GATE_LIGHTS + 2)); + addParam(createLightParamCentered>>(mm2px(Vec(49.371, 85.801)), module, SEQ3::GATE_PARAMS + 3, SEQ3::GATE_LIGHTS + 3)); + addParam(createLightParamCentered>>(mm2px(Vec(62.389, 85.801)), module, SEQ3::GATE_PARAMS + 4, SEQ3::GATE_LIGHTS + 4)); + addParam(createLightParamCentered>>(mm2px(Vec(75.406, 85.801)), module, SEQ3::GATE_PARAMS + 5, SEQ3::GATE_LIGHTS + 5)); + addParam(createLightParamCentered>>(mm2px(Vec(88.424, 85.801)), module, SEQ3::GATE_PARAMS + 6, SEQ3::GATE_LIGHTS + 6)); + addParam(createLightParamCentered>>(mm2px(Vec(101.441, 85.801)), module, SEQ3::GATE_PARAMS + 7, SEQ3::GATE_LIGHTS + 7)); + + addInput(createInputCentered(mm2px(Vec(49.371, 17.307)), module, SEQ3::TEMPO_INPUT)); + addInput(createInputCentered(mm2px(Vec(62.389, 17.307)), module, SEQ3::STEPS_INPUT)); + addInput(createInputCentered(mm2px(Vec(75.406, 17.42)), module, SEQ3::CLOCK_INPUT)); + addInput(createInputCentered(mm2px(Vec(88.424, 17.42)), module, SEQ3::RUN_INPUT)); + addInput(createInputCentered(mm2px(Vec(101.441, 17.42)), module, SEQ3::RESET_INPUT)); + + addOutput(createOutputCentered(mm2px(Vec(10.319, 96.859)), module, SEQ3::STEP_OUTPUTS + 0)); + addOutput(createOutputCentered(mm2px(Vec(23.336, 96.859)), module, SEQ3::STEP_OUTPUTS + 1)); + addOutput(createOutputCentered(mm2px(Vec(36.354, 96.859)), module, SEQ3::STEP_OUTPUTS + 2)); + addOutput(createOutputCentered(mm2px(Vec(49.371, 96.859)), module, SEQ3::STEP_OUTPUTS + 3)); + addOutput(createOutputCentered(mm2px(Vec(62.389, 96.859)), module, SEQ3::STEP_OUTPUTS + 4)); + addOutput(createOutputCentered(mm2px(Vec(75.406, 96.859)), module, SEQ3::STEP_OUTPUTS + 5)); + addOutput(createOutputCentered(mm2px(Vec(88.424, 96.859)), module, SEQ3::STEP_OUTPUTS + 6)); + addOutput(createOutputCentered(mm2px(Vec(101.441, 96.859)), module, SEQ3::STEP_OUTPUTS + 7)); + + addOutput(createOutputCentered(mm2px(Vec(10.319, 113.115)), module, SEQ3::CV1_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(23.336, 113.115)), module, SEQ3::CV2_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(36.354, 113.115)), module, SEQ3::CV3_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(49.371, 113.115)), module, SEQ3::GATE_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(62.389, 113.115)), module, SEQ3::STEPS_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(75.406, 113.115)), module, SEQ3::CLOCK_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(88.424, 113.115)), module, SEQ3::RUN_OUTPUT)); + addOutput(createOutputCentered(mm2px(Vec(101.441, 113.115)), module, SEQ3::RESET_OUTPUT)); + + addChild(createLightCentered>(mm2px(Vec(75.406, 33.497)), module, SEQ3::CLOCK_LIGHT)); + + addChild(createLightCentered>(mm2px(Vec(14.064, 93.103)), module, SEQ3::GATE_LIGHTS + 0)); + addChild(createLightCentered>(mm2px(Vec(27.084, 93.103)), module, SEQ3::GATE_LIGHTS + 1)); + addChild(createLightCentered>(mm2px(Vec(40.103, 93.103)), module, SEQ3::GATE_LIGHTS + 2)); + addChild(createLightCentered>(mm2px(Vec(53.122, 93.103)), module, SEQ3::GATE_LIGHTS + 3)); + addChild(createLightCentered>(mm2px(Vec(66.142, 93.103)), module, SEQ3::GATE_LIGHTS + 4)); + addChild(createLightCentered>(mm2px(Vec(79.161, 93.103)), module, SEQ3::GATE_LIGHTS + 5)); + addChild(createLightCentered>(mm2px(Vec(92.181, 93.103)), module, SEQ3::GATE_LIGHTS + 6)); + addChild(createLightCentered>(mm2px(Vec(105.2, 93.103)), module, SEQ3::GATE_LIGHTS + 7)); } };