From 3b2ecc50f25d4a95fb5d39e898421c405e2b7bae Mon Sep 17 00:00:00 2001 From: Igor Barcik Date: Wed, 9 Sep 2026 14:32:43 +0200 Subject: [PATCH] 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. --- Source/Params.cpp | 2 +- Source/Params.h | 66 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/Source/Params.cpp b/Source/Params.cpp index 559b184..2f6af7c 100644 --- a/Source/Params.cpp +++ b/Source/Params.cpp @@ -50,7 +50,7 @@ ModSource modSourceFromString (const juce::String& s) for (int i = 0; i < kNumModSources; ++i) if (s == modSourceToString ((ModSource) i)) return (ModSource) i; - return ModSource::Lfo1; + return ModSource::Count; } juce::String modTargetName (ModTarget t) diff --git a/Source/Params.h b/Source/Params.h index 5c6d0e0..5c1a7c5 100644 --- a/Source/Params.h +++ b/Source/Params.h @@ -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);