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.

103 lines
3.4KB

  1. #include "Bidoo.hpp"
  2. #include "BidooComponents.hpp"
  3. #include "dsp/digital.hpp"
  4. using namespace std;
  5. namespace rack_plugin_Bidoo {
  6. struct DUKE : Module {
  7. enum ParamIds {
  8. SLIDER_PARAM,
  9. ADONF_PARAM = SLIDER_PARAM + 4,
  10. NADA_PARAM,
  11. MIN_PARAM = NADA_PARAM + 4,
  12. MAX_PARAM = MIN_PARAM + 4,
  13. TYPE_PARAM = MAX_PARAM + 4,
  14. NUM_PARAMS = TYPE_PARAM + 4,
  15. };
  16. enum InputIds {
  17. SLIDER_INPUT,
  18. NUM_INPUTS = SLIDER_INPUT + 4
  19. };
  20. enum OutputIds {
  21. CV_OUTPUT,
  22. NUM_OUTPUTS = CV_OUTPUT + 4
  23. };
  24. enum LightIds {
  25. NUM_LIGHTS
  26. };
  27. DUKE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
  28. void step() override;
  29. };
  30. void DUKE::step() {
  31. for (int i = 0; i < 4; i ++) {
  32. float min = params[MIN_PARAM + i].value - 5.0f * params[TYPE_PARAM + i].value;
  33. float max = params[MAX_PARAM + i].value - 5.0f * params[TYPE_PARAM + i].value;
  34. outputs[CV_OUTPUT + i].value = min + clamp(params[SLIDER_PARAM + i].value + inputs[SLIDER_INPUT + i].value, 0.0f , 10.0f) * (max - min) / 10.0f;
  35. }
  36. }
  37. struct DUKEWidget : ModuleWidget {
  38. ParamWidget *sliders[4];
  39. DUKEWidget(DUKE *module);
  40. };
  41. struct DUKECKD6 : BlueCKD6 {
  42. void onMouseDown(EventMouseDown &e) override {
  43. DUKEWidget *parent = dynamic_cast<DUKEWidget*>(this->parent);
  44. DUKE *module = dynamic_cast<DUKE*>(this->module);
  45. if (parent && module) {
  46. if (this->paramId == DUKE::ADONF_PARAM) {
  47. for (int i = 0; i < 4 ; i++) {
  48. parent->sliders[i]->setValue(10);
  49. module->params[DUKE::SLIDER_PARAM + i].value = 10.0f;
  50. }
  51. } else if (this->paramId == DUKE::NADA_PARAM) {
  52. for (int i = 0; i < 4 ; i++) {
  53. parent->sliders[i]->setValue(0.0f);
  54. module->params[DUKE::SLIDER_PARAM + i].value = 0.0f;
  55. }
  56. }
  57. }
  58. BlueCKD6::onMouseDown(e);
  59. }
  60. };
  61. DUKEWidget::DUKEWidget(DUKE *module) : ModuleWidget(module) {
  62. setPanel(SVG::load(assetPlugin(plugin, "res/DUKE.svg")));
  63. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  64. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  65. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  66. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  67. static const float portX0[4] = {36.0f, 70.0f, 105.0f, 140.0f};
  68. addParam(ParamWidget::create<DUKECKD6>(Vec(portX0[0]-29.0f, 190.0f), module, DUKE::ADONF_PARAM, 0.0f, 1.0f, 0.0f));
  69. addParam(ParamWidget::create<DUKECKD6>(Vec(portX0[0]-29.0f, 230.0f), module, DUKE::NADA_PARAM, 0.0f, 1.0f, 0.0f));
  70. for (int i = 0; i < 4; i++) {
  71. addParam(ParamWidget::create<BidooBlueKnob>(Vec(portX0[i]-2.0f, 51.0f), module, DUKE::MAX_PARAM + i, 0.0f, 10.0f, 10.0f));
  72. addParam(ParamWidget::create<BidooBlueKnob>(Vec(portX0[i]-2.0f, 95.0f), module, DUKE::MIN_PARAM + i, 0.0f, 10.0f, 0.0f));
  73. addParam(ParamWidget::create<CKSS>(Vec(portX0[i]+6.0f, 139.0f), module, DUKE::TYPE_PARAM + i, 0.0f, 1.0f, 0.0f));
  74. sliders[i] = ParamWidget::create<BidooLongSlider>(Vec(portX0[i]+4.0f, 176.0f), module, DUKE::SLIDER_PARAM + i, 0.0f, 10.0f, 0.0f);
  75. addParam(sliders[i]);
  76. addInput(Port::create<PJ301MPort>(Vec(portX0[i]+1.0f, 284.0f), Port::INPUT, module, DUKE::SLIDER_INPUT + i));
  77. addOutput(Port::create<PJ301MPort>(Vec(portX0[i]+1.0f, 323.0f), Port::OUTPUT, module, DUKE::CV_OUTPUT + i));
  78. }
  79. }
  80. } // namespace rack_plugin_Bidoo
  81. using namespace rack_plugin_Bidoo;
  82. RACK_PLUGIN_MODEL_INIT(Bidoo, DUKE) {
  83. Model *modelDUKE = Model::create<DUKE, DUKEWidget>("Bidoo","dUKe", "dUKe controller", CONTROLLER_TAG);
  84. return modelDUKE;
  85. }