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 eaaeb4d3514b0330dc3bcbbcf523eb46e71af35c
parent df6fc70be64b0f63980fd358d21a52ebb70da47d
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Mon,  5 Aug 2024 22:56:00 +0200

allow parameters with a larger range than 0-127

Diffstat:
Msource/jucePluginEditorLib/pluginEditor.cpp | 2+-
Msource/jucePluginEditorLib/pluginEditor.h | 3++-
Msource/jucePluginLib/clipboard.h | 4+++-
Msource/jucePluginLib/controller.cpp | 15+++++++--------
Msource/jucePluginLib/controller.h | 26+++++++++++++-------------
Msource/jucePluginLib/midipacket.cpp | 2+-
Msource/jucePluginLib/midipacket.h | 14++++++++------
Msource/jucePluginLib/parameterdescriptions.cpp | 10----------
Msource/jucePluginLib/types.h | 2++
Msource/mqJucePlugin/mqController.cpp | 2+-
Msource/mqJucePlugin/mqController.h | 2+-
Msource/nord/n2x/n2xJucePlugin/n2xController.cpp | 8++++----
Msource/nord/n2x/n2xJucePlugin/n2xController.h | 2+-
Msource/virusJucePlugin/VirusController.cpp | 4++--
Msource/virusJucePlugin/VirusController.h | 2+-
Msource/xtJucePlugin/xtController.cpp | 2+-
Msource/xtJucePlugin/xtController.h | 2+-
17 files changed, 49 insertions(+), 53 deletions(-)

diff --git a/source/jucePluginEditorLib/pluginEditor.cpp b/source/jucePluginEditorLib/pluginEditor.cpp @@ -473,7 +473,7 @@ namespace jucePluginEditorLib return true; } - bool Editor::setParameters(const std::map<std::string, uint8_t>& _paramValues) const + bool Editor::setParameters(const std::map<std::string, pluginLib::ParamValue>& _paramValues) const { if(_paramValues.empty()) return false; diff --git a/source/jucePluginEditorLib/pluginEditor.h b/source/jucePluginEditorLib/pluginEditor.h @@ -9,6 +9,7 @@ #include "synthLib/buildconfig.h" #include "jucePluginLib/event.h" +#include "jucePluginLib/types.h" namespace baseLib { @@ -86,7 +87,7 @@ namespace jucePluginEditorLib bool copyRegionToClipboard(const std::string& _regionId) const; bool copyParametersToClipboard(const std::vector<std::string>& _params, const std::string& _regionId = {}) const; - bool setParameters(const std::map<std::string, uint8_t>& _paramValues) const; + bool setParameters(const std::map<std::string, pluginLib::ParamValue>& _paramValues) const; auto& getImagePool() { return m_imagePool; } diff --git a/source/jucePluginLib/clipboard.h b/source/jucePluginLib/clipboard.h @@ -5,6 +5,8 @@ #include <string> #include <vector> +#include "types.h" + namespace pluginLib { class Processor; @@ -14,7 +16,7 @@ namespace pluginLib public: struct Data { - using ParameterValues = std::map<std::string,uint8_t>; + using ParameterValues = std::map<std::string, ParamValue>; std::string pluginName; std::string pluginVersionString; diff --git a/source/jucePluginLib/controller.cpp b/source/jucePluginLib/controller.cpp @@ -174,7 +174,7 @@ namespace pluginLib m_processor.addMidiEvent(synthLib::SMidiEvent(_source, _a, _b, _c, _offset)); } - bool Controller::combineParameterChange(uint8_t& _result, const std::string& _midiPacket, const Parameter& _parameter, uint8_t _value) const + bool Controller::combineParameterChange(uint8_t& _result, const std::string& _midiPacket, const Parameter& _parameter, ParamValue _value) const { const auto &desc = _parameter.getDescription(); @@ -214,7 +214,7 @@ namespace pluginLib if (definitions.size() == 1) { - _result = _value; + _result = static_cast<uint8_t>(_value); return true; } @@ -259,8 +259,7 @@ namespace pluginLib bool Controller::sendSysEx(const std::string& _packetName) const { - const std::map<pluginLib::MidiDataType, uint8_t> params; - return sendSysEx(_packetName, params); + return sendSysEx(_packetName, {}); } bool Controller::sendSysEx(const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _params) const @@ -346,7 +345,7 @@ namespace pluginLib return m_descriptions.getIndexByName(index, _name) ? index : InvalidParameterIndex; } - bool Controller::setParameters(const std::map<std::string, uint8_t>& _values, const uint8_t _part, const Parameter::Origin _changedBy) const + bool Controller::setParameters(const std::map<std::string, ParamValue>& _values, const uint8_t _part, const Parameter::Origin _changedBy) const { bool res = false; @@ -465,7 +464,7 @@ namespace pluginLib return _packet.parse(_data, _parameterValues, m_descriptions, _src); } - bool Controller::parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, const std::function<void(MidiPacket::ParamIndex, uint8_t)>& _parameterValues, const std::vector<uint8_t>& _src) const + bool Controller::parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, const std::function<void(MidiPacket::ParamIndex, ParamValue)>& _parameterValues, const std::vector<uint8_t>& _src) const { _data.clear(); return _packet.parse(_data, _parameterValues, m_descriptions, _src); @@ -524,9 +523,9 @@ namespace pluginLib m_parameterLinks.loadChunkData(_cr); } - void Controller::saveChunkData(baseLib::BinaryStream& s) + void Controller::saveChunkData(baseLib::BinaryStream& _s) const { - m_parameterLinks.saveChunkData(s); + m_parameterLinks.saveChunkData(_s); } Parameter::Origin Controller::midiEventSourceToParameterOrigin(const synthLib::MidiEventSource _source) diff --git a/source/jucePluginLib/controller.h b/source/jucePluginLib/controller.h @@ -34,7 +34,7 @@ namespace pluginLib explicit Controller(Processor& _processor, const std::string& _parameterDescJson); ~Controller() override; - virtual void sendParameterChange(const Parameter& _parameter, uint8_t _value) = 0; + virtual void sendParameterChange(const Parameter& _parameter, ParamValue _value) = 0; void sendLockedParameters(uint8_t _part); juce::Value* getParamValueObject(uint32_t _index, uint8_t _part) const; @@ -44,21 +44,21 @@ namespace pluginLib uint32_t getParameterIndexByName(const std::string& _name) const; - bool setParameters(const std::map<std::string, uint8_t>& _values, uint8_t _part, Parameter::Origin _changedBy) const; + bool setParameters(const std::map<std::string, ParamValue>& _values, uint8_t _part, Parameter::Origin _changedBy) const; const MidiPacket* getMidiPacket(const std::string& _name) const; bool createNamedParamValues(MidiPacket::NamedParamValues& _params, const std::string& _packetName, uint8_t _part) const; bool createNamedParamValues(MidiPacket::NamedParamValues& _dest, const MidiPacket::AnyPartParamValues& _source) const; - bool createMidiDataFromPacket(std::vector<uint8_t>& _sysex, const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _data, uint8_t _part) const; - bool createMidiDataFromPacket(std::vector<uint8_t>& _sysex, const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _data, const MidiPacket::NamedParamValues& _values) const; - bool createMidiDataFromPacket(std::vector<uint8_t>& _sysex, const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _data, const MidiPacket::AnyPartParamValues& _values) const; + bool createMidiDataFromPacket(SysEx& _sysex, const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _data, uint8_t _part) const; + bool createMidiDataFromPacket(SysEx& _sysex, const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _data, const MidiPacket::NamedParamValues& _values) const; + bool createMidiDataFromPacket(SysEx& _sysex, const std::string& _packetName, const std::map<MidiDataType, uint8_t>& _data, const MidiPacket::AnyPartParamValues& _values) const; - bool parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, MidiPacket::ParamValues& _parameterValues, const std::vector<uint8_t>& _src) const; - bool parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, MidiPacket::AnyPartParamValues& _parameterValues, const std::vector<uint8_t>& _src) const; - bool parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, const std::function<void(MidiPacket::ParamIndex, uint8_t)>& _parameterValues, const std::vector<uint8_t>& _src) const; - bool parseMidiPacket(const std::string& _name, MidiPacket::Data& _data, MidiPacket::ParamValues& _parameterValues, const std::vector<uint8_t>& _src) const; - bool parseMidiPacket(std::string& _name, MidiPacket::Data& _data, MidiPacket::ParamValues& _parameterValues, const std::vector<uint8_t>& _src) const; + bool parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, MidiPacket::ParamValues& _parameterValues, const SysEx& _src) const; + bool parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, MidiPacket::AnyPartParamValues& _parameterValues, const SysEx& _src) const; + bool parseMidiPacket(const MidiPacket& _packet, MidiPacket::Data& _data, const std::function<void(MidiPacket::ParamIndex, ParamValue)>& _parameterValues, const SysEx& _src) const; + bool parseMidiPacket(const std::string& _name, MidiPacket::Data& _data, MidiPacket::ParamValues& _parameterValues, const SysEx& _src) const; + bool parseMidiPacket(std::string& _name, MidiPacket::Data& _data, MidiPacket::ParamValues& _parameterValues, const SysEx& _src) const; const auto& getExposedParameters() const { return m_synthParams; } @@ -77,7 +77,7 @@ namespace pluginLib void enqueueMidiMessages(const std::vector<synthLib::SMidiEvent>&); void loadChunkData(baseLib::ChunkReader& _cr); - void saveChunkData(baseLib::BinaryStream& s); + void saveChunkData(baseLib::BinaryStream& _s) const; static Parameter::Origin midiEventSourceToParameterOrigin(synthLib::MidiEventSource _source); @@ -112,9 +112,9 @@ namespace pluginLib void sendMidiEvent(const synthLib::SMidiEvent& _ev) const; void sendMidiEvent(uint8_t _a, uint8_t _b, uint8_t _c, uint32_t _offset = 0, synthLib::MidiEventSource _source = synthLib::MidiEventSource::Editor) const; - bool combineParameterChange(uint8_t& _result, const std::string& _midiPacket, const Parameter& _parameter, uint8_t _value) const; + bool combineParameterChange(uint8_t& _result, const std::string& _midiPacket, const Parameter& _parameter, ParamValue _value) const; - void applyPatchParameters(const MidiPacket::ParamValues& _params, const uint8_t _part) const; + void applyPatchParameters(const MidiPacket::ParamValues& _params, uint8_t _part) const; virtual bool isDerivedParameter(Parameter& _derived, Parameter& _base) const { return true; } diff --git a/source/jucePluginLib/midipacket.cpp b/source/jucePluginLib/midipacket.cpp @@ -165,7 +165,7 @@ namespace pluginLib }, _parameters, _src, _ignoreChecksumErrors); } - bool MidiPacket::parse(Data& _data, const std::function<void(ParamIndex, uint8_t)>& _addParamValueCallback, const ParameterDescriptions& _parameters, const Sysex& _src, bool _ignoreChecksumErrors) const + bool MidiPacket::parse(Data& _data, const std::function<void(ParamIndex, ParamValue)>& _addParamValueCallback, const ParameterDescriptions& _parameters, const Sysex& _src, bool _ignoreChecksumErrors) const { if(_src.size() != size()) return false; diff --git a/source/jucePluginLib/midipacket.h b/source/jucePluginLib/midipacket.h @@ -9,6 +9,8 @@ #include <unordered_map> #include <vector> +#include "types.h" + namespace pluginLib { class ParameterDescriptions; @@ -50,12 +52,12 @@ namespace pluginLib uint32_t checksumLastIndex = 0; uint8_t checksumInitValue = 0; - uint8_t packValue(const uint8_t _unmasked) const + uint8_t packValue(const ParamValue _unmasked) const { return static_cast<uint8_t>(((_unmasked & paramMask) << paramShiftRight) >> paramShiftLeft); } - uint8_t unpackValue(const uint8_t _masked) const + ParamValue unpackValue(const uint8_t _masked) const { return ((_masked << paramShiftLeft) >> paramShiftRight) & paramMask; } @@ -79,9 +81,9 @@ namespace pluginLib }; using ParamIndices = std::set<ParamIndex>; - using ParamValues = std::unordered_map<ParamIndex, uint8_t, ParamIndexHash>; // part, index => value - using AnyPartParamValues = std::vector<std::optional<uint8_t>>; // index => value - using NamedParamValues = std::map<std::pair<uint8_t,std::string>, uint8_t>; // part, name => value + using ParamValues = std::unordered_map<ParamIndex, ParamValue, ParamIndexHash>; // part, index => value + using AnyPartParamValues = std::vector<std::optional<ParamValue>>; // index => value + using NamedParamValues = std::map<std::pair<uint8_t,std::string>, ParamValue>; // part, name => value using Sysex = std::vector<uint8_t>; MidiPacket() = default; @@ -94,7 +96,7 @@ namespace pluginLib bool create(std::vector<uint8_t>& _dst, const Data& _data) const; bool parse(Data& _data, AnyPartParamValues& _parameterValues, const ParameterDescriptions& _parameters, const Sysex& _src, bool _ignoreChecksumErrors = true) const; bool parse(Data& _data, ParamValues& _parameterValues, const ParameterDescriptions& _parameters, const Sysex& _src, bool _ignoreChecksumErrors = true) const; - bool parse(Data& _data, const std::function<void(ParamIndex, uint8_t)>& _addParamValueCallback, const ParameterDescriptions& _parameters, const Sysex& _src, bool _ignoreChecksumErrors = true) const; + bool parse(Data& _data, const std::function<void(ParamIndex, ParamValue)>& _addParamValueCallback, const ParameterDescriptions& _parameters, const Sysex& _src, bool _ignoreChecksumErrors = true) const; bool getParameterIndices(ParamIndices& _indices, const ParameterDescriptions& _parameters) const; bool getDefinitionsForByteIndex(std::vector<const MidiDataDefinition*>& _result, uint32_t _byteIndex) const; bool getParameterIndicesForByteIndex(std::vector<ParamIndex>& _result, const ParameterDescriptions& _parameters, uint32_t _byteIndex) const; diff --git a/source/jucePluginLib/parameterdescriptions.cpp b/source/jucePluginLib/parameterdescriptions.cpp @@ -188,16 +188,6 @@ namespace pluginLib const auto maxValue = readPropertyInt("max"); const auto defaultValue = readPropertyIntWithDefault("default", Description::NoDefaultValue); - if (minValue < 0 || minValue > 127) - { - errors << name << ": min value for parameter desc " << name << " must be in range 0-127 but min is set to " << minValue << std::endl; - continue; - } - if(maxValue < 0 || maxValue > 127) - { - errors << name << ": max value for parameter desc " << name << " must be in range 0-127 but max is set to " << maxValue << std::endl; - continue; - } if (maxValue < minValue) { errors << name << ": max value must be larger than min value but min is " << minValue << ", max is " << maxValue << std::endl; diff --git a/source/jucePluginLib/types.h b/source/jucePluginLib/types.h @@ -12,4 +12,6 @@ namespace pluginLib Source = 1, Target = 2 }; + + using ParamValue = int32_t; } diff --git a/source/mqJucePlugin/mqController.cpp b/source/mqJucePlugin/mqController.cpp @@ -447,7 +447,7 @@ void Controller::selectPreset(int _offset) */ } } -void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, const uint8_t _value) +void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, const pluginLib::ParamValue _value) { const auto &desc = _parameter.getDescription(); diff --git a/source/mqJucePlugin/mqController.h b/source/mqJucePlugin/mqController.h @@ -92,7 +92,7 @@ private: bool parseSysexMessage(const pluginLib::SysEx&, synthLib::MidiEventSource _source) override; bool parseControllerMessage(const synthLib::SMidiEvent&) override; - void sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) override; + void sendParameterChange(const pluginLib::Parameter& _parameter, pluginLib::ParamValue _value) override; bool sendGlobalParameterChange(mqLib::GlobalParameter _param, uint8_t _value); void requestSingle(mqLib::MidiBufferNum _buf, mqLib::MidiSoundLocation _location, uint8_t _locationOffset = 0) const; void requestMulti(mqLib::MidiBufferNum _buf, mqLib::MidiSoundLocation _location, uint8_t _locationOffset = 0) const; diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.cpp b/source/nord/n2x/n2xJucePlugin/n2xController.cpp @@ -206,11 +206,11 @@ namespace n2xJucePlugin return true; } - void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) + void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, pluginLib::ParamValue _value) { if(_parameter.getDescription().page >= g_multiPage) { - sendMultiParameter(_parameter, _value); + sendMultiParameter(_parameter, static_cast<uint8_t>(_value)); return; } @@ -250,13 +250,13 @@ namespace n2xJucePlugin const auto parts = m_state.getPartsForMidiChannel(ch); - const auto ev = synthLib::SMidiEvent{synthLib::MidiEventSource::Editor, static_cast<uint8_t>(synthLib::M_CONTROLCHANGE + ch), cc, _value}; + const auto ev = synthLib::SMidiEvent{synthLib::MidiEventSource::Editor, static_cast<uint8_t>(synthLib::M_CONTROLCHANGE + ch), cc, static_cast<uint8_t>(_value)}; if(parts.size() > 1) { // this is problematic. We want to edit one part only but two parts receive on the same channel. We have to send a full dump nonConstParam.setRateLimitMilliseconds(sysexRateLimitMs); - setSingleParameter(part, singleParam, _value); + setSingleParameter(part, singleParam, static_cast<uint8_t>(_value)); } else { diff --git a/source/nord/n2x/n2xJucePlugin/n2xController.h b/source/nord/n2x/n2xJucePlugin/n2xController.h @@ -39,7 +39,7 @@ namespace n2xJucePlugin bool parseMultiDump(const pluginLib::SysEx& _msg); bool parseControllerMessage(const synthLib::SMidiEvent&) override; - void sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) override; + void sendParameterChange(const pluginLib::Parameter& _parameter, pluginLib::ParamValue _value) override; void setSingleParameter(uint8_t _part, n2x::SingleParam _sp, uint8_t _value); void setMultiParameter(n2x::MultiParam _mp, uint8_t _value); diff --git a/source/virusJucePlugin/VirusController.cpp b/source/virusJucePlugin/VirusController.cpp @@ -651,11 +651,11 @@ namespace Virus return pluginLib::Controller::sendSysEx(midiPacketName(_type), _params); } - void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) + void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, const pluginLib::ParamValue _value) { const auto& desc = _parameter.getDescription(); - sendParameterChange(desc.page, _parameter.getPart(), desc.index, _value); + sendParameterChange(desc.page, _parameter.getPart(), desc.index, static_cast<uint8_t>(_value)); } bool Controller::sendParameterChange(uint8_t _page, uint8_t _part, uint8_t _index, uint8_t _value) const diff --git a/source/virusJucePlugin/VirusController.h b/source/virusJucePlugin/VirusController.h @@ -144,7 +144,7 @@ namespace Virus bool requestArrangement() const; void requestRomBanks(); - void sendParameterChange(const pluginLib::Parameter& _parameter, uint8_t _value) override; + void sendParameterChange(const pluginLib::Parameter& _parameter, pluginLib::ParamValue _value) override; bool sendParameterChange(uint8_t _page, uint8_t _part, uint8_t _index, uint8_t _value) const; using pluginLib::Controller::sendSysEx; diff --git a/source/xtJucePlugin/xtController.cpp b/source/xtJucePlugin/xtController.cpp @@ -536,7 +536,7 @@ void Controller::selectPreset(const int _offset) */ } } -void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, const uint8_t _value) +void Controller::sendParameterChange(const pluginLib::Parameter& _parameter, const pluginLib::ParamValue _value) { const auto &desc = _parameter.getDescription(); diff --git a/source/xtJucePlugin/xtController.h b/source/xtJucePlugin/xtController.h @@ -109,7 +109,7 @@ 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; + void sendParameterChange(const pluginLib::Parameter& _parameter, pluginLib::ParamValue _value) override; bool sendGlobalParameterChange(xt::GlobalParameter _param, uint8_t _value); bool sendModeDump() const; void requestSingle(xt::LocationH _buf, uint8_t _location) const;