home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / ZynAddFX / Setup_ZynAddSubFX-2.1.1.exe / EQ.C < prev    next >
Encoding:
C/C++ Source or Header  |  2004-07-12  |  4.2 KB  |  200 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   EQ.C - EQ effect
  5.   Copyright (C) 2002-2004 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <math.h>
  26. #include "EQ.h"
  27.  
  28. EQ::EQ(int insertion_,REALTYPE *efxoutl_,REALTYPE *efxoutr_){
  29.     efxoutl=efxoutl_;
  30.     efxoutr=efxoutr_;
  31.     insertion=insertion_;
  32.     filterpars=NULL;
  33.     
  34.     for (int i=0;i<MAX_EQ_BANDS;i++){
  35.     filter[i].Ptype=0;
  36.     filter[i].Pfreq=64;
  37.     filter[i].Pgain=64;
  38.     filter[i].Pq=64;
  39.     filter[i].Pstages=0;
  40.     filter[i].l=new AnalogFilter(6,1000.0,1.0,0);
  41.     filter[i].r=new AnalogFilter(6,1000.0,1.0,0);
  42.     };
  43.     //default values
  44.     Ppreset=0;
  45.     Pvolume=50;
  46.     
  47.     setpreset(Ppreset);           
  48.     cleanup();
  49. };
  50.  
  51. EQ::~EQ(){
  52. };
  53.  
  54. /*
  55.  * Cleanup the effect
  56.  */
  57. void EQ::cleanup(){
  58.     for (int i=0;i<MAX_EQ_BANDS;i++){
  59.     filter[i].l->cleanup();
  60.     filter[i].r->cleanup();
  61.     };
  62. };
  63.  
  64.  
  65.  
  66. /*
  67.  * Effect output
  68.  */
  69. void EQ::out(REALTYPE *smpsl,REALTYPE *smpsr){
  70.     int i;
  71.  
  72.     for (i=0;i<SOUND_BUFFER_SIZE;i++){
  73.     efxoutl[i]=smpsl[i]*volume;
  74.     efxoutr[i]=smpsr[i]*volume;
  75.     };
  76.     
  77.     for (i=0;i<MAX_EQ_BANDS;i++){
  78.     if (filter[i].Ptype==0) continue;
  79.     filter[i].l->filterout(efxoutl);
  80.     filter[i].r->filterout(efxoutr);
  81.     };
  82. };
  83.  
  84.  
  85. /*
  86.  * Parameter control
  87.  */
  88. void EQ::setvolume(unsigned char Pvolume){
  89.     this->Pvolume=Pvolume;
  90.  
  91.     outvolume=pow(0.005,(1.0-Pvolume/127.0))*10.0;
  92.     if (insertion==0) {
  93.     volume=1.0;
  94.     } else {
  95.     volume=outvolume;
  96.     };
  97.  
  98. };
  99.  
  100.  
  101. void EQ::setpreset(unsigned char npreset){
  102.     const int PRESET_SIZE=1;
  103.     const int NUM_PRESETS=2;
  104.     unsigned char presets[NUM_PRESETS][PRESET_SIZE]={
  105.     //EQ 1
  106.     {67},
  107.     //EQ 2
  108.     {67}};
  109.  
  110.     if (npreset>=NUM_PRESETS) npreset=NUM_PRESETS-1;
  111.     for (int n=0;n<PRESET_SIZE;n++) changepar(n,presets[npreset][n]);
  112.     Ppreset=npreset;
  113. };
  114.  
  115.  
  116. void EQ::changepar(int npar,unsigned char value){
  117.     switch (npar){
  118.     case 0: setvolume(value);
  119.         break;
  120.     };
  121.     if (npar<10) return;
  122.     
  123.     int nb=(npar-10)/5;//number of the band (filter)
  124.     if (nb>=MAX_EQ_BANDS) return;
  125.     int bp=npar%5;//band paramenter
  126.     
  127.     REALTYPE tmp;
  128.     switch(bp){
  129.     case 0: if (value>9) value=0;//has to be changed if more filters will be added
  130.             filter[nb].Ptype=value;
  131.         if (value!=0){
  132.             filter[nb].l->settype(value-1);
  133.             filter[nb].r->settype(value-1);
  134.         };
  135.         break;
  136.     case 1: filter[nb].Pfreq=value;
  137.         tmp=600.0*pow(30.0,(value-64.0)/64.0);
  138.         filter[nb].l->setfreq(tmp);
  139.         filter[nb].r->setfreq(tmp);
  140.         break;
  141.     case 2: filter[nb].Pgain=value;
  142.         tmp=30.0*(value-64.0)/64.0;
  143.         filter[nb].l->setgain(tmp);
  144.         filter[nb].r->setgain(tmp);
  145.         break;
  146.     case 3: filter[nb].Pq=value;
  147.         tmp=pow(30.0,(value-64.0)/64.0);
  148.         filter[nb].l->setq(tmp);
  149.         filter[nb].r->setq(tmp);
  150.         break;
  151.     case 4: if (value>=MAX_FILTER_STAGES) value=MAX_FILTER_STAGES-1;
  152.         filter[nb].Pstages=value;
  153.         filter[nb].l->setstages(value);
  154.         filter[nb].r->setstages(value);
  155.         break;
  156.     };
  157. };
  158.  
  159. unsigned char EQ::getpar(int npar){
  160.     switch (npar){
  161.     case 0: return(Pvolume);
  162.         break;
  163.     };
  164.  
  165.     if (npar<10) return(0);
  166.     
  167.     int nb=(npar-10)/5;//number of the band (filter)
  168.     if (nb>=MAX_EQ_BANDS) return(0);
  169.     int bp=npar%5;//band paramenter
  170.     switch(bp){
  171.     case 0: return(filter[nb].Ptype);
  172.         break;
  173.     case 1: return(filter[nb].Pfreq);
  174.         break;
  175.     case 2: return(filter[nb].Pgain);
  176.         break;
  177.     case 3: return(filter[nb].Pq);
  178.         break;
  179.     case 4: return(filter[nb].Pstages);
  180.         break;
  181.     };
  182.  
  183.     return(0);//in case of bogus parameter number
  184. };
  185.  
  186.  
  187.  
  188.  
  189. REALTYPE EQ::getfreqresponse(REALTYPE freq){
  190.     REALTYPE resp=1.0;
  191.  
  192.     for (int i=0;i<MAX_EQ_BANDS;i++){
  193.     if (filter[i].Ptype==0) continue;
  194.     resp*=filter[i].l->H(freq);
  195.     };
  196.     return(rap2dB(resp*outvolume));
  197. };
  198.  
  199.  
  200.