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

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 }