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.

108 lines
3.4KB

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