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.

203 lines
4.8KB

  1. #include "Southpole.hpp"
  2. namespace rack_plugin_Southpole {
  3. struct But : 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. IN1_INPUT,
  20. IN2_INPUT,
  21. IN3_INPUT,
  22. IN4_INPUT,
  23. IN5_INPUT,
  24. IN6_INPUT,
  25. IN7_INPUT,
  26. IN8_INPUT,
  27. NUM_INPUTS
  28. };
  29. enum OutputIds
  30. {
  31. OUTA1_OUTPUT,
  32. OUTA2_OUTPUT,
  33. OUTA3_OUTPUT,
  34. OUTA4_OUTPUT,
  35. OUTA5_OUTPUT,
  36. OUTA6_OUTPUT,
  37. OUTA7_OUTPUT,
  38. OUTA8_OUTPUT,
  39. OUTB1_OUTPUT,
  40. OUTB2_OUTPUT,
  41. OUTB3_OUTPUT,
  42. OUTB4_OUTPUT,
  43. OUTB5_OUTPUT,
  44. OUTB6_OUTPUT,
  45. OUTB7_OUTPUT,
  46. OUTB8_OUTPUT,
  47. SUMA1_OUTPUT,
  48. SUMA2_OUTPUT,
  49. SUMB1_OUTPUT,
  50. SUMB2_OUTPUT,
  51. NUM_OUTPUTS
  52. };
  53. enum LightIds
  54. {
  55. /*
  56. SWITCH1_LIGHT,
  57. SWITCH2_LIGHT,
  58. SWITCH3_LIGHT,
  59. SWITCH4_LIGHT,
  60. SWITCH5_LIGHT,
  61. SWITCH6_LIGHT,
  62. SWITCH7_LIGHT,
  63. SWITCH8_LIGHT,
  64. */
  65. NUM_LIGHTS
  66. };
  67. bool swState[8] = {};
  68. But() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  69. {
  70. reset();
  71. }
  72. void step() override;
  73. void reset() override
  74. {
  75. for (int i = 0; i < 8; i++)
  76. {
  77. swState[i] = false;
  78. }
  79. }
  80. void randomize() override
  81. {
  82. for (int i = 0; i < 8; i++)
  83. {
  84. swState[i] = (randomUniform() < 0.5);
  85. }
  86. }
  87. json_t *toJson() override
  88. {
  89. json_t *rootJ = json_object();
  90. json_t *swStatesJ = json_array();
  91. for (int i = 0; i < 8; i++)
  92. {
  93. json_t *swStateJ = json_boolean(swState[i]);
  94. json_array_append_new(swStatesJ, swStateJ);
  95. }
  96. json_object_set_new(rootJ, "swStates", swStatesJ);
  97. return rootJ;
  98. }
  99. void fromJson(json_t *rootJ) override
  100. {
  101. json_t *swStatesJ = json_object_get(rootJ, "swStates");
  102. if (swStatesJ)
  103. {
  104. for (int i = 0; i < 8; i++)
  105. {
  106. json_t *stateJ = json_array_get(swStatesJ, i);
  107. if (stateJ) {
  108. swState[i] = json_boolean_value(stateJ);
  109. }
  110. }
  111. }
  112. }
  113. };
  114. void But::step()
  115. {
  116. float outa = 0.;
  117. float outb = 0.;
  118. for(int i = 0; i < 8; i++)
  119. {
  120. swState[i] = params[SWITCH1_PARAM + i].value > 0.5;
  121. float in = 0.;
  122. if(inputs[IN1_INPUT + i].active)
  123. {
  124. in = inputs[IN1_INPUT + i].value;
  125. }
  126. if ( !swState[i] ) {
  127. outputs[OUTA1_OUTPUT + i].value = in;
  128. outa += in;
  129. } else {
  130. outputs[OUTB1_OUTPUT + i].value = in;
  131. outb += in;
  132. }
  133. // lights[SWITCH1_LIGHT + i].setBrightness(swState[i] ? 0.9 : 0.0);
  134. }
  135. outputs[SUMA1_OUTPUT].value = outa;
  136. outputs[SUMA2_OUTPUT].value = outa;
  137. outputs[SUMB1_OUTPUT].value = outb;
  138. outputs[SUMB2_OUTPUT].value = outb;
  139. }
  140. struct ButWidget : ModuleWidget {
  141. ButWidget(But *module) : ModuleWidget(module)
  142. {
  143. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  144. {
  145. auto *panel = new SVGPanel();
  146. panel->box.size = box.size;
  147. panel->setBackground(SVG::load(assetPlugin(plugin, "res/But.svg")));
  148. addChild(panel);
  149. }
  150. const float x1 = 3.;
  151. const float x2 = 4.+20.;
  152. const float x3 = 5.+40.;
  153. const float x4 = 5.+63.;
  154. float yPos = 18.;
  155. for(int i = 0; i < 8; i++)
  156. {
  157. yPos += 32.;
  158. addInput(Port::create<sp_Port>(Vec(x1, yPos), Port::INPUT, module, But::IN1_INPUT + i));
  159. addOutput(Port::create<sp_Port>(Vec(x2, yPos), Port::OUTPUT, module, But::OUTA1_OUTPUT + i));
  160. addParam(ParamWidget::create<sp_Switch>(Vec(x3+1, 3 + yPos), module, But::SWITCH1_PARAM + i, 0.0, 1.0, 0.0));
  161. addOutput(Port::create<sp_Port>(Vec(x4, yPos), Port::OUTPUT, module, But::OUTB1_OUTPUT + i));
  162. }
  163. yPos += 48.;
  164. addOutput(Port::create<sp_Port>(Vec(x1, yPos), Port::OUTPUT, module, But::SUMA1_OUTPUT));
  165. addOutput(Port::create<sp_Port>(Vec(x2, yPos), Port::OUTPUT, module, But::SUMA2_OUTPUT));
  166. addOutput(Port::create<sp_Port>(Vec(x3+3, yPos), Port::OUTPUT, module, But::SUMB1_OUTPUT));
  167. addOutput(Port::create<sp_Port>(Vec(x4, yPos), Port::OUTPUT, module, But::SUMB2_OUTPUT));
  168. }
  169. };
  170. } // namespace rack_plugin_Southpole
  171. using namespace rack_plugin_Southpole;
  172. RACK_PLUGIN_MODEL_INIT(Southpole, But) {
  173. Model *modelBut = Model::create<But,ButWidget>( "Southpole", "But", "But - A/B buss", SWITCH_TAG, MIXER_TAG);
  174. return modelBut;
  175. }