找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1685|回复: 0
收起左侧

Tremolo效果

[复制链接]
ID:230485 发表于 2017-9-1 22:51 | 显示全部楼层 |阅读模式
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);

}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表