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.

194 lines
4.4KB

  1. #include "Southpole.hpp"
  2. namespace rack_plugin_Southpole {
  3. struct Abr : Module
  4. {
  5. enum ParamIds
  6. {
  7. SWITCH1_PARAM,
  8. SWITCH2_PARAM,
  9. SWITCH3_PARAM,
  10. SWITCH4_PARAM,
  11. SWITCH5_PARAM,
  12. SWITCH6_PARAM,
  13. SWITCH7_PARAM,
  14. SWITCH8_PARAM,
  15. NUM_PARAMS
  16. };
  17. enum InputIds
  18. {
  19. INA1_INPUT,
  20. INA2_INPUT,
  21. INA3_INPUT,
  22. INA4_INPUT,
  23. INA5_INPUT,
  24. INA6_INPUT,
  25. INA7_INPUT,
  26. INA8_INPUT,
  27. INB1_INPUT,
  28. INB2_INPUT,
  29. INB3_INPUT,
  30. INB4_INPUT,
  31. INB5_INPUT,
  32. INB6_INPUT,
  33. INB7_INPUT,
  34. INB8_INPUT,
  35. NUM_INPUTS
  36. };
  37. enum OutputIds
  38. {
  39. OUT1_OUTPUT,
  40. OUT2_OUTPUT,
  41. OUT3_OUTPUT,
  42. OUT4_OUTPUT,
  43. OUT5_OUTPUT,
  44. OUT6_OUTPUT,
  45. OUT7_OUTPUT,
  46. OUT8_OUTPUT,
  47. SUMA_OUTPUT,
  48. SUMB_OUTPUT,
  49. SUM_OUTPUT,
  50. NUM_OUTPUTS
  51. };
  52. enum LightIds
  53. {
  54. NUM_LIGHTS
  55. };
  56. bool swState[8] = {};
  57. Abr() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  58. {
  59. reset();
  60. }
  61. void step() override;
  62. void reset() override
  63. {
  64. for (int i = 0; i < 8; i++)
  65. {
  66. swState[i] = false;
  67. }
  68. }
  69. void randomize() override
  70. {
  71. for (int i = 0; i < 8; i++)
  72. {
  73. swState[i] = (randomUniform() < 0.5);
  74. }
  75. }
  76. json_t *toJson() override
  77. {
  78. json_t *rootJ = json_object();
  79. json_t *swStatesJ = json_array();
  80. for (int i = 0; i < 8; i++)
  81. {
  82. json_t *swStateJ = json_boolean(swState[i]);
  83. json_array_append_new(swStatesJ, swStateJ);
  84. }
  85. json_object_set_new(rootJ, "swStates", swStatesJ);
  86. return rootJ;
  87. }
  88. void fromJson(json_t *rootJ) override
  89. {
  90. json_t *swStatesJ = json_object_get(rootJ, "swStates");
  91. if (swStatesJ)
  92. {
  93. for (int i = 0; i < 8; i++)
  94. {
  95. json_t *stateJ = json_array_get(swStatesJ, i);
  96. if (stateJ) {
  97. swState[i] = json_boolean_value(stateJ);
  98. }
  99. }
  100. }
  101. }
  102. };
  103. void Abr::step()
  104. {
  105. float outa = 0.;
  106. float outb = 0.;
  107. float out = 0.;
  108. for(int i = 0; i < 8; i++)
  109. {
  110. swState[i] = params[SWITCH1_PARAM + i].value > 0.5;
  111. if ( !swState[i] ) {
  112. if(inputs[INA1_INPUT + i].active)
  113. {
  114. float ina = inputs[INA1_INPUT + i].value;
  115. outputs[OUT1_OUTPUT + i].value = ina;
  116. outa += ina;
  117. out += ina;
  118. }
  119. } else {
  120. if(inputs[INB1_INPUT + i].active)
  121. {
  122. float inb = inputs[INB1_INPUT + i].value;
  123. outputs[OUT1_OUTPUT + i].value = inb;
  124. outb += inb;
  125. out += inb;
  126. }
  127. }
  128. }
  129. outputs[SUMA_OUTPUT].value = outa;
  130. outputs[SUMB_OUTPUT].value = outb;
  131. outputs[SUM_OUTPUT].value = out;
  132. }
  133. struct AbrWidget : ModuleWidget {
  134. AbrWidget(Abr *module) : ModuleWidget(module)
  135. {
  136. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  137. {
  138. auto *panel = new SVGPanel();
  139. panel->box.size = box.size;
  140. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Abr.svg")));
  141. addChild(panel);
  142. }
  143. const float x1 = 3.;
  144. const float x2 = 4.+20.;
  145. const float x3 = 5.+43.;
  146. const float x4 = 5.+63.;
  147. float yPos = 18.;
  148. for(int i = 0; i < 8; i++)
  149. {
  150. yPos += 32.;
  151. addInput(Port::create<sp_Port>(Vec(x1, yPos), Port::INPUT, module, Abr::INA1_INPUT + i));
  152. addParam(ParamWidget::create<sp_Switch>(Vec(x2+1, 3 + yPos), module, Abr::SWITCH1_PARAM + i, 0.0, 1.0, 0.0));
  153. addInput(Port::create<sp_Port>(Vec(x3, yPos), Port::INPUT, module, Abr::INB1_INPUT + i));
  154. addOutput(Port::create<sp_Port>(Vec(x4, yPos), Port::OUTPUT, module, Abr::OUT1_OUTPUT + i));
  155. }
  156. yPos += 48.;
  157. addOutput(Port::create<sp_Port>(Vec(x1, yPos), Port::OUTPUT, module, Abr::SUMA_OUTPUT));
  158. addOutput(Port::create<sp_Port>(Vec(x3, yPos), Port::OUTPUT, module, Abr::SUMB_OUTPUT));
  159. addOutput(Port::create<sp_Port>(Vec(x4, yPos), Port::OUTPUT, module, Abr::SUM_OUTPUT));
  160. }
  161. };
  162. } // namespace rack_plugin_Southpole
  163. using namespace rack_plugin_Southpole;
  164. RACK_PLUGIN_MODEL_INIT(Southpole, Abr) {
  165. Model *modelAbr = Model::create<Abr,AbrWidget>("Southpole", "Abr", "Abr - A/B switch", SWITCH_TAG, MIXER_TAG);
  166. return modelAbr;
  167. }