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 1664f0afadf7924d60273f98c5b3c400278b2d49
parent 9a80373293be6f1f5b0f7128f434ec3ac6ee73c9
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Tue, 17 May 2022 00:08:51 +0200

add midi packet parsing

Diffstat:
Msource/jucePluginLib/midipacket.cpp | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msource/jucePluginLib/midipacket.h | 3+++
2 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/source/jucePluginLib/midipacket.cpp b/source/jucePluginLib/midipacket.cpp @@ -1,5 +1,9 @@ #include "midipacket.h" +#include <cassert> + +#include "parameterdescriptions.h" + #include "../dsp56300/source/dsp56kEmu/logging.h" namespace pluginLib @@ -35,4 +39,66 @@ namespace pluginLib } return true; } + + bool MidiPacket::parse(std::map<MidiDataType, uint8_t>& _data, std::map<uint32_t, uint8_t>& _parameterValues, const ParameterDescriptions& _parameters, const std::vector<uint8_t>& _src) const + { + if(_src.size() != size()) + return false; + + for(size_t i=0; i<_src.size(); ++i) + { + const auto& b = m_bytes[i]; + const auto s = _src[i]; + + switch (b.type) + { + case MidiDataType::Null: + continue; + case MidiDataType::Byte: + if(b.byte != s) + return false; + break; + case MidiDataType::Checksum: + { + uint8_t checksum = 0; + + for(uint32_t c = b.checksumFirstIndex; c <= b.checksumLastIndex; ++c) + checksum += _src[c]; + + checksum &= 0x7f; + + if(checksum != s) + { + LOG("Packet checksum error, calculated " << std::hex << checksum << " but data contains " << s); + return false; + } + } + continue; + case MidiDataType::DeviceId: + case MidiDataType::Bank: + case MidiDataType::Program: + case MidiDataType::ParameterIndex: + case MidiDataType::ParameterValue: + case MidiDataType::Page: + case MidiDataType::Part: + _data.insert(std::make_pair(b.type, s)); + break; + case MidiDataType::Parameter: + { + uint32_t idx; + if(!_parameters.getIndexByName(idx, b.name)) + { + LOG("Failed to find named parameter " << b.name << " while parsing midi packet, midi byte " << i); + return false; + } + _parameterValues.insert(std::make_pair(idx, s)); + } + break; + default: + assert(false && "unknown data type"); + return false; + } + } + return true; + } } diff --git a/source/jucePluginLib/midipacket.h b/source/jucePluginLib/midipacket.h @@ -7,6 +7,8 @@ namespace pluginLib { + class ParameterDescriptions; + enum class MidiDataType { Null, @@ -42,6 +44,7 @@ namespace pluginLib size_t size() const { return m_bytes.size(); } bool create(std::vector<uint8_t>& _dst, const std::map<MidiDataType, uint8_t>& _data) const; + bool parse(std::map<MidiDataType, uint8_t>& _data, std::map<uint32_t, uint8_t>& _parameterValues, const ParameterDescriptions& _parameters, const std::vector<uint8_t>& _src) const; private: std::vector<MidiByte> m_bytes;