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.

168 lines
6.8KB

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