1
0

Add "cut" control to Crunch

This commit is contained in:
Geraint 2025-06-23 08:19:45 +01:00
parent cb21797593
commit 5bfcf6f151

View File

@ -31,6 +31,7 @@ struct CrunchSTFX : public BaseEffect {
ParamRange drive{4}; ParamRange drive{4};
ParamRange fuzz{0}; ParamRange fuzz{0};
ParamRange toneHz{2000}; ParamRange toneHz{2000};
ParamRange cutHz{50};
ParamRange outGain{1}; ParamRange outGain{1};
const bool autoGain; const bool autoGain;
@ -52,6 +53,9 @@ struct CrunchSTFX : public BaseEffect {
stfx::units::rangeHz(storage.range("toneHz", toneHz) stfx::units::rangeHz(storage.range("toneHz", toneHz)
.info("tone", "limits the brightness of the distortion") .info("tone", "limits the brightness of the distortion")
.range(100, 4000, 20000)); .range(100, 4000, 20000));
stfx::units::rangeHz(storage.range("cutHz", cutHz)
.info("cut", "prevents low frequencies from driving the distortion")
.range(20, 100, 5000));
stfx::units::rangeGain(storage.range("outGain", outGain) stfx::units::rangeGain(storage.range("outGain", outGain)
.info("out", "output gain") .info("out", "output gain")
@ -66,6 +70,7 @@ struct CrunchSTFX : public BaseEffect {
oversampler.resize(channels, config.maxBlockSize, oversampleHalfLatency, std::min(0.45, 21000/config.sampleRate)); oversampler.resize(channels, config.maxBlockSize, oversampleHalfLatency, std::min(0.45, 21000/config.sampleRate));
gainshapers.resize(channels); gainshapers.resize(channels);
cutFilters.resize(channels);
toneFilters.resize(channels); toneFilters.resize(channels);
outputFilters.resize(channels); outputFilters.resize(channels);
} }
@ -73,6 +78,7 @@ struct CrunchSTFX : public BaseEffect {
void reset() { void reset() {
oversampler.reset(); oversampler.reset();
for (auto &g : gainshapers) g.reset(); for (auto &g : gainshapers) g.reset();
for (auto &f : cutFilters) f.reset();
for (auto &f : toneFilters) f.reset(); for (auto &f : toneFilters) f.reset();
for (auto &f : outputFilters) f.reset(); for (auto &f : outputFilters) f.reset();
} }
@ -88,13 +94,18 @@ struct CrunchSTFX : public BaseEffect {
double outputGainFrom = outGain.from(); double outputGainFrom = outGain.from();
double outputGainTo = outGain.to(); double outputGainTo = outGain.to();
if (autoGain) { if (autoGain) {
Sample averageGain = gainshapers[0].averageGain(autoGainLevel*drive.from()); Sample cutRatioFrom = 1 - cutHz.from()/(cutHz.from() + 200);
outputGainFrom /= drive.from()*averageGain; Sample averageGainFrom = gainshapers[0].averageGain(autoGainLevel*cutRatioFrom*drive.from());
outputGainTo /= drive.to()*gainshapers[0].averageGain(autoGainLevel*drive.to()); outputGainFrom /= drive.from()*averageGainFrom;
Sample cutRatioTo = 1 - cutHz.to()/(cutHz.to() + 200);
Sample averageGainTo = gainshapers[0].averageGain(autoGainLevel*cutRatioTo*drive.to());
outputGainTo /= drive.to()*averageGainTo;
} }
auto outputGain = block.smooth(outputGainFrom, outputGainTo); auto outputGain = block.smooth(outputGainFrom, outputGainTo);
for (int c = 0; c < channels; ++c) { for (int c = 0; c < channels; ++c) {
auto &cutFilter = cutFilters[c];
cutFilter.highpass(cutHz/(config.sampleRate*2));
auto &gainshaper = gainshapers[c]; auto &gainshaper = gainshapers[c];
gainshaper.setFuzzFactor(fuzz); gainshaper.setFuzzFactor(fuzz);
auto &toneFilter = toneFilters[c]; auto &toneFilter = toneFilters[c];
@ -107,7 +118,7 @@ struct CrunchSTFX : public BaseEffect {
for (int i = 0; i < block.length*2; ++i) { for (int i = 0; i < block.length*2; ++i) {
double hi = i*0.5; double hi = i*0.5;
Sample x = samples[i]*inputGain.at(hi); Sample x = samples[i]*inputGain.at(hi);
Sample gain = gainshaper(x)*outputGain.at(hi); Sample gain = gainshaper(cutFilter(x))*outputGain.at(hi);
Sample y = x*toneFilter(gain); Sample y = x*toneFilter(gain);
samples[i] = outputFilter(y); samples[i] = outputFilter(y);
} }
@ -162,7 +173,7 @@ private:
}; };
std::vector<GainshapeADAA> gainshapers; std::vector<GainshapeADAA> gainshapers;
using Filter = signalsmith::filters::BiquadStatic<Sample>; using Filter = signalsmith::filters::BiquadStatic<Sample>;
std::vector<Filter> toneFilters, outputFilters; std::vector<Filter> cutFilters, toneFilters, outputFilters;
}; };
}} // namespace }} // namespace