add generative evolution, cross-mod and reverb FX; expand preset bank

- 4 new params (xmod/xmix/evolve/warp) with free-running brownian evolution
- evolution: tune drift, osc2 detune sway, osc-mix crossfade, filter cutoff
  wander, resonance growl, warp drive/bias, cross-mod bloom
- per-voice unison detune spread for fat stacks
- FX engine: 3-tap ensemble chorus, filtered-feedback ping-pong delay,
  Schroeder hall reverb; new FX types 4-7 (REV HALL/ENS+REV/DLY+REV/CATHEDRAL)
- 195 presets: 40-field realignment, genre-tuned FX identities, showcase eval
- calibrate banks vs attack-inclusive peak (median 0.263); fix square-LFO
  on filter sustain collapse
This commit is contained in:
Armin 2026-09-10 16:55:47 +02:00
commit 35d6cd014a
8 changed files with 2016 additions and 601 deletions

View file

@ -14,6 +14,7 @@ struct VParams
float vol = 0.85f, pan = 0.0f, poly = 10.f, glide = 0.f, tune = 0.f;
float hq = 0.0f;
float arpOn = 0, arpRate = 2, arpPattern = 0, arpOct = 1, arpGate = 70;
float xmod = 0, xmix = 0, evolve = 0, warp = 0;
void update (const juce::AudioProcessorValueTreeState& apvts)
{
@ -38,6 +39,10 @@ struct VParams
arpPattern = get ("arppattern");
arpOct = get ("arpoct");
arpGate = get ("arpgate");
xmod = get ("xmod");
xmix = get ("xmix");
evolve = get ("evolve");
warp = get ("warp");
}
};
@ -131,12 +136,15 @@ private:
float panL = 0.71f, panR = 0.71f;
float curFreq = 0.0f, targetFreq = 0.0f;
double ph1 = 0.0, ph2 = 0.0, lfoPh = 0.0;
double ph1r = 0.0, ph2r = 0.0; // unwrapped phase for animated waves (FM/PWM/SUPRSW)
float lfoSH = 0.0f;
int lfoIdx = 0;
Env amp, flt;
float lp = 0.0f, bp = 0.0f, f1c = 0.0f;
float fcSm = 0.0f;
float outSmooth = 0.0f;
float drift = 0.0f, driftT = 0.0f; // slow random-unstable tuning wander
float dtSp = 0.0f; // unison detune spread (per voice, cents)
};
static constexpr int maxVoice = 16;
@ -150,7 +158,12 @@ private:
int stealIdx = 0;
juce::Random rng;
juce::Array<int> sustainedNotes;
double evoGoalT = 0.0; // samples until the next evolution excursion
float evoCur = 0.0f; // brownian wander in [-1, 1] (texture-scale)
float evoGoal = 0.0f; // excursion target, re-picked every 7-18 s
float evoSlow = 0.0f; // much slower wander (soundscape-scale, 1-3 min)
float curDetune1 = 0.0f; // cached for noteOn (unison spread sizing)
float osc (int wave, double ph);
float osc (int wave, double ph, double phRaw);
Voice* acquireVoice();
};