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:
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)