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.

75 lines
2.2KB

  1. #include "VCAmp.hpp"
  2. #include "mixer.hpp"
  3. void VCAmp::onSampleRateChange() {
  4. float sampleRate = engineGetSampleRate();
  5. _levelSL.setParams(sampleRate, MixerChannel::levelSlewTimeMS, maxDecibels - minDecibels);
  6. _rms.setSampleRate(sampleRate);
  7. }
  8. void VCAmp::step() {
  9. if (inputs[IN_INPUT].active) {
  10. float level = params[LEVEL_PARAM].value;
  11. if (inputs[CV_INPUT].active) {
  12. level *= clamp(inputs[CV_INPUT].value, 0.0f, 10.0f) / 10.0f;
  13. }
  14. level *= maxDecibels - minDecibels;
  15. level += minDecibels;
  16. _amplifier.setLevel(_levelSL.next(level));
  17. outputs[OUT_OUTPUT].value = _saturator.next(_amplifier.next(inputs[IN_INPUT].value));
  18. _rmsLevel = _rms.next(outputs[OUT_OUTPUT].value / 5.0f);
  19. }
  20. else {
  21. _rmsLevel = _rms.next(0.0f);
  22. }
  23. }
  24. struct VCAmpWidget : ModuleWidget {
  25. static constexpr int hp = 3;
  26. VCAmpWidget(VCAmp* module) : ModuleWidget(module) {
  27. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  28. {
  29. SVGPanel *panel = new SVGPanel();
  30. panel->box.size = box.size;
  31. panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCAmp.svg")));
  32. addChild(panel);
  33. }
  34. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  35. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  36. // generated by svg_widgets.rb
  37. auto levelParamPosition = Vec(13.5, 18.0);
  38. auto cvInputPosition = Vec(10.5, 213.0);
  39. auto inInputPosition = Vec(10.5, 248.0);
  40. auto outOutputPosition = Vec(10.5, 286.0);
  41. // end generated by svg_widgets.rb
  42. auto slider = ParamWidget::create<VUSlider>(
  43. levelParamPosition,
  44. module,
  45. VCAmp::LEVEL_PARAM,
  46. 0.0,
  47. 1.0,
  48. abs(module->minDecibels) / (module->maxDecibels - module->minDecibels)
  49. );
  50. dynamic_cast<VUSlider*>(slider)->setVULevel(&(module->_rmsLevel));
  51. addParam(slider);
  52. addInput(Port::create<Port24>(cvInputPosition, Port::INPUT, module, VCAmp::CV_INPUT));
  53. addInput(Port::create<Port24>(inInputPosition, Port::INPUT, module, VCAmp::IN_INPUT));
  54. addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, VCAmp::OUT_OUTPUT));
  55. }
  56. };
  57. RACK_PLUGIN_MODEL_INIT(Bogaudio, VCAmp) {
  58. Model *modelVCAmp = createModel<VCAmp, VCAmpWidget>("Bogaudio-VCAmp", "VCAmp", "amplifier", AMPLIFIER_TAG);
  59. return modelVCAmp;
  60. }