| @@ -34,8 +34,7 @@ Control::Control(){ | |||
| process.bufsize=16384; | |||
| process.stretch=4.0; | |||
| /// process.transient.enable=false; | |||
| /// process.transient.amount=0.5; | |||
| process.onset_detection_sensitivity=0.0; | |||
| seek_pos=0.0; | |||
| window_type=W_HANN; | |||
| @@ -57,83 +56,6 @@ Control::~Control(){ | |||
| // delete player; face crash daca il las | |||
| }; | |||
| ///void Control::pre_analyse_whole_audio(InputS *ai){ | |||
| /// int inbufsize=1024; | |||
| /// int readsize=inbufsize/2; | |||
| /// | |||
| /// short int *inbuf_i=new short int[readsize*2]; | |||
| /// | |||
| ///// REALTYPE *inbuf_f=new REALTYPE[readsize]; | |||
| ///// for (int i=0;i<readsize;i++) inbuf_f[i]=0.0; | |||
| /// | |||
| /// REALTYPE *processbuf=new REALTYPE[inbufsize]; | |||
| /// for (int i=0;i<inbufsize;i++) processbuf[i]=0.0; | |||
| /// | |||
| /// FFT *infft=new FFT(inbufsize); | |||
| /// | |||
| /// int k=0; | |||
| /// int fftsize=inbufsize/2; | |||
| /// REALTYPE *oldfreq=new REALTYPE[fftsize]; | |||
| /// for (int i=0;i<fftsize;i++) oldfreq[i]=0.0; | |||
| /// REALTYPE oldsumstart=0.0; | |||
| /// int transient_data_n=0; | |||
| /// int transient_data_max_n=10000; | |||
| /// REALTYPE *transient_data=new REALTYPE [transient_data_max_n]; | |||
| /// while(!ai->eof){ | |||
| /// float in_pos=(REALTYPE) ai->info.currentsample/(REALTYPE)ai->info.nsamples; | |||
| /// | |||
| /// int readed=ai->read(readsize,inbuf_i); | |||
| /// if (readed!=readsize) break;//do not process the last buffer from the audiofile | |||
| /// const float inv_32768=1.0/32768.0; | |||
| /// | |||
| /// for (int i=0;i<inbufsize-readed;i++){ | |||
| /// processbuf[i]=processbuf[i+readed]; | |||
| /// }; | |||
| /// for (int i=0;i<readed;i++) { | |||
| /// processbuf[i+inbufsize-readed]=(inbuf_i[i*2]*inv_32768+inbuf_i[i*2+1]*inv_32768); | |||
| /// }; | |||
| /// | |||
| /// | |||
| /// for (int i=0;i<inbufsize;i++) infft->smp[i]=processbuf[i]; | |||
| /// | |||
| /// | |||
| /// infft->applywindow(W_HAMMING); | |||
| /// infft->smp2freq(); | |||
| /// infft->freq[0]=0; | |||
| /// REALTYPE *freq=infft->freq; | |||
| /// | |||
| /// REALTYPE sumstart=0.0; | |||
| /// for (int i=0;i<fftsize;i++){ | |||
| /// REALTYPE x=freq[i]-oldfreq[i]; | |||
| /// if (x>0) sumstart+=x; | |||
| /// }; | |||
| /// sumstart/=fftsize; | |||
| /// const REALTYPE a=0.1; | |||
| /// oldsumstart=oldsumstart*(1.0-a)+sumstart*a; | |||
| /// sumstart-=1.5*oldsumstart; | |||
| /// if (sumstart<0.0) sumstart=0.0; | |||
| /// | |||
| /// transient_data[transient_data_n]=sumstart; | |||
| /// transient_data_n++; | |||
| /// if (transient_data_n>=transient_data_max_n){ | |||
| /// transient_data_max_n+=100000; | |||
| /// REALTYPE *new_transient_data=new REALTYPE[transient_data_max_n]; | |||
| /// for (int i=0;i<transient_data_n;i++) new_transient_data[i]=transient_data[i]; | |||
| /// delete [] transient_data; | |||
| /// transient_data=new_transient_data; | |||
| /// }; | |||
| /// | |||
| /// for (int i=0;i<fftsize;i++) oldfreq[i]=freq[i]; | |||
| /// }; | |||
| /// ppar.set_transient_data(transient_data_n,transient_data); | |||
| /// delete infft; | |||
| /// delete []transient_data; | |||
| /// | |||
| /// delete []oldfreq; | |||
| /// delete [] inbuf_i; | |||
| /// //delete [] inbuf_f; | |||
| /// delete [] processbuf; | |||
| ///}; | |||
| bool Control::set_input_filename(string filename,FILE_TYPE intype){ | |||
| InputS *ai=NULL; | |||
| @@ -336,7 +258,7 @@ REALTYPE Control::get_seek_pos(){ | |||
| }; | |||
| void Control::set_stretch_controls(double stretch_s,int mode,double fftsize_s){ | |||
| void Control::set_stretch_controls(double stretch_s,int mode,double fftsize_s,double onset_detection_sensitivity){ | |||
| gui_sliders.stretch_s=stretch_s; | |||
| gui_sliders.mode_s=mode; | |||
| gui_sliders.fftsize_s=fftsize_s; | |||
| @@ -367,6 +289,7 @@ void Control::set_stretch_controls(double stretch_s,int mode,double fftsize_s){ | |||
| process.stretch=stretch; | |||
| process.bufsize=bufsize; | |||
| process.onset_detection_sensitivity=onset_detection_sensitivity; | |||
| }; | |||
| @@ -394,6 +317,7 @@ double Control::get_stretch_control(double stretch,int mode){ | |||
| void Control::update_player_stretch(){ | |||
| player->setrap(process.stretch); | |||
| player->set_onset_detection_sensitivity(process.onset_detection_sensitivity); | |||
| }; | |||
| @@ -473,6 +397,8 @@ string Control::Render(string inaudio,string outaudio,FILE_TYPE outtype,FILE_TYP | |||
| }inbuf; | |||
| ProcessedStretch *stretchl=new ProcessedStretch(process.stretch,inbufsize,window_type,false,ai->info.samplerate,1); | |||
| ProcessedStretch *stretchr=new ProcessedStretch(process.stretch,inbufsize,window_type,false,ai->info.samplerate,2); | |||
| stretchl->set_onset_detection_sensitivity(process.onset_detection_sensitivity); | |||
| stretchr->set_onset_detection_sensitivity(process.onset_detection_sensitivity); | |||
| stretchl->set_parameters(&ppar); | |||
| stretchr->set_parameters(&ppar); | |||
| @@ -583,6 +509,7 @@ bool Control::save_parameters(const char *filename){ | |||
| xml->addpar("window_type",window_type); | |||
| xml->addparreal("volume",volume); | |||
| xml->addparreal("onset_detection_sensitivity",process.onset_detection_sensitivity); | |||
| xml->endbranch(); | |||
| @@ -624,6 +551,7 @@ bool Control::load_parameters(const char *filename){ | |||
| gui_sliders.stretch_s=xml->getparreal("stretch_s",gui_sliders.stretch_s); | |||
| gui_sliders.mode_s=xml->getpar("mode_s",gui_sliders.mode_s,0,2); | |||
| window_type=(FFTWindow)xml->getpar("window_type",window_type,0,4); | |||
| process.onset_detection_sensitivity=xml->getparreal("onset_detection_sensitivity",0.0); | |||
| volume=xml->getparreal("volume",1.0); | |||
| xml->exitbranch(); | |||
| }; | |||
| @@ -642,7 +570,7 @@ bool Control::load_parameters(const char *filename){ | |||
| }; | |||
| delete xml; | |||
| set_stretch_controls(gui_sliders.stretch_s,gui_sliders.mode_s,gui_sliders.fftsize_s); | |||
| set_stretch_controls(gui_sliders.stretch_s,gui_sliders.mode_s,gui_sliders.fftsize_s,process.onset_detection_sensitivity); | |||
| set_window_type(window_type); | |||
| set_volume(volume); | |||
| @@ -66,13 +66,16 @@ class Control{ | |||
| double get_stretch(){ | |||
| return process.stretch; | |||
| }; | |||
| double get_onset_detection_sensitivity(){ | |||
| return process.onset_detection_sensitivity; | |||
| }; | |||
| bool is_freeze(){ | |||
| return player->is_freeze(); | |||
| }; | |||
| void set_stretch_controls(double stretch_s,int mode,double fftsize_s);//*_s sunt de la 0.0 la 1.0 | |||
| void set_stretch_controls(double stretch_s,int mode,double fftsize_s,double onset_detection_sensitivity);//*_s sunt de la 0.0 la 1.0 | |||
| double get_stretch_control(double stretch,int mode); | |||
| void update_player_stretch(); | |||
| @@ -106,10 +109,7 @@ class Control{ | |||
| struct { | |||
| int bufsize; | |||
| double stretch; | |||
| /// struct{ | |||
| /// bool enable; | |||
| /// double amount; | |||
| /// } transient; | |||
| double onset_detection_sensitivity; | |||
| }process; | |||
| struct { | |||
| @@ -187,7 +187,7 @@ rendering=false;} {} | |||
| Function {make_window()} {open private | |||
| } { | |||
| Fl_Window window { | |||
| label {Paul's Extreme Sound Stretch} open | |||
| label {Paul's Extreme Sound Stretch} | |||
| xywh {192 131 995 550} type Double resizable | |||
| code0 {if(strlen(VERSION)<2) {o->color(FL_BLUE); o->label("VERSION NOT SET!!!!!!!!!!!!");};} visible | |||
| } { | |||
| @@ -383,6 +383,12 @@ stretch_slider->do_callback();} | |||
| class FreeEditControls | |||
| } {} | |||
| } | |||
| Fl_Slider onset_slider { | |||
| label {Onset sensitivity:} | |||
| callback {refresh(); | |||
| control.update_player_stretch();} | |||
| xywh {135 213 140 17} type {Horz Knob} box FLAT_BOX align 4 | |||
| } | |||
| } | |||
| Fl_Group {} { | |||
| label Process open | |||
| @@ -820,7 +826,8 @@ window->redraw();} {} | |||
| int mode=mode_choice->value(); | |||
| double resolution_s=fftsize_slider->value()/fftsize_slider->maximum(); | |||
| control.set_stretch_controls(stretch_s,mode,resolution_s); | |||
| double onset=onset_slider->value(); | |||
| control.set_stretch_controls(stretch_s,mode,resolution_s,onset); | |||
| stretch_slider->copy_label(control.get_stretch_info().c_str()); | |||
| fftsize_slider->copy_label(control.get_fftsize_info().c_str()); | |||
| @@ -847,7 +854,7 @@ if (!rendering){//do not change the status of render button while rendering | |||
| fftsize_slider->value(control.gui_sliders.fftsize_s); | |||
| mode_choice->value(control.gui_sliders.mode_s); | |||
| window_choice->value(control.window_type); | |||
| onset_slider->value(control.get_onset_detection_sensitivity()); | |||
| pitch_shift_enabled->value(control.ppar.pitch_shift.enabled); | |||
| @@ -893,7 +900,8 @@ bbpar_stereo_mode->value(control.bbpar.stereo_mode); | |||
| stretch_multiplier_control->refresh(); | |||
| arbitrary_filter_control->refresh(); | |||
| binaural_beats_control->refresh();} {} | |||
| binaural_beats_control->refresh();} {selected | |||
| } | |||
| } | |||
| Function {tickrefresh()} {} { | |||
| code {seek_slider->value(seek_slider->maximum()*control.get_seek_pos()); | |||
| @@ -961,6 +969,5 @@ Fl::run(); | |||
| delete gui; | |||
| return 0;} {selected | |||
| } | |||
| return 0;} {} | |||
| } | |||
| @@ -69,6 +69,7 @@ Player::Player():Thread(){ | |||
| info.samplerate=44100; | |||
| info.eof=true; | |||
| volume=1.0; | |||
| onset_detection_sensitivity=0.0; | |||
| }; | |||
| Player::~Player(){ | |||
| @@ -153,6 +154,9 @@ void Player::set_window_type(FFTWindow window){ | |||
| void Player::set_volume(REALTYPE vol){ | |||
| volume=vol; | |||
| }; | |||
| void Player::set_onset_detection_sensitivity(REALTYPE onset){ | |||
| onset_detection_sensitivity=onset; | |||
| }; | |||
| void Player::getaudiobuffer(int nsamples, float *out){ | |||
| if (mode==MODE_PREPARING){ | |||
| @@ -205,12 +209,10 @@ void Player::getaudiobuffer(int nsamples, float *out){ | |||
| }; | |||
| }; | |||
| // printf("-------------- %d\n",outbuf.nfresh); | |||
| outbuf.outk=k; | |||
| outbuf.outpos=pos; | |||
| bufmutex.unlock(); | |||
| // printf("max=%g\n",max); | |||
| }; | |||
| @@ -405,6 +407,9 @@ void Player::computesamples(){ | |||
| first_in_buf=false; | |||
| stretchl->window_type=window_type; | |||
| stretchr->window_type=window_type; | |||
| REALTYPE s_onset=onset_detection_sensitivity; | |||
| stretchl->set_onset_detection_sensitivity(s_onset); | |||
| stretchr->set_onset_detection_sensitivity(s_onset); | |||
| REALTYPE onset_l=stretchl->process(inbuf.l,readsize); | |||
| REALTYPE onset_r=stretchr->process(inbuf.r,readsize); | |||
| REALTYPE onset=(onset_l>onset_r)?onset_l:onset_r; | |||
| @@ -67,6 +67,7 @@ class Player:public Thread{ | |||
| void set_window_type(FFTWindow window); | |||
| void set_volume(REALTYPE vol); | |||
| void set_onset_detection_sensitivity(REALTYPE onset); | |||
| void set_process_parameters(ProcessParameters *ppar,BinauralBeatsParameters *bbpar); | |||
| @@ -86,7 +87,7 @@ class Player:public Thread{ | |||
| ModeType mode; | |||
| enum TaskMode{ | |||
| TASK_NONE, TASK_START, TASK_STOP,TASK_SEEK,TASK_RAP,TASK_PARAMETERS | |||
| TASK_NONE, TASK_START, TASK_STOP,TASK_SEEK,TASK_RAP,TASK_PARAMETERS, TASK_ONSET | |||
| }; | |||
| struct { | |||
| TaskMode mode; | |||
| @@ -120,7 +121,7 @@ class Player:public Thread{ | |||
| void newtaskcheck(); | |||
| void computesamples(); | |||
| bool freeze_mode,bypass_mode,paused; | |||
| REALTYPE volume; | |||
| REALTYPE volume,onset_detection_sensitivity; | |||
| std::string current_filename; | |||
| FFTWindow window_type; | |||
| @@ -55,35 +55,15 @@ struct ProcessParameters{ | |||
| spread.enabled=false; | |||
| spread.bandwidth=0.3; | |||
| /// 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; | |||
| }; | |||
| void add2XML(XMLwrapper *xml); | |||
| void getfromXML(XMLwrapper *xml); | |||
| /// void set_transient_data(int n,REALTYPE *tr){ | |||
| /// delete []waveinfo.transients_data; | |||
| /// waveinfo.n_transients=n; | |||
| /// waveinfo.transients_data=new REALTYPE[n]; | |||
| /// for (int i=0;i<n;i++) waveinfo.transients_data[i]=tr[i]; | |||
| /// }; | |||
| /// | |||
| /// REALTYPE get_transient(REALTYPE pos_percents){ | |||
| /// REALTYPE pos=pos_percents*0.01; | |||
| /// if ((pos<0.0)||(pos>1.0)) return 0.0; | |||
| /// REALTYPE fpos=pos*waveinfo.n_transients; | |||
| /// int ipos=(int)fpos; | |||
| /// return waveinfo.transients_data[ipos]; | |||
| /// }; | |||
| struct{ | |||
| bool enabled; | |||
| int cents; | |||
| @@ -133,11 +113,6 @@ struct ProcessParameters{ | |||
| FreeEdit free_filter; | |||
| FreeEdit stretch_multiplier; | |||
| //the folowing parameter represents the information regarding the audio (it is not saved) | |||
| /// struct{ | |||
| /// int n_transients; | |||
| /// REALTYPE *transients_data; | |||
| /// }waveinfo; | |||
| }; | |||
| class ProcessedStretch:public Stretch{ | |||
| @@ -144,12 +144,6 @@ void FFT::applywindow(FFTWindow type){ | |||
| Stretch::Stretch(REALTYPE rap_,int bufsize_,FFTWindow w,bool bypass_,REALTYPE samplerate_,int stereo_mode_){ | |||
| onset_detection_sensitivity=0.0; | |||
| #warning test | |||
| onset_detection_sensitivity=0.5; | |||
| samplerate=samplerate_; | |||
| rap=rap_; | |||
| bufsize=bufsize_; | |||