You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.2KB

  1. #pragma once
  2. namespace rack_plugin_TheXOR {
  3. struct z8kSequencer
  4. {
  5. public:
  6. void Init(Input *pRst, Input *pDir, Input *pClk, Output *pOut, Light *pLights, std::vector<Param> &params, std::vector<int> steps)
  7. {
  8. curStep = 0;
  9. pReset = pRst;
  10. pDirection = pDir;
  11. pClock = pClk;
  12. pOutput = pOut;
  13. numSteps = steps.size();
  14. for(int k = 0; k < numSteps; k++)
  15. {
  16. sequence.push_back(&params[steps[k]]);
  17. leds.push_back(&pLights[steps[k]]);
  18. chain.push_back(steps[k]);
  19. }
  20. }
  21. int Step()
  22. {
  23. if(resetTrigger.process(pReset->value))
  24. curStep = 0;
  25. else if(clockTrigger.process(pClock->value))
  26. {
  27. if(pDirection->value > 5)
  28. {
  29. if(--curStep < 0)
  30. curStep = numSteps - 1;
  31. } else
  32. {
  33. if(++curStep >= numSteps)
  34. curStep = 0;
  35. }
  36. }
  37. float v = rescale(sequence[curStep]->value, 0.0, 1.0, 0.0, 6.0);
  38. pOutput->value = v;
  39. for(int k = 0; k < numSteps; k++)
  40. leds[k]->value = k == curStep ? 10.0 : 0;
  41. return chain[curStep];
  42. }
  43. private:
  44. SchmittTrigger clockTrigger;
  45. SchmittTrigger resetTrigger;
  46. Input *pReset;
  47. Input *pDirection;
  48. Input *pClock;
  49. Output *pOutput;
  50. std::vector<Param *> sequence;
  51. std::vector<Light *> leds;
  52. std::vector<int> chain;
  53. int curStep;
  54. int numSteps;
  55. };
  56. } // namespace rack_plugin_TheXOR