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.

190 lines
4.4KB

  1. #include "cf.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_cf {
  4. struct L3DS3Q : Module {
  5. enum ParamIds {
  6. EDIT_PARAM,
  7. ON_PARAM,
  8. NUM_PARAMS = ON_PARAM + 80
  9. };
  10. enum InputIds {
  11. RST_INPUT,
  12. UP_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. TR_OUTPUT,
  17. NUM_OUTPUTS = TR_OUTPUT + 5
  18. };
  19. enum LightIds {
  20. EDIT_LIGHT,
  21. LED_LIGHT,
  22. NUM_LIGHTS = LED_LIGHT + 80
  23. };
  24. int wait = 0;
  25. int pas = 0;
  26. bool ledState[80] = {};
  27. int tempState[5] = {};
  28. bool editState = false ;
  29. SchmittTrigger rstTrigger;
  30. SchmittTrigger upTrigger;
  31. SchmittTrigger editTrigger;
  32. L3DS3Q() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  33. void step() override;
  34. json_t *toJson() override {
  35. json_t *rootJ = json_object();
  36. // leds
  37. json_t *ledsJ = json_array();
  38. for (int i = 0; i < 80; i++) {
  39. json_t *ledJ = json_integer((int) ledState[i]);
  40. json_array_append_new(ledsJ, ledJ);
  41. }
  42. json_object_set_new(rootJ, "leds", ledsJ);
  43. return rootJ;
  44. }
  45. void fromJson(json_t *rootJ) override {
  46. // leds
  47. json_t *ledsJ = json_object_get(rootJ, "leds");
  48. if (ledsJ) {
  49. for (int i = 0; i < 80; i++) {
  50. json_t *ledJ = json_array_get(ledsJ, i);
  51. if (ledJ)
  52. ledState[i] = !!json_integer_value(ledJ);
  53. }
  54. }
  55. }
  56. void reset() override {
  57. for (int i = 0; i < 80; i++) {
  58. ledState[i] = false;
  59. }
  60. }
  61. void randomize() override {
  62. for (int i = 0; i < 80; i++) {
  63. ledState[i] = (randomUniform() > 0.5);
  64. }
  65. }
  66. };
  67. void L3DS3Q::step() {
  68. if (rstTrigger.process(inputs[RST_INPUT].value))
  69. {
  70. pas = 0;
  71. }
  72. if (upTrigger.process(inputs[UP_INPUT].value))
  73. {
  74. for (int i = 0; i < 5; i++) {
  75. if (ledState[(i+pas*5)%80]) tempState [i] = 20;
  76. }
  77. if (pas <15) pas = pas+1; else pas =0;
  78. }
  79. if (editTrigger.process(params[EDIT_PARAM].value))
  80. {
  81. editState = !editState ;
  82. lights[EDIT_LIGHT].value= editState ;
  83. }
  84. if (!editState)
  85. {
  86. for (int i = 0; i < 80; i++) {lights[LED_LIGHT +i].value=ledState[(i+pas*5)%80];}
  87. if (wait == 0) {
  88. for (int i = 0; i < 80; i++) {
  89. if (params[ON_PARAM +i].value) {ledState[(i+pas*5)%80]=!ledState[(i+pas*5)%80]; wait = 20000;}
  90. }} else wait = wait-1;
  91. } else {
  92. for (int i = 0; i < 80; i++) {lights[LED_LIGHT +i].value=ledState[i];}
  93. if (wait == 0) {
  94. for (int i = 0; i < 80; i++) {
  95. if (params[ON_PARAM +i].value) {ledState[i]=!ledState[i]; wait = 20000;}
  96. }} else wait = wait-1;
  97. }
  98. for (int i = 0; i < 5; i++) {
  99. if (tempState [i]>0) {tempState [i] = tempState [i]-1;outputs[TR_OUTPUT+i].value=10.0f;} else outputs[TR_OUTPUT+i].value=0.0f;
  100. }
  101. //if (wait == 0) {
  102. // for (int i = 0; i < 80; i++) {
  103. // if (params[ON_PARAM +i].value) {ledState[i]=!ledState[i]; wait = 20000;}
  104. // lights[LED_LIGHT +i].value=ledState[i];
  105. //}} else wait = wait-1;
  106. }
  107. struct LButton : SVGSwitch, MomentarySwitch {
  108. LButton() {
  109. addFrame(SVG::load(assetPlugin(plugin, "res/L.svg")));
  110. addFrame(SVG::load(assetPlugin(plugin, "res/Ldown.svg")));
  111. sw->wrap();
  112. box.size = sw->box.size;
  113. }
  114. };
  115. struct L3DS3QWidget : ModuleWidget {
  116. L3DS3QWidget(L3DS3Q *module);
  117. };
  118. L3DS3QWidget:: L3DS3QWidget(L3DS3Q *module) : ModuleWidget(module) {
  119. setPanel(SVG::load(assetPlugin(plugin, "res/L3DS3Q.svg")));
  120. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  121. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  122. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  123. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  124. for (int i = 0; i < 16; i++) {
  125. for (int j = 0; j < 5; j++) {
  126. addParam(ParamWidget::create<LButton>(Vec(j*15+10-0.8, (15-i)*15+15-0.8+51), module, L3DS3Q::ON_PARAM + (i*5+j), 0.0, 1.0, 0.0));
  127. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(j*15+10, (15-i)*15+15+51), module, L3DS3Q::LED_LIGHT + (i*5+j)));
  128. }}
  129. addInput(Port::create<PJ301MPort>(Vec(32, 27), Port::INPUT, module, L3DS3Q::RST_INPUT));
  130. addInput(Port::create<PJ301MPort>(Vec(4, 27), Port::INPUT, module, L3DS3Q::UP_INPUT));
  131. addParam(ParamWidget::create<LEDButton>(Vec(65, 31), module, L3DS3Q::EDIT_PARAM, 0.0, 1.0, 0.0));
  132. addChild(ModuleLightWidget::create<MediumLight<BlueLight>>(Vec(69.4, 35.4), module, L3DS3Q::EDIT_LIGHT));
  133. for (int i = 0; i < 5; i++) {
  134. addOutput(Port::create<PJ301MPort>(Vec(4+i*14, 332- 22*(i%2)), Port::OUTPUT, module, L3DS3Q::TR_OUTPUT +i));
  135. }
  136. }
  137. } // namespace rack_plugin_cf
  138. using namespace rack_plugin_cf;
  139. RACK_PLUGIN_MODEL_INIT(cf, L3DS3Q) {
  140. Model *modelL3DS3Q = Model::create<L3DS3Q, L3DS3QWidget>("cf", "L3DS3Q", "L3ds3q", SEQUENCER_TAG);
  141. return modelL3DS3Q;
  142. }