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.

99 lines
3.3KB

  1. #include "RJModules.hpp"
  2. #include <iostream>
  3. #include <cmath>
  4. #include <random>
  5. struct Randoms: Module {
  6. enum ParamIds {
  7. NUM_PARAMS
  8. };
  9. enum InputIds {
  10. CH1_CV_INPUT_1,
  11. CH1_CV_INPUT_2,
  12. CH2_CV_INPUT_1,
  13. CH2_CV_INPUT_2,
  14. CH3_CV_INPUT_1,
  15. CH3_CV_INPUT_2,
  16. NUM_INPUTS
  17. };
  18. enum OutputIds {
  19. CH1_OUTPUT,
  20. CH2_OUTPUT,
  21. CH3_OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. Randoms() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  25. void step() override;
  26. };
  27. void Randoms::step() {
  28. float mapped_ch1v1 = inputs[CH1_CV_INPUT_1].value;
  29. float mapped_ch1v2 = inputs[CH1_CV_INPUT_2].value;
  30. float mapped_ch2v1 = inputs[CH2_CV_INPUT_1].value;
  31. float mapped_ch2v2 = inputs[CH2_CV_INPUT_2].value;
  32. float mapped_ch3v1 = inputs[CH3_CV_INPUT_1].value;
  33. float mapped_ch3v2 = inputs[CH3_CV_INPUT_2].value;
  34. std::random_device rd; // obtain a random number from hardware
  35. std::mt19937 eng(rd()); // seed the generator
  36. if (mapped_ch1v1 == mapped_ch1v2){
  37. mapped_ch1v1 = -12;
  38. mapped_ch1v2 = 12;
  39. }
  40. std::uniform_real_distribution<> distr1(mapped_ch1v1, mapped_ch1v2); // define the range
  41. outputs[CH1_OUTPUT].value = distr1(eng);
  42. if (mapped_ch2v1 == mapped_ch2v2){
  43. mapped_ch2v1 = -12;
  44. mapped_ch2v2 = 12;
  45. }
  46. std::uniform_real_distribution<> distr2(mapped_ch2v1, mapped_ch2v2);
  47. outputs[CH1_OUTPUT].value = distr1(eng);
  48. if (mapped_ch3v1 == mapped_ch3v2){
  49. mapped_ch3v1 = -12;
  50. mapped_ch3v2 = 12;
  51. }
  52. std::uniform_real_distribution<> distr3(mapped_ch3v1, mapped_ch3v2);
  53. outputs[CH1_OUTPUT].value = distr1(eng);
  54. }
  55. struct RandomsWidget: ModuleWidget {
  56. RandomsWidget(Randoms *module);
  57. };
  58. RandomsWidget::RandomsWidget(Randoms *module) : ModuleWidget(module) {
  59. box.size = Vec(15*10, 380);
  60. {
  61. SVGPanel *panel = new SVGPanel();
  62. panel->box.size = box.size;
  63. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Randoms.svg")));
  64. addChild(panel);
  65. }
  66. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  67. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  68. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  69. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  70. addInput(Port::create<PJ301MPort>(Vec(22, 70), Port::INPUT, module, Randoms::CH1_CV_INPUT_1));
  71. addInput(Port::create<PJ301MPort>(Vec(22, 100), Port::INPUT, module, Randoms::CH1_CV_INPUT_2));
  72. addInput(Port::create<PJ301MPort>(Vec(22, 150), Port::INPUT, module, Randoms::CH2_CV_INPUT_1));
  73. addInput(Port::create<PJ301MPort>(Vec(22, 180), Port::INPUT, module, Randoms::CH2_CV_INPUT_2));
  74. addInput(Port::create<PJ301MPort>(Vec(22, 230), Port::INPUT, module, Randoms::CH3_CV_INPUT_1));
  75. addInput(Port::create<PJ301MPort>(Vec(22, 260), Port::INPUT, module, Randoms::CH3_CV_INPUT_2));
  76. addOutput(Port::create<PJ301MPort>(Vec(110, 85), Port::OUTPUT, module, Randoms::CH1_OUTPUT));
  77. addOutput(Port::create<PJ301MPort>(Vec(110, 165), Port::OUTPUT, module, Randoms::CH2_OUTPUT));
  78. addOutput(Port::create<PJ301MPort>(Vec(110, 245), Port::OUTPUT, module, Randoms::CH3_OUTPUT));
  79. }
  80. Model *modelRandoms = Model::create<Randoms, RandomsWidget>("RJModules", "Randoms", "[NUM] Randoms", UTILITY_TAG);