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 f5965487d20ddcc41033768652bb235435bd6aa8
parent bbe8abf4bb5f7c1975e3fbc94de7a36e183dcf2c
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat, 12 Feb 2022 14:58:25 +0100

fix midi bank select (sent as Midi CC) being off-by-one in single mode
fix part bank select and part program change (as sysex) didn't work for single mode

Diffstat:
Msource/virusLib/microcontroller.cpp | 37+++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/source/virusLib/microcontroller.cpp b/source/virusLib/microcontroller.cpp @@ -208,28 +208,16 @@ bool Microcontroller::sendMIDI(const SMidiEvent& _ev, bool cancelIfFull/* = fals { case M_PROGRAMCHANGE: { - TPreset single; - if(singleMode) - { - if(getSingle(fromArrayIndex(m_currentBank), _ev.b, single)) - { - m_currentSingle = _ev.b; - return writeSingle(BankNumber::EditBuffer, SINGLE, single); - } - } - else - { - return partProgramChange(channel, _ev.b); - } + return partProgramChange(SINGLE, _ev.b); + return partProgramChange(channel, _ev.b); } - break; case M_CONTROLCHANGE: switch(_ev.b) { case MC_BANKSELECTLSB: if(singleMode) - m_currentBank = _ev.c % m_singles.size(); + partBankSelect(SINGLE, _ev.c, false); else partBankSelect(channel, _ev.c, false); return true; @@ -725,7 +713,14 @@ bool Microcontroller::writeMulti(BankNumber _bank, uint8_t _program, const TPres bool Microcontroller::partBankSelect(const uint8_t _part, const uint8_t _value, const bool _immediatelySelectSingle) { - m_multiEditBuffer[MD_PART_BANK_NUMBER + _part] = _value % m_singles.size(); + if(_part == SINGLE) + { + const auto bankIndex = static_cast<uint8_t>(toArrayIndex(fromMidiByte(_value)) % m_singles.size()); + m_currentBank = bankIndex; + return true; + } + + m_multiEditBuffer[MD_PART_BANK_NUMBER + _part] = _value; if(_immediatelySelectSingle) return partProgramChange(_part, m_multiEditBuffer[MD_PART_PROGRAM_NUMBER + _part]); @@ -737,6 +732,16 @@ bool Microcontroller::partProgramChange(const uint8_t _part, const uint8_t _valu { TPreset single; + if(_part == SINGLE) + { + if (getSingle(fromArrayIndex(m_currentBank), _value, single)) + { + m_currentSingle = _value; + return writeSingle(BankNumber::EditBuffer, SINGLE, single); + } + return false; + } + const auto bank = fromMidiByte(m_multiEditBuffer[MD_PART_BANK_NUMBER + _part]); if(getSingle(bank, _value, single))