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

commit d73785450b16db7375d4019c5a94441c9ef38071
parent 4e065dac6491124c52abdb513344ff0314d07fb5
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Fri, 19 Apr 2024 00:56:58 +0200

support mail volume change / more multi preparations

Diffstat:
Msource/xtJucePlugin/parameterDescriptions_xt.json | 3+--
Msource/xtJucePlugin/xtController.cpp | 116++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msource/xtLib/xtMidiTypes.h | 2+-
Msource/xtLib/xtState.cpp | 5++++-
Msource/xtLib/xtState.h | 13+++----------
5 files changed, 77 insertions(+), 62 deletions(-)

diff --git a/source/xtJucePlugin/parameterDescriptions_xt.json b/source/xtJucePlugin/parameterDescriptions_xt.json @@ -292,7 +292,7 @@ // MULTI // GLOBAL - {"page":200, "index":0, "class":"Global", "name":"MainVolume"}, + {"page":200, "index":12, "class":"Global", "name":"MainVolume"}, // SOFT KNOBS {"page":300, "index":0, "name":"PlayParamValueA", "min":0, "max":127, "isPublic":true, "softknobTargetSelect":"PlayParamA", "softknobTargetList":"playParamTargets"}, @@ -766,7 +766,6 @@ {"type": "byte", "value": "0e"}, {"type": "deviceid"}, {"type": "byte", "value": "24"}, - {"type": "page"}, {"type": "paramindex"}, {"type": "paramvalue"}, {"type": "byte", "value": "f7"} diff --git a/source/xtJucePlugin/xtController.cpp b/source/xtJucePlugin/xtController.cpp @@ -13,36 +13,41 @@ #include "xtFrontPanel.h" -constexpr const char* g_midiPacketNames[] = -{ - "requestsingle", - "requestmulti", - "requestsinglebank", - "requestmultibank", - "requestglobal", - "requestmode", - "requestallsingles", - "singleparameterchange", - "multiparameterchange", - "globalparameterchange", - "singledump", - "multidump", - "globaldump", - "modedump", - "emuRequestLcd", - "emuRequestLeds", - "emuSendButton", - "emuSendRotary" -}; - -static_assert(std::size(g_midiPacketNames) == static_cast<size_t>(Controller::MidiPacketType::Count)); - namespace { + constexpr const char* g_midiPacketNames[] = + { + "requestsingle", + "requestmulti", + "requestsinglebank", + "requestmultibank", + "requestglobal", + "requestmode", + "requestallsingles", + "singleparameterchange", + "multiparameterchange", + "globalparameterchange", + "singledump", + "multidump", + "globaldump", + "modedump", + "emuRequestLcd", + "emuRequestLeds", + "emuSendButton", + "emuSendRotary" + }; + + static_assert(std::size(g_midiPacketNames) == static_cast<size_t>(Controller::MidiPacketType::Count)); + const char* midiPacketName(Controller::MidiPacketType _type) { return g_midiPacketNames[static_cast<uint32_t>(_type)]; } + + constexpr uint8_t g_pageMulti = 100; + constexpr uint8_t g_pageGlobal = 200; + constexpr uint8_t g_pageSoftKnobs = 300; + constexpr uint8_t g_pageControllers = 400; } Controller::Controller(AudioPluginAudioProcessor& p, unsigned char _deviceId) : pluginLib::Controller(p, loadParameterDescriptions()), m_deviceId(_deviceId) @@ -468,40 +473,55 @@ void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, con std::map<pluginLib::MidiDataType, uint8_t> data; - if (desc.page >= 100) + switch (desc.page) { -// assert(false && "unable to send multi parameter change"); - /* - uint8_t v; + case g_pageGlobal: + { + data.insert(std::make_pair(pluginLib::MidiDataType::ParameterIndex, _parameter.getDescription().index & 0x7f)); + data.insert(std::make_pair(pluginLib::MidiDataType::ParameterValue, _value)); - if (!combineParameterChange(v, g_midiPacketNames[MultiDump], _parameter, _value)) - return; + sendSysEx(GlobalParameterChange, data); + } + return; + case g_pageMulti: + { + uint8_t v; - uint32_t idx = desc.index; + if (!combineParameterChange(v, g_midiPacketNames[MultiDump], _parameter, _value)) + return; - if(desc.page > 100) - idx += (static_cast<uint32_t>(xt::MultiParameter::Inst1) - static_cast<uint32_t>(xt::MultiParameter::Inst0)) * (desc.page - 101); + uint32_t idx = desc.index; - data.insert(std::make_pair(pluginLib::MidiDataType::Part, _parameter.getPart())); - data.insert(std::make_pair(pluginLib::MidiDataType::Page, idx >> 7)); - data.insert(std::make_pair(pluginLib::MidiDataType::ParameterIndex, idx & 0x7f)); - data.insert(std::make_pair(pluginLib::MidiDataType::ParameterValue, v)); + if(desc.page > 100) + idx += (static_cast<uint32_t>(xt::MultiParameter::Inst1First) - static_cast<uint32_t>(xt::MultiParameter::Inst0First)) * (desc.page - 101); - sendSysEx(MultiParameterChange, data); - */ - return; - } + data.insert(std::make_pair(pluginLib::MidiDataType::Part, _parameter.getPart())); + data.insert(std::make_pair(pluginLib::MidiDataType::Page, idx >> 7)); + data.insert(std::make_pair(pluginLib::MidiDataType::ParameterIndex, idx & 0x7f)); + data.insert(std::make_pair(pluginLib::MidiDataType::ParameterValue, v)); - uint8_t v; - if (!combineParameterChange(v, g_midiPacketNames[SingleDump], _parameter, _value)) + sendSysEx(MultiParameterChange, data); + } return; + case g_pageSoftKnobs: + break; + case g_pageControllers: + break; + default: + { + uint8_t v; + if (!combineParameterChange(v, g_midiPacketNames[SingleDump], _parameter, _value)) + return; - data.insert(std::make_pair(pluginLib::MidiDataType::Part, _parameter.getPart())); - data.insert(std::make_pair(pluginLib::MidiDataType::Page, desc.page)); - data.insert(std::make_pair(pluginLib::MidiDataType::ParameterIndex, desc.index)); - data.insert(std::make_pair(pluginLib::MidiDataType::ParameterValue, v)); + data.insert(std::make_pair(pluginLib::MidiDataType::Part, _parameter.getPart())); + data.insert(std::make_pair(pluginLib::MidiDataType::Page, desc.page)); + data.insert(std::make_pair(pluginLib::MidiDataType::ParameterIndex, desc.index)); + data.insert(std::make_pair(pluginLib::MidiDataType::ParameterValue, v)); - sendSysEx(SingleParameterChange, data); + sendSysEx(SingleParameterChange, data); + } + break; + } } bool Controller::sendGlobalParameterChange(xt::GlobalParameter _param, uint8_t _value) diff --git a/source/xtLib/xtMidiTypes.h b/source/xtLib/xtMidiTypes.h @@ -64,7 +64,7 @@ namespace xt IdxMultiParamValue = IdxMultiParamIndexL + 1, IdxGlobalParamIndexH = wLib::IdxBuffer, - IdxGlobalParamIndexL = IdxGlobalParamIndexH + 1, + IdxGlobalParamIndexL = IdxGlobalParamIndexH, IdxGlobalParamValue = IdxGlobalParamIndexL + 1, IdxModeParamIndexH = wLib::IdxBuffer, diff --git a/source/xtLib/xtState.cpp b/source/xtLib/xtState.cpp @@ -364,7 +364,10 @@ namespace xt if(dump.idxParamIndexH >= _data.size() || dump.idxParamIndexL >= _data.size()) return nullptr; - const auto i = dump.firstParamIndex + ((static_cast<uint32_t>(_data[dump.idxParamIndexH]) << 7) | static_cast<uint32_t>(_data[dump.idxParamIndexL])); + auto i = dump.firstParamIndex; + if (dump.idxParamIndexH != dump.idxParamIndexL) + i += static_cast<uint32_t>(_data[dump.idxParamIndexH]) << 7; + i += static_cast<uint32_t>(_data[dump.idxParamIndexL]); if(i > _dump.size()) return nullptr; diff --git a/source/xtLib/xtState.h b/source/xtLib/xtState.h @@ -59,7 +59,7 @@ namespace xt static constexpr Dump Dumps[] = { {DumpType::Single, SysexCommand::SingleRequest, SysexCommand::SingleDump, SysexCommand::SingleParameterChange, IdxSingleParamFirst, IdxSingleParamIndexH, IdxSingleParamIndexL, IdxSingleParamValue, 265}, - {DumpType::Multi , SysexCommand::MultiRequest , SysexCommand::MultiDump , SysexCommand::MultiParameterChange , IdxMultiParamFirst , IdxMultiParamIndexH , IdxMultiParamIndexL , IdxMultiParamValue , 393}, + {DumpType::Multi , SysexCommand::MultiRequest , SysexCommand::MultiDump , SysexCommand::MultiParameterChange , IdxMultiParamFirst , IdxMultiParamIndexH , IdxMultiParamIndexL , IdxMultiParamValue , 265}, {DumpType::Global, SysexCommand::GlobalRequest, SysexCommand::GlobalDump, SysexCommand::GlobalParameterChange, IdxGlobalParamFirst, IdxGlobalParamIndexH, IdxGlobalParamIndexL, IdxGlobalParamValue, 39}, {DumpType::Mode , SysexCommand::ModeRequest , SysexCommand::ModeDump , SysexCommand::ModeParameterChange , IdxModeParamFirst , IdxModeParamIndexH , IdxModeParamIndexL , IdxModeParamValue , 8}, }; @@ -149,14 +149,7 @@ namespace xt static bool isValid(const Single& _single) { - return _single[IdxSingleParamFirst] == 1; - } - - static bool isValid(const Multi& _multi) - { - return _multi.front() == 0xf0; - // we cannot do this anymore as drum map & multi have the same length -// return _multi[IdxMultiParamFirst] > 0; // Note: no version number in a multi, assume that Multi volume has to be > 0 to be valid + return _single.front() == 0xf0; } static bool isValid(const Global& _global) @@ -166,7 +159,7 @@ namespace xt static bool isValid(const Mode& _mode) { - return _mode.front() == 0xf0; // unable to derive from the packet itself + return _mode.front() == 0xf0; } static SysexCommand getCommand(const SysEx& _data);