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.

171 lines
6.6KB

  1. #include "RJModules.hpp"
  2. #include <iostream>
  3. #include "dsp/digital.hpp"
  4. namespace rack_plugin_RJModules {
  5. #define NUM_PARAMSS 5
  6. #define NUM_CHANNELS 10
  7. struct Panners : Module {
  8. enum ParamIds {
  9. MUTE_PARAM,
  10. NUM_PARAMS = MUTE_PARAM + NUM_PARAMSS
  11. };
  12. enum InputIds {
  13. IN_INPUT,
  14. NUM_INPUTS = IN_INPUT + NUM_CHANNELS
  15. };
  16. enum OutputIds {
  17. OUT_OUTPUT,
  18. NUM_OUTPUTS = OUT_OUTPUT + NUM_CHANNELS
  19. };
  20. enum LightIds {
  21. MUTE_LIGHT,
  22. NUM_LIGHTS = MUTE_LIGHT + NUM_CHANNELS
  23. };
  24. bool state[NUM_CHANNELS];
  25. SchmittTrigger muteTrigger[NUM_CHANNELS];
  26. Panners() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  27. reset();
  28. }
  29. void step() override;
  30. void reset() override {
  31. for (int i = 0; i < NUM_CHANNELS; i++) {
  32. state[i] = true;
  33. }
  34. }
  35. void randomize() override {
  36. for (int i = 0; i < NUM_CHANNELS; i++) {
  37. state[i] = (randomUniform() < 0.5);
  38. }
  39. }
  40. json_t *toJson() override {
  41. json_t *rootJ = json_object();
  42. // states
  43. json_t *statesJ = json_array();
  44. for (int i = 0; i < NUM_CHANNELS; i++) {
  45. json_t *stateJ = json_boolean(state[i]);
  46. json_array_append_new(statesJ, stateJ);
  47. }
  48. json_object_set_new(rootJ, "states", statesJ);
  49. return rootJ;
  50. }
  51. void fromJson(json_t *rootJ) override {
  52. // states
  53. json_t *statesJ = json_object_get(rootJ, "states");
  54. if (statesJ) {
  55. for (int i = 0; i < NUM_CHANNELS; i++) {
  56. json_t *stateJ = json_array_get(statesJ, i);
  57. if (stateJ)
  58. state[i] = json_boolean_value(stateJ);
  59. }
  60. }
  61. }
  62. };
  63. void Panners::step() {
  64. float in;
  65. float in2;
  66. float remapped;
  67. for (int i = 0; i < NUM_PARAMSS; i++) {
  68. in = inputs[IN_INPUT + 2*i].value;
  69. in2 = inputs[IN_INPUT + 2*i + 1].value;
  70. remapped = 1;
  71. //pan right
  72. if(params[MUTE_PARAM + i].value > .5){
  73. // new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min
  74. remapped = ( (params[MUTE_PARAM + i].value - 0.5) / (1.0 - 0.5) ) * (1.0 - 0) + 0;
  75. outputs[OUT_OUTPUT + 2*i].value = in * (1 - remapped);
  76. // Right is the same
  77. outputs[OUT_OUTPUT + 2*i + 1].value = in2;
  78. //pan left
  79. } else if (params[MUTE_PARAM + i].value < .5){
  80. // Left is the same
  81. outputs[OUT_OUTPUT + 2*i].value = in;
  82. // new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min
  83. remapped = params[MUTE_PARAM + i].value / .5;
  84. outputs[OUT_OUTPUT + 2*i + 1].value = in2 * remapped;
  85. //center
  86. } else{
  87. outputs[OUT_OUTPUT + 2*i].value = in;
  88. outputs[OUT_OUTPUT + 2*i + 1].value = in2;
  89. }
  90. }
  91. }
  92. template <typename BASE>
  93. struct MuteLight : BASE {
  94. MuteLight() {
  95. this->box.size = mm2px(Vec(6.0, 6.0));
  96. }
  97. };
  98. struct PannersWidget: ModuleWidget {
  99. PannersWidget(Panners *module);
  100. };
  101. PannersWidget::PannersWidget(Panners *module) : ModuleWidget(module) {
  102. setPanel(SVG::load(assetPlugin(plugin, "res/Panners.svg")));
  103. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  104. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  105. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  106. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  107. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 23.165)), module, Panners::MUTE_PARAM + 0, 0.0, 1.0, 0.5));
  108. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 43.164)), module, Panners::MUTE_PARAM + 1, 0.0, 1.0, 0.5));
  109. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 63.164)), module, Panners::MUTE_PARAM + 2, 0.0, 1.0, 0.5));
  110. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 83.165)), module, Panners::MUTE_PARAM + 3, 0.0, 1.0, 0.5));
  111. addParam(ParamWidget::create<RoundSmallBlackKnob>(mm2px(Vec(15.57, 103.164)), module, Panners::MUTE_PARAM + 4, 0.0, 1.0, 0.5));
  112. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 17.81)), Port::INPUT, module, Panners::IN_INPUT + 0));
  113. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 27.809)), Port::INPUT, module, Panners::IN_INPUT + 1));
  114. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 37.809)), Port::INPUT, module, Panners::IN_INPUT + 2));
  115. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 47.81)), Port::INPUT, module, Panners::IN_INPUT + 3));
  116. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 57.81)), Port::INPUT, module, Panners::IN_INPUT + 4));
  117. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 67.809)), Port::INPUT, module, Panners::IN_INPUT + 5));
  118. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 77.81)), Port::INPUT, module, Panners::IN_INPUT + 6));
  119. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 87.81)), Port::INPUT, module, Panners::IN_INPUT + 7));
  120. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 97.809)), Port::INPUT, module, Panners::IN_INPUT + 8));
  121. addInput(Port::create<PJ301MPort>(mm2px(Vec(4.214, 107.809)), Port::INPUT, module, Panners::IN_INPUT + 9));
  122. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 17.81)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 0));
  123. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 27.809)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 1));
  124. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 37.809)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 2));
  125. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 47.81)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 3));
  126. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 57.809)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 4));
  127. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 67.809)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 5));
  128. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 77.81)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 6));
  129. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 87.81)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 7));
  130. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 97.809)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 8));
  131. addOutput(Port::create<PJ301MPort>(mm2px(Vec(28.214, 107.809)), Port::OUTPUT, module, Panners::OUT_OUTPUT + 9));
  132. }
  133. } // namespace rack_plugin_RJModules
  134. using namespace rack_plugin_RJModules;
  135. RACK_PLUGIN_MODEL_INIT(RJModules, Panners) {
  136. Model *modelPanners = Model::create<Panners, PannersWidget>("RJModules", "Panners", "[MIX] Panners", PANNING_TAG);
  137. return modelPanners;
  138. }