paulstretch_cpp

PaulStretch
Log | Files | Refs | LICENSE

commit 5192e3ed1c67aaca76129b862b8b26c7c30954fe
parent 1a9012c39ab1da3684c063bcd71ad4cae5844701
Author: Nasca Octavian PAUL <zynaddsubfx@yahoo.com>
Date:   Sun, 27 Feb 2011 12:56:30 +0200

Tonal/Noise preserve

Diffstat:
MGUI.fl | 38++++++++++++++++++++++++++++++++------
MProcessedStretch.cpp | 50+++++++++++++++++++++++++++++++++++++++++++++++++-
MProcessedStretch.h | 13+++++++++++++
Mreadme.txt | 3+++
4 files changed, 97 insertions(+), 7 deletions(-)

diff --git a/GUI.fl b/GUI.fl @@ -188,7 +188,7 @@ rendering=false;} {} } { Fl_Window window { label {Paul's Extreme Sound Stretch} open - xywh {54 265 995 550} type Double resizable + xywh {192 131 995 550} type Double resizable code0 {if(strlen(VERSION)<2) {o->color(FL_BLUE); o->label("VERSION NOT SET!!!!!!!!!!!!");};} visible } { Fl_Menu_Bar {} {open @@ -385,7 +385,7 @@ stretch_slider->do_callback();} } } Fl_Group {} { - label Process + label Process open xywh {5 70 985 400} hide } { Fl_Group {} {open @@ -469,19 +469,19 @@ control.update_process_parameters();} } } Fl_Group {} {open - xywh {605 75 120 65} box BORDER_BOX + xywh {750 75 120 65} box BORDER_BOX } { Fl_Check_Button compressor_enabled { label Compress callback {control.ppar.compressor.enabled=o->value(); control.update_process_parameters();} - xywh {610 80 90 15} down_box DOWN_BOX labelfont 1 + xywh {755 80 90 15} down_box DOWN_BOX labelfont 1 } Fl_Slider compressor_power { label Power callback {control.ppar.compressor.power=o->value(); control.update_process_parameters();} - xywh {610 100 110 15} type {Horz Knob} + xywh {755 100 110 15} type {Horz Knob} } } Fl_Slider {} { @@ -489,7 +489,7 @@ control.update_process_parameters();} callback {REALTYPE x=o->value(); x=pow(10.0,pow(x,1.5)-1.0)-0.1; control.set_volume(x);} - xywh {605 155 120 40} type {Horz Knob} labelfont 1 minimum 0.3 maximum 1.6 value 1 + xywh {750 155 120 40} type {Horz Knob} labelfont 1 minimum 0.3 maximum 1.6 value 1 } Fl_Group {} {open xywh {415 75 185 100} box BORDER_BOX @@ -591,6 +591,28 @@ control.update_process_parameters();} class FreeEditControls } {} } + Fl_Group {} {open + xywh {605 75 140 105} box BORDER_BOX + } { + Fl_Check_Button tonal_vs_noise_enabled { + label {Tonal/Noise} + callback {control.ppar.tonal_vs_noise.enabled=o->value(); +control.update_process_parameters();} + xywh {610 80 115 20} down_box DOWN_BOX labelfont 1 + } + Fl_Slider tonal_vs_noise_bandwidth { + label Bandwidth + callback {control.ppar.tonal_vs_noise.bandwidth=o->value(); +control.update_process_parameters();} + xywh {610 141 130 15} type {Horz Knob} minimum 0.75 value 0.9 + } + Fl_Slider tonal_vs_noise_preserve { + label {noise <-->tonal} + callback {control.ppar.tonal_vs_noise.preserve=o->value(); +control.update_process_parameters();} + xywh {610 105 130 15} type {Horz Knob} minimum -1 value 0.5 + } + } } Fl_Group {} { label {Binaural beats} @@ -861,6 +883,10 @@ spread_enabled->value(control.ppar.spread.enabled); spread_bandwidth->value(control.ppar.spread.bandwidth); +tonal_vs_noise_enabled->value(control.ppar.tonal_vs_noise.enabled); +tonal_vs_noise_preserve->value(control.ppar.tonal_vs_noise.preserve); +tonal_vs_noise_bandwidth->value(control.ppar.tonal_vs_noise.bandwidth); + bbpar_mono->value(control.bbpar.mono); bbpar_stereo_mode->value(control.bbpar.stereo_mode); diff --git a/ProcessedStretch.cpp b/ProcessedStretch.cpp @@ -55,6 +55,10 @@ void ProcessParameters::add2XML(XMLwrapper *xml){ xml->addparbool("spread.enabled",spread.enabled); xml->addparreal("spread.bandwidth",spread.bandwidth); + + xml->addparbool("tonal_vs_noise.enabled",tonal_vs_noise.enabled); + xml->addparreal("tonal_vs_noise.bandwidth",tonal_vs_noise.bandwidth); + xml->addparreal("tonal_vs_noise.preserve",tonal_vs_noise.preserve); xml->beginbranch("FREE_FILTER"); free_filter.add2XML(xml); @@ -99,6 +103,11 @@ void ProcessParameters::getfromXML(XMLwrapper *xml){ spread.enabled=xml->getparbool("spread.enabled",spread.enabled); spread.bandwidth=xml->getparreal("spread.bandwidth",spread.bandwidth); + + tonal_vs_noise.enabled=xml->getparbool("tonal_vs_noise.enabled",tonal_vs_noise.enabled); + tonal_vs_noise.preserve=xml->getparreal("tonal_vs_noise.preserve",tonal_vs_noise.bandwidth); + tonal_vs_noise.bandwidth=xml->getparreal("tonal_vs_noise.bandwidth",tonal_vs_noise.bandwidth); + if (xml->enterbranch("FREE_FILTER")){ free_filter.getfromXML(xml); @@ -169,6 +178,11 @@ void ProcessedStretch::process_spectrum(REALTYPE *freq){ do_harmonics(infreq,freq); }; + if (pars.tonal_vs_noise.enabled){ + copy(freq,infreq); + do_tonal_vs_noise(infreq,freq); + }; + if (pars.freq_shift.enabled) { copy(freq,infreq); do_freq_shift(infreq,freq); @@ -365,6 +379,10 @@ void ProcessedStretch::do_free_filter(REALTYPE *freq1,REALTYPE *freq2){ }; void ProcessedStretch::do_spread(REALTYPE *freq1,REALTYPE *freq2){ + spread(freq1,freq2,pars.spread.bandwidth); +}; + +void ProcessedStretch::spread(REALTYPE *freq1,REALTYPE *freq2,REALTYPE spread_bandwidth){ //convert to log spectrum REALTYPE minfreq=20.0; REALTYPE maxfreq=0.5*samplerate; @@ -387,7 +405,7 @@ void ProcessedStretch::do_spread(REALTYPE *freq1,REALTYPE *freq2){ //increase the bandwidth of each harmonic (by smoothing the log spectrum) int n=2; - REALTYPE bandwidth=pars.spread.bandwidth; + REALTYPE bandwidth=spread_bandwidth; REALTYPE a=1.0-pow(2.0,-bandwidth*bandwidth*10.0); a=pow(a,8192.0/nfreq*n); @@ -431,4 +449,34 @@ void ProcessedStretch::do_compressor(REALTYPE *freq1,REALTYPE *freq2){ for (int i=0;i<nfreq;i++) freq2[i]=freq1[i]*rap; }; +void ProcessedStretch::do_tonal_vs_noise(REALTYPE *freq1,REALTYPE *freq2){ + spread(freq1,tmpfreq1,pars.tonal_vs_noise.bandwidth); + + if (pars.tonal_vs_noise.preserve>=0.0){ + REALTYPE mul=(pow(10.0,pars.tonal_vs_noise.preserve)-1.0); + for (int i=0;i<nfreq;i++) { + REALTYPE x=freq1[i]; + REALTYPE smooth_x=tmpfreq1[i]+1e-6; + + REALTYPE result=0.0; + result=x-smooth_x*mul; + if (result<0.0) result=0.0; + freq2[i]=result; + }; + }else{ + REALTYPE mul=(pow(5.0,1.0+pars.tonal_vs_noise.preserve)-1.0); + for (int i=0;i<nfreq;i++) { + REALTYPE x=freq1[i]; + REALTYPE smooth_x=tmpfreq1[i]+1e-6; + + REALTYPE result=0.0; + result=x-smooth_x*mul+0.1*mul; + if (result<0.0) result=x; + else result=0.0; + + freq2[i]=result; + }; + }; + +}; diff --git a/ProcessedStretch.h b/ProcessedStretch.h @@ -58,6 +58,10 @@ struct ProcessParameters{ /// waveinfo.n_transients=1; /// waveinfo.transients_data=new REALTYPE[1]; /// waveinfo.transients_data[0]=0; + + tonal_vs_noise.enabled=false; + tonal_vs_noise.preserve=0.5; + tonal_vs_noise.bandwidth=0.9; }; ~ProcessParameters(){ /// delete []waveinfo.transients_data; @@ -119,6 +123,13 @@ struct ProcessParameters{ bool enabled; REALTYPE bandwidth; }spread; + + struct{ + bool enabled; + REALTYPE preserve; + REALTYPE bandwidth; + }tonal_vs_noise; + FreeEdit free_filter; FreeEdit stretch_multiplier; @@ -147,10 +158,12 @@ class ProcessedStretch:public Stretch{ void do_free_filter(REALTYPE *freq1,REALTYPE *freq2); void do_compressor(REALTYPE *freq1,REALTYPE *freq2); void do_spread(REALTYPE *freq1,REALTYPE *freq2); + void do_tonal_vs_noise(REALTYPE *freq1,REALTYPE *freq2); void copy(REALTYPE *freq1,REALTYPE *freq2); void add(REALTYPE *freq2,REALTYPE *freq1,REALTYPE a=1.0); void zero(REALTYPE *freq1); + void spread(REALTYPE *freq1,REALTYPE *freq2,REALTYPE spread_bandwidth); void update_free_filter(); int nfreq; diff --git a/readme.txt b/readme.txt @@ -71,6 +71,9 @@ History: 20110211(2.1-0) - Increased the precision of a paremeter for extreme long stretches + + 2011????(2.) + - Added an option to preserve the tonal part or noise part Enjoy! :) Paul