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

demoplayback.h (1437B)


      1 #pragma once
      2 
      3 #include <cstdint>
      4 #include <string>
      5 #include <vector>
      6 
      7 namespace virusLib
      8 {
      9 	class Microcontroller;
     10 
     11 	class DemoPlayback
     12 	{
     13 	public:
     14 		DemoPlayback(Microcontroller& _mc) : m_mc(_mc) {}
     15 		virtual ~DemoPlayback() = default;
     16 
     17 		virtual bool loadFile(const std::string& _filename);
     18 		virtual bool loadBinData(const std::vector<uint8_t>& _data);
     19 
     20 		virtual void process(uint32_t _samples);
     21 
     22 	protected:
     23 		void writeRawData(const std::vector<uint8_t>& _data) const;
     24 		void setTimeScale(const float _timeScale) { m_timeScale = _timeScale; }
     25 		void stop();
     26 
     27 	private:
     28 		enum class EventType
     29 		{
     30 			MidiSysex,
     31 			Midi,
     32 			RawSerial
     33 		};
     34 
     35 		struct Event
     36 		{
     37 			EventType type = EventType::MidiSysex;
     38 			std::vector<uint8_t> data;
     39 			uint8_t delay = 0;
     40 		};
     41 
     42 		Event parseSysex(const uint8_t* _data, uint32_t _count) const;
     43 		Event parseMidi(const uint8_t* _data);
     44 
     45 		bool parseData(const std::vector<uint8_t>& _data);
     46 
     47 		bool processEvent(const Event& _event) const;
     48 
     49 		virtual size_t getEventCount() const						{ return m_events.size(); }
     50 		virtual uint32_t getEventDelay(const size_t _index) const	{ return m_events[_index].delay; }
     51 		virtual bool processEvent(const size_t _index)				{ return processEvent(m_events[_index]); }
     52 
     53 	protected:
     54 		Microcontroller& m_mc;
     55 
     56 	private:
     57 		std::vector<Event> m_events;
     58 		int32_t m_remainingDelay = 0;
     59 		uint32_t m_currentEvent = 0;
     60 
     61 		float m_timeScale = 54.0f;
     62 		bool m_stop = false;
     63 	};
     64 }