long Tremolo(long TremIn, long RateTp, long ShapeTp,long DepthTp,int ModeValue) //in 32bit, out 24bit
{
//-------------------------parameter--------------------------------
RateTp=RateTp*10>>4;
if(Rate>RateTp)
Rate--;
if(Rate<RateTp)
Rate++;
if(Shape>ShapeTp)
Shape--;
if(Shape<ShapeTp)
Shape++;
if(Depth>DepthTp)
Depth--;
if(Depth<DepthTp)
Depth++;
//-------------------------fade in and out--------------------------
DryIn=TremIn;
if(ModeValue!=ModeValue_1)
{
FlgFade=1;
}
ModeValue_1=ModeValue;
if(FlgFade==1)
{
FdGn-=2;
if(FdGn<=0)
{
ModeValueFd=ModeValue;
FlgFade=2;
}
}
if(FlgFade==2)
{
FdGn+=2;
if(FdGn>=16384)
{
FlgFade=0;
FdGn=16384;
}
}
//-----------------Mod signal----------------
//ModeValue=2;
if(ModeValueFd==0)
{
TremI+=(Rate>>6)+1;
}
if(ModeValueFd==1)
{
TremI+=(Rate>>6)+1;
}
if(ModeValueFd==2)
{
TrmCnt++;
if(TrmCnt>12)
TrmCnt=12;
switch (CntGhge)
{
case 0:
VarStep=0;break;
case 1:
VarStep=(Rate>>6);break;
case 2:
VarStep=(Rate>>6);break;
}
if(TremGn1>31101 && TremGn1_1<=31101)
{
CntGhge++;
}
TremGn1_1=TremGn1;
if(CntGhge>2)
CntGhge=0;
TremI+=((Rate>>7)+(VarStep))+1;
}
if(TremI>131071)
TremI-=131071;
TremI1=TremI-32767;
if(TremI1<0)
TremI1+=131071;
TremGn1=TriCurve((TremI1>>1));
if(TremI>16384 && TremI<49152)
TremGn2Tp=0;
else
TremGn2Tp=32767;
if(TremGn2<TremGn2Tp)
{
TremGn2+=100;
if(TremGn2>TremGn2Tp)
TremGn2=TremGn2Tp;
}
if(TremGn2>TremGn2Tp)
{
TremGn2-=100;
if(TremGn2<0)
TremGn2=0;
}
TremGn=(TremGn2*Shape+TremGn1*(4095-Shape))>>12;
//---------------------high pass-------------------------
//{16743445,-33486891,16743445,33486823,-16709743,},
fout2=((long long)TremIn*16743445-in2_1*33486891+in2_2*16743445+fout2_1*33486823-fout2_2*16709743)>>24;
in2_2=in2_1;
in2_1=TremIn;
fout2_2=fout2_1;
fout2_1=fout2;
TremIn=fout2;
if(ModeValueFd!=1)
{ //{14293233,-25310113,11143280,31637641,-15018425,}
fout=((long long)TremIn*14293233-in_1*25310113\
+in_2*11143280+fout_1*31637641-fout_2*15018425)>>24;
in_2=in_1;
in_1=TremIn;
fout_2=fout_1;
fout_1=fout;
//TremIn=fout;
}
if(ModeValueFd==1)
{
fout=((long long)TremIn*FilterParm[(TremGn1>>9)][0]+in_1*FilterParm[(TremGn1>>9)][1]\
+in_2*FilterParm[(TremGn1>>9)][2]+fout_1*FilterParm[(TremGn1>>9)][3]\
+fout_2*FilterParm[(TremGn1>>9)][4])>>24;
in_2=in_1;
in_1=TremIn;
fout_2=fout_1;
fout_1=fout;
//TremIn=fout;
}
//--------------------tremolo------------------------
TremOut=fout*8192>>14;
TremOut=(long long)TremOut*TremGn>>14;
//TremIn=((long long)TremIn*14000>>13);
TremOut=((long long)TremOut*Depth+(long long)DryIn*(4096-Depth))>>12;
TremOut=TremOut*FdGn>>14;
if(TremOut>8388607)
TremOut=8388607;
if(TremOut<-8388607)
TremOut=-8388607;
return (TremOut);
}
|