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 0efcf5160d69fcf756a71ecb93277214046cda15
parent 04582f54e9fa7466c3bb63fb594a2edcd52c5c37
Author: dsp56300 <87139854+dsp56300@users.noreply.github.com>
Date:   Sat, 17 Jul 2021 16:45:01 +0200

Merge pull request #5 from 790/sysexfix

Fix some sysex issues.
Diffstat:
Msource/virusLib/microcontroller.cpp | 20++++++++++++--------
Msource/virusLib/microcontroller.h | 2++
2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/source/virusLib/microcontroller.cpp b/source/virusLib/microcontroller.cpp @@ -178,12 +178,12 @@ bool Microcontroller::sendMIDI(uint8_t a, uint8_t b, uint8_t c, bool cancelIfFul partBankSelect(channel, c, false); return true; default: - applyToSingleEditBuffer(PAGE_A, singleMode ? channel : 0, b, c); + applyToSingleEditBuffer(PAGE_A, singleMode ? SINGLE : channel, b, c); break; } break; case M_POLYPRESSURE: - applyToSingleEditBuffer(PAGE_B, singleMode ? channel : 0, b, c); + applyToSingleEditBuffer(PAGE_B, singleMode ? SINGLE : channel, b, c); break; default: break; @@ -206,9 +206,9 @@ bool Microcontroller::sendSysex(const std::vector<uint8_t>& _data, bool _cancelI const auto deviceId = _data[5]; const auto cmd = _data[6]; - if (deviceId != m_globalSettings[DEVICE_ID]) + if (deviceId != m_globalSettings[DEVICE_ID] && deviceId != OMNI_DEVICE_ID && m_globalSettings[DEVICE_ID] != OMNI_DEVICE_ID) { - // ignore messages intended for a different device + // ignore messages intended for a different device, allow omni requests return true; } @@ -459,7 +459,11 @@ bool Microcontroller::sendSysex(const std::vector<uint8_t>& _data, bool _cancelI } else { - applyToSingleEditBuffer(page, part, param, value); + if (m_globalSettings[PLAY_MODE] != PlayModeSingle || part == SINGLE) + { + // virus only applies sysex changes to other parts while in multi mode. + applyToSingleEditBuffer(page, part, param, value); + } } return send(page, part, param, value, _cancelIfFull); @@ -636,8 +640,8 @@ bool Microcontroller::loadMulti(uint8_t _program, const TPreset& _multi) if(!writeMulti(0, _program, _multi)) return false; - for(uint8_t p=0; p<16; ++p) - loadMultiSingle(p, _multi); + for (uint8_t p = 0; p < 16; ++p) + loadMultiSingle(p, _multi); return true; } @@ -730,7 +734,7 @@ bool Microcontroller::setState(const std::vector<unsigned char>& _state, const S void Microcontroller::applyToSingleEditBuffer(const Page _page, const uint8_t _part, const uint8_t _param, const uint8_t _value) { - if(m_globalSettings[PLAY_MODE] == PlayModeSingle) + if(_part == SINGLE) applyToSingleEditBuffer(m_singleEditBuffer, _page, _param, _value); else applyToSingleEditBuffer(m_singleEditBuffers[_part], _page, _param, _value); diff --git a/source/virusLib/microcontroller.h b/source/virusLib/microcontroller.h @@ -174,6 +174,8 @@ public: PlayModeMulti, }; + const uint8_t OMNI_DEVICE_ID = 0x10; + using TPreset = ROMFile::TPreset; explicit Microcontroller(dsp56k::HDI08& hdi08, ROMFile& romFile);