#pragma once namespace rack_plugin_TheXOR { struct z8kSequencer { public: void Init(Input *pRst, Input *pDir, Input *pClk, Output *pOut, Light *pLights, std::vector ¶ms, std::vector steps) { curStep = 0; pReset = pRst; pDirection = pDir; pClock = pClk; pOutput = pOut; numSteps = steps.size(); for(int k = 0; k < numSteps; k++) { sequence.push_back(¶ms[steps[k]]); leds.push_back(&pLights[steps[k]]); chain.push_back(steps[k]); } } int Step() { if(resetTrigger.process(pReset->value)) curStep = 0; else if(clockTrigger.process(pClock->value)) { if(pDirection->value > 5) { if(--curStep < 0) curStep = numSteps - 1; } else { if(++curStep >= numSteps) curStep = 0; } } float v = rescale(sequence[curStep]->value, 0.0, 1.0, 0.0, 6.0); pOutput->value = v; for(int k = 0; k < numSteps; k++) leds[k]->value = k == curStep ? 10.0 : 0; return chain[curStep]; } private: SchmittTrigger clockTrigger; SchmittTrigger resetTrigger; Input *pReset; Input *pDirection; Input *pClock; Output *pOutput; std::vector sequence; std::vector leds; std::vector chain; int curStep; int numSteps; }; } // namespace rack_plugin_TheXOR