memlnaut-nisps/playground/js/synth/fm-presets.js
w1n5t0n 329b326ede feat(playground): per-engine param presets for additive + FM (meml-ax4)
Additive engine: 5 presets across 3 tiers (Spectral Basics, Formant Play,
Harmonic Sculptor, Phase Explorer, Full Spectrum). FM engine: 5 presets
across 3 tiers (Simple FM, Bell Tones, Matrix Explorer, Feedback Machine,
Full Matrix).

Engine-aware preset system: applyPreset() dispatches to C15 groupOverrides
or new flat engineParamOverrides depending on active engine. Preset selector
dropdown rebuilds on engine switch. URL ?preset param searches all engines.
2026-04-03 18:26:12 +01:00

213 lines
7.5 KiB
JavaScript

// FM synth presets for NISPS playground
// Each preset defines which params are active (ML-controlled) and which are
// muted at safe defaults. Param IDs match faustParamAddress() output from
// fm-matrix.json (e.g. 'operators_op_1_op1_ratio', 'matrix_m21').
//
// 3 tiers of progressive complexity across 5 presets.
export const FM_PRESETS = [
// ======================================================================
// TIER 1 — Beginner (~12-15 active params)
// ======================================================================
{
id: 'fm-1',
name: '1.1',
tier: 1,
description: 'Simple FM — Op1/Op2 ratio+level, m21 mod index, op1 ADSR, master level',
active: [
'operators_op_1_op1_ratio',
'operators_op_1_op1_level',
'operators_op_2_op2_ratio',
'operators_op_2_op2_level',
'matrix_m21',
'operators_op_1_op1_attack',
'operators_op_1_op1_decay',
'operators_op_1_op1_sustain',
'operators_op_1_op1_release',
'master_level',
'master_stereo_spread',
'master_waveform_blend',
],
overrides: {
'operators_op_1_op1_ratio': { min: 0.15, max: 0.65, curve: 0.5 },
'operators_op_2_op2_ratio': { min: 0.15, max: 0.65, curve: 0.5 },
'matrix_m21': { min: 0.0, max: 0.5, curve: 0.4 },
'operators_op_1_op1_attack': { min: 0.0, max: 0.6, curve: 0.35 },
'operators_op_1_op1_decay': { min: 0.05, max: 0.5, curve: 0.4 },
'operators_op_1_op1_sustain': { min: 0.2, max: 0.9, curve: 0.55 },
'operators_op_1_op1_release': { min: 0.1, max: 0.6, curve: 0.45 },
'master_level': { min: 0.3, max: 0.85, curve: 0.5 },
'master_waveform_blend': { min: 0.0, max: 0.5, curve: 0.4 },
},
mutedOverrides: {},
groupCurves: {},
},
{
id: 'fm-2',
name: '1.2',
tier: 1,
description: 'Bell Tones — Op1-3 ratios+levels, m21+m31 indices, op1 ADSR, fb1, level',
active: [
'operators_op_1_op1_ratio',
'operators_op_1_op1_level',
'operators_op_2_op2_ratio',
'operators_op_2_op2_level',
'operators_op_3_op3_ratio',
'operators_op_3_op3_level',
'matrix_m21',
'matrix_m31',
'feedback_fb1',
'operators_op_1_op1_attack',
'operators_op_1_op1_decay',
'operators_op_1_op1_sustain',
'operators_op_1_op1_release',
'master_level',
],
overrides: {
'operators_op_1_op1_ratio': { min: 0.15, max: 0.55, curve: 0.5 },
'operators_op_2_op2_ratio': { min: 0.2, max: 0.7, curve: 0.55 },
'operators_op_3_op3_ratio': { min: 0.2, max: 0.7, curve: 0.55 },
'matrix_m21': { min: 0.0, max: 0.4, curve: 0.35 },
'matrix_m31': { min: 0.0, max: 0.35, curve: 0.3 },
'feedback_fb1': { min: 0.0, max: 0.4, curve: 0.3 },
'operators_op_1_op1_attack': { min: 0.0, max: 0.5, curve: 0.3 },
'operators_op_1_op1_decay': { min: 0.1, max: 0.6, curve: 0.45 },
'operators_op_1_op1_sustain': { min: 0.1, max: 0.7, curve: 0.45 },
'operators_op_1_op1_release': { min: 0.15, max: 0.7, curve: 0.5 },
'master_level': { min: 0.3, max: 0.8, curve: 0.5 },
},
mutedOverrides: {},
groupCurves: {},
},
// ======================================================================
// TIER 2 — Intermediate (~25-30 active params)
// ======================================================================
{
id: 'fm-3',
name: '2.1',
tier: 2,
description: 'Matrix Explorer — all 4 op ratios+levels, 6 cross-mod indices, all 4 ADSRs, LFO, level',
active: [
// All 4 operator ratios + levels
'operators_op_1_op1_ratio',
'operators_op_1_op1_level',
'operators_op_2_op2_ratio',
'operators_op_2_op2_level',
'operators_op_3_op3_ratio',
'operators_op_3_op3_level',
'operators_op_4_op4_ratio',
'operators_op_4_op4_level',
// 6 cross-modulation indices (half the matrix)
'matrix_m21',
'matrix_m31',
'matrix_m41',
'matrix_m32',
'matrix_m42',
'matrix_m43',
// All 4 operator ADSRs (op1 only for now — full for intermediate)
'operators_op_1_op1_attack',
'operators_op_1_op1_decay',
'operators_op_1_op1_sustain',
'operators_op_1_op1_release',
'operators_op_2_op2_attack',
'operators_op_2_op2_decay',
'operators_op_2_op2_sustain',
'operators_op_2_op2_release',
// LFO
'global_lfo_rate',
'global_lfo_depth',
'global_lfo_waveform',
// Master
'master_level',
'master_stereo_spread',
],
overrides: {
'matrix_m21': { min: 0.0, max: 0.5, curve: 0.4 },
'matrix_m31': { min: 0.0, max: 0.45, curve: 0.35 },
'matrix_m41': { min: 0.0, max: 0.4, curve: 0.35 },
'matrix_m32': { min: 0.0, max: 0.4, curve: 0.35 },
'matrix_m42': { min: 0.0, max: 0.35, curve: 0.3 },
'matrix_m43': { min: 0.0, max: 0.35, curve: 0.3 },
'global_lfo_depth': { min: 0.0, max: 0.6, curve: 0.35 },
},
mutedOverrides: {},
groupCurves: {},
},
{
id: 'fm-4',
name: '2.2',
tier: 2,
description: 'Feedback Machine — all op params, all 4 feedbacks, 4 key matrix indices, waveform blend, saturation, level',
active: [
// All 4 operator ratios + levels
'operators_op_1_op1_ratio',
'operators_op_1_op1_level',
'operators_op_2_op2_ratio',
'operators_op_2_op2_level',
'operators_op_3_op3_ratio',
'operators_op_3_op3_level',
'operators_op_4_op4_ratio',
'operators_op_4_op4_level',
// All 4 feedbacks
'feedback_fb1',
'feedback_fb2',
'feedback_fb3',
'feedback_fb4',
// 4 key cross-mod indices
'matrix_m21',
'matrix_m31',
'matrix_m12',
'matrix_m34',
// Op1 + Op2 ADSR
'operators_op_1_op1_attack',
'operators_op_1_op1_decay',
'operators_op_1_op1_sustain',
'operators_op_1_op1_release',
'operators_op_2_op2_attack',
'operators_op_2_op2_decay',
'operators_op_2_op2_sustain',
'operators_op_2_op2_release',
// Waveform, saturation, master
'master_waveform_blend',
'master_output_saturation',
'master_level',
'master_stereo_spread',
],
overrides: {
'feedback_fb1': { min: 0.0, max: 0.6, curve: 0.35 },
'feedback_fb2': { min: 0.0, max: 0.6, curve: 0.35 },
'feedback_fb3': { min: 0.0, max: 0.5, curve: 0.3 },
'feedback_fb4': { min: 0.0, max: 0.5, curve: 0.3 },
'master_output_saturation': { min: 0.0, max: 0.5, curve: 0.35 },
'matrix_m21': { min: 0.0, max: 0.5, curve: 0.4 },
'matrix_m31': { min: 0.0, max: 0.45, curve: 0.35 },
'matrix_m12': { min: 0.0, max: 0.4, curve: 0.35 },
'matrix_m34': { min: 0.0, max: 0.4, curve: 0.35 },
},
mutedOverrides: {},
groupCurves: {},
},
// ======================================================================
// TIER 3 — Advanced (all 55 params)
// ======================================================================
{
id: 'fm-5',
name: '3.1',
tier: 3,
description: 'Full Matrix — all 55 params active, no restrictions',
active: null, // null = all params active
overrides: {},
mutedOverrides: {},
groupCurves: {},
},
];
export const FM_PRESET_TIERS = [
{ tier: 1, label: 'Beginner' },
{ tier: 2, label: 'Intermediate' },
{ tier: 3, label: 'Advanced' },
];