SmartGuitarAmp

Guitar plugin made with JUCE that uses neural networks to emulate a tube amplifier
Log | Files | Refs | Submodules | README

commit 883944d1b46d03e6e906602db2f15cf24ecb743b
parent bb36c643ae4408fbb0f9204971753d3330a1df21
Author: Keith Bloemer <32459398+GuitarML@users.noreply.github.com>
Date:   Tue, 11 Apr 2023 13:03:09 -0500

Merge pull request #33 from mpesonen/feature/resizableGUI

Feature: resizable GUI
Diffstat:
Msrc/PluginEditor.cpp | 66+++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
Msrc/PluginEditor.h | 24++++++++++++++++++++----
Msrc/PluginProcessor.cpp | 6++++--
Msrc/PluginProcessor.h | 1+
4 files changed, 78 insertions(+), 19 deletions(-)

diff --git a/src/PluginEditor.cpp b/src/PluginEditor.cpp @@ -12,8 +12,8 @@ #include "PluginEditor.h" //============================================================================== -WaveNetVaAudioProcessorEditor::WaveNetVaAudioProcessorEditor (WaveNetVaAudioProcessor& p) - : AudioProcessorEditor (&p), processor (p) +WaveNetVaComponent::WaveNetVaComponent (WaveNetVaAudioProcessor& p) + : processor (p) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to @@ -124,14 +124,11 @@ WaveNetVaAudioProcessorEditor::WaveNetVaAudioProcessorEditor (WaveNetVaAudioProc ampMasterKnob.setTextBoxStyle(juce::Slider::TextEntryBoxPosition::NoTextBox, false, 50, 20 ); ampMasterKnob.setDoubleClickReturnValue(true, 0.5); - // Size of plugin GUI - setSize (1085, 540); - processor.loadConfigAmp(); resetImages(); } -WaveNetVaAudioProcessorEditor::~WaveNetVaAudioProcessorEditor() +WaveNetVaComponent::~WaveNetVaComponent() { ampPresenceKnob.setLookAndFeel(nullptr); ampCleanBassKnob.setLookAndFeel(nullptr); @@ -146,7 +143,7 @@ WaveNetVaAudioProcessorEditor::~WaveNetVaAudioProcessorEditor() } //============================================================================== -void WaveNetVaAudioProcessorEditor::paint (Graphics& g) +void WaveNetVaComponent::paint (Graphics& g) { // Workaround for graphics on Windows builds (clipping code doesn't work correctly on Windows) @@ -160,7 +157,7 @@ void WaveNetVaAudioProcessorEditor::paint (Graphics& g) } -void WaveNetVaAudioProcessorEditor::resized() +void WaveNetVaComponent::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. @@ -183,7 +180,7 @@ void WaveNetVaAudioProcessorEditor::resized() ampLED.setBounds(975, 40, 15, 25); } -void WaveNetVaAudioProcessorEditor::buttonClicked(juce::Button* button) +void WaveNetVaComponent::buttonClicked(juce::Button* button) { if (button == &ampOnButton) { ampOnButtonClicked(); @@ -192,7 +189,7 @@ void WaveNetVaAudioProcessorEditor::buttonClicked(juce::Button* button) } } -void WaveNetVaAudioProcessorEditor::ampOnButtonClicked() { +void WaveNetVaComponent::ampOnButtonClicked() { if (processor.amp_state == 0) { processor.amp_state = 1; } @@ -202,7 +199,7 @@ void WaveNetVaAudioProcessorEditor::ampOnButtonClicked() { resetImages(); } -void WaveNetVaAudioProcessorEditor::ampCleanLeadButtonClicked() { +void WaveNetVaComponent::ampCleanLeadButtonClicked() { if (processor.amp_lead == 1) { processor.amp_lead = 0; processor.loadConfigAmp(); @@ -217,7 +214,7 @@ void WaveNetVaAudioProcessorEditor::ampCleanLeadButtonClicked() { resetImages(); } -void WaveNetVaAudioProcessorEditor::sliderValueChanged(Slider* slider) +void WaveNetVaComponent::sliderValueChanged(Slider* slider) { // Amp @@ -238,7 +235,7 @@ void WaveNetVaAudioProcessorEditor::sliderValueChanged(Slider* slider) } -void WaveNetVaAudioProcessorEditor::resetImages() +void WaveNetVaComponent::resetImages() { if (processor.amp_state == 1 && processor.amp_lead == 1 ) { background_set = background_lead; @@ -289,3 +286,45 @@ void WaveNetVaAudioProcessorEditor::resetImages() } repaint(); } + +float WaveNetVaComponent::getGuiScaleFactor() +{ + return static_cast<float> (processor.gui_scale_factor); +} + +void WaveNetVaComponent::persistGuiScaleFactor(float scaleFactor) +{ + processor.gui_scale_factor = static_cast<double> (scaleFactor); +} + +// Wrapper implementation +WrappedWaveNetVaAudioProcessorEditor::WrappedWaveNetVaAudioProcessorEditor(WaveNetVaAudioProcessor& p) + : AudioProcessorEditor(p), waveNetVaComponent(p) +{ + addAndMakeVisible(waveNetVaComponent); + + if (auto* constrainer = getConstrainer()) + { + constrainer->setFixedAspectRatio(static_cast<double> (originalWidth) / static_cast<double> (originalHeight)); + constrainer->setSizeLimits(originalWidth / 4, originalHeight / 4, originalWidth * 2, originalHeight * 2); + } + + setResizable(true, true); + float scaledWidth = static_cast<float> (originalWidth) * waveNetVaComponent.getGuiScaleFactor(); + float scaledHeight = static_cast<float> (originalHeight) * waveNetVaComponent.getGuiScaleFactor(); + setSize(scaledWidth, scaledHeight); + resetImages(); +} + +void WrappedWaveNetVaAudioProcessorEditor::resized() +{ + const auto scaleFactor = static_cast<float> (getWidth()) / originalWidth; + waveNetVaComponent.setTransform(AffineTransform::scale(scaleFactor)); + waveNetVaComponent.setBounds(0, 0, originalWidth, originalHeight); + waveNetVaComponent.persistGuiScaleFactor(scaleFactor); +} + +void WrappedWaveNetVaAudioProcessorEditor::resetImages() +{ + waveNetVaComponent.resetImages(); +} +\ No newline at end of file diff --git a/src/PluginEditor.h b/src/PluginEditor.h @@ -17,20 +17,22 @@ //============================================================================== /** */ -class WaveNetVaAudioProcessorEditor : public AudioProcessorEditor, +class WaveNetVaComponent : public Component, private Button::Listener, private Slider::Listener { public: - WaveNetVaAudioProcessorEditor (WaveNetVaAudioProcessor&); - ~WaveNetVaAudioProcessorEditor(); + WaveNetVaComponent (WaveNetVaAudioProcessor&); + ~WaveNetVaComponent(); //============================================================================== void paint (Graphics&) override; void resized() override; void resetImages(); + float getGuiScaleFactor(); + void persistGuiScaleFactor(float scaleFactor); private: // This reference is provided as a quick way for your editor to @@ -84,5 +86,18 @@ public: std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> presenceSliderAttach; std::unique_ptr <AudioProcessorValueTreeState::SliderAttachment> masterSliderAttach; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WaveNetVaAudioProcessorEditor) + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WaveNetVaComponent) }; + +class WrappedWaveNetVaAudioProcessorEditor : public AudioProcessorEditor +{ +public: + WrappedWaveNetVaAudioProcessorEditor(WaveNetVaAudioProcessor&); + void resized() override; + void resetImages(); +private: + static constexpr int originalWidth { 1085 }; + static constexpr int originalHeight { 540 }; + + WaveNetVaComponent waveNetVaComponent; +}; +\ No newline at end of file diff --git a/src/PluginProcessor.cpp b/src/PluginProcessor.cpp @@ -225,7 +225,7 @@ bool WaveNetVaAudioProcessor::hasEditor() const AudioProcessorEditor* WaveNetVaAudioProcessor::createEditor() { - return new WaveNetVaAudioProcessorEditor (*this); + return new WrappedWaveNetVaAudioProcessorEditor (*this); } //============================================================================== @@ -238,6 +238,7 @@ void WaveNetVaAudioProcessor::getStateInformation (MemoryBlock& destData) std::unique_ptr<XmlElement> xml (state.createXml()); xml->setAttribute ("amp_state", amp_state); xml->setAttribute ("amp_lead", amp_lead); + xml->setAttribute ("gui_scale_factor", gui_scale_factor); copyXmlToBinary (*xml, destData); } @@ -255,7 +256,8 @@ void WaveNetVaAudioProcessor::setStateInformation (const void* data, int sizeInB treeState.replaceState (juce::ValueTree::fromXml (*xmlState)); amp_state = xmlState->getBoolAttribute ("amp_state"); amp_lead = xmlState->getBoolAttribute ("amp_lead"); - if (auto* editor = dynamic_cast<WaveNetVaAudioProcessorEditor*> (getActiveEditor())) + gui_scale_factor = xmlState->getDoubleAttribute ("gui_scale_factor", 1.0); + if (auto* editor = dynamic_cast<WrappedWaveNetVaAudioProcessorEditor*> (getActiveEditor())) editor->resetImages(); } } diff --git a/src/PluginProcessor.h b/src/PluginProcessor.h @@ -91,6 +91,7 @@ public: int amp_state = 1; // 0 = off, 1 = on int amp_lead = 1; // 1 = clean, 0 = lead int custom_tone = 0; // 0 = custom tone loaded, 1 = default channel tone + double gui_scale_factor = 1.0; File loaded_tone; juce::String loaded_tone_name;