commit 3e4a4d9ee32750c5ba24af5e318121d3a2083004
parent b683bf98e711db21de2fe5901567a48a66650939
Author: fundamental <mark.d.mccurry@gmail.com>
Date: Sun, 23 May 2010 11:20:42 -0400
Phaser: cleanup in prep for merge
Diffstat:
3 files changed, 43 insertions(+), 50 deletions(-)
diff --git a/src/Effects/Phaser.cpp b/src/Effects/Phaser.cpp
@@ -25,7 +25,7 @@
#define PHASER_LFO_SHAPE 2
Phaser::Phaser(const int &insertion_, REALTYPE *efxoutl_, REALTYPE *efxoutr_)
- :Effect(insertion_, efxoutl_, efxoutr_, NULL, 0), old(1), oldgain(0.0)
+ :Effect(insertion_, efxoutl_, efxoutr_, NULL, 0), old(1), oldgain(0.0), fb(0.0)
{
setpreset(Ppreset);
cleanup();
@@ -34,76 +34,62 @@ Phaser::Phaser(const int &insertion_, REALTYPE *efxoutl_, REALTYPE *efxoutr_)
Phaser::~Phaser()
{}
-
/*
* Effect output
*/
void Phaser::out(const Stereo<float *> &smp)
{
- int i, j;
- REALTYPE lfol, lfor, lgain, rgain, tmp;
+ Stereo<REALTYPE> gain(0.0), lfoVal(0.0);
- lfo.effectlfoout(&lfol, &lfor);
- lgain = lfol;
- rgain = lfor;
- lgain = (exp(lgain * PHASER_LFO_SHAPE) - 1) / (exp(PHASER_LFO_SHAPE) - 1.0);
- rgain = (exp(rgain * PHASER_LFO_SHAPE) - 1) / (exp(PHASER_LFO_SHAPE) - 1.0);
+ lfo.effectlfoout(&lfoVal.l, &lfoVal.r);
+ gain.l = (exp(lfoVal.l * PHASER_LFO_SHAPE) - 1) / (exp(PHASER_LFO_SHAPE) - 1.0);
+ gain.r = (exp(lfoVal.r * PHASER_LFO_SHAPE) - 1) / (exp(PHASER_LFO_SHAPE) - 1.0);
- lgain = 1.0 - phase * (1.0 - depth) - (1.0 - phase) * lgain * depth;
- rgain = 1.0 - phase * (1.0 - depth) - (1.0 - phase) * rgain * depth;
+ gain.l = 1.0 - phase * (1.0 - depth) - (1.0 - phase) * gain.l * depth;
+ gain.r = 1.0 - phase * (1.0 - depth) - (1.0 - phase) * gain.r * depth;
- if(lgain > 1.0)
- lgain = 1.0;
- else
- if(lgain < 0.0)
- lgain = 0.0;
- if(rgain > 1.0)
- rgain = 1.0;
- else
- if(rgain < 0.0)
- rgain = 0.0;
+ gain.l = limit(gain.l, 0.0f, 1.0f);
+ gain.r = limit(gain.r, 0.0f, 1.0f);
- for(i = 0; i < SOUND_BUFFER_SIZE; i++) {
+ for(int i = 0; i < SOUND_BUFFER_SIZE; i++) {
REALTYPE x = (REALTYPE) i / SOUND_BUFFER_SIZE;
REALTYPE x1 = 1.0 - x;
- REALTYPE gl = lgain * x + oldgain.l * x1;
- REALTYPE gr = rgain * x + oldgain.r * x1;
- REALTYPE inl = smp.l[i] * panning + fbl;
- REALTYPE inr = smp.r[i] * (1.0 - panning) + fbr;
+ Stereo<REALTYPE> g(gain.l * x + oldgain.l * x1,
+ gain.l * x + oldgain.r * x1);
+ Stereo<REALTYPE> in(smp.l[i] * panning + fb.l,
+ smp.r[i] * (1.0 - panning) + fb.r);
//Left channel
- for(j = 0; j < Pstages * 2; j++) { //Phasing routine
- tmp = old.l[j];
- old.l[j] = gl * tmp + inl;
- inl = tmp - gl *old.l[j];
+ for(int j = 0; j < Pstages * 2; j++) { //Phasing routine
+ REALTYPE tmp = old.l[j];
+ old.l[j] = g.l * tmp + in.l;
+ in.l = tmp - g.l *old.l[j];
}
//Right channel
- for(j = 0; j < Pstages * 2; j++) { //Phasing routine
- tmp = old.r[j];
- old.r[j] = gr * tmp + inr;
- inr = tmp - gr *old.r[j];
+ for(int j = 0; j < Pstages * 2; j++) { //Phasing routine
+ REALTYPE tmp = old.r[j];
+ old.r[j] = g.r * tmp + in.r;
+ in.r = tmp - g.r *old.r[j];
}
//Left/Right crossing
- REALTYPE l = inl;
- REALTYPE r = inr;
- inl = l * (1.0 - lrcross) + r * lrcross;
- inr = r * (1.0 - lrcross) + l * lrcross;
-
- fbl = inl * fb;
- fbr = inr * fb;
- efxoutl[i] = inl;
- efxoutr[i] = inr;
+ Stereo<REALTYPE> tmp = in;
+ in.l = tmp.l * (1.0 - lrcross) + tmp.r * lrcross;
+ in.r = tmp.r * (1.0 - lrcross) + tmp.l * lrcross;
+
+ fb.l = in.l * feedback;
+ fb.r = in.r * feedback;
+ efxoutl[i] = in.l;
+ efxoutr[i] = in.r;
}
- oldgain = Stereo<REALTYPE>(lgain, rgain);
+ oldgain = gain;
if(Poutsub != 0)
- for(i = 0; i < SOUND_BUFFER_SIZE; i++) {
+ for(int i = 0; i < SOUND_BUFFER_SIZE; i++) {
efxoutl[i] *= -1.0;
efxoutr[i] *= -1.0;
}
- ;
}
/*
@@ -111,8 +97,8 @@ void Phaser::out(const Stereo<float *> &smp)
*/
void Phaser::cleanup()
{
- fbl = 0.0;
- fbr = 0.0;
+ fb.l = 0.0;
+ fb.r = 0.0;
oldgain = Stereo<REALTYPE>(0.0);
old.l.clear();
old.r.clear();
@@ -131,7 +117,7 @@ void Phaser::setdepth(unsigned char Pdepth)
void Phaser::setfb(unsigned char Pfb)
{
this->Pfb = Pfb;
- fb = (Pfb - 64.0) / 64.1;
+ feedback = (Pfb - 64.0) / 64.1;
}
void Phaser::setvolume(unsigned char Pvolume)
diff --git a/src/Effects/Phaser.h b/src/Effects/Phaser.h
@@ -64,9 +64,10 @@ class Phaser:public Effect
void setphase(unsigned char Pphase);
//Internal Values
- REALTYPE panning, fb, depth, lrcross, fbl, fbr, phase;
+ REALTYPE panning, feedback, depth, lrcross, phase;
Stereo<Sample> old;
Stereo<REALTYPE> oldgain;
+ Stereo<REALTYPE> fb;
};
#endif
diff --git a/src/Misc/Util.h b/src/Misc/Util.h
@@ -60,5 +60,11 @@ T stringTo(const char *x)
return ans;
}
+template <class T>
+T limit(T val, T min, T max)
+{
+ return (val < min ? min : (val > max ? max : val));
+}
+
#endif