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.

134 lines
4.2KB

  1. #include "Bidoo.hpp"
  2. #include "BidooComponents.hpp"
  3. #include "dsp/samplerate.hpp"
  4. using namespace std;
  5. namespace rack_plugin_Bidoo {
  6. struct LOURDE : Module {
  7. enum ParamIds {
  8. WEIGHT1,
  9. WEIGHT2,
  10. WEIGHT3,
  11. OUTFLOOR,
  12. NUM_PARAMS
  13. };
  14. enum InputIds {
  15. IN1,
  16. IN2,
  17. IN3,
  18. INWEIGHT1,
  19. INWEIGHT2,
  20. INWEIGHT3,
  21. INFLOOR,
  22. NUM_INPUTS
  23. };
  24. enum OutputIds {
  25. OUT,
  26. NUM_OUTPUTS
  27. };
  28. enum LightIds {
  29. NUM_LIGHTS
  30. };
  31. LOURDE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  32. }
  33. void step() override;
  34. };
  35. void LOURDE::step() {
  36. float sum = clamp(params[WEIGHT1].value+inputs[INWEIGHT1].value,-5.0f,5.0f)*inputs[IN1].value + clamp(params[WEIGHT2].value+inputs[INWEIGHT2].value,-5.0f,5.0f)*inputs[IN2].value + clamp(params[WEIGHT3].value+inputs[INWEIGHT3].value,-5.0f,5.0f)*inputs[IN3].value;
  37. outputs[OUT].value = sum >= clamp(params[OUTFLOOR].value+inputs[INFLOOR].value,-10.0f,10.0f) ? 10.0f : 0.0f;
  38. }
  39. struct LabelDisplayWidget : TransparentWidget {
  40. float *value;
  41. std::shared_ptr<Font> font;
  42. LabelDisplayWidget() {
  43. font = Font::load(assetPlugin(plugin, "res/DejaVuSansMono.ttf"));
  44. };
  45. void draw(NVGcontext *vg) override
  46. {
  47. // text
  48. nvgFontSize(vg, 18);
  49. nvgFontFaceId(vg, font->handle);
  50. nvgTextLetterSpacing(vg, 2.0);
  51. char display[128];
  52. snprintf(display, sizeof(display), "%2.2f", *value);
  53. nvgFontSize(vg, 12.0f);
  54. nvgFontFaceId(vg, font->handle);
  55. nvgTextLetterSpacing(vg, -2.0f);
  56. nvgFillColor(vg, BLUE_BIDOO);
  57. nvgTextAlign(vg, NVG_ALIGN_CENTER);
  58. nvgRotate(vg,-45.0f);
  59. nvgText(vg, 0.0f, 0.0f, display, NULL);
  60. }
  61. };
  62. struct LOURDEWidget : ModuleWidget {
  63. LOURDEWidget(LOURDE *module) : ModuleWidget(module) {
  64. setPanel(SVG::load(assetPlugin(plugin, "res/LOURDE.svg")));
  65. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  66. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  67. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  68. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  69. addInput(Port::create<PJ301MPort>(Vec(25.5,85), Port::INPUT, module, LOURDE::IN1));
  70. addInput(Port::create<PJ301MPort>(Vec(25.5,155), Port::INPUT, module, LOURDE::IN2));
  71. addInput(Port::create<PJ301MPort>(Vec(25.5,225), Port::INPUT, module, LOURDE::IN3));
  72. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 57.0f), Port::INPUT, module, LOURDE::INWEIGHT1));
  73. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 127.0f), Port::INPUT, module, LOURDE::INWEIGHT2));
  74. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 197.0f), Port::INPUT, module, LOURDE::INWEIGHT3));
  75. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,50), module, LOURDE::WEIGHT1, -5.0f, 5.0f, 0.0f));
  76. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,120), module, LOURDE::WEIGHT2, -5.0f, 5.0f, 0.0f));
  77. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,190), module, LOURDE::WEIGHT3, -5.0f, 5.0f, 0.0f));
  78. LabelDisplayWidget *displayW1 = new LabelDisplayWidget();
  79. displayW1->box.pos = Vec(20,55);
  80. displayW1->value = &module->params[LOURDE::WEIGHT1].value;
  81. addChild(displayW1);
  82. LabelDisplayWidget *displayW2 = new LabelDisplayWidget();
  83. displayW2->box.pos = Vec(20,125);
  84. displayW2->value = &module->params[LOURDE::WEIGHT2].value;
  85. addChild(displayW2);
  86. LabelDisplayWidget *displayW3 = new LabelDisplayWidget();
  87. displayW3->box.pos = Vec(20,195);
  88. displayW3->value = &module->params[LOURDE::WEIGHT3].value;
  89. addChild(displayW3);
  90. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,270), module, LOURDE::OUTFLOOR, -10.0f, 10.0f, 0.0f));
  91. LabelDisplayWidget *displayOF = new LabelDisplayWidget();
  92. displayOF->box.pos = Vec(20,275);
  93. displayOF->value = &module->params[LOURDE::OUTFLOOR].value;
  94. addChild(displayOF);
  95. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 277.0f), Port::INPUT, module, LOURDE::INFLOOR));
  96. addOutput(Port::create<PJ301MPort>(Vec(25.5,320), Port::OUTPUT, module, LOURDE::OUT));
  97. }
  98. };
  99. } // namespace rack_plugin_Bidoo
  100. using namespace rack_plugin_Bidoo;
  101. RACK_PLUGIN_MODEL_INIT(Bidoo, LOURDE) {
  102. Model *modelLOURDE= Model::create<LOURDE, LOURDEWidget>("Bidoo", "LoURdE", "LoURdE gate", LOGIC_TAG);
  103. return modelLOURDE;
  104. }