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.

138 lines
2.6KB

  1. #include "common.hpp"
  2. #include <sstream>
  3. #include <iomanip>
  4. #include <algorithm>
  5. #include "rntSequencer.hpp"
  6. namespace rack_plugin_TheXOR {
  7. ////////////////////
  8. // module widgets
  9. ////////////////////
  10. struct Renato;
  11. struct RenatoWidget : SequencerWidget
  12. {
  13. public:
  14. void onMenu(int action);
  15. RenatoWidget(Renato * module);
  16. private:
  17. enum MENUACTIONS
  18. {
  19. RANDOMIZE_PITCH,
  20. RANDOMIZE_GATEX,
  21. RANDOMIZE_GATEY,
  22. RANDOMIZE_ACCESS
  23. };
  24. Menu *addContextMenu(Menu *menu) override;
  25. };
  26. struct Renato : Module
  27. {
  28. enum ParamIds
  29. {
  30. COUNTMODE_X, COUNTMODE_Y,
  31. SEEKSLEEP,
  32. ACCESS_1,
  33. GATEX_1 = ACCESS_1 + 16,
  34. GATEY_1 = GATEX_1 + 16,
  35. VOLTAGE_1 = GATEY_1 + 16,
  36. NUM_PARAMS = VOLTAGE_1 + 16
  37. };
  38. enum InputIds
  39. {
  40. XCLK,
  41. YCLK,
  42. RESET,
  43. ACCESS_IN1,
  44. GATEX_IN1 = ACCESS_IN1 + 16,
  45. GATEY_IN1 = GATEX_IN1 + 16,
  46. NUM_INPUTS = GATEY_IN1+16
  47. };
  48. enum OutputIds
  49. {
  50. CV,
  51. XGATE, YGATE,
  52. CV_OUTSTEP1,
  53. NUM_OUTPUTS = CV_OUTSTEP1+16
  54. };
  55. enum LightIds
  56. {
  57. LED_GATEX, LED_GATEY,
  58. LED_1,
  59. NUM_LIGHTS = LED_1 + 16
  60. };
  61. Renato() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  62. {
  63. #ifdef LAUNCHPAD
  64. drv = new LaunchpadBindingDriver(this, Scene3, 2);
  65. drv->SetAutoPageKey(LaunchpadKey::SESSION, 0);
  66. drv->SetAutoPageKey(LaunchpadKey::NOTE, 1);
  67. #endif
  68. #ifdef OSCTEST_MODULE
  69. oscDrv = new OSCDriver(this, 3);
  70. #endif
  71. on_loaded();
  72. }
  73. #ifdef DIGITAL_EXT
  74. ~Renato()
  75. {
  76. #if defined(LAUNCHPAD)
  77. delete drv;
  78. #endif
  79. #if defined(OSCTEST_MODULE)
  80. delete oscDrv;
  81. #endif
  82. }
  83. #endif
  84. void step() override;
  85. void reset() override { load(); }
  86. void fromJson(json_t *root) override { Module::fromJson(root); on_loaded(); }
  87. json_t *toJson() override
  88. {
  89. json_t *rootJ = json_object();
  90. return rootJ;
  91. }
  92. bool _accessX(int p) { return _access(xy(p, seqY.Position())); }
  93. bool _accessY(int p) { return _access(xy(seqX.Position(), p)); }
  94. #ifdef DIGITAL_EXT
  95. float connected;
  96. #endif
  97. #ifdef LAUNCHPAD
  98. LaunchpadBindingDriver *drv;
  99. #endif
  100. #if defined(OSCTEST_MODULE)
  101. OSCDriver *oscDrv;
  102. #endif
  103. private:
  104. float getStatus(int pid, int iid)
  105. {
  106. return inputs[iid].normalize(0.0) + params[pid].value;
  107. }
  108. private:
  109. SchmittTrigger resetTrigger;
  110. void on_loaded();
  111. void load();
  112. void led(int n) { for(int k = 0; k < 16; k++) lights[LED_1 + k].value = k == n ? 10.0 : 0.0; }
  113. int xy(int x, int y) { return 4 * y + x; }
  114. bool _access(int n) { return getStatus(ACCESS_1 + n, ACCESS_IN1 + n) > 0; }
  115. bool _gateX(int n) { return getStatus(GATEX_1 + n, GATEX_IN1 + n) > 0; }
  116. bool _gateY(int n) { return getStatus(GATEY_1 + n, GATEY_IN1 + n) > 0; }
  117. rntSequencer seqX;
  118. rntSequencer seqY;
  119. };
  120. } // namespace rack_plugin_TheXOR