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.

104 lines
3.3KB

  1. //**************************************************************************************
  2. //VCA module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
  3. //
  4. //Code taken from the Fundamentals plugins by Andrew Belt http://www.vcvrack.com
  5. //**************************************************************************************
  6. #include "AS.hpp"
  7. namespace rack_plugin_AS {
  8. struct VCA : Module {
  9. enum ParamIds {
  10. LEVEL1_PARAM,
  11. LEVEL2_PARAM,
  12. MODE1_PARAM,
  13. MODE2_PARAM,
  14. NUM_PARAMS
  15. };
  16. enum InputIds {
  17. ENV1_INPUT,
  18. IN1_INPUT,
  19. ENV2_INPUT,
  20. IN2_INPUT,
  21. NUM_INPUTS
  22. };
  23. enum OutputIds {
  24. OUT1_OUTPUT,
  25. OUT2_OUTPUT,
  26. NUM_OUTPUTS
  27. };
  28. float v1= 0.0f;
  29. float v2= 0.0f;
  30. const float expBase = 50.0f;
  31. VCA() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
  32. void step() override;
  33. };
  34. void VCA::step() {
  35. //VCA 1
  36. v1 = inputs[IN1_INPUT].value * params[LEVEL1_PARAM].value;
  37. if(inputs[ENV1_INPUT].active){
  38. if(params[MODE1_PARAM].value==1){
  39. v1 *= clamp(inputs[ENV1_INPUT].value / 10.0f, 0.0f, 1.0f);
  40. }else{
  41. v1 *= rescale(powf(expBase, clamp(inputs[ENV1_INPUT].value / 10.0f, 0.0f, 1.0f)), 1.0f, expBase, 0.0f, 1.0f);
  42. }
  43. }
  44. outputs[OUT1_OUTPUT].value = v1;
  45. //VCA 2
  46. v2 = inputs[IN2_INPUT].value * params[LEVEL2_PARAM].value;
  47. if(inputs[ENV2_INPUT].active){
  48. if(params[MODE2_PARAM].value){
  49. v2 *= clamp(inputs[ENV2_INPUT].value / 10.0f, 0.0f, 1.0f);
  50. }else{
  51. v2 *= rescale(powf(expBase, clamp(inputs[ENV2_INPUT].value / 10.0f, 0.0f, 1.0f)), 1.0f, expBase, 0.0f, 1.0f);
  52. }
  53. }
  54. outputs[OUT2_OUTPUT].value = v2;
  55. }
  56. struct VCAWidget : ModuleWidget
  57. {
  58. VCAWidget(VCA *module);
  59. };
  60. VCAWidget::VCAWidget(VCA *module) : ModuleWidget(module) {
  61. setPanel(SVG::load(assetPlugin(plugin, "res/VCA.svg")));
  62. //SCREWS
  63. addChild(Widget::create<as_HexScrew>(Vec(RACK_GRID_WIDTH, 0)));
  64. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  65. addChild(Widget::create<as_HexScrew>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  66. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  67. //SLIDERS
  68. addParam(ParamWidget::create<as_SlidePot>(Vec(10, 70), module, VCA::LEVEL1_PARAM, 0.0f, 1.0f, 0.5f));
  69. addParam(ParamWidget::create<as_SlidePot>(Vec(55, 70), module, VCA::LEVEL2_PARAM, 0.0f, 1.0f, 0.5f));
  70. //MODE SWITCHES
  71. addParam(ParamWidget::create<as_CKSS>(Vec(14, 190), module, VCA::MODE1_PARAM, 0.0f, 1.0f, 1.0f));
  72. addParam(ParamWidget::create<as_CKSS>(Vec(59, 190), module, VCA::MODE2_PARAM, 0.0f, 1.0f, 1.0f));
  73. //PORTS
  74. addInput(Port::create<as_PJ301MPort>(Vec(10, 217), Port::INPUT, module, VCA::ENV1_INPUT));
  75. addInput(Port::create<as_PJ301MPort>(Vec(55, 217), Port::INPUT, module, VCA::ENV2_INPUT));
  76. addInput(Port::create<as_PJ301MPort>(Vec(10, 260), Port::INPUT, module, VCA::IN1_INPUT));
  77. addInput(Port::create<as_PJ301MPort>(Vec(55, 260), Port::INPUT, module, VCA::IN2_INPUT));
  78. addOutput(Port::create<as_PJ301MPort>(Vec(10, 310), Port::OUTPUT, module, VCA::OUT1_OUTPUT));
  79. addOutput(Port::create<as_PJ301MPort>(Vec(55, 310), Port::OUTPUT, module, VCA::OUT2_OUTPUT));
  80. }
  81. } // namespace rack_plugin_AS
  82. using namespace rack_plugin_AS;
  83. RACK_PLUGIN_MODEL_INIT(AS, VCA) {
  84. Model *modelVCA = Model::create<VCA, VCAWidget>("AS", "VCA", "VCA", AMPLIFIER_TAG);
  85. return modelVCA;
  86. }