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 3f9a82eef52728d0eb57d73f0eec062d9401054b
parent f3e265a621de7a1e0d0b9400c913cad7f66cbe93
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Thu, 28 Jul 2022 21:53:46 +0200

add support to store the 128 RAM multis in plugin state, fixes #110

Diffstat:
Msource/virusLib/microcontroller.cpp | 22+++++++++++++++-------
Msource/virusLib/microcontroller.h | 1+
2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/source/virusLib/microcontroller.cpp b/source/virusLib/microcontroller.cpp @@ -46,8 +46,11 @@ Microcontroller::Microcontroller(HDI08& _hdi08, ROMFile& _romFile) : m_hdi08(_hd m_globalSettings.fill(0); - m_rom.getMulti(0, m_multiEditBuffer); + for(size_t i=0; i<m_multis.size(); ++i) + m_rom.getMulti(0, m_multis[i]); + m_multiEditBuffer = m_multis.front(); + bool failed = false; // read all singles from ROM and copy first ROM banks to RAM banks @@ -643,11 +646,12 @@ bool Microcontroller::requestMulti(BankNumber _bank, uint8_t _program, TPreset& return true; } - if (_bank != BankNumber::A) + if (_bank != BankNumber::A || _program >= m_multis.size()) return false; // Load from flash - return m_rom.getMulti(_program, _data); + _data = m_multis[_program]; + return true; } bool Microcontroller::requestSingle(BankNumber _bank, uint8_t _program, TPreset& _data) const @@ -700,6 +704,12 @@ bool Microcontroller::writeSingle(BankNumber _bank, uint8_t _program, const TPre bool Microcontroller::writeMulti(BankNumber _bank, uint8_t _program, const TPreset& _data) { + if(_bank == BankNumber::A && _program < m_multis.size()) + { + m_multis[_program] = _data; + return true; + } + if (_bank != BankNumber::EditBuffer) { LOG("We do not support writing to RAM or ROM, attempt to write multi to bank " << static_cast<int>(toMidiByte(_bank)) << ", program " << static_cast<int>(_program)); @@ -760,12 +770,10 @@ bool Microcontroller::partProgramChange(const uint8_t _part, const uint8_t _valu bool Microcontroller::multiProgramChange(uint8_t _value) { - TPreset multi; - - if(!m_rom.getMulti(_value, multi)) + if(_value >= m_multis.size()) return true; - return loadMulti(_value, multi); + return loadMulti(_value, m_multis[_value]); } bool Microcontroller::loadMulti(uint8_t _program, const TPreset& _multi) diff --git a/source/virusLib/microcontroller.h b/source/virusLib/microcontroller.h @@ -70,6 +70,7 @@ private: dsp56k::HDI08& m_hdi08; ROMFile& m_rom; + std::array<TPreset,128> m_multis; TPreset m_multiEditBuffer; std::array<uint8_t, 256> m_globalSettings;