You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
8.3KB

  1. /*
  2. ==============================================================================
  3. This file was auto-generated!
  4. It contains the basic framework code for a JUCE plugin editor.
  5. ==============================================================================
  6. */
  7. #pragma once
  8. #include "../JuceLibraryCode/JuceHeader.h"
  9. #include "PluginProcessor.h"
  10. #include <memory>
  11. #include <vector>
  12. class SpectralVisualizer : public Component
  13. {
  14. public:
  15. SpectralVisualizer();
  16. void setState(const ProcessParameters& pars, int nfreqs, double samplerate);
  17. void paint(Graphics& g) override;
  18. private:
  19. Image m_img;
  20. std::vector<REALTYPE> m_insamples,m_freqs1, m_freqs2, m_freqs3;
  21. std::unique_ptr<FFT> m_fft;
  22. int m_nfreqs = 0;
  23. double m_elapsed = 0.0;
  24. };
  25. inline void attachCallback(Button& button, std::function<void()> callback)
  26. {
  27. struct ButtonCallback : public Button::Listener,
  28. private ComponentListener
  29. {
  30. ButtonCallback(Button& b, std::function<void()> f) : target(b), fn(f)
  31. {
  32. target.addListener(this);
  33. target.addComponentListener(this);
  34. }
  35. ~ButtonCallback()
  36. {
  37. target.removeListener(this);
  38. }
  39. void componentBeingDeleted(Component&) override { delete this; }
  40. void buttonClicked(Button*) override { fn(); }
  41. Button& target;
  42. std::function<void()> fn;
  43. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ButtonCallback)
  44. };
  45. new ButtonCallback(button, callback);
  46. }
  47. class MySlider : public Slider
  48. {
  49. public:
  50. MySlider(NormalisableRange<float>* range) : m_range(range)
  51. {
  52. }
  53. double proportionOfLengthToValue(double x) override
  54. {
  55. return m_range->convertFrom0to1(x);
  56. }
  57. double valueToProportionOfLength(double x) override
  58. {
  59. return m_range->convertTo0to1(x);
  60. }
  61. private:
  62. NormalisableRange<float>* m_range = nullptr;
  63. };
  64. class ParameterComponent : public Component,
  65. public Slider::Listener, public Button::Listener
  66. {
  67. public:
  68. ParameterComponent(AudioProcessorParameter* par, bool notifyOnlyOnRelease) : m_par(par)
  69. {
  70. addAndMakeVisible(&m_label);
  71. m_label.setText(par->getName(50),dontSendNotification);
  72. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(par);
  73. if (floatpar)
  74. {
  75. m_slider = std::make_unique<MySlider>(&floatpar->range);
  76. m_notify_only_on_release = notifyOnlyOnRelease;
  77. m_slider->setRange(floatpar->range.start, floatpar->range.end, floatpar->range.interval);
  78. m_slider->setValue(*floatpar, dontSendNotification);
  79. m_slider->addListener(this);
  80. addAndMakeVisible(m_slider.get());
  81. }
  82. AudioParameterChoice* choicepar = dynamic_cast<AudioParameterChoice*>(par);
  83. if (choicepar)
  84. {
  85. }
  86. AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(par);
  87. if (boolpar)
  88. {
  89. m_togglebut = std::make_unique<ToggleButton>();
  90. m_togglebut->setToggleState(*boolpar, dontSendNotification);
  91. m_togglebut->addListener(this);
  92. addAndMakeVisible(m_togglebut.get());
  93. }
  94. }
  95. void resized() override
  96. {
  97. m_label.setBounds(0, 0, 200, 24);
  98. if (m_slider)
  99. m_slider->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), 24);
  100. if (m_togglebut)
  101. m_togglebut->setBounds(m_label.getRight() + 1, 0, getWidth() - 2 - m_label.getWidth(), 24);
  102. }
  103. void sliderValueChanged(Slider* slid) override
  104. {
  105. if (m_notify_only_on_release == true)
  106. return;
  107. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
  108. *floatpar = slid->getValue();
  109. }
  110. void sliderDragStarted(Slider* slid) override
  111. {
  112. m_dragging = true;
  113. }
  114. void sliderDragEnded(Slider* slid) override
  115. {
  116. m_dragging = false;
  117. if (m_notify_only_on_release == false)
  118. return;
  119. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
  120. *floatpar = slid->getValue();
  121. }
  122. void buttonClicked(Button* but) override
  123. {
  124. AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
  125. if (m_togglebut != nullptr && m_togglebut->getToggleState() != *boolpar)
  126. {
  127. *boolpar = m_togglebut->getToggleState();
  128. }
  129. }
  130. void updateComponent()
  131. {
  132. AudioParameterFloat* floatpar = dynamic_cast<AudioParameterFloat*>(m_par);
  133. if (m_slider != nullptr && m_dragging == false && (float)m_slider->getValue() != *floatpar)
  134. {
  135. m_slider->setValue(*floatpar, dontSendNotification);
  136. }
  137. AudioParameterBool* boolpar = dynamic_cast<AudioParameterBool*>(m_par);
  138. if (m_togglebut != nullptr && m_togglebut->getToggleState() != *boolpar)
  139. {
  140. m_togglebut->setToggleState(*boolpar, dontSendNotification);
  141. }
  142. }
  143. private:
  144. Label m_label;
  145. AudioProcessorParameter* m_par = nullptr;
  146. std::unique_ptr<MySlider> m_slider;
  147. std::unique_ptr<ComboBox> m_combobox;
  148. std::unique_ptr<ToggleButton> m_togglebut;
  149. bool m_notify_only_on_release = false;
  150. bool m_dragging = false;
  151. };
  152. class MyThumbCache : public AudioThumbnailCache
  153. {
  154. public:
  155. MyThumbCache() : AudioThumbnailCache(100) { /*Logger::writeToLog("Constructed AudioThumbNailCache");*/ }
  156. ~MyThumbCache() { /*Logger::writeToLog("Destructed AudioThumbNailCache");*/ }
  157. };
  158. class WaveformComponent : public Component, public ChangeListener, public Timer
  159. {
  160. public:
  161. WaveformComponent(AudioFormatManager* afm);
  162. ~WaveformComponent();
  163. void changeListenerCallback(ChangeBroadcaster* cb) override;
  164. void paint(Graphics& g) override;
  165. void setAudioFile(File f);
  166. const File& getAudioFile() const { return m_curfile; }
  167. void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
  168. void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
  169. void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
  170. void timerCallback() override;
  171. std::function<double()> CursorPosCallback;
  172. std::function<void(double)> SeekCallback;
  173. std::function<void(Range<double>, int)> TimeSelectionChangedCallback;
  174. void mouseDown(const MouseEvent& e) override;
  175. void mouseUp(const MouseEvent& e) override;
  176. void mouseDrag(const MouseEvent& e) override;
  177. void mouseMove(const MouseEvent& e) override;
  178. Range<double> getTimeSelection()
  179. {
  180. if (m_time_sel_start >= 0.0 && m_time_sel_end>m_time_sel_start + 0.001)
  181. return { m_time_sel_start, m_time_sel_end };
  182. return { 0.0, 1.0 };
  183. }
  184. void setTimeSelection(Range<double> rng)
  185. {
  186. if (m_lock_timesel_set == true)
  187. return;
  188. if (rng.isEmpty())
  189. rng = { -1.0,1.0 };
  190. m_time_sel_start = rng.getStart();
  191. m_time_sel_end = rng.getEnd();
  192. repaint();
  193. }
  194. void setFileCachedRange(std::pair<Range<double>, Range<double>> rng);
  195. void setTimerEnabled(bool b);
  196. void setViewRange(Range<double> rng);
  197. Value ShowFileCacheRange;
  198. void setRecordingPosition(double pos) { m_rec_pos = pos; }
  199. private:
  200. SharedResourcePointer<MyThumbCache> m_thumbcache;
  201. std::unique_ptr<AudioThumbnail> m_thumb;
  202. Range<double> m_view_range{ 0.0,1.0 };
  203. int m_time_sel_drag_target = 0;
  204. double m_time_sel_start = -1.0;
  205. double m_time_sel_end = -1.0;
  206. double m_drag_time_start = 0.0;
  207. bool m_mousedown = false;
  208. bool m_didseek = false;
  209. bool m_didchangetimeselection = false;
  210. int m_topmargin = 0;
  211. int getTimeSelectionEdge(int x, int y);
  212. std::pair<Range<double>, Range<double>> m_file_cached;
  213. File m_curfile;
  214. Image m_waveimage;
  215. OpenGLContext m_ogl;
  216. bool m_use_opengl = false;
  217. double m_rec_pos = 0.0;
  218. bool m_lock_timesel_set = false;
  219. };
  220. class MyDynamicObject : public DynamicObject
  221. {
  222. public:
  223. bool hasMethod(const Identifier& methodName) const override
  224. {
  225. if (methodName == Identifier("setLabelBounds") ||
  226. methodName == Identifier("setComponentBounds"))
  227. return true;
  228. return false;
  229. }
  230. var invokeMethod(Identifier methodName,
  231. const var::NativeFunctionArgs& args) override
  232. {
  233. return var();
  234. }
  235. };
  236. class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor,
  237. public MultiTimer
  238. {
  239. public:
  240. PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&);
  241. ~PaulstretchpluginAudioProcessorEditor();
  242. void paint (Graphics&) override;
  243. void resized() override;
  244. void timerCallback(int id) override;
  245. void setAudioFile(File f);
  246. void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
  247. void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
  248. void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
  249. WaveformComponent m_wavecomponent;
  250. private:
  251. PaulstretchpluginAudioProcessor& processor;
  252. std::vector<std::shared_ptr<ParameterComponent>> m_parcomps;
  253. SpectralVisualizer m_specvis;
  254. ToggleButton m_rec_enable;
  255. TextButton m_import_button;
  256. Label m_info_label;
  257. void chooseFile();
  258. JavascriptEngine m_js_engine;
  259. MyDynamicObject m_js_object;
  260. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)
  261. };