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.

85 lines
2.6KB

  1. #include "common.hpp"
  2. #include "mplex.hpp"
  3. namespace rack_plugin_TheXOR {
  4. void Mplex::on_loaded()
  5. {
  6. load();
  7. }
  8. void Mplex::load()
  9. {
  10. set_output(0);
  11. }
  12. void Mplex::set_output(int n)
  13. {
  14. cur_sel = n;
  15. for(int k = 0; k < NUM_MPLEX_INPUTS; k++)
  16. {
  17. lights[LED_1 + k].value = k == cur_sel ? LVL_ON : LVL_OFF;
  18. }
  19. }
  20. void Mplex::step()
  21. {
  22. if(upTrigger.process(params[BTDN].value + inputs[INDN].value))
  23. {
  24. if(++cur_sel >= NUM_MPLEX_INPUTS)
  25. cur_sel = 0;
  26. set_output(cur_sel);
  27. } else if(dnTrigger.process(params[BTUP].value + inputs[INUP].value))
  28. {
  29. if(--cur_sel < 0)
  30. cur_sel = NUM_MPLEX_INPUTS-1;
  31. set_output(cur_sel);
  32. }
  33. outputs[OUT_1].value = inputs[IN_1 + cur_sel].value;
  34. }
  35. MplexWidget::MplexWidget(Mplex *module) : ModuleWidget(module)
  36. {
  37. box.size = Vec(10 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  38. {
  39. SVGPanel *panel = new SVGPanel();
  40. panel->box.size = box.size;
  41. panel->setBackground(SVG::load(assetPlugin(plugin, "res/modules/mplex.svg")));
  42. addChild(panel);
  43. }
  44. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, 0)));
  45. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  46. addChild(Widget::create<ScrewBlack>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  47. addChild(Widget::create<ScrewBlack>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  48. addParam(ParamWidget::create<BefacoPushBig>(Vec(mm2px(25.322), yncscape(85.436, 8.999)), module, Mplex::BTUP, 0.0, 1.0, 0.0));
  49. addParam(ParamWidget::create<BefacoPushBig>(Vec(mm2px(25.322), yncscape(33.452, 8.999)), module, Mplex::BTDN, 0.0, 1.0, 0.0));
  50. addInput(Port::create<PJ301BPort>(Vec(mm2px(25.694), yncscape(71.230, 8.255)), Port::INPUT, module, Mplex::INUP));
  51. addInput(Port::create<PJ301BPort>(Vec(mm2px(25.694), yncscape(49.014, 8.255)), Port::INPUT, module, Mplex::INDN));
  52. addOutput(Port::create<PJ301GPort>(Vec(mm2px(40.045), yncscape(60.122, 8.255)), Port::OUTPUT, module, Mplex::OUT_1));
  53. float y = 105.068f;
  54. float x = 3.558f;
  55. float led_x = 13.843f;
  56. float y_offs = y - 108.108f;
  57. float delta_y = 92.529f - 105.068f;
  58. for(int k = 0; k < NUM_MPLEX_INPUTS; k++)
  59. {
  60. addInput(Port::create<PJ301GRPort>(Vec(mm2px(x), yncscape(y, 8.255)), Port::INPUT, module, Mplex::IN_1 + k));
  61. addChild(ModuleLightWidget::create<SmallLight<RedLight>>(Vec(mm2px(led_x), yncscape(y-y_offs, 2.176)), module, Mplex::LED_1 + k));
  62. y += delta_y;
  63. if(k == 3)
  64. y -= 2.117f;
  65. }
  66. }
  67. } // namespace rack_plugin_TheXOR
  68. using namespace rack_plugin_TheXOR;
  69. RACK_PLUGIN_MODEL_INIT(TheXOR, Mplex) {
  70. return Model::create<Mplex, MplexWidget>("TheXOR", "Mplex", "Mplex", SWITCH_TAG);
  71. }