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