refactor(params): structure parameter IDs into typed groups

Introduce paramIds namespace with Oscillator struct and constexpr
arrays for envelope, LFO, FX, and macro parameter IDs. Replace the
scattered local const char* arrays in Engine and PluginEditor with
references to these shared definitions.

Return ModSource::Count from modSourceFromString for unknown strings
instead of silently mapping to Lfo1. Simplify isPerVoiceSource and
isPerVoiceTarget to range-based expressions.
This commit is contained in:
2026-09-09 14:32:43 +02:00
parent 42d2302c28
commit 3b2ecc50f2
2 changed files with 47 additions and 21 deletions
+46 -20
View File
@@ -226,6 +226,50 @@ inline constexpr int kNumFxSlots = 8;
inline constexpr int kMaxUnison = 16;
inline constexpr int kNumVoices = 32;
namespace paramIds
{
struct Oscillator
{
const char *on, *wave, *wtPos, *warp, *warpAmt, *coarse, *fine, *level;
const char *pan, *unison, *detune, *spread, *phase, *randPhase;
};
inline constexpr Oscillator oscillators[kNumOscillators] = {
{ ids::oscAOn, ids::oscAWave, ids::oscAWtPos, ids::oscAWarp, ids::oscAWarpAmt,
ids::oscACoarse, ids::oscAFine, ids::oscALevel, ids::oscAPan, ids::oscAUnison,
ids::oscADetune, ids::oscASpread, ids::oscAPhase, ids::oscARandPh },
{ ids::oscBOn, ids::oscBWave, ids::oscBWtPos, ids::oscBWarp, ids::oscBWarpAmt,
ids::oscBCoarse, ids::oscBFine, ids::oscBLevel, ids::oscBPan, ids::oscBUnison,
ids::oscBDetune, ids::oscBSpread, ids::oscBPhase, ids::oscBRandPh }
};
inline constexpr const char* envAttack[] = { ids::env1A, ids::env2A, ids::env3A, ids::env4A };
inline constexpr const char* envDecay[] = { ids::env1D, ids::env2D, ids::env3D, ids::env4D };
inline constexpr const char* envSustain[] = { ids::env1S, ids::env2S, ids::env3S, ids::env4S };
inline constexpr const char* envRelease[] = { ids::env1R, ids::env2R, ids::env3R, ids::env4R };
inline constexpr const char* envCurve[] = { ids::env1Curve, ids::env2Curve, ids::env3Curve, ids::env4Curve };
inline constexpr const char* lfoRate[] = { ids::lfo1Rate, ids::lfo2Rate, ids::lfo3Rate, ids::lfo4Rate };
inline constexpr const char* lfoSync[] = { ids::lfo1Sync, ids::lfo2Sync, ids::lfo3Sync, ids::lfo4Sync };
inline constexpr const char* lfoBeat[] = { ids::lfo1Beat, ids::lfo2Beat, ids::lfo3Beat, ids::lfo4Beat };
inline constexpr const char* lfoShape[] = { ids::lfo1Shape, ids::lfo2Shape, ids::lfo3Shape, ids::lfo4Shape };
inline constexpr const char* lfoPhase[] = { ids::lfo1Phase, ids::lfo2Phase, ids::lfo3Phase, ids::lfo4Phase };
inline constexpr const char* lfoFade[] = { ids::lfo1Fade, ids::lfo2Fade, ids::lfo3Fade, ids::lfo4Fade };
inline constexpr const char* lfoDelay[] = { ids::lfo1Delay, ids::lfo2Delay, ids::lfo3Delay, ids::lfo4Delay };
inline constexpr const char* fxType[] = { ids::fx1Type, ids::fx2Type, ids::fx3Type, ids::fx4Type,
ids::fx5Type, ids::fx6Type, ids::fx7Type, ids::fx8Type };
inline constexpr const char* fxMix[] = { ids::fx1Mix, ids::fx2Mix, ids::fx3Mix, ids::fx4Mix,
ids::fx5Mix, ids::fx6Mix, ids::fx7Mix, ids::fx8Mix };
inline constexpr const char* fxP1[] = { ids::fx1P1, ids::fx2P1, ids::fx3P1, ids::fx4P1,
ids::fx5P1, ids::fx6P1, ids::fx7P1, ids::fx8P1 };
inline constexpr const char* fxP2[] = { ids::fx1P2, ids::fx2P2, ids::fx3P2, ids::fx4P2,
ids::fx5P2, ids::fx6P2, ids::fx7P2, ids::fx8P2 };
inline constexpr const char* fxP3[] = { ids::fx1P3, ids::fx2P3, ids::fx3P3, ids::fx4P3,
ids::fx5P3, ids::fx6P3, ids::fx7P3, ids::fx8P3 };
inline constexpr const char* fxP4[] = { ids::fx1P4, ids::fx2P4, ids::fx3P4, ids::fx4P4,
ids::fx5P4, ids::fx6P4, ids::fx7P4, ids::fx8P4 };
inline constexpr const char* macros[] = { ids::macro1, ids::macro2, ids::macro3, ids::macro4 };
}
// ---------------------------------------------------------------------------
// Modulation sources / destinations
// ---------------------------------------------------------------------------
@@ -261,14 +305,7 @@ inline constexpr int kNumModSources = (int) ModSource::Count;
// Is a given source per-voice (i.e. needs a value for each voice)?
inline bool isPerVoiceSource (ModSource s)
{
switch (s)
{
case ModSource::Env1: case ModSource::Env2:
case ModSource::Env3: case ModSource::Env4:
case ModSource::Velocity: case ModSource::Note:
case ModSource::Random: return true;
default: return false;
}
return (s >= ModSource::Env1 && s <= ModSource::Note) || s == ModSource::Random;
}
// Does a source already span -1..1 (bipolar range)?
@@ -280,18 +317,7 @@ inline bool isBipolarSource (ModSource s)
// Is a given target a per-voice parameter?
inline bool isPerVoiceTarget (ModTarget t)
{
switch (t)
{
case ModTarget::Master:
case ModTarget::FilterMix: case ModTarget::FilterOut:
case ModTarget::Fx1Mix: case ModTarget::Fx2Mix:
case ModTarget::Fx3Mix: case ModTarget::Fx4Mix:
case ModTarget::Fx5Mix: case ModTarget::Fx6Mix:
case ModTarget::Fx7Mix: case ModTarget::Fx8Mix:
return false;
default:
return true;
}
return t != ModTarget::Master && ! (t >= ModTarget::Fx1Mix && t <= ModTarget::Fx8Mix);
}
juce::String modSourceName (ModSource s);