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.

86 lines
3.9KB

  1. #include "plugin.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() {
  20. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
  21. params[MIX_LVL_PARAM].config(0.0, 2.0, 1.0, "Master level", "%", 0, 100);
  22. params[LVL_PARAM + 0].config(0.0, 1.0, 1.0, "Ch 1 level", "%", 0, 100);
  23. params[LVL_PARAM + 1].config(0.0, 1.0, 1.0, "Ch 2 level", "%", 0, 100);
  24. params[LVL_PARAM + 2].config(0.0, 1.0, 1.0, "Ch 3 level", "%", 0, 100);
  25. params[LVL_PARAM + 3].config(0.0, 1.0, 1.0, "Ch 4 level", "%", 0, 100);
  26. }
  27. void process(const ProcessArgs &args) override {
  28. float mix = 0.f;
  29. for (int i = 0; i < 4; i++) {
  30. float ch = inputs[CH_INPUT + i].getVoltage();
  31. ch *= std::pow(params[LVL_PARAM + i].getValue(), 2.f);
  32. if (inputs[CV_INPUT + i].isConnected())
  33. ch *= clamp(inputs[CV_INPUT + i].getVoltage() / 10.f, 0.f, 1.f);
  34. outputs[CH_OUTPUT + i].setVoltage(ch);
  35. mix += ch;
  36. }
  37. mix *= params[MIX_LVL_PARAM].getValue();
  38. if (inputs[MIX_CV_INPUT].isConnected())
  39. mix *= clamp(inputs[MIX_CV_INPUT].getVoltage() / 10.f, 0.f, 1.f);
  40. outputs[MIX_OUTPUT].setVoltage(mix);
  41. }
  42. };
  43. struct VCMixerWidget : ModuleWidget {
  44. VCMixerWidget(VCMixer *module) {
  45. setModule(module);
  46. setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/VCMixer.svg")));
  47. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  48. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  49. addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  50. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  51. addParam(createParam<RoundLargeBlackKnob>(mm2px(Vec(19.049999, 21.161154)), module, VCMixer::MIX_LVL_PARAM));
  52. addParam(createParam<LEDSliderGreen>(mm2px(Vec(5.8993969, 44.33149).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 0));
  53. addParam(createParam<LEDSliderGreen>(mm2px(Vec(17.899343, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 1));
  54. addParam(createParam<LEDSliderGreen>(mm2px(Vec(29.899292, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 2));
  55. addParam(createParam<LEDSliderGreen>(mm2px(Vec(41.90065, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 3));
  56. // Use old interleaved order for backward compatibility with <0.6
  57. addInput(createInput<PJ301MPort>(mm2px(Vec(3.2935331, 23.404598)), module, VCMixer::MIX_CV_INPUT));
  58. addInput(createInput<PJ301MPort>(mm2px(Vec(3.2935331, 78.531639)), module, VCMixer::CH_INPUT + 0));
  59. addInput(createInput<PJ301MPort>(mm2px(Vec(3.2935331, 93.531586)), module, VCMixer::CV_INPUT + 0));
  60. addInput(createInput<PJ301MPort>(mm2px(Vec(15.29348, 78.531639)), module, VCMixer::CH_INPUT + 1));
  61. addInput(createInput<PJ301MPort>(mm2px(Vec(15.29348, 93.531586)), module, VCMixer::CV_INPUT + 1));
  62. addInput(createInput<PJ301MPort>(mm2px(Vec(27.293465, 78.531639)), module, VCMixer::CH_INPUT + 2));
  63. addInput(createInput<PJ301MPort>(mm2px(Vec(27.293465, 93.531586)), module, VCMixer::CV_INPUT + 2));
  64. addInput(createInput<PJ301MPort>(mm2px(Vec(39.293411, 78.531639)), module, VCMixer::CH_INPUT + 3));
  65. addInput(createInput<PJ301MPort>(mm2px(Vec(39.293411, 93.531586)), module, VCMixer::CV_INPUT + 3));
  66. addOutput(createOutput<PJ301MPort>(mm2px(Vec(39.293411, 23.4046)), module, VCMixer::MIX_OUTPUT));
  67. addOutput(createOutput<PJ301MPort>(mm2px(Vec(3.2935331, 108.53153)), module, VCMixer::CH_OUTPUT + 0));
  68. addOutput(createOutput<PJ301MPort>(mm2px(Vec(15.29348, 108.53153)), module, VCMixer::CH_OUTPUT + 1));
  69. addOutput(createOutput<PJ301MPort>(mm2px(Vec(27.293465, 108.53153)), module, VCMixer::CH_OUTPUT + 2));
  70. addOutput(createOutput<PJ301MPort>(mm2px(Vec(39.293411, 108.53153)), module, VCMixer::CH_OUTPUT + 3));
  71. }
  72. };
  73. Model *modelVCMixer = createModel<VCMixer, VCMixerWidget>("VCMixer");