hdi08TxParser.h (1395B)
1 #pragma once 2 3 #include "synthLib/midiTypes.h" 4 #include "dsp56kEmu/types.h" 5 6 #include <array> 7 #include <cstddef> 8 9 namespace virusLib 10 { 11 class Microcontroller; 12 13 class Hdi08TxParser 14 { 15 public: 16 enum class State 17 { 18 Default, 19 Sysex, 20 Preset, 21 StatusReport 22 }; 23 24 enum class PatternType 25 { 26 DspBoot, 27 28 Count 29 }; 30 31 Hdi08TxParser(Microcontroller& _mc) : m_mc(_mc) 32 { 33 m_patternPositions.fill(0); 34 } 35 36 bool append(dsp56k::TWord _data); 37 const std::vector<synthLib::SMidiEvent>& getMidiData() const { return m_midiData; } 38 void clearMidiData() { m_midiData.clear(); } 39 void waitForPreset(uint32_t _byteCount); 40 41 bool waitingForPreset() const 42 { 43 return m_remainingPresetBytes != 0; 44 } 45 46 bool hasDspBooted() const 47 { 48 return m_dspHasBooted; 49 } 50 51 void getPresetData(std::vector<uint8_t>& _data); 52 53 private: 54 Microcontroller& m_mc; 55 56 std::vector<synthLib::SMidiEvent> m_midiData; 57 std::vector<uint8_t> m_sysexData; 58 std::vector<uint8_t> m_presetData; 59 std::vector<dsp56k::TWord> m_dspStatus; 60 61 uint32_t m_sysexReceiveIndex = 0; 62 uint32_t m_remainingPresetBytes = 0; 63 uint32_t m_remainingStatusBytes = 0; 64 65 State m_state = State::Default; 66 67 std::vector<PatternType> m_matchedPatterns; 68 std::vector<dsp56k::TWord> m_nonPatternWords; 69 70 std::array<size_t, static_cast<size_t>(PatternType::Count)> m_patternPositions = {}; 71 72 bool m_dspHasBooted = false; 73 }; 74 }