@@ -109,21 +109,21 @@ void ProcessedStretch::process_spectrum(REALTYPE *freq) | |||||
for (auto& e : m_spectrum_processes) | for (auto& e : m_spectrum_processes) | ||||
{ | { | ||||
spectrum_copy(nfreq, freq, infreq.data()); | spectrum_copy(nfreq, freq, infreq.data()); | ||||
if (e == 0 && pars.harmonics.enabled) | |||||
if (e.m_index == 0 && e.m_enabled == true) | |||||
spectrum_do_harmonics(pars, tmpfreq1, nfreq, samplerate, infreq.data(), freq); | spectrum_do_harmonics(pars, tmpfreq1, nfreq, samplerate, infreq.data(), freq); | ||||
if (e == 1 && pars.tonal_vs_noise.enabled) | |||||
if (e.m_index == 1 && e.m_enabled == true) | |||||
spectrum_do_tonal_vs_noise(pars,nfreq,samplerate,tmpfreq1, infreq.data(), freq); | spectrum_do_tonal_vs_noise(pars,nfreq,samplerate,tmpfreq1, infreq.data(), freq); | ||||
if (e == 2 && pars.freq_shift.enabled) | |||||
if (e.m_index == 2 && e.m_enabled == true) | |||||
spectrum_do_freq_shift(pars,nfreq,samplerate,infreq.data(), freq); | spectrum_do_freq_shift(pars,nfreq,samplerate,infreq.data(), freq); | ||||
if (e == 3 && pars.pitch_shift.enabled) | |||||
if (e.m_index == 3 && e.m_enabled == true) | |||||
spectrum_do_pitch_shift(pars,nfreq,infreq.data(), freq, pow(2.0f, pars.pitch_shift.cents / 1200.0f)); | spectrum_do_pitch_shift(pars,nfreq,infreq.data(), freq, pow(2.0f, pars.pitch_shift.cents / 1200.0f)); | ||||
if (e == 4 && pars.octave.enabled) | |||||
if (e.m_index == 4 && e.m_enabled == true) | |||||
spectrum_do_octave(pars,nfreq,samplerate, sumfreq, tmpfreq1, infreq.data(), freq); | spectrum_do_octave(pars,nfreq,samplerate, sumfreq, tmpfreq1, infreq.data(), freq); | ||||
if (e == 5 && pars.spread.enabled) | |||||
if (e.m_index == 5 && e.m_enabled == true) | |||||
spectrum_spread(nfreq,samplerate,tmpfreq1,infreq.data(), freq, pars.spread.bandwidth); | spectrum_spread(nfreq,samplerate,tmpfreq1,infreq.data(), freq, pars.spread.bandwidth); | ||||
if (e == 6 && pars.filter.enabled) | |||||
if (e.m_index == 6 && e.m_enabled == true) | |||||
spectrum_do_filter(pars,nfreq,samplerate,infreq.data(), freq); | spectrum_do_filter(pars,nfreq,samplerate,infreq.data(), freq); | ||||
if (e == 7 && pars.compressor.enabled) | |||||
if (e.m_index == 7 && e.m_enabled == true) | |||||
spectrum_do_compressor(pars,nfreq, infreq.data(), freq); | spectrum_do_compressor(pars,nfreq, infreq.data(), freq); | ||||
} | } | ||||
@@ -197,16 +197,3 @@ void ProcessedStretch::update_free_filter() | |||||
*/ | */ | ||||
}; | }; | ||||
std::vector<SpectrumProcess> make_spectrum_processes() | |||||
{ | |||||
std::vector<SpectrumProcess> 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; | |||||
} |
@@ -440,16 +440,12 @@ inline void spectrum_do_filter(const ProcessParameters& pars, int nfreq, double | |||||
class SpectrumProcess | class SpectrumProcess | ||||
{ | { | ||||
public: | public: | ||||
SpectrumProcess() {} | |||||
SpectrumProcess(String name, int index) : | |||||
m_name(name), m_index(index) {} | |||||
String m_name; | |||||
SpectrumProcess() {} | |||||
SpectrumProcess(int index, bool enabled) : m_index(index), m_enabled(enabled) {} | |||||
int m_index = -1; | int m_index = -1; | ||||
private: | |||||
bool m_enabled = true; | |||||
}; | }; | ||||
std::vector<SpectrumProcess> make_spectrum_processes(); | |||||
class ProcessedStretch final : public Stretch | class ProcessedStretch final : public Stretch | ||||
{ | { | ||||
public: | public: | ||||
@@ -458,7 +454,7 @@ public: | |||||
ProcessedStretch(REALTYPE rap_,int in_bufsize_,FFTWindow w=W_HAMMING,bool bypass_=false,REALTYPE samplerate_=44100.0f,int stereo_mode=0); | ProcessedStretch(REALTYPE rap_,int in_bufsize_,FFTWindow w=W_HAMMING,bool bypass_=false,REALTYPE samplerate_=44100.0f,int stereo_mode=0); | ||||
~ProcessedStretch(); | ~ProcessedStretch(); | ||||
void set_parameters(ProcessParameters *ppar); | void set_parameters(ProcessParameters *ppar); | ||||
std::vector<int> m_spectrum_processes; | |||||
std::vector<SpectrumProcess> m_spectrum_processes; | |||||
void setBufferSize(int sz) override; | void setBufferSize(int sz) override; | ||||
private: | private: | ||||
REALTYPE get_stretch_multiplier(REALTYPE pos_percents) override; | REALTYPE get_stretch_multiplier(REALTYPE pos_percents) override; | ||||
@@ -12,7 +12,7 @@ StretchAudioSource::StretchAudioSource(int initialnumoutchans, AudioFormatManage | |||||
m_resampler = std::make_unique<WDL_Resampler>(); | m_resampler = std::make_unique<WDL_Resampler>(); | ||||
m_resampler_outbuf.resize(1024*1024); | m_resampler_outbuf.resize(1024*1024); | ||||
m_inputfile = std::make_unique<AInputS>(m_afm); | m_inputfile = std::make_unique<AInputS>(m_afm); | ||||
m_specproc_order = { 0,1,2,3,4,5,6,7 }; | |||||
m_specproc_order = { {0,false} , { 1, false} ,{2,true},{3,true},{4,true},{5,true},{6,true},{7,true} }; | |||||
setNumOutChannels(initialnumoutchans); | setNumOutChannels(initialnumoutchans); | ||||
m_xfadetask.buffer.setSize(8, 65536); | m_xfadetask.buffer.setSize(8, 65536); | ||||
m_xfadetask.buffer.clear(); | m_xfadetask.buffer.clear(); | ||||
@@ -58,12 +58,12 @@ bool StretchAudioSource::isResampling() | |||||
return (int)m_outsr!=m_inputfile->info.samplerate; | return (int)m_outsr!=m_inputfile->info.samplerate; | ||||
} | } | ||||
std::vector<int> StretchAudioSource::getSpectrumProcessOrder() | |||||
std::vector<SpectrumProcess> StretchAudioSource::getSpectrumProcessOrder() | |||||
{ | { | ||||
return m_specproc_order; | return m_specproc_order; | ||||
} | } | ||||
void StretchAudioSource::setSpectrumProcessOrder(std::vector<int> order) | |||||
void StretchAudioSource::setSpectrumProcessOrder(std::vector<SpectrumProcess> order) | |||||
{ | { | ||||
ScopedLock locker(m_cs); | ScopedLock locker(m_cs); | ||||
m_specproc_order = order; | m_specproc_order = order; | ||||
@@ -920,12 +920,12 @@ bool MultiStretchAudioSource::isResampling() | |||||
return getActiveStretchSource()->isResampling(); | return getActiveStretchSource()->isResampling(); | ||||
} | } | ||||
std::vector<int> MultiStretchAudioSource::getSpectrumProcessOrder() | |||||
std::vector<SpectrumProcess> MultiStretchAudioSource::getSpectrumProcessOrder() | |||||
{ | { | ||||
return getActiveStretchSource()->getSpectrumProcessOrder(); | return getActiveStretchSource()->getSpectrumProcessOrder(); | ||||
} | } | ||||
void MultiStretchAudioSource::setSpectrumProcessOrder(std::vector<int> order) | |||||
void MultiStretchAudioSource::setSpectrumProcessOrder(std::vector<SpectrumProcess> order) | |||||
{ | { | ||||
getActiveStretchSource()->setSpectrumProcessOrder(order); | getActiveStretchSource()->setSpectrumProcessOrder(order); | ||||
} | } |
@@ -82,8 +82,8 @@ public: | |||||
bool isLoopEnabled(); | bool isLoopEnabled(); | ||||
bool hasReachedEnd(); | bool hasReachedEnd(); | ||||
bool isResampling(); | bool isResampling(); | ||||
std::vector<int> getSpectrumProcessOrder(); | |||||
void setSpectrumProcessOrder(std::vector<int> order); | |||||
std::vector<SpectrumProcess> getSpectrumProcessOrder(); | |||||
void setSpectrumProcessOrder(std::vector<SpectrumProcess> order); | |||||
void setFFTWindowingType(int windowtype); | void setFFTWindowingType(int windowtype); | ||||
int getFFTWindowingType() { return m_fft_window_type; } | int getFFTWindowingType() { return m_fft_window_type; } | ||||
std::pair<Range<double>,Range<double>> getFileCachedRangesNormalized(); | std::pair<Range<double>,Range<double>> getFileCachedRangesNormalized(); | ||||
@@ -135,7 +135,7 @@ private: | |||||
std::unique_ptr<WDL_Resampler> m_resampler; | std::unique_ptr<WDL_Resampler> m_resampler; | ||||
std::vector<double> m_resampler_outbuf; | std::vector<double> m_resampler_outbuf; | ||||
CriticalSection m_cs; | CriticalSection m_cs; | ||||
std::vector<int> m_specproc_order; | |||||
std::vector<SpectrumProcess> m_specproc_order; | |||||
bool m_stop_play_requested = false; | bool m_stop_play_requested = false; | ||||
double m_freeze_pos = 0.0; | double m_freeze_pos = 0.0; | ||||
int64_t m_output_counter = 0; | int64_t m_output_counter = 0; | ||||
@@ -199,8 +199,8 @@ public: | |||||
void setLoopingEnabled(bool b); | void setLoopingEnabled(bool b); | ||||
bool hasReachedEnd(); | bool hasReachedEnd(); | ||||
bool isResampling(); | bool isResampling(); | ||||
std::vector<int> getSpectrumProcessOrder(); | |||||
void setSpectrumProcessOrder(std::vector<int> order); | |||||
std::vector<SpectrumProcess> getSpectrumProcessOrder(); | |||||
void setSpectrumProcessOrder(std::vector<SpectrumProcess> order); | |||||
void setFFTWindowingType(int windowtype); | void setFFTWindowingType(int windowtype); | ||||
std::pair<Range<double>, Range<double>> getFileCachedRangesNormalized(); | std::pair<Range<double>, Range<double>> getFileCachedRangesNormalized(); | ||||
void setFreezing(bool b) { m_freezing = b; } | void setFreezing(bool b) { m_freezing = b; } | ||||
@@ -720,6 +720,17 @@ void SpectralChainEditor::mouseDown(const MouseEvent & ev) | |||||
int box_w = getWidth() / m_order.size(); | int box_w = getWidth() / m_order.size(); | ||||
int box_h = getHeight(); | int box_h = getHeight(); | ||||
m_cur_index = ev.x / box_w; | m_cur_index = ev.x / box_w; | ||||
if (m_cur_index >= 0) | |||||
{ | |||||
juce::Rectangle<int> r(box_w*m_cur_index, 1, 10, 10); | |||||
if (r.contains(ev.x, ev.y)) | |||||
{ | |||||
m_order[m_cur_index].m_enabled = !m_order[m_cur_index].m_enabled; | |||||
m_src->setSpectrumProcessOrder(m_order); | |||||
repaint(); | |||||
return; | |||||
} | |||||
} | |||||
m_drag_x = -1; | m_drag_x = -1; | ||||
repaint(); | repaint(); | ||||
} | } | ||||
@@ -753,21 +764,21 @@ void SpectralChainEditor::mouseUp(const MouseEvent & ev) | |||||
void SpectralChainEditor::drawBox(Graphics & g, int index, int x, int y, int w, int h) | void SpectralChainEditor::drawBox(Graphics & g, int index, int x, int y, int w, int h) | ||||
{ | { | ||||
String txt; | String txt; | ||||
if (m_order[index] == 0) | |||||
if (m_order[index].m_index == 0) | |||||
txt = "Harmonics"; | txt = "Harmonics"; | ||||
if (m_order[index] == 1) | |||||
if (m_order[index].m_index == 1) | |||||
txt = "Tonal vs Noise"; | txt = "Tonal vs Noise"; | ||||
if (m_order[index] == 2) | |||||
if (m_order[index].m_index == 2) | |||||
txt = "Frequency shift"; | txt = "Frequency shift"; | ||||
if (m_order[index] == 3) | |||||
if (m_order[index].m_index == 3) | |||||
txt = "Pitch shift"; | txt = "Pitch shift"; | ||||
if (m_order[index] == 4) | |||||
if (m_order[index].m_index == 4) | |||||
txt = "Octaves"; | txt = "Octaves"; | ||||
if (m_order[index] == 5) | |||||
if (m_order[index].m_index == 5) | |||||
txt = "Spread"; | txt = "Spread"; | ||||
if (m_order[index] == 6) | |||||
if (m_order[index].m_index == 6) | |||||
txt = "Filter"; | txt = "Filter"; | ||||
if (m_order[index] == 7) | |||||
if (m_order[index].m_index == 7) | |||||
txt = "Compressor"; | txt = "Compressor"; | ||||
if (index == m_cur_index) | if (index == m_cur_index) | ||||
{ | { | ||||
@@ -778,6 +789,14 @@ void SpectralChainEditor::drawBox(Graphics & g, int index, int x, int y, int w, | |||||
g.setColour(Colours::white); | g.setColour(Colours::white); | ||||
g.drawRect(x, y, w, h); | g.drawRect(x, y, w, h); | ||||
g.drawFittedText(txt, x,y,w,h, Justification::centred, 3); | g.drawFittedText(txt, x,y,w,h, Justification::centred, 3); | ||||
g.setColour(Colours::gold); | |||||
g.drawRect(x + 2, y + 2, 10, 10); | |||||
if (m_order[index].m_enabled == true) | |||||
{ | |||||
g.drawLine(x+2, y+2, x+12, y+12); | |||||
g.drawLine(x+2, y+12, x+12, y+2); | |||||
} | |||||
g.setColour(Colours::white); | |||||
} | } | ||||
ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notifyOnlyOnRelease) : m_par(par) | ParameterComponent::ParameterComponent(AudioProcessorParameter * par, bool notifyOnlyOnRelease) : m_par(par) | ||||
@@ -139,7 +139,7 @@ private: | |||||
bool m_did_drag = false; | bool m_did_drag = false; | ||||
int m_cur_index = -1; | int m_cur_index = -1; | ||||
int m_drag_x = 0; | int m_drag_x = 0; | ||||
std::vector<int> m_order; | |||||
std::vector<SpectrumProcess> m_order; | |||||
void drawBox(Graphics& g, int index, int x, int y, int w, int h); | void drawBox(Graphics& g, int index, int x, int y, int w, int h); | ||||
}; | }; | ||||
@@ -239,7 +239,8 @@ ValueTree PaulstretchpluginAudioProcessor::getStateTree(bool ignoreoptions, bool | |||||
paramtree.setProperty("numspectralstages", (int)specorder.size(), nullptr); | paramtree.setProperty("numspectralstages", (int)specorder.size(), nullptr); | ||||
for (int i = 0; i < specorder.size(); ++i) | for (int i = 0; i < specorder.size(); ++i) | ||||
{ | { | ||||
paramtree.setProperty("specorder" + String(i), specorder[i], nullptr); | |||||
paramtree.setProperty("specorder" + String(i), specorder[i].m_index, nullptr); | |||||
paramtree.setProperty("specstepenabled" + String(i), specorder[i].m_enabled, nullptr); | |||||
} | } | ||||
if (ignoreoptions == false) | if (ignoreoptions == false) | ||||
{ | { | ||||
@@ -261,11 +262,12 @@ void PaulstretchpluginAudioProcessor::setStateFromTree(ValueTree tree) | |||||
m_load_file_with_state = tree.getProperty("loadfilewithstate", true); | m_load_file_with_state = tree.getProperty("loadfilewithstate", true); | ||||
if (tree.hasProperty("numspectralstages")) | if (tree.hasProperty("numspectralstages")) | ||||
{ | { | ||||
std::vector<int> order; | |||||
std::vector<SpectrumProcess> order; | |||||
int ordersize = tree.getProperty("numspectralstages"); | int ordersize = tree.getProperty("numspectralstages"); | ||||
for (int i = 0; i < ordersize; ++i) | for (int i = 0; i < ordersize; ++i) | ||||
{ | { | ||||
order.push_back((int)tree.getProperty("specorder" + String(i))); | |||||
bool step_enabled = tree.getProperty("specstepenabled" + String(i)); | |||||
order.push_back({ (int)tree.getProperty("specorder" + String(i)), step_enabled }); | |||||
} | } | ||||
m_stretch_source->setSpectrumProcessOrder(order); | m_stretch_source->setSpectrumProcessOrder(order); | ||||
} | } | ||||
@@ -698,7 +700,9 @@ String PaulstretchpluginAudioProcessor::setAudioFile(File f) | |||||
m_thumb->setSource(new FileInputSource(f)); | m_thumb->setSource(new FileInputSource(f)); | ||||
ScopedLock locker(m_cs); | ScopedLock locker(m_cs); | ||||
m_stretch_source->setAudioFile(f); | m_stretch_source->setAudioFile(f); | ||||
m_stretch_source->seekPercent(*getFloatParameter(cpi_soundstart)); | |||||
//Range<double> currange{ *getFloatParameter(cpi_soundstart),*getFloatParameter(cpi_soundend) }; | |||||
//if (currange.contains(m_stretch_source->getInfilePositionPercent())==false) | |||||
m_stretch_source->seekPercent(*getFloatParameter(cpi_soundstart)); | |||||
m_current_file = f; | m_current_file = f; | ||||
m_current_file_date = m_current_file.getLastModificationTime(); | m_current_file_date = m_current_file.getLastModificationTime(); | ||||
m_using_memory_buffer = false; | m_using_memory_buffer = false; | ||||