/* 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" 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_) { }; ProcessedStretch::~ProcessedStretch() { // delete [] fbfreq; }; void ProcessedStretch::set_parameters(ProcessParameters *ppar) { pars=*ppar; //update_free_filter(); } void ProcessedStretch::setBufferSize(int sz) { Stretch::setBufferSize(sz); nfreq = bufsize; infreq = floatvector(nfreq); sumfreq = floatvector(nfreq); tmpfreq1 = floatvector(nfreq); tmpfreq2 = floatvector(nfreq); //fbfreq=new REALTYPE[nfreq]; free_filter_freqs = floatvector(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) { for (auto& e : m_spectrum_processes) { copy(freq, infreq.data()); if (e == 0 && pars.harmonics.enabled) do_harmonics(infreq.data(), freq); if (e == 1 && pars.tonal_vs_noise.enabled) do_tonal_vs_noise(infreq.data(), freq); if (e == 2 && pars.freq_shift.enabled) do_freq_shift(infreq.data(), freq); if (e == 3 && pars.pitch_shift.enabled) do_pitch_shift(infreq.data(), freq, pow(2.0f, pars.pitch_shift.cents / 1200.0f)); if (e == 4 && pars.octave.enabled) do_octave(infreq.data(), freq); if (e == 5 && pars.spread.enabled) do_spread(infreq.data(), freq); if (e == 6 && pars.filter.enabled) do_filter(infreq.data(), freq); if (e == 7 && pars.compressor.enabled) do_compressor(infreq.data(), freq); } #ifdef USE_OLD_SPEC_PROC if (pars.harmonics.enabled) { copy(freq,infreq.data()); do_harmonics(infreq.data(),freq); }; if (pars.tonal_vs_noise.enabled){ copy(freq,infreq.data()); do_tonal_vs_noise(infreq.data(),freq); }; if (pars.freq_shift.enabled) { copy(freq,infreq.data()); do_freq_shift(infreq.data(),freq); }; if (pars.pitch_shift.enabled) { copy(freq,infreq.data()); do_pitch_shift(infreq.data(),freq,pow(2.0,pars.pitch_shift.cents/1200.0)); }; if (pars.octave.enabled){ copy(freq,infreq.data()); do_octave(infreq.data(),freq); }; if (pars.spread.enabled){ copy(freq,infreq.data()); do_spread(infreq.data(),freq); }; if (pars.filter.enabled){ copy(freq,infreq.data()); do_filter(infreq.data(),freq); }; if (pars.free_filter.get_enabled()){ copy(freq,infreq.data()); do_free_filter(infreq.data(),freq); }; if (pars.compressor.enabled){ copy(freq,infreq.data()); do_compressor(infreq.data(),freq); }; #endif }; //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.data(); for (int i=0;i=samplerate/2) break; bw_Hz=(pow(2.0f,bandwidth/1200.0f)-1.0f)*f; bwi=bw_Hz/(2.0f*samplerate); fi=f/samplerate; REALTYPE sum=0.0f; REALTYPE max=0.0f; for (int i=1;imax) max=amp[i]; }; if (max<1e-8f) max=1e-8f; for (int i=1;i0)&&(i2=nfreq) break; freq2[i2]+=freq1[i]; }; }; if (_rap>=1.0){//up _rap=1.0f/_rap; for (int i=0;i1e-3){ do_pitch_shift(freq1,tmpfreq1.data(),0.25); add(sumfreq.data(),tmpfreq1.data(),pars.octave.om2); }; if (pars.octave.om1>1e-3){ do_pitch_shift(freq1,tmpfreq1.data(),0.5); add(sumfreq.data(),tmpfreq1.data(),pars.octave.om1); }; if (pars.octave.o0>1e-3){ add(sumfreq.data(),freq1,pars.octave.o0); }; if (pars.octave.o1>1e-3){ do_pitch_shift(freq1,tmpfreq1.data(),2.0); add(sumfreq.data(),tmpfreq1.data(),pars.octave.o1); }; if (pars.octave.o15>1e-3){ do_pitch_shift(freq1,tmpfreq1.data(),3.0); add(sumfreq.data(),tmpfreq1.data(),pars.octave.o15); }; if (pars.octave.o2>1e-3){ do_pitch_shift(freq1,tmpfreq1.data(),4.0); add(sumfreq.data(),tmpfreq1.data(),pars.octave.o2); }; REALTYPE sum=0.01f+pars.octave.om2+pars.octave.om1+pars.octave.o0+pars.octave.o1+pars.octave.o15+pars.octave.o2; if (sum<0.5f) sum=0.5f; 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.0f-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.0f-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.0f,pars.tonal_vs_noise.preserve)-1.0f); for (int i=0;i make_spectrum_processes() { std::vector m_spectrum_processes; m_spectrum_processes.emplace_back("Harmonics",0); m_spectrum_processes.emplace_back("Tonal vs Noise",1); m_spectrum_processes.emplace_back("Frequency shift",2); m_spectrum_processes.emplace_back("Pitch shift",3); m_spectrum_processes.emplace_back("Octaves mix",4); m_spectrum_processes.emplace_back("Spread",5); m_spectrum_processes.emplace_back("Filter",6); m_spectrum_processes.emplace_back("Compressor",7); return m_spectrum_processes; }