diff --git a/src/SEQ3.cpp b/src/SEQ3.cpp index 48f1832..40e74f2 100644 --- a/src/SEQ3.cpp +++ b/src/SEQ3.cpp @@ -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);