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 5efc01829cb68ebb49e7dec8d697bc3331727d00
parent fa7c89f6be1dfe244d3f13407d02e57620788b7d
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Thu, 15 Aug 2024 14:22:08 +0200

fix being unable to change multi parameters anymore

Diffstat:
Msource/nord/n2x/n2xJucePlugin/n2xController.cpp | 8++++++--
Msource/nord/n2x/n2xLib/n2xstate.cpp | 34++++++++++++++++++++++++++++++----
Msource/nord/n2x/n2xLib/n2xstate.h | 4+++-
3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.cpp b/source/nord/n2x/n2xJucePlugin/n2xController.cpp @@ -276,7 +276,9 @@ namespace n2xJucePlugin return; const auto& single = m_state.getSingle(_part); - pluginLib::Controller::sendSysEx(pluginLib::SysEx{single.begin(), single.end()}); + auto sysex = pluginLib::SysEx{single.begin(), single.end()}; + sysex = n2x::State::validateDump(sysex); + pluginLib::Controller::sendSysEx(sysex); } void Controller::setMultiParameter(n2x::MultiParam _mp, uint8_t _value) @@ -284,7 +286,9 @@ namespace n2xJucePlugin if(!m_state.changeMultiParameter(_mp, _value)) return; const auto& multi = m_state.updateAndGetMulti(); - pluginLib::Controller::sendSysEx(pluginLib::SysEx{multi.begin(), multi.end()}); + auto sysex = pluginLib::SysEx{multi.begin(), multi.end()}; + sysex = n2x::State::validateDump(sysex); + pluginLib::Controller::sendSysEx(sysex); } uint8_t Controller::getMultiParameter(const n2x::MultiParam _param) const diff --git a/source/nord/n2x/n2xLib/n2xstate.cpp b/source/nord/n2x/n2xLib/n2xstate.cpp @@ -491,7 +491,7 @@ namespace n2x std::string State::extractPatchName(const std::vector<uint8_t>& _dump) { - if(!hasPatchName(_dump)) + if(!isDumpWithPatchName(_dump)) return {}; auto* begin = &_dump[_dump.size() - g_nameLength - 1]; if(*begin == 0xf7) @@ -500,21 +500,47 @@ namespace n2x return name; } - bool State::hasPatchName(const std::vector<uint8_t>& _dump) + bool State::isDumpWithPatchName(const std::vector<uint8_t>& _dump) { return _dump.size() == g_singleDumpWithNameSize || _dump.size() == g_multiDumpWithNameSize; } std::vector<uint8_t> State::stripPatchName(const std::vector<uint8_t>& _dump) { - if(!hasPatchName(_dump)) + if(!isDumpWithPatchName(_dump)) return _dump; auto d = _dump; d.erase(d.end() - g_nameLength - 1, d.end() - 1); assert(d.size() == g_singleDumpSize || d.size() == g_multiDumpSize); + d.back() = 0xf7; return d; } + bool State::isValidPatchName(const std::vector<uint8_t>& _dump) + { + if(!isDumpWithPatchName(_dump)) + return false; + + if(_dump.back() != 0xf7) + return false; + + const auto nameStart = _dump.size() - g_nameLength - 1; + + for(size_t i=nameStart; i<nameStart+g_nameLength; ++i) + { + if(_dump[i] < 32 || _dump[i] >= 128) + return false; + } + return true; + } + + std::vector<uint8_t> State::validateDump(const std::vector<uint8_t>& _dump) + { + if(!isValidPatchName(_dump)) + return stripPatchName(_dump); + return _dump; + } + void State::send(const synthLib::SMidiEvent& _e) const { if(_e.source == synthLib::MidiEventSource::Plugin) @@ -524,7 +550,7 @@ namespace n2x { const auto& sysex = _e.sysex; - if(hasPatchName(sysex)) + if(isDumpWithPatchName(sysex)) { auto e = _e; e.sysex = stripPatchName(sysex); diff --git a/source/nord/n2x/n2xLib/n2xstate.h b/source/nord/n2x/n2xLib/n2xstate.h @@ -122,8 +122,10 @@ namespace n2x static bool isMultiDump(const std::vector<uint8_t>& _dump); static std::string extractPatchName(const std::vector<uint8_t>& _dump); - static bool hasPatchName(const std::vector<uint8_t>& _dump); + static bool isDumpWithPatchName(const std::vector<uint8_t>& _dump); static std::vector<uint8_t> stripPatchName(const std::vector<uint8_t>& _dump); + static bool isValidPatchName(const std::vector<uint8_t>& _dump); + static std::vector<uint8_t> validateDump(const std::vector<uint8_t>& _dump); private: template<size_t Size> bool receive(const std::array<uint8_t, Size>& _data)