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

device.h (3195B)


      1 #pragma once
      2 
      3 #include "dspSingle.h"
      4 #include "frontpanelState.h"
      5 #include "synthLib/midiTypes.h"
      6 #include "synthLib/device.h"
      7 
      8 #include "romfile.h"
      9 #include "microcontroller.h"
     10 
     11 namespace synthLib
     12 {
     13 	struct DspMemoryPatch;
     14 	struct DspMemoryPatches;
     15 }
     16 
     17 namespace virusLib
     18 {
     19 	class Device final : public synthLib::Device
     20 	{
     21 	public:
     22 		Device(const synthLib::DeviceCreateParams& _params, bool _createDebugger = false);
     23 		~Device() override;
     24 
     25 		void getSupportedSamplerates(std::vector<float>& _dst) const override;
     26 		void getPreferredSamplerates(std::vector<float>& _dst) const override;
     27 		float getSamplerate() const override;
     28 		bool setSamplerate(float _samplerate) override;
     29 
     30 		bool isValid() const override;
     31 
     32 		void process(const synthLib::TAudioInputs& _inputs, const synthLib::TAudioOutputs& _outputs, size_t _size, const std::vector<synthLib::SMidiEvent>& _midiIn, std::vector<synthLib::SMidiEvent>& _midiOut) override;
     33 
     34 #if !SYNTHLIB_DEMO_MODE
     35 		bool getState(std::vector<uint8_t>& _state, synthLib::StateType _type) override;
     36 		bool setState(const std::vector<uint8_t>& _state, synthLib::StateType _type) override;
     37 		bool setStateFromUnknownCustomData(const std::vector<uint8_t>& _state) override;
     38 #endif
     39 		static bool find4CC(uint32_t& _offset, const std::vector<uint8_t>& _data, const std::string_view& _4cc);
     40 		static bool parseTIcontrolPreset(std::vector<synthLib::SMidiEvent>& _events, const std::vector<uint8_t>& _state);
     41 		static bool parsePowercorePreset(std::vector<std::vector<uint8_t>>& _sysexPresets, const std::vector<uint8_t>& _data);
     42 		static bool parseVTIBackup(std::vector<std::vector<uint8_t>>& _sysexPresets, const std::vector<uint8_t>& _data);
     43 
     44 		uint32_t getInternalLatencyMidiToOutput() const override;
     45 		uint32_t getInternalLatencyInputToOutput() const override;
     46 
     47 		uint32_t getChannelCountIn() override;
     48 		uint32_t getChannelCountOut() override;
     49 
     50 		static void createDspInstances(DspSingle*& _dspA, DspSingle*& _dspB, const ROMFile& _rom, float _samplerate);
     51 		static std::thread bootDSP(DspSingle& _dsp, const ROMFile& _rom, bool _createDebugger);
     52 		static void bootDSPs(DspSingle* _dspA, DspSingle* _dspB, const ROMFile& _rom, bool _createDebugger);
     53 		
     54 		bool setDspClockPercent(uint32_t _percent) override;
     55 		uint32_t getDspClockPercent() const override;
     56 		uint64_t getDspClockHz() const override;
     57 
     58 		static void applyDspMemoryPatches(const DspSingle* _dspA, const DspSingle* _dspB, const ROMFile& _rom);
     59 		void applyDspMemoryPatches() const;
     60 
     61 	private:
     62 		bool sendMidi(const synthLib::SMidiEvent& _ev, std::vector<synthLib::SMidiEvent>& _response) override;
     63 		void readMidiOut(std::vector<synthLib::SMidiEvent>& _midiOut) override;
     64 		void processAudio(const synthLib::TAudioInputs& _inputs, const synthLib::TAudioOutputs& _outputs, size_t _samples) override;
     65 		void onAudioWritten();
     66 		static void configureDSP(DspSingle& _dsp, const ROMFile& _rom, float _samplerate);
     67 
     68 		const ROMFile m_rom;
     69 
     70 		std::unique_ptr<DspSingle> m_dsp;
     71 		DspSingle* m_dsp2 = nullptr;
     72 		std::unique_ptr<Microcontroller> m_mc;
     73 
     74 		uint32_t m_numSamplesProcessed = 0;
     75 		float m_samplerate;
     76 		FrontpanelState m_frontpanelStateDSP;
     77 		synthLib::SMidiEvent m_frontpanelStateMidiEvent;
     78 	};
     79 }