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

@ -5,8 +5,8 @@ namespace prm {
static const Desc table[num] = {
// id name short min max def disc fine coarse
{ "osc1wave", "OSC1 WAVE", "O1WV", 0, 4, 2, true, 1, 1 },
{ "osc2wave", "OSC2 WAVE", "O2WV", 0, 4, 3, true, 1, 1 },
{ "osc1wave", "OSC1 WAVE", "O1WV", 0, 14, 2, true, 1, 1 },
{ "osc2wave", "OSC2 WAVE", "O2WV", 0, 14, 3, true, 1, 1 },
{ "detune", "DETUNE 2", "DT2", -50, 50, 8, false, 1, 6 },
{ "oscmix", "OSC BAL", "MIX", 0, 100, 52, false, 1, 8 },
{ "flttype", "FILTER TYPE", "FTYP", 0, 3, 1, true, 1, 1 },
@ -26,7 +26,7 @@ static const Desc table[num] = {
{ "lfoshape", "LFO SHAPE", "LFS", 0, 3, 0, true, 1, 1 },
{ "lfodepth", "LFO DEPTH", "LFD", 0, 1, 0.22f, false, 0.01f, 0.08f },
{ "lfotarget", "LFO TARGET", "LFT", 0, 2, 0, true, 1, 1 },
{ "fxtype", "FX TYPE", "FXT", 0, 3, 1, true, 1, 1 },
{ "fxtype", "FX TYPE", "FXT", 0, 7, 1, true, 1, 1 },
{ "fxamt", "FX DEPTH", "FXD", 0, 1, 0.30f, false, 0.01f, 0.08f },
{ "fxtime", "FX TIME", "FXT", 0.05f, 1.2f, 0.28f, false, 0.01f, 0.12f },
{ "vol", "MASTER VOL", "VOL", 0, 1, 0.85f, false, 0.01f, 0.08f },
@ -41,6 +41,10 @@ static const Desc table[num] = {
{ "arpoct", "ARP OCTAVES", "AOC", 1, 4, 1, true, 1, 1 },
{ "arpgate", "ARP GATE", "AGT", 10, 100, 70, false, 1, 10 },
{ "detune1", "DETUNE 1", "DT1", -50, 50, 0, false, 1, 6 },
{ "xmod", "CROSS MOD", "XML", 0, 3, 0, true, 1, 1 },
{ "xmix", "XMIX AMT", "XMX", 0, 1, 0, false, 0.01f, 0.08f },
{ "evolve", "EVOLVE", "EVO", 0, 1, 0, false, 0.01f, 0.08f },
{ "warp", "WARP", "WRP", 0, 1, 0, false, 0.01f, 0.08f },
};
const Desc& desc (Id id) { return table[static_cast<int>(id)]; }
@ -74,7 +78,11 @@ juce::AudioProcessorValueTreeState::ParameterLayout createLayout()
const char* waveName (int w)
{
switch (w) { case 0: return "SINE"; case 1: return "TRIANG"; case 2: return "SAWTOOTH";
case 3: return "PULSE"; case 4: return "NOISE"; default: return "-----"; }
case 3: return "PULSE"; case 4: return "NOISE"; case 5: return "FM ";
case 6: return "PWM "; case 7: return "SUPRSW "; case 8: return "DBLSAW ";
case 9: return "WARP "; case 10: return "HSYNC "; case 11: return "TINE ";
case 12: return "SEQ "; case 13: return "CHORD "; case 14: return "SUPRPL ";
default: return "-----"; }
}
const char* fltTypeName (int t)
@ -97,8 +105,15 @@ const char* lfoTargetName (int t)
const char* fxTypeName (int t)
{
switch (t) { case 0: return "OFF"; case 1: return "CHORUS"; case 2: return "DELAY ";
case 3: return "SPACE"; default: return "OFF"; }
switch (t) { case 0: return "OFF"; case 1: return "CHORUS"; case 2: return "DELAY ";
case 3: return "SPACE"; case 4: return "REV HALL"; case 5: return "ENS+REV";
case 6: return "DLY+REV"; case 7: return "CATHEDRAL"; default: return "OFF"; }
}
const char* xmodTypeName (int t)
{
switch (t) { case 0: return "OFF "; case 1: return "RING "; case 2: return "FM ";
case 3: return "AM "; default: return "OFF "; }
}
const char* arpRateName (int r)
@ -204,6 +219,10 @@ juce::String formatParam (Id id, float v)
return juce::String (t > 0 ? "+" : "") + juce::String (t) + "ST";
}
case Id::hq: return v >= 0.5f ? "HQ" : "ECO";
case Id::xmod: return xmodTypeName ((int) v);
case Id::xmix:
case Id::evolve:
case Id::warp: return fmtPercent (v);
case Id::arpOn: return v >= 0.5f ? "ON " : "OFF";
case Id::arpRate: return arpRateName ((int) v);
case Id::arpPattern: return arpPatternName ((int) v);