|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /*
- ZynAddSubFX - a software synthesizer
-
- EffectLFO.cpp - Stereo LFO used by some effects
- Copyright (C) 2002-2005 Nasca Octavian Paul
- Author: Nasca Octavian Paul
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License
- as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License (version 2 or later) for more details.
-
- You should have received a copy of the GNU General Public License (version 2)
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- */
-
- #include "EffectLFO.h"
- #include "../Misc/Util.h"
-
- #include <cmath>
- #include "globals.h"
-
- EffectLFO::EffectLFO(float srate_f, float bufsize_f)
- :Pfreq(40),
- Prandomness(0),
- PLFOtype(0),
- Pstereo(64),
- xl(0.0f),
- xr(0.0f),
- ampl1(RND),
- ampl2(RND),
- ampr1(RND),
- ampr2(RND),
- lfornd(0.0f),
- samplerate_f(srate_f),
- buffersize_f(bufsize_f)
- {
- updateparams();
- }
-
- EffectLFO::~EffectLFO() {}
-
- //Update the changed parameters
- void EffectLFO::updateparams(void)
- {
- float lfofreq = (powf(2.0f, Pfreq / 127.0f * 10.0f) - 1.0f) * 0.03f;
- incx = fabsf(lfofreq) * buffersize_f / samplerate_f;
- if(incx > 0.49999999f)
- incx = 0.499999999f; //Limit the Frequency
-
- lfornd = Prandomness / 127.0f;
- lfornd = (lfornd > 1.0f) ? 1.0f : lfornd;
-
- if(PLFOtype > 1)
- PLFOtype = 1; //this has to be updated if more lfo's are added
- lfotype = PLFOtype;
- xr = xl + (Pstereo - 64.0f) / 127.0f + 1.0f;
- xr -= floorf(xr);
- }
-
-
- //Compute the shape of the LFO
- float EffectLFO::getlfoshape(float x)
- {
- float out;
- switch(lfotype) {
- case 1: //EffectLFO_TRIANGLE
- if((x > 0.0f) && (x < 0.25f))
- out = 4.0f * x;
- else
- if((x > 0.25f) && (x < 0.75f))
- out = 2.0f - 4.0f * x;
- else
- out = 4.0f * x - 4.0f;
- break;
- //when adding more, ensure ::updateparams() gets updated
- default:
- out = cosf(x * 2.0f * PI); //EffectLFO_SINE // TODO: use M_PI ?
- }
- return out;
- }
-
- //LFO output
- void EffectLFO::effectlfoout(float *outl, float *outr)
- {
- float out;
-
- out = getlfoshape(xl);
- if((lfotype == 0) || (lfotype == 1))
- out *= (ampl1 + xl * (ampl2 - ampl1));
- xl += incx;
- if(xl > 1.0f) {
- xl -= 1.0f;
- ampl1 = ampl2;
- ampl2 = (1.0f - lfornd) + lfornd * RND;
- }
- *outl = (out + 1.0f) * 0.5f;
-
- out = getlfoshape(xr);
- if((lfotype == 0) || (lfotype == 1))
- out *= (ampr1 + xr * (ampr2 - ampr1));
- xr += incx;
- if(xr > 1.0f) {
- xr -= 1.0f;
- ampr1 = ampr2;
- ampr2 = (1.0f - lfornd) + lfornd * RND;
- }
- *outr = (out + 1.0f) * 0.5f;
- }
|