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

VirusController.h (7012B)


      1 #pragma once
      2 
      3 #include "jucePluginLib/parameterdescriptions.h"
      4 #include "jucePluginLib/controller.h"
      5 
      6 #include "baseLib/event.h"
      7 
      8 #include "virusLib/frontpanelState.h"
      9 #include "virusLib/microcontrollerTypes.h"
     10 #include "virusLib/romfile.h"
     11 
     12 namespace virus
     13 {
     14 	class VirusProcessor;
     15 
     16     class Controller : public pluginLib::Controller
     17     {
     18     public:
     19 		baseLib::Event<virusLib::FrontpanelState> onFrontPanelStateChanged;
     20 
     21         struct Patch
     22         {
     23             std::string name;
     24 			std::vector<uint8_t> data;
     25             uint8_t progNumber = 0;
     26         };
     27 
     28         struct SinglePatch : Patch
     29         {
     30 	        virusLib::BankNumber bankNumber = static_cast<virusLib::BankNumber>(0);
     31         };
     32 
     33         struct MultiPatch : Patch {};
     34 
     35     	using Singles = std::vector<std::array<SinglePatch, 128>>;
     36 
     37     	static constexpr auto kNameLength = 10;
     38 
     39 		enum class MidiPacketType
     40 		{
     41 			RequestSingle,
     42 			RequestMulti,
     43 			RequestSingleBank,
     44 			RequestMultiBank,
     45 			RequestArrangement,
     46 			RequestGlobal,
     47 			RequestTotal,
     48 			RequestControllerDump,
     49 			ParameterChange,
     50 			SingleDump,
     51 			MultiDump,
     52             SingleDump_C,
     53 
     54 			Count
     55 		};
     56 
     57         enum class PresetSource
     58         {
     59             Unknown,
     60 	        Rom,
     61             Browser
     62         };
     63 
     64         struct CurrentPreset
     65         {
     66 	        uint8_t program = 0;
     67 	        virusLib::BankNumber bank = virusLib::BankNumber::EditBuffer;
     68             PresetSource source = PresetSource::Unknown;
     69         };
     70 
     71     	Controller(VirusProcessor&, virusLib::DeviceModel _defaultModel, unsigned char deviceId = 0x00);
     72 		~Controller() override;
     73 
     74         std::vector<uint8_t> createSingleDump(uint8_t _part, uint8_t _bank, uint8_t _program);
     75         std::vector<uint8_t> createSingleDump(MidiPacketType _packet, uint8_t _bank, uint8_t _program, const pluginLib::MidiPacket::AnyPartParamValues& _paramValues);
     76         std::vector<uint8_t> modifySingleDump(const std::vector<uint8_t>& _sysex, virusLib::BankNumber _newBank, uint8_t _newProgram) const;
     77 
     78     	void selectPrevPreset(uint8_t _part);
     79     	void selectNextPreset(uint8_t _part);
     80         std::string getBankName(uint32_t _index) const;
     81 
     82     	bool activatePatch(const std::vector<unsigned char>& _sysex);
     83     	bool activatePatch(const std::vector<unsigned char>& _sysex, uint32_t _part);
     84 
     85         static void printMessage(const pluginLib::SysEx &);
     86 
     87         juce::StringArray getSinglePresetNames(virusLib::BankNumber bank) const;
     88         std::string getSinglePresetName(const pluginLib::MidiPacket::ParamValues& _values) const;
     89         std::string getSinglePresetName(const pluginLib::MidiPacket::AnyPartParamValues& _values) const;
     90         std::string getMultiPresetName(const pluginLib::MidiPacket::ParamValues& _values) const;
     91         std::string getPresetName(const std::string& _paramNamePrefix, const pluginLib::MidiPacket::ParamValues& _values) const;
     92         std::string getPresetName(const std::string& _paramNamePrefix, const pluginLib::MidiPacket::AnyPartParamValues& _values) const;
     93 
     94     	const Singles& getSinglePresets() const
     95         {
     96 	        return m_singles;
     97         }
     98 
     99         const SinglePatch& getSingleEditBuffer() const
    100     	{
    101     		return m_singleEditBuffer;
    102     	}
    103 
    104         const SinglePatch& getSingleEditBuffer(const uint8_t _part) const
    105     	{
    106     		return m_singleEditBuffers[_part];
    107     	}
    108 
    109         const MultiPatch& getMultiEditBuffer() const
    110     	{
    111     		return m_multiEditBuffer;
    112     	}
    113 
    114 		void setSinglePresetName(uint8_t _part, const juce::String& _name) const;
    115         void setSinglePresetName(pluginLib::MidiPacket::AnyPartParamValues& _values, const std::string& _name) const;
    116 
    117     	bool isMultiMode() const;
    118 
    119     	// part 0 - 15 (ignored when single! 0x40...)
    120 		void setCurrentPartPreset(uint8_t _part, virusLib::BankNumber _bank, uint8_t _prg);
    121         void setCurrentPartPresetSource(uint8_t _part, PresetSource _source);
    122 
    123     	virusLib::BankNumber getCurrentPartBank(uint8_t _part) const;
    124 		uint8_t getCurrentPartProgram(uint8_t _part) const;
    125 		PresetSource getCurrentPartPresetSource(uint8_t _part) const;
    126 
    127 		juce::String getCurrentPartPresetName(uint8_t _part) const;
    128 		uint32_t getBankCount() const { return static_cast<uint32_t>(m_singles.size()); }
    129 		bool parseSysexMessage(const pluginLib::SysEx& _msg, synthLib::MidiEventSource _source) override;
    130 		bool parseControllerMessage(const synthLib::SMidiEvent&) override;
    131         void onStateLoaded() override;
    132 
    133 		uint8_t getPartCount() const override;
    134 
    135 		std::function<void(int)> onProgramChange = {};
    136 		std::function<void()> onMsgDone = {};
    137 		std::function<void(virusLib::BankNumber, uint32_t)> onRomPatchReceived = {};
    138 		std::function<void()> onMultiReceived = {};
    139 
    140 		bool requestProgram(uint8_t _bank, uint8_t _program, bool _multi) const;
    141 		bool requestSingle(uint8_t _bank, uint8_t _program) const;
    142 		bool requestMulti(uint8_t _bank, uint8_t _program) const;
    143 
    144     	bool requestSingleBank(uint8_t _bank) const;
    145 
    146     	bool requestTotal() const;
    147     	bool requestArrangement() const;
    148 		void requestRomBanks();
    149         
    150 		void sendParameterChange(const pluginLib::Parameter& _parameter, pluginLib::ParamValue _value) override;
    151 		bool sendParameterChange(uint8_t _page, uint8_t _part, uint8_t _index, uint8_t _value) const;
    152 
    153         using pluginLib::Controller::sendSysEx;
    154 
    155         bool sendSysEx(MidiPacketType _type) const;
    156         bool sendSysEx(MidiPacketType _type, std::map<pluginLib::MidiDataType, uint8_t>& _params) const;
    157 
    158 		uint8_t getDeviceId() const { return m_deviceId; }
    159 
    160         bool parseSingle(pluginLib::MidiPacket::Data& _data, pluginLib::MidiPacket::AnyPartParamValues& _parameterValues, const pluginLib::SysEx& _msg) const;
    161         bool parseSingle(pluginLib::MidiPacket::Data& _data, pluginLib::MidiPacket::AnyPartParamValues& _parameterValues, const pluginLib::SysEx& _msg, MidiPacketType& usedPacketType) const;
    162 
    163 		const auto& getFrontpanelState() const { return m_frontpanelState; }
    164 
    165     private:
    166         Singles m_singles;
    167         SinglePatch m_singleEditBuffer;                     // single mode
    168         std::array<SinglePatch, 16> m_singleEditBuffers;    // multi mode
    169 
    170         MultiPatch m_multiEditBuffer;
    171 
    172         void parseSingle(const pluginLib::SysEx& _msg, const pluginLib::MidiPacket::Data& _data, const pluginLib::MidiPacket::ParamValues& _parameterValues);
    173 
    174     	void parseMulti(const pluginLib::SysEx& _msg, const pluginLib::MidiPacket::Data& _data, const pluginLib::MidiPacket::ParamValues& _parameterValues);
    175 
    176         void parseParamChange(const pluginLib::MidiPacket::Data& _data);
    177         bool parseControllerDump(const synthLib::SMidiEvent&) const;
    178 
    179         VirusProcessor& m_processor;
    180         virusLib::DeviceModel m_defaultModel;
    181 
    182         unsigned char m_deviceId;
    183         virusLib::BankNumber m_currentBank[16]{};
    184         uint8_t m_currentProgram[16]{};
    185         PresetSource m_currentPresetSource[16]{PresetSource::Unknown};
    186 		baseLib::EventListener<const virusLib::ROMFile*> m_onRomChanged;
    187         virusLib::FrontpanelState m_frontpanelState;
    188     };
    189 }; // namespace Virus