/* Copyright (C) 2009 Nasca Octavian Paul Author: Nasca Octavian Paul This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (version 2) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "ProcessedStretch.h" void ProcessParameters::add2XML(XMLwrapper *xml){ xml->addparbool("pitch_shift.enabled",pitch_shift.enabled); xml->addparreal("pitch_shift.cents",pitch_shift.cents); xml->addparbool("octave.enabled",octave.enabled); xml->addparreal("octave.om2",octave.om2); xml->addparreal("octave.om1",octave.om1); xml->addparreal("octave.o0",octave.o0); xml->addparreal("octave.o1",octave.o1); xml->addparreal("octave.o15",octave.o15); xml->addparreal("octave.o2",octave.o2); xml->addparbool("freq_shift.enabled",freq_shift.enabled); xml->addparreal("freq_shift.Hz",freq_shift.Hz); xml->addparbool("compressor.enabled",compressor.enabled); xml->addparreal("compressor.power",compressor.power); xml->addparbool("filter.enabled",filter.enabled); xml->addparbool("filter.stop",filter.stop); xml->addparreal("filter.low",filter.low); xml->addparreal("filter.high",filter.high); xml->addparreal("filter.hdamp",filter.hdamp); xml->addparbool("harmonics.enabled",harmonics.enabled); xml->addparreal("harmonics.freq",harmonics.freq); xml->addparreal("harmonics.bandwidth",harmonics.bandwidth); xml->addpar("harmonic.nharmonics",harmonics.nharmonics); xml->addparbool("harmonics.gauss",harmonics.gauss); 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); xml->endbranch(); xml->beginbranch("STRETCH_MULTIPLIER"); stretch_multiplier.add2XML(xml); xml->endbranch(); }; void ProcessParameters::getfromXML(XMLwrapper *xml){ pitch_shift.enabled=xml->getparbool("pitch_shift.enabled",pitch_shift.enabled); pitch_shift.cents=xml->getparreal("pitch_shift.cents",pitch_shift.cents); octave.enabled=xml->getparbool("octave.enabled",octave.enabled); octave.om2=xml->getparreal("octave.om2",octave.om2); octave.om1=xml->getparreal("octave.om1",octave.om1); octave.o0=xml->getparreal("octave.o0",octave.o0); octave.o1=xml->getparreal("octave.o1",octave.o1); octave.o15=xml->getparreal("octave.o15",octave.o15); octave.o2=xml->getparreal("octave.o2",octave.o2); freq_shift.enabled=xml->getparbool("freq_shift.enabled",freq_shift.enabled); freq_shift.Hz=xml->getparreal("freq_shift.Hz",freq_shift.Hz); compressor.enabled=xml->getparbool("compressor.enabled",compressor.enabled); compressor.power=xml->getparreal("compressor.power",compressor.power); filter.enabled=xml->getparbool("filter.enabled",filter.enabled); filter.stop=xml->getparbool("filter.stop",filter.stop); filter.low=xml->getparreal("filter.low",filter.low); filter.high=xml->getparreal("filter.high",filter.high); filter.hdamp=xml->getparreal("filter.hdamp",filter.hdamp); harmonics.enabled=xml->getparbool("harmonics.enabled",harmonics.enabled); harmonics.freq=xml->getparreal("harmonics.freq",harmonics.freq); harmonics.bandwidth=xml->getparreal("harmonics.bandwidth",harmonics.bandwidth); harmonics.nharmonics=xml->getpar("harmonic.nharmonics",harmonics.nharmonics,1,100); harmonics.gauss=xml->getparbool("harmonics.gauss",harmonics.gauss); 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); xml->exitbranch(); }; if (xml->enterbranch("STRETCH_MULTIPLIER")){ stretch_multiplier.getfromXML(xml); xml->exitbranch(); }; }; ProcessedStretch::ProcessedStretch(REALTYPE rap_,int in_bufsize_,FFTWindow w,bool bypass_,REALTYPE samplerate_,int stereo_mode_):Stretch(rap_,in_bufsize_,w,bypass_,samplerate_,stereo_mode_){ nfreq=out_bufsize; infreq=new REALTYPE[nfreq]; sumfreq=new REALTYPE[nfreq]; tmpfreq1=new REALTYPE[nfreq]; tmpfreq2=new REALTYPE[nfreq]; //fbfreq=new REALTYPE[nfreq]; free_filter_freqs=new REALTYPE[nfreq]; for (int i=0;i0){ /// transient*=power*(1.0+power); /// result/=(1.0+transient); ///}; ///printf("tr=%g\n",result); return result; }; void ProcessedStretch::process_spectrum(REALTYPE *freq){ //REALTYPE fb=0.8; //add(freq,fbfreq,fb); if (pars.harmonics.enabled) { copy(freq,infreq); 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); }; if (pars.pitch_shift.enabled) { copy(freq,infreq); do_pitch_shift(infreq,freq,pow(2.0,pars.pitch_shift.cents/1200.0)); }; if (pars.octave.enabled){ copy(freq,infreq); do_octave(infreq,freq); }; if (pars.spread.enabled){ copy(freq,infreq); do_spread(infreq,freq); }; if (pars.filter.enabled){ copy(freq,infreq); do_filter(infreq,freq); }; if (pars.free_filter.get_enabled()){ copy(freq,infreq); do_free_filter(infreq,freq); }; if (pars.compressor.enabled){ copy(freq,infreq); do_compressor(infreq,freq); }; // copy(freq,fbfreq); // mul(freq,1.0-fb); }; //void ProcessedStretch::process_output(REALTYPE *smps,int nsmps){ //}; REALTYPE profile(REALTYPE fi, REALTYPE bwi){ REALTYPE x=fi/bwi; x*=x; if (x>14.71280603) return 0.0; return exp(-x);///bwi; }; void ProcessedStretch::do_harmonics(REALTYPE *freq1,REALTYPE *freq2){ REALTYPE freq=pars.harmonics.freq; REALTYPE bandwidth=pars.harmonics.bandwidth; int nharmonics=pars.harmonics.nharmonics; if (freq<10.0) freq=10.0; REALTYPE *amp=tmpfreq1; for (int i=0;i=samplerate/2) break; bw_Hz=(pow(2.0,bandwidth/1200.0)-1.0)*f; bwi=bw_Hz/(2.0*samplerate); fi=f/samplerate; REALTYPE sum=0.0; REALTYPE max=0.0; for (int i=1;imax) max=amp[i]; }; if (max<1e-8) max=1e-8; for (int i=1;i0)&&(i2=nfreq) break; freq2[i2]+=freq1[i]; }; }; if (rap>=1.0){//up rap=1.0/rap; for (int i=0;i1e-3){ do_pitch_shift(freq1,tmpfreq1,0.25); add(sumfreq,tmpfreq1,pars.octave.om2); }; if (pars.octave.om1>1e-3){ do_pitch_shift(freq1,tmpfreq1,0.5); add(sumfreq,tmpfreq1,pars.octave.om1); }; if (pars.octave.o0>1e-3){ add(sumfreq,freq1,pars.octave.o0); }; if (pars.octave.o1>1e-3){ do_pitch_shift(freq1,tmpfreq1,2.0); add(sumfreq,tmpfreq1,pars.octave.o1); }; if (pars.octave.o15>1e-3){ do_pitch_shift(freq1,tmpfreq1,3.0); add(sumfreq,tmpfreq1,pars.octave.o15); }; if (pars.octave.o2>1e-3){ do_pitch_shift(freq1,tmpfreq1,4.0); add(sumfreq,tmpfreq1,pars.octave.o2); }; REALTYPE sum=0.01+pars.octave.om2+pars.octave.om1+pars.octave.o0+pars.octave.o1+pars.octave.o15+pars.octave.o2; if (sum<0.5) sum=0.5; for (int i=0;i=ilow)&&(i=nfreq) x0=nfreq-1; int x1=x0+1; if (x1>=nfreq) x1=nfreq-1; REALTYPE xp=x-x0; if (x0;i--){ tmpfreq1[i]=tmpfreq1[i+1]*a+tmpfreq1[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=tmpfreq1[x0]*(1.0-xp)+tmpfreq1[x1]*xp; }; freq2[i]=y; }; }; void ProcessedStretch::do_compressor(REALTYPE *freq1,REALTYPE *freq2){ REALTYPE rms=0.0; for (int i=0;i=0.0){ REALTYPE mul=(pow(10.0,pars.tonal_vs_noise.preserve)-1.0); for (int i=0;i