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 9914f2ae736c34bca7a4b5607c7fa16d5e7e7a59
parent 2c53030be29d5ac3c144691765e6258560eda12b
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Tue, 30 Jul 2024 10:23:50 +0200

request device state at startup

Diffstat:
Msource/nord/n2x/n2xJucePlugin/n2xController.cpp | 37+++++++++++++++++++++++++++++++++++++
Msource/nord/n2x/n2xJucePlugin/n2xController.h | 13+++++++++++++
Msource/nord/n2x/n2xLib/n2xmiditypes.h | 3++-
3 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.cpp b/source/nord/n2x/n2xJucePlugin/n2xController.cpp @@ -8,14 +8,35 @@ #include "synthLib/os.h" #include "dsp56kEmu/logging.h" +#include "n2xLib/n2xmiditypes.h" namespace { + constexpr const char* g_midiPacketNames[] = + { + "requestdump", + "singledump", + "multidump" + }; + + 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)]; + } } Controller::Controller(AudioPluginAudioProcessor& _p) : pluginLib::Controller(_p, loadParameterDescriptions()) { registerParams(_p); + + requestDump(n2x::SysexByte::SingleRequestBankEditBuffer, 0); // single edit buffers A-D + requestDump(n2x::SysexByte::SingleRequestBankEditBuffer, 1); + requestDump(n2x::SysexByte::SingleRequestBankEditBuffer, 2); + requestDump(n2x::SysexByte::SingleRequestBankEditBuffer, 3); + + requestDump(n2x::SysexByte::MultiRequestBankEditBuffer, 0); // performance edit buffer } Controller::~Controller() = default; @@ -69,3 +90,19 @@ bool Controller::parseControllerMessage(const synthLib::SMidiEvent&) void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, const uint8_t _value) { } + +bool Controller::sendSysEx(MidiPacketType _packet, const std::map<pluginLib::MidiDataType, uint8_t>& _params) const +{ + return pluginLib::Controller::sendSysEx(midiPacketName(_packet), _params); +} + +void Controller::requestDump(const uint8_t _bank, const uint8_t _patch) const +{ + std::map<pluginLib::MidiDataType, uint8_t> params; + + params[pluginLib::MidiDataType::DeviceId] = n2x::SysexByte::DefaultDeviceId; + params[pluginLib::MidiDataType::Bank] = static_cast<uint8_t>(_bank); + params[pluginLib::MidiDataType::Program] = _patch; + + sendSysEx(MidiPacketType::RequestDump, params); +} diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.h b/source/nord/n2x/n2xJucePlugin/n2xController.h @@ -7,6 +7,15 @@ class AudioPluginAudioProcessor; class Controller : public pluginLib::Controller { public: + enum class MidiPacketType + { + RequestDump, + SingleDump, + MultiDump, + + Count + }; + Controller(AudioPluginAudioProcessor&); ~Controller() override; @@ -24,5 +33,9 @@ private: bool parseSysexMessage(const pluginLib::SysEx&, synthLib::MidiEventSource) override; bool parseControllerMessage(const synthLib::SMidiEvent&) override; + void sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) override; + bool sendSysEx(MidiPacketType _packet, const std::map<pluginLib::MidiDataType, uint8_t>& _params) const; + + void requestDump(uint8_t _bank, uint8_t _patch) const; }; diff --git a/source/nord/n2x/n2xLib/n2xmiditypes.h b/source/nord/n2x/n2xLib/n2xmiditypes.h @@ -9,7 +9,8 @@ namespace n2x IdClavia = 0x33, IdN2X = 0x04, SingleDumpBankEditBuffer = 0x00, SingleDumpBankA = 0x01, SingleDumpBankB = 0x02, SingleDumpBankC = 0x03, SingleDumpBankD = 0x04, -// SingleRequestBankEditBuffer = 0x0a, SingleRequestBankA = 0x0b, SingleRequestBankB = 0x0c, SingleRequestBankC = 0x0d, SingleRequestBankD = 0x0e, + SingleRequestBankEditBuffer = 0x0e, SingleRequestBankA = 0x0f, SingleRequestBankB = 0x10, SingleRequestBankC = 0x11, SingleRequestBankD = 0x12, + MultiRequestBankEditBuffer = 0x28, DefaultDeviceId = 0xf }; }