| @@ -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); | |||
| @@ -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; | |||
| }; | |||
| }; | |||
| }; | |||
| @@ -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; | |||
| @@ -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 | |||