|
- #include "Spiralone.hpp"
- #include "sprlnSequencer.hpp"
- #include "SpiraloneModule.hpp"
-
- namespace rack_plugin_TheXOR {
-
- extern float AccessParam(Spiralone *p, int seq, int id);
- extern float AccessParam(Spiralone *p, int id);
- extern Input *AccessInput(Spiralone *p, int seq, int id);
- extern float *AccessOutput(Spiralone *p, int seq, int id);
- extern float *AccessLight(Spiralone *p, int id);
-
- void spiraloneSequencer::Step(int seq, Spiralone *pSpir)
- {
- if(resetTrigger.process(AccessInput(pSpir, seq, Spiralone::RESET_1)->value))
- Reset(seq, pSpir);
- else
- {
- int clk = clockTrig.process(AccessInput(pSpir, seq, Spiralone::CLOCK_1)->value); // 1=rise, -1=fall
- if(clk == 1)
- {
- int mode = (int)std::roundf(AccessParam(pSpir, seq, Spiralone::MODE_1));
- int numSteps = getInput(seq, pSpir, Spiralone::INLENGHT_1, Spiralone::LENGHT_1, 1.0, TOTAL_STEPS);
- int stride = getInput(seq, pSpir, Spiralone::INSTRIDE_1, Spiralone::STRIDE_1, 1.0, 8.0);
-
- *AccessLight(pSpir, ledID(seq)) = 0.0;
- switch(mode)
- {
- case 0: // fwd:
- curPos += stride;
- break;
-
- case 1: // bwd
- curPos -= stride;
- break;
- }
- if(curPos < 0)
- curPos = numSteps + curPos;
-
- curPos %= numSteps;
-
- outputVoltage(seq, pSpir);
- gate(clk, seq, pSpir);
- } else if(clk == -1)
- gate(clk, seq, pSpir);
- }
- }
-
- void spiraloneSequencer::Reset(int seq, Spiralone *pSpir)
- {
- curPos = 0;
- for(int k = 0; k < TOTAL_STEPS; k++)
- *AccessLight(pSpir, ledID(seq, k)) = 0.0;
- }
-
- int spiraloneSequencer::getInput(int seq, Spiralone *pSpir, int input_id, int knob_id, float minValue, float maxValue)
- {
- float normalized_in = AccessInput(pSpir, seq, input_id)->active ? rescale(AccessInput(pSpir, seq, input_id)->value, 0.0, 5.0, 0.0, maxValue) : 0.0;
- float v = clamp(normalized_in + AccessParam(pSpir, seq, knob_id), minValue, maxValue);
- return (int)roundf(v);
- }
-
- void spiraloneSequencer::outputVoltage(int seq, Spiralone *pSpir)
- {
- float v = AccessParam(pSpir, seq, Spiralone::XPOSE_1);
- if(AccessInput(pSpir, seq, Spiralone::INXPOSE_1)->active)
- v += AccessInput(pSpir, seq, Spiralone::INXPOSE_1)->value;
- v += AccessParam(pSpir, Spiralone::VOLTAGE_1 + curPos);
- *AccessOutput(pSpir, seq, Spiralone::CV_1) = clamp(v, 0.0, 10.0);
- }
-
- void spiraloneSequencer::gate(int clk, int seq, Spiralone *pSpir)
- {
- if(clk == 1)
- {
- *AccessLight(pSpir, ledID(seq)) = 10.0;
- *AccessOutput(pSpir, seq, Spiralone::GATE_1) = LVL_ON;
- } else if(clk == -1) // fall
- {
- *AccessOutput(pSpir, seq, Spiralone::GATE_1) = LVL_OFF;
- }
- }
-
- } // namespace rack_plugin_TheXOR
|