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.

98 lines
2.6KB

  1. #include "DS.hpp"
  2. namespace rack_plugin_SubmarineFree {
  3. template <int x>
  4. struct AG_1 : DS_Module {
  5. enum ParamIds {
  6. NUM_PARAMS
  7. };
  8. enum InputIds {
  9. INPUT_A_1,
  10. INPUT_B_1 = x,
  11. NUM_INPUTS = x + x
  12. };
  13. enum OutputIds {
  14. OUTPUT_1,
  15. NUM_OUTPUTS = x
  16. };
  17. enum LightIds {
  18. NUM_LIGHTS
  19. };
  20. AG_1() : DS_Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  21. void step() override {
  22. int connCount = 0;
  23. int setCount = 0;
  24. for (int i = 0; i < x; i++) {
  25. if (inputs[INPUT_A_1 + i].active) {
  26. connCount++;
  27. if (inputs[INPUT_A_1 + i].value > midpoint())
  28. setCount++;
  29. }
  30. if (inputs[INPUT_B_1 + i].active) {
  31. connCount++;
  32. if (inputs[INPUT_B_1 + i].value > midpoint())
  33. setCount++;
  34. }
  35. if (outputs[OUTPUT_1 + i].active) {
  36. if (connCount)
  37. outputs[OUTPUT_1 + i].value = (connCount == setCount)?voltage1:voltage0;
  38. else
  39. outputs[OUTPUT_1 + i].value = voltage0;
  40. connCount = 0;
  41. setCount = 0;
  42. }
  43. }
  44. }
  45. };
  46. struct AG104 : ModuleWidget {
  47. AG104(AG_1<4> *module) : ModuleWidget(module) {
  48. setPanel(SVG::load(assetPlugin(plugin, "res/AG-104.svg")));
  49. for (int i = 0; i < 4; i++) {
  50. int offset = 87 * i;
  51. addInput(Port::create<BluePort>(Vec(2.5,19 + offset), Port::INPUT, module, AG_1<4>::INPUT_A_1 + i));
  52. addInput(Port::create<BluePort>(Vec(2.5,47 + offset), Port::INPUT, module, AG_1<4>::INPUT_B_1 + i));
  53. addOutput(Port::create<BluePort>(Vec(2.5,75 + offset), Port::OUTPUT, module, AG_1<4>::OUTPUT_1 + i));
  54. }
  55. }
  56. void appendContextMenu(Menu *menu) override {
  57. ((DS_Module *)module)->appendContextMenu(menu);
  58. }
  59. };
  60. struct AG106 : ModuleWidget {
  61. AG106(AG_1<6> *module) : ModuleWidget(module) {
  62. setPanel(SVG::load(assetPlugin(plugin, "res/AG-106.svg")));
  63. for (int i = 0; i < 6; i++) {
  64. int offset = 58 * i;
  65. addInput(Port::create<BluePort>(Vec(4,19 + offset), Port::INPUT, module, AG_1<6>::INPUT_A_1 + i));
  66. addInput(Port::create<BluePort>(Vec(4,47 + offset), Port::INPUT, module, AG_1<6>::INPUT_B_1 + i));
  67. addOutput(Port::create<BluePort>(Vec(62,33 + offset), Port::OUTPUT, module, AG_1<6>::OUTPUT_1 + i));
  68. }
  69. }
  70. void appendContextMenu(Menu *menu) override {
  71. ((DS_Module *)module)->appendContextMenu(menu);
  72. }
  73. };
  74. } // namespace rack_plugin_SubmarineFree
  75. using namespace rack_plugin_SubmarineFree;
  76. RACK_PLUGIN_MODEL_INIT(SubmarineFree, AG104) {
  77. Model *modelAG104 = Model::create<AG_1<4>, AG104>("Submarine (Free)", "AG-104", "AG-104 AND Gates", LOGIC_TAG, MULTIPLE_TAG);
  78. return modelAG104;
  79. }
  80. RACK_PLUGIN_MODEL_INIT(SubmarineFree, AG106) {
  81. Model *modelAG106 = Model::create<AG_1<6>, AG106>("Submarine (Free)", "AG-106", "AG-106 AND Gates", LOGIC_TAG, MULTIPLE_TAG);
  82. return modelAG106;
  83. }