paulstretch_cpp

PaulStretch
Log | Files | Refs | LICENSE

commit 4b851d9ac3fb7023f39949122c43b5f73a676db4
parent 6263436911a0299afdd35f039fff5f583f17da5c
Author: Nasca Octavian PAUL <zynaddsubfx@yahoo.com>
Date:   Wed,  2 Mar 2011 22:04:12 +0200

Started to implement onset detection

Diffstat:
MStretch.cpp | 46++++++++++++++++++++++++++++++++++++++++++++++
MStretch.h | 9++++++++-
Mreadme.txt | 5+----
3 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/Stretch.cpp b/Stretch.cpp @@ -142,6 +142,13 @@ void FFT::applywindow(FFTWindow type){ Stretch::Stretch(REALTYPE rap_,int bufsize_,FFTWindow w,bool bypass_,REALTYPE samplerate_,int stereo_mode_){ + onset_detection_strength=0.0; + + +#warning test + onset_detection_strength=0.5; + + samplerate=samplerate_; rap=rap_; @@ -214,6 +221,44 @@ void Stretch::do_next_inbuf_smps(REALTYPE *smps){ }; }; +//static bool kuku=false; +REALTYPE Stretch::do_detect_onset(){ + //kuku=!kuku; + REALTYPE result=0.0; + if (onset_detection_strength>1e-3){ + REALTYPE os=0.0,osinc=0.0; + REALTYPE osincold=1e-5; + int maxk=1+(int)(bufsize*500.0/(samplerate*0.5)); + int k=0; + for (int i=0;i<bufsize;i++) { + osinc+=infft->freq[i]-old_freq[i]; + osincold+=old_freq[i]; + if (k>=maxk) { + k=0; + os+=osinc/osincold; + osinc=0; + }; + k++; + }; + os+=osinc; + if (os<0.0) os=0.0; + //if (os>1.0) os=1.0; + + REALTYPE os_strength=pow(20.0,sqrt(1.0-onset_detection_strength))-1.0; + REALTYPE os_strength_h=os_strength*0.75; + if (os>os_strength_h){ + result=(os-os_strength_h)/(os_strength-os_strength_h); + if (result>1.0) result=1.0; + }; + + //if (kuku) printf("%g\n",result); + //if (kuku) printf("(%g %g) %g => %g\n",os_strength,os_strength_h,os,result); + + if (result>1.0) result=1.0; + }; + return result; +}; + void Stretch::process(REALTYPE *smps,int nsmps){ if (bypass){ for (int i=0;i<bufsize;i++) out_buf[i]=smps[i]; @@ -228,6 +273,7 @@ void Stretch::process(REALTYPE *smps,int nsmps){ if (nsmps!=0){//new data arrived: update the frequency components do_analyse_inbuf(smps); if (nsmps==bufsize*2) do_analyse_inbuf(smps+bufsize); + REALTYPE onset=do_detect_onset(); }; diff --git a/Stretch.h b/Stretch.h @@ -69,6 +69,10 @@ class Stretch{ return bufsize; }; + REALTYPE get_onset_detection_strength(){ + return onset_detection_strength; + }; + void process(REALTYPE *smps,int nsmps); // virtual void process_output(REALTYPE *smps,int nsmps){}; @@ -80,6 +84,8 @@ class Stretch{ void set_rap(REALTYPE newrap);//set the current stretch value + void set_onset_detection_strength(REALTYPE detection_strength); + FFTWindow window_type; protected: int bufsize; @@ -92,9 +98,10 @@ class Stretch{ void do_analyse_inbuf(REALTYPE *smps); void do_next_inbuf_smps(REALTYPE *smps); + REALTYPE do_detect_onset(); // REALTYPE *in_pool;//de marimea in_bufsize - REALTYPE rap; + REALTYPE rap,onset_detection_strength; REALTYPE *old_out_smps; REALTYPE *old_freq; REALTYPE *new_smps,*old_smps,*very_old_smps; diff --git a/readme.txt b/readme.txt @@ -16,10 +16,6 @@ Requirements: This algorithm/program is suitable only for extreme stretching the audio. -There is lot room for improvements on this algorithm like: - - on sharp attacks to make the window smaller and larger on steady sounds. This avoid adding constant sidebands on steady sounds and smoothing too much the sharp sounds. - - even for small window, the sidebands produced can be lowered (how?) - Tips: You can change the default output device with "PA_RECOMMENDED_OUTPUT_DEVICE" environment variable (used by PortAudio). eg: set PA_RECOMMENDED_OUTPUT_DEVICE=1 #where 1 represents the index of the device; you can try other values for other devices @@ -75,6 +71,7 @@ History: 2011????(2.) - Added an option to preserve the tonal part or noise part - Ignored the commandline parameters starting with "-" (usefull for macosx) + - Improved the algorithm Enjoy! :) Paul