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.

76 lines
2.2KB

  1. #include "Fundamental.hpp"
  2. struct VCA : Module {
  3. enum ParamIds {
  4. LEVEL1_PARAM,
  5. LEVEL2_PARAM,
  6. NUM_PARAMS
  7. };
  8. enum InputIds {
  9. EXP1_INPUT,
  10. LIN1_INPUT,
  11. IN1_INPUT,
  12. EXP2_INPUT,
  13. LIN2_INPUT,
  14. IN2_INPUT,
  15. NUM_INPUTS
  16. };
  17. enum OutputIds {
  18. OUT1_OUTPUT,
  19. OUT2_OUTPUT,
  20. NUM_OUTPUTS
  21. };
  22. VCA() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  23. void step() override;
  24. };
  25. static void stepChannel(Input &in, Param &level, Input &lin, Input &exp, Output &out) {
  26. float v = in.value * level.value;
  27. if (lin.active)
  28. v *= clampf(lin.value / 10.0, 0.0, 1.0);
  29. const float expBase = 50.0;
  30. if (exp.active)
  31. v *= rescalef(powf(expBase, clampf(exp.value / 10.0, 0.0, 1.0)), 1.0, expBase, 0.0, 1.0);
  32. out.value = v;
  33. }
  34. void VCA::step() {
  35. stepChannel(inputs[IN1_INPUT], params[LEVEL1_PARAM], inputs[LIN1_INPUT], inputs[EXP1_INPUT], outputs[OUT1_OUTPUT]);
  36. stepChannel(inputs[IN2_INPUT], params[LEVEL2_PARAM], inputs[LIN2_INPUT], inputs[EXP2_INPUT], outputs[OUT2_OUTPUT]);
  37. }
  38. VCAWidget::VCAWidget() {
  39. VCA *module = new VCA();
  40. setModule(module);
  41. box.size = Vec(15*6, 380);
  42. {
  43. SVGPanel *panel = new SVGPanel();
  44. panel->box.size = box.size;
  45. panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCA.svg")));
  46. addChild(panel);
  47. }
  48. addChild(createScrew<ScrewSilver>(Vec(15, 0)));
  49. addChild(createScrew<ScrewSilver>(Vec(box.size.x-30, 0)));
  50. addChild(createScrew<ScrewSilver>(Vec(15, 365)));
  51. addChild(createScrew<ScrewSilver>(Vec(box.size.x-30, 365)));
  52. addParam(createParam<RoundBlackKnob>(Vec(27, 57), module, VCA::LEVEL1_PARAM, 0.0, 1.0, 0.5));
  53. addParam(createParam<RoundBlackKnob>(Vec(27, 222), module, VCA::LEVEL2_PARAM, 0.0, 1.0, 0.5));
  54. addInput(createInput<PJ301MPort>(Vec(11, 113), module, VCA::EXP1_INPUT));
  55. addInput(createInput<PJ301MPort>(Vec(54, 113), module, VCA::LIN1_INPUT));
  56. addInput(createInput<PJ301MPort>(Vec(11, 156), module, VCA::IN1_INPUT));
  57. addInput(createInput<PJ301MPort>(Vec(11, 276), module, VCA::EXP2_INPUT));
  58. addInput(createInput<PJ301MPort>(Vec(54, 276), module, VCA::LIN2_INPUT));
  59. addInput(createInput<PJ301MPort>(Vec(11, 320), module, VCA::IN2_INPUT));
  60. addOutput(createOutput<PJ301MPort>(Vec(54, 156), module, VCA::OUT1_OUTPUT));
  61. addOutput(createOutput<PJ301MPort>(Vec(54, 320), module, VCA::OUT2_OUTPUT));
  62. }