summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2018-03-10 13:23:20 +1100
committerDamien Zammit <damien@zamaudio.com>2018-03-10 13:23:20 +1100
commitf946e0cdbfd4cdcb7eaaed0dd3a458e74b895f44 (patch)
tree8ea14a3bfebefb602c91444d941b08c811e947bc
parent11aa0c2e99cac3556685fef7989aec28cff1e8c4 (diff)
ZamGrains: Fixed zipper noise on param changes
-rw-r--r--plugins/ZamGrains/ZamGrainsPlugin.cpp51
-rw-r--r--plugins/ZamGrains/ZamGrainsPlugin.hpp2
-rw-r--r--plugins/ZamGrains/ZamGrainsUI.cpp4
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);