From 765975283f9db445bce92c619440ff03aae165a2 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 29 Sep 2009 23:28:01 +0300 Subject: [PATCH] Bandwidth effect on Reverb (cherry picked from commit cefe2b53d04b1d5de3b51e0f977abcd5d8528619) --- plugins/zynaddsubfx/ChangeLog | 3 + plugins/zynaddsubfx/src/DSP/CMakeLists.txt | 1 + plugins/zynaddsubfx/src/DSP/Unison.cpp | 27 +---- plugins/zynaddsubfx/src/DSP/Unison.h | 5 +- plugins/zynaddsubfx/src/Effects/Reverb.cpp | 128 ++------------------- plugins/zynaddsubfx/src/Effects/Reverb.h | 121 +------------------ plugins/zynaddsubfx/src/globals.h | 1 + 7 files changed, 28 insertions(+), 258 deletions(-) diff --git a/plugins/zynaddsubfx/ChangeLog b/plugins/zynaddsubfx/ChangeLog index 9a184b2ee..f10b64709 100644 --- a/plugins/zynaddsubfx/ChangeLog +++ b/plugins/zynaddsubfx/ChangeLog @@ -934,3 +934,6 @@ 25 Sep 2009 (Mark McCurry) - Allowed for XMLwrapper to retrieve strings stored in mxml TEXT fields +29 Sep 2009 (Paul Nasca) + - Remove the old (FFT based) Bandwidth effect to Reverb and started rewrite it (based on multivoice chorus/unison effect) + \ No newline at end of file diff --git a/plugins/zynaddsubfx/src/DSP/CMakeLists.txt b/plugins/zynaddsubfx/src/DSP/CMakeLists.txt index 8169235e0..c13cd316c 100644 --- a/plugins/zynaddsubfx/src/DSP/CMakeLists.txt +++ b/plugins/zynaddsubfx/src/DSP/CMakeLists.txt @@ -4,6 +4,7 @@ set(zynaddsubfx_dsp_SRCS Filter.cpp FormantFilter.cpp SVFilter.cpp + Unison.cpp ) add_library(zynaddsubfx_dsp STATIC diff --git a/plugins/zynaddsubfx/src/DSP/Unison.cpp b/plugins/zynaddsubfx/src/DSP/Unison.cpp index 2a273671c..8e09f2c60 100644 --- a/plugins/zynaddsubfx/src/DSP/Unison.cpp +++ b/plugins/zynaddsubfx/src/DSP/Unison.cpp @@ -73,7 +73,7 @@ void Unison::update_parameters(){ }; #warning compute unison_amplitude_samples in functie de centi - unison_amplitude_samples=20.0; + unison_amplitude_samples=200.0; if (unison_amplitude_samples>=max_delay-1) unison_amplitude_samples=max_delay-2; @@ -96,7 +96,7 @@ void Unison::process(int bufsize,REALTYPE *inbuf,REALTYPE *outbuf){ xpos+=xpos_step; REALTYPE in=inbuf[i],out=0.0; - + REALTYPE sign=1.0; for (int k=0;k=max_delay) posi-=max_delay; posf=pos-floor(pos); - out+=(1.0-posf)*delay_buffer[posi]+posf*delay_buffer[posi+1]; + out+=((1.0-posf)*delay_buffer[posi]+posf*delay_buffer[posi+1])*sign; + sign=-sign; }; outbuf[i]=out*volume; // printf("%d %g\n",i,outbuf[i]); @@ -129,8 +130,7 @@ void Unison::update_unison_data(){ pos=1.0; step=-step; }; - //REALTYPE vibratto_val=pos-0.35*pos*pos*pos;//make the vibratto lfo smoother - REALTYPE vibratto_val=(pos+1); + REALTYPE vibratto_val=pos-0.35*pos*pos*pos;//make the vibratto lfo smoother REALTYPE newval=1.0+0.5*(vibratto_val+1.0)*unison_amplitude_samples; if (first_time){ @@ -146,21 +146,4 @@ void Unison::update_unison_data(){ if (first_time) first_time=false; }; -/* -int main(){ - srand(time(NULL)); - Unison unison(10,0.2); - //unison.set_base_frequency(1.0); - - int bufsize=100; - REALTYPE in[bufsize],out[bufsize]; - ZERO_REALTYPE (in,bufsize); - ZERO_REALTYPE (out,bufsize); - in[20]=1; - for (int i=0;i<100000;i++) unison.process(bufsize,in,out); - for (int i=0;i #include "../globals.h" @@ -31,6 +32,8 @@ class Unison{ void set_size(int new_size); void set_base_frequency(REALTYPE freq); + void set_bandwidth(REALTYPE bandwidth_cents){ + }; void process(int bufsize,REALTYPE *inbuf,REALTYPE *outbuf=NULL); @@ -44,7 +47,7 @@ class Unison{ REALTYPE step,position;//base LFO REALTYPE realpos1,realpos2; //the position regarding samples int lin_ipos,lin_ifreq; -#error sa calculez frecventa si pozitia a.i. la inceput sa fie realpos1 si la final sa fie realpos2 +//#error sa calculez frecventa si pozitia a.i. la inceput sa fie realpos1 si la final sa fie realpos2 REALTYPE lin_fpos,lin_ffreq; UnisonVoice(){ position=RND*1.8-0.9; diff --git a/plugins/zynaddsubfx/src/Effects/Reverb.cpp b/plugins/zynaddsubfx/src/Effects/Reverb.cpp index ba21af858..b68a1e9ba 100644 --- a/plugins/zynaddsubfx/src/Effects/Reverb.cpp +++ b/plugins/zynaddsubfx/src/Effects/Reverb.cpp @@ -25,114 +25,6 @@ /**\todo: EarlyReflections,Prdelay,Perbalance */ -ReverbBandwidth::ReverbBandwidth (int small_buffer_size_,int n_small_buffers_per_half_big_buffer_): - OverlapAdd (small_buffer_size_,n_small_buffers_per_half_big_buffer_){ - bandwidth=0.1; - fft=new FFTwrapper(big_buffer_size); - newFFTFREQS(&freqs,half_big_buffer_size); - srcfreq=new REALTYPE[half_big_buffer_size]; - destfreq=new REALTYPE[half_big_buffer_size]; - tmpfreq=new REALTYPE[half_big_buffer_size]; - window=new REALTYPE[big_buffer_size]; - ZERO(srcfreq,half_big_buffer_size); - ZERO(destfreq,half_big_buffer_size); - ZERO(tmpfreq,half_big_buffer_size); - - for (int i=0;ismps2freqs(big_buffer,freqs); - for (int i=0;i>16)&0x7fff; - REALTYPE phase=rand*inv_2p15_2pi; - freqs.c[i]=destfreq[i]*cos(phase); - freqs.s[i]=destfreq[i]*sin(phase); - }; - - - fft->freqs2smps(freqs,big_buffer); - for (int i=0;i=nfreq) x0=nfreq-1; - int x1=x0+1; if (x1>=nfreq) x1=nfreq-1; - REALTYPE xp=x-x0; - if (x0;i--){ - tmpfreq[i]=tmpfreq[i+1]*a+tmpfreq[i]*(1.0-a); - }; - }; - - freq2[0]=0; - REALTYPE log_maxfreq_d_minfreq=log(maxfreq/minfreq); - for (int i=1;i0.0)&&(x=nfreq) x0=nfreq-1; - int x1=x0+1; if (x1>=nfreq) x1=nfreq-1; - REALTYPE xp=x-x0; - y=tmpfreq[x0]*(1.0-xp)+tmpfreq[x1]*xp; - }; - freq2[i]=y; - }; -}; - - Reverb::Reverb(const int &insertion_,REALTYPE *efxoutl_,REALTYPE *efxoutr_) :Effect(insertion_,efxoutl_,efxoutr_,NULL,0) { @@ -269,6 +161,7 @@ void Reverb::out(REALTYPE *smps_l, REALTYPE *smps_r) for (i=0;i=idelaylen) idelayk=0; + if (idelayk>=idelaylen) { + idelayk=0; + }; }; - }; + }; - if (bandwidth) bandwidth->process(inputbuf); + if (bandwidth) bandwidth->process(SOUND_BUFFER_SIZE,inputbuf); if (lpf!=NULL) lpf->filterout(inputbuf); if (hpf!=NULL) hpf->filterout(inputbuf); @@ -458,11 +353,10 @@ void Reverb::settype(unsigned char Ptype) if (bandwidth) delete bandwidth; bandwidth=NULL; if (Ptype==2){//bandwidth - -#warning sa calculez numarul optim de buffere - bandwidth=new ReverbBandwidth(SOUND_BUFFER_SIZE,32); - - + bandwidth=new Unison(SOUND_BUFFER_SIZE/4+1,0.5); + bandwidth->set_size(50); + bandwidth->set_base_frequency(1.0); +#warning sa schimb size-ul }; }; @@ -479,7 +373,7 @@ void Reverb::setroomsize(const unsigned char &Proomsize) void Reverb::setbandwidth(const unsigned char &Pbandwidth){ this->Pbandwidth=Pbandwidth; - if (bandwidth) bandwidth->set_bandwidth(Pbandwidth/127.0); + if (bandwidth) bandwidth->set_bandwidth(Pbandwidth/127.0*200.0); }; void Reverb::setpreset(unsigned char npreset) diff --git a/plugins/zynaddsubfx/src/Effects/Reverb.h b/plugins/zynaddsubfx/src/Effects/Reverb.h index 4a43b54da..82ca96a6b 100644 --- a/plugins/zynaddsubfx/src/Effects/Reverb.h +++ b/plugins/zynaddsubfx/src/Effects/Reverb.h @@ -27,6 +27,7 @@ #include "../globals.h" #include "../DSP/AnalogFilter.h" #include "../DSP/FFTwrapper.h" +#include "../DSP/Unison.h" #include "Effect.h" #define REV_COMBS 8 @@ -34,122 +35,6 @@ /**Creates Reverberation Effects*/ -class OverlapAdd{//50% overlap - public: - OverlapAdd(int small_buffer_size_,int n_small_buffers_per_half_big_buffer_){ - small_buffer_size=small_buffer_size_; - n_small_buffers_per_half_big_buffer=n_small_buffers_per_half_big_buffer_; - half_big_buffer_size=small_buffer_size*n_small_buffers_per_half_big_buffer; - big_buffer_size=half_big_buffer_size*2; - - new_half_big_buffer_input=new REALTYPE[half_big_buffer_size]; - old_half_big_buffer_input=new REALTYPE[half_big_buffer_size]; - new_half_big_buffer_processed=new REALTYPE[half_big_buffer_size]; - half_big_buffer_output=new REALTYPE[half_big_buffer_size]; - big_buffer=new REALTYPE[big_buffer_size]; - for (int i=0;i=n_small_buffers_per_half_big_buffer){ - small_buffer_k=0; - process_big_buffer(); - }; - - int output_start_pos=small_buffer_size*small_buffer_k; //check if this is correct - - for (int i=0;i1.0) par=1.0; - bandwidth=par; - }; - private: - void do_process_big_buffer(); - FFTwrapper *fft; - FFTFREQS freqs; - REALTYPE *srcfreq,*destfreq,*tmpfreq; - REALTYPE *window; - REALTYPE bandwidth; -}; - class Reverb:public Effect { public: @@ -218,14 +103,14 @@ private: void setbandwidth(const unsigned char &Pbandwidth); REALTYPE pan,erbalance; - //Parametrii 2 + //Parameters int lohidamptype;/**<0=disable,1=highdamp(lowpass),2=lowdamp(highpass)*/ int idelaylen,rdelaylen; int idelayk; REALTYPE lohifb,idelayfb,roomsize,rs;//rs is used to "normalise" the volume according to the roomsize int comblen[REV_COMBS*2]; int aplen[REV_APS*2]; - ReverbBandwidth *bandwidth; + Unison *bandwidth; //Internal Variables diff --git a/plugins/zynaddsubfx/src/globals.h b/plugins/zynaddsubfx/src/globals.h index f13da7d95..5ad669daa 100644 --- a/plugins/zynaddsubfx/src/globals.h +++ b/plugins/zynaddsubfx/src/globals.h @@ -184,6 +184,7 @@ extern int OSCIL_SIZE; #define RND (rand()/(RAND_MAX+1.0)) #define ZERO(data,size) {char *data_=(char *) data;for (int i=0;i