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 ab3d69ae788ec327931f684096bdecc2dfbc955f
parent f55ce92bc33f94f929a5bc20cde872679be57486
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Tue, 30 Jul 2024 16:11:07 +0200

parse single dumps and update parameters

Diffstat:
Msource/nord/n2x/n2xJucePlugin/n2xController.cpp | 34++++++++++++++++++++++++++++++++++
Msource/nord/n2x/n2xJucePlugin/n2xController.h | 2++
Msource/nord/n2x/n2xJucePlugin/parameterDescriptions_n2x.json | 153++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msource/nord/n2x/n2xLib/n2xmiditypes.h | 25++++++++++++++++++++++---
4 files changed, 135 insertions(+), 79 deletions(-)

diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.cpp b/source/nord/n2x/n2xJucePlugin/n2xController.cpp @@ -78,6 +78,40 @@ std::string Controller::loadParameterDescriptions() bool Controller::parseSysexMessage(const pluginLib::SysEx& _msg, synthLib::MidiEventSource) { + if(_msg.size() == n2x::g_singleDumpSize) + { + return parseSingleDump(_msg); + } + if(_msg.size() == n2x::g_multiDumpSize) + { + return parseMultiDump(_msg); + } + return false; +} + +bool Controller::parseSingleDump(const pluginLib::SysEx& _msg) +{ + pluginLib::MidiPacket::Data data; + pluginLib::MidiPacket::ParamValues params; + + if(!parseMidiPacket(midiPacketName(MidiPacketType::SingleDump), data, params, _msg)) + return false; + + const auto bank = data[pluginLib::MidiDataType::Bank]; + const auto program = data[pluginLib::MidiDataType::Program]; + + if(bank == n2x::SysexByte::SingleDumpBankEditBuffer && program < getPartCount()) + { + applyPatchParameters(params, program); + return true; + } + + assert(false && "receiving a single for a non-edit-buffer is unexpected"); + return false; +} + +bool Controller::parseMultiDump(const pluginLib::SysEx& _msg) +{ return false; } diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.h b/source/nord/n2x/n2xJucePlugin/n2xController.h @@ -32,6 +32,8 @@ private: } bool parseSysexMessage(const pluginLib::SysEx&, synthLib::MidiEventSource) override; + bool parseSingleDump(const pluginLib::SysEx& _msg); + bool parseMultiDump(const pluginLib::SysEx& _msg); bool parseControllerMessage(const synthLib::SMidiEvent&) override; void sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) override; diff --git a/source/nord/n2x/n2xJucePlugin/parameterDescriptions_n2x.json b/source/nord/n2x/n2xJucePlugin/parameterDescriptions_n2x.json @@ -70,9 +70,9 @@ {"index":50, "name":"O1Waveform", "min":0, "max":3, "isDiscrete":true}, {"index":51, "name":"O2Waveform", "min":0, "max":3, "isDiscrete":true}, - {"index":52, "name":"Sync", "min":0, "max":1, "isBool":true, "mask":1, "shift":0}, - {"index":52, "name":"RingMod", "min":0, "max":1, "isBool":true, "mask":1, "shift":1}, - {"index":52, "name":"Distortion", "min":0, "max":1, "isBool":true, "mask":1, "shift":4}, + {"index":52, "name":"Sync", "min":0, "max":1, "isBool":true}, + {"index":52, "name":"RingMod", "min":0, "max":1, "isBool":true}, + {"index":52, "name":"Distortion", "min":0, "max":1, "isBool":true}, {"index":53, "name":"FilterType", "min":0, "max":4, "isDiscrete":true}, {"index":54, "name":"O2Keytrack", "min":0, "max":1, "isBool":true}, {"index":55, "name":"FilterKeytrack", "min":0, "max":1, "isBool":true}, @@ -138,8 +138,8 @@ {"class":"NonPartSensitive", "page":10, "index":311, "name":"PerfMorfTriggerNoteNumberD", "min":23, "max":127, "isDiscrete":true}, {"class":"NonPartSensitive", "page":10, "index":312, "name":"PerfBendRange", "min":0, "max":8, "isDiscrete":true}, {"class":"NonPartSensitive", "page":10, "index":313, "name":"PerfUnisonDetune", "min":0, "max":8, "isDiscrete":true}, - {"class":"NonPartSensitive", "page":10, "index":314, "name":"PerfOutModeAB", "min":0, "max":8, "isDiscrete":true, "mask":3, "shift":0}, - {"class":"NonPartSensitive", "page":10, "index":314, "name":"PerfOutModeCD", "min":0, "max":3, "isDiscrete":true, "mask":3, "shift":4}, + {"class":"NonPartSensitive", "page":10, "index":314, "name":"PerfOutModeAB", "min":0, "max":8, "isDiscrete":true}, + {"class":"NonPartSensitive", "page":10, "index":314, "name":"PerfOutModeCD", "min":0, "max":3, "isDiscrete":true}, {"class":"NonPartSensitive", "page":10, "index":315, "name":"PerfGlobalMidiChannel", "min":0, "max":15}, {"class":"NonPartSensitive", "page":10, "index":316, "name":"PerfProgramChange", "min":0, "max":1, "isBool":true}, {"class":"NonPartSensitive", "page":10, "index":317, "name":"PerfMidiControl", "min":0, "max":1, "isBool":true}, @@ -246,83 +246,84 @@ ], "singledump": [ {"type": "byte", "value": "f0"}, - {"type": "byte", "value": "3e"}, - {"type": "byte", "value": "0e"}, + {"type": "byte", "value": "33"}, {"type": "deviceid"}, - {"type": "byte", "value": "10"}, + {"type": "byte", "value": "04"}, {"type": "bank"}, {"type": "program"}, - {"type": "param", "name":"O2Pitch" , "mask":"f", "shift":4}, {"type": "param", "name":"O2Pitch" , "mask":"f", "shift":0}, - {"type": "param", "name":"O2PitchFine" , "mask":"f", "shift":4}, {"type": "param", "name":"O2PitchFine" , "mask":"f", "shift":0}, - {"type": "param", "name":"Mix" , "mask":"f", "shift":4}, {"type": "param", "name":"Mix" , "mask":"f", "shift":0}, - {"type": "param", "name":"Cutoff" , "mask":"f", "shift":4}, {"type": "param", "name":"Cutoff" , "mask":"f", "shift":0}, - {"type": "param", "name":"Resonance" , "mask":"f", "shift":4}, {"type": "param", "name":"Resonance" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvAmount" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvAmount" , "mask":"f", "shift":0}, - {"type": "param", "name":"PW" , "mask":"f", "shift":4}, {"type": "param", "name":"PW" , "mask":"f", "shift":0}, - {"type": "param", "name":"FmDepth" , "mask":"f", "shift":4}, {"type": "param", "name":"FmDepth" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvA" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvA" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvD" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvD" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvS" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvS" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvR" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvR" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvA" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvA" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvD" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvD" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvS" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvS" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvR" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvR" , "mask":"f", "shift":0}, - {"type": "param", "name":"Portamento" , "mask":"f", "shift":4}, {"type": "param", "name":"Portamento" , "mask":"f", "shift":0}, - {"type": "param", "name":"Gain" , "mask":"f", "shift":4}, {"type": "param", "name":"Gain" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvA" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvA" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvD" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvD" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvLevel" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvLevel" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo1Rate" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo1Rate" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo1Level" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo1Level" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo2Rate" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo2Rate" , "mask":"f", "shift":0}, - {"type": "param", "name":"ArpRange" , "mask":"f", "shift":4}, {"type": "param", "name":"ArpRange" , "mask":"f", "shift":0}, + {"type": "param", "name":"O2Pitch" }, {"type": "param", "name":"O2Pitch" , "shiftL":4}, + {"type": "param", "name":"O2PitchFine" }, {"type": "param", "name":"O2PitchFine" , "shiftL":4}, + {"type": "param", "name":"Mix" }, {"type": "param", "name":"Mix" , "shiftL":4}, + {"type": "param", "name":"Cutoff" }, {"type": "param", "name":"Cutoff" , "shiftL":4}, + {"type": "param", "name":"Resonance" }, {"type": "param", "name":"Resonance" , "shiftL":4}, + {"type": "param", "name":"FilterEnvAmount" }, {"type": "param", "name":"FilterEnvAmount" , "shiftL":4}, + {"type": "param", "name":"PW" }, {"type": "param", "name":"PW" , "shiftL":4}, + {"type": "param", "name":"FmDepth" }, {"type": "param", "name":"FmDepth" , "shiftL":4}, + {"type": "param", "name":"FilterEnvA" }, {"type": "param", "name":"FilterEnvA" , "shiftL":4}, + {"type": "param", "name":"FilterEnvD" }, {"type": "param", "name":"FilterEnvD" , "shiftL":4}, + {"type": "param", "name":"FilterEnvS" }, {"type": "param", "name":"FilterEnvS" , "shiftL":4}, + {"type": "param", "name":"FilterEnvR" }, {"type": "param", "name":"FilterEnvR" , "shiftL":4}, + {"type": "param", "name":"AmpEnvA" }, {"type": "param", "name":"AmpEnvA" , "shiftL":4}, + {"type": "param", "name":"AmpEnvD" }, {"type": "param", "name":"AmpEnvD" , "shiftL":4}, + {"type": "param", "name":"AmpEnvS" }, {"type": "param", "name":"AmpEnvS" , "shiftL":4}, + {"type": "param", "name":"AmpEnvR" }, {"type": "param", "name":"AmpEnvR" , "shiftL":4}, + {"type": "param", "name":"Portamento" }, {"type": "param", "name":"Portamento" , "shiftL":4}, + {"type": "param", "name":"Gain" }, {"type": "param", "name":"Gain" , "shiftL":4}, + {"type": "param", "name":"ModEnvA" }, {"type": "param", "name":"ModEnvA" , "shiftL":4}, + {"type": "param", "name":"ModEnvD" }, {"type": "param", "name":"ModEnvD" , "shiftL":4}, + {"type": "param", "name":"ModEnvLevel" }, {"type": "param", "name":"ModEnvLevel" , "shiftL":4}, + {"type": "param", "name":"Lfo1Rate" }, {"type": "param", "name":"Lfo1Rate" , "shiftL":4}, + {"type": "param", "name":"Lfo1Level" }, {"type": "param", "name":"Lfo1Level" , "shiftL":4}, + {"type": "param", "name":"Lfo2Rate" }, {"type": "param", "name":"Lfo2Rate" , "shiftL":4}, + {"type": "param", "name":"ArpRange" }, {"type": "param", "name":"ArpRange" , "shiftL":4}, + + {"type": "param", "name":"O2PitchSens" }, {"type": "param", "name":"O2PitchSens" , "shiftL":4}, + {"type": "param", "name":"O2PitchFineSens" }, {"type": "param", "name":"O2PitchFineSens" , "shiftL":4}, + {"type": "param", "name":"MixSens" }, {"type": "param", "name":"MixSens" , "shiftL":4}, + {"type": "param", "name":"CutoffSens" }, {"type": "param", "name":"CutoffSens" , "shiftL":4}, + {"type": "param", "name":"ResonanceSens" }, {"type": "param", "name":"ResonanceSens" , "shiftL":4}, + {"type": "param", "name":"FilterEnvAmountSens"}, {"type": "param", "name":"FilterEnvAmountSens", "shiftL":4}, + {"type": "param", "name":"PWSens" }, {"type": "param", "name":"PWSens" , "shiftL":4}, + {"type": "param", "name":"FmDepthSens" }, {"type": "param", "name":"FmDepthSens" , "shiftL":4}, + {"type": "param", "name":"FilterEnvASens" }, {"type": "param", "name":"FilterEnvASens" , "shiftL":4}, + {"type": "param", "name":"FilterEnvDSens" }, {"type": "param", "name":"FilterEnvDSens" , "shiftL":4}, + {"type": "param", "name":"FilterEnvSSens" }, {"type": "param", "name":"FilterEnvSSens" , "shiftL":4}, + {"type": "param", "name":"FilterEnvRSens" }, {"type": "param", "name":"FilterEnvRSens" , "shiftL":4}, + {"type": "param", "name":"AmpEnvASens" }, {"type": "param", "name":"AmpEnvASens" , "shiftL":4}, + {"type": "param", "name":"AmpEnvDSens" }, {"type": "param", "name":"AmpEnvDSens" , "shiftL":4}, + {"type": "param", "name":"AmpEnvSSens" }, {"type": "param", "name":"AmpEnvSSens" , "shiftL":4}, + {"type": "param", "name":"AmpEnvRSens" }, {"type": "param", "name":"AmpEnvRSens" , "shiftL":4}, + {"type": "param", "name":"PortamentoSens" }, {"type": "param", "name":"PortamentoSens" , "shiftL":4}, + {"type": "param", "name":"GainSens" }, {"type": "param", "name":"GainSens" , "shiftL":4}, + {"type": "param", "name":"ModEnvASens" }, {"type": "param", "name":"ModEnvASens" , "shiftL":4}, + {"type": "param", "name":"ModEnvDSens" }, {"type": "param", "name":"ModEnvDSens" , "shiftL":4}, + {"type": "param", "name":"ModEnvLevelSens" }, {"type": "param", "name":"ModEnvLevelSens" , "shiftL":4}, + {"type": "param", "name":"Lfo1RateSens" }, {"type": "param", "name":"Lfo1RateSens" , "shiftL":4}, + {"type": "param", "name":"Lfo1LevelSens" }, {"type": "param", "name":"Lfo1LevelSens" , "shiftL":4}, + {"type": "param", "name":"Lfo2RateSens" }, {"type": "param", "name":"Lfo2RateSens" , "shiftL":4}, + {"type": "param", "name":"ArpRangeSens" }, {"type": "param", "name":"ArpRangeSens" , "shiftL":4}, + + {"type": "param", "name":"O1Waveform" }, {"type": "param", "name":"O1Waveform" , "shiftL":4}, + {"type": "param", "name":"O2Waveform" }, {"type": "param", "name":"O2Waveform" , "shiftL":4}, - {"type": "param", "name":"O2PitchSens" , "mask":"f", "shift":4}, {"type": "param", "name":"O2PitchSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"O2PitchFineSens" , "mask":"f", "shift":4}, {"type": "param", "name":"O2PitchFineSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"MixSens" , "mask":"f", "shift":4}, {"type": "param", "name":"MixSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"CutoffSens" , "mask":"f", "shift":4}, {"type": "param", "name":"CutoffSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"ResonanceSens" , "mask":"f", "shift":4}, {"type": "param", "name":"ResonanceSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvAmountSens", "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvAmountSens", "mask":"f", "shift":0}, - {"type": "param", "name":"PWSens" , "mask":"f", "shift":4}, {"type": "param", "name":"PWSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"FmDepthSens" , "mask":"f", "shift":4}, {"type": "param", "name":"FmDepthSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvASens" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvASens" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvDSens" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvDSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvSSens" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvSSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterEnvRSens" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterEnvRSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvASens" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvASens" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvDSens" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvDSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvSSens" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvSSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"AmpEnvRSens" , "mask":"f", "shift":4}, {"type": "param", "name":"AmpEnvRSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"PortamentoSens" , "mask":"f", "shift":4}, {"type": "param", "name":"PortamentoSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"GainSens" , "mask":"f", "shift":4}, {"type": "param", "name":"GainSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvASens" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvASens" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvDSens" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvDSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvLevelSens" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvLevelSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo1RateSens" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo1RateSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo1LevelSens" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo1LevelSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo2RateSens" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo2RateSens" , "mask":"f", "shift":0}, - {"type": "param", "name":"ArpRangeSens" , "mask":"f", "shift":4}, {"type": "param", "name":"ArpRangeSens" , "mask":"f", "shift":0}, + {"type": "param", "name":"Sync" , "mask":1, "shift":0}, + {"type": "param", "name":"RingMod" , "mask":1, "shift":1}, + {"type": "param", "name":"Distortion" , "mask":1, "shift":0}, - {"type": "param", "name":"O1Waveform" , "mask":"f", "shift":4}, {"type": "param", "name":"O1Waveform" , "mask":"f", "shift":0}, - {"type": "param", "name":"O2Waveform" , "mask":"f", "shift":4}, {"type": "param", "name":"O2Waveform" , "mask":"f", "shift":0}, - {"type": "param", "name":"Sync" , "mask":"f", "shift":4}, {"type": "param", "name":"Sync" , "mask":"f", "shift":0}, - {"type": "param", "name":"RingMod" , "mask":"f", "shift":4}, {"type": "param", "name":"RingMod" , "mask":"f", "shift":0}, - {"type": "param", "name":"Distortion" , "mask":"f", "shift":4}, {"type": "param", "name":"Distortion" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterType" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterType" , "mask":"f", "shift":0}, - {"type": "param", "name":"O2Keytrack" , "mask":"f", "shift":4}, {"type": "param", "name":"O2Keytrack" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterKeytrack" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterKeytrack" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo1Waveform" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo1Waveform" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo1Dest" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo1Dest" , "mask":"f", "shift":0}, - {"type": "param", "name":"VoiceMode" , "mask":"f", "shift":4}, {"type": "param", "name":"VoiceMode" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModWheelDest" , "mask":"f", "shift":4}, {"type": "param", "name":"ModWheelDest" , "mask":"f", "shift":0}, - {"type": "param", "name":"Unison" , "mask":"f", "shift":4}, {"type": "param", "name":"Unison" , "mask":"f", "shift":0}, - {"type": "param", "name":"ModEnvDest" , "mask":"f", "shift":4}, {"type": "param", "name":"ModEnvDest" , "mask":"f", "shift":0}, - {"type": "param", "name":"Auto" , "mask":"f", "shift":4}, {"type": "param", "name":"Auto" , "mask":"f", "shift":0}, - {"type": "param", "name":"FilterVelocity" , "mask":"f", "shift":4}, {"type": "param", "name":"FilterVelocity" , "mask":"f", "shift":0}, - {"type": "param", "name":"OctaveShift" , "mask":"f", "shift":4}, {"type": "param", "name":"OctaveShift" , "mask":"f", "shift":0}, - {"type": "param", "name":"Lfo2Dest" , "mask":"f", "shift":4}, {"type": "param", "name":"Lfo2Dest" , "mask":"f", "shift":0}, + {"type": "param", "name":"FilterType" }, {"type": "param", "name":"FilterType" , "shiftL":4}, + {"type": "param", "name":"O2Keytrack" }, {"type": "param", "name":"O2Keytrack" , "shiftL":4}, + {"type": "param", "name":"FilterKeytrack" }, {"type": "param", "name":"FilterKeytrack" , "shiftL":4}, + {"type": "param", "name":"Lfo1Waveform" }, {"type": "param", "name":"Lfo1Waveform" , "shiftL":4}, + {"type": "param", "name":"Lfo1Dest" }, {"type": "param", "name":"Lfo1Dest" , "shiftL":4}, + {"type": "param", "name":"VoiceMode" }, {"type": "param", "name":"VoiceMode" , "shiftL":4}, + {"type": "param", "name":"ModWheelDest" }, {"type": "param", "name":"ModWheelDest" , "shiftL":4}, + {"type": "param", "name":"Unison" }, {"type": "param", "name":"Unison" , "shiftL":4}, + {"type": "param", "name":"ModEnvDest" }, {"type": "param", "name":"ModEnvDest" , "shiftL":4}, + {"type": "param", "name":"Auto" }, {"type": "param", "name":"Auto" , "shiftL":4}, + {"type": "param", "name":"FilterVelocity" }, {"type": "param", "name":"FilterVelocity" , "shiftL":4}, + {"type": "param", "name":"OctaveShift" }, {"type": "param", "name":"OctaveShift" , "shiftL":4}, + {"type": "param", "name":"Lfo2Dest" }, {"type": "param", "name":"Lfo2Dest" , "shiftL":4}, {"type":"byte", "value":"f7"} ], diff --git a/source/nord/n2x/n2xLib/n2xmiditypes.h b/source/nord/n2x/n2xLib/n2xmiditypes.h @@ -6,11 +6,30 @@ namespace n2x { enum SysexByte : uint8_t { - IdClavia = 0x33, - IdN2X = 0x04, + IdClavia = 0x33, IdN2X = 0x04, DefaultDeviceId = 0xf, + SingleDumpBankEditBuffer = 0x00, SingleDumpBankA = 0x01, SingleDumpBankB = 0x02, SingleDumpBankC = 0x03, SingleDumpBankD = 0x04, SingleRequestBankEditBuffer = 0x0e, SingleRequestBankA = 0x0f, SingleRequestBankB = 0x10, SingleRequestBankC = 0x11, SingleRequestBankD = 0x12, + MultiRequestBankEditBuffer = 0x28, - DefaultDeviceId = 0xf }; + + enum SysexIndex + { + IdxClavia = 1, + IdxDevice, + IdxN2x, + IdxMsgType, + IdxMsgSpec, + }; + + static constexpr uint32_t g_sysexHeaderSize = 6; // F0, IdClavia, IdDevice, IdN2x, MsgType, MsgSpec + static constexpr uint32_t g_sysexFooterSize = 1; // F7 + static constexpr uint32_t g_sysexContainerSize = g_sysexHeaderSize + g_sysexFooterSize; + + static constexpr uint32_t g_singleDataSize = 66 * 2; // 66 parameters in two nibbles + static constexpr uint32_t g_multiDataSize = 4 * g_singleDataSize + 90 * 2; // 4 singles and 90 params in two nibbles + + static constexpr uint32_t g_singleDumpSize = g_singleDataSize + g_sysexContainerSize; + static constexpr uint32_t g_multiDumpSize = g_multiDataSize + g_sysexContainerSize; }