summaryrefslogtreecommitdiff
path: root/muse_qt4_evolution/synti/zynaddsubfx/Effects/EffectMgr.C
diff options
context:
space:
mode:
Diffstat (limited to 'muse_qt4_evolution/synti/zynaddsubfx/Effects/EffectMgr.C')
-rw-r--r--muse_qt4_evolution/synti/zynaddsubfx/Effects/EffectMgr.C292
1 files changed, 292 insertions, 0 deletions
diff --git a/muse_qt4_evolution/synti/zynaddsubfx/Effects/EffectMgr.C b/muse_qt4_evolution/synti/zynaddsubfx/Effects/EffectMgr.C
new file mode 100644
index 00000000..efdb672a
--- /dev/null
+++ b/muse_qt4_evolution/synti/zynaddsubfx/Effects/EffectMgr.C
@@ -0,0 +1,292 @@
+/*
+ ZynAddSubFX - a software synthesizer
+
+ EffectMgr.C - Effect manager, an interface betwen the program and 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) 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 <stdlib.h>
+#include <stdio.h>
+#include "EffectMgr.h"
+#include "../Misc/Master.h"
+
+EffectMgr::EffectMgr(int insertion_,Master* master_){
+ setpresettype("Peffect");
+ efx=NULL;
+ nefx=0;
+ insertion=insertion_;
+ master=master_;
+ efxoutl=new REALTYPE[SOUND_BUFFER_SIZE];
+ efxoutr=new REALTYPE[SOUND_BUFFER_SIZE];;
+ for (int i=0;i<SOUND_BUFFER_SIZE;i++){
+ efxoutl[i]=0.0;
+ efxoutr[i]=0.0;
+ };
+ filterpars=NULL;
+ dryonly=false;
+ defaults();
+};
+
+
+EffectMgr::~EffectMgr(){
+ if (efx!=NULL) delete (efx);
+ delete (efxoutl);
+ delete (efxoutr);
+};
+
+void EffectMgr::defaults(){
+ changeeffect(0);
+ setdryonly(false);
+};
+
+/*
+ * Change the effect
+ */
+void EffectMgr::changeeffect(int nefx_){
+ cleanup();
+ if (nefx==nefx_) return;
+ nefx=nefx_;
+ for (int i=0;i<SOUND_BUFFER_SIZE;i++){
+ efxoutl[i]=0.0;
+ efxoutr[i]=0.0;
+ };
+
+ if (efx!=NULL) delete (efx);
+ switch (nefx){
+ case 1:efx=new Reverb(insertion,efxoutl,efxoutr);break;
+ case 2:efx=new Echo(insertion,efxoutl,efxoutr);break;
+ case 3:efx=new Chorus(insertion,efxoutl,efxoutr);break;
+ case 4:efx=new Phaser(insertion,efxoutl,efxoutr);break;
+ case 5:efx=new Alienwah(insertion,efxoutl,efxoutr);break;
+ case 6:efx=new Distorsion(insertion,efxoutl,efxoutr);break;
+ case 7:efx=new EQ(insertion,efxoutl,efxoutr);break;
+ case 8:efx=new DynamicFilter(insertion,efxoutl,efxoutr);break;
+ //put more effect here
+ default:efx=NULL;break;//no effect (thru)
+ };
+
+ if (efx!=NULL) filterpars=efx->filterpars;
+};
+
+/*
+ * Obtain the effect number
+ */
+int EffectMgr::geteffect(){
+ return (nefx);
+};
+
+/*
+ * Cleanup the current effect
+ */
+void EffectMgr::cleanup(){
+ if (efx!=NULL) efx->cleanup();
+};
+
+
+/*
+ * Get the preset of the current effect
+ */
+
+unsigned char EffectMgr::getpreset(){
+ if (efx!=NULL) return(efx->Ppreset);
+ else return(0);
+};
+
+/*
+ * Change the preset of the current effect
+ */
+void EffectMgr::changepreset_nolock(unsigned char npreset){
+ if (efx!=NULL) efx->setpreset(npreset);
+};
+
+/*
+ * Change the preset of the current effect(with thread locking)
+ */
+void EffectMgr::changepreset(unsigned char npreset){
+ master->lock();
+ changepreset_nolock(npreset);
+ master->unlock();
+};
+
+
+/*
+ * Change a parameter of the current effect
+ */
+void EffectMgr::seteffectpar_nolock(int npar,unsigned char value){
+ if (efx==NULL) return;
+ efx->changepar(npar,value);
+};
+
+/*
+ * Change a parameter of the current effect (with thread locking)
+ */
+void EffectMgr::seteffectpar(int npar,unsigned char value){
+ master->lock();
+ seteffectpar_nolock(npar,value);
+ master->unlock();
+};
+
+/*
+ * Get a parameter of the current effect
+ */
+unsigned char EffectMgr::geteffectpar(int npar){
+ if (efx==NULL) return(0);
+ return(efx->getpar(npar));
+};
+
+
+/*
+ * Apply the effect
+ */
+void EffectMgr::out(REALTYPE *smpsl,REALTYPE *smpsr){
+ int i;
+ if (efx==NULL){
+ if (insertion==0)
+ for (i=0;i<SOUND_BUFFER_SIZE;i++){
+ smpsl[i]=0.0;smpsr[i]=0.0;
+ efxoutl[i]=0.0;efxoutr[i]=0.0;
+ };
+ return;
+ };
+ for (i=0;i<SOUND_BUFFER_SIZE;i++){
+ smpsl[i]+=denormalkillbuf[i];
+ smpsr[i]+=denormalkillbuf[i];
+ efxoutl[i]=0.0;
+ efxoutr[i]=0.0;
+ };
+ efx->out(smpsl,smpsr);
+
+ REALTYPE volume=efx->volume;
+
+ if (nefx==7){//this is need only for the EQ effect
+ for (i=0;i<SOUND_BUFFER_SIZE;i++){
+ smpsl[i]=efxoutl[i];
+ smpsr[i]=efxoutr[i];
+ };
+ return;
+ };
+
+ //Insertion effect
+ if (insertion!=0) {
+ REALTYPE v1,v2;
+ if (volume<0.5) {
+ v1=1.0;
+ v2=volume*2.0;
+ } else {
+ v1=(1.0-volume)*2.0;
+ v2=1.0;
+ };
+ if ((nefx==1)||(nefx==2)) v2*=v2;//for Reverb and Echo, the wet function is not liniar
+
+ if (dryonly){//this is used for instrument effect only
+ for (i=0;i<SOUND_BUFFER_SIZE;i++){
+ smpsl[i]*=v1;
+ smpsr[i]*=v1;
+ efxoutl[i]*=v2;
+ efxoutr[i]*=v2;
+ };
+ }else{//normal instrument/insertion effect
+ for (i=0;i<SOUND_BUFFER_SIZE;i++){
+ smpsl[i]=smpsl[i]*v1+efxoutl[i]*v2;
+ smpsr[i]=smpsr[i]*v1+efxoutr[i]*v2;
+ };
+ };
+ } else {//System effect
+ for (i=0;i<SOUND_BUFFER_SIZE;i++){
+ efxoutl[i]*=2.0*volume;
+ efxoutr[i]*=2.0*volume;
+ smpsl[i]=efxoutl[i];
+ smpsr[i]=efxoutr[i];
+ };
+ };
+
+};
+
+/*
+ * Get the effect volume for the system effect
+ */
+REALTYPE EffectMgr::sysefxgetvolume(){
+ if (efx==NULL) return (1.0);
+ else return(efx->outvolume);
+};
+
+
+/*
+ * Get the EQ response
+ */
+REALTYPE EffectMgr::getEQfreqresponse(REALTYPE freq){
+ if (nefx==7) return(efx->getfreqresponse(freq));
+ else return(0.0);
+};
+
+
+void EffectMgr::setdryonly(bool value){
+ dryonly=value;
+};
+
+void EffectMgr::add2XML(XMLwrapper *xml){
+ xml->addpar("type",geteffect());
+
+ if ((efx==NULL)||(geteffect()==0)) return;
+ xml->addpar("preset",efx->Ppreset);
+
+ xml->beginbranch("EFFECT_PARAMETERS");
+ for (int n=0;n<128;n++){
+ int par=geteffectpar(n);
+ if (par==0) continue;
+ xml->beginbranch("par_no",n);
+ xml->addpar("par",par);
+ xml->endbranch();
+ };
+ if (filterpars!=NULL){
+ xml->beginbranch("FILTER");
+ filterpars->add2XML(xml);
+ xml->endbranch();
+ };
+ xml->endbranch();
+};
+
+void EffectMgr::getfromXML(XMLwrapper *xml){
+ changeeffect(xml->getpar127("type",geteffect()));
+
+ if ((efx==NULL)||(geteffect()==0)) return;
+
+ efx->Ppreset=xml->getpar127("preset",efx->Ppreset);
+
+ if (xml->enterbranch("EFFECT_PARAMETERS")){
+ for (int n=0;n<128;n++){
+ seteffectpar_nolock(n,0);//erase effect parameter
+ if (xml->enterbranch("par_no",n)==0) continue;
+
+ int par=geteffectpar(n);
+ seteffectpar_nolock(n,xml->getpar127("par",par));
+ xml->exitbranch();
+ };
+ if (filterpars!=NULL){
+ if (xml->enterbranch("FILTER")){
+ filterpars->getfromXML(xml);
+ xml->exitbranch();
+ };
+ };
+ xml->exitbranch();
+ };
+ cleanup();
+};
+
+
+