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