Add distortion Symmetry and Tone knobs

This commit is contained in:
Armin 2026-07-15 23:51:38 +02:00
commit 1abf4f4b60
2 changed files with 21 additions and 5 deletions

View file

@ -8,10 +8,12 @@ class Distortion {
public: public:
void prepare(double /*sr*/) {} void prepare(double /*sr*/) {}
void setParameters(DistortionType type, float amount, float mix) { void setParameters(DistortionType type, float amount, float symmetry, float tone) {
distType = type; distType = type;
distAmount = amount; distAmount = amount;
dryWet = mix; distSymmetry = symmetry;
distTone = tone;
dryWet = 1.0f;
} }
float process(float input) { float process(float input) {
@ -58,7 +60,15 @@ public:
break; break;
} }
if (distAmount < 0.001f) // Asymmetry: bias the signal before/after shaping for even-harmonic grit
wet += distSymmetry * 0.5f;
// Tone: one-pole low-pass to tame harsh high harmonics
float lpCoeff = distTone * 0.9f + 0.05f;
toneState += lpCoeff * (wet - toneState);
wet = toneState;
if (distAmount < 0.001f && std::abs(distSymmetry) < 0.001f)
return input; return input;
return input + (wet - input) * dryWet; return input + (wet - input) * dryWet;
@ -67,5 +77,8 @@ public:
private: private:
DistortionType distType = DistortionType::SoftClip; DistortionType distType = DistortionType::SoftClip;
float distAmount = 0.0f; float distAmount = 0.0f;
float dryWet = 0.0f; float distSymmetry = 0.0f;
float distTone = 1.0f;
float dryWet = 1.0f;
float toneState = 0.0f;
}; };

View file

@ -43,6 +43,7 @@ juce::AudioProcessorValueTreeState::ParameterLayout ChromaFlockProcessor::create
juce::AudioProcessorValueTreeState::ParameterLayout layout; juce::AudioProcessorValueTreeState::ParameterLayout layout;
auto zeroOne = juce::NormalisableRange<float>(0.0f, 1.0f, 0.01f); auto zeroOne = juce::NormalisableRange<float>(0.0f, 1.0f, 0.01f);
auto minusOneOne = juce::NormalisableRange<float>(-1.0f, 1.0f, 0.01f);
// LFO1 depth: fine 0.001 step, with a skew of 2.0 (value = p^2) so the // LFO1 depth: fine 0.001 step, with a skew of 2.0 (value = p^2) so the
// lower knob range resolves much finer and the 0.001 step only applies // lower knob range resolves much finer and the 0.001 step only applies
@ -153,7 +154,9 @@ juce::AudioProcessorValueTreeState::ParameterLayout ChromaFlockProcessor::create
layout.add(std::make_unique<juce::AudioParameterFloat>( layout.add(std::make_unique<juce::AudioParameterFloat>(
juce::ParameterID{"distAmount", 1}, "Dist Amount", zeroOne, 0.0f)); juce::ParameterID{"distAmount", 1}, "Dist Amount", zeroOne, 0.0f));
layout.add(std::make_unique<juce::AudioParameterFloat>( layout.add(std::make_unique<juce::AudioParameterFloat>(
juce::ParameterID{"distMix", 1}, "Dist Mix", zeroOne, 0.0f)); juce::ParameterID{"distSymmetry", 1}, "Dist Symmetry", minusOneOne, 0.0f));
layout.add(std::make_unique<juce::AudioParameterFloat>(
juce::ParameterID{"distTone", 1}, "Dist Tone", zeroOne, 1.0f));
// COMPRESSOR // COMPRESSOR
layout.add(std::make_unique<juce::AudioParameterFloat>( layout.add(std::make_unique<juce::AudioParameterFloat>(