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 b7645f8e2f8d4aeaefb631ee5b7e55a419ca6b7f
parent 51159843c608c36df102feab2b45b2da1a71bb60
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Fri,  2 Aug 2024 19:30:11 +0200

implement store button, allow to save either a program or a performance

Diffstat:
Msource/nord/n2x/n2xJucePlugin/n2xController.cpp | 12++++++++++++
Msource/nord/n2x/n2xJucePlugin/n2xController.h | 2++
Msource/nord/n2x/n2xJucePlugin/n2xEditor.cpp | 21+++++++++++++++++++++
Msource/nord/n2x/n2xJucePlugin/n2xEditor.h | 2++
Msource/nord/n2x/n2xJucePlugin/n2xPatchManager.cpp | 7+++++--
5 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.cpp b/source/nord/n2x/n2xJucePlugin/n2xController.cpp @@ -306,6 +306,18 @@ namespace n2xJucePlugin return dst; } + std::vector<uint8_t> Controller::createMultiDump(const n2x::SysexByte _bank, const uint8_t _program) + { + const auto multi = m_state.updateAndGetMulti(); + + std::vector<uint8_t> result(multi.begin(), multi.end()); + + result[n2x::SysexIndex::IdxMsgType] = _bank; + result[n2x::SysexIndex::IdxMsgSpec] = _program; + + return result; + } + bool Controller::activatePatch(const std::vector<uint8_t>& _sysex, const uint32_t _part) const { if(_part >= getPartCount()) diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.h b/source/nord/n2x/n2xJucePlugin/n2xController.h @@ -52,6 +52,8 @@ namespace n2xJucePlugin void requestDump(uint8_t _bank, uint8_t _patch) const; std::vector<uint8_t> createSingleDump(uint8_t _bank, uint8_t _program, uint8_t _part) const; + std::vector<uint8_t> createMultiDump(n2x::SysexByte _bank, uint8_t _program); + bool activatePatch(const std::vector<uint8_t>& _sysex, uint32_t _part) const; bool isDerivedParameter(pluginLib::Parameter& _derived, pluginLib::Parameter& _base) const override; diff --git a/source/nord/n2x/n2xJucePlugin/n2xEditor.cpp b/source/nord/n2x/n2xJucePlugin/n2xEditor.cpp @@ -76,6 +76,14 @@ namespace n2xJucePlugin setCurrentPart(_part); m_parameterBinding.setPart(_part); }); + + if(auto* btSave = findComponentT<juce::Button>("button_store")) + { + btSave->onClick = [this] + { + onBtSave(); + }; + } } Editor::~Editor() @@ -122,4 +130,17 @@ namespace n2xJucePlugin { return m_controller.getPatchName(m_controller.getCurrentPart()); } + + void Editor::onBtSave() const + { + juce::PopupMenu menu; + + const auto numAdded = getPatchManager()->createSaveMenuEntries(menu, "Program"); + if(numAdded) + menu.addSeparator(); + + getPatchManager()->createSaveMenuEntries(menu, m_controller.getPartCount(), "Performance"); + + menu.showMenuAsync({}); + } } diff --git a/source/nord/n2x/n2xJucePlugin/n2xEditor.h b/source/nord/n2x/n2xJucePlugin/n2xEditor.h @@ -43,6 +43,8 @@ namespace n2xJucePlugin std::string getCurrentPatchName() const; private: + void onBtSave() const; + Controller& m_controller; pluginLib::ParameterBinding& m_parameterBinding; diff --git a/source/nord/n2x/n2xJucePlugin/n2xPatchManager.cpp b/source/nord/n2x/n2xJucePlugin/n2xPatchManager.cpp @@ -33,9 +33,12 @@ namespace n2xJucePlugin stopLoaderThread(); } - bool PatchManager::requestPatchForPart(pluginLib::patchDB::Data& _data, uint32_t _part) + bool PatchManager::requestPatchForPart(pluginLib::patchDB::Data& _data, const uint32_t _part) { - _data = m_controller.createSingleDump(n2x::SysexByte::SingleDumpBankA, 0, static_cast<uint8_t>(_part)); + if(_part < m_controller.getPartCount()) + _data = m_controller.createSingleDump(n2x::SysexByte::SingleDumpBankA, 0, static_cast<uint8_t>(_part)); + else + _data = m_controller.createMultiDump(n2x::SysexByte::MultiDumpBankA, 0); return !_data.empty(); }