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.

109 lines
4.4KB

  1. #include "VCM.hpp"
  2. void VCM::step() {
  3. bool linear = params[LINEAR_PARAM].value > 0.5f;
  4. lights[LINEAR_LIGHT].value = linear;
  5. if (outputs[MIX_OUTPUT].active) {
  6. float out = channelStep(inputs[IN1_INPUT], params[LEVEL1_PARAM], inputs[CV1_INPUT], _amplifier1, linear);
  7. out += channelStep(inputs[IN2_INPUT], params[LEVEL2_PARAM], inputs[CV2_INPUT], _amplifier2, linear);
  8. out += channelStep(inputs[IN3_INPUT], params[LEVEL3_PARAM], inputs[CV3_INPUT], _amplifier3, linear);
  9. out += channelStep(inputs[IN4_INPUT], params[LEVEL4_PARAM], inputs[CV4_INPUT], _amplifier4, linear);
  10. float level = params[MIX_PARAM].value;
  11. if (inputs[MIX_CV_INPUT].active) {
  12. level *= clamp(inputs[MIX_CV_INPUT].value / 10.0f, 0.0f, 1.0f);
  13. }
  14. out *= level;
  15. if (!_disableOutputLimit) {
  16. out = clamp(out, -12.0f, 12.0f);
  17. }
  18. outputs[MIX_OUTPUT].value = level * out;
  19. }
  20. }
  21. float VCM::channelStep(Input& input, Param& knob, Input& cv, Amplifier& amplifier, bool linear) {
  22. if (!input.active) {
  23. return 0.0f;
  24. }
  25. float level = knob.value;
  26. if (cv.active) {
  27. level *= clamp(cv.value / 10.0f, 0.0f, 1.0f);
  28. }
  29. if (linear) {
  30. return level * input.value;
  31. }
  32. level = 1.0f - level;
  33. level *= Amplifier::minDecibels;
  34. amplifier.setLevel(level);
  35. return amplifier.next(input.value);
  36. }
  37. struct VCMWidget : DisableOutputLimitModuleWidget {
  38. static constexpr int hp = 10;
  39. VCMWidget(VCM* module) : DisableOutputLimitModuleWidget(module) {
  40. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  41. {
  42. SVGPanel *panel = new SVGPanel();
  43. panel->box.size = box.size;
  44. panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCM.svg")));
  45. addChild(panel);
  46. }
  47. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  48. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 0)));
  49. addChild(Widget::create<ScrewSilver>(Vec(0, 365)));
  50. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  51. // generated by svg_widgets.rb
  52. auto level1ParamPosition = Vec(89.5, 35.5);
  53. auto level2ParamPosition = Vec(89.5, 99.5);
  54. auto level3ParamPosition = Vec(89.5, 163.5);
  55. auto level4ParamPosition = Vec(89.5, 228.5);
  56. auto mixParamPosition = Vec(22.5, 293.5);
  57. auto linearParamPosition = Vec(95.0, 342.7);
  58. auto in1InputPosition = Vec(14.0, 37.0);
  59. auto cv1InputPosition = Vec(45.0, 37.0);
  60. auto in2InputPosition = Vec(14.0, 101.0);
  61. auto cv2InputPosition = Vec(45.0, 101.0);
  62. auto in3InputPosition = Vec(14.0, 165.0);
  63. auto cv3InputPosition = Vec(45.0, 165.0);
  64. auto in4InputPosition = Vec(14.0, 230.0);
  65. auto cv4InputPosition = Vec(45.0, 230.0);
  66. auto mixCvInputPosition = Vec(81.0, 294.0);
  67. auto mixOutputPosition = Vec(112.0, 294.0);
  68. auto linearLightPosition = Vec(46.0, 344.0);
  69. // end generated by svg_widgets.rb
  70. addParam(ParamWidget::create<Knob38>(level1ParamPosition, module, VCM::LEVEL1_PARAM, 0.0, 1.0, 0.8));
  71. addParam(ParamWidget::create<Knob38>(level2ParamPosition, module, VCM::LEVEL2_PARAM, 0.0, 1.0, 0.8));
  72. addParam(ParamWidget::create<Knob38>(level3ParamPosition, module, VCM::LEVEL3_PARAM, 0.0, 1.0, 0.8));
  73. addParam(ParamWidget::create<Knob38>(level4ParamPosition, module, VCM::LEVEL4_PARAM, 0.0, 1.0, 0.8));
  74. addParam(ParamWidget::create<Knob38>(mixParamPosition, module, VCM::MIX_PARAM, 0.0, 1.0, 0.8));
  75. addParam(ParamWidget::create<StatefulButton9>(linearParamPosition, module, VCM::LINEAR_PARAM, 0.0, 1.0, 0.0));
  76. addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, VCM::IN1_INPUT));
  77. addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, VCM::CV1_INPUT));
  78. addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, VCM::IN2_INPUT));
  79. addInput(Port::create<Port24>(cv2InputPosition, Port::INPUT, module, VCM::CV2_INPUT));
  80. addInput(Port::create<Port24>(in3InputPosition, Port::INPUT, module, VCM::IN3_INPUT));
  81. addInput(Port::create<Port24>(cv3InputPosition, Port::INPUT, module, VCM::CV3_INPUT));
  82. addInput(Port::create<Port24>(in4InputPosition, Port::INPUT, module, VCM::IN4_INPUT));
  83. addInput(Port::create<Port24>(cv4InputPosition, Port::INPUT, module, VCM::CV4_INPUT));
  84. addInput(Port::create<Port24>(mixCvInputPosition, Port::INPUT, module, VCM::MIX_CV_INPUT));
  85. addOutput(Port::create<Port24>(mixOutputPosition, Port::OUTPUT, module, VCM::MIX_OUTPUT));
  86. addChild(ModuleLightWidget::create<SmallLight<GreenLight>>(linearLightPosition, module, VCM::LINEAR_LIGHT));
  87. }
  88. };
  89. RACK_PLUGIN_MODEL_INIT(Bogaudio, VCM) {
  90. Model *modelVCM = createModel<VCM, VCMWidget>("Bogaudio-VCM", "VCM", "4-channel mixer", MIXER_TAG);
  91. return modelVCM;
  92. }