159 lines
2.8 KiB
C++
Executable file
159 lines
2.8 KiB
C++
Executable file
/*
|
|
==============================================================================
|
|
This file is part of Obxd synthesizer.
|
|
|
|
Copyright © 2013-2014 Filatov Vadim
|
|
|
|
Contact author via email :
|
|
justdat_@_e1.ru
|
|
|
|
This file may be licensed under the terms of of the
|
|
GNU General Public License Version 2 (the ``GPL'').
|
|
|
|
Software distributed under the License is distributed
|
|
on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
|
|
express or implied. See the GPL for the specific language
|
|
governing rights and limitations.
|
|
|
|
You should have received a copy of the GPL along with this
|
|
program. If not, go to http://www.gnu.org/licenses/gpl.html
|
|
or write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
==============================================================================
|
|
*/
|
|
#pragma once
|
|
#include "SynthEngine.h"
|
|
class Lfo
|
|
{
|
|
private:
|
|
float phase;
|
|
float s, sq, sh;
|
|
float s1;
|
|
Random rg;
|
|
float SampleRate;
|
|
float SampleRateInv;
|
|
|
|
float syncRate;
|
|
bool synced;
|
|
|
|
public:
|
|
float Frequency;
|
|
float phaseInc;
|
|
float frUnsc;//frequency value without sync
|
|
float rawParam;
|
|
int waveForm;
|
|
Lfo()
|
|
{
|
|
phaseInc = 0;
|
|
frUnsc=0;
|
|
syncRate = 1;
|
|
rawParam=0;
|
|
synced = false;
|
|
s1=0;
|
|
Frequency=1;
|
|
phase=0;
|
|
s=sq=sh=0;
|
|
rg=Random();
|
|
}
|
|
void setSynced()
|
|
{
|
|
synced = true;
|
|
recalcRate(rawParam);
|
|
}
|
|
void setUnsynced()
|
|
{
|
|
synced = false;
|
|
phaseInc = frUnsc;
|
|
}
|
|
void hostSyncRetrigger(float bpm,float quaters)
|
|
{
|
|
if(synced)
|
|
{
|
|
phaseInc = (bpm/60.0)*syncRate;
|
|
phase = phaseInc*quaters;
|
|
phase = (fmod(phase,1)*float_Pi*2-float_Pi);
|
|
}
|
|
}
|
|
inline float getVal()
|
|
{
|
|
float Res = 0;
|
|
if((waveForm &1) !=0 )
|
|
Res+=s;
|
|
if((waveForm&2)!=0)
|
|
Res+=sq;
|
|
if((waveForm&4)!=0)
|
|
Res+=sh;
|
|
return tptlpupw(s1, Res,3000,SampleRateInv);
|
|
}
|
|
void setSamlpeRate(float sr)
|
|
{
|
|
SampleRate=sr;
|
|
SampleRateInv = 1 / SampleRate;
|
|
}
|
|
inline void update()
|
|
{
|
|
phase+=((phaseInc * float_Pi*2 * SampleRateInv));
|
|
sq = (phase>0?1:-1);
|
|
s = sin(phase);
|
|
if(phase > float_Pi)
|
|
{
|
|
phase-=2*float_Pi;
|
|
sh = rg.nextFloat()*2-1;
|
|
}
|
|
|
|
}
|
|
void setFrequency(float val)
|
|
{
|
|
frUnsc = val;
|
|
if(!synced)
|
|
phaseInc = val;
|
|
}
|
|
void setRawParam(float param)//used for synced rate changes
|
|
{
|
|
rawParam = param;
|
|
if(synced)
|
|
{
|
|
recalcRate(param);
|
|
}
|
|
}
|
|
void recalcRate(float param)
|
|
{
|
|
const int ratesCount = 9;
|
|
int parval = (int)(param*(ratesCount-1));
|
|
float rt = 1;
|
|
switch(parval)
|
|
{
|
|
case 0:
|
|
rt = 1.0 / 8;
|
|
break;
|
|
case 1:
|
|
rt = 1.0 / 4;
|
|
break;
|
|
case 2:
|
|
rt = 1.0 / 3;
|
|
break;
|
|
case 3:
|
|
rt = 1.0 / 2;
|
|
break;
|
|
case 4:
|
|
rt = 1.0;
|
|
break;
|
|
case 5:
|
|
rt = 3.0 / 2;
|
|
break;
|
|
case 6:
|
|
rt = 2;
|
|
break;
|
|
case 7:
|
|
rt = 3;
|
|
break;
|
|
case 8:
|
|
rt = 4;
|
|
break;
|
|
default:
|
|
rt = 1;
|
|
break;
|
|
}
|
|
syncRate = rt;
|
|
}
|
|
};
|