| @@ -147,26 +147,27 @@ struct SEQ3 : Module { | |||
| } | |||
| void process(const ProcessArgs& args) override { | |||
| // Run | |||
| // Use bitwise OR "|" to always evaluate both expressions | |||
| if (runButtonTrigger.process(params[RUN_PARAM].getValue())) { | |||
| running ^= true; | |||
| runPulse.trigger(1e-3f); | |||
| } | |||
| if (runTrigger.process(inputs[RUN_INPUT].getVoltage(), 0.1f, 2.f)) { | |||
| // Toggle run | |||
| bool runButtonTriggered = runButtonTrigger.process(params[RUN_PARAM].getValue()); | |||
| bool runTriggered = runTrigger.process(inputs[RUN_INPUT].getVoltage(), 0.1f, 2.f); | |||
| if (runButtonTriggered || runTriggered) { | |||
| running ^= true; | |||
| runPulse.trigger(1e-3f); | |||
| } | |||
| bool runGate = runPulse.process(args.sampleTime); | |||
| // Reset | |||
| if (resetButtonTrigger.process(params[RESET_PARAM].getValue()) | resetTrigger.process(inputs[RESET_INPUT].getVoltage(), 0.1f, 2.f)) { | |||
| int oldIndex = index; | |||
| // Reset to step 1 | |||
| bool resetButtonTriggered = resetButtonTrigger.process(params[RESET_PARAM].getValue()); | |||
| bool resetTriggered = resetTrigger.process(inputs[RESET_INPUT].getVoltage(), 0.1f, 2.f); | |||
| if (resetButtonTriggered || resetTriggered) { | |||
| resetPulse.trigger(1e-3f); | |||
| // Reset step index | |||
| index = 0; | |||
| // Reset phase | |||
| phase = 0.f; | |||
| } | |||
| bool resetGate = resetPulse.process(args.sampleTime); | |||
| // Clock | |||
| @@ -175,8 +176,9 @@ struct SEQ3 : Module { | |||
| if (running) { | |||
| if (inputs[CLOCK_INPUT].isConnected()) { | |||
| // External clock | |||
| bool clockTriggered = clockTrigger.process(inputs[CLOCK_INPUT].getVoltage(), 0.1f, 2.f); | |||
| // Ignore clock while reset pulse is high | |||
| if (clockTrigger.process(inputs[CLOCK_INPUT].getVoltage(), 0.1f, 2.f) && !resetGate) { | |||
| if (clockTriggered && !resetGate) { | |||
| clock = true; | |||
| } | |||
| clockGate = clockTrigger.isHigh(); | |||
| @@ -198,16 +200,21 @@ struct SEQ3 : Module { | |||
| float steps = params[TRIG_PARAM].getValue() + inputs[STEPS_INPUT].getVoltage() * params[STEPS_CV_PARAM].getValue(); | |||
| int numSteps = (int) clamp(std::round(steps), 1.f, 8.f); | |||
| // Advance step | |||
| // Advance step when clocked | |||
| if (clock) { | |||
| clockPulse.trigger(1e-3f); | |||
| index++; | |||
| if (index >= numSteps) | |||
| index = 0; | |||
| } | |||
| // Trigger pulse if step was changed | |||
| if (index != oldIndex) { | |||
| clockPulse.trigger(1e-3f); | |||
| } | |||
| // Unless we're passing the clock gate, generate a pulse | |||
| if (!clockPassthrough) | |||
| if (!clockPassthrough) { | |||
| clockGate = clockPulse.process(args.sampleTime); | |||
| } | |||
| // Gate buttons | |||
| for (int i = 0; i < 8; i++) { | |||
| @@ -232,7 +239,7 @@ struct SEQ3 : Module { | |||
| outputs[STEPS_OUTPUT].setVoltage((numSteps - 1) * 1.f); | |||
| outputs[CLOCK_OUTPUT].setVoltage(clockGate ? 10.f : 0.f); | |||
| outputs[RUN_OUTPUT].setVoltage(runPulse.process(args.sampleTime) ? 10.f : 0.f); | |||
| outputs[RUN_OUTPUT].setVoltage(runGate ? 10.f : 0.f); | |||
| outputs[RESET_OUTPUT].setVoltage(resetGate ? 10.f : 0.f); | |||
| lights[CLOCK_LIGHT].setSmoothBrightness(clockGate, args.sampleTime); | |||