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