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

hdi08MidiQueue.h (1044B)


      1 #pragma once
      2 
      3 #include "dsp56kEmu/ringbuffer.h"
      4 
      5 #include "synthLib/midiTypes.h"
      6 
      7 namespace dsp56k
      8 {
      9 	class Audio;
     10 }
     11 
     12 namespace synthLib
     13 {
     14 	struct SMidiEvent;
     15 }
     16 
     17 namespace virusLib
     18 {
     19 	class Hdi08Queue;
     20 	class DspSingle;
     21 
     22 	class Hdi08MidiQueue
     23 	{
     24 	public:
     25 		explicit Hdi08MidiQueue(DspSingle& _dsp, Hdi08Queue& _output, bool _useEsaiBasedTiming, bool _isTI);
     26 		explicit Hdi08MidiQueue(Hdi08MidiQueue&& _s) noexcept : m_output(_s.m_output), m_esai(_s.m_esai), m_useEsaiBasedTiming(_s.m_useEsaiBasedTiming), m_isTI(_s.m_isTI)
     27 		{
     28 			assert(_s.m_pendingMidiEvents.empty());
     29 			_s.m_useEsaiBasedTiming = false;
     30 		}
     31 		~Hdi08MidiQueue();
     32 
     33 		void sendPendingMidiEvents(uint32_t _maxOffset);
     34 
     35 		void add(const synthLib::SMidiEvent& ev);
     36 
     37 		void onAudioWritten();
     38 
     39 	private:
     40 		void sendMidiToDSP(uint8_t _a, uint8_t _b, uint8_t _c) const;
     41 
     42 		Hdi08Queue& m_output;
     43 		dsp56k::Audio& m_esai;
     44 		bool m_useEsaiBasedTiming;
     45 		bool m_isTI;
     46 
     47 		dsp56k::RingBuffer<synthLib::SMidiEvent, 1024, false> m_pendingMidiEvents;
     48 
     49 		uint32_t m_numSamplesWritten = 0;
     50 	};
     51 }