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.

286 lines
8.4KB

  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. bool isUsingAudioBuffer() const { return m_using_audio_buffer; }
  168. void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
  169. void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
  170. void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
  171. void timerCallback() override;
  172. std::function<double()> CursorPosCallback;
  173. std::function<void(double)> SeekCallback;
  174. std::function<void(Range<double>, int)> TimeSelectionChangedCallback;
  175. void mouseDown(const MouseEvent& e) override;
  176. void mouseUp(const MouseEvent& e) override;
  177. void mouseDrag(const MouseEvent& e) override;
  178. void mouseMove(const MouseEvent& e) override;
  179. Range<double> getTimeSelection()
  180. {
  181. if (m_time_sel_start >= 0.0 && m_time_sel_end>m_time_sel_start + 0.001)
  182. return { m_time_sel_start, m_time_sel_end };
  183. return { 0.0, 1.0 };
  184. }
  185. void setTimeSelection(Range<double> rng)
  186. {
  187. if (m_lock_timesel_set == true)
  188. return;
  189. if (rng.isEmpty())
  190. rng = { -1.0,1.0 };
  191. m_time_sel_start = rng.getStart();
  192. m_time_sel_end = rng.getEnd();
  193. repaint();
  194. }
  195. void setFileCachedRange(std::pair<Range<double>, Range<double>> rng);
  196. void setTimerEnabled(bool b);
  197. void setViewRange(Range<double> rng);
  198. Value ShowFileCacheRange;
  199. void setRecordingPosition(double pos) { m_rec_pos = pos; }
  200. private:
  201. SharedResourcePointer<MyThumbCache> m_thumbcache;
  202. std::unique_ptr<AudioThumbnail> m_thumb;
  203. Range<double> m_view_range{ 0.0,1.0 };
  204. int m_time_sel_drag_target = 0;
  205. double m_time_sel_start = -1.0;
  206. double m_time_sel_end = -1.0;
  207. double m_drag_time_start = 0.0;
  208. bool m_mousedown = false;
  209. bool m_didseek = false;
  210. bool m_didchangetimeselection = false;
  211. int m_topmargin = 0;
  212. int getTimeSelectionEdge(int x, int y);
  213. std::pair<Range<double>, Range<double>> m_file_cached;
  214. File m_curfile;
  215. Image m_waveimage;
  216. OpenGLContext m_ogl;
  217. bool m_use_opengl = false;
  218. double m_rec_pos = 0.0;
  219. bool m_lock_timesel_set = false;
  220. bool m_using_audio_buffer = false;
  221. };
  222. class MyDynamicObject : public DynamicObject
  223. {
  224. public:
  225. bool hasMethod(const Identifier& methodName) const override
  226. {
  227. if (methodName == Identifier("setLabelBounds") ||
  228. methodName == Identifier("setComponentBounds"))
  229. return true;
  230. return false;
  231. }
  232. var invokeMethod(Identifier methodName,
  233. const var::NativeFunctionArgs& args) override
  234. {
  235. return var();
  236. }
  237. };
  238. class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor,
  239. public MultiTimer
  240. {
  241. public:
  242. PaulstretchpluginAudioProcessorEditor (PaulstretchpluginAudioProcessor&);
  243. ~PaulstretchpluginAudioProcessorEditor();
  244. void paint (Graphics&) override;
  245. void resized() override;
  246. void timerCallback(int id) override;
  247. void setAudioFile(File f);
  248. void setAudioBuffer(AudioBuffer<float>* buf, int samplerate, int len);
  249. void beginAddingAudioBlocks(int channels, int samplerate, int totalllen);
  250. void addAudioBlock(AudioBuffer<float>& buf, int samplerate, int pos);
  251. WaveformComponent m_wavecomponent;
  252. private:
  253. PaulstretchpluginAudioProcessor& processor;
  254. std::vector<std::shared_ptr<ParameterComponent>> m_parcomps;
  255. SpectralVisualizer m_specvis;
  256. ToggleButton m_rec_enable;
  257. TextButton m_import_button;
  258. Label m_info_label;
  259. void chooseFile();
  260. JavascriptEngine m_js_engine;
  261. MyDynamicObject m_js_object;
  262. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor)
  263. };