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