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.

148 lines
6.5KB

  1. #include "RJModules.hpp"
  2. #include "dsp/digital.hpp"
  3. namespace rack_plugin_RJModules {
  4. #define NUM_CHANNELS 10
  5. struct Glides : Module {
  6. enum ParamIds {
  7. GLIDE_PARAM,
  8. NUM_PARAMS = GLIDE_PARAM + NUM_CHANNELS
  9. };
  10. enum InputIds {
  11. IN_INPUT,
  12. NUM_INPUTS = IN_INPUT + NUM_CHANNELS
  13. };
  14. enum OutputIds {
  15. OUT_OUTPUT,
  16. NUM_OUTPUTS = OUT_OUTPUT + NUM_CHANNELS
  17. };
  18. enum LightIds {
  19. MUTE_LIGHT,
  20. NUM_LIGHTS = MUTE_LIGHT + NUM_CHANNELS
  21. };
  22. float state[NUM_CHANNELS];
  23. float in;
  24. float out;
  25. SchmittTrigger muteTrigger[NUM_CHANNELS];
  26. Glides() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  27. reset();
  28. }
  29. void step() override;
  30. void reset() override {
  31. for (int i = 0; i < NUM_CHANNELS; i++) {
  32. state[i] = true;
  33. }
  34. }
  35. void randomize() override {
  36. for (int i = 0; i < NUM_CHANNELS; i++) {
  37. state[i] = (randomUniform() < 0.5);
  38. }
  39. }
  40. json_t *toJson() override {
  41. json_t *rootJ = json_object();
  42. // states
  43. json_t *statesJ = json_array();
  44. for (int i = 0; i < NUM_CHANNELS; i++) {
  45. json_t *stateJ = json_boolean(state[i]);
  46. json_array_append_new(statesJ, stateJ);
  47. }
  48. json_object_set_new(rootJ, "states", statesJ);
  49. return rootJ;
  50. }
  51. void fromJson(json_t *rootJ) override {
  52. // states
  53. json_t *statesJ = json_object_get(rootJ, "states");
  54. if (statesJ) {
  55. for (int i = 0; i < NUM_CHANNELS; i++) {
  56. json_t *stateJ = json_array_get(statesJ, i);
  57. if (stateJ)
  58. state[i] = json_boolean_value(stateJ);
  59. }
  60. }
  61. }
  62. };
  63. void Glides::step() {
  64. for (int i = 0; i < NUM_CHANNELS; i++) {
  65. in = inputs[IN_INPUT + i].value;
  66. if (in > state[i]){
  67. out = state[i] + (.00001 * (10 - (params[GLIDE_PARAM + i].value)));
  68. state[i] = out;
  69. } else {
  70. out = state[i] - (.00001 * (10 - (params[GLIDE_PARAM + i].value)));
  71. state[i] = out;
  72. }
  73. outputs[OUT_OUTPUT + i].value = out;
  74. }
  75. }
  76. template <typename BASE>
  77. struct MuteLight : BASE {
  78. MuteLight() {
  79. this->box.size = mm2px(Vec(6.0, 6.0));
  80. }
  81. };
  82. struct GlidesWidget: ModuleWidget {
  83. GlidesWidget(Glides *module);
  84. };
  85. GlidesWidget::GlidesWidget(Glides *module) : ModuleWidget(module) {
  86. setPanel(SVG::load(assetPlugin(plugin, "res/Glides.svg")));
  87. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  88. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  89. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  90. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  91. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 17.165)), module, Glides::GLIDE_PARAM + 0, 0.01, 10.0, 5.0));
  92. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 27.164)), module, Glides::GLIDE_PARAM + 1, 0.01, 10.0, 5.0));
  93. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 37.164)), module, Glides::GLIDE_PARAM + 2, 0.01, 10.0, 5.0));
  94. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 47.165)), module, Glides::GLIDE_PARAM + 3, 0.01, 10.0, 5.0));
  95. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 57.164)), module, Glides::GLIDE_PARAM + 4, 0.01, 10.0, 5.0));
  96. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 67.165)), module, Glides::GLIDE_PARAM + 5, 0.01, 10.0, 5.0));
  97. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 77.164)), module, Glides::GLIDE_PARAM + 6, 0.01, 10.0, 5.0));
  98. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 87.164)), module, Glides::GLIDE_PARAM + 7, 0.01, 10.0, 5.0));
  99. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 97.165)), module, Glides::GLIDE_PARAM + 8, 0.01, 10.0, 5.0));
  100. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 107.166)), module, Glides::GLIDE_PARAM + 9, 0.01, 10.0, 5.0));
  101. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 17.81)), Port::INPUT, module, Glides::IN_INPUT + 0));
  102. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 27.809)), Port::INPUT, module, Glides::IN_INPUT + 1));
  103. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 37.809)), Port::INPUT, module, Glides::IN_INPUT + 2));
  104. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 47.81)), Port::INPUT, module, Glides::IN_INPUT + 3));
  105. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 57.81)), Port::INPUT, module, Glides::IN_INPUT + 4));
  106. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 67.809)), Port::INPUT, module, Glides::IN_INPUT + 5));
  107. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 77.81)), Port::INPUT, module, Glides::IN_INPUT + 6));
  108. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 87.81)), Port::INPUT, module, Glides::IN_INPUT + 7));
  109. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 97.809)), Port::INPUT, module, Glides::IN_INPUT + 8));
  110. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 107.809)), Port::INPUT, module, Glides::IN_INPUT + 9));
  111. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 17.81)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 0));
  112. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 27.809)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 1));
  113. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 37.809)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 2));
  114. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 47.81)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 3));
  115. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 57.809)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 4));
  116. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 67.809)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 5));
  117. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 77.81)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 6));
  118. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 87.81)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 7));
  119. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 97.809)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 8));
  120. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 107.809)), Port::OUTPUT, module, Glides::OUT_OUTPUT + 9));
  121. }
  122. } // namespace rack_plugin_RJModules
  123. using namespace rack_plugin_RJModules;
  124. RACK_PLUGIN_MODEL_INIT(RJModules, Glides) {
  125. Model *modelGlides = Model::create<Glides, GlidesWidget>("RJModules", "Glides", "[GEN] Glides", UTILITY_TAG);
  126. return modelGlides;
  127. }