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.

99 lines
4.2KB

  1. #include "QuantalAudio.hpp"
  2. namespace rack_plugin_QuantalAudio {
  3. struct MasterMixer : Module {
  4. enum ParamIds {
  5. MIX_LVL_PARAM,
  6. MONO_PARAM,
  7. ENUMS(LVL_PARAM, 2),
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. MIX_CV_INPUT,
  12. ENUMS(CH_INPUT, 2),
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. MIX_OUTPUT,
  17. MIX_OUTPUT_2,
  18. ENUMS(CH_OUTPUT, 2),
  19. NUM_OUTPUTS
  20. };
  21. MasterMixer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  22. void step() override {
  23. float mix = 0.f;
  24. for (int i = 0; i < 2; i++) {
  25. float ch = inputs[CH_INPUT + i].value;
  26. ch *= powf(params[LVL_PARAM + i].value, 2.f);
  27. outputs[CH_OUTPUT + i].value = ch;
  28. mix += ch;
  29. }
  30. mix *= params[MIX_LVL_PARAM].value;
  31. bool is_mono = (params[MONO_PARAM].value > 0.0f);
  32. float mix_cv = 1.f;
  33. if (inputs[MIX_CV_INPUT].active)
  34. mix_cv = clamp(inputs[MIX_CV_INPUT].value / 10.f, 0.f, 1.f);
  35. if (!is_mono && (inputs[CH_INPUT + 0].active && inputs[CH_INPUT + 1].active)) {
  36. // If the ch 2 jack is active use stereo mode
  37. float attenuate = params[MIX_LVL_PARAM].value * mix_cv;
  38. outputs[MIX_OUTPUT].value = outputs[CH_OUTPUT + 0].value * attenuate;
  39. outputs[MIX_OUTPUT_2].value = outputs[CH_OUTPUT + 1].value * attenuate;
  40. } else {
  41. // Otherwise use mono->stereo mode
  42. mix *= mix_cv;
  43. outputs[MIX_OUTPUT].value = mix;
  44. outputs[MIX_OUTPUT_2].value = mix;
  45. }
  46. }
  47. };
  48. struct MasterMixerWidget : ModuleWidget {
  49. MasterMixerWidget(MasterMixer *module) : ModuleWidget(module) {
  50. setPanel(SVG::load(assetPlugin(plugin, "res/MasterMixer.svg")));
  51. // Screws
  52. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  53. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  54. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  55. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  56. // Level & CV
  57. addParam(ParamWidget::create<RoundLargeBlackKnob>(Vec(RACK_GRID_WIDTH * 2.5 - (38.0/2), 52.0), module, MasterMixer::MIX_LVL_PARAM, 0.0, 2.0, 1.0));
  58. addInput(Port::create<PJ301MPort>(Vec(RACK_GRID_WIDTH * 2.5 - (25.0/2), 96.0), Port::INPUT, module, MasterMixer::MIX_CV_INPUT));
  59. // Mono/stereo switch
  60. addParam(ParamWidget::create<CKSS>(Vec(RACK_GRID_WIDTH * 2.5 - 7.0, 162.0), module, MasterMixer::MONO_PARAM, 0.0f, 1.0f, 1.0f));
  61. // LEDs
  62. addParam(ParamWidget::create<LEDSliderGreen>(Vec(RACK_GRID_WIDTH * 2.5 - (21.0 + 7.0), 130.4), module, MasterMixer::LVL_PARAM + 0, 0.0, 1.0, 1.0));
  63. addParam(ParamWidget::create<LEDSliderGreen>(Vec(RACK_GRID_WIDTH * 2.5 + 7.0, 130.4), module, MasterMixer::LVL_PARAM + 1, 0.0, 1.0, 1.0));
  64. // Channel inputs
  65. addInput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 2.5) - (25.0 + 5.0), 232.0), Port::INPUT, module, MasterMixer::CH_INPUT + 0));
  66. addInput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 2.5) + 5.0, 232.0), Port::INPUT, module, MasterMixer::CH_INPUT + 1));
  67. // Channel outputs
  68. addOutput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 2.5) - (25.0 + 5.0), 276.0), Port::OUTPUT, module, MasterMixer::CH_OUTPUT + 0));
  69. addOutput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 2.5) + 5.0, 276.0), Port::OUTPUT, module, MasterMixer::CH_OUTPUT + 1));
  70. // Mix outputs
  71. addOutput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 2.5) - (25.0 + 5.0), 320.0), Port::OUTPUT, module, MasterMixer::MIX_OUTPUT));
  72. addOutput(Port::create<PJ301MPort>(Vec((RACK_GRID_WIDTH * 2.5) + 5.0, 320.0), Port::OUTPUT, module, MasterMixer::MIX_OUTPUT_2));
  73. }
  74. };
  75. } // namespace rack_plugin_QuantalAudio
  76. using namespace rack_plugin_QuantalAudio;
  77. RACK_PLUGIN_MODEL_INIT(QuantalAudio, MasterMixer) {
  78. Model *modelMasterMixer = Model::create<MasterMixer, MasterMixerWidget>("QuantalAudio", "Mixer2", "Mixer 2 | Mono->Stereo | 5HP", MIXER_TAG, AMPLIFIER_TAG);
  79. return modelMasterMixer;
  80. }