diff --git a/core/Clipper.cpp b/core/Clipper.cpp index de5b581..31a6b99 100644 --- a/core/Clipper.cpp +++ b/core/Clipper.cpp @@ -33,5 +33,16 @@ float Clipper::clip(const float in) { float normalized = (in / clip_) * 0.75f; return std::tanh(normalized) * clip_; } + case kClipperModeFold: { + float x = in; + while (x > clip_ || x < -clip_) { + if (x > clip_) { + x = 2.0f * clip_ - x; + } else if (x < -clip_) { + x = -2.0f * clip_ - x; + } + } + return x; + } } } \ No newline at end of file diff --git a/core/Clipper.hpp b/core/Clipper.hpp index 58500ec..163be5f 100644 --- a/core/Clipper.hpp +++ b/core/Clipper.hpp @@ -5,7 +5,12 @@ class Clipper { public: - enum ClipperMode { kClipperModeSoft, kClipperModeHard, kClipperModeCount }; + enum ClipperMode { + kClipperModeSoft, + kClipperModeHard, + kClipperModeFold, + kClipperModeCount + }; Clipper(float init_clip = 1.0f, ClipperMode mode = kClipperModeSoft); diff --git a/plugins/SquidgeDistortion/SquidgeDistortion.cpp b/plugins/SquidgeDistortion/SquidgeDistortion.cpp index 105e83c..4e12895 100644 --- a/plugins/SquidgeDistortion/SquidgeDistortion.cpp +++ b/plugins/SquidgeDistortion/SquidgeDistortion.cpp @@ -45,8 +45,8 @@ protected: parameter.hints = kParameterIsAutomatable | kParameterIsInteger; parameter.enumValues.count = Clipper::kClipperModeCount; parameter.enumValues.restrictedMode = true; - parameter.enumValues.values = - new ParameterEnumerationValue[2]{{0.0f, "Soft"}, {1.0f, "Hard"}}; + parameter.enumValues.values = new ParameterEnumerationValue[3]{ + {0.0f, "Soft"}, {1.0f, "Hard"}, {2.0f, "Fold"}}; break; } }