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 da22bed79f01de17806ebe02e7ac48a616b7ceb4
parent 1b587b45ef382dec2916849922abe407d2bc5582
Author: Tal Aviram <me@talaviram.com>
Date:   Wed, 28 Jul 2021 08:51:24 +0300

controller - add multis checksum check (commented out as it seems checksum is calculated differently).

Diffstat:
Msource/jucePlugin/VirusController.cpp | 27++++++++++++++++++++++-----
Msource/jucePlugin/VirusController.h | 2+-
2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/source/jucePlugin/VirusController.cpp b/source/jucePlugin/VirusController.cpp @@ -66,21 +66,38 @@ namespace Virus void Controller::parseMulti(const SysEx &msg) { - assert(msg.size() - kHeaderWithMsgCodeLen > 0); - constexpr auto startPos = kHeaderWithMsgCodeLen + 4; - auto progName = parseAsciiText(msg, startPos + 1); + constexpr auto expectedDataSize = 2 + 256; + constexpr auto checkSumSize = 1; + const auto dataSize = msg.size() - kHeaderWithMsgCodeLen - 1; + const auto hasChecksum = dataSize == expectedDataSize + checkSumSize; + assert(hasChecksum || dataSize == expectedDataSize); + + constexpr auto startPos = kHeaderWithMsgCodeLen; MultiPatch patch; patch.bankNumber = msg[startPos]; patch.progNumber = msg[startPos + 1]; - copyData(msg, startPos + 2, patch.data); + auto progName = parseAsciiText(msg, startPos + 2 + 3); + [[maybe_unused]] auto dataSum = copyData(msg, startPos + 2, patch.data); + if (hasChecksum) + { + const int expectedChecksum = msg[msg.size() - 2]; + const auto msgDeviceId = msg[5]; + const int checksum = (msgDeviceId + 0x11 + patch.bankNumber + patch.progNumber + dataSum) & 0x7f; +// assert(checksum == expectedChecksum); + } m_multis[patch.progNumber] = patch; } - void Controller::copyData(const SysEx &src, int startPos, uint8_t *dst) + uint8_t Controller::copyData(const SysEx &src, int startPos, uint8_t *dst) { + uint8_t sum = 0; for (auto i = 0; i < kDataSizeInBytes; i++) + { dst[i] = src[startPos + i]; + sum += dst[i]; + } + return sum; } void Controller::parseData(const SysEx &msg, const size_t startPos) diff --git a/source/jucePlugin/VirusController.h b/source/jucePlugin/VirusController.h @@ -32,7 +32,7 @@ namespace Virus MultiPatch m_multis[128]; // RAM has 128 Multi 'snapshots' // unchecked copy for patch data bytes - static inline void copyData(const SysEx &src, int startPos, uint8_t *dst); + static inline uint8_t copyData(const SysEx &src, int startPos, uint8_t *dst); juce::String parseAsciiText(const SysEx &, int startPos); void parseMessage(const SysEx &);