|
- /*
- ==============================================================================
-
- This file was auto-generated!
-
- It contains the basic framework code for a JUCE plugin editor.
-
- ==============================================================================
- */
-
- #pragma once
-
- #include "../JuceLibraryCode/JuceHeader.h"
- #include "PluginProcessor.h"
- #include <memory>
- #include <vector>
-
- class SpectralVisualizer : public Component
- {
- public:
- SpectralVisualizer();
- void setState(const ProcessParameters& pars, int nfreqs, double samplerate);
- void paint(Graphics& g) override;
-
- private:
- Image m_img;
- std::vector<REALTYPE> m_insamples,m_freqs1, m_freqs2, m_freqs3;
- std::unique_ptr<FFT> m_fft;
- int m_nfreqs = 0;
- double m_elapsed = 0.0;
- };
-
- inline void attachCallback(Button& button, std::function<void()> callback)
- {
- struct ButtonCallback : public Button::Listener,
- private ComponentListener
- {
- ButtonCallback(Button& b, std::function<void()> f) : target(b), fn(f)
- {
- target.addListener(this);
- target.addComponentListener(this);
- }
-
- ~ButtonCallback()
- {
- target.removeListener(this);
- }
-
- void componentBeingDeleted(Component&) override { delete this; }
- void buttonClicked(Button*) override { fn(); }
-
- Button& target;
- std::function<void()> fn;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ButtonCallback)
- };
-
- new ButtonCallback(button, callback);
- }
-
- class MySlider : public Slider
- {
- public:
- MySlider(NormalisableRange<float>* range) : m_range(range)
- {
- }
- double proportionOfLengthToValue(double x) override
- {
- return m_range->convertFrom0to1(x);
- }
- double valueToProportionOfLength(double x) override
- {
- return m_range->convertTo0to1(x);
- }
- private:
- NormalisableRange<float>* m_range = nullptr;
- };
-
- class ParameterComponent : public Component,
- public Slider::Listener, public Button::Listener
- {
- public:
- ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease) : m_par(par)
- {
- addAndMakeVisible(&m_label);
- m_label.setText(par->getName(50),dontSendNotification);
- AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(par);
- if (floatpar)
- {
- m_slider = std::make_unique<MySlider>(&floatpar->range);
- m_notify_only_on_release = notifyOnlyOnRelease;
- m_slider->setRange(floatpar->range.start, floatpar->range.end, floatpar->range.interval);
- m_slider->setValue(*floatpar, dontSendNotification);
- m_slider->addListener(this);
- addAndMakeVisible(m_slider.get());
- }
- AudioParameterChoice* choicepar = dynamic_cast<AudioParameterChoice*>(par);
- if (choicepar)
- {
-
- }
- AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(par);
- if (boolpar)
- {
- m_togglebut = std::make_unique<ToggleButton>();
- m_togglebut->setToggleState(*boolpar, dontSendNotification);
- m_togglebut->addListener(this);
- addAndMakeVisible(m_togglebut.get());
- }
- }
- void resized() override
- {
- m_label.setBounds(0, 0, 200, 24);
- if (m_slider)
- m_slider->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), 24);
- if (m_togglebut)
- m_togglebut->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), 24);
- }
- void sliderValueChanged(Slider* slid) override
- {
- if (m_notify_only_on_release == true)
- return;
- AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
- *floatpar = slid->getValue();
- }
- void sliderDragStarted(Slider* slid) override
- {
- m_dragging = true;
- }
- void sliderDragEnded(Slider* slid) override
- {
- m_dragging = false;
- if (m_notify_only_on_release == false)
- return;
- AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
- *floatpar = slid->getValue();
- }
- void buttonClicked(Button* but) override
- {
- AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
- if (m_togglebut != nullptr && m_togglebut->getToggleState() != *boolpar)
- {
- *boolpar = m_togglebut->getToggleState();
- }
- }
- void updateComponent()
- {
- AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
- if (m_slider != nullptr && m_dragging == false && (float)m_slider->getValue() != *floatpar)
- {
- m_slider->setValue(*floatpar, dontSendNotification);
- }
- AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
- if (m_togglebut != nullptr && m_togglebut->getToggleState() != *boolpar)
- {
- m_togglebut->setToggleState(*boolpar, dontSendNotification);
- }
- }
- private:
- Label m_label;
- AudioProcessorParameter* m_par = nullptr;
- std::unique_ptr<MySlider> m_slider;
- std::unique_ptr<ComboBox> m_combobox;
- std::unique_ptr<ToggleButton> m_togglebut;
- bool m_notify_only_on_release = false;
- bool m_dragging = false;
- };
-
- class MyThumbCache : public AudioThumbnailCache
- {
- public:
- MyThumbCache() : AudioThumbnailCache(100) { /*Logger::writeToLog("Constructed AudioThumbNailCache");*/ }
- ~MyThumbCache() { /*Logger::writeToLog("Destructed AudioThumbNailCache");*/ }
- };
-
- class WaveformComponent : public Component, public ChangeListener, public Timer
- {
- public:
- WaveformComponent(AudioFormatManager* afm);
- ~WaveformComponent();
- void changeListenerCallback(ChangeBroadcaster* cb) override;
- void paint(Graphics& g) override;
- void setAudioFile(File f);
- const File& getAudioFile() const { return m_curfile; }
- void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
- void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
- void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
- void timerCallback() override;
- std::function<double()> CursorPosCallback;
- std::function<void(double)> SeekCallback;
- std::function<void(Range<double>, int)> TimeSelectionChangedCallback;
- void mouseDown(const MouseEvent& e) override;
- void mouseUp(const MouseEvent& e) override;
- void mouseDrag(const MouseEvent& e) override;
- void mouseMove(const MouseEvent& e) override;
- Range<double> getTimeSelection()
- {
- if (m_time_sel_start >= 0.0 && m_time_sel_end>m_time_sel_start + 0.001)
- return { m_time_sel_start, m_time_sel_end };
- return { 0.0, 1.0 };
- }
- void setTimeSelection(Range<double> rng)
- {
- if (m_lock_timesel_set == true)
- return;
- if (rng.isEmpty())
- rng = { -1.0,1.0 };
- m_time_sel_start = rng.getStart();
- m_time_sel_end = rng.getEnd();
- repaint();
- }
- void setFileCachedRange(std::pair<Range<double>, Range<double>> rng);
- void setTimerEnabled(bool b);
- void setViewRange(Range<double> rng);
- Value ShowFileCacheRange;
- void setRecordingPosition(double pos) { m_rec_pos = pos; }
- private:
- SharedResourcePointer<MyThumbCache> m_thumbcache;
-
- std::unique_ptr<AudioThumbnail> m_thumb;
- Range<double> m_view_range{ 0.0,1.0 };
- int m_time_sel_drag_target = 0;
- double m_time_sel_start = -1.0;
- double m_time_sel_end = -1.0;
- double m_drag_time_start = 0.0;
- bool m_mousedown = false;
- bool m_didseek = false;
- bool m_didchangetimeselection = false;
- int m_topmargin = 0;
- int getTimeSelectionEdge(int x, int y);
- std::pair<Range<double>, Range<double>> m_file_cached;
- File m_curfile;
- Image m_waveimage;
- OpenGLContext m_ogl;
- bool m_use_opengl = false;
- double m_rec_pos = 0.0;
- bool m_lock_timesel_set = false;
- };
-
- class MyDynamicObject : public DynamicObject
- {
- public:
- bool hasMethod(const Identifier& methodName) const override
- {
- if (methodName == Identifier("setLabelBounds") ||
- methodName == Identifier("setComponentBounds"))
- return true;
- return false;
- }
- var invokeMethod(Identifier methodName,
- const var::NativeFunctionArgs& args) override
- {
- return var();
- }
- };
-
- class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor,
- public MultiTimer
- {
- public:
- PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&);
- ~PaulstretchpluginAudioProcessorEditor();
- void paint (Graphics&) override;
- void resized() override;
- void timerCallback(int id) override;
- void setAudioFile(File f);
- void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
- void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
- void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
- WaveformComponent m_wavecomponent;
- private:
- PaulstretchpluginAudioProcessor& processor;
- std::vector<std::shared_ptr<ParameterComponent>> m_parcomps;
- SpectralVisualizer m_specvis;
- ToggleButton m_rec_enable;
- TextButton m_import_button;
- Label m_info_label;
- void chooseFile();
- JavascriptEngine m_js_engine;
- MyDynamicObject m_js_object;
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)
- };
|