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 f3851b8be27af7364fdfa5848fca12027d9a1d84
parent ee10dbb7eaf30ab244edfb28623e4aca0331d327
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat, 12 Feb 2022 02:16:25 +0100

move parameter description to separate file

Diffstat:
Msource/jucePlugin/CMakeLists.txt | 4++++
Msource/jucePlugin/VirusController.cpp | 1529+------------------------------------------------------------------------------
Msource/jucePlugin/VirusController.h | 371+------------------------------------------------------------------------------
Asource/jucePlugin/VirusParameterDescription.cpp | 1533+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/jucePlugin/VirusParameterDescription.h | 377+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 1916 insertions(+), 1898 deletions(-)

diff --git a/source/jucePlugin/CMakeLists.txt b/source/jucePlugin/CMakeLists.txt @@ -58,6 +58,8 @@ PRIVATE VirusParameter.h VirusParameterBinding.cpp VirusParameterBinding.h + VirusParameterDescription.cpp + VirusParameterDescription.h version.h ) @@ -179,6 +181,8 @@ PRIVATE VirusParameter.h VirusParameterBinding.cpp VirusParameterBinding.h + VirusParameterDescription.cpp + VirusParameterDescription.h version.h ) diff --git a/source/jucePlugin/VirusController.cpp b/source/jucePlugin/VirusController.cpp @@ -59,7 +59,7 @@ namespace Virus std::make_unique<juce::AudioProcessorParameterGroup>("ch" + partNumber, "Ch " + partNumber, "|"); uint32_t parameterDescIndex = 0; - for (const auto& desc : m_paramsDescription) + for (const auto& desc : g_paramsDescription) { const auto paramType = static_cast<ParameterType>(parameterDescIndex); ++parameterDescIndex; @@ -451,1533 +451,6 @@ namespace Virus findSynthParam(part, bank, m.b)->setValueFromSynth(m.c, true); } - - juce::String numToBank(float bankIdx, Parameter::Description) - { - jassert(bankIdx >= 0); - juce::String prefix = "RAM"; - if (bankIdx > 3) - { - prefix = bankIdx < 9 ? "ROM " : "ROM"; - } - return prefix + juce::String(juce::roundToInt(bankIdx + 1)); - } - - juce::String numTo7bitSigned(const int idx) - { - const auto sign = idx > 64 ? "+" : ""; - return sign + juce::String(juce::roundToInt(idx - 64)); - } - - juce::String paramTo7bitSigned(const float idx, Parameter::Description) - { - return numTo7bitSigned(juce::roundToInt(idx)); - } - - float textTo7bitSigned(juce::String text, Parameter::Description) - { - const auto val = std::clamp(text.getIntValue(), -64, 63); - return val + 64; - } - - juce::String numToPan(float panIdx, Parameter::Description) - { - // handles rounding due to continuous... - const auto idx = juce::roundToInt(panIdx); - if (idx == 64) - return "Center"; - if (idx == 0) - return "Left"; - if (idx == 127) - return "Right"; - return numTo7bitSigned(idx); - } - - juce::String numToOscShape(float panIdx, Parameter::Description) - { - const auto idx = juce::roundToInt(panIdx); - if (idx == 64) - return "Saw"; - if (idx == 0) - return "Wave"; - if (idx == 127) - return "Pulse"; - return numTo7bitSigned(idx); - } - - juce::String numToOscWaveSelect(float panIdx, Parameter::Description) - { - const auto idx = juce::roundToInt(panIdx); - if (idx == 0) - return "Sine"; - if (idx == 1) - return "Triangle"; - return "Wave " + juce::String(idx + 1); - } - - juce::String numToSatCurv(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Light"; - case 2: return "Soft"; - case 3: return "Middle"; - case 4: return "Hard"; - case 5: return "Digital"; - case 6: return "Shaper"; - case 7: return "Rectifier"; - case 8: return "BitReducer"; - case 9: return "RateReducer"; - case 10: return "Rate+Flw"; - case 11: return "LowPass"; - case 12: return "Low+Flw"; - case 13: return "HighPass"; - case 14: return "High+Flw"; - - default: return juce::String(idx); - } - } - - juce::String numToDistortionCurv(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Light"; - case 2: return "Soft"; - case 3: return "Middle"; - case 4: return "Hard"; - case 5: return "Digital"; - case 6: return "Shaper"; - case 7: return "Rectifier"; - case 8: return "BitReducer"; - case 9: return "RateReducer"; - case 10: return "LowPass"; - case 11: return "HighPass"; - default: return juce::String(idx); - } - } - - juce::String numToFilterMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "LowPass"; - case 1: return "HighPass"; - case 2: return "BandPass"; - case 3: return "BandStop"; - case 4: return "Analog 1P"; - case 5: return "Analog 2P"; - case 6: return "Analog 3P"; - case 7: return "Analog 4P"; - default: return juce::String(idx); - } - } - - juce::String numToFilter2Mode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "LowPass"; - case 1: return "HighPass"; - case 2: return "BandPass"; - case 3: return "BandStop"; - default: return juce::String(idx); - } - } - - juce::String numToFilterRouting(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Serial 4"; - case 1: return "Serial 6"; - case 2: return "Parallel 4"; - case 3: return "Split"; - default: return juce::String(idx); - } - } - - juce::String numToEnvSusTime(float idx, Parameter::Description) - { - // handles rounding due to continuous... - const auto ridx = juce::roundToInt(idx); - if (ridx == 64) - return "Fall"; - if (ridx == 0) - return "Infinite"; - if (ridx == 127) - return "Rise"; - return numTo7bitSigned(idx); - } - - juce::String numToLfoShape(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Sine"; - case 1: return "Triangle"; - case 2: return "Saw"; - case 3: return "Square"; - case 4: return "S&H"; - case 5: return "S&G"; - case 6: return "Wave3"; - case 7: return "Wave4"; - case 8: return "Wave5"; - case 9: return "Wave6"; - case 10: return "Wave7"; - case 11: return "Wave8"; - case 12: return "Wave9"; - case 13: return "Wave10"; - case 14: return "Wave11"; - case 15: return "Wave12"; - case 16: return "Wave13"; - case 17: return "Wave14"; - case 18: return "Wave15"; - case 19: return "Wave16"; - case 20: return "Wave17"; - case 21: return "Wave18"; - case 22: return "Wave19"; - case 23: return "Wave20"; - case 24: return "Wave21"; - case 25: return "Wave22"; - case 26: return "Wave23"; - case 27: return "Wave24"; - case 28: return "Wave25"; - case 29: return "Wave26"; - case 30: return "Wave27"; - case 31: return "Wave28"; - case 32: return "Wave29"; - case 33: return "Wave30"; - case 34: return "Wave31"; - case 35: return "Wave32"; - case 36: return "Wave33"; - case 37: return "Wave34"; - case 38: return "Wave35"; - case 39: return "Wave36"; - case 40: return "Wave37"; - case 41: return "Wave38"; - case 42: return "Wave39"; - case 43: return "Wave40"; - case 44: return "Wave41"; - case 45: return "Wave42"; - case 46: return "Wave43"; - case 47: return "Wave44"; - case 48: return "Wave45"; - case 49: return "Wave46"; - case 50: return "Wave47"; - case 51: return "Wave48"; - case 52: return "Wave49"; - case 53: return "Wave50"; - case 54: return "Wave51"; - case 55: return "Wave52"; - case 56: return "Wave53"; - case 57: return "Wave54"; - case 58: return "Wave55"; - case 59: return "Wave56"; - case 60: return "Wave57"; - case 61: return "Wave58"; - case 62: return "Wave59"; - case 63: return "Wave60"; - case 64: return "Wave61"; - case 65: return "Wave62"; - case 66: return "Wave63"; - case 67: return "Wave64"; - default: return juce::String(idx); - } - } - juce::String numToDelayLfoShape(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Sine"; - case 1: return "Triangle"; - case 2: return "Saw"; - case 3: return "Square"; - case 4: return "S&H"; - case 5: return "S&G"; - default: return juce::String(""); - } - } - juce::String numToOsc3Mode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Slave"; - case 2: return "Saw"; - case 3: return "Pulse"; - case 4: return "Sine"; - case 5: return "Triangle"; - case 6: return "Wave3"; - case 7: return "Wave4"; - case 8: return "Wave5"; - case 9: return "Wave6"; - case 10: return "Wave7"; - case 11: return "Wave8"; - case 12: return "Wave9"; - case 13: return "Wave10"; - case 14: return "Wave11"; - case 15: return "Wave12"; - case 16: return "Wave13"; - case 17: return "Wave14"; - case 18: return "Wave15"; - case 19: return "Wave16"; - case 20: return "Wave17"; - case 21: return "Wave18"; - case 22: return "Wave19"; - case 23: return "Wave20"; - case 24: return "Wave21"; - case 25: return "Wave22"; - case 26: return "Wave23"; - case 27: return "Wave24"; - case 28: return "Wave25"; - case 29: return "Wave26"; - case 30: return "Wave27"; - case 31: return "Wave28"; - case 32: return "Wave29"; - case 33: return "Wave30"; - case 34: return "Wave31"; - case 35: return "Wave32"; - case 36: return "Wave33"; - case 37: return "Wave34"; - case 38: return "Wave35"; - case 39: return "Wave36"; - case 40: return "Wave37"; - case 41: return "Wave38"; - case 42: return "Wave39"; - case 43: return "Wave40"; - case 44: return "Wave41"; - case 45: return "Wave42"; - case 46: return "Wave43"; - case 47: return "Wave44"; - case 48: return "Wave45"; - case 49: return "Wave46"; - case 50: return "Wave47"; - case 51: return "Wave48"; - case 52: return "Wave49"; - case 53: return "Wave50"; - case 54: return "Wave51"; - case 55: return "Wave52"; - case 56: return "Wave53"; - case 57: return "Wave54"; - case 58: return "Wave55"; - case 59: return "Wave56"; - case 60: return "Wave57"; - case 61: return "Wave58"; - case 62: return "Wave59"; - case 63: return "Wave60"; - case 64: return "Wave61"; - case 65: return "Wave62"; - case 66: return "Wave63"; - case 67: return "Wave64"; - default: return juce::String(idx); - } - } - - juce::String numToLfoMode(float v, Parameter::Description) { return juce::roundToInt(v) == 0 ? "Poly" : "Mono"; } - - juce::String numToKeyMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Poly"; - case 1: return "Mono 1"; - case 2: return "Mono 2"; - case 3: return "Mono 3"; - case 4: return "Mono 4"; - case 5: return "Hold"; - default: return juce::String(idx); - } - } - - juce::String numToInputMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Dynamic"; - case 2: return "Static"; - case 3: return "To Effects"; - default: return juce::String(idx); - } - } - - juce::String numToInputSelect(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "IN L"; - case 1: return "IN L+R"; - case 2: return "IN R"; - case 3: return "AUX 1 L"; - case 4: return "AUX 1 L+R"; - case 5: return "AUX 1 R"; - case 6: return "AUX 2 L"; - case 7: return "AUX 2 L+R"; - case 8: return "AUX 2 R"; - default: return juce::String(idx); - } - } - - juce::String numToOutputSelect(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "OUT 1 L"; - case 1: return "OUT 1 L+R"; - case 2: return "OUT 1 R"; -/* case 3: return "OUT 2 L"; - case 4: return "OUT 2 L+R"; - case 5: return "OUT 2 R"; - case 6: return "OUT 3 L"; - case 7: return "OUT 3 L+R"; - case 8: return "OUT 3 R";*/ - case 9: return "AUX 1 L"; - case 10: return "AUX 1 L+R"; - case 11: return "AUX 1 R"; - case 12: return "AUX 2 L"; - case 13: return "AUX 2 L+R"; - case 14: return "AUX 2 R"; - default: return juce::String(""); - } - } - - juce::String numToDelayReverbMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Delay"; - case 2: return "Reverb"; - case 3: return "Reverb + Feedback 1"; - case 4: return "Reverb + Feedback 2"; - case 5: return "Delay2:1"; - case 6: return "Delay4:3"; - case 7: return "Delay4:1"; - case 8: return "Delay8:7"; - case 9: return "Pattern1+1"; - case 10: return "Pattern2+1"; - case 11: return "Pattern3+1"; - case 12: return "Pattern4+1"; - case 13: return "Pattern5+1"; - case 14: return "Pattern2+3"; - case 15: return "Pattern2+5"; - case 16: return "Pattern3+2"; - case 17: return "Pattern3+3"; - case 18: return "Pattern3+4"; - case 19: return "Pattern3+5"; - case 20: return "Pattern4+3"; - case 21: return "Pattern4+5"; - case 22: return "Pattern5+2"; - case 23: return "Pattern5+3"; - case 24: return "Pattern5+4"; - case 25: return "Pattern5+5"; - case 26: return "Pattern X+Y"; - default: return juce::String(idx); - } - } - - juce::String numToArpMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Up"; - case 2: return "Down"; - case 3: return "Up&Down"; - case 4: return "As Played"; - case 5: return "Random"; - case 6: return "Chord"; - default: return juce::String(idx); - } - } - - juce::String numToLfoDest(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Osc1"; - case 1: return "Osc1+2"; - case 2: return "Osc2"; - case 3: return "PW1"; - case 4: return "PW1+2"; - case 5: return "PW2"; - default: return juce::String(idx); - } - } - - juce::String numToArpSwing(float idx, Parameter::Description) - { - return juce::String(juce::roundToInt(50 + (75 - 50) * (idx / 127))) + "%"; - } - - juce::String numToNumPlusOne(float idx, Parameter::Description) - { - return juce::String(juce::roundToInt(idx + 1)); - } - - juce::String numToClockTempo(float idx, Parameter::Description) - { - return juce::String(juce::roundToInt(63 + (190 - 63) * (idx / 127))) + "BPM"; - } - - juce::String numToControlSmoothMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "On"; - case 2: return "Auto"; - case 3: return "Note"; - default: return juce::String(idx); - } - } - - juce::String numToNegPos(float v, Parameter::Description) - { - return juce::roundToInt(v) == 0 ? "Negative" : "Positive"; - } - - juce::String numToLinExp(float v, Parameter::Description) - { - return juce::roundToInt(v) == 0 ? "Linear" : "Exponential"; - } - - juce::String numToModMatrixSource(float v, Parameter::Description) - { - const auto ridx = juce::roundToInt(v); - switch (ridx) - { - case 0: return "Off"; - case 1: return "PitchBnd"; - case 2: return "ChanPres"; - case 3: return "ModWheel"; - case 4: return "Breath"; - case 5: return "Contr3"; - case 6: return "Foot"; - case 7: return "Data"; - case 8: return "Balance"; - case 9: return "Contr 9"; - case 10: return "Express"; - case 11: return "Contr 12"; - case 12: return "Contr 13"; - case 13: return "Contr 14"; - case 14: return "Contr 15"; - case 15: return "Contr 16"; - case 16: return "HoldPed"; - case 17: return "PortaSw"; - case 18: return "SostPed"; - case 19: return "AmpEnv"; - case 20: return "FiltEnv"; - case 21: return "Lfo 1"; - case 22: return "Lfo 2"; - case 23: return "Lfo 3"; - case 24: return "VeloOn"; - case 25: return "VeloOff"; - case 26: return "KeyFlw"; - case 27: return "Random"; - default: return juce::String(v); - } - } - - juce::String numToModMatrixDest(float v, Parameter::Description) - { - const auto ridx = juce::roundToInt(v); - switch (ridx) - { - case 0: return "Off"; - case 1: return "PatchVol"; - case 2: return "ChannelVol"; - case 3: return "Panorama"; - case 4: return "Transpose"; - case 5: return "Portamento"; - case 6: return "Osc1Shape"; - case 7: return "Osc1PlsWdh"; - case 8: return "Osc1WavSel"; - case 9: return "Osc1Pitch"; - case 10: return "Osc1Keyflw"; - case 11: return "Osc2Shape"; - case 12: return "Osc2PlsWdh"; - case 13: return "Osc2WavSel"; - case 14: return "Osc2Pitch"; - case 15: return "Osc2Detune"; - case 16: return "Osc2FmAmt"; - case 17: return "Osc2EnvAmt"; - case 18: return "FmEnvAmt"; - case 19: return "Osc2Keyflw"; - case 20: return "OscBalance"; - case 21: return "SubOscVol"; - case 22: return "OscMainVol"; - case 23: return "NoiseVol"; - case 24: return "Cutoff"; - case 25: return "Cutoff2"; - case 26: return "Filt1Reso"; - case 27: return "Filt2Reso"; - case 28: return "Flt1EnvAmt"; - case 29: return "Flt2EnvAmt"; - case 30: return "Flt1Keyflw"; - case 31: return "Flt2Keyflw"; - case 32: return "FltBalance"; - case 33: return "FltAttack"; - case 34: return "FltDecay"; - case 35: return "FltSustain"; - case 36: return "FltSusTime"; - case 37: return "FltRelease"; - case 38: return "AmpAttack"; - case 39: return "AmpDecay"; - case 40: return "AmpSustain"; - case 41: return "AmpSusTime"; - case 42: return "AmpRelease"; - case 43: return "Lfo1Rate"; - case 44: return "Lfo1Cont"; - case 45: return "Lfo1>Osc1"; - case 46: return "Lfo1>Osc2"; - case 47: return "Lfo1>PlsWd"; - case 48: return "Lfo1>Reso"; - case 49: return "Lfo1>FltGn"; - case 50: return "Lfo2Rate"; - case 51: return "Lfo2Cont"; - case 52: return "Lfo2>Shape"; - case 53: return "Lfo2>Fm"; - case 54: return "Lfo2>Cut1"; - case 55: return "Lfo2>Cut2"; - case 56: return "Lfo2>Pan"; - case 57: return "Lfo3Rate"; - case 58: return "Lfo3OscAmt"; - case 59: return "UniDetune"; - case 60: return "UniSpread"; - case 61: return "UniLfoPhs"; - case 62: return "ChorusMix"; - case 63: return "ChorusRate"; - case 64: return "ChorusDpth"; - case 65: return "ChorusDly"; - case 66: return "ChorusFeed"; - case 67: return "EffectSend"; - case 68: return "DelayTime"; - case 69: return "DelayFeed"; - case 70: return "DelayRate"; - case 71: return "DelayDepth"; - case 72: return "Osc1ShpVel"; - case 73: return "Osc2ShpVel"; - case 74: return "PlsWhdVel"; - case 75: return "FmAmtVel"; - case 76: return "Flt1EnvVel"; - case 77: return "Flt2EnvVel"; - case 78: return "Reso1Vel"; - case 79: return "Reso2Vel"; - case 80: return "AmpVel"; - case 81: return "PanVel"; - case 82: return "Ass1Amt1"; - case 83: return "Ass2Amt1"; - case 84: return "Ass2Amt2"; - case 85: return "Ass3Amt1"; - case 86: return "Ass3Amt2"; - case 87: return "Ass3Amt3"; - case 88: return "OscInitPhs"; - case 89: return "PunchInt"; - case 90: return "RingMod"; - case 91: return "NoiseColor"; - case 92: return "DelayColor"; - case 93: return "ABoostInt"; - case 94: return "ABoostTune"; - case 95: return "DistInt"; - case 96: return "RingmodMix"; - case 97: return "Osc3Volume"; - case 98: return "Osc3Semi"; - case 99: return "Osc3Detune"; - case 100: return "Lfo1AssAmt"; - case 101: return "Lfo2AssAmt"; - case 102: return "PhaserMix"; - case 103: return "PhaserRate"; - case 104: return "PhaserDept"; - case 105: return "PhaserFreq"; - case 106: return "PhaserFdbk"; - case 107: return "PhaserSprd"; - case 108: return "RevbDecay"; - case 109: return "RevDamping"; - case 110: return "RevbColor"; - case 111: return "RevPredely"; - case 112: return "RevFeedbck"; - case 113: return "SecBalance"; - case 114: return "ArpNoteLen"; - case 115: return "ArpSwing"; - case 116: return "ArpPattern"; - case 117: return "EqMidGain"; - case 118: return "EqMidFreq"; - case 119: return "EqMidQFactor"; - case 120: return "Assign4Amt"; - case 121: return "Assign5Amt"; - case 122: return "Assign6Amt"; - default: return juce::String(v); - } - } - - juce::String numToSoftKnobDest(float v, Parameter::Description) - { - const auto ridx = juce::roundToInt(v); - switch (ridx) - { - case 0: return "Off"; - case 1: return "ModWheel"; - case 2: return "Breath"; - case 3: return "Contr3"; - case 4: return "Foot"; - case 5: return "Data"; - case 6: return "Balance"; - case 7: return "Contr9"; - case 8: return "Expression"; - case 9: return "Contr12"; - case 10: return "Contr13"; - case 11: return "Contr14"; - case 12: return "Contr15"; - case 13: return "Contr16"; - case 14: return "PatchVolume"; - case 15: return "ChannelVolume"; - case 16: return "Panorama"; - case 17: return "Transpose"; - case 18: return "Portamento"; - case 19: return "UnisonDetune"; - case 20: return "UnisonPanSprd"; - case 21: return "UnisoLfoPhase"; - case 22: return "ChorusMix"; - case 23: return "ChorusRate"; - case 24: return "ChorusDepth"; - case 25: return "ChorusDelay"; - case 26: return "ChorusFeedback"; - case 27: return "EffectSend"; - case 28: return "DelayTime(ms)"; - case 29: return "DelayFeedback"; - case 30: return "DelayRate"; - case 31: return "DelayDepth"; - case 32: return "Osc1WavSelect"; - case 33: return "Osc1PulseWidth"; - case 34: return "Osc1Semitone"; - case 35: return "Osc1Keyfollow"; - case 36: return "Osc2WavSelect"; - case 37: return "Os2PulseWidth"; - case 38: return "Osc2EnvAmount"; - case 39: return "FmEnvAmount"; - case 40: return "Osc2Keyfollow"; - case 41: return "NoiseVolume"; - case 42: return "Filt1Resonance"; - case 43: return "Filt2Resonance"; - case 44: return "Filt1EnvAmount"; - case 45: return "Filt2EnvAmount"; - case 46: return "Filt1Keyfollow"; - case 47: return "Filt2Keyfollow"; - case 48: return "Lfo1Symmetry"; - case 49: return "Lfo1>Osc1"; - case 50: return "Lfo1>Osc2"; - case 51: return "Lfo1>PulsWidth"; - case 52: return "Lfo1>Resonance"; - case 53: return "Lfo1>FiltGain"; - case 54: return "Lfo2Symmetry"; - case 55: return "Lfo2>Shape"; - case 56: return "Lfo2>FmAmount"; - case 57: return "Lfo2>Cutoff1"; - case 58: return "Lfo2>Cutoff2"; - case 59: return "Lfo2>Panorama"; - case 60: return "Lfo3Rate"; - case 61: return "Lfo3OscAmount"; - case 62: return "Osc1ShapeVel"; - case 63: return "Osc2ShapeVel"; - case 64: return "PulsWidthVel"; - case 65: return "FmAmountVel"; - case 66: return "Filt1EnvVel"; - case 67: return "Filt2EnvVel"; - case 68: return "Resonance1Vel"; - case 69: return "Resonance2Vel"; - case 70: return "AmplifierVel"; - case 71: return "PanoramaVel"; - case 72: return "Assign1Amt1"; - case 73: return "Assign2Amt1"; - case 74: return "Assign2Amt2"; - case 75: return "Assign3Amt1"; - case 76: return "Assign3Amt2"; - case 77: return "Assign3Amt3"; - case 78: return "ClockTempo"; - case 79: return "InputThru"; - case 80: return "OscInitPhase"; - case 81: return "PunchIntensity"; - case 82: return "Ringmodulator"; - case 83: return "NoiseColor"; - case 84: return "DelayColor"; - case 85: return "AnalogBoostInt"; - case 86: return "AnalogBstTune"; - case 87: return "DistortionInt"; - case 88: return "RingModMix"; - case 89: return "Osc3Volume"; - case 90: return "Osc3Semitone"; - case 91: return "Osc3Detune"; - case 92: return "Lfo1AssignAmt"; - case 93: return "Lfo2AssignAmt"; - case 94: return "PhaserMix"; - case 95: return "PhaserRate"; - case 96: return "PhaserDepth"; - case 97: return "PhaserFrequency"; - case 98: return "PhaserFeedback"; - case 99: return "PhaserSpread"; - case 100: return "RevDecayTime"; - case 101: return "ReverbDamping"; - case 102: return "ReverbColor"; - case 103: return "ReverbFeedback"; - case 104: return "SecondBalance"; - case 105: return "ArpMode"; - case 106: return "ArpPattern"; - case 107: return "ArpClock"; - case 108: return "ArpNoteLength"; - case 109: return "ArpSwing"; - case 110: return "ArpOctaves"; - case 111: return "ArpHold"; - case 112: return "EqMidGain"; - case 113: return "EqMidFreq"; - case 114: return "EqMidQFactor"; - case 115: return "Assign4Amt"; - case 116: return "Assign5Amt"; - case 117: return "Assign6Amt"; - default: return juce::String(v); - } - } - - juce::String numToSoftKnobName(float idx, Parameter::Description) { - const char *softKnobNames[] = {"~Para","+3rds","+4ths","+5ths", - "+7ths","+Octave","Access","ArpMode","ArpOct","Attack", - "Balance","Chorus","Cutoff","Decay","Delay","Depth", - "Destroy","Detune","Disolve","Distort","Dive","Effects", - "Elevate","Energy","EqHigh","EqLow","EqMid","Fast","Fear", - "Filter","FM","Glide","Hold","Hype","Infect","Length","Mix", - "Morph","Mutate","Noise","Open","Orbit","Pan","Phaser","Phatter", - "Pitch","Pulsate","Push","PWM","Rate","Release","Reso","Reverb", - "Scream","Shape","Sharpen","Slow","Soften","Speed","SubOsc", - "Sustain","Sweep","Swing","Tempo","Thinner","Tone","Tremolo", - "Vibrato","WahWah","Warmth","Warp","Width"}; - const auto ridx = juce::roundToInt(idx); - if (ridx < sizeof(softKnobNames)-1) { - return softKnobNames[ridx]; - } - return juce::String(idx); - } - - juce::String numToUnisonMode(float v, Parameter::Description) - { - const auto ridx = juce::roundToInt(v); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Twin"; - case 2: return "3"; - case 3: return "4"; - case 4: return "5"; - case 5: return "6"; - case 6: return "7"; - case 7: return "8"; - case 8: return "9"; - case 9: return "10"; - case 10: return "11"; - case 11: return "12"; - case 12: return "13"; - case 13: return "14"; - case 14: return "15"; - case 15: return "16"; - default: return juce::String(v); - } - } - - juce::String filterKeytrackBase(float v, Parameter::Description) - { - const auto ridx = juce::roundToInt(v); - switch (ridx) - { - case 0: return "C-1"; - case 1: return "C#-1"; - case 2: return "D-1"; - case 3: return "D#-1"; - case 4: return "E-1"; - case 5: return "F-1"; - case 6: return "F#-1"; - case 7: return "G-1"; - case 8: return "G#-1"; - case 9: return "A-1"; - case 10: return "A#-1"; - case 11: return "B-1"; - case 12: return "C0"; - case 13: return "C#0"; - case 14: return "D0"; - case 15: return "D#0"; - case 16: return "E0"; - case 17: return "F0"; - case 18: return "F#0"; - case 19: return "G0"; - case 20: return "G#0"; - case 21: return "A0"; - case 22: return "A#0"; - case 23: return "B0"; - case 24: return "C1"; - case 25: return "C#1"; - case 26: return "D1"; - case 27: return "D#1"; - case 28: return "E1"; - case 29: return "F1"; - case 30: return "F#1"; - case 31: return "G1"; - case 32: return "G#1"; - case 33: return "A1"; - case 34: return "A#1"; - case 35: return "B1"; - case 36: return "C2"; - case 37: return "C#2"; - case 38: return "D2"; - case 39: return "D#2"; - case 40: return "E2"; - case 41: return "F2"; - case 42: return "F#2"; - case 43: return "G2"; - case 44: return "G#2"; - case 45: return "A2"; - case 46: return "A#2"; - case 47: return "B2"; - case 48: return "C3"; - case 49: return "C#3"; - case 50: return "D3"; - case 51: return "D#3"; - case 52: return "E3"; - case 53: return "F3"; - case 54: return "F#3"; - case 55: return "G3"; - case 56: return "G#3"; - case 57: return "A3"; - case 58: return "A#3"; - case 59: return "B3"; - case 60: return "C4"; - case 61: return "C#4"; - case 62: return "D4"; - case 63: return "D#4"; - case 64: return "E4"; - case 65: return "F4"; - case 66: return "F#4"; - case 67: return "G4"; - case 68: return "G#4"; - case 69: return "A4"; - case 70: return "A#4"; - case 71: return "B4"; - case 72: return "C5"; - case 73: return "C#5"; - case 74: return "D5"; - case 75: return "D#5"; - case 76: return "E5"; - case 77: return "F5"; - case 78: return "F#5"; - case 79: return "G5"; - case 80: return "G#5"; - case 81: return "A5"; - case 82: return "A#5"; - case 83: return "B5"; - case 84: return "C6"; - case 85: return "C#6"; - case 86: return "D6"; - case 87: return "D#6"; - case 88: return "E6"; - case 89: return "F6"; - case 90: return "F#6"; - case 91: return "G6"; - case 92: return "G#6"; - case 93: return "A6"; - case 94: return "A#6"; - case 95: return "B6"; - case 96: return "C7"; - case 97: return "C#7"; - case 98: return "D7"; - case 99: return "D#7"; - case 100: return "E7"; - case 101: return "F7"; - case 102: return "F#7"; - case 103: return "G7"; - case 104: return "G#7"; - case 105: return "A7"; - case 106: return "A#7"; - case 107: return "B7"; - case 108: return "C8"; - case 109: return "C#8"; - case 110: return "D8"; - case 111: return "D#8"; - case 112: return "E8"; - case 113: return "F8"; - case 114: return "F#8"; - case 115: return "G8"; - case 116: return "G#8"; - case 117: return "A8"; - case 118: return "A#8"; - case 119: return "B8"; - case 120: return "C9"; - case 121: return "C#9"; - case 122: return "D9"; - case 123: return"D#9"; - case 124: return "E9"; - case 125: return "F9"; - case 126: return "F#9"; - case 127: return "G9"; - default: return juce::String(v); - } - } - - juce::String numToOscFmMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Pos-Tri"; - case 1: return "Tri"; - case 2: return "Wave"; - case 3: return "Noise"; - case 4: return "In L"; - case 5: return "In L+R"; - case 6: return "In R"; - case 7: return "Aux1 L"; - case 8: return "Aux1 L+R"; - case 9: return "Aux1 R"; - case 10: return "Aux2 L"; - case 11: return "Aux2 L+R"; - case 12: return "Aux2 R"; - default: return juce::String(idx); - } - } - - juce::String numToVocoderMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "Oscillator"; - case 2: return "Osc Hold"; - case 3: return "Noise"; - case 4: return "In L"; - case 5: return "In L+R"; - case 6: return "In R"; - case 7: return "Aux1 L"; - case 8: return "Aux1 L+R"; - case 9: return "Aux1 R"; - case 10: return "Aux2 L"; - case 11: return "Aux2 L+R"; - case 12: return "Aux2 R"; - default: return juce::String(idx); - } - } - - juce::String numToInputFollowerMode(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "In L"; - case 2: return "In L+R"; - case 3: return "In R"; - case 4: return "Aux1 L"; - case 5: return "Aux1 L+R"; - case 6: return "Aux1 R"; - case 7: return "Aux2 L"; - case 8: return "Aux2 L+R"; - case 9: return "Aux2 R"; - default: return juce::String(idx); - } - } - - juce::String numToMusicDivision(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Off"; - case 1: return "1/64"; - case 2: return "1/32"; - case 3: return "1/16"; - case 4: return "1/8"; - case 5: return "1/4"; - case 6: return "1/2"; - case 7: return "3/64"; - case 8: return "3/32"; - case 9: return "3/16"; - case 10: return "3/8"; - case 11: return "1/24"; - case 12: return "1/12"; - case 13: return "1/6"; - case 14: return "1/3"; - case 15: return "2/3"; - case 16: return "3/4"; - case 17: return "1/1"; - case 18: return "2/1"; - case 19: return "4/1"; - case 20: return "8/1"; - case 21: return "16/1"; - default: return juce::String(idx); - } - } - - juce::String numToPhaserMode(float v, Parameter::Description) - { - const auto ridx = juce::roundToInt(v); - switch (ridx) - { - case 0: return ""; - case 1: return "1 Stage"; - case 2: return "2 Stages"; - case 3: return "3 Stages"; - case 4: return "4 Stages"; - case 5: return "5 Stages"; - case 6: return "6 Stages"; - default: return juce::String(v); - } - } - - juce::String numToFilterSelect(float idx, Parameter::Description) - { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 0: return "Filter 1"; - case 1: return "Filter 2"; - case 2: return "Filter 1+2"; - default: return juce::String(idx); - } - } - - juce::String numToCategory(float idx, Parameter::Description) - { - const juce::Array<juce::String> categories = {"--", "Lead", "Bass", "Pad", "Decay", "Pluck", - "Acid", "Classic", "Arpeggiator", "Effects", "Drums", "Percussion", - "Input", "Vocoder", "Favourite 1", "Favourite 2", "Favourite 3"}; - - const auto ridx = juce::roundToInt(idx); - if(ridx < categories.size()) - return categories[ridx]; - return "Undefined"; - } - - juce::String numToBendRange(float idx, Parameter::Description) { - const auto ridx = juce::roundToInt(idx); - switch (ridx) - { - case 40: return "-2oct"; - case 52: return "-1oct"; - case 57: return "-7st"; - case 58: return "-6st"; - case 59: return "-5st"; - case 60: return "-4st"; - case 61: return "-3st"; - case 62: return "-2st"; - case 63: return "-1st"; - case 64: return "None"; - case 65: return "+1st"; - case 66: return "+2st"; - case 67: return "+3st"; - case 68: return "+4st"; - case 69: return "+5st"; - case 70: return "+6st"; - case 71: return "+7st"; - case 76: return "+1oct"; - case 88: return "+2oct"; - default: return juce::String(""); - } - } - juce::String numToReverbRoomSize(float idx, Parameter::Description) { - const auto ridx = juce::roundToInt(idx); - - switch (ridx) { - case 0: return "Ambience"; - case 1: return "Small Room"; - case 2: return "Large Room"; - case 3: return "Hall"; - default: return juce::String(""); - } - } - - const std::initializer_list<Parameter::Description> Controller::m_paramsDescription = -{ - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 0, "Bank Select", {0, 3 + 26}, numToBank, {}, false, true, false}, // The Virus TI contains 4 banks of RAM, followed by 26 banks of ROM - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 1, "Modulation Wheel", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 2, "Breath Controller", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 3, "Contr 3", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 4, "Foot Controller", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 5, "Portamento Time", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 6, "Data Slider", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 7, "Channel Volume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 8, "Balance", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 9, "Contr 9", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 10, "Panorama", {0,127}, numToPan,{}, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 11, "Expression", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 12, "Contr 12", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 13, "Contr 13", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 14, "Contr 14", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 15, "Contr 15", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 16, "Contr 16", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 17, "Osc1 Shape", {0,127}, numToOscShape,{}, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 18, "Osc1 Pulsewidth", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 19, "Osc1 Wave Select", {0,63}, numToOscWaveSelect, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 20, "Osc1 Semitone", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 21, "Osc1 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 22, "Osc2 Shape", {0,127}, numToOscShape, {}, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 23, "Osc2 Pulsewidth", {0,127}, {}, {}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 24, "Osc2 Wave Select", {0,63}, numToOscWaveSelect,{}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 25, "Osc2 Semitone", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 26, "Osc2 Detune", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 27, "Osc2 FM Amount", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 28, "Osc2 Sync", {0,1}, {},{}, true, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 29, "Osc2 Filt Env Amt", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 30, "FM Filt Env Amt", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 31, "Osc2 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 32, "Bank Select", {0, 3 + 26}, numToBank,{}, false, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 33, "Osc Balance", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 34, "Suboscillator Volume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 35, "Suboscillator Shape", {0,1}, [](float v, Parameter::Description){ return juce::roundToInt(v) == 0 ? "Square" : "Triangle"; },{}, true, true, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 36, "Osc Mainvolume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 37, "Noise Volume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 38, "Ringmodulator Volume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::VIRUS_C, 39, "Noise Color", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 40, "Cutoff", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 41, "Cutoff2", {0,127}, {},{}, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 42, "Filter1 Resonance", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 43, "Filter2 Resonance", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 44, "Filter1 Env Amt", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 45, "Filter2 Env Amt", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 46, "Filter1 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 47, "Filter2 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 48, "Filter Balance", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 49, "Saturation Curve", {0,14}, numToSatCurv, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 51, "Filter1 Mode", {0,7}, numToFilterMode, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 52, "Filter2 Mode", {0,3}, numToFilter2Mode, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 53, "Filter Routing", {0,3}, numToFilterRouting, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 54, "Filter Env Attack", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 55, "Filter Env Decay", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 56, "Filter Env Sustain", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 57, "Filter Env Sustain Time", {0,127}, numToEnvSusTime, {}, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 58, "Filter Env Release", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 59, "Amp Env Attack", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 60, "Amp Env Decay", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 61, "Amp Env Sustain", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 62, "Amp Env Sustain Time", {0,127}, numToEnvSusTime, {}, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 63, "Amp Env Release", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 64, "Hold Pedal", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 65, "Portamento Pedal", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 66, "Sostenuto Pedal", {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 67, "Lfo1 Rate", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 68, "Lfo1 Shape", {0,67}, numToLfoShape, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 69, "Lfo1 Env Mode", {0,1}, {},{}, true, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 70, "Lfo1 Mode", {0,1}, numToLfoMode, {}, true, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 71, "Lfo1 Symmetry", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 72, "Lfo1 Keyfollow", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 73, "Lfo1 Keytrigger", {0,127}, {}, {}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 74, "Osc1 Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 75, "Osc2 Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 76, "PW Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 77, "Reso Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 78, "FiltGain Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 79, "Lfo2 Rate", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 80, "Lfo2 Shape", {0,67}, numToLfoShape,{}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 81, "Lfo2 Env Mode", {0,1}, {},{}, true, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 82, "Lfo2 Mode", {0,1}, numToLfoMode, {}, true, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 83, "Lfo2 Symmetry", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 84, "Lfo2 Keyfollow", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 85, "Lfo2 Keytrigger", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 86, "Shape Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 87, "FM Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 88, "Cutoff1 Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 89, "Cutoff2 Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 90, "Pan Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 91, "Patch Volume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 93, "Transpose", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 94, "Key Mode", {0,5}, numToKeyMode, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 97, "Unison Mode", {0,15}, numToUnisonMode, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 98, "Unison Detune", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 99, "Unison Pan Spread", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 100, "Unison Lfo Phase", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 101, "Input Mode", {0,3}, numToInputMode, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 102, "Input Select", {0,8}, numToInputSelect,{}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 105, "Chorus Mix", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 106, "Chorus Rate", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 107, "Chorus Depth", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 108, "Chorus Delay", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 109, "Chorus Feedback", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 110, "Chorus Lfo Shape", {0,67}, numToLfoShape, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE, 112, "Delay/Reverb Mode", {0,26}, numToDelayReverbMode, {}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE, 113, "Effect Send", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 114, "Delay Time", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 115, "Delay Feedback", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 116, "Dly Rate / Rev Decay", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 117, "Dly Depth / Rev Size", {0,127}, numToReverbRoomSize,{}, true, true, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 118, "Delay Lfo Shape", {0,127}, numToDelayLfoShape, {}, true, true, false}, -// {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 118, "Reverb Damping", {0,127}, {},{}, true, false, false}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 119, "Delay Color", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 122, "Keyb Local", {0,1}, {},{}, false, false, true}, - {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 123, "All Notes Off", {0,127}, {},{}, false, false, false}, - - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 1, "Arp Mode", {0,6}, numToArpMode, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 2, "Arp Pattern Selct", {0,63}, numToNumPlusOne, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 3, "Arp Octave Range", {0,3}, numToNumPlusOne,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 4, "Arp Hold Enable", {0,1}, {},{}, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 5, "Arp Note Length", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 6, "Arp Swing", {0,127}, numToArpSwing, {}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 7, "Lfo3 Rate", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 8, "Lfo3 Shape", {0,67}, numToLfoShape, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 9, "Lfo3 Mode", {0,1}, numToLfoMode, {}, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 10, "Lfo3 Keyfollow", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 11, "Lfo3 Destination", {0,5}, numToLfoDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 12, "Osc Lfo3 Amount", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 13, "Lfo3 Fade-In Time", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 16, "Clock Tempo", {0,127}, numToClockTempo, {}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 17, "Arp Clock", {0,17}, numToMusicDivision, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 18, "Lfo1 Clock", {0,21}, numToMusicDivision, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 19, "Lfo2 Clock", {0,21}, numToMusicDivision, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 20, "Delay Clock", {0,16}, numToMusicDivision, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 21, "Lfo3 Clock", {0,21}, numToMusicDivision, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 25, "Control Smooth Mode", {0,3}, numToControlSmoothMode,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 26, "Bender Range Up", {0,127}, numToBendRange, {}, true, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 27, "Bender Range Down", {0,127}, numToBendRange, {}, true, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 28, "Bender Scale", {0,1}, numToLinExp, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 30, "Filter1 Env Polarity", {0,1}, numToNegPos, {}, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 31, "Filter1 Env Polarity", {0,1}, numToNegPos, {}, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 32, "Filter2 Cutoff Link", {0,1}, {},{}, true, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 33, "Filter Keytrack Base", {0,127}, filterKeytrackBase,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 34, "Osc FM Mode", {0,12}, numToOscFmMode,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 35, "Osc Init Phase", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 36, "Punch Intensity", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 38, "Input Follower Mode", {0,9}, numToInputFollowerMode, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 39, "Vocoder Mode", {0,12}, numToVocoderMode,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 41, "Osc3 Mode", {0,67}, numToOsc3Mode,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 42, "Osc3 Volume", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 43, "Osc3 Semitone", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 44, "Osc3 Detune", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 45, "LowEQ Frequency", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 46, "HighEQ Frequency", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 47, "Osc1 Shape Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 48, "Osc2 Shape Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 49, "PulseWidth Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 50, "Fm Amount Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 51, "Soft Knob1 ShortName", {0,71}, numToSoftKnobName,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 52, "Soft Knob2 ShortName", {0,71}, numToSoftKnobName,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 54, "Flt1 EnvAmt Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 55, "Flt2 EnvAmt Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 56, "Resonance1 Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 57, "Resonance2 Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 58, "Second Output Balance", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 60, "Amp Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 61, "Panorama Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 62, "Soft Knob-1 Single", {0,117}, numToSoftKnobDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 63, "Soft Knob-2 Single", {0,117}, numToSoftKnobDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 64, "Assign1 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 65, "Assign1 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 66, "Assign1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 67, "Assign2 Source", {0,27}, numToModMatrixSource,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 68, "Assign2 Destination1", {0,122}, numToModMatrixDest,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 69, "Assign2 Amount1", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 70, "Assign2 Destination2", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 71, "Assign2 Amount2", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 72, "Assign3 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 73, "Assign3 Destination1", {0,122}, numToModMatrixDest,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 74, "Assign3 Amount1", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 75, "Assign3 Destination2", {0,122}, numToModMatrixDest,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 76, "Assign3 Amount2", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 77, "Assign3 Destination3", {0,122}, numToModMatrixDest,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 78, "Assign3 Amount3", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 79, "LFO1 Assign Dest", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 80, "LFO1 Assign Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 81, "LFO2 Assign Dest", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 82, "LFO2 Assign Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 84, "Phaser Mode", {0,6}, numToPhaserMode, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 85, "Phaser Mix", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 86, "Phaser Rate", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 87, "Phaser Depth", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 88, "Phaser Frequency", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 89, "Phaser Feedback", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 90, "Phaser Spread", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 92, "MidEQ Gain", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 93, "MidEQ Frequency", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 94, "MidEQ Q-Factor", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 95, "LowEQ Gain", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 96, "HighEQ Gain", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 97, "Bass Intensity", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 98, "Bass Tune", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 99, "Input Ringmodulator", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 100, "Distortion Curve", {0,11}, numToDistortionCurv,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 101, "Distortion Intensity", {0,127}, {},{}, true, false, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 103, "Assign 4 Source", {0,27}, numToModMatrixSource,{}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 104, "Assign 4 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 105, "Assign 4 Amount", {0,127}, {},{}, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 106, "Assign 5 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 107, "Assign 5 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 108, "Assign 5 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 109, "Assign 6 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 110, "Assign 6 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 111, "Assign 6 Amount", {0,127}, paramTo7bitSigned, {}, true, false, false, true}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B|Parameter::Class::VIRUS_C, 122, "Filter Select", {0,2}, numToFilterSelect, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 123, "Category1", {0,16}, numToCategory, {}, true, true, false}, - {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 124, "Category2", {0,16}, numToCategory, {}, true, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM|Parameter::Class::NON_PART_SENSITIVE, 22, "Delay Output Select", {0,14}, numToOutputSelect, {}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM|Parameter::Class::BANK_PROGRAM_CHANGE_PARAM_BANK_SELECT, 31, "Part Bank Select", {0, 3 + 26}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM|Parameter::Class::BANK_PROGRAM_CHANGE_PARAM_BANK_SELECT, 32, "Part Bank Change", {0, 3 + 26}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM|Parameter::Class::BANK_PROGRAM_CHANGE_PARAM_BANK_SELECT, 33, "Part Program Change", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 34, "Part Midi Channel", {0,15}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 35, "Part Low Key", {0,127}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 36, "Part High Key", {0,127}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 37, "Part Transpose", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 38, "Part Detune", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 39, "Part Volume", {0,127}, paramTo7bitSigned,textTo7bitSigned, true, false, false, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 40, "Part Midi Volume Init", {0,127}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 41, "Part Output Select", {0,14}, numToOutputSelect,{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 45, "Second Output Select", {0,15}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 63, "Keyb Transpose Buttons", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 64, "Keyb Local", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 65, "Keyb Mode", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 66, "Keyb Transpose", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 67, "Keyb ModWheel Contr", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 68, "Keyb Pedal 1 Contr", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 69, "Keyb Pedal 2 Contr", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 70, "Keyb Pressure Sens", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 72, "Part Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 73, "Part Midi Volume Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 74, "Part Hold Pedal Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 75, "Keyb To Midi", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 77, "Note Steal Priority", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 78, "Part Prog Change Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 85, "Glob Prog Change Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 86, "MultiProg Change Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 87, "Glob Midi Volume Enable", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 90, "Input Thru Level", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 91, "Input Boost", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 92, "Master Tune", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 93, "Device ID", {0,16}, {},{}, true, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 94, "Midi Control Low Page", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 95, "Midi Control High Page", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 96, "Midi Arpeggiator Send", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 97, "Knob Display", {0,3}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 98, "Midi Dump Tx", {0,4}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 99, "Midi Dump Rx", {0,4}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 105, "Multi Program Change", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 106, "Midi Clock Rx", {0,3}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 110, "Soft Knob-1 Mode", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 111, "Soft Knob-2 Mode", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 112, "Soft Knob-1 Global", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 113, "Soft Knob-2 Global", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 114, "Soft Knob-1 Midi", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 115, "Soft Knob-2 Midi", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 116, "Expert Mode", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 117, "Knob Mode", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 118, "Memory Protect", {0,1}, {},{}, false, false, true}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 120, "Soft Thru", {0,1}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 121, "Panel Destination", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 122, "Play Mode", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 123, "Part Number", {0,127}, {},{}, false, true, false}, // 0..15;40 - {Parameter::Page::C, Parameter::Class::GLOBAL, 124, "Global Channel", {0,15}, {},{}, true, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 125, "Led Mode", {0,2}, {},{}, false, true, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 126, "LCD Contrast", {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::GLOBAL, 127, "Master Volume", {0,127}, {},{}, false, false, false}, - - // UNDEFINED / UNUSED / STUBS - {Parameter::Page::A, Parameter::Class::UNDEFINED, 92, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 95, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 96, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 111, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 120, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 121, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 124, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 125, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 126, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::A, Parameter::Class::UNDEFINED, 127, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 0, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 14, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 15, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 22, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 23, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 24, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 29, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 37, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 40, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 53, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 69, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 83, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 91, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 111, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 123, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 124, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 0, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 1, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 2, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 3, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 4, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 15, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 16, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 17, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 18, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 19, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 20, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 21, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 23, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 24, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 25, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 26, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 27, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 28, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 29, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 30, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 76, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 79, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 80, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 81, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 82, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 83, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 84, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 88, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 89, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 100, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 101, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 102, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 103, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 104, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 119, {}, {0,127}, {},{}, false, false, false}, - // Text Chars / Unused - {Parameter::Page::B, Parameter::Class::UNDEFINED, 110, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 111, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 112, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 113, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 114, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 115, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 116, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 117, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 118, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 119, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 120, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::B, Parameter::Class::UNDEFINED, 121, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 5, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 6, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 7, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 8, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 9, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 10, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 11, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 12, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 13, {}, {0,127}, {},{}, false, false, false}, - {Parameter::Page::C, Parameter::Class::UNDEFINED, 14, {}, {0,127}, {},{}, false, false, false}, - // TODO: B51-52 shortname?!? B54-B55 (same name?!) -}; - uint8_t Controller::copyData(const SysEx &src, int startPos, std::array<uint8_t, kDataSizeInBytes>& dst) { uint8_t sum = 0; diff --git a/source/jucePlugin/VirusController.h b/source/jucePlugin/VirusController.h @@ -4,6 +4,7 @@ #include <juce_gui_extra/juce_gui_extra.h> #include "../synthLib/plugin.h" #include "VirusParameter.h" +#include "VirusParameterDescription.h" namespace virusLib { @@ -14,375 +15,6 @@ class AudioPluginAudioProcessor; namespace Virus { - enum ParameterType - { - Param_BankSelect, - Param_ModWheel, - Param_BreathControl, - Param_Control3, - Param_FootControl, - Param_PortamentoTime, - Param_Data, - Param_ChannelVolume, - Param_Balance, - Param_Control9, - Param_Panorama, - Param_Expression, - Param_Control12, - Param_Control13, - Param_Control14, - Param_Control15, - Param_Control16, - Param_Osc1Shape, - Param_Osc1PW, - Param_Osc1Wave, - Param_Osc1Semitone, - Param_Osc1Keyfollow, - Param_Osc2Shape, - Param_Osc2PW, - Param_Osc2Wave, - Param_Osc2Semitone, - Param_Osc2Detune, - Param_Osc2FMAmount, - Param_Osc2Sync, - Param_Osc2FltEnvAmt, - Param_FMFiltEnvAmt, - Param_Osc2Keyfollow, - Param_PerfControl_BankSelect, - Param_OscBalance, - Param_SubOscVolume, - Param_SubOscShape, - Param_OscMainVolume, - Param_NoiseVolume, - Param_RingModMVolume, - Param_NoiseColor, - Param_FilterCutA, - Param_FilterCutB, - Param_FilterResA, - Param_FilterResB, - Param_FilterEnvAmtA, - Param_FilterEnvAmtB, - Param_FilterKeyFollowA, - Param_FilterKeyFollowB, - Param_FilterBalance, - Param_SaturationCurve, - Param_FilterModeA, - Param_FilterModeB, - Param_FilterRouting, - Param_FilterEnvAttack, - Param_FilterEnvDecay, - Param_FilterEnvSustain, - Param_FilterEnvSustainTime, - Param_FilterEnvRelease, - Param_AmpEnvAttack, - Param_AmpEnvDecay, - Param_AmpEnvSustain, - Param_AmpEnvSustainTime, - Param_AmpEnvRelease, - Param_HoldPedal, - Param_PortamentoPedal, - Param_SostenutoPedal, - Param_Lfo1Rate, - Param_Lfo1Shape, - Param_Lfo1EnvMode, - Param_Lfo1Mode, - Param_Lfo1Symmetry, - Param_Lfo1Keyfollow, - Param_Lfo1KeyTrigger, - Param_Osc1Lfo1Amount, - Param_Osc2Lfo1Amount, - Param_PWLfo1Amount, - Param_ResoLfo1Amount, - Param_FltGainLfo1Amount, - Param_Lfo2Rate, - Param_Lfo2Shape, - Param_Lfo2EnvMode, - Param_Lfo2Mode, - Param_Lfo2Symmetry, - Param_Lfo2Keyfollow, - Param_Lfo2Keytrigger, - Param_OscShapeLfo2Amount, - Param_FmAmountLfo2Amount, - Param_Cutoff1Lfo2Amount, - Param_Cutoff2Lfo2Amount, - Param_PanoramaLfo2Amount, - Param_PatchVolume, - Param_Transpose, - Param_KeyMode, - Param_UnisonMode, - Param_UnisonDetune, - Param_UnisonPanSpread, - Param_UnisonLfoPhase, - Param_InputMode, - Param_InputSelect, - Param_ChorusMix, - Param_ChorusRate, - Param_ChorusDepth, - Param_ChorusDelay, - Param_ChorusFeedback, - Param_ChorusLfoShape, - Param_DelayReverbMode, - Param_EffectSend, - Param_DelayTime, - Param_DelayFeedback, - Param_DelayRateReverbDecayTime, - Param_DelayDepthReverbRoomSize, - Param_DelayLfoShape, - Param_DelayColor, - Param_KeybLocal, - Param_AllNotesOff, - - Param_ArpMode, - Param_ArpPatternSelect, - Param_ArpOctaveRange, - Param_ArpHoldEnable, - Param_ArpNoteLength, - Param_ArpSwing, - - Param_Lfo3Rate, - Param_Lfo3Shape, - Param_Lfo3Mode, - Param_Lfo3Keyfollow, - Param_Lfo3Destination, - Param_OscLfo3Amount, - Param_Lfo3FadeInTime, - Param_ClockTempo, - Param_ArpClock, - Param_Lfo1Clock, - Param_Lfo2Clock, - Param_DelayClock, - Param_Lfo3Clock, - Param_ControlSmoothMode, - Param_BenderRangeUp, - Param_BenderRangeDown, - Param_BenderScale, - Param_Filter1EnvPolarity, - Param_Filter2EnvPolarity, - Param_Filter2CutoffLink, - Param_FilterKeytrackBase, - Param_OscFMMode, - Param_OscInitPhase, - Param_PunchIntensity, - Param_InputFollowMode, - Param_VocoderMode, - Param_Osc3Mode, - Param_Osc3Volume, - Param_Osc3Semitone, - Param_Osc3Detune, - Param_LowEqFreq, - Param_HighEqFreq, - Param_Osc1ShapeVelocity, - Param_Osc2ShapeVelocity, - Param_PulseWidthVelocity, - Param_FmAmountVelocity, - Param_SoftKnob1ShortName, - Param_SoftKnob2ShortName, - Param_Filter1EnvAmtVelocity, - Param_Filter2EnvAmtVelocity, - Param_Resonance1Velocity, - Param_Resonance2Velocity, - Param_SecondOutputBalance, - Param_AmpVelocity, - Param_PanoramaVelocity, - Param_SoftKnob1Single, - Param_SoftKnob2Single, - Param_Assign1Source, - Param_Assign1Destination, - Param_Assign1Amount, - Param_Assign2Source, - Param_Assign2Destination1, - Param_Assign2Amount1, - Param_Assign2Destination2, - Param_Assign2Amount2, - Param_Assign3Source, - Param_Assign3Destination1, - Param_Assign3Amount1, - Param_Assign3Destination2, - Param_Assign3Amount2, - Param_Assign2Destination3, - Param_Assign2Amount3, - Param_Lfo1AssignDest, - Param_Lfo1AssignAmount, - Param_Lfo2AssignDest, - Param_Lfo2AssignAmount, - Param_PhaserMode, - Param_PhaserMix, - Param_PhaserRate, - Param_PhaserDepth, - Param_PhaserFreq, - Param_PhaserFeedback, - Param_PhaserSpread, - Param_MidEqGain, - Param_MidEqFreq, - Param_MidEqQFactor, - Param_LowEqGain, - Param_HighEqGain, - Param_BassIntensity, - Param_BassTune, - Param_InputRingMod, - Param_DistortionCurve, - Param_DistortionIntensity, - Param_Assign4Source, - Param_Assign4Destination, - Param_Assign4Amount, - Param_Assign5Source, - Param_Assign5Destination, - Param_Assign5Amount, - Param_Assign6Source, - Param_Assign6Destination, - Param_Assign6Amount, - Param_FilterSelect, - Param_Category1, - Param_Category2, - Param_DelayOutputSelect, - Param_PartBankSelect, - Param_PartBankChange, - Param_PartProgramChange, - Param_PartMidiChannel, - Param_PartLowKey, - Param_PartHighKey, - Param_PartTranspose, - Param_PartDetune, - Param_PartVolume, - Param_PartMidiVolumeInit, - Param_PartOutputSelect, - Param_GlobalSecondOutputSelect, - Param_GlobalKeybTransposeButtons, - Param_GlobalKeybLocal, - Param_GlobalKeybMode, - Param_GlobalKeybTranspose, - Param_GlobalKeyModWheelControl, - Param_GlobalKeybPedal1Control, - Param_GlobalKeybPedal2Control, - Param_GlobalKeybPressureSensitive, - Param_PartEnable, - Param_PartMidiVolumeEnable, - Param_PartHoldPedalEnable, - Param_KeybToMidi, - Param_NoteStealPriority, - Param_PartProgChangeEnable, - Param_GlobalProgChangeEnable, - Param_MultiProgChangeEnable, - Param_GlobalMidiVolumeEnable, - Param_InputThruLevel, - Param_InputBoost, - Param_MasterTune, - Param_DeviceID, - Param_MidiControlLowPage, - Param_MidiControlHighPage, - Param_MidiArpSend, - Param_KnobDisplay, - Param_MidiDumpTX, - Param_MidiDumpRX, - Param_MultiProgramChange, - Param_MidiClockRX, - Param_SoftKnob1Mode, - Param_SoftKnob2Mode, - Param_SoftKnob1Global, - Param_SoftKnob2Global, - Param_SoftKnob1Midi, - Param_SoftKnob2Midi, - Param_ExpertMode, - Param_KnobMode, - Param_MemoryProtect, - Param_SoftThru, - Param_PanelDestination, - Param_PlayMode, - Param_PartNumber, - Param_GlobalChannel, - Param_LedMode, - Param_LcdContrast, - Param_MasterVolume, - - // UNDEFINED / UNUSED / STUBS - Param_PageA_Undefined92, - Param_PageA_Undefined95, - Param_PageA_Undefined96, - Param_PageA_Undefined111, - Param_PageA_Undefined120, - Param_PageA_Undefined121, - Param_PageA_Undefined124, - Param_PageA_Undefined125, - Param_PageA_Undefined126, - Param_PageA_Undefined127, - Param_PageB_Undefined0, - Param_PageB_Undefined14, - Param_PageB_Undefined15, - Param_PageB_Undefined22, - Param_PageB_Undefined23, - Param_PageB_Undefined24, - Param_PageB_Undefined29, - Param_PageB_Undefined37, - Param_PageB_Undefined40, - Param_PageB_Undefined53, - Param_PageB_Undefined69, - Param_PageB_Undefined83, - Param_PageB_Undefined91, - Param_PageB_Undefined111, - Param_PageB_Undefined123, - Param_PageB_Undefined124, - Param_PageC_Undefined0, - Param_PageC_Undefined1, - Param_PageC_Undefined2, - Param_PageC_Undefined3, - Param_PageC_Undefined4, - Param_PageC_Undefined15, - Param_PageC_Undefined16, - Param_PageC_Undefined17, - Param_PageC_Undefined18, - Param_PageC_Undefined19, - Param_PageC_Undefined20, - Param_PageC_Undefined21, - Param_PageC_Undefined23, - Param_PageC_Undefined24, - Param_PageC_Undefined25, - Param_PageC_Undefined26, - Param_PageC_Undefined27, - Param_PageC_Undefined28, - Param_PageC_Undefined29, - Param_PageC_Undefined30, - Param_PageC_Undefined76, - Param_PageC_Undefined79, - Param_PageC_Undefined80, - Param_PageC_Undefined81, - Param_PageC_Undefined82, - Param_PageC_Undefined83, - Param_PageC_Undefined84, - Param_PageC_Undefined88, - Param_PageC_Undefined89, - Param_PageC_Undefined100, - Param_PageC_Undefined101, - Param_PageC_Undefined102, - Param_PageC_Undefined103, - Param_PageC_Undefined104, - Param_PageC_Undefined119, - // Text Chars / Unused - Param_PageB_Undefined110, - Param_PageB_Undefined111_, - Param_PageB_Undefined112, - Param_PageB_Undefined113, - Param_PageB_Undefined114, - Param_PageB_Undefined115, - Param_PageB_Undefined116, - Param_PageB_Undefined117, - Param_PageB_Undefined118, - Param_PageB_Undefined119, - Param_PageB_Undefined120, - Param_PageB_Undefined121, - Param_PageC_Undefined5, - Param_PageC_Undefined6, - Param_PageC_Undefined7, - Param_PageC_Undefined8, - Param_PageC_Undefined9, - Param_PageC_Undefined10, - Param_PageC_Undefined11, - Param_PageC_Undefined12, - Param_PageC_Undefined13, - Param_PageC_Undefined14, - - Param_Count - }; - enum EnvelopeType { Env_Amp, @@ -452,7 +84,6 @@ namespace Virus MultiPatch m_multis[128]; // RAM has 128 Multi 'snapshots' std::array<std::array<SinglePatch, 128>, 8> m_singles; MultiPatch m_currentMulti; - static const std::initializer_list<Parameter::Description> m_paramsDescription; struct ParamIndex { diff --git a/source/jucePlugin/VirusParameterDescription.cpp b/source/jucePlugin/VirusParameterDescription.cpp @@ -0,0 +1,1532 @@ +#include "VirusParameterDescription.h" + +#include "VirusParameter.h" + +namespace Virus +{ + juce::String numToBank(float bankIdx, Parameter::Description) + { + jassert(bankIdx >= 0); + juce::String prefix = "RAM"; + if (bankIdx > 3) + { + prefix = bankIdx < 9 ? "ROM " : "ROM"; + } + return prefix + juce::String(juce::roundToInt(bankIdx + 1)); + } + + juce::String numTo7bitSigned(const int idx) + { + const auto sign = idx > 64 ? "+" : ""; + return sign + juce::String(juce::roundToInt(idx - 64)); + } + + juce::String paramTo7bitSigned(const float idx, Parameter::Description) + { + return numTo7bitSigned(juce::roundToInt(idx)); + } + + float textTo7bitSigned(juce::String text, Parameter::Description) + { + const auto val = std::clamp(text.getIntValue(), -64, 63); + return static_cast<float>(val) + 64.0f; + } + + juce::String numToPan(float panIdx, Parameter::Description) + { + // handles rounding due to continuous... + const auto idx = juce::roundToInt(panIdx); + if (idx == 64) + return "Center"; + if (idx == 0) + return "Left"; + if (idx == 127) + return "Right"; + return numTo7bitSigned(idx); + } + + juce::String numToOscShape(float panIdx, Parameter::Description) + { + const auto idx = juce::roundToInt(panIdx); + if (idx == 64) + return "Saw"; + if (idx == 0) + return "Wave"; + if (idx == 127) + return "Pulse"; + return numTo7bitSigned(idx); + } + + juce::String numToOscWaveSelect(float panIdx, Parameter::Description) + { + const auto idx = juce::roundToInt(panIdx); + if (idx == 0) + return "Sine"; + if (idx == 1) + return "Triangle"; + return "Wave " + juce::String(idx + 1); + } + + juce::String numToSatCurv(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Light"; + case 2: return "Soft"; + case 3: return "Middle"; + case 4: return "Hard"; + case 5: return "Digital"; + case 6: return "Shaper"; + case 7: return "Rectifier"; + case 8: return "BitReducer"; + case 9: return "RateReducer"; + case 10: return "Rate+Flw"; + case 11: return "LowPass"; + case 12: return "Low+Flw"; + case 13: return "HighPass"; + case 14: return "High+Flw"; + + default: return juce::String(idx); + } + } + + juce::String numToDistortionCurv(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Light"; + case 2: return "Soft"; + case 3: return "Middle"; + case 4: return "Hard"; + case 5: return "Digital"; + case 6: return "Shaper"; + case 7: return "Rectifier"; + case 8: return "BitReducer"; + case 9: return "RateReducer"; + case 10: return "LowPass"; + case 11: return "HighPass"; + default: return juce::String(idx); + } + } + + juce::String numToFilterMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "LowPass"; + case 1: return "HighPass"; + case 2: return "BandPass"; + case 3: return "BandStop"; + case 4: return "Analog 1P"; + case 5: return "Analog 2P"; + case 6: return "Analog 3P"; + case 7: return "Analog 4P"; + default: return juce::String(idx); + } + } + + juce::String numToFilter2Mode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "LowPass"; + case 1: return "HighPass"; + case 2: return "BandPass"; + case 3: return "BandStop"; + default: return juce::String(idx); + } + } + + juce::String numToFilterRouting(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Serial 4"; + case 1: return "Serial 6"; + case 2: return "Parallel 4"; + case 3: return "Split"; + default: return juce::String(idx); + } + } + + juce::String numToEnvSusTime(float idx, Parameter::Description) + { + // handles rounding due to continuous... + const auto ridx = juce::roundToInt(idx); + if (ridx == 64) + return "Fall"; + if (ridx == 0) + return "Infinite"; + if (ridx == 127) + return "Rise"; + return numTo7bitSigned(ridx); + } + + juce::String numToLfoShape(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Sine"; + case 1: return "Triangle"; + case 2: return "Saw"; + case 3: return "Square"; + case 4: return "S&H"; + case 5: return "S&G"; + case 6: return "Wave3"; + case 7: return "Wave4"; + case 8: return "Wave5"; + case 9: return "Wave6"; + case 10: return "Wave7"; + case 11: return "Wave8"; + case 12: return "Wave9"; + case 13: return "Wave10"; + case 14: return "Wave11"; + case 15: return "Wave12"; + case 16: return "Wave13"; + case 17: return "Wave14"; + case 18: return "Wave15"; + case 19: return "Wave16"; + case 20: return "Wave17"; + case 21: return "Wave18"; + case 22: return "Wave19"; + case 23: return "Wave20"; + case 24: return "Wave21"; + case 25: return "Wave22"; + case 26: return "Wave23"; + case 27: return "Wave24"; + case 28: return "Wave25"; + case 29: return "Wave26"; + case 30: return "Wave27"; + case 31: return "Wave28"; + case 32: return "Wave29"; + case 33: return "Wave30"; + case 34: return "Wave31"; + case 35: return "Wave32"; + case 36: return "Wave33"; + case 37: return "Wave34"; + case 38: return "Wave35"; + case 39: return "Wave36"; + case 40: return "Wave37"; + case 41: return "Wave38"; + case 42: return "Wave39"; + case 43: return "Wave40"; + case 44: return "Wave41"; + case 45: return "Wave42"; + case 46: return "Wave43"; + case 47: return "Wave44"; + case 48: return "Wave45"; + case 49: return "Wave46"; + case 50: return "Wave47"; + case 51: return "Wave48"; + case 52: return "Wave49"; + case 53: return "Wave50"; + case 54: return "Wave51"; + case 55: return "Wave52"; + case 56: return "Wave53"; + case 57: return "Wave54"; + case 58: return "Wave55"; + case 59: return "Wave56"; + case 60: return "Wave57"; + case 61: return "Wave58"; + case 62: return "Wave59"; + case 63: return "Wave60"; + case 64: return "Wave61"; + case 65: return "Wave62"; + case 66: return "Wave63"; + case 67: return "Wave64"; + default: return juce::String(idx); + } + } + juce::String numToDelayLfoShape(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Sine"; + case 1: return "Triangle"; + case 2: return "Saw"; + case 3: return "Square"; + case 4: return "S&H"; + case 5: return "S&G"; + default: return juce::String(""); + } + } + juce::String numToOsc3Mode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Slave"; + case 2: return "Saw"; + case 3: return "Pulse"; + case 4: return "Sine"; + case 5: return "Triangle"; + case 6: return "Wave3"; + case 7: return "Wave4"; + case 8: return "Wave5"; + case 9: return "Wave6"; + case 10: return "Wave7"; + case 11: return "Wave8"; + case 12: return "Wave9"; + case 13: return "Wave10"; + case 14: return "Wave11"; + case 15: return "Wave12"; + case 16: return "Wave13"; + case 17: return "Wave14"; + case 18: return "Wave15"; + case 19: return "Wave16"; + case 20: return "Wave17"; + case 21: return "Wave18"; + case 22: return "Wave19"; + case 23: return "Wave20"; + case 24: return "Wave21"; + case 25: return "Wave22"; + case 26: return "Wave23"; + case 27: return "Wave24"; + case 28: return "Wave25"; + case 29: return "Wave26"; + case 30: return "Wave27"; + case 31: return "Wave28"; + case 32: return "Wave29"; + case 33: return "Wave30"; + case 34: return "Wave31"; + case 35: return "Wave32"; + case 36: return "Wave33"; + case 37: return "Wave34"; + case 38: return "Wave35"; + case 39: return "Wave36"; + case 40: return "Wave37"; + case 41: return "Wave38"; + case 42: return "Wave39"; + case 43: return "Wave40"; + case 44: return "Wave41"; + case 45: return "Wave42"; + case 46: return "Wave43"; + case 47: return "Wave44"; + case 48: return "Wave45"; + case 49: return "Wave46"; + case 50: return "Wave47"; + case 51: return "Wave48"; + case 52: return "Wave49"; + case 53: return "Wave50"; + case 54: return "Wave51"; + case 55: return "Wave52"; + case 56: return "Wave53"; + case 57: return "Wave54"; + case 58: return "Wave55"; + case 59: return "Wave56"; + case 60: return "Wave57"; + case 61: return "Wave58"; + case 62: return "Wave59"; + case 63: return "Wave60"; + case 64: return "Wave61"; + case 65: return "Wave62"; + case 66: return "Wave63"; + case 67: return "Wave64"; + default: return juce::String(idx); + } + } + + juce::String numToLfoMode(float v, Parameter::Description) { return juce::roundToInt(v) == 0 ? "Poly" : "Mono"; } + + juce::String numToKeyMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Poly"; + case 1: return "Mono 1"; + case 2: return "Mono 2"; + case 3: return "Mono 3"; + case 4: return "Mono 4"; + case 5: return "Hold"; + default: return juce::String(idx); + } + } + + juce::String numToInputMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Dynamic"; + case 2: return "Static"; + case 3: return "To Effects"; + default: return juce::String(idx); + } + } + + juce::String numToInputSelect(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "IN L"; + case 1: return "IN L+R"; + case 2: return "IN R"; + case 3: return "AUX 1 L"; + case 4: return "AUX 1 L+R"; + case 5: return "AUX 1 R"; + case 6: return "AUX 2 L"; + case 7: return "AUX 2 L+R"; + case 8: return "AUX 2 R"; + default: return juce::String(idx); + } + } + + juce::String numToOutputSelect(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "OUT 1 L"; + case 1: return "OUT 1 L+R"; + case 2: return "OUT 1 R"; + /* case 3: return "OUT 2 L"; + case 4: return "OUT 2 L+R"; + case 5: return "OUT 2 R"; + case 6: return "OUT 3 L"; + case 7: return "OUT 3 L+R"; + case 8: return "OUT 3 R";*/ + case 9: return "AUX 1 L"; + case 10: return "AUX 1 L+R"; + case 11: return "AUX 1 R"; + case 12: return "AUX 2 L"; + case 13: return "AUX 2 L+R"; + case 14: return "AUX 2 R"; + default: return juce::String(""); + } + } + + juce::String numToDelayReverbMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Delay"; + case 2: return "Reverb"; + case 3: return "Reverb + Feedback 1"; + case 4: return "Reverb + Feedback 2"; + case 5: return "Delay2:1"; + case 6: return "Delay4:3"; + case 7: return "Delay4:1"; + case 8: return "Delay8:7"; + case 9: return "Pattern1+1"; + case 10: return "Pattern2+1"; + case 11: return "Pattern3+1"; + case 12: return "Pattern4+1"; + case 13: return "Pattern5+1"; + case 14: return "Pattern2+3"; + case 15: return "Pattern2+5"; + case 16: return "Pattern3+2"; + case 17: return "Pattern3+3"; + case 18: return "Pattern3+4"; + case 19: return "Pattern3+5"; + case 20: return "Pattern4+3"; + case 21: return "Pattern4+5"; + case 22: return "Pattern5+2"; + case 23: return "Pattern5+3"; + case 24: return "Pattern5+4"; + case 25: return "Pattern5+5"; + case 26: return "Pattern X+Y"; + default: return juce::String(idx); + } + } + + juce::String numToArpMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Up"; + case 2: return "Down"; + case 3: return "Up&Down"; + case 4: return "As Played"; + case 5: return "Random"; + case 6: return "Chord"; + default: return juce::String(idx); + } + } + + juce::String numToLfoDest(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Osc1"; + case 1: return "Osc1+2"; + case 2: return "Osc2"; + case 3: return "PW1"; + case 4: return "PW1+2"; + case 5: return "PW2"; + default: return juce::String(idx); + } + } + + juce::String numToArpSwing(float idx, Parameter::Description) + { + return juce::String(juce::roundToInt(50 + (75 - 50) * (idx / 127))) + "%"; + } + + juce::String numToNumPlusOne(float idx, Parameter::Description) + { + return juce::String(juce::roundToInt(idx + 1)); + } + + juce::String numToClockTempo(float idx, Parameter::Description) + { + return juce::String(juce::roundToInt(63 + (190 - 63) * (idx / 127))) + "BPM"; + } + + juce::String numToControlSmoothMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "On"; + case 2: return "Auto"; + case 3: return "Note"; + default: return juce::String(idx); + } + } + + juce::String numToNegPos(float v, Parameter::Description) + { + return juce::roundToInt(v) == 0 ? "Negative" : "Positive"; + } + + juce::String numToLinExp(float v, Parameter::Description) + { + return juce::roundToInt(v) == 0 ? "Linear" : "Exponential"; + } + + juce::String numToModMatrixSource(float v, Parameter::Description) + { + const auto ridx = juce::roundToInt(v); + switch (ridx) + { + case 0: return "Off"; + case 1: return "PitchBnd"; + case 2: return "ChanPres"; + case 3: return "ModWheel"; + case 4: return "Breath"; + case 5: return "Contr3"; + case 6: return "Foot"; + case 7: return "Data"; + case 8: return "Balance"; + case 9: return "Contr 9"; + case 10: return "Express"; + case 11: return "Contr 12"; + case 12: return "Contr 13"; + case 13: return "Contr 14"; + case 14: return "Contr 15"; + case 15: return "Contr 16"; + case 16: return "HoldPed"; + case 17: return "PortaSw"; + case 18: return "SostPed"; + case 19: return "AmpEnv"; + case 20: return "FiltEnv"; + case 21: return "Lfo 1"; + case 22: return "Lfo 2"; + case 23: return "Lfo 3"; + case 24: return "VeloOn"; + case 25: return "VeloOff"; + case 26: return "KeyFlw"; + case 27: return "Random"; + default: return juce::String(v); + } + } + + juce::String numToModMatrixDest(float v, Parameter::Description) + { + const auto ridx = juce::roundToInt(v); + switch (ridx) + { + case 0: return "Off"; + case 1: return "PatchVol"; + case 2: return "ChannelVol"; + case 3: return "Panorama"; + case 4: return "Transpose"; + case 5: return "Portamento"; + case 6: return "Osc1Shape"; + case 7: return "Osc1PlsWdh"; + case 8: return "Osc1WavSel"; + case 9: return "Osc1Pitch"; + case 10: return "Osc1Keyflw"; + case 11: return "Osc2Shape"; + case 12: return "Osc2PlsWdh"; + case 13: return "Osc2WavSel"; + case 14: return "Osc2Pitch"; + case 15: return "Osc2Detune"; + case 16: return "Osc2FmAmt"; + case 17: return "Osc2EnvAmt"; + case 18: return "FmEnvAmt"; + case 19: return "Osc2Keyflw"; + case 20: return "OscBalance"; + case 21: return "SubOscVol"; + case 22: return "OscMainVol"; + case 23: return "NoiseVol"; + case 24: return "Cutoff"; + case 25: return "Cutoff2"; + case 26: return "Filt1Reso"; + case 27: return "Filt2Reso"; + case 28: return "Flt1EnvAmt"; + case 29: return "Flt2EnvAmt"; + case 30: return "Flt1Keyflw"; + case 31: return "Flt2Keyflw"; + case 32: return "FltBalance"; + case 33: return "FltAttack"; + case 34: return "FltDecay"; + case 35: return "FltSustain"; + case 36: return "FltSusTime"; + case 37: return "FltRelease"; + case 38: return "AmpAttack"; + case 39: return "AmpDecay"; + case 40: return "AmpSustain"; + case 41: return "AmpSusTime"; + case 42: return "AmpRelease"; + case 43: return "Lfo1Rate"; + case 44: return "Lfo1Cont"; + case 45: return "Lfo1>Osc1"; + case 46: return "Lfo1>Osc2"; + case 47: return "Lfo1>PlsWd"; + case 48: return "Lfo1>Reso"; + case 49: return "Lfo1>FltGn"; + case 50: return "Lfo2Rate"; + case 51: return "Lfo2Cont"; + case 52: return "Lfo2>Shape"; + case 53: return "Lfo2>Fm"; + case 54: return "Lfo2>Cut1"; + case 55: return "Lfo2>Cut2"; + case 56: return "Lfo2>Pan"; + case 57: return "Lfo3Rate"; + case 58: return "Lfo3OscAmt"; + case 59: return "UniDetune"; + case 60: return "UniSpread"; + case 61: return "UniLfoPhs"; + case 62: return "ChorusMix"; + case 63: return "ChorusRate"; + case 64: return "ChorusDpth"; + case 65: return "ChorusDly"; + case 66: return "ChorusFeed"; + case 67: return "EffectSend"; + case 68: return "DelayTime"; + case 69: return "DelayFeed"; + case 70: return "DelayRate"; + case 71: return "DelayDepth"; + case 72: return "Osc1ShpVel"; + case 73: return "Osc2ShpVel"; + case 74: return "PlsWhdVel"; + case 75: return "FmAmtVel"; + case 76: return "Flt1EnvVel"; + case 77: return "Flt2EnvVel"; + case 78: return "Reso1Vel"; + case 79: return "Reso2Vel"; + case 80: return "AmpVel"; + case 81: return "PanVel"; + case 82: return "Ass1Amt1"; + case 83: return "Ass2Amt1"; + case 84: return "Ass2Amt2"; + case 85: return "Ass3Amt1"; + case 86: return "Ass3Amt2"; + case 87: return "Ass3Amt3"; + case 88: return "OscInitPhs"; + case 89: return "PunchInt"; + case 90: return "RingMod"; + case 91: return "NoiseColor"; + case 92: return "DelayColor"; + case 93: return "ABoostInt"; + case 94: return "ABoostTune"; + case 95: return "DistInt"; + case 96: return "RingmodMix"; + case 97: return "Osc3Volume"; + case 98: return "Osc3Semi"; + case 99: return "Osc3Detune"; + case 100: return "Lfo1AssAmt"; + case 101: return "Lfo2AssAmt"; + case 102: return "PhaserMix"; + case 103: return "PhaserRate"; + case 104: return "PhaserDept"; + case 105: return "PhaserFreq"; + case 106: return "PhaserFdbk"; + case 107: return "PhaserSprd"; + case 108: return "RevbDecay"; + case 109: return "RevDamping"; + case 110: return "RevbColor"; + case 111: return "RevPredely"; + case 112: return "RevFeedbck"; + case 113: return "SecBalance"; + case 114: return "ArpNoteLen"; + case 115: return "ArpSwing"; + case 116: return "ArpPattern"; + case 117: return "EqMidGain"; + case 118: return "EqMidFreq"; + case 119: return "EqMidQFactor"; + case 120: return "Assign4Amt"; + case 121: return "Assign5Amt"; + case 122: return "Assign6Amt"; + default: return juce::String(v); + } + } + + juce::String numToSoftKnobDest(float v, Parameter::Description) + { + const auto ridx = juce::roundToInt(v); + switch (ridx) + { + case 0: return "Off"; + case 1: return "ModWheel"; + case 2: return "Breath"; + case 3: return "Contr3"; + case 4: return "Foot"; + case 5: return "Data"; + case 6: return "Balance"; + case 7: return "Contr9"; + case 8: return "Expression"; + case 9: return "Contr12"; + case 10: return "Contr13"; + case 11: return "Contr14"; + case 12: return "Contr15"; + case 13: return "Contr16"; + case 14: return "PatchVolume"; + case 15: return "ChannelVolume"; + case 16: return "Panorama"; + case 17: return "Transpose"; + case 18: return "Portamento"; + case 19: return "UnisonDetune"; + case 20: return "UnisonPanSprd"; + case 21: return "UnisoLfoPhase"; + case 22: return "ChorusMix"; + case 23: return "ChorusRate"; + case 24: return "ChorusDepth"; + case 25: return "ChorusDelay"; + case 26: return "ChorusFeedback"; + case 27: return "EffectSend"; + case 28: return "DelayTime(ms)"; + case 29: return "DelayFeedback"; + case 30: return "DelayRate"; + case 31: return "DelayDepth"; + case 32: return "Osc1WavSelect"; + case 33: return "Osc1PulseWidth"; + case 34: return "Osc1Semitone"; + case 35: return "Osc1Keyfollow"; + case 36: return "Osc2WavSelect"; + case 37: return "Os2PulseWidth"; + case 38: return "Osc2EnvAmount"; + case 39: return "FmEnvAmount"; + case 40: return "Osc2Keyfollow"; + case 41: return "NoiseVolume"; + case 42: return "Filt1Resonance"; + case 43: return "Filt2Resonance"; + case 44: return "Filt1EnvAmount"; + case 45: return "Filt2EnvAmount"; + case 46: return "Filt1Keyfollow"; + case 47: return "Filt2Keyfollow"; + case 48: return "Lfo1Symmetry"; + case 49: return "Lfo1>Osc1"; + case 50: return "Lfo1>Osc2"; + case 51: return "Lfo1>PulsWidth"; + case 52: return "Lfo1>Resonance"; + case 53: return "Lfo1>FiltGain"; + case 54: return "Lfo2Symmetry"; + case 55: return "Lfo2>Shape"; + case 56: return "Lfo2>FmAmount"; + case 57: return "Lfo2>Cutoff1"; + case 58: return "Lfo2>Cutoff2"; + case 59: return "Lfo2>Panorama"; + case 60: return "Lfo3Rate"; + case 61: return "Lfo3OscAmount"; + case 62: return "Osc1ShapeVel"; + case 63: return "Osc2ShapeVel"; + case 64: return "PulsWidthVel"; + case 65: return "FmAmountVel"; + case 66: return "Filt1EnvVel"; + case 67: return "Filt2EnvVel"; + case 68: return "Resonance1Vel"; + case 69: return "Resonance2Vel"; + case 70: return "AmplifierVel"; + case 71: return "PanoramaVel"; + case 72: return "Assign1Amt1"; + case 73: return "Assign2Amt1"; + case 74: return "Assign2Amt2"; + case 75: return "Assign3Amt1"; + case 76: return "Assign3Amt2"; + case 77: return "Assign3Amt3"; + case 78: return "ClockTempo"; + case 79: return "InputThru"; + case 80: return "OscInitPhase"; + case 81: return "PunchIntensity"; + case 82: return "Ringmodulator"; + case 83: return "NoiseColor"; + case 84: return "DelayColor"; + case 85: return "AnalogBoostInt"; + case 86: return "AnalogBstTune"; + case 87: return "DistortionInt"; + case 88: return "RingModMix"; + case 89: return "Osc3Volume"; + case 90: return "Osc3Semitone"; + case 91: return "Osc3Detune"; + case 92: return "Lfo1AssignAmt"; + case 93: return "Lfo2AssignAmt"; + case 94: return "PhaserMix"; + case 95: return "PhaserRate"; + case 96: return "PhaserDepth"; + case 97: return "PhaserFrequency"; + case 98: return "PhaserFeedback"; + case 99: return "PhaserSpread"; + case 100: return "RevDecayTime"; + case 101: return "ReverbDamping"; + case 102: return "ReverbColor"; + case 103: return "ReverbFeedback"; + case 104: return "SecondBalance"; + case 105: return "ArpMode"; + case 106: return "ArpPattern"; + case 107: return "ArpClock"; + case 108: return "ArpNoteLength"; + case 109: return "ArpSwing"; + case 110: return "ArpOctaves"; + case 111: return "ArpHold"; + case 112: return "EqMidGain"; + case 113: return "EqMidFreq"; + case 114: return "EqMidQFactor"; + case 115: return "Assign4Amt"; + case 116: return "Assign5Amt"; + case 117: return "Assign6Amt"; + default: return juce::String(v); + } + } + + juce::String numToSoftKnobName(float idx, Parameter::Description) { + const char *softKnobNames[] = { "~Para","+3rds","+4ths","+5ths", + "+7ths","+Octave","Access","ArpMode","ArpOct","Attack", + "Balance","Chorus","Cutoff","Decay","Delay","Depth", + "Destroy","Detune","Disolve","Distort","Dive","Effects", + "Elevate","Energy","EqHigh","EqLow","EqMid","Fast","Fear", + "Filter","FM","Glide","Hold","Hype","Infect","Length","Mix", + "Morph","Mutate","Noise","Open","Orbit","Pan","Phaser","Phatter", + "Pitch","Pulsate","Push","PWM","Rate","Release","Reso","Reverb", + "Scream","Shape","Sharpen","Slow","Soften","Speed","SubOsc", + "Sustain","Sweep","Swing","Tempo","Thinner","Tone","Tremolo", + "Vibrato","WahWah","Warmth","Warp","Width" }; + const auto ridx = juce::roundToInt(idx); + if (ridx < sizeof(softKnobNames) - 1) { + return softKnobNames[ridx]; + } + return juce::String(idx); + } + + juce::String numToUnisonMode(float v, Parameter::Description) + { + const auto ridx = juce::roundToInt(v); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Twin"; + case 2: return "3"; + case 3: return "4"; + case 4: return "5"; + case 5: return "6"; + case 6: return "7"; + case 7: return "8"; + case 8: return "9"; + case 9: return "10"; + case 10: return "11"; + case 11: return "12"; + case 12: return "13"; + case 13: return "14"; + case 14: return "15"; + case 15: return "16"; + default: return juce::String(v); + } + } + + juce::String filterKeytrackBase(float v, Parameter::Description) + { + const auto ridx = juce::roundToInt(v); + switch (ridx) + { + case 0: return "C-1"; + case 1: return "C#-1"; + case 2: return "D-1"; + case 3: return "D#-1"; + case 4: return "E-1"; + case 5: return "F-1"; + case 6: return "F#-1"; + case 7: return "G-1"; + case 8: return "G#-1"; + case 9: return "A-1"; + case 10: return "A#-1"; + case 11: return "B-1"; + case 12: return "C0"; + case 13: return "C#0"; + case 14: return "D0"; + case 15: return "D#0"; + case 16: return "E0"; + case 17: return "F0"; + case 18: return "F#0"; + case 19: return "G0"; + case 20: return "G#0"; + case 21: return "A0"; + case 22: return "A#0"; + case 23: return "B0"; + case 24: return "C1"; + case 25: return "C#1"; + case 26: return "D1"; + case 27: return "D#1"; + case 28: return "E1"; + case 29: return "F1"; + case 30: return "F#1"; + case 31: return "G1"; + case 32: return "G#1"; + case 33: return "A1"; + case 34: return "A#1"; + case 35: return "B1"; + case 36: return "C2"; + case 37: return "C#2"; + case 38: return "D2"; + case 39: return "D#2"; + case 40: return "E2"; + case 41: return "F2"; + case 42: return "F#2"; + case 43: return "G2"; + case 44: return "G#2"; + case 45: return "A2"; + case 46: return "A#2"; + case 47: return "B2"; + case 48: return "C3"; + case 49: return "C#3"; + case 50: return "D3"; + case 51: return "D#3"; + case 52: return "E3"; + case 53: return "F3"; + case 54: return "F#3"; + case 55: return "G3"; + case 56: return "G#3"; + case 57: return "A3"; + case 58: return "A#3"; + case 59: return "B3"; + case 60: return "C4"; + case 61: return "C#4"; + case 62: return "D4"; + case 63: return "D#4"; + case 64: return "E4"; + case 65: return "F4"; + case 66: return "F#4"; + case 67: return "G4"; + case 68: return "G#4"; + case 69: return "A4"; + case 70: return "A#4"; + case 71: return "B4"; + case 72: return "C5"; + case 73: return "C#5"; + case 74: return "D5"; + case 75: return "D#5"; + case 76: return "E5"; + case 77: return "F5"; + case 78: return "F#5"; + case 79: return "G5"; + case 80: return "G#5"; + case 81: return "A5"; + case 82: return "A#5"; + case 83: return "B5"; + case 84: return "C6"; + case 85: return "C#6"; + case 86: return "D6"; + case 87: return "D#6"; + case 88: return "E6"; + case 89: return "F6"; + case 90: return "F#6"; + case 91: return "G6"; + case 92: return "G#6"; + case 93: return "A6"; + case 94: return "A#6"; + case 95: return "B6"; + case 96: return "C7"; + case 97: return "C#7"; + case 98: return "D7"; + case 99: return "D#7"; + case 100: return "E7"; + case 101: return "F7"; + case 102: return "F#7"; + case 103: return "G7"; + case 104: return "G#7"; + case 105: return "A7"; + case 106: return "A#7"; + case 107: return "B7"; + case 108: return "C8"; + case 109: return "C#8"; + case 110: return "D8"; + case 111: return "D#8"; + case 112: return "E8"; + case 113: return "F8"; + case 114: return "F#8"; + case 115: return "G8"; + case 116: return "G#8"; + case 117: return "A8"; + case 118: return "A#8"; + case 119: return "B8"; + case 120: return "C9"; + case 121: return "C#9"; + case 122: return "D9"; + case 123: return"D#9"; + case 124: return "E9"; + case 125: return "F9"; + case 126: return "F#9"; + case 127: return "G9"; + default: return juce::String(v); + } + } + + juce::String numToOscFmMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Pos-Tri"; + case 1: return "Tri"; + case 2: return "Wave"; + case 3: return "Noise"; + case 4: return "In L"; + case 5: return "In L+R"; + case 6: return "In R"; + case 7: return "Aux1 L"; + case 8: return "Aux1 L+R"; + case 9: return "Aux1 R"; + case 10: return "Aux2 L"; + case 11: return "Aux2 L+R"; + case 12: return "Aux2 R"; + default: return juce::String(idx); + } + } + + juce::String numToVocoderMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "Oscillator"; + case 2: return "Osc Hold"; + case 3: return "Noise"; + case 4: return "In L"; + case 5: return "In L+R"; + case 6: return "In R"; + case 7: return "Aux1 L"; + case 8: return "Aux1 L+R"; + case 9: return "Aux1 R"; + case 10: return "Aux2 L"; + case 11: return "Aux2 L+R"; + case 12: return "Aux2 R"; + default: return juce::String(idx); + } + } + + juce::String numToInputFollowerMode(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "In L"; + case 2: return "In L+R"; + case 3: return "In R"; + case 4: return "Aux1 L"; + case 5: return "Aux1 L+R"; + case 6: return "Aux1 R"; + case 7: return "Aux2 L"; + case 8: return "Aux2 L+R"; + case 9: return "Aux2 R"; + default: return juce::String(idx); + } + } + + juce::String numToMusicDivision(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Off"; + case 1: return "1/64"; + case 2: return "1/32"; + case 3: return "1/16"; + case 4: return "1/8"; + case 5: return "1/4"; + case 6: return "1/2"; + case 7: return "3/64"; + case 8: return "3/32"; + case 9: return "3/16"; + case 10: return "3/8"; + case 11: return "1/24"; + case 12: return "1/12"; + case 13: return "1/6"; + case 14: return "1/3"; + case 15: return "2/3"; + case 16: return "3/4"; + case 17: return "1/1"; + case 18: return "2/1"; + case 19: return "4/1"; + case 20: return "8/1"; + case 21: return "16/1"; + default: return juce::String(idx); + } + } + + juce::String numToPhaserMode(float v, Parameter::Description) + { + const auto ridx = juce::roundToInt(v); + switch (ridx) + { + case 0: return ""; + case 1: return "1 Stage"; + case 2: return "2 Stages"; + case 3: return "3 Stages"; + case 4: return "4 Stages"; + case 5: return "5 Stages"; + case 6: return "6 Stages"; + default: return juce::String(v); + } + } + + juce::String numToFilterSelect(float idx, Parameter::Description) + { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 0: return "Filter 1"; + case 1: return "Filter 2"; + case 2: return "Filter 1+2"; + default: return juce::String(idx); + } + } + + juce::String numToCategory(float idx, Parameter::Description) + { + const juce::Array<juce::String> categories = { "--", "Lead", "Bass", "Pad", "Decay", "Pluck", + "Acid", "Classic", "Arpeggiator", "Effects", "Drums", "Percussion", + "Input", "Vocoder", "Favourite 1", "Favourite 2", "Favourite 3" }; + + const auto ridx = juce::roundToInt(idx); + if (ridx < categories.size()) + return categories[ridx]; + return "Undefined"; + } + + juce::String numToBendRange(float idx, Parameter::Description) { + const auto ridx = juce::roundToInt(idx); + switch (ridx) + { + case 40: return "-2oct"; + case 52: return "-1oct"; + case 57: return "-7st"; + case 58: return "-6st"; + case 59: return "-5st"; + case 60: return "-4st"; + case 61: return "-3st"; + case 62: return "-2st"; + case 63: return "-1st"; + case 64: return "None"; + case 65: return "+1st"; + case 66: return "+2st"; + case 67: return "+3st"; + case 68: return "+4st"; + case 69: return "+5st"; + case 70: return "+6st"; + case 71: return "+7st"; + case 76: return "+1oct"; + case 88: return "+2oct"; + default: return juce::String(""); + } + } + juce::String numToReverbRoomSize(float idx, Parameter::Description) { + const auto ridx = juce::roundToInt(idx); + + switch (ridx) { + case 0: return "Ambience"; + case 1: return "Small Room"; + case 2: return "Large Room"; + case 3: return "Hall"; + default: return juce::String(""); + } + } + + const std::initializer_list<Parameter::Description> g_paramsDescription = + { + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 0, "Bank Select", {0, 3 + 26}, numToBank, {}, false, true, false}, // The Virus TI contains 4 banks of RAM, followed by 26 banks of ROM + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 1, "Modulation Wheel", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 2, "Breath Controller", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 3, "Contr 3", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 4, "Foot Controller", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 5, "Portamento Time", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 6, "Data Slider", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 7, "Channel Volume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 8, "Balance", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 9, "Contr 9", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 10, "Panorama", {0,127}, numToPan,{}, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 11, "Expression", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 12, "Contr 12", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 13, "Contr 13", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 14, "Contr 14", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 15, "Contr 15", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 16, "Contr 16", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 17, "Osc1 Shape", {0,127}, numToOscShape,{}, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 18, "Osc1 Pulsewidth", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 19, "Osc1 Wave Select", {0,63}, numToOscWaveSelect, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 20, "Osc1 Semitone", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 21, "Osc1 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 22, "Osc2 Shape", {0,127}, numToOscShape, {}, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 23, "Osc2 Pulsewidth", {0,127}, {}, {}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 24, "Osc2 Wave Select", {0,63}, numToOscWaveSelect,{}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 25, "Osc2 Semitone", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 26, "Osc2 Detune", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 27, "Osc2 FM Amount", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 28, "Osc2 Sync", {0,1}, {},{}, true, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 29, "Osc2 Filt Env Amt", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 30, "FM Filt Env Amt", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 31, "Osc2 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 32, "Bank Select", {0, 3 + 26}, numToBank,{}, false, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 33, "Osc Balance", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 34, "Suboscillator Volume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 35, "Suboscillator Shape", {0,1}, [](float v, Parameter::Description) { return juce::roundToInt(v) == 0 ? "Square" : "Triangle"; },{}, true, true, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 36, "Osc Mainvolume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 37, "Noise Volume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 38, "Ringmodulator Volume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::VIRUS_C, 39, "Noise Color", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 40, "Cutoff", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 41, "Cutoff2", {0,127}, {},{}, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 42, "Filter1 Resonance", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 43, "Filter2 Resonance", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 44, "Filter1 Env Amt", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 45, "Filter2 Env Amt", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 46, "Filter1 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 47, "Filter2 Keyfollow", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 48, "Filter Balance", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 49, "Saturation Curve", {0,14}, numToSatCurv, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 51, "Filter1 Mode", {0,7}, numToFilterMode, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 52, "Filter2 Mode", {0,3}, numToFilter2Mode, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 53, "Filter Routing", {0,3}, numToFilterRouting, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 54, "Filter Env Attack", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 55, "Filter Env Decay", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 56, "Filter Env Sustain", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 57, "Filter Env Sustain Time", {0,127}, numToEnvSusTime, {}, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 58, "Filter Env Release", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 59, "Amp Env Attack", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 60, "Amp Env Decay", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 61, "Amp Env Sustain", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 62, "Amp Env Sustain Time", {0,127}, numToEnvSusTime, {}, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 63, "Amp Env Release", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 64, "Hold Pedal", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 65, "Portamento Pedal", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::PERFORMANCE_CONTROLLER, 66, "Sostenuto Pedal", {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 67, "Lfo1 Rate", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 68, "Lfo1 Shape", {0,67}, numToLfoShape, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 69, "Lfo1 Env Mode", {0,1}, {},{}, true, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 70, "Lfo1 Mode", {0,1}, numToLfoMode, {}, true, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 71, "Lfo1 Symmetry", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 72, "Lfo1 Keyfollow", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 73, "Lfo1 Keytrigger", {0,127}, {}, {}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 74, "Osc1 Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 75, "Osc2 Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 76, "PW Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 77, "Reso Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 78, "FiltGain Lfo1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 79, "Lfo2 Rate", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 80, "Lfo2 Shape", {0,67}, numToLfoShape,{}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 81, "Lfo2 Env Mode", {0,1}, {},{}, true, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 82, "Lfo2 Mode", {0,1}, numToLfoMode, {}, true, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 83, "Lfo2 Symmetry", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 84, "Lfo2 Keyfollow", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 85, "Lfo2 Keytrigger", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 86, "Shape Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 87, "FM Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 88, "Cutoff1 Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 89, "Cutoff2 Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 90, "Pan Lfo2 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 91, "Patch Volume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 93, "Transpose", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 94, "Key Mode", {0,5}, numToKeyMode, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 97, "Unison Mode", {0,15}, numToUnisonMode, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 98, "Unison Detune", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 99, "Unison Pan Spread", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 100, "Unison Lfo Phase", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 101, "Input Mode", {0,3}, numToInputMode, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 102, "Input Select", {0,8}, numToInputSelect,{}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 105, "Chorus Mix", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 106, "Chorus Rate", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 107, "Chorus Depth", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 108, "Chorus Delay", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 109, "Chorus Feedback", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A, 110, "Chorus Lfo Shape", {0,67}, numToLfoShape, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE, 112, "Delay/Reverb Mode", {0,26}, numToDelayReverbMode, {}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE, 113, "Effect Send", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 114, "Delay Time", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 115, "Delay Feedback", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 116, "Dly Rate / Rev Decay", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 117, "Dly Depth / Rev Size", {0,127}, numToReverbRoomSize,{}, true, true, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 118, "Delay Lfo Shape", {0,127}, numToDelayLfoShape, {}, true, true, false}, + // {Parameter::Page::A, Parameter::Class::SOUNDBANK_A|Parameter::Class::MULTI_OR_SINGLE|Parameter::Class::NON_PART_SENSITIVE, 118, "Reverb Damping", {0,127}, {},{}, true, false, false}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 119, "Delay Color", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 122, "Keyb Local", {0,1}, {},{}, false, false, true}, + {Parameter::Page::A, Parameter::Class::SOUNDBANK_A | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 123, "All Notes Off", {0,127}, {},{}, false, false, false}, + + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 1, "Arp Mode", {0,6}, numToArpMode, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 2, "Arp Pattern Selct", {0,63}, numToNumPlusOne, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 3, "Arp Octave Range", {0,3}, numToNumPlusOne,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 4, "Arp Hold Enable", {0,1}, {},{}, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 5, "Arp Note Length", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 6, "Arp Swing", {0,127}, numToArpSwing, {}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 7, "Lfo3 Rate", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 8, "Lfo3 Shape", {0,67}, numToLfoShape, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 9, "Lfo3 Mode", {0,1}, numToLfoMode, {}, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 10, "Lfo3 Keyfollow", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 11, "Lfo3 Destination", {0,5}, numToLfoDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 12, "Osc Lfo3 Amount", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 13, "Lfo3 Fade-In Time", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 16, "Clock Tempo", {0,127}, numToClockTempo, {}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 17, "Arp Clock", {0,17}, numToMusicDivision, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 18, "Lfo1 Clock", {0,21}, numToMusicDivision, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 19, "Lfo2 Clock", {0,21}, numToMusicDivision, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::MULTI_OR_SINGLE | Parameter::Class::NON_PART_SENSITIVE, 20, "Delay Clock", {0,16}, numToMusicDivision, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 21, "Lfo3 Clock", {0,21}, numToMusicDivision, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 25, "Control Smooth Mode", {0,3}, numToControlSmoothMode,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 26, "Bender Range Up", {0,127}, numToBendRange, {}, true, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 27, "Bender Range Down", {0,127}, numToBendRange, {}, true, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 28, "Bender Scale", {0,1}, numToLinExp, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 30, "Filter1 Env Polarity", {0,1}, numToNegPos, {}, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 31, "Filter1 Env Polarity", {0,1}, numToNegPos, {}, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 32, "Filter2 Cutoff Link", {0,1}, {},{}, true, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 33, "Filter Keytrack Base", {0,127}, filterKeytrackBase,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 34, "Osc FM Mode", {0,12}, numToOscFmMode,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 35, "Osc Init Phase", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 36, "Punch Intensity", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 38, "Input Follower Mode", {0,9}, numToInputFollowerMode, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 39, "Vocoder Mode", {0,12}, numToVocoderMode,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 41, "Osc3 Mode", {0,67}, numToOsc3Mode,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 42, "Osc3 Volume", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 43, "Osc3 Semitone", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 44, "Osc3 Detune", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 45, "LowEQ Frequency", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 46, "HighEQ Frequency", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 47, "Osc1 Shape Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 48, "Osc2 Shape Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 49, "PulseWidth Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 50, "Fm Amount Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 51, "Soft Knob1 ShortName", {0,71}, numToSoftKnobName,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 52, "Soft Knob2 ShortName", {0,71}, numToSoftKnobName,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 54, "Flt1 EnvAmt Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 55, "Flt2 EnvAmt Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 56, "Resonance1 Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 57, "Resonance2 Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 58, "Second Output Balance", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 60, "Amp Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 61, "Panorama Velocity", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 62, "Soft Knob-1 Single", {0,117}, numToSoftKnobDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 63, "Soft Knob-2 Single", {0,117}, numToSoftKnobDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 64, "Assign1 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 65, "Assign1 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 66, "Assign1 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 67, "Assign2 Source", {0,27}, numToModMatrixSource,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 68, "Assign2 Destination1", {0,122}, numToModMatrixDest,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 69, "Assign2 Amount1", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 70, "Assign2 Destination2", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 71, "Assign2 Amount2", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 72, "Assign3 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 73, "Assign3 Destination1", {0,122}, numToModMatrixDest,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 74, "Assign3 Amount1", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 75, "Assign3 Destination2", {0,122}, numToModMatrixDest,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 76, "Assign3 Amount2", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 77, "Assign3 Destination3", {0,122}, numToModMatrixDest,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 78, "Assign3 Amount3", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 79, "LFO1 Assign Dest", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 80, "LFO1 Assign Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 81, "LFO2 Assign Dest", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 82, "LFO2 Assign Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 84, "Phaser Mode", {0,6}, numToPhaserMode, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 85, "Phaser Mix", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 86, "Phaser Rate", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 87, "Phaser Depth", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 88, "Phaser Frequency", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 89, "Phaser Feedback", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 90, "Phaser Spread", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 92, "MidEQ Gain", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 93, "MidEQ Frequency", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 94, "MidEQ Q-Factor", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 95, "LowEQ Gain", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 96, "HighEQ Gain", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 97, "Bass Intensity", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 98, "Bass Tune", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 99, "Input Ringmodulator", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 100, "Distortion Curve", {0,11}, numToDistortionCurv,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 101, "Distortion Intensity", {0,127}, {},{}, true, false, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 103, "Assign 4 Source", {0,27}, numToModMatrixSource,{}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 104, "Assign 4 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 105, "Assign 4 Amount", {0,127}, {},{}, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 106, "Assign 5 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 107, "Assign 5 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 108, "Assign 5 Amount", {0,127}, paramTo7bitSigned, textTo7bitSigned, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 109, "Assign 6 Source", {0,27}, numToModMatrixSource, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 110, "Assign 6 Destination", {0,122}, numToModMatrixDest, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 111, "Assign 6 Amount", {0,127}, paramTo7bitSigned, {}, true, false, false, true}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B | Parameter::Class::VIRUS_C, 122, "Filter Select", {0,2}, numToFilterSelect, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 123, "Category1", {0,16}, numToCategory, {}, true, true, false}, + {Parameter::Page::B, Parameter::Class::SOUNDBANK_B, 124, "Category2", {0,16}, numToCategory, {}, true, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM | Parameter::Class::NON_PART_SENSITIVE, 22, "Delay Output Select", {0,14}, numToOutputSelect, {}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM | Parameter::Class::BANK_PROGRAM_CHANGE_PARAM_BANK_SELECT, 31, "Part Bank Select", {0, 3 + 26}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM | Parameter::Class::BANK_PROGRAM_CHANGE_PARAM_BANK_SELECT, 32, "Part Bank Change", {0, 3 + 26}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM | Parameter::Class::BANK_PROGRAM_CHANGE_PARAM_BANK_SELECT, 33, "Part Program Change", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 34, "Part Midi Channel", {0,15}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 35, "Part Low Key", {0,127}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 36, "Part High Key", {0,127}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 37, "Part Transpose", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 38, "Part Detune", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 39, "Part Volume", {0,127}, paramTo7bitSigned,textTo7bitSigned, true, false, false, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 40, "Part Midi Volume Init", {0,127}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 41, "Part Output Select", {0,14}, numToOutputSelect,{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 45, "Second Output Select", {0,15}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 63, "Keyb Transpose Buttons", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 64, "Keyb Local", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 65, "Keyb Mode", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 66, "Keyb Transpose", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 67, "Keyb ModWheel Contr", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 68, "Keyb Pedal 1 Contr", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 69, "Keyb Pedal 2 Contr", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 70, "Keyb Pressure Sens", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 72, "Part Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 73, "Part Midi Volume Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 74, "Part Hold Pedal Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 75, "Keyb To Midi", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 77, "Note Steal Priority", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::MULTI_PARAM, 78, "Part Prog Change Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 85, "Glob Prog Change Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 86, "MultiProg Change Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 87, "Glob Midi Volume Enable", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 90, "Input Thru Level", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 91, "Input Boost", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 92, "Master Tune", {0,127}, paramTo7bitSigned, textTo7bitSigned, false, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 93, "Device ID", {0,16}, {},{}, true, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 94, "Midi Control Low Page", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 95, "Midi Control High Page", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 96, "Midi Arpeggiator Send", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 97, "Knob Display", {0,3}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 98, "Midi Dump Tx", {0,4}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 99, "Midi Dump Rx", {0,4}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 105, "Multi Program Change", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 106, "Midi Clock Rx", {0,3}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 110, "Soft Knob-1 Mode", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 111, "Soft Knob-2 Mode", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 112, "Soft Knob-1 Global", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 113, "Soft Knob-2 Global", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 114, "Soft Knob-1 Midi", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 115, "Soft Knob-2 Midi", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 116, "Expert Mode", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 117, "Knob Mode", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 118, "Memory Protect", {0,1}, {},{}, false, false, true}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 120, "Soft Thru", {0,1}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 121, "Panel Destination", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 122, "Play Mode", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 123, "Part Number", {0,127}, {},{}, false, true, false}, // 0..15;40 + {Parameter::Page::C, Parameter::Class::GLOBAL, 124, "Global Channel", {0,15}, {},{}, true, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 125, "Led Mode", {0,2}, {},{}, false, true, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 126, "LCD Contrast", {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::GLOBAL, 127, "Master Volume", {0,127}, {},{}, false, false, false}, + + // UNDEFINED / UNUSED / STUBS + {Parameter::Page::A, Parameter::Class::UNDEFINED, 92, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 95, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 96, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 111, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 120, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 121, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 124, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 125, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 126, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::A, Parameter::Class::UNDEFINED, 127, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 0, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 14, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 15, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 22, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 23, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 24, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 29, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 37, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 40, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 53, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 69, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 83, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 91, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 111, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 123, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 124, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 0, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 1, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 2, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 3, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 4, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 15, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 16, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 17, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 18, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 19, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 20, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 21, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 23, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 24, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 25, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 26, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 27, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 28, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 29, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 30, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 76, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 79, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 80, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 81, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 82, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 83, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 84, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 88, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 89, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 100, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 101, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 102, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 103, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 104, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 119, {}, {0,127}, {},{}, false, false, false}, + // Text Chars / Unused + {Parameter::Page::B, Parameter::Class::UNDEFINED, 110, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 111, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 112, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 113, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 114, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 115, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 116, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 117, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 118, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 119, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 120, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::B, Parameter::Class::UNDEFINED, 121, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 5, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 6, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 7, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 8, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 9, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 10, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 11, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 12, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 13, {}, {0,127}, {},{}, false, false, false}, + {Parameter::Page::C, Parameter::Class::UNDEFINED, 14, {}, {0,127}, {},{}, false, false, false} + // TODO: B51-52 shortname?!? B54-B55 (same name?!) + }; +} +\ No newline at end of file diff --git a/source/jucePlugin/VirusParameterDescription.h b/source/jucePlugin/VirusParameterDescription.h @@ -0,0 +1,377 @@ +#pragma once + +#include "VirusParameter.h" + +namespace Virus +{ + enum ParameterType + { + Param_BankSelect, + Param_ModWheel, + Param_BreathControl, + Param_Control3, + Param_FootControl, + Param_PortamentoTime, + Param_Data, + Param_ChannelVolume, + Param_Balance, + Param_Control9, + Param_Panorama, + Param_Expression, + Param_Control12, + Param_Control13, + Param_Control14, + Param_Control15, + Param_Control16, + Param_Osc1Shape, + Param_Osc1PW, + Param_Osc1Wave, + Param_Osc1Semitone, + Param_Osc1Keyfollow, + Param_Osc2Shape, + Param_Osc2PW, + Param_Osc2Wave, + Param_Osc2Semitone, + Param_Osc2Detune, + Param_Osc2FMAmount, + Param_Osc2Sync, + Param_Osc2FltEnvAmt, + Param_FMFiltEnvAmt, + Param_Osc2Keyfollow, + Param_PerfControl_BankSelect, + Param_OscBalance, + Param_SubOscVolume, + Param_SubOscShape, + Param_OscMainVolume, + Param_NoiseVolume, + Param_RingModMVolume, + Param_NoiseColor, + Param_FilterCutA, + Param_FilterCutB, + Param_FilterResA, + Param_FilterResB, + Param_FilterEnvAmtA, + Param_FilterEnvAmtB, + Param_FilterKeyFollowA, + Param_FilterKeyFollowB, + Param_FilterBalance, + Param_SaturationCurve, + Param_FilterModeA, + Param_FilterModeB, + Param_FilterRouting, + Param_FilterEnvAttack, + Param_FilterEnvDecay, + Param_FilterEnvSustain, + Param_FilterEnvSustainTime, + Param_FilterEnvRelease, + Param_AmpEnvAttack, + Param_AmpEnvDecay, + Param_AmpEnvSustain, + Param_AmpEnvSustainTime, + Param_AmpEnvRelease, + Param_HoldPedal, + Param_PortamentoPedal, + Param_SostenutoPedal, + Param_Lfo1Rate, + Param_Lfo1Shape, + Param_Lfo1EnvMode, + Param_Lfo1Mode, + Param_Lfo1Symmetry, + Param_Lfo1Keyfollow, + Param_Lfo1KeyTrigger, + Param_Osc1Lfo1Amount, + Param_Osc2Lfo1Amount, + Param_PWLfo1Amount, + Param_ResoLfo1Amount, + Param_FltGainLfo1Amount, + Param_Lfo2Rate, + Param_Lfo2Shape, + Param_Lfo2EnvMode, + Param_Lfo2Mode, + Param_Lfo2Symmetry, + Param_Lfo2Keyfollow, + Param_Lfo2Keytrigger, + Param_OscShapeLfo2Amount, + Param_FmAmountLfo2Amount, + Param_Cutoff1Lfo2Amount, + Param_Cutoff2Lfo2Amount, + Param_PanoramaLfo2Amount, + Param_PatchVolume, + Param_Transpose, + Param_KeyMode, + Param_UnisonMode, + Param_UnisonDetune, + Param_UnisonPanSpread, + Param_UnisonLfoPhase, + Param_InputMode, + Param_InputSelect, + Param_ChorusMix, + Param_ChorusRate, + Param_ChorusDepth, + Param_ChorusDelay, + Param_ChorusFeedback, + Param_ChorusLfoShape, + Param_DelayReverbMode, + Param_EffectSend, + Param_DelayTime, + Param_DelayFeedback, + Param_DelayRateReverbDecayTime, + Param_DelayDepthReverbRoomSize, + Param_DelayLfoShape, + Param_DelayColor, + Param_KeybLocal, + Param_AllNotesOff, + + Param_ArpMode, + Param_ArpPatternSelect, + Param_ArpOctaveRange, + Param_ArpHoldEnable, + Param_ArpNoteLength, + Param_ArpSwing, + + Param_Lfo3Rate, + Param_Lfo3Shape, + Param_Lfo3Mode, + Param_Lfo3Keyfollow, + Param_Lfo3Destination, + Param_OscLfo3Amount, + Param_Lfo3FadeInTime, + Param_ClockTempo, + Param_ArpClock, + Param_Lfo1Clock, + Param_Lfo2Clock, + Param_DelayClock, + Param_Lfo3Clock, + Param_ControlSmoothMode, + Param_BenderRangeUp, + Param_BenderRangeDown, + Param_BenderScale, + Param_Filter1EnvPolarity, + Param_Filter2EnvPolarity, + Param_Filter2CutoffLink, + Param_FilterKeytrackBase, + Param_OscFMMode, + Param_OscInitPhase, + Param_PunchIntensity, + Param_InputFollowMode, + Param_VocoderMode, + Param_Osc3Mode, + Param_Osc3Volume, + Param_Osc3Semitone, + Param_Osc3Detune, + Param_LowEqFreq, + Param_HighEqFreq, + Param_Osc1ShapeVelocity, + Param_Osc2ShapeVelocity, + Param_PulseWidthVelocity, + Param_FmAmountVelocity, + Param_SoftKnob1ShortName, + Param_SoftKnob2ShortName, + Param_Filter1EnvAmtVelocity, + Param_Filter2EnvAmtVelocity, + Param_Resonance1Velocity, + Param_Resonance2Velocity, + Param_SecondOutputBalance, + Param_AmpVelocity, + Param_PanoramaVelocity, + Param_SoftKnob1Single, + Param_SoftKnob2Single, + Param_Assign1Source, + Param_Assign1Destination, + Param_Assign1Amount, + Param_Assign2Source, + Param_Assign2Destination1, + Param_Assign2Amount1, + Param_Assign2Destination2, + Param_Assign2Amount2, + Param_Assign3Source, + Param_Assign3Destination1, + Param_Assign3Amount1, + Param_Assign3Destination2, + Param_Assign3Amount2, + Param_Assign2Destination3, + Param_Assign2Amount3, + Param_Lfo1AssignDest, + Param_Lfo1AssignAmount, + Param_Lfo2AssignDest, + Param_Lfo2AssignAmount, + Param_PhaserMode, + Param_PhaserMix, + Param_PhaserRate, + Param_PhaserDepth, + Param_PhaserFreq, + Param_PhaserFeedback, + Param_PhaserSpread, + Param_MidEqGain, + Param_MidEqFreq, + Param_MidEqQFactor, + Param_LowEqGain, + Param_HighEqGain, + Param_BassIntensity, + Param_BassTune, + Param_InputRingMod, + Param_DistortionCurve, + Param_DistortionIntensity, + Param_Assign4Source, + Param_Assign4Destination, + Param_Assign4Amount, + Param_Assign5Source, + Param_Assign5Destination, + Param_Assign5Amount, + Param_Assign6Source, + Param_Assign6Destination, + Param_Assign6Amount, + Param_FilterSelect, + Param_Category1, + Param_Category2, + Param_DelayOutputSelect, + Param_PartBankSelect, + Param_PartBankChange, + Param_PartProgramChange, + Param_PartMidiChannel, + Param_PartLowKey, + Param_PartHighKey, + Param_PartTranspose, + Param_PartDetune, + Param_PartVolume, + Param_PartMidiVolumeInit, + Param_PartOutputSelect, + Param_GlobalSecondOutputSelect, + Param_GlobalKeybTransposeButtons, + Param_GlobalKeybLocal, + Param_GlobalKeybMode, + Param_GlobalKeybTranspose, + Param_GlobalKeyModWheelControl, + Param_GlobalKeybPedal1Control, + Param_GlobalKeybPedal2Control, + Param_GlobalKeybPressureSensitive, + Param_PartEnable, + Param_PartMidiVolumeEnable, + Param_PartHoldPedalEnable, + Param_KeybToMidi, + Param_NoteStealPriority, + Param_PartProgChangeEnable, + Param_GlobalProgChangeEnable, + Param_MultiProgChangeEnable, + Param_GlobalMidiVolumeEnable, + Param_InputThruLevel, + Param_InputBoost, + Param_MasterTune, + Param_DeviceID, + Param_MidiControlLowPage, + Param_MidiControlHighPage, + Param_MidiArpSend, + Param_KnobDisplay, + Param_MidiDumpTX, + Param_MidiDumpRX, + Param_MultiProgramChange, + Param_MidiClockRX, + Param_SoftKnob1Mode, + Param_SoftKnob2Mode, + Param_SoftKnob1Global, + Param_SoftKnob2Global, + Param_SoftKnob1Midi, + Param_SoftKnob2Midi, + Param_ExpertMode, + Param_KnobMode, + Param_MemoryProtect, + Param_SoftThru, + Param_PanelDestination, + Param_PlayMode, + Param_PartNumber, + Param_GlobalChannel, + Param_LedMode, + Param_LcdContrast, + Param_MasterVolume, + + // UNDEFINED / UNUSED / STUBS + Param_PageA_Undefined92, + Param_PageA_Undefined95, + Param_PageA_Undefined96, + Param_PageA_Undefined111, + Param_PageA_Undefined120, + Param_PageA_Undefined121, + Param_PageA_Undefined124, + Param_PageA_Undefined125, + Param_PageA_Undefined126, + Param_PageA_Undefined127, + Param_PageB_Undefined0, + Param_PageB_Undefined14, + Param_PageB_Undefined15, + Param_PageB_Undefined22, + Param_PageB_Undefined23, + Param_PageB_Undefined24, + Param_PageB_Undefined29, + Param_PageB_Undefined37, + Param_PageB_Undefined40, + Param_PageB_Undefined53, + Param_PageB_Undefined69, + Param_PageB_Undefined83, + Param_PageB_Undefined91, + Param_PageB_Undefined111, + Param_PageB_Undefined123, + Param_PageB_Undefined124, + Param_PageC_Undefined0, + Param_PageC_Undefined1, + Param_PageC_Undefined2, + Param_PageC_Undefined3, + Param_PageC_Undefined4, + Param_PageC_Undefined15, + Param_PageC_Undefined16, + Param_PageC_Undefined17, + Param_PageC_Undefined18, + Param_PageC_Undefined19, + Param_PageC_Undefined20, + Param_PageC_Undefined21, + Param_PageC_Undefined23, + Param_PageC_Undefined24, + Param_PageC_Undefined25, + Param_PageC_Undefined26, + Param_PageC_Undefined27, + Param_PageC_Undefined28, + Param_PageC_Undefined29, + Param_PageC_Undefined30, + Param_PageC_Undefined76, + Param_PageC_Undefined79, + Param_PageC_Undefined80, + Param_PageC_Undefined81, + Param_PageC_Undefined82, + Param_PageC_Undefined83, + Param_PageC_Undefined84, + Param_PageC_Undefined88, + Param_PageC_Undefined89, + Param_PageC_Undefined100, + Param_PageC_Undefined101, + Param_PageC_Undefined102, + Param_PageC_Undefined103, + Param_PageC_Undefined104, + Param_PageC_Undefined119, + // Text Chars / Unused + Param_PageB_Undefined110, + Param_PageB_Undefined111_, + Param_PageB_Undefined112, + Param_PageB_Undefined113, + Param_PageB_Undefined114, + Param_PageB_Undefined115, + Param_PageB_Undefined116, + Param_PageB_Undefined117, + Param_PageB_Undefined118, + Param_PageB_Undefined119, + Param_PageB_Undefined120, + Param_PageB_Undefined121, + Param_PageC_Undefined5, + Param_PageC_Undefined6, + Param_PageC_Undefined7, + Param_PageC_Undefined8, + Param_PageC_Undefined9, + Param_PageC_Undefined10, + Param_PageC_Undefined11, + Param_PageC_Undefined12, + Param_PageC_Undefined13, + Param_PageC_Undefined14, + + Param_Count + }; + + extern const std::initializer_list<Virus::Parameter::Description> g_paramsDescription; +}