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.

78 lines
3.8KB

  1. #include "Fundamental.hpp"
  2. struct VCMixer : Module {
  3. enum ParamIds {
  4. MIX_LVL_PARAM,
  5. ENUMS(LVL_PARAM, 4),
  6. NUM_PARAMS
  7. };
  8. enum InputIds {
  9. MIX_CV_INPUT,
  10. ENUMS(CH_INPUT, 4),
  11. ENUMS(CV_INPUT, 4),
  12. NUM_INPUTS
  13. };
  14. enum OutputIds {
  15. MIX_OUTPUT,
  16. ENUMS(CH_OUTPUT, 4),
  17. NUM_OUTPUTS
  18. };
  19. VCMixer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  20. void step() override {
  21. float mix = 0.f;
  22. for (int i = 0; i < 4; i++) {
  23. float ch = inputs[CH_INPUT + i].value;
  24. ch *= powf(params[LVL_PARAM + i].value, 2.f);
  25. if (inputs[CV_INPUT + i].active)
  26. ch *= clamp(inputs[CV_INPUT + i].value / 10.f, 0.f, 1.f);
  27. outputs[CH_OUTPUT + i].value = ch;
  28. mix += ch;
  29. }
  30. mix *= params[MIX_LVL_PARAM].value;
  31. if (inputs[MIX_CV_INPUT].active)
  32. mix *= clamp(inputs[MIX_CV_INPUT].value / 10.f, 0.f, 1.f);
  33. outputs[MIX_OUTPUT].value = mix;
  34. }
  35. };
  36. struct VCMixerWidget : ModuleWidget {
  37. VCMixerWidget(VCMixer *module) : ModuleWidget(module) {
  38. setPanel(SVG::load(assetPlugin(plugin, "res/VCMixer.svg")));
  39. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  40. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  41. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  42. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  43. addParam(ParamWidget::create<RoundLargeBlackKnob>(mm2px(Vec(19.049999, 21.161154)), module, VCMixer::MIX_LVL_PARAM, 0.0, 2.0, 1.0));
  44. addParam(ParamWidget::create<LEDSliderGreen>(mm2px(Vec(5.8993969, 44.33149).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 0, 0.0, 1.0, 1.0));
  45. addParam(ParamWidget::create<LEDSliderGreen>(mm2px(Vec(17.899343, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 1, 0.0, 1.0, 1.0));
  46. addParam(ParamWidget::create<LEDSliderGreen>(mm2px(Vec(29.899292, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 2, 0.0, 1.0, 1.0));
  47. addParam(ParamWidget::create<LEDSliderGreen>(mm2px(Vec(41.90065, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 3, 0.0, 1.0, 1.0));
  48. // Use old interleaved order for backward compatibility with <0.6
  49. addInput(Port::create<PJ301MPort>(mm2px(Vec(3.2935331, 23.404598)), Port::INPUT, module, VCMixer::MIX_CV_INPUT));
  50. addInput(Port::create<PJ301MPort>(mm2px(Vec(3.2935331, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 0));
  51. addInput(Port::create<PJ301MPort>(mm2px(Vec(3.2935331, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 0));
  52. addInput(Port::create<PJ301MPort>(mm2px(Vec(15.29348, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 1));
  53. addInput(Port::create<PJ301MPort>(mm2px(Vec(15.29348, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 1));
  54. addInput(Port::create<PJ301MPort>(mm2px(Vec(27.293465, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 2));
  55. addInput(Port::create<PJ301MPort>(mm2px(Vec(27.293465, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 2));
  56. addInput(Port::create<PJ301MPort>(mm2px(Vec(39.293411, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 3));
  57. addInput(Port::create<PJ301MPort>(mm2px(Vec(39.293411, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 3));
  58. addOutput(Port::create<PJ301MPort>(mm2px(Vec(39.293411, 23.4046)), Port::OUTPUT, module, VCMixer::MIX_OUTPUT));
  59. addOutput(Port::create<PJ301MPort>(mm2px(Vec(3.2935331, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 0));
  60. addOutput(Port::create<PJ301MPort>(mm2px(Vec(15.29348, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 1));
  61. addOutput(Port::create<PJ301MPort>(mm2px(Vec(27.293465, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 2));
  62. addOutput(Port::create<PJ301MPort>(mm2px(Vec(39.293411, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 3));
  63. }
  64. };
  65. Model *modelVCMixer = Model::create<VCMixer, VCMixerWidget>("Fundamental", "VCMixer", "Mixer", MIXER_TAG, AMPLIFIER_TAG);