mqPatchManager.cpp (3531B)
1 #include "mqPatchManager.h" 2 3 #include "mqController.h" 4 #include "mqEditor.h" 5 #include "jucePluginEditorLib/pluginProcessor.h" 6 #include "jucePluginLib/filetype.h" 7 #include "mqLib/mqstate.h" 8 9 namespace mqJucePlugin 10 { 11 static constexpr std::initializer_list<jucePluginEditorLib::patchManager::GroupType> g_groupTypes = 12 { 13 jucePluginEditorLib::patchManager::GroupType::Favourites, 14 jucePluginEditorLib::patchManager::GroupType::LocalStorage, 15 jucePluginEditorLib::patchManager::GroupType::DataSources, 16 }; 17 18 PatchManager::PatchManager(Editor& _editor, juce::Component* _root) 19 : jucePluginEditorLib::patchManager::PatchManager(_editor, _root, g_groupTypes) 20 , m_editor(_editor) 21 , m_controller(_editor.getMqController()) 22 { 23 startLoaderThread(); 24 } 25 26 PatchManager::~PatchManager() 27 { 28 stopLoaderThread(); 29 } 30 31 bool PatchManager::requestPatchForPart(pluginLib::patchDB::Data& _data, uint32_t _part, uint64_t) 32 { 33 _data = m_controller.createSingleDump(mqLib::MidiBufferNum::SingleBankA, static_cast<mqLib::MidiSoundLocation>(0), _part, _part); 34 return !_data.empty(); 35 } 36 37 bool PatchManager::loadRomData(pluginLib::patchDB::DataList& _results, uint32_t _bank, uint32_t _program) 38 { 39 return false; 40 } 41 42 pluginLib::patchDB::PatchPtr PatchManager::initializePatch(pluginLib::patchDB::Data&& _sysex, const std::string& _defaultPatchName) 43 { 44 pluginLib::MidiPacket::Data data; 45 pluginLib::MidiPacket::AnyPartParamValues parameters; 46 if(!m_controller.parseSingle(data, parameters, _sysex)) 47 return {}; 48 49 auto p = std::make_shared<pluginLib::patchDB::Patch>(); 50 51 p->sysex = std::move(_sysex); 52 p->name = m_controller.getSingleName(parameters); 53 54 auto category = m_controller.getCategory(parameters); 55 56 while(!category.empty() && isspace(category.back())) 57 category.pop_back(); 58 while(!category.empty() && isspace(category.front())) 59 category.erase(0); 60 61 if(!category.empty()) 62 p->tags.add(pluginLib::patchDB::TagType::Category, category); 63 64 return p; 65 } 66 67 pluginLib::patchDB::Data PatchManager::applyModifications(const pluginLib::patchDB::PatchPtr& _patch, const pluginLib::FileType& _fileType, pluginLib::ExportType _exportType) const 68 { 69 auto result = _patch->sysex; 70 71 if (_patch->sysex.size() != std::tuple_size_v<mqLib::State::Single> && 72 _patch->sysex.size() != std::tuple_size_v<mqLib::State::SingleQ>) 73 return result; 74 75 if (!_patch->getName().empty()) 76 mqLib::State::setSingleName(result, _patch->getName()); 77 78 // first set tag is category 79 const auto& tags = _patch->getTags(pluginLib::patchDB::TagType::Category).getAdded(); 80 81 std::string category; 82 83 if(!tags.empty()) 84 category = *tags.begin(); 85 86 if (!category.empty()) 87 mqLib::State::setCategory(result, category); 88 89 // apply program 90 uint32_t program = 0; 91 uint32_t bank = 0; 92 if(_patch->program != pluginLib::patchDB::g_invalidProgram) 93 { 94 program = std::clamp(_patch->program, 0u, 299u); 95 96 bank = program / 100; 97 program -= bank * 100; 98 } 99 100 result[mqLib::IdxSingleBank] = static_cast<uint8_t>(bank); 101 result[mqLib::IdxSingleProgram] = static_cast<uint8_t>(program); 102 103 mqLib::State::updateChecksum(result); 104 105 return result; 106 } 107 108 uint32_t PatchManager::getCurrentPart() const 109 { 110 return m_editor.getProcessor().getController().getCurrentPart(); 111 } 112 113 bool PatchManager::activatePatch(const pluginLib::patchDB::PatchPtr& _patch, uint32_t _part) 114 { 115 m_controller.sendSingle(applyModifications(_patch, pluginLib::FileType::Empty, pluginLib::ExportType::EmuHardware), static_cast<uint8_t>(_part)); 116 return true; 117 } 118 }