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 5e4509612ffbb6bb0dd1da265b05f5e56fc31501
parent 796139f577f120e4d3edd848f63b8a81cab1b298
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon, 21 Oct 2024 02:24:13 +0200

store used user waves and tables in state

Diffstat:
Msource/xtLib/xtState.cpp | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msource/xtLib/xtState.h | 11+++++++++++
2 files changed, 108 insertions(+), 0 deletions(-)

diff --git a/source/xtLib/xtState.cpp b/source/xtLib/xtState.cpp @@ -1,6 +1,7 @@ #include "xtState.h" #include <cassert> +#include <set> #include "xtMidiTypes.h" #include "xt.h" @@ -41,6 +42,72 @@ namespace xt append(_state, m_mode, ~0u); append(_state, m_global, wLib::IdxCommand); + // add all waves and tables that are used by the singles + std::set<TableId> tableIds; + + auto addTableId = [&](TableId id) + { + if(wave::isReadOnly(id)) + return false; + + const auto idx = id.rawId(); + if(idx >= m_tables.size()) + return false; + + if(!isValid(m_tables[idx])) + return false; + tableIds.insert(id); + return true; + }; + + for (const auto& s : m_currentInstrumentSingles) + { + const auto table = getWavetableFromSingleDump({s.begin(), s.end()}); + addTableId(table); + } + for (const auto& s : m_currentMultiSingles) + { + const auto table = getWavetableFromSingleDump({s.begin(), s.end()}); + addTableId(table); + } + + std::set<WaveId> waveIds; + for (const TableId id : tableIds) + { + if(wave::isReadOnly(id)) + continue; + + const auto idx = id.rawId(); + if(idx >= m_tables.size()) + continue; + + const auto& t = m_tables[idx]; + if(!isValid(t)) + continue; + + TableData table; + parseTableData(table, {t.begin(), t.end()}); + + for (const auto& waveId : table) + { + if(wave::isReadOnly(waveId)) + continue; + const auto waveIdx = waveId.rawId(); + if(waveIdx >= m_waves.size()) + continue; + const auto& wave = m_waves[waveIdx]; + if(!isValid(wave)) + continue; + waveIds.insert(waveId); + } + } + + for (const auto& waveId : waveIds) + append(_state, m_waves[waveId.rawId()], wLib::IdxCommand); + + for (const auto& tableId : tableIds) + append(_state, m_tables[tableId.rawId()], wLib::IdxCommand); + const auto multiMode = isMultiMode(); // if we are in multimode, write multis last, otherwise, write singles last @@ -155,6 +222,8 @@ namespace xt case SysexCommand::MultiDump: return parseDump(DumpType::Multi, _data); case SysexCommand::GlobalDump: return parseDump(DumpType::Global, _data); case SysexCommand::ModeDump: return parseDump(DumpType::Mode, _data); + case SysexCommand::WaveDump: return parseDump(DumpType::Wave, _data); + case SysexCommand::WaveCtlDump: return parseDump(DumpType::Table, _data); case SysexCommand::SingleParameterChange: return modifyDump(DumpType::Single, _data); case SysexCommand::MultiParameterChange: return modifyDump(DumpType::Multi, _data); @@ -292,6 +361,32 @@ namespace xt return true; } + bool State::parseWaveDump(const SysEx& _data) + { + const auto idx = (static_cast<uint32_t>(_data[IdxWaveIndexH]) << 7u) | static_cast<uint32_t>(_data[IdxWaveIndexL]); + + if(idx >= m_waves.size()) + return false; + + if(!convertTo(m_waves[idx], _data)) + return false; + + return true; + } + + bool State::parseTableDump(const SysEx& _data) + { + const auto idx = (static_cast<uint32_t>(_data[IdxWaveIndexH]) << 7u) | static_cast<uint32_t>(_data[IdxWaveIndexL]); + + if(idx >= m_tables.size()) + return false; + + if(!convertTo(m_tables[idx], _data)) + return false; + + return true; + } + bool State::modifySingle(const SysEx& _data) { auto* p = getSingleParameter(_data); @@ -531,6 +626,8 @@ namespace xt case DumpType::Multi: res = parseMultiDump(_data); break; case DumpType::Global: res = parseGlobalDump(_data); break; case DumpType::Mode: res = parseModeDump(_data); break; + case DumpType::Wave: res = parseWaveDump(_data); break; + case DumpType::Table: res = parseTableDump(_data); break; default: return false; } diff --git a/source/xtLib/xtState.h b/source/xtLib/xtState.h @@ -131,6 +131,8 @@ namespace xt bool parseMultiDump(const SysEx& _data); bool parseGlobalDump(const SysEx& _data); bool parseModeDump(const SysEx& _data); + bool parseWaveDump(const SysEx& _data); + bool parseTableDump(const SysEx& _data); bool modifySingle(const SysEx& _data); bool modifyMulti(const SysEx& _data); @@ -173,6 +175,11 @@ namespace xt return _single.front() == 0xf0; } + static bool isValid(const Wave& _single) + { + return _single.front() == 0xf0; + } + static bool isValid(const Global& _global) { return _global.back() == 0xf7; @@ -205,6 +212,10 @@ namespace xt std::array<Single, 256> m_romSingles{Single{}}; std::array<Multi, 128> m_romMultis{Multi{}}; + // User Waves and Tables + std::array<Wave, xt::wave::g_firstRamWaveIndex + xt::wave::g_ramWaveCount> m_waves{Wave{}}; + std::array<Table, xt::wave::g_tableCount> m_tables{Table{}}; + // Edit Buffers std::array<Single, 8> m_currentMultiSingles{Single{}}; std::array<Single, 1> m_currentInstrumentSingles{Single{}};