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.

95 lines
2.7KB

  1. //**************************************************************************************
  2. //FoldBack Distortion Module for VCV Rack by Autodafe http://www.autodafe.net
  3. //
  4. //Based on code taken from the Fundamentals plugins by Andrew Belt http://www.vcvrack.com
  5. //And part of code on musicdsp.org: http://musicdsp.org/showArchiveComment.php?ArchiveID=203
  6. //**************************************************************************************
  7. #include "Autodafe.hpp"
  8. namespace rack_plugin_Autodafe {
  9. struct FoldBack : Module {
  10. enum ParamIds {
  11. THRESHOLD_PARAM,
  12. ATTEN_PARAM,
  13. NUM_PARAMS
  14. };
  15. enum InputIds {
  16. INPUT,
  17. CV_THRESHOLD,
  18. NUM_INPUTS
  19. };
  20. enum OutputIds {
  21. OUTPUT,
  22. NUM_OUTPUTS
  23. };
  24. FoldBack();
  25. void step();
  26. };
  27. FoldBack::FoldBack() {
  28. params.resize(NUM_PARAMS);
  29. inputs.resize(NUM_INPUTS);
  30. outputs.resize(NUM_OUTPUTS);
  31. }
  32. float foldback(float in, float threshold)
  33. {
  34. if (in>threshold || in<-threshold)
  35. {
  36. in = fabs(fabs(fmod(in - threshold, threshold * 4)) - threshold * 2) - threshold;
  37. }
  38. return in;
  39. }
  40. void FoldBack::step() {
  41. float in = inputs[INPUT].value / 5.0f;
  42. float threshold = params[THRESHOLD_PARAM].value;
  43. float coeff = inputs[CV_THRESHOLD].value * params[ATTEN_PARAM].value / 5.0f;
  44. outputs[OUTPUT].value= 5.0f* foldback(in, threshold+coeff);
  45. }
  46. struct FoldBackWidget : ModuleWidget{
  47. FoldBackWidget(FoldBack *module);
  48. };
  49. FoldBackWidget::FoldBackWidget(FoldBack *module) : ModuleWidget(module) {
  50. box.size = Vec(15 * 6, 380);
  51. {
  52. SVGPanel *panel = new SVGPanel();
  53. panel->box.size = box.size;
  54. panel->setBackground(SVG::load(assetPlugin(plugin, "res/FoldBack.svg")));
  55. addChild(panel);
  56. }
  57. addChild(createScrew<ScrewSilver>(Vec(5, 0)));
  58. addChild(createScrew<ScrewSilver>(Vec(box.size.x - 20, 0)));
  59. addChild(createScrew<ScrewSilver>(Vec(5, 365)));
  60. addChild(createScrew<ScrewSilver>(Vec(box.size.x - 20, 365)));
  61. addParam(createParam<AutodafeKnobGreenBig>(Vec(18, 61), module, FoldBack::THRESHOLD_PARAM, 0.1, 1.0, 1.0));
  62. addInput(createInput<PJ301MPort>(Vec(32, 150), module, FoldBack::CV_THRESHOLD));
  63. addParam(createParam<AutodafeKnobGreen>(Vec(27, 190), module, FoldBack::ATTEN_PARAM, -1.0, 1.0, 0.0));
  64. addInput(createInput<PJ301MPort>(Vec(10, 320), module, FoldBack::INPUT));
  65. addOutput(createOutput<PJ301MPort>(Vec(48, 320), module, FoldBack::OUTPUT));
  66. }
  67. } // namespace rack_plugin_Autodafe
  68. using namespace rack_plugin_Autodafe;
  69. RACK_PLUGIN_MODEL_INIT(Autodafe, FoldBack) {
  70. return Model::create<FoldBack, FoldBackWidget>("Autodafe", "Foldback Distortion", "Foldback Distortion", EFFECT_TAG, WAVESHAPER_TAG, DISTORTION_TAG);
  71. }