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

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 }