commit a102e9921444ee56a6fa078164f6691265a183dd
parent 2395a052c3a412b757bfa397c51b160dd1390646
Author: Daniel Sheeler <dsheeler@pobox.com>
Date: Fri, 28 Sep 2018 16:38:57 -0500
Fix ADnote legato pop.
Using different randomness in oscilgen caused it.
Diffstat:
4 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/src/Synth/ADnote.cpp b/src/Synth/ADnote.cpp
@@ -55,7 +55,7 @@ ADnote::ADnote(ADnoteParameters *pars_, SynthParams &spars,
bandwidthDetuneMultiplier = pars.getBandwidthDetuneMultiplier();
if(pars.GlobalPar.PPanning == 0)
- NoteGlobalPar.Panning = getRandom();
+ NoteGlobalPar.Panning = getRandomFloat();
else
NoteGlobalPar.Panning = pars.GlobalPar.PPanning / 128.0f;
@@ -543,7 +543,7 @@ void ADnote::legatonote(LegatoParams lpars)
bandwidthDetuneMultiplier = pars.getBandwidthDetuneMultiplier();
if(pars.GlobalPar.PPanning == 0) {
- NoteGlobalPar.Panning = getRandom();
+ NoteGlobalPar.Panning = getRandomFloat();
} else
NoteGlobalPar.Panning = pars.GlobalPar.PPanning / 128.0f;
@@ -596,7 +596,7 @@ void ADnote::legatonote(LegatoParams lpars)
if(pars.VoicePar[nvoice].Pextoscil != -1)
vc = pars.VoicePar[nvoice].Pextoscil;
if(!pars.GlobalPar.Hrandgrouping)
- pars.VoicePar[vc].OscilSmp->newrandseed(prng());
+ pars.VoicePar[vc].OscilSmp->newrandseed(getRandomUint());
pars.VoicePar[vc].OscilSmp->get(NoteVoicePar[nvoice].OscilSmp,
getvoicebasefreq(nvoice),
@@ -706,7 +706,7 @@ void ADnote::legatonote(LegatoParams lpars)
NoteVoicePar[nvoice].Volume = -NoteVoicePar[nvoice].Volume;
if(pars.VoicePar[nvoice].PPanning == 0) {
- NoteVoicePar[nvoice].Panning = getRandom();
+ NoteVoicePar[nvoice].Panning = getRandomFloat();
} else
NoteVoicePar[nvoice].Panning =
pars.VoicePar[nvoice].PPanning / 128.0f;
@@ -865,7 +865,7 @@ void ADnote::initparameters(WatchManager *wm, const char *prefix)
vce.Volume = -vce.Volume;
if(param.PPanning == 0) {
- vce.Panning = getRandom();
+ vce.Panning = getRandomFloat();
} else
vce.Panning = param.PPanning / 128.0f;
diff --git a/src/Synth/OscilGen.cpp b/src/Synth/OscilGen.cpp
@@ -1045,6 +1045,9 @@ short int OscilGen::get(float *smps, float freqHz, int resonance)
fft_t *input = freqHz > 0.0f ? oscilFFTfreqs : pendingfreqs;
+ unsigned int realrnd = prng();
+ sprng(randseed);
+
int outpos =
(int)((RND * 2.0f
- 1.0f) * synth.oscilsize_f * (Prand - 64.0f) / 64.0f);
@@ -1090,8 +1093,7 @@ short int OscilGen::get(float *smps, float freqHz, int resonance)
//Harmonic Amplitude Randomness
if((freqHz > 0.1f) && (!ADvsPAD)) {
- unsigned int realrnd = prng();
- sprng(randseed);
+
float power = Pamprandpower / 127.0f;
float normalize = 1.0f / (1.2f - power);
switch(Pamprandtype) {
@@ -1110,7 +1112,6 @@ short int OscilGen::get(float *smps, float freqHz, int resonance)
* normalize;
break;
}
- sprng(realrnd + 1);
}
if((freqHz > 0.1f) && (resonance != 0))
@@ -1127,6 +1128,8 @@ short int OscilGen::get(float *smps, float freqHz, int resonance)
smps[i] *= 0.25f; //correct the amplitude
}
+ sprng(realrnd + 1);
+
if(Prand < 64)
return outpos;
else
diff --git a/src/Synth/SynthNote.cpp b/src/Synth/SynthNote.cpp
@@ -163,9 +163,13 @@ void SynthNote::setVelocity(float velocity_) {
legato.setDecounter(0); //avoid chopping sound due fade-in
}
-float SynthNote::getRandom() {
+float SynthNote::getRandomFloat() {
+ return (getRandomUint() / (INT32_MAX * 1.0f));
+}
+
+prng_t SynthNote::getRandomUint() {
current_prng_state = prng_r(current_prng_state);
- return (current_prng_state / (INT32_MAX * 1.0f));
+ return current_prng_state;
}
}
diff --git a/src/Synth/SynthNote.h b/src/Synth/SynthNote.h
@@ -71,7 +71,8 @@ class SynthNote
void setVelocity(float velocity_);
/* Random numbers with own seed */
- float getRandom();
+ float getRandomFloat();
+ prng_t getRandomUint();
//Realtime Safe Memory Allocator For notes
class Allocator &memory;