Browse Source

SEQ3: Generate step 1 trigger when resetting from a higher step.

tags/v2.5.0
Andrew Belt 7 months ago
parent
commit
001dbb782a
1 changed files with 22 additions and 15 deletions
  1. +22
    -15
      src/SEQ3.cpp

+ 22
- 15
src/SEQ3.cpp View File

@@ -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);


Loading…
Cancel
Save