diff options
author | Damien Zammit <damien@zamaudio.com> | 2018-03-10 13:23:20 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2018-03-10 13:23:20 +1100 |
commit | f946e0cdbfd4cdcb7eaaed0dd3a458e74b895f44 (patch) | |
tree | 8ea14a3bfebefb602c91444d941b08c811e947bc | |
parent | 11aa0c2e99cac3556685fef7989aec28cff1e8c4 (diff) |
ZamGrains: Fixed zipper noise on param changes
-rw-r--r-- | plugins/ZamGrains/ZamGrainsPlugin.cpp | 51 | ||||
-rw-r--r-- | plugins/ZamGrains/ZamGrainsPlugin.hpp | 2 | ||||
-rw-r--r-- | plugins/ZamGrains/ZamGrainsUI.cpp | 4 |
3 files changed, 39 insertions, 18 deletions
diff --git a/plugins/ZamGrains/ZamGrainsPlugin.cpp b/plugins/ZamGrains/ZamGrainsPlugin.cpp index 73b2e3f..66cbd20 100644 --- a/plugins/ZamGrains/ZamGrainsPlugin.cpp +++ b/plugins/ZamGrains/ZamGrainsPlugin.cpp @@ -226,6 +226,9 @@ void ZamGrainsPlugin::activate() grainpos = 0; playpos = 0; finalpos = 0; + delaytimeold = 0.f; + grainsold = 0.f; + grainspeedold = 0.f; } float ZamGrainsPlugin::sample_and_hold(int ctrl, float input, int *state) { @@ -245,17 +248,32 @@ void ZamGrainsPlugin::run(const float** inputs, float** outputs, uint32_t frames uint32_t i; float srate = getSampleRate(); int delaysamples; - float sampz, sampz2; + float sampz, sampz2, sampz_f, sampz2_f; float xfade; - + int recalc; int windowsize; int outofphase; delaysamples = (int)(delaytime * srate) / 1000; windowsize = delaysamples / grains; + recalc = 0; + if (grainspeed != grainspeedold) { + recalc = 1; + } + if (grains != grainsold) { + recalc = 1; + } + if (delaytime != delaytimeold) { + recalc = 1; + } + + xfade = 0.f; + sampz_f = z[zidxold]; + sampz2_f = z[zidx2old]; for (i = 0; i < frames; i++) { z[posz] = inputs[0][i]; + outofphase = (posphasor + windowsize / 2) % windowsize; zidx = (int)(sample_and_hold(posphasor, (float)posz * playspeed, &samphold) + (float)posphasor * grainspeed); zidx2 = (int)(sample_and_hold(outofphase, (float)posz * playspeed, &samphold2) + (float)outofphase * grainspeed); @@ -276,17 +294,18 @@ void ZamGrainsPlugin::run(const float** inputs, float** outputs, uint32_t frames posz = 0; } - - xfade = 1.0f / (float)frames; - sampz = z[zidxold]; - sampz2 = z[zidx2old]; - sampz *= (1.-xfade); - sampz2 *= (1.-xfade); - sampz += z[zidx] * xfade; - sampz2 += z[zidx2] * xfade; - sampz = sanitize_denormal(sampz); - sampz2 = sanitize_denormal(sampz2); - + if (recalc) { + xfade += 1.0f / (float)frames; + sampz = sampz_f; + sampz2 = sampz2_f; + sampz *= (1.-xfade); + sampz2 *= (1.-xfade); + sampz += z[zidx] * xfade; + sampz2 += z[zidx2] * xfade; + } else { + sampz = z[zidx]; + sampz2 = z[zidx2]; + } outputs[0][i] = from_dB(gain) * ( sampz * hanning(posphasor, windowsize) + sampz2 * hanning(outofphase, windowsize) @@ -294,10 +313,12 @@ void ZamGrainsPlugin::run(const float** inputs, float** outputs, uint32_t frames finalpos = (float)zidx * 1000. / (srate * delaytime); grainpos = (float)posphasor * 1000. / (srate * delaytime); playpos = (float)posz * 1000. / (srate * delaytime); - zidxold = zidx; - zidx2old = zidx2; } + grainsold = grains; + grainspeedold = grainspeed; delaytimeold = delaytime; + zidxold = zidx; + zidx2old = zidx2; } // ----------------------------------------------------------------------- diff --git a/plugins/ZamGrains/ZamGrainsPlugin.hpp b/plugins/ZamGrains/ZamGrainsPlugin.hpp index b1ebcd6..97584ab 100644 --- a/plugins/ZamGrains/ZamGrainsPlugin.hpp +++ b/plugins/ZamGrains/ZamGrainsPlugin.hpp @@ -125,7 +125,7 @@ protected: private: int currgrains, zidx, zidx2, zidxold, zidx2old, samphold, samphold2; float grains, grainspeed, playspeed, delaytime, gain, delaytimeout, playpos, grainpos, finalpos; - float delaytimeold; + float delaytimeold, grainsold, grainspeedold; float z[MAX_DELAY]; unsigned int posz; unsigned int posphasor; diff --git a/plugins/ZamGrains/ZamGrainsUI.cpp b/plugins/ZamGrains/ZamGrainsUI.cpp index 2c46f2c..dc2ad61 100644 --- a/plugins/ZamGrains/ZamGrainsUI.cpp +++ b/plugins/ZamGrains/ZamGrainsUI.cpp @@ -39,7 +39,7 @@ ZamGrainsUI::ZamGrainsUI() fKnobPlayspeed->setId(ZamGrainsPlugin::paramPlayspeed); fKnobPlayspeed->setRange(0.1f, 20.0f); fKnobPlayspeed->setLabel(true); - fKnobPlayspeed->setScrollStep(0.1f); + fKnobPlayspeed->setScrollStep(0.01f); fKnobPlayspeed->setUsingLogScale(true); fKnobPlayspeed->setDefault(1.0f); fKnobPlayspeed->setRotationAngle(240); @@ -50,7 +50,7 @@ ZamGrainsUI::ZamGrainsUI() fKnobGrainspeed->setId(ZamGrainsPlugin::paramGrainspeed); fKnobGrainspeed->setRange(0.1f, 20.0f); fKnobGrainspeed->setLabel(true); - fKnobGrainspeed->setScrollStep(0.1f); + fKnobGrainspeed->setScrollStep(0.01f); fKnobGrainspeed->setUsingLogScale(true); fKnobGrainspeed->setDefault(1.0f); fKnobGrainspeed->setRotationAngle(240); |