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.

130 lines
4.1KB

  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. char display[128];
  49. snprintf(display, sizeof(display), "%2.2f", *value);
  50. nvgFontSize(vg, 14.0f);
  51. nvgFontFaceId(vg, font->handle);
  52. nvgTextLetterSpacing(vg, -2.0f);
  53. nvgFillColor(vg, YELLOW_BIDOO);
  54. nvgTextAlign(vg, NVG_ALIGN_CENTER);
  55. nvgRotate(vg,-1.0f * M_PI_2);
  56. nvgText(vg, 0.0f, 0.0f, display, NULL);
  57. }
  58. };
  59. struct LOURDEWidget : ModuleWidget {
  60. LOURDEWidget(LOURDE *module) : ModuleWidget(module) {
  61. setPanel(SVG::load(assetPlugin(plugin, "res/LOURDE.svg")));
  62. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  63. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  64. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  65. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  66. addInput(Port::create<PJ301MPort>(Vec(25.5,85), Port::INPUT, module, LOURDE::IN1));
  67. addInput(Port::create<PJ301MPort>(Vec(25.5,155), Port::INPUT, module, LOURDE::IN2));
  68. addInput(Port::create<PJ301MPort>(Vec(25.5,225), Port::INPUT, module, LOURDE::IN3));
  69. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 57.0f), Port::INPUT, module, LOURDE::INWEIGHT1));
  70. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 127.0f), Port::INPUT, module, LOURDE::INWEIGHT2));
  71. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 197.0f), Port::INPUT, module, LOURDE::INWEIGHT3));
  72. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,50), module, LOURDE::WEIGHT1, -5.0f, 5.0f, 0.0f));
  73. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,120), module, LOURDE::WEIGHT2, -5.0f, 5.0f, 0.0f));
  74. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,190), module, LOURDE::WEIGHT3, -5.0f, 5.0f, 0.0f));
  75. LabelDisplayWidget *displayW1 = new LabelDisplayWidget();
  76. displayW1->box.pos = Vec(15,65);
  77. displayW1->value = &module->params[LOURDE::WEIGHT1].value;
  78. addChild(displayW1);
  79. LabelDisplayWidget *displayW2 = new LabelDisplayWidget();
  80. displayW2->box.pos = Vec(15,135);
  81. displayW2->value = &module->params[LOURDE::WEIGHT2].value;
  82. addChild(displayW2);
  83. LabelDisplayWidget *displayW3 = new LabelDisplayWidget();
  84. displayW3->box.pos = Vec(15,205);
  85. displayW3->value = &module->params[LOURDE::WEIGHT3].value;
  86. addChild(displayW3);
  87. addParam(ParamWidget::create<BidooBlueKnob>(Vec(22.5,270), module, LOURDE::OUTFLOOR, -10.0f, 10.0f, 0.0f));
  88. LabelDisplayWidget *displayOF = new LabelDisplayWidget();
  89. displayOF->box.pos = Vec(15,285);
  90. displayOF->value = &module->params[LOURDE::OUTFLOOR].value;
  91. addChild(displayOF);
  92. addInput(Port::create<TinyPJ301MPort>(Vec(56.0f, 277.0f), Port::INPUT, module, LOURDE::INFLOOR));
  93. addOutput(Port::create<PJ301MPort>(Vec(25.5,320), Port::OUTPUT, module, LOURDE::OUT));
  94. }
  95. };
  96. } // namespace rack_plugin_Bidoo
  97. using namespace rack_plugin_Bidoo;
  98. RACK_PLUGIN_MODEL_INIT(Bidoo, LOURDE) {
  99. Model *modelLOURDE= Model::create<LOURDE, LOURDEWidget>("Bidoo", "LoURdE", "LoURdE gate", LOGIC_TAG);
  100. return modelLOURDE;
  101. }