gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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:
Msource/jucePlugin/CMakeLists.txt | 4++++
Asource/jucePlugin/ui3/FxPage.cpp | 34++++++++++++++++++++++++++++++++++
Asource/jucePlugin/ui3/FxPage.h | 24++++++++++++++++++++++++
Asource/jucePlugin/ui3/MidiPorts.cpp | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/jucePlugin/ui3/MidiPorts.h | 33+++++++++++++++++++++++++++++++++
Msource/jucePlugin/ui3/VirusEditor.cpp | 6+++++-
Msource/jucePlugin/ui3/VirusEditor.h | 9++++++++-
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;