commit fb4153e7c8994672beeb29b335ad96509ee882d7
parent 59cd9466ab93dd2cbc2de6a5d59cb2eb861ef692
Author: paulnasca <paulnasca>
Date: Sun, 14 Dec 2003 10:30:43 +0000
LFO freq. randomness improvements
Diffstat:
3 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -504,3 +504,4 @@
08 Dec 2003 - Inceput sa incerc sa fac rt-safe sub jack, dar in stadiul actual suportul jack este nefunctional
11 Dec 2003 - Adaugat aleatorism la amplitudinile armonicelor
13 Dec 2003 - Adaugat LFO frequency randomness
+14 Dec 2003 - Imbunatatit LFO frequency randomness
+\ No newline at end of file
diff --git a/src/Synth/LFO.C b/src/Synth/LFO.C
@@ -46,7 +46,8 @@ LFO::LFO(LFOParams *lfopars){
lfornd=lfopars->Prandomness/127.0;
if (lfornd<0.0) lfornd=0.0; else if (lfornd>1.0) lfornd=1.0;
- lfofreqrnd=pow(lfopars->Pfreqrand/127.0,2.0)*2.0*4.0;
+// lfofreqrnd=pow(lfopars->Pfreqrand/127.0,2.0)*2.0*4.0;
+ lfofreqrnd=pow(lfopars->Pfreqrand/127.0,2.0)*4.0;
switch (lfopars->fel){
case 1:lfointensity=lfopars->Pintensity/127.0;break;
@@ -60,7 +61,10 @@ LFO::LFO(LFOParams *lfopars){
amp2=(1-lfornd)+lfornd*RND;
lfotype=lfopars->PLFOtype;
lfodelay=lfopars->Pdelay/127.0*4.0;//0..4 sec
- incrnd=1.0;
+ incrnd=nextincrnd=1.0;
+ computenextincrnd();
+ computenextincrnd();//twice because I want incrnd & nextincrnd to be random
+ freqrndenabled=(lfopars->Pfreqrand!=0);
};
LFO::~LFO(){
@@ -98,14 +102,14 @@ REALTYPE LFO::lfoout(){
if ((lfotype==0)||(lfotype==1)) out*=lfointensity*(amp1+x*(amp2-amp1));
else out*=lfointensity*amp2;
if (lfodelay<0.00001) {
- x+=incx*incrnd;
- if (x>1) {
- x-=1;
+ if (freqrndenabled==0) x+=incx;
+ else x+=incx*(incrnd*(1.0-x)+nextincrnd*x);
+ if (x>=1) {
+ x=fmod(x,1.0);
amp1=amp2;
amp2=(1-lfornd)+lfornd*RND;
- incrnd=pow(2.0,(RND-0.5)*lfofreqrnd);
- if (incrnd*incx>=0.49999999) incrnd=1.0;
+ computenextincrnd();
};
} else lfodelay-=(REALTYPE)SOUND_BUFFER_SIZE/(REALTYPE)SAMPLE_RATE;
return(out);
@@ -122,3 +126,11 @@ REALTYPE LFO::amplfoout(){
return(out);
};
+
+void LFO::computenextincrnd(){
+ if (freqrndenabled==0) return;
+ incrnd=nextincrnd;
+ nextincrnd=pow(0.5,lfofreqrnd)+RND*(pow(2.0,lfofreqrnd)-1.0);
+ if (nextincrnd*incx>=0.49999999) nextincrnd=1.0;
+};
+
diff --git a/src/Synth/LFO.h b/src/Synth/LFO.h
@@ -35,12 +35,16 @@ class LFO{
REALTYPE amplfoout();
private:
REALTYPE x;
- REALTYPE incx,incrnd;
+ REALTYPE incx,incrnd,nextincrnd;
REALTYPE amp1,amp2;// used for randomness
REALTYPE lfointensity;
REALTYPE lfornd,lfofreqrnd;
REALTYPE lfodelay;
char lfotype;
+ int freqrndenabled;
+
+
+ void computenextincrnd();
};