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.

117 lines
4.1KB

  1. ///////////////////////////////////////////////////
  2. //
  3. // Sub Mixer VCV Module
  4. // Built from fundamental VCMixer
  5. //
  6. // Strum 2017
  7. //
  8. ///////////////////////////////////////////////////
  9. #include "mental.hpp"
  10. namespace rack_plugin_mental {
  11. struct MentalSubMixer : Module {
  12. enum ParamIds {
  13. MIX_PARAM,
  14. CH_VOL_PARAM,
  15. CH_PAN_PARAM = CH_VOL_PARAM + 4,
  16. NUM_PARAMS = CH_PAN_PARAM + 4
  17. };
  18. enum InputIds {
  19. MIX_CV_INPUT,
  20. CH_INPUT,
  21. CH_VOL_INPUT = CH_INPUT + 4,
  22. CH_PAN_INPUT = CH_VOL_INPUT + 4,
  23. NUM_INPUTS = CH_PAN_INPUT + 4
  24. };
  25. enum OutputIds {
  26. MIX_OUTPUT_L, MIX_OUTPUT_R,
  27. CH_OUTPUT,
  28. NUM_OUTPUTS = CH_OUTPUT + 4
  29. };
  30. float channel_ins[4];
  31. float pan_cv_ins[4];
  32. float pan_positions[4];
  33. float channel_outs_l[4];
  34. float channel_outs_r[4];
  35. float left_sum = 0.0;
  36. float right_sum = 0.0;
  37. MentalSubMixer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {};
  38. void step() override;
  39. };
  40. void MentalSubMixer::step() {
  41. left_sum = 0.0;
  42. right_sum = 0.0;
  43. for (int i = 0 ; i < 4 ; i++) {
  44. channel_ins[i] = inputs[CH_INPUT + i].value * params[CH_VOL_PARAM + i].value * clamp(inputs[CH_VOL_INPUT + i].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  45. pan_cv_ins[i] = inputs[CH_PAN_INPUT + i].value/5;
  46. pan_positions[i] = pan_cv_ins[i] + params[CH_PAN_PARAM + i].value;
  47. if (pan_positions[i] < 0) pan_positions[i] = 0;
  48. if (pan_positions[i] > 1) pan_positions[i] = 1;
  49. channel_outs_l[i]= channel_ins[i] * (1-pan_positions[i])* 2;
  50. channel_outs_r[i]= channel_ins[i] * pan_positions[i] * 2;
  51. left_sum += channel_outs_l[i];
  52. right_sum += channel_outs_r[i];
  53. }
  54. float mix_l = left_sum * params[MIX_PARAM].value * clamp(inputs[MIX_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  55. float mix_r = right_sum * params[MIX_PARAM].value * clamp(inputs[MIX_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f);
  56. outputs[MIX_OUTPUT_L].value = mix_l;
  57. outputs[MIX_OUTPUT_R].value = mix_r;
  58. outputs[CH_OUTPUT ].value = channel_ins[0];
  59. outputs[CH_OUTPUT + 1].value = channel_ins[1];
  60. outputs[CH_OUTPUT + 2].value = channel_ins[2];
  61. outputs[CH_OUTPUT + 3].value = channel_ins[3];
  62. }
  63. ////////////////////////////////////////////////////////////
  64. struct MentalSubMixerWidget : ModuleWidget {
  65. MentalSubMixerWidget(MentalSubMixer *module);
  66. };
  67. MentalSubMixerWidget::MentalSubMixerWidget(MentalSubMixer *module) : ModuleWidget(module)
  68. {
  69. setPanel(SVG::load(assetPlugin(plugin, "res/MentalSubMixer.svg")));
  70. int stripwidth = 28;
  71. // master section
  72. addOutput(Port::create<OutPort>(Vec( 6 + stripwidth, 20), Port::OUTPUT, module, MentalSubMixer::MIX_OUTPUT_L));
  73. addOutput(Port::create<OutPort>(Vec( 6 + stripwidth * 2 , 20), Port::OUTPUT, module, MentalSubMixer::MIX_OUTPUT_R));
  74. addParam(ParamWidget::create<LrgKnob>(Vec( 9 + stripwidth , 50), module, MentalSubMixer::MIX_PARAM, 0.0, 1.0, 0.5));
  75. addInput(Port::create<CVInPort>(Vec( 6 + stripwidth * 1.5 , 100), Port::INPUT, module, MentalSubMixer::MIX_CV_INPUT));
  76. // channel strips
  77. for (int i = 0 ; i < 4 ; i++) {
  78. // input
  79. addInput(Port::create<InPort>(Vec( 6 + stripwidth * i , box.size.y - 182 ), Port::INPUT, module, MentalSubMixer::CH_INPUT + i));
  80. // gain
  81. addParam(ParamWidget::create<SmlKnob>(Vec( 9 + stripwidth * i , box.size.y - 148 ), module, MentalSubMixer::CH_VOL_PARAM + i, 0.0, 1.0, 0.0));
  82. addInput(Port::create<CVInPort>(Vec( 6 + stripwidth * i , box.size.y - 126 ), Port::INPUT, module, MentalSubMixer::CH_VOL_INPUT + i));
  83. // pan
  84. addParam(ParamWidget::create<SmlKnob>(Vec( 9 + stripwidth * i , box.size.y - 92 ), module, MentalSubMixer::CH_PAN_PARAM + i, 0.0, 1.0, 0.5));
  85. addInput(Port::create<CVInPort>(Vec( 6 + stripwidth * i , box.size.y - 70 ), Port::INPUT, module, MentalSubMixer::CH_PAN_INPUT + i));
  86. // output
  87. addOutput(Port::create<OutPort>(Vec( 6 + stripwidth * i , box.size.y - 40 ), Port::OUTPUT, module, MentalSubMixer::CH_OUTPUT + i));
  88. }
  89. }
  90. } // namespace rack_plugin_mental
  91. using namespace rack_plugin_mental;
  92. RACK_PLUGIN_MODEL_INIT(mental, MentalSubMixer) {
  93. Model *modelMentalSubMixer = Model::create<MentalSubMixer, MentalSubMixerWidget>("mental", "MentalSubMixer", "Sub Mixer", MIXER_TAG);
  94. return modelMentalSubMixer;
  95. }