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.

90 lines
2.9KB

  1. #include "Fundamental.hpp"
  2. struct VCMixer : Module {
  3. enum ParamIds {
  4. MIX_PARAM,
  5. CH1_PARAM,
  6. CH2_PARAM,
  7. CH3_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. MIX_CV_INPUT,
  12. CH1_INPUT,
  13. CH1_CV_INPUT,
  14. CH2_INPUT,
  15. CH2_CV_INPUT,
  16. CH3_INPUT,
  17. CH3_CV_INPUT,
  18. NUM_INPUTS
  19. };
  20. enum OutputIds {
  21. MIX_OUTPUT,
  22. CH1_OUTPUT,
  23. CH2_OUTPUT,
  24. CH3_OUTPUT,
  25. NUM_OUTPUTS
  26. };
  27. VCMixer();
  28. void step();
  29. };
  30. VCMixer::VCMixer() {
  31. params.resize(NUM_PARAMS);
  32. inputs.resize(NUM_INPUTS);
  33. outputs.resize(NUM_OUTPUTS);
  34. }
  35. void VCMixer::step() {
  36. float ch1 = getf(inputs[CH1_INPUT]) * params[CH1_PARAM] * clampf(getf(inputs[CH1_CV_INPUT], 10.0) / 10.0, 0.0, 1.0);
  37. float ch2 = getf(inputs[CH2_INPUT]) * params[CH2_PARAM] * clampf(getf(inputs[CH2_CV_INPUT], 10.0) / 10.0, 0.0, 1.0);
  38. float ch3 = getf(inputs[CH3_INPUT]) * params[CH3_PARAM] * clampf(getf(inputs[CH3_CV_INPUT], 10.0) / 10.0, 0.0, 1.0);
  39. float mix = (ch1 + ch2 + ch3) * params[MIX_PARAM] * getf(inputs[MIX_CV_INPUT], 10.0) / 10.0;
  40. setf(outputs[CH1_OUTPUT], ch1);
  41. setf(outputs[CH2_OUTPUT], ch2);
  42. setf(outputs[CH3_OUTPUT], ch3);
  43. setf(outputs[MIX_OUTPUT], mix);
  44. }
  45. VCMixerWidget::VCMixerWidget() {
  46. VCMixer *module = new VCMixer();
  47. setModule(module);
  48. box.size = Vec(15*10, 380);
  49. {
  50. SVGPanel *panel = new SVGPanel();
  51. panel->box.size = box.size;
  52. panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCMixer.svg")));
  53. addChild(panel);
  54. }
  55. addChild(createScrew<ScrewSilver>(Vec(15, 0)));
  56. addChild(createScrew<ScrewSilver>(Vec(box.size.x-30, 0)));
  57. addChild(createScrew<ScrewSilver>(Vec(15, 365)));
  58. addChild(createScrew<ScrewSilver>(Vec(box.size.x-30, 365)));
  59. addParam(createParam<Davies1900hLargeBlackKnob>(Vec(48, 55), module, VCMixer::MIX_PARAM, 0.0, 1.0, 0.5));
  60. addParam(createParam<Davies1900hBlackKnob>(Vec(57, 139), module, VCMixer::CH1_PARAM, 0.0, 1.0, 0.0));
  61. addParam(createParam<Davies1900hBlackKnob>(Vec(57, 219), module, VCMixer::CH2_PARAM, 0.0, 1.0, 0.0));
  62. addParam(createParam<Davies1900hBlackKnob>(Vec(57, 300), module, VCMixer::CH3_PARAM, 0.0, 1.0, 0.0));
  63. addInput(createInput<PJ301MPort>(Vec(16, 69), module, VCMixer::MIX_CV_INPUT));
  64. addInput(createInput<PJ301MPort>(Vec(22, 129), module, VCMixer::CH1_INPUT));
  65. addInput(createInput<PJ301MPort>(Vec(22, 160), module, VCMixer::CH1_CV_INPUT));
  66. addInput(createInput<PJ301MPort>(Vec(22, 209), module, VCMixer::CH2_INPUT));
  67. addInput(createInput<PJ301MPort>(Vec(22, 241), module, VCMixer::CH2_CV_INPUT));
  68. addInput(createInput<PJ301MPort>(Vec(22, 290), module, VCMixer::CH3_INPUT));
  69. addInput(createInput<PJ301MPort>(Vec(22, 322), module, VCMixer::CH3_CV_INPUT));
  70. addOutput(createOutput<PJ301MPort>(Vec(110, 69), module, VCMixer::MIX_OUTPUT));
  71. addOutput(createOutput<PJ301MPort>(Vec(110, 145), module, VCMixer::CH1_OUTPUT));
  72. addOutput(createOutput<PJ301MPort>(Vec(110, 225), module, VCMixer::CH2_OUTPUT));
  73. addOutput(createOutput<PJ301MPort>(Vec(110, 306), module, VCMixer::CH3_OUTPUT));
  74. }