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 8b1f95e08b283c7fe7f710f1578c4ccc61938ff4
parent 5e4509612ffbb6bb0dd1da265b05f5e56fc31501
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon, 21 Oct 2024 22:34:38 +0200

return cached copies of waves/tables if statee has them instead of querying the device

Diffstat:
Msource/xtLib/xtState.cpp | 44+++++++++++++++++++++++++++++++++++++++++++-
Msource/xtLib/xtState.h | 6++++++
2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/source/xtLib/xtState.cpp b/source/xtLib/xtState.cpp @@ -217,6 +217,8 @@ namespace xt case SysexCommand::MultiRequest: return getDump(DumpType::Multi,_responses, _data); case SysexCommand::GlobalRequest: return getDump(DumpType::Global, _responses, _data); case SysexCommand::ModeRequest: return getDump(DumpType::Mode, _responses, _data); + case SysexCommand::WaveRequest: return getDump(DumpType::Wave, _responses, _data); + case SysexCommand::WaveCtlRequest: return getDump(DumpType::Table, _responses, _data); case SysexCommand::SingleDump: return parseDump(DumpType::Single, _data); case SysexCommand::MultiDump: return parseDump(DumpType::Multi, _data); @@ -598,7 +600,45 @@ namespace xt return nullptr; } - bool State::getDump(DumpType _type, Responses& _responses, const SysEx& _data) + bool State::getWave(Responses& _responses, const SysEx& _data) + { + const auto idx = static_cast<uint16_t>((static_cast<uint16_t>(_data[IdxWaveIndexH]) << 7u) | static_cast<uint16_t>(_data[IdxWaveIndexL])); + + auto* w = getWave(WaveId(idx)); + if(!w || !isValid(*w)) + return false; + _responses.emplace_back(w->begin(), w->end()); + return true; + } + + State::Wave* State::getWave(const WaveId _id) + { + const auto idx = _id.rawId(); + if(idx >= m_waves.size()) + return nullptr; + return &m_waves[idx]; + } + + bool State::getTable(Responses& _responses, const SysEx& _data) + { + const auto idx = static_cast<uint16_t>((static_cast<uint16_t>(_data[IdxWaveIndexH]) << 7u) | static_cast<uint16_t>(_data[IdxWaveIndexL])); + + auto* t = getTable(TableId(idx)); + if(!t || !isValid(*t)) + return false; + _responses.emplace_back(t->begin(), t->end()); + return true; + } + + State::Table* State::getTable(const TableId _id) + { + const auto idx = _id.rawId(); + if(idx >= m_tables.size()) + return nullptr; + return &m_tables[idx]; + } + + bool State::getDump(const DumpType _type, Responses& _responses, const SysEx& _data) { bool res; @@ -608,6 +648,8 @@ namespace xt case DumpType::Multi: res = getMulti(_responses, _data); break; case DumpType::Global: res = getGlobal(_responses); break; case DumpType::Mode: res = getMode(_responses); break; + case DumpType::Wave: res = getWave(_responses, _data); break; + case DumpType::Table: res = getTable(_responses, _data); break; default: return false; } diff --git a/source/xtLib/xtState.h b/source/xtLib/xtState.h @@ -156,6 +156,12 @@ namespace xt bool getMode(Responses& _responses); Mode* getMode(); + bool getWave(Responses& _responses, const SysEx& _data); + Wave* getWave(WaveId _id); + + bool getTable(Responses& _responses, const SysEx& _data); + Table* getTable(TableId _id); + bool getDump(DumpType _type, Responses& _responses, const SysEx& _data); bool parseDump(DumpType _type, const SysEx& _data); bool modifyDump(DumpType _type, const SysEx& _data);