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.

236 lines
11KB

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