#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