commit 87c5ade74719f9a1c903979b0acab28b281bdf0f
parent 3b8936105eacc1593a2593ab742a306213f42c73
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Tue, 15 Mar 2022 22:54:29 +0100
add FX page reverb/delay handling & add midi port selection
Diffstat:
7 files changed, 253 insertions(+), 2 deletions(-)
diff --git a/source/jucePlugin/CMakeLists.txt b/source/jucePlugin/CMakeLists.txt
@@ -74,6 +74,10 @@ set(SOURCES_UI2
)
set(SOURCES_UI3
+ ui3/FxPage.cpp
+ ui3/FxPage.h
+ ui3/MidiPorts.cpp
+ ui3/MidiPorts.h
ui3/Parts.cpp
ui3/Parts.h
ui3/PatchBrowser.cpp
diff --git a/source/jucePlugin/ui3/FxPage.cpp b/source/jucePlugin/ui3/FxPage.cpp
@@ -0,0 +1,34 @@
+#include "FxPage.h"
+
+#include "VirusEditor.h"
+
+namespace genericVirusUI
+{
+ FxPage::FxPage(VirusEditor& _editor) : m_editor(_editor)
+ {
+ m_reverbContainer = _editor.findComponent("ContainerReverb");
+ m_delayContainer = _editor.findComponent("ContainerDelay");
+
+ const auto p = m_editor.getController().getParameter(Virus::Param_DelayReverbMode, 0);
+
+ if (p)
+ p->onValueChanged = [this]() { updateReverbDelay(); };
+
+ updateReverbDelay();
+ }
+
+ void FxPage::updateReverbDelay() const
+ {
+ auto p = m_editor.getController().getParameter(Virus::Param_DelayReverbMode, 0);
+
+ if (!p)
+ return;
+
+ const auto value = static_cast<int>(p->getValueObject().getValueSource().getValue());
+
+ const bool isReverb = (value > 1 && value < 5);
+
+ m_delayContainer->setVisible(!isReverb);
+ m_reverbContainer->setVisible(isReverb);
+ }
+}
diff --git a/source/jucePlugin/ui3/FxPage.h b/source/jucePlugin/ui3/FxPage.h
@@ -0,0 +1,24 @@
+#pragma once
+
+namespace juce
+{
+ class Component;
+}
+
+namespace genericVirusUI
+{
+ class VirusEditor;
+
+ class FxPage
+ {
+ public:
+ explicit FxPage(VirusEditor& _editor);
+
+ private:
+ void updateReverbDelay() const;
+
+ VirusEditor& m_editor;
+ juce::Component* m_reverbContainer = nullptr;
+ juce::Component* m_delayContainer = nullptr;
+ };
+}
diff --git a/source/jucePlugin/ui3/MidiPorts.cpp b/source/jucePlugin/ui3/MidiPorts.cpp
@@ -0,0 +1,145 @@
+#include "MidiPorts.h"
+
+#include "VirusEditor.h"
+
+namespace genericVirusUI
+{
+ MidiPorts::MidiPorts(VirusEditor& _editor) : m_editor(_editor)
+ {
+ auto& processor = _editor.getProcessor();
+
+ {
+ const auto properties = _editor.getController().getConfig();
+
+ const auto midiIn = properties->getValue("midi_input", "");
+ const auto midiOut = properties->getValue("midi_output", "");
+
+ if (!midiIn.isEmpty())
+ processor.setMidiInput(midiIn);
+
+ if (!midiOut.isEmpty())
+ processor.setMidiOutput(midiOut);
+ }
+
+ m_midiIn = _editor.findComponentT<juce::ComboBox>("MidiIn");
+ m_midiOut = _editor.findComponentT<juce::ComboBox>("MidiOut");
+
+ m_midiIn->setTextWhenNoChoicesAvailable("-");
+
+ const auto midiInputs = juce::MidiInput::getAvailableDevices();
+
+ int inIndex = 0;
+
+ m_midiIn->addItem("<none>", 1);
+
+ for (int i = 0; i < midiInputs.size(); i++)
+ {
+ const auto input = midiInputs[i];
+
+ if (processor.getMidiInput() != nullptr && input.identifier == processor.getMidiInput()->getIdentifier())
+ inIndex = i + 1;
+
+ m_midiIn->addItem(input.name, i+2);
+ }
+
+ m_midiIn->setSelectedItemIndex(inIndex, juce::dontSendNotification);
+
+ m_midiIn->onChange = [this]() { updateMidiInput(m_midiIn->getSelectedItemIndex()); };
+
+ m_midiOut->setTextWhenNoChoicesAvailable("-");
+
+ const auto midiOutputs = juce::MidiOutput::getAvailableDevices();
+
+ auto outIndex = 0;
+
+ m_midiOut->addItem("<none>", 1);
+
+ for (int i = 0; i < midiOutputs.size(); i++)
+ {
+ const auto output = midiOutputs[i];
+ if (processor.getMidiOutput() != nullptr &&
+ output.identifier == processor.getMidiOutput()->getIdentifier())
+ {
+ outIndex = i + 1;
+ }
+ m_midiOut->addItem(output.name, i+2);
+ }
+
+ m_midiOut->setSelectedItemIndex(outIndex, juce::dontSendNotification);
+
+ m_midiOut->onChange = [this]() { updateMidiOutput(m_midiOut->getSelectedItemIndex()); };
+
+ deviceManager = new juce::AudioDeviceManager();
+ }
+
+ MidiPorts::~MidiPorts()
+ {
+ delete deviceManager;
+ }
+
+ void MidiPorts::updateMidiInput(int index)
+ {
+ const auto list = juce::MidiInput::getAvailableDevices();
+
+ const auto properties = m_editor.getController().getConfig();
+
+ if (index <= 0)
+ {
+ properties->setValue("midi_input", "");
+ properties->save();
+ m_lastInputIndex = 0;
+ m_midiIn->setSelectedItemIndex(index, juce::dontSendNotification);
+ return;
+ }
+
+ index--;
+
+ const auto newInput = list[index];
+
+ if (!deviceManager->isMidiInputDeviceEnabled(newInput.identifier))
+ deviceManager->setMidiInputDeviceEnabled(newInput.identifier, true);
+
+ if (!m_editor.getProcessor().setMidiInput(newInput.identifier))
+ {
+ m_midiIn->setSelectedItemIndex(0, juce::dontSendNotification);
+ m_lastInputIndex = 0;
+ return;
+ }
+
+ properties->setValue("midi_input", newInput.identifier);
+ properties->save();
+
+ m_midiIn->setSelectedItemIndex(index + 1, juce::dontSendNotification);
+ m_lastInputIndex = index;
+ }
+
+ void MidiPorts::updateMidiOutput(int index)
+ {
+ const auto list = juce::MidiOutput::getAvailableDevices();
+
+ const auto properties = m_editor.getController().getConfig();
+
+ if (index == 0)
+ {
+ properties->setValue("midi_output", "");
+ properties->save();
+ m_midiOut->setSelectedItemIndex(index, juce::dontSendNotification);
+ m_lastOutputIndex = index;
+ m_editor.getProcessor().setMidiOutput("");
+ return;
+ }
+ index--;
+ const auto newOutput = list[index];
+ if (!m_editor.getProcessor().setMidiOutput(newOutput.identifier))
+ {
+ m_midiOut->setSelectedItemIndex(0, juce::dontSendNotification);
+ m_lastOutputIndex = 0;
+ return;
+ }
+ properties->setValue("midi_output", newOutput.identifier);
+ properties->save();
+
+ m_midiOut->setSelectedItemIndex(index + 1, juce::dontSendNotification);
+ m_lastOutputIndex = index;
+ }
+}
diff --git a/source/jucePlugin/ui3/MidiPorts.h b/source/jucePlugin/ui3/MidiPorts.h
@@ -0,0 +1,33 @@
+#pragma once
+
+namespace juce
+{
+ class AudioDeviceManager;
+ class ComboBox;
+}
+
+namespace genericVirusUI
+{
+ class VirusEditor;
+
+ class MidiPorts
+ {
+ public:
+ explicit MidiPorts(VirusEditor& _editor);
+ ~MidiPorts();
+
+ private:
+ VirusEditor& m_editor;
+
+ juce::ComboBox* m_midiIn = nullptr;
+ juce::ComboBox* m_midiOut = nullptr;
+
+ juce::AudioDeviceManager* deviceManager = nullptr;
+ int m_lastInputIndex = 0;
+ int m_lastOutputIndex = 0;
+
+ void updateMidiInput(int _index);
+ void updateMidiOutput(int _index);
+
+ };
+}
diff --git a/source/jucePlugin/ui3/VirusEditor.cpp b/source/jucePlugin/ui3/VirusEditor.cpp
@@ -9,9 +9,13 @@
namespace genericVirusUI
{
- VirusEditor::VirusEditor(VirusParameterBinding& _binding, Virus::Controller& _controller, AudioPluginAudioProcessor &_processorRef) : Editor(std::string(BinaryData::VirusC_json, BinaryData::VirusC_jsonSize), _binding, _controller),
+ VirusEditor::VirusEditor(VirusParameterBinding& _binding, Virus::Controller& _controller, AudioPluginAudioProcessor &_processorRef) :
+ Editor(std::string(BinaryData::VirusC_json, BinaryData::VirusC_jsonSize), _binding, _controller),
+ m_processor(_processorRef),
m_parts(*this),
m_tabs(*this),
+ m_midiPorts(*this),
+ m_fxPage(*this),
m_patchBrowser(*this)
{
m_presetName = findComponentT<juce::Label>("PatchName");
diff --git a/source/jucePlugin/ui3/VirusEditor.h b/source/jucePlugin/ui3/VirusEditor.h
@@ -4,7 +4,8 @@
#include "Parts.h"
#include "Tabs.h"
-
+#include "FxPage.h"
+#include "MidiPorts.h"
#include "PatchBrowser.h"
class AudioPluginAudioProcessor;
@@ -18,6 +19,8 @@ namespace genericVirusUI
void setPart(size_t _part);
+ AudioPluginAudioProcessor& getProcessor() { return m_processor; }
+
private:
void onProgramChange();
void onPlayModeChanged();
@@ -37,6 +40,8 @@ namespace genericVirusUI
void setPlayMode(uint8_t _playMode);
+ AudioPluginAudioProcessor& m_processor;
+
Parts m_parts;
Tabs m_tabs;
@@ -49,6 +54,8 @@ namespace genericVirusUI
juce::TooltipWindow m_tooltipWindow;
+ MidiPorts m_midiPorts;
+ FxPage m_fxPage;
PatchBrowser m_patchBrowser;
std::unique_ptr<juce::FileChooser> m_fileChooser;