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 9df89f0e66cc93cd160779c14e3e85bfeacb54a9
parent 14c10741190d896bcfe6ff424f3dabb7bf373372
Author: Tal Aviram <me@talaviram.com>
Date:   Wed, 28 Jul 2021 23:00:20 +0300

controller - add single patch parsing.

Diffstat:
Msource/jucePlugin/VirusController.cpp | 34+++++++++++++++++++++-------------
Msource/jucePlugin/VirusController.h | 8++++++++
2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/source/jucePlugin/VirusController.cpp b/source/jucePlugin/VirusController.cpp @@ -56,23 +56,31 @@ namespace Virus void Controller::parseSingle(const SysEx &msg) { - auto pos = kHeaderWithMsgCodeLen; - const auto bankNum = msg[pos]; - pos++; - const auto progNum = msg[pos]; - pos++; - constexpr auto pageSize = 128; - constexpr auto expectedDataSize = pageSize * 2; // we have 2 pages + constexpr auto expectedDataSize = pageSize * 2 + 1 + 1; // we have 2 pages constexpr auto checkSumSize = 1; - - const auto dataSize = msg.size() - pos - 1; + const auto dataSize = msg.size() - (kHeaderWithMsgCodeLen + 1); // 1 end byte, 1 bank, 1 prg const auto hasChecksum = dataSize == expectedDataSize + checkSumSize; assert(hasChecksum || dataSize == expectedDataSize); - const auto namePos = 128 + 112; - assert(pos + namePos < msg.size()); - auto progName = parseAsciiText(msg, pos + namePos); + SinglePatch patch; + patch.bankNumber = msg[kHeaderWithMsgCodeLen]; + patch.progNumber = msg[kHeaderWithMsgCodeLen + 1]; + [[maybe_unused]] const auto dataSum = copyData(msg, kHeaderWithMsgCodeLen + 2, patch.data); + + if (hasChecksum) + { + const auto checksum = msg[msg.size() - 2]; + const auto deviceId = msg[5]; + [[maybe_unused]] const auto expectedSum = + (deviceId + 0x10 + patch.bankNumber + patch.progNumber + dataSum) & 0x7f; + assert(expectedSum == checksum); + } + m_singles[patch.bankNumber - 1][patch.progNumber] = patch; + + const auto namePos = kHeaderWithMsgCodeLen + 2 + 128 + 112; + assert(namePos < msg.size()); + auto progName = parseAsciiText(msg, namePos); DBG(progName); } @@ -96,7 +104,7 @@ namespace Virus 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); + assert(checksum == expectedChecksum); } m_multis[patch.progNumber] = patch; } diff --git a/source/jucePlugin/VirusController.h b/source/jucePlugin/VirusController.h @@ -29,7 +29,15 @@ namespace Virus uint8_t data[kDataSizeInBytes]; }; + struct SinglePatch + { + uint8_t bankNumber; + uint8_t progNumber; + uint8_t data[kDataSizeInBytes]; + }; + MultiPatch m_multis[128]; // RAM has 128 Multi 'snapshots' + SinglePatch m_singles[2][128]; // unchecked copy for patch data bytes static inline uint8_t copyData(const SysEx &src, int startPos, uint8_t *dst);