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 b8ca98fab871ff1caa91c11a3a0b7a438bab892c
parent 4731c7585589dce6b8ecad490b62ddfc08df838a
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat, 14 May 2022 20:15:01 +0200

midi packet implementation WIP

Diffstat:
Msource/jucePluginLib/midipacket.cpp | 33+++++++++++++++++++++++++++++++++
Msource/jucePluginLib/midipacket.h | 12+++++++++++-
Msource/jucePluginLib/parameterdescriptions.cpp | 11+++++------
3 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/source/jucePluginLib/midipacket.cpp b/source/jucePluginLib/midipacket.cpp @@ -1,5 +1,38 @@ #include "midipacket.h" +#include "../dsp56300/source/dsp56kEmu/logging.h" + namespace pluginLib { + bool MidiPacket::create(std::vector<uint8_t>& _dst, std::map<MidiDataType, uint8_t>& _data) const + { + _dst.reserve(size()); + + for(size_t i=0; i<size(); ++i) + { + const auto& b = m_bytes[i]; + switch (b.type) + { + case MidiDataType::Null: + _dst.push_back(0); + break; + case MidiDataType::Byte: + _dst.push_back(b.byte); + break; + default: + { + const auto it = _data.find(b.type); + + if(it == _data.end()) + { + LOG("Failed to find data of type " << static_cast<int>(b.type) << " to fill byte " << i << " of midi packet"); + return false; + } + + _dst.push_back(it->second); + } + } + } + return true; + } } diff --git a/source/jucePluginLib/midipacket.h b/source/jucePluginLib/midipacket.h @@ -1,6 +1,7 @@ #pragma once #include <cstdint> +#include <map> #include <string> #include <vector> @@ -34,6 +35,15 @@ namespace pluginLib uint32_t checksumInitValue = 0; }; - std::vector<MidiByte> bytes; + MidiPacket() = default; + explicit MidiPacket(std::vector<MidiByte>&& bytes) : m_bytes(std::move(bytes)) {} + + const std::vector<MidiByte>& bytes() { return m_bytes; } + size_t size() const { return m_bytes.size(); } + + bool create(std::vector<uint8_t>& _dst, std::map<MidiDataType, uint8_t>& _data) const; + + private: + std::vector<MidiByte> m_bytes; }; } diff --git a/source/jucePluginLib/parameterdescriptions.cpp b/source/jucePluginLib/parameterdescriptions.cpp @@ -406,19 +406,18 @@ namespace pluginLib bytes.push_back(byte); } - MidiPacket packet; - packet.bytes = bytes; + MidiPacket packet(std::move(bytes)); // post-read validation - for(size_t i=0; i<packet.bytes.size(); ++i) + for(size_t i=0; i<packet.bytes().size(); ++i) { - const auto& p = packet.bytes[i]; + const auto& p = packet.bytes()[i]; if(p.type == MidiDataType::Checksum) { - if(p.checksumFirstIndex >= (packet.bytes.size()-1) || p.checksumLastIndex >= (packet.bytes.size()-1)) + if(p.checksumFirstIndex >= (packet.size()-1) || p.checksumLastIndex >= (packet.size()-1)) { - _errors << "specified checksum range " << p.checksumFirstIndex << "-" << p.checksumLastIndex << " is out of range 0-" << packet.bytes.size() << i << std::endl; + _errors << "specified checksum range " << p.checksumFirstIndex << "-" << p.checksumLastIndex << " is out of range 0-" << packet.size() << i << std::endl; return; } }