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.

231 lines
10KB

  1. #include "Mix8.hpp"
  2. void Mix8::onSampleRateChange() {
  3. float sr = engineGetSampleRate();
  4. _channel1.setSampleRate(sr);
  5. _channel2.setSampleRate(sr);
  6. _channel3.setSampleRate(sr);
  7. _channel4.setSampleRate(sr);
  8. _channel5.setSampleRate(sr);
  9. _channel6.setSampleRate(sr);
  10. _channel7.setSampleRate(sr);
  11. _channel8.setSampleRate(sr);
  12. _slewLimiter.setParams(sr, MixerChannel::levelSlewTimeMS, MixerChannel::maxDecibels - MixerChannel::minDecibels);
  13. _rms.setSampleRate(sr);
  14. }
  15. void Mix8::step() {
  16. bool stereo = outputs[L_OUTPUT].active && outputs[R_OUTPUT].active;
  17. _channel1.next(stereo);
  18. _channel2.next(stereo);
  19. _channel3.next(stereo);
  20. _channel4.next(stereo);
  21. _channel5.next(stereo);
  22. _channel6.next(stereo);
  23. _channel7.next(stereo);
  24. _channel8.next(stereo);
  25. float level = params[MIX_PARAM].value;
  26. if (inputs[MIX_CV_INPUT].active) {
  27. level *= clamp(inputs[MIX_CV_INPUT].value / 10.0f, 0.0f, 1.0f);
  28. }
  29. level *= MixerChannel::maxDecibels - MixerChannel::minDecibels;
  30. level += MixerChannel::minDecibels;
  31. _amplifier.setLevel(_slewLimiter.next(level));
  32. float mono = 0.0f;
  33. mono += _channel1.out;
  34. mono += _channel2.out;
  35. mono += _channel3.out;
  36. mono += _channel4.out;
  37. mono += _channel5.out;
  38. mono += _channel6.out;
  39. mono += _channel7.out;
  40. mono += _channel8.out;
  41. mono = _amplifier.next(mono);
  42. mono = _saturator.next(mono);
  43. _rmsLevel = _rms.next(mono) / 5.0f;
  44. if (stereo) {
  45. float left = 0.0f;
  46. left += _channel1.left;
  47. left += _channel2.left;
  48. left += _channel3.left;
  49. left += _channel4.left;
  50. left += _channel5.left;
  51. left += _channel6.left;
  52. left += _channel7.left;
  53. left += _channel8.left;
  54. left = _amplifier.next(left);
  55. left = _saturator.next(left);
  56. outputs[L_OUTPUT].value = left;
  57. float right = 0.0f;
  58. right += _channel1.right;
  59. right += _channel2.right;
  60. right += _channel3.right;
  61. right += _channel4.right;
  62. right += _channel5.right;
  63. right += _channel6.right;
  64. right += _channel7.right;
  65. right += _channel8.right;
  66. right = _amplifier.next(right);
  67. right = _saturator.next(right);
  68. outputs[R_OUTPUT].value = right;
  69. }
  70. else {
  71. outputs[L_OUTPUT].value = outputs[R_OUTPUT].value = mono;
  72. }
  73. }
  74. struct Mix8Widget : ModuleWidget {
  75. static constexpr int hp = 27;
  76. Mix8Widget(Mix8* module) : ModuleWidget(module) {
  77. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  78. {
  79. SVGPanel *panel = new SVGPanel();
  80. panel->box.size = box.size;
  81. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Mix8.svg")));
  82. addChild(panel);
  83. }
  84. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  85. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 0)));
  86. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  87. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 30, 365)));
  88. // generated by svg_widgets.rb
  89. auto level1ParamPosition = Vec(17.5, 32.0);
  90. auto mute1ParamPosition = Vec(17.2, 185.7);
  91. auto pan1ParamPosition = Vec(18.5, 223.0);
  92. auto level2ParamPosition = Vec(61.5, 32.0);
  93. auto mute2ParamPosition = Vec(61.2, 185.7);
  94. auto pan2ParamPosition = Vec(62.5, 223.0);
  95. auto level3ParamPosition = Vec(105.5, 32.0);
  96. auto mute3ParamPosition = Vec(105.2, 185.7);
  97. auto pan3ParamPosition = Vec(106.5, 223.0);
  98. auto level4ParamPosition = Vec(149.5, 32.0);
  99. auto mute4ParamPosition = Vec(149.2, 185.7);
  100. auto pan4ParamPosition = Vec(150.5, 223.0);
  101. auto level5ParamPosition = Vec(193.5, 32.0);
  102. auto mute5ParamPosition = Vec(193.2, 185.7);
  103. auto pan5ParamPosition = Vec(194.5, 223.0);
  104. auto level6ParamPosition = Vec(237.5, 32.0);
  105. auto mute6ParamPosition = Vec(237.2, 185.7);
  106. auto pan6ParamPosition = Vec(238.5, 223.0);
  107. auto level7ParamPosition = Vec(281.5, 32.0);
  108. auto mute7ParamPosition = Vec(281.2, 185.7);
  109. auto pan7ParamPosition = Vec(282.5, 223.0);
  110. auto level8ParamPosition = Vec(325.5, 32.0);
  111. auto mute8ParamPosition = Vec(325.2, 185.7);
  112. auto pan8ParamPosition = Vec(326.5, 223.0);
  113. auto mixParamPosition = Vec(369.5, 32.0);
  114. auto cv1InputPosition = Vec(14.5, 255.0);
  115. auto pan1InputPosition = Vec(14.5, 290.0);
  116. auto in1InputPosition = Vec(14.5, 325.0);
  117. auto cv2InputPosition = Vec(58.5, 255.0);
  118. auto pan2InputPosition = Vec(58.5, 290.0);
  119. auto in2InputPosition = Vec(58.5, 325.0);
  120. auto cv3InputPosition = Vec(102.5, 255.0);
  121. auto pan3InputPosition = Vec(102.5, 290.0);
  122. auto in3InputPosition = Vec(102.5, 325.0);
  123. auto cv4InputPosition = Vec(146.5, 255.0);
  124. auto pan4InputPosition = Vec(146.5, 290.0);
  125. auto in4InputPosition = Vec(146.5, 325.0);
  126. auto cv5InputPosition = Vec(190.5, 255.0);
  127. auto pan5InputPosition = Vec(190.5, 290.0);
  128. auto in5InputPosition = Vec(190.5, 325.0);
  129. auto cv6InputPosition = Vec(234.5, 255.0);
  130. auto pan6InputPosition = Vec(234.5, 290.0);
  131. auto in6InputPosition = Vec(234.5, 325.0);
  132. auto cv7InputPosition = Vec(278.5, 255.0);
  133. auto pan7InputPosition = Vec(278.5, 290.0);
  134. auto in7InputPosition = Vec(278.5, 325.0);
  135. auto cv8InputPosition = Vec(322.5, 255.0);
  136. auto pan8InputPosition = Vec(322.5, 290.0);
  137. auto in8InputPosition = Vec(322.5, 325.0);
  138. auto mixCvInputPosition = Vec(366.5, 252.0);
  139. auto lOutputPosition = Vec(366.5, 290.0);
  140. auto rOutputPosition = Vec(366.5, 325.0);
  141. // end generated by svg_widgets.rb
  142. addSlider(level1ParamPosition, module, Mix8::LEVEL1_PARAM, module->_channel1.rms);
  143. addParam(ParamWidget::create<MuteButton>(mute1ParamPosition, module, Mix8::MUTE1_PARAM, 0.0, 1.0, 0.0));
  144. addParam(ParamWidget::create<Knob16>(pan1ParamPosition, module, Mix8::PAN1_PARAM, -1.0, 1.0, 0.0));
  145. addSlider(level2ParamPosition, module, Mix8::LEVEL2_PARAM, module->_channel2.rms);
  146. addParam(ParamWidget::create<MuteButton>(mute2ParamPosition, module, Mix8::MUTE2_PARAM, 0.0, 1.0, 0.0));
  147. addParam(ParamWidget::create<Knob16>(pan2ParamPosition, module, Mix8::PAN2_PARAM, -1.0, 1.0, 0.0));
  148. addSlider(level3ParamPosition, module, Mix8::LEVEL3_PARAM, module->_channel3.rms);
  149. addParam(ParamWidget::create<MuteButton>(mute3ParamPosition, module, Mix8::MUTE3_PARAM, 0.0, 1.0, 0.0));
  150. addParam(ParamWidget::create<Knob16>(pan3ParamPosition, module, Mix8::PAN3_PARAM, -1.0, 1.0, 0.0));
  151. addSlider(level4ParamPosition, module, Mix8::LEVEL4_PARAM, module->_channel4.rms);
  152. addParam(ParamWidget::create<MuteButton>(mute4ParamPosition, module, Mix8::MUTE4_PARAM, 0.0, 1.0, 0.0));
  153. addParam(ParamWidget::create<Knob16>(pan4ParamPosition, module, Mix8::PAN4_PARAM, -1.0, 1.0, 0.0));
  154. addSlider(level5ParamPosition, module, Mix8::LEVEL5_PARAM, module->_channel5.rms);
  155. addParam(ParamWidget::create<MuteButton>(mute5ParamPosition, module, Mix8::MUTE5_PARAM, 0.0, 1.0, 0.0));
  156. addParam(ParamWidget::create<Knob16>(pan5ParamPosition, module, Mix8::PAN5_PARAM, -1.0, 1.0, 0.0));
  157. addSlider(level6ParamPosition, module, Mix8::LEVEL6_PARAM, module->_channel6.rms);
  158. addParam(ParamWidget::create<MuteButton>(mute6ParamPosition, module, Mix8::MUTE6_PARAM, 0.0, 1.0, 0.0));
  159. addParam(ParamWidget::create<Knob16>(pan6ParamPosition, module, Mix8::PAN6_PARAM, -1.0, 1.0, 0.0));
  160. addSlider(level7ParamPosition, module, Mix8::LEVEL7_PARAM, module->_channel7.rms);
  161. addParam(ParamWidget::create<MuteButton>(mute7ParamPosition, module, Mix8::MUTE7_PARAM, 0.0, 1.0, 0.0));
  162. addParam(ParamWidget::create<Knob16>(pan7ParamPosition, module, Mix8::PAN7_PARAM, -1.0, 1.0, 0.0));
  163. addSlider(level8ParamPosition, module, Mix8::LEVEL8_PARAM, module->_channel8.rms);
  164. addParam(ParamWidget::create<MuteButton>(mute8ParamPosition, module, Mix8::MUTE8_PARAM, 0.0, 1.0, 0.0));
  165. addParam(ParamWidget::create<Knob16>(pan8ParamPosition, module, Mix8::PAN8_PARAM, -1.0, 1.0, 0.0));
  166. addSlider(mixParamPosition, module, Mix8::MIX_PARAM, module->_rmsLevel);
  167. addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, Mix8::CV1_INPUT));
  168. addInput(Port::create<Port24>(pan1InputPosition, Port::INPUT, module, Mix8::PAN1_INPUT));
  169. addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, Mix8::IN1_INPUT));
  170. addInput(Port::create<Port24>(cv2InputPosition, Port::INPUT, module, Mix8::CV2_INPUT));
  171. addInput(Port::create<Port24>(pan2InputPosition, Port::INPUT, module, Mix8::PAN2_INPUT));
  172. addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, Mix8::IN2_INPUT));
  173. addInput(Port::create<Port24>(cv3InputPosition, Port::INPUT, module, Mix8::CV3_INPUT));
  174. addInput(Port::create<Port24>(pan3InputPosition, Port::INPUT, module, Mix8::PAN3_INPUT));
  175. addInput(Port::create<Port24>(in3InputPosition, Port::INPUT, module, Mix8::IN3_INPUT));
  176. addInput(Port::create<Port24>(cv4InputPosition, Port::INPUT, module, Mix8::CV4_INPUT));
  177. addInput(Port::create<Port24>(pan4InputPosition, Port::INPUT, module, Mix8::PAN4_INPUT));
  178. addInput(Port::create<Port24>(in4InputPosition, Port::INPUT, module, Mix8::IN4_INPUT));
  179. addInput(Port::create<Port24>(cv5InputPosition, Port::INPUT, module, Mix8::CV5_INPUT));
  180. addInput(Port::create<Port24>(pan5InputPosition, Port::INPUT, module, Mix8::PAN5_INPUT));
  181. addInput(Port::create<Port24>(in5InputPosition, Port::INPUT, module, Mix8::IN5_INPUT));
  182. addInput(Port::create<Port24>(cv6InputPosition, Port::INPUT, module, Mix8::CV6_INPUT));
  183. addInput(Port::create<Port24>(pan6InputPosition, Port::INPUT, module, Mix8::PAN6_INPUT));
  184. addInput(Port::create<Port24>(in6InputPosition, Port::INPUT, module, Mix8::IN6_INPUT));
  185. addInput(Port::create<Port24>(cv7InputPosition, Port::INPUT, module, Mix8::CV7_INPUT));
  186. addInput(Port::create<Port24>(pan7InputPosition, Port::INPUT, module, Mix8::PAN7_INPUT));
  187. addInput(Port::create<Port24>(in7InputPosition, Port::INPUT, module, Mix8::IN7_INPUT));
  188. addInput(Port::create<Port24>(cv8InputPosition, Port::INPUT, module, Mix8::CV8_INPUT));
  189. addInput(Port::create<Port24>(pan8InputPosition, Port::INPUT, module, Mix8::PAN8_INPUT));
  190. addInput(Port::create<Port24>(in8InputPosition, Port::INPUT, module, Mix8::IN8_INPUT));
  191. addInput(Port::create<Port24>(mixCvInputPosition, Port::INPUT, module, Mix8::MIX_CV_INPUT));
  192. addOutput(Port::create<Port24>(lOutputPosition, Port::OUTPUT, module, Mix8::L_OUTPUT));
  193. addOutput(Port::create<Port24>(rOutputPosition, Port::OUTPUT, module, Mix8::R_OUTPUT));
  194. }
  195. void addSlider(Vec position, Mix8* module, int id, float& rms) {
  196. auto slider = ParamWidget::create<VUSlider151>(
  197. position,
  198. module,
  199. id,
  200. 0.0,
  201. 1.0,
  202. abs(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels)
  203. );
  204. dynamic_cast<VUSlider*>(slider)->setVULevel(&rms);
  205. addParam(slider);
  206. }
  207. };
  208. RACK_PLUGIN_MODEL_INIT(Bogaudio, Mix8) {
  209. Model *modelMix8 = createModel<Mix8, Mix8Widget>("Bogaudio-Mix8", "Mix8", "8-channel mixer and panner", MIXER_TAG, PANNING_TAG);
  210. return modelMix8;
  211. }