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.

85 lines
2.5KB

  1. #include "Spiralone.hpp"
  2. #include "sprlnSequencer.hpp"
  3. #include "SpiraloneModule.hpp"
  4. namespace rack_plugin_TheXOR {
  5. extern float AccessParam(Spiralone *p, int seq, int id);
  6. extern float AccessParam(Spiralone *p, int id);
  7. extern Input *AccessInput(Spiralone *p, int seq, int id);
  8. extern float *AccessOutput(Spiralone *p, int seq, int id);
  9. extern float *AccessLight(Spiralone *p, int id);
  10. void spiraloneSequencer::Step(int seq, Spiralone *pSpir)
  11. {
  12. if(resetTrigger.process(AccessInput(pSpir, seq, Spiralone::RESET_1)->value))
  13. Reset(seq, pSpir);
  14. else
  15. {
  16. int clk = clockTrig.process(AccessInput(pSpir, seq, Spiralone::CLOCK_1)->value); // 1=rise, -1=fall
  17. if(clk == 1)
  18. {
  19. int mode = (int)std::roundf(AccessParam(pSpir, seq, Spiralone::MODE_1));
  20. int numSteps = getInput(seq, pSpir, Spiralone::INLENGHT_1, Spiralone::LENGHT_1, 1.0, TOTAL_STEPS);
  21. int stride = getInput(seq, pSpir, Spiralone::INSTRIDE_1, Spiralone::STRIDE_1, 1.0, 8.0);
  22. *AccessLight(pSpir, ledID(seq)) = 0.0;
  23. switch(mode)
  24. {
  25. case 0: // fwd:
  26. curPos += stride;
  27. break;
  28. case 1: // bwd
  29. curPos -= stride;
  30. break;
  31. }
  32. if(curPos < 0)
  33. curPos = numSteps + curPos;
  34. curPos %= numSteps;
  35. outputVoltage(seq, pSpir);
  36. gate(clk, seq, pSpir);
  37. } else if(clk == -1)
  38. gate(clk, seq, pSpir);
  39. }
  40. }
  41. void spiraloneSequencer::Reset(int seq, Spiralone *pSpir)
  42. {
  43. curPos = 0;
  44. for(int k = 0; k < TOTAL_STEPS; k++)
  45. *AccessLight(pSpir, ledID(seq, k)) = 0.0;
  46. }
  47. int spiraloneSequencer::getInput(int seq, Spiralone *pSpir, int input_id, int knob_id, float minValue, float maxValue)
  48. {
  49. 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;
  50. float v = clamp(normalized_in + AccessParam(pSpir, seq, knob_id), minValue, maxValue);
  51. return (int)roundf(v);
  52. }
  53. void spiraloneSequencer::outputVoltage(int seq, Spiralone *pSpir)
  54. {
  55. float v = AccessParam(pSpir, seq, Spiralone::XPOSE_1);
  56. if(AccessInput(pSpir, seq, Spiralone::INXPOSE_1)->active)
  57. v += AccessInput(pSpir, seq, Spiralone::INXPOSE_1)->value;
  58. v += AccessParam(pSpir, Spiralone::VOLTAGE_1 + curPos);
  59. *AccessOutput(pSpir, seq, Spiralone::CV_1) = clamp(v, 0.0, 10.0);
  60. }
  61. void spiraloneSequencer::gate(int clk, int seq, Spiralone *pSpir)
  62. {
  63. if(clk == 1)
  64. {
  65. *AccessLight(pSpir, ledID(seq)) = 10.0;
  66. *AccessOutput(pSpir, seq, Spiralone::GATE_1) = LVL_ON;
  67. } else if(clk == -1) // fall
  68. {
  69. *AccessOutput(pSpir, seq, Spiralone::GATE_1) = LVL_OFF;
  70. }
  71. }
  72. } // namespace rack_plugin_TheXOR