From c78c42c15324fab88bd3e8921200005ef34c85ed Mon Sep 17 00:00:00 2001 From: xenakios Date: Wed, 13 Dec 2017 19:55:35 +0200 Subject: [PATCH] Added component to allow reordering the spectral processing stages --- Source/PluginEditor.cpp | 79 ++++++++++++++++++++++++++++++++++++++++- Source/PluginEditor.h | 22 ++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 9497fbb..1600228 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -52,6 +52,8 @@ PaulstretchpluginAudioProcessorEditor::PaulstretchpluginAudioProcessorEditor (Pa return processor.getStretchSource()->getInfilePositionPercent(); }; m_wavecomponent.ShowFileCacheRange = true; + m_spec_order_ed.setSource(processor.getStretchSource()); + addAndMakeVisible(&m_spec_order_ed); startTimer(1, 100); startTimer(2, 1000); startTimer(3, 200); @@ -82,7 +84,9 @@ void PaulstretchpluginAudioProcessorEditor::resized() m_parcomps[i]->setBounds(1+gridx*(getWidth()/2), 30 + gridy * 25, getWidth()/2-2, 24); } int yoffs = m_parcomps.back()->getBottom() + 1; - m_wavecomponent.setBounds(1, yoffs, getWidth()-2, getHeight()-1-yoffs); + int remain_h = getHeight() - 1 - yoffs; + m_spec_order_ed.setBounds(1, yoffs, getWidth() - 2, remain_h / 5 * 1); + m_wavecomponent.setBounds(1, m_spec_order_ed.getBottom()+1, getWidth()-2, remain_h/5*4); //m_specvis.setBounds(1, yoffs, getWidth() - 2, getHeight() - 1 - yoffs); } @@ -518,3 +522,76 @@ void SpectralVisualizer::paint(Graphics & g) g.setColour(Colours::yellow); g.drawText(String(m_elapsed, 1)+" ms", 1, 1, getWidth(), 30, Justification::topLeft); } + +void SpectralChainEditor::paint(Graphics & g) +{ + g.fillAll(Colours::black); + if (m_src == nullptr) + return; + + int box_w = getWidth() / m_order.size(); + int box_h = getHeight(); + for (int i = 0; i < m_order.size(); ++i) + { + String txt; + if (m_order[i] == 0) + txt = "Harmonics"; + if (m_order[i] == 1) + txt = "Tonal vs Noise"; + if (m_order[i] == 2) + txt = "Frequency shift"; + if (m_order[i] == 3) + txt = "Pitch shift"; + if (m_order[i] == 4) + txt = "Octaves"; + if (m_order[i] == 5) + txt = "Spread"; + if (m_order[i] == 6) + txt = "Filter"; + if (m_order[i] == 7) + txt = "Compressor"; + if (i == m_cur_index) + { + g.setColour(Colours::darkgrey); + g.fillRect(i*box_w, 0, box_w - 30, box_h - 1); + } + g.setColour(Colours::white); + g.drawRect(i*box_w, 0, box_w - 30, box_h - 1); + g.drawFittedText(txt, i*box_w, 0, box_w - 30, box_h - 1, Justification::centred, 3); + if (i(i*box_w + (box_w - 30), box_h / 2, i*box_w + box_w, box_h / 2), 2.0f, 15.0f, 15.0f); + } +} + +void SpectralChainEditor::mouseDown(const MouseEvent & ev) +{ + m_did_drag = false; + int box_w = getWidth() / m_order.size(); + int box_h = getHeight(); + m_cur_index = ev.x / box_w; + repaint(); +} + +void SpectralChainEditor::mouseDrag(const MouseEvent & ev) +{ + if (m_cur_index >= 0 && m_cur_index < m_order.size()) + { + int box_w = getWidth() / m_order.size(); + int box_h = getHeight(); + int new_index = ev.x / box_w; + if (new_index >= 0 && new_index < m_order.size() && new_index != m_cur_index) + { + std::swap(m_order[m_cur_index], m_order[new_index]); + m_cur_index = new_index; + repaint(); + } + } +} + +void SpectralChainEditor::mouseUp(const MouseEvent & ev) +{ + if (m_did_drag == true) + { + //m_src->setSpectrumProcessOrder(m_order); + } +} diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index eec21f3..7ab94a0 100644 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -239,6 +239,27 @@ private: bool m_using_audio_buffer = false; }; +class SpectralChainEditor : public Component +{ +public: + SpectralChainEditor() {} + void paint(Graphics& g) override; + void setSource(StretchAudioSource* src) + { + m_src = src; + m_order = m_src->getSpectrumProcessOrder(); + repaint(); + } + void mouseDown(const MouseEvent& ev) override; + void mouseDrag(const MouseEvent& ev) override; + void mouseUp(const MouseEvent& ev) override; +private: + StretchAudioSource * m_src = nullptr; + bool m_did_drag = false; + int m_cur_index = -1; + std::vector m_order; +}; + class MyDynamicObject : public DynamicObject { public: @@ -277,6 +298,7 @@ private: TextButton m_import_button; Label m_info_label; + SpectralChainEditor m_spec_order_ed; void chooseFile(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)