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.

163 lines
6.5KB

  1. #include "Mix4.hpp"
  2. void Mix4::onSampleRateChange() {
  3. float sr = engineGetSampleRate();
  4. _channel1.setSampleRate(sr);
  5. _channel2.setSampleRate(sr);
  6. _channel3.setSampleRate(sr);
  7. _channel4.setSampleRate(sr);
  8. _slewLimiter.setParams(sr, MixerChannel::levelSlewTimeMS, MixerChannel::maxDecibels - MixerChannel::minDecibels);
  9. _rms.setSampleRate(sr);
  10. }
  11. void Mix4::step() {
  12. bool stereo = outputs[L_OUTPUT].active && outputs[R_OUTPUT].active;
  13. _channel1.next(stereo);
  14. _channel2.next(stereo);
  15. _channel3.next(stereo);
  16. _channel4.next(stereo);
  17. float level = params[MIX_PARAM].value;
  18. if (inputs[MIX_CV_INPUT].active) {
  19. level *= clamp(inputs[MIX_CV_INPUT].value / 10.0f, 0.0f, 1.0f);
  20. }
  21. level *= MixerChannel::maxDecibels - MixerChannel::minDecibels;
  22. level += MixerChannel::minDecibels;
  23. _amplifier.setLevel(_slewLimiter.next(level));
  24. float mono = 0.0f;
  25. mono += _channel1.out;
  26. mono += _channel2.out;
  27. mono += _channel3.out;
  28. mono += _channel4.out;
  29. mono = _amplifier.next(mono);
  30. mono = _saturator.next(mono);
  31. _rmsLevel = _rms.next(mono) / 5.0f;
  32. if (stereo) {
  33. float left = 0.0f;
  34. left += _channel1.left;
  35. left += _channel2.left;
  36. left += _channel3.left;
  37. left += _channel4.left;
  38. left = _amplifier.next(left);
  39. left = _saturator.next(left);
  40. outputs[L_OUTPUT].value = left;
  41. float right = 0.0f;
  42. right += _channel1.right;
  43. right += _channel2.right;
  44. right += _channel3.right;
  45. right += _channel4.right;
  46. right = _amplifier.next(right);
  47. right = _saturator.next(right);
  48. outputs[R_OUTPUT].value = right;
  49. }
  50. else {
  51. outputs[L_OUTPUT].value = outputs[R_OUTPUT].value = mono;
  52. }
  53. }
  54. struct Mix4Widget : ModuleWidget {
  55. static constexpr int hp = 15;
  56. Mix4Widget(Mix4* module) : ModuleWidget(module) {
  57. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  58. {
  59. SVGPanel *panel = new SVGPanel();
  60. panel->box.size = box.size;
  61. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Mix4.svg")));
  62. addChild(panel);
  63. }
  64. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  65. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  66. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  67. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  68. // generated by svg_widgets.rb
  69. auto level1ParamPosition = Vec(17.5, 32.0);
  70. auto mute1ParamPosition = Vec(17.2, 185.7);
  71. auto pan1ParamPosition = Vec(18.5, 223.0);
  72. auto level2ParamPosition = Vec(60.5, 32.0);
  73. auto mute2ParamPosition = Vec(60.2, 185.7);
  74. auto pan2ParamPosition = Vec(61.5, 223.0);
  75. auto level3ParamPosition = Vec(103.5, 32.0);
  76. auto mute3ParamPosition = Vec(103.2, 185.7);
  77. auto pan3ParamPosition = Vec(104.5, 223.0);
  78. auto level4ParamPosition = Vec(146.5, 32.0);
  79. auto mute4ParamPosition = Vec(146.2, 185.7);
  80. auto pan4ParamPosition = Vec(147.5, 223.0);
  81. auto mixParamPosition = Vec(189.5, 32.0);
  82. auto cv1InputPosition = Vec(14.5, 255.0);
  83. auto pan1InputPosition = Vec(14.5, 290.0);
  84. auto in1InputPosition = Vec(14.5, 325.0);
  85. auto cv2InputPosition = Vec(57.5, 255.0);
  86. auto pan2InputPosition = Vec(57.5, 290.0);
  87. auto in2InputPosition = Vec(57.5, 325.0);
  88. auto cv3InputPosition = Vec(100.5, 255.0);
  89. auto pan3InputPosition = Vec(100.5, 290.0);
  90. auto in3InputPosition = Vec(100.5, 325.0);
  91. auto cv4InputPosition = Vec(143.5, 255.0);
  92. auto pan4InputPosition = Vec(143.5, 290.0);
  93. auto in4InputPosition = Vec(143.5, 325.0);
  94. auto mixCvInputPosition = Vec(186.5, 252.0);
  95. auto lOutputPosition = Vec(186.5, 290.0);
  96. auto rOutputPosition = Vec(186.5, 325.0);
  97. // end generated by svg_widgets.rb
  98. addSlider(level1ParamPosition, module, Mix4::LEVEL1_PARAM, module->_channel1.rms);
  99. addParam(ParamWidget::create<Knob16>(pan1ParamPosition, module, Mix4::PAN1_PARAM, -1.0, 1.0, 0.0));
  100. addParam(ParamWidget::create<MuteButton>(mute1ParamPosition, module, Mix4::MUTE1_PARAM, 0.0, 1.0, 0.0));
  101. addSlider(level2ParamPosition, module, Mix4::LEVEL2_PARAM, module->_channel2.rms);
  102. addParam(ParamWidget::create<Knob16>(pan2ParamPosition, module, Mix4::PAN2_PARAM, -1.0, 1.0, 0.0));
  103. addParam(ParamWidget::create<MuteButton>(mute2ParamPosition, module, Mix4::MUTE2_PARAM, 0.0, 1.0, 0.0));
  104. addSlider(level3ParamPosition, module, Mix4::LEVEL3_PARAM, module->_channel3.rms);
  105. addParam(ParamWidget::create<Knob16>(pan3ParamPosition, module, Mix4::PAN3_PARAM, -1.0, 1.0, 0.0));
  106. addParam(ParamWidget::create<MuteButton>(mute3ParamPosition, module, Mix4::MUTE3_PARAM, 0.0, 1.0, 0.0));
  107. addSlider(level4ParamPosition, module, Mix4::LEVEL4_PARAM, module->_channel4.rms);
  108. addParam(ParamWidget::create<Knob16>(pan4ParamPosition, module, Mix4::PAN4_PARAM, -1.0, 1.0, 0.0));
  109. addParam(ParamWidget::create<MuteButton>(mute4ParamPosition, module, Mix4::MUTE4_PARAM, 0.0, 1.0, 0.0));
  110. addSlider(mixParamPosition, module, Mix4::MIX_PARAM, module->_rmsLevel);
  111. addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, Mix4::CV1_INPUT));
  112. addInput(Port::create<Port24>(pan1InputPosition, Port::INPUT, module, Mix4::PAN1_INPUT));
  113. addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, Mix4::IN1_INPUT));
  114. addInput(Port::create<Port24>(cv2InputPosition, Port::INPUT, module, Mix4::CV2_INPUT));
  115. addInput(Port::create<Port24>(pan2InputPosition, Port::INPUT, module, Mix4::PAN2_INPUT));
  116. addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, Mix4::IN2_INPUT));
  117. addInput(Port::create<Port24>(cv3InputPosition, Port::INPUT, module, Mix4::CV3_INPUT));
  118. addInput(Port::create<Port24>(pan3InputPosition, Port::INPUT, module, Mix4::PAN3_INPUT));
  119. addInput(Port::create<Port24>(in3InputPosition, Port::INPUT, module, Mix4::IN3_INPUT));
  120. addInput(Port::create<Port24>(cv4InputPosition, Port::INPUT, module, Mix4::CV4_INPUT));
  121. addInput(Port::create<Port24>(pan4InputPosition, Port::INPUT, module, Mix4::PAN4_INPUT));
  122. addInput(Port::create<Port24>(in4InputPosition, Port::INPUT, module, Mix4::IN4_INPUT));
  123. addInput(Port::create<Port24>(mixCvInputPosition, Port::INPUT, module, Mix4::MIX_CV_INPUT));
  124. addOutput(Port::create<Port24>(lOutputPosition, Port::OUTPUT, module, Mix4::L_OUTPUT));
  125. addOutput(Port::create<Port24>(rOutputPosition, Port::OUTPUT, module, Mix4::R_OUTPUT));
  126. }
  127. void addSlider(Vec position, Mix4* module, int id, float& rms) {
  128. auto slider = ParamWidget::create<VUSlider151>(
  129. position,
  130. module,
  131. id,
  132. 0.0,
  133. 1.0,
  134. abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels)
  135. );
  136. dynamic_cast<VUSlider*>(slider)->setVULevel(&rms);
  137. addParam(slider);
  138. }
  139. };
  140. RACK_PLUGIN_MODEL_INIT(Bogaudio, Mix4) {
  141. Model *modelMix4 = createModel<Mix4, Mix4Widget>("Bogaudio-Mix4", "Mix4", "4-channel mixer and panner", MIXER_TAG, PANNING_TAG);
  142. return modelMix4;
  143. }