fractal-midi 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +28 -0
  3. package/README.md +147 -0
  4. package/dist/am4/applicability.d.ts +61 -0
  5. package/dist/am4/applicability.d.ts.map +1 -0
  6. package/dist/am4/applicability.js +285 -0
  7. package/dist/am4/blockTypes.d.ts +43 -0
  8. package/dist/am4/blockTypes.d.ts.map +1 -0
  9. package/dist/am4/blockTypes.js +48 -0
  10. package/dist/am4/cacheEnums.d.ts +46 -0
  11. package/dist/am4/cacheEnums.d.ts.map +1 -0
  12. package/dist/am4/cacheEnums.js +734 -0
  13. package/dist/am4/cacheParams.d.ts +3533 -0
  14. package/dist/am4/cacheParams.d.ts.map +1 -0
  15. package/dist/am4/cacheParams.js +1996 -0
  16. package/dist/am4/editorControlLabels.d.ts +45 -0
  17. package/dist/am4/editorControlLabels.d.ts.map +1 -0
  18. package/dist/am4/editorControlLabels.js +15894 -0
  19. package/dist/am4/index.d.ts +28 -0
  20. package/dist/am4/index.d.ts.map +1 -0
  21. package/dist/am4/index.js +31 -0
  22. package/dist/am4/ir/preset.d.ts +24 -0
  23. package/dist/am4/ir/preset.d.ts.map +1 -0
  24. package/dist/am4/ir/preset.js +12 -0
  25. package/dist/am4/ir/transpile.d.ts +9 -0
  26. package/dist/am4/ir/transpile.d.ts.map +1 -0
  27. package/dist/am4/ir/transpile.js +19 -0
  28. package/dist/am4/locations.d.ts +32 -0
  29. package/dist/am4/locations.d.ts.map +1 -0
  30. package/dist/am4/locations.js +58 -0
  31. package/dist/am4/paramNames.d.ts +55 -0
  32. package/dist/am4/paramNames.d.ts.map +1 -0
  33. package/dist/am4/paramNames.js +863 -0
  34. package/dist/am4/paramNamesGenerated.d.ts +41 -0
  35. package/dist/am4/paramNamesGenerated.d.ts.map +1 -0
  36. package/dist/am4/paramNamesGenerated.js +183 -0
  37. package/dist/am4/parameterBridge.d.ts +46 -0
  38. package/dist/am4/parameterBridge.d.ts.map +1 -0
  39. package/dist/am4/parameterBridge.js +300 -0
  40. package/dist/am4/params.d.ts +9577 -0
  41. package/dist/am4/params.d.ts.map +1 -0
  42. package/dist/am4/params.js +4537 -0
  43. package/dist/am4/setParam.d.ts +414 -0
  44. package/dist/am4/setParam.d.ts.map +1 -0
  45. package/dist/am4/setParam.js +819 -0
  46. package/dist/am4/shared/paramHelpers.d.ts +55 -0
  47. package/dist/am4/shared/paramHelpers.d.ts.map +1 -0
  48. package/dist/am4/shared/paramHelpers.js +146 -0
  49. package/dist/am4/symbolicIds.d.ts +11 -0
  50. package/dist/am4/symbolicIds.d.ts.map +1 -0
  51. package/dist/am4/symbolicIds.js +587 -0
  52. package/dist/am4/typeApplicability.d.ts +39 -0
  53. package/dist/am4/typeApplicability.d.ts.map +1 -0
  54. package/dist/am4/typeApplicability.js +466 -0
  55. package/dist/am4/variantResolverTables.d.ts +51 -0
  56. package/dist/am4/variantResolverTables.d.ts.map +1 -0
  57. package/dist/am4/variantResolverTables.js +3128 -0
  58. package/dist/axe-fx-ii/blockTypes.d.ts +45 -0
  59. package/dist/axe-fx-ii/blockTypes.d.ts.map +1 -0
  60. package/dist/axe-fx-ii/blockTypes.js +116 -0
  61. package/dist/axe-fx-ii/index.d.ts +5 -0
  62. package/dist/axe-fx-ii/index.d.ts.map +1 -0
  63. package/dist/axe-fx-ii/index.js +18 -0
  64. package/dist/axe-fx-ii/paramAliases.d.ts +54 -0
  65. package/dist/axe-fx-ii/paramAliases.d.ts.map +1 -0
  66. package/dist/axe-fx-ii/paramAliases.js +146 -0
  67. package/dist/axe-fx-ii/params.d.ts +11502 -0
  68. package/dist/axe-fx-ii/params.d.ts.map +1 -0
  69. package/dist/axe-fx-ii/params.js +2847 -0
  70. package/dist/axe-fx-ii/setParam.d.ts +560 -0
  71. package/dist/axe-fx-ii/setParam.d.ts.map +1 -0
  72. package/dist/axe-fx-ii/setParam.js +888 -0
  73. package/dist/axe-fx-iii/blockTypes.d.ts +87 -0
  74. package/dist/axe-fx-iii/blockTypes.d.ts.map +1 -0
  75. package/dist/axe-fx-iii/blockTypes.js +156 -0
  76. package/dist/axe-fx-iii/enumOverlay.d.ts +73 -0
  77. package/dist/axe-fx-iii/enumOverlay.d.ts.map +1 -0
  78. package/dist/axe-fx-iii/enumOverlay.js +236 -0
  79. package/dist/axe-fx-iii/index.d.ts +9 -0
  80. package/dist/axe-fx-iii/index.d.ts.map +1 -0
  81. package/dist/axe-fx-iii/index.js +20 -0
  82. package/dist/axe-fx-iii/params.d.ts +179 -0
  83. package/dist/axe-fx-iii/params.d.ts.map +1 -0
  84. package/dist/axe-fx-iii/params.js +6913 -0
  85. package/dist/axe-fx-iii/setParam.d.ts +460 -0
  86. package/dist/axe-fx-iii/setParam.d.ts.map +1 -0
  87. package/dist/axe-fx-iii/setParam.js +910 -0
  88. package/dist/index.d.ts +2 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +12 -0
  91. package/dist/shared/checksum.d.ts +10 -0
  92. package/dist/shared/checksum.d.ts.map +1 -0
  93. package/dist/shared/checksum.js +14 -0
  94. package/dist/shared/device.d.ts +195 -0
  95. package/dist/shared/device.d.ts.map +1 -0
  96. package/dist/shared/device.js +27 -0
  97. package/dist/shared/index.d.ts +8 -0
  98. package/dist/shared/index.d.ts.map +1 -0
  99. package/dist/shared/index.js +11 -0
  100. package/dist/shared/lineage/amp-lineage.json +8313 -0
  101. package/dist/shared/lineage/axefx2-amp-lineage.json +5871 -0
  102. package/dist/shared/lineage/axefx2-delay-lineage.json +226 -0
  103. package/dist/shared/lineage/axefx2-drive-lineage.json +575 -0
  104. package/dist/shared/lineage/axefx2-reverb-lineage.json +467 -0
  105. package/dist/shared/lineage/cab-lineage.json +10777 -0
  106. package/dist/shared/lineage/chorus-lineage.json +173 -0
  107. package/dist/shared/lineage/compressor-lineage.json +338 -0
  108. package/dist/shared/lineage/delay-lineage.json +313 -0
  109. package/dist/shared/lineage/drive-lineage.json +1844 -0
  110. package/dist/shared/lineage/flanger-lineage.json +313 -0
  111. package/dist/shared/lineage/phaser-lineage.json +208 -0
  112. package/dist/shared/lineage/reverb-lineage.json +793 -0
  113. package/dist/shared/lineage/wah-lineage.json +117 -0
  114. package/dist/shared/lineageLookup.d.ts +69 -0
  115. package/dist/shared/lineageLookup.d.ts.map +1 -0
  116. package/dist/shared/lineageLookup.js +196 -0
  117. package/dist/shared/packValue.d.ts +40 -0
  118. package/dist/shared/packValue.d.ts.map +1 -0
  119. package/dist/shared/packValue.js +105 -0
  120. package/dist/shared/types.d.ts +23 -0
  121. package/dist/shared/types.d.ts.map +1 -0
  122. package/dist/shared/types.js +9 -0
  123. package/package.json +75 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Generated by scripts/gen-paramnames-from-resolver.ts — do not hand-edit.
3
+ *
4
+ * Friendly parameter names synthesized from the resolver MISSING set.
5
+ * Each entry is a (cache_id → snake_case_name) binding for a wire address
6
+ * the AM4-Edit variant resolver knows about but `paramNames.ts` has no
7
+ * hand-curated entry for.
8
+ *
9
+ * Source authority chain (firmware-truth):
10
+ * 1. AM4-Edit.exe variant resolver (FUN_1402e3da0)
11
+ * -> src/protocol/variantResolverTables.ts
12
+ * provides (block, parameterName, cache_id) bindings.
13
+ * 2. AM4-Edit.exe BinaryData ZIP -> __block_layout*.xml
14
+ * -> src/protocol/editorControlLabels.ts
15
+ * provides parameterName -> canonical display label.
16
+ * 3. AM4-Edit metadata cache (effectDefinitions_15_2p0.cache)
17
+ * -> samples/captured/decoded/cache-section{2,3}.json
18
+ * provides typecode / a / b / c -> unit + display range.
19
+ *
20
+ * Merge with the hand-curated `paramNames.ts` happens in
21
+ * `scripts/gen-params-from-cache.ts`. Resolver-derived entries are
22
+ * firmware-truth (from AM4-Edit.exe's per-variant dispatcher), so they
23
+ * win on (block, cache_id) → parameterName conflicts. Hand-curated
24
+ * entries from `paramNames.ts` were seeded from hardware captures —
25
+ * messy and occasionally mis-bound — so they yield to the resolver
26
+ * where the two disagree. For THIS regen, the generator only emits to
27
+ * cache_ids where `paramNames.ts` has no entry (the diff's MISSING
28
+ * set), so there is no actual conflict to resolve; the conflict-
29
+ * resolution rule applies to future broader regenerations.
30
+ *
31
+ * Coverage as of regen: 158 new wire-bound friendly names
32
+ * across 11 blocks.
33
+ *
34
+ * Comment beside each entry shows: <canonicalLabel> (<parameterName>) —
35
+ * the canonical AM4-Edit display label as users will see it on screen,
36
+ * paired with the firmware symbolic ID for cross-reference.
37
+ */
38
+ import type { ParamNameEntry } from './paramNames.js';
39
+ export declare const GENERATED_PARAM_NAMES: Readonly<Record<string, Readonly<Record<number, ParamNameEntry>>>>;
40
+ export declare const GENERATED_PARAM_NAMES_FIRMWARE = "AM4-Edit Mar 20 2026 build";
41
+ //# sourceMappingURL=paramNamesGenerated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paramNamesGenerated.d.ts","sourceRoot":"","sources":["../../src/am4/paramNamesGenerated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAqL3F,CAAC;AAEX,eAAO,MAAM,8BAA8B,+BAA+B,CAAC"}
@@ -0,0 +1,183 @@
1
+ export const GENERATED_PARAM_NAMES = {
2
+ amp: {
3
+ 21: 'proximity', // Proximity (CABINET_PROXIMITY2)
4
+ 38: 'master_vol_cap', // Master Vol Cap (DISTORT_MVCAP)
5
+ 51: 'hi_reso', // Hi Reso (DISTORT_SPKRHFGAIN)
6
+ 57: 'drive', // Drive (DISTORT_SPKRDRIVE)
7
+ 71: 'distance', // Distance (CABINET_DYNACAB_Z1)
8
+ 72: 'distance_dynacab_z2', // Distance (CABINET_DYNACAB_Z2)
9
+ 79: 'frequency', // Frequency (DISTORT_INEQFREQ)
10
+ 81: 'overdrive', // Overdrive (DISTORT_DRIVE2)
11
+ 86: 'definition', // Definition (DISTORT_DEFINITION)
12
+ 87: 'compression', // Compression (DISTORT_CFTHRESH)
13
+ 88: 'cfgrid', // DISTORT_CFGRID
14
+ 90: 'high_cut', // High Cut (DISTORT_HICUT)
15
+ 91: 'dynpres', // DISTORT_DYNPRES
16
+ 92: 'dyndepth', // DISTORT_DYNDEPTH
17
+ 96: 'tremfreq', // DISTORT_TREMFREQ
18
+ 97: 'tremdepth', // DISTORT_TREMDEPTH
19
+ 100: 'cathode_resistance', // Cathode Resistance (DISTORT_CBRATIO)
20
+ 102: 'dynimp', // DISTORT_DYNIMP
21
+ 106: 'indynamics', // DISTORT_INDYNAMICS
22
+ 110: 'gridhardness', // DISTORT_GRIDHARDNESS
23
+ 114: 'triode2extime', // DISTORT_TRIODE2EXTIME
24
+ 115: 'triode2rectime', // DISTORT_TRIODE2RECTIME
25
+ 119: 'triode1ratio', // DISTORT_TRIODE1RATIO
26
+ 120: 'cfhardness', // DISTORT_CFHARDNESS
27
+ 124: 'resolution', // DISTORT_RESOLUTION
28
+ 125: 'vccmon', // B+ (DISTORT_VCCMON)
29
+ 126: 'gain_gainmon', // Gain (DISTORT_GAINMON)
30
+ 127: 'mdmon', // DISTORT_MDMON
31
+ 128: 'indynmon', // DISTORT_INDYNMON
32
+ 137: 'headroom', // HEADROOM (DISTORT_VPLATEMON)
33
+ 138: 'presence_prepresence', // Presence (DISTORT_PREPRESENCE)
34
+ 140: 'high_cut_pahicut', // High Cut (DISTORT_PAHICUT)
35
+ 145: 'overdrive_volume', // Overdrive Volume (DISTORT_GLOBALMASTER)
36
+ 151: 'disablecabsync', // DISTORT_DISABLECABSYNC
37
+ },
38
+ drive: {
39
+ 15: 'slew_rate_slew', // Slew Rate (FUZZ_SLEW)
40
+ 19: 'bias_bias', // Bias (FUZZ_BIAS)
41
+ 40: 'diode_quantity_pdqty', // Diode+ Quantity (FUZZ_PDQTY)
42
+ 42: 'diode_quantity', // Diode- Quantity (FUZZ_NDQTY)
43
+ 43: 'dry_level', // Dry Level (FUZZ_DRYGAIN)
44
+ 44: 'bass_bass', // Bass (FUZZ_BASS)
45
+ 49: 'drive_drive2', // Drive (FUZZ_DRIVE2)
46
+ },
47
+ reverb: {
48
+ 13: 'high_decay', // High Decay (REVERB_HFRATIO)
49
+ 14: 'scattering', // Scattering (REVERB_DIFFUSION)
50
+ 16: 'reverbdelay', // REVERB_REVERBDELAY
51
+ 17: 'early_level', // Early Level (REVERB_EARLYLEVEL)
52
+ 18: 'late_level', // Late Level (REVERB_REVERBLEVEL)
53
+ 21: 'depth', // Depth (REVERB_DEPTH)
54
+ 22: 'rate', // Rate (REVERB_RATE)
55
+ 25: 'diffusion', // Diffusion (REVERB_INPDIFF)
56
+ 26: 'diffusion_time', // Diffusion Time (REVERB_INDIFFTIME)
57
+ 29: 'pickup_spacing', // Pickup Spacing (REVERB_WIDTH)
58
+ 30: 'frequency_1', // Frequency 1 (REVERB_FREQ1)
59
+ 31: 'frequency_2', // Frequency 2 (REVERB_FREQ2)
60
+ 32: 'q_1', // Q 1 (REVERB_Q1)
61
+ 33: 'q_2', // Q 2 (REVERB_Q2)
62
+ 34: 'gain_1', // Gain 1 (REVERB_GAIN1)
63
+ 35: 'gain_2', // Gain 2 (REVERB_GAIN2)
64
+ 37: 'low_decay', // Low Decay (REVERB_LFTIME)
65
+ 38: 'xover_frequency', // Xover Frequency (REVERB_LFXOVER)
66
+ 41: 'threshold', // Threshold (REVERB_THRESH)
67
+ 42: 'release_time', // Release Time (REVERB_RELEASE)
68
+ 43: 'early_diffusion', // Early Diffusion (REVERB_EARLYDIFF)
69
+ 44: 'early_diff_time', // Early Diff Time (REVERB_EARLYDIFFTIME)
70
+ 45: 'early_decay', // Early Decay (REVERB_EARLYDECAY)
71
+ 46: 'late_input_mix', // Late Input Mix (REVERB_EARLYSEND)
72
+ 49: 'basetype', // REVERB_BASETYPE
73
+ 50: 'lfo_phase', // LFO Phase (REVERB_LFOPHASE)
74
+ 55: 'pitch_mix', // Pitch Mix (REVERB_PITCHMIX)
75
+ 58: 'pitch_feedback', // Pitch Feedback (REVERB_PITCHFDBK)
76
+ 60: 'splice_time', // Splice Time (REVERB_PITCHTIME)
77
+ 62: 'pitch_modulation', // Pitch Modulation (REVERB_PITCHMOD)
78
+ 63: 'voice_balance', // Voice Balance (REVERB_PITCHBAL)
79
+ 65: 'feedback', // Feedback (REVERB_PREDLYFDBK)
80
+ 66: 'echo_mix', // Echo Mix (REVERB_PREDLYMIX)
81
+ 67: 'pitch_high_cut', // Pitch High Cut (REVERB_PITCHLPF)
82
+ 69: 'tonetype', // REVERB_TONETYPE
83
+ 71: 'low_cut_q', // Low Cut Q (REVERB_LOWQ)
84
+ 72: 'high_cut_q', // High Cut Q (REVERB_HIGHQ)
85
+ },
86
+ delay: {
87
+ 15: 'tempo_1', // Tempo 1 (MULTITAP_TEMPO1)
88
+ 17: 'echo_pan', // Echo Pan (DELAY_DELAYPAN)
89
+ 22: 'mod_rate', // Mod Rate (DELAY_RATE1)
90
+ 23: 'rate', // Rate (DELAY_RATE2)
91
+ 24: 'mod_depth', // Mod Depth (DELAY_DEPTH1)
92
+ 25: 'mod_depth_depth2', // Mod Depth (DELAY_DEPTH2)
93
+ 30: 'time_r', // Time R (DELAY_TIMER)
94
+ 34: 'rotation', // Rotation (DELAY_FEEDLR)
95
+ 35: 'lfo_1_type', // LFO 1 Type (MULTITAP_LFOTYPE1)
96
+ 36: 'level_l', // Level L (DELAY_LEVELL)
97
+ 37: 'level_r', // Level R (DELAY_LEVELR)
98
+ 38: 'pan_l', // Pan L (DELAY_PANL)
99
+ 39: 'pan_r', // Pan R (DELAY_PANR)
100
+ 40: 'modulation_phase', // Modulation Phase (DELAY_LFO1PHASE)
101
+ 41: 'lfo_phase', // LFO Phase (DELAY_LFO2PHASE)
102
+ 42: 'crossfade_time', // Crossfade Time (DELAY_SPLICETIME)
103
+ 56: 'sweep_rate', // Sweep Rate (DELAY_RATE3)
104
+ 58: 'sweep_phase', // Sweep Phase (DELAY_LFO3PHASE)
105
+ 60: 'sweep_start_freq', // Sweep Start Freq (DELAY_FSTART)
106
+ 61: 'sweep_stop_freq', // Sweep Stop Freq (DELAY_FSTOP)
107
+ 62: 'sweep_resonance', // Sweep Resonance (DELAY_Q)
108
+ 73: 'right_post_delay', // Right Post Delay (DELAY_OFFSET)
109
+ 82: 'pan_rate', // Pan Rate (DELAY_RATE4)
110
+ 84: 'pan_depth', // Pan Depth (DELAY_DEPTH4)
111
+ 85: 'lfo_phase_lfo4phase', // LFO Phase (DELAY_LFO4PHASE)
112
+ },
113
+ chorus: {
114
+ 28: 'left_depth', // Left Depth (CHORUS_DEPTHL)
115
+ 29: 'center_depth', // Center Depth (CHORUS_DEPTHC)
116
+ 30: 'right_depth', // Right Depth (CHORUS_DEPTHR)
117
+ },
118
+ flanger: {
119
+ 16: 'dry_delay', // Dry Delay (FLANGER_DRYDELAY)
120
+ 19: 'smooth_steps', // Smooth Steps (FLANGER_LFOFILTER)
121
+ 23: 'high_cut', // High Cut (FLANGER_LPFREQ)
122
+ 24: 'drive', // Drive (FLANGER_DRIVE)
123
+ 25: 'low_cut', // Low Cut (FLANGER_HPFREQ)
124
+ 26: 'stereo_spread', // Stereo Spread (FLANGER_SPREAD)
125
+ 30: 'bass_focus', // Bass Focus (FLANGER_FOCUS)
126
+ 32: 'min_time', // Min Time (FLANGER_TMIN)
127
+ 33: 'max_time', // Max Time (FLANGER_TMAX)
128
+ 35: 'vpo_exponent', // VPO Exponent (FLANGER_VCOK)
129
+ },
130
+ phaser: {
131
+ 17: 'min_frequency', // Min Frequency (PHASER_FMIN)
132
+ 18: 'max_frequency', // Max Frequency (PHASER_FMAX)
133
+ 20: 'bias', // Bias (PHASER_BIAS)
134
+ 22: 'feedback_point', // Feedback Point (PHASER_FBTAP)
135
+ 23: 'tone', // Tone (PHASER_TONE)
136
+ 25: 'q', // Q (PHASER_Q)
137
+ 29: 'shape_vcrk', // Shape (PHASER_VCRK)
138
+ 30: 'shape', // Shape (PHASER_LFOBETA)
139
+ 31: 'high_cut', // High Cut (PHASER_LFOLPF)
140
+ 32: 'attack', // Attack (PHASER_ATTACK)
141
+ 33: 'release', // Release (PHASER_RELEASE)
142
+ 35: 'low_cut', // Low Cut (PHASER_HPF)
143
+ 36: 'high_cut_lpf', // High Cut (PHASER_LPF)
144
+ },
145
+ compressor: {
146
+ 20: 'compression', // Compression (COMP_SUSTAIN)
147
+ 24: 'dynamics', // Dynamics (COMP_DYNAMICS)
148
+ 33: 'threshold_thresh2', // Threshold (COMP_THRESH2)
149
+ 36: 'ratio_compansion', // Ratio (COMP_COMPANSION)
150
+ 37: 'time', // Time (COMP_COMPTIME)
151
+ 38: 'transients', // Transients (COMP_COMPMATCH)
152
+ 40: 'tone', // Tone (COMP_TONE)
153
+ },
154
+ filter: {
155
+ 12: 'q', // Q (FILTER_Q)
156
+ 13: 'gain', // Gain (FILTER_GAIN)
157
+ 15: 'pan_left', // Pan Left (FILTER_PANL)
158
+ 16: 'pan_right', // Pan Right (FILTER_PANR)
159
+ 20: 'delay_time', // Delay Time (FILTER_COMBTIME)
160
+ 24: 'rate', // Rate (FILTER_LFOFREQ)
161
+ 25: 'lfo_duty', // LFO Duty (FILTER_LFODUTY)
162
+ 26: 'mod_frequency', // Mod Frequency (FILTER_MODFREQ)
163
+ 30: 'resonance', // Resonance (FILTER_EVFQ)
164
+ 31: 'start_frequency', // Start Frequency (FILTER_START)
165
+ 32: 'stop_frequency', // Stop Frequency (FILTER_STOP)
166
+ 34: 'attack_time', // Attack Time (FILTER_ATTACK)
167
+ 35: 'release_time', // Release Time (FILTER_RELEASE)
168
+ 36: 'sweep_shape', // Sweep Shape (FILTER_BETA)
169
+ 39: 'emphasis', // Emphasis (FILTER_EMPH)
170
+ },
171
+ tremolo: {
172
+ 14: 'duty', // Duty (TREMOLO_DUTY)
173
+ 19: 'start_phase', // Start Phase (TREMOLO_STARTPHASE)
174
+ 21: 'crossover_freq', // Crossover Freq (TREMOLO_XOVER)
175
+ 22: 'trigger_threshold', // Trigger Threshold (TREMOLO_THRESH)
176
+ 23: 'shape', // Shape (TREMOLO_BETA)
177
+ },
178
+ enhancer: {
179
+ 16: 'pan_left', // Pan Left (ENHANCER_PANL)
180
+ 17: 'pan_right', // Pan Right (ENHANCER_PANR)
181
+ },
182
+ };
183
+ export const GENERATED_PARAM_NAMES_FIRMWARE = 'AM4-Edit Mar 20 2026 build';
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Generated by scripts/bridge-paramnames-to-xml.ts. Do not hand-edit.
3
+ *
4
+ * Joins the hand-curated paramNames.ts to the XML-derived
5
+ * editorControlLabels.ts and exposes the result as a runtime lookup
6
+ * keyed by (block, snake_case_name). Each entry binds:
7
+ * - parameterName: AM4-Edit's internal symbolic ID
8
+ * (e.g. "DISTORT_BRIGHTCAP" — usable as a stable cross-firmware key)
9
+ * - canonicalLabel: the display label AM4-Edit shows on its UI
10
+ * (e.g. "Bright Cap" — used in tool descriptions and agent output
11
+ * so the agent's vocabulary matches what the user reads on screen)
12
+ *
13
+ * This module is a strict refinement layer over paramNames.ts: the
14
+ * underlying wire IDs are unchanged. Only labels and parameterNames
15
+ * are added. Coverage is reached via four passes: display-label
16
+ * match, positional alignment (GEQ/PEQ band patterns), resolver-
17
+ * direct fallback for entries the AM4-Edit dispatcher binds, and a
18
+ * universal block-level register fallback (mix/balance/level/bypass)
19
+ * for wire registers AM4-Edit does not surface in every block UI.
20
+ */
21
+ export interface ParameterBridgeEntry {
22
+ block: string;
23
+ name: string;
24
+ parameterName: string;
25
+ canonicalLabel: string;
26
+ }
27
+ export declare const PARAMETER_BRIDGE_FIRMWARE = "AM4-Edit Mar 20 2026 build";
28
+ export declare const PARAMETER_BRIDGE: Readonly<Record<string, Readonly<Record<string, {
29
+ readonly parameterName: string;
30
+ readonly canonicalLabel: string;
31
+ }>>>>;
32
+ /**
33
+ * Resolve the AM4-Edit canonical display label and symbolic
34
+ * parameterName for a (block, name) pair from paramNames.ts.
35
+ *
36
+ * Returns undefined if the (block, name) has no XML correspondence
37
+ * yet — the caller should fall back to the snake_case name from
38
+ * paramNames.ts as the display label.
39
+ */
40
+ export declare function resolveBridge(block: string, name: string): {
41
+ parameterName: string;
42
+ canonicalLabel: string;
43
+ } | undefined;
44
+ /** Canonical label for a (block, name), or the original `name`. */
45
+ export declare function preferredDisplayLabel(block: string, name: string): string;
46
+ //# sourceMappingURL=parameterBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterBridge.d.ts","sourceRoot":"","sources":["../../src/am4/parameterBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AAEtE,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC,CAuQpJ,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACnD;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACjD,SAAS,CAGd;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Generated by scripts/bridge-paramnames-to-xml.ts. Do not hand-edit.
3
+ *
4
+ * Joins the hand-curated paramNames.ts to the XML-derived
5
+ * editorControlLabels.ts and exposes the result as a runtime lookup
6
+ * keyed by (block, snake_case_name). Each entry binds:
7
+ * - parameterName: AM4-Edit's internal symbolic ID
8
+ * (e.g. "DISTORT_BRIGHTCAP" — usable as a stable cross-firmware key)
9
+ * - canonicalLabel: the display label AM4-Edit shows on its UI
10
+ * (e.g. "Bright Cap" — used in tool descriptions and agent output
11
+ * so the agent's vocabulary matches what the user reads on screen)
12
+ *
13
+ * This module is a strict refinement layer over paramNames.ts: the
14
+ * underlying wire IDs are unchanged. Only labels and parameterNames
15
+ * are added. Coverage is reached via four passes: display-label
16
+ * match, positional alignment (GEQ/PEQ band patterns), resolver-
17
+ * direct fallback for entries the AM4-Edit dispatcher binds, and a
18
+ * universal block-level register fallback (mix/balance/level/bypass)
19
+ * for wire registers AM4-Edit does not surface in every block UI.
20
+ */
21
+ export const PARAMETER_BRIDGE_FIRMWARE = 'AM4-Edit Mar 20 2026 build';
22
+ export const PARAMETER_BRIDGE = {
23
+ amp: {
24
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
25
+ "bass": { parameterName: "DISTORT_BASS", canonicalLabel: "Bass" },
26
+ "bright_cap": { parameterName: "DISTORT_BRIGHTCAP", canonicalLabel: "Bright Cap" },
27
+ "compressor_amount": { parameterName: "DISTORT_COMPRESSION", canonicalLabel: "Amount" },
28
+ "compressor_clarity": { parameterName: "DISTORT_CLARITY", canonicalLabel: "Clarity" },
29
+ "compressor_threshold": { parameterName: "DISTORT_THRESHOLD", canonicalLabel: "Threshold" },
30
+ "depth": { parameterName: "DISTORT_DEPTH", canonicalLabel: "Depth" },
31
+ "gain": { parameterName: "DISTORT_DRIVE", canonicalLabel: "Gain" },
32
+ "geq_band_1": { parameterName: "DISTORT_EQ1", canonicalLabel: "Low" },
33
+ "geq_band_2": { parameterName: "DISTORT_EQ2", canonicalLabel: "Mid" },
34
+ "geq_band_3": { parameterName: "DISTORT_EQ3", canonicalLabel: "Treble" },
35
+ "geq_band_4": { parameterName: "DISTORT_EQ4", canonicalLabel: "Presence" },
36
+ "geq_band_5": { parameterName: "DISTORT_EQ5", canonicalLabel: "1K" },
37
+ "geq_band_6": { parameterName: "DISTORT_EQ6", canonicalLabel: "2K" },
38
+ "geq_band_7": { parameterName: "DISTORT_EQ7", canonicalLabel: "4K" },
39
+ "geq_band_8": { parameterName: "DISTORT_EQ8", canonicalLabel: "8K" },
40
+ "high_treble": { parameterName: "DISTORT_HITREBLE", canonicalLabel: "High Treble" },
41
+ "input_trim": { parameterName: "DISTORT_TRIM", canonicalLabel: "Input Trim" },
42
+ "master": { parameterName: "DISTORT_MASTER", canonicalLabel: "Master" },
43
+ "master_vol_trim": { parameterName: "DISTORT_MVTRIM", canonicalLabel: "Master Vol Trim" },
44
+ "mid": { parameterName: "DISTORT_MID", canonicalLabel: "Mid" },
45
+ "out_boost_level": { parameterName: "BLOCK_OUTBOOSTDB", canonicalLabel: "Out Boost Level" },
46
+ "presence": { parameterName: "DISTORT_PRESENCE", canonicalLabel: "Presence" },
47
+ "treble": { parameterName: "DISTORT_TREBLE", canonicalLabel: "Treble" },
48
+ "type": { parameterName: "DISTORT_TYPE", canonicalLabel: "Type" },
49
+ },
50
+ chorus: {
51
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
52
+ "depth": { parameterName: "CHORUS_DEPTH", canonicalLabel: "Depth" },
53
+ "drive": { parameterName: "CHORUS_DRIVE", canonicalLabel: "Drive" },
54
+ "high_cut": { parameterName: "CHORUS_HICUT", canonicalLabel: "High Cut" },
55
+ "lfo_depth_2": { parameterName: "CHORUS_SPREAD", canonicalLabel: "Stereo Spread" },
56
+ "lfo_freq": { parameterName: "CHORUS_LOWCUT", canonicalLabel: "Low Cut" },
57
+ "lfo_phase_pct": { parameterName: "CHORUS_WIDTH", canonicalLabel: "Right\nTime Ratio" },
58
+ "lfo_rate": { parameterName: "CHORUS_RATE2", canonicalLabel: "Rate Right" },
59
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
60
+ "number_of_voices": { parameterName: "CHORUS_VOICES", canonicalLabel: "Number of Voices" },
61
+ "rate": { parameterName: "CHORUS_RATE", canonicalLabel: "Rate" },
62
+ "type": { parameterName: "CHORUS_TYPE", canonicalLabel: "CHORUS_TYPE" },
63
+ "width": { parameterName: "CHORUS_DEPTH2", canonicalLabel: "LFO 2 Depth" },
64
+ },
65
+ compressor: {
66
+ "attack": { parameterName: "COMP_ATTACK", canonicalLabel: "Attack" },
67
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
68
+ "drive": { parameterName: "COMP_DRIVE", canonicalLabel: "Drive" },
69
+ "emphasis": { parameterName: "COMP_EMPHASIS", canonicalLabel: "Emphasis" },
70
+ "look_ahead_time": { parameterName: "COMP_DELAYTIME", canonicalLabel: "Look-Ahead Time" },
71
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
72
+ "ratio": { parameterName: "COMP_RATIO", canonicalLabel: "Ratio" },
73
+ "release": { parameterName: "COMP_RELEASE", canonicalLabel: "Release Time" },
74
+ "sidechain_emphasis_freq": { parameterName: "COMP_EMPHFREQ", canonicalLabel: "Emphasis Freq" },
75
+ "sidechain_frequency": { parameterName: "COMP_FREQ", canonicalLabel: "Frequency" },
76
+ "sidechain_gain": { parameterName: "COMP_GAIN", canonicalLabel: "Gain" },
77
+ "sidechain_high_cut": { parameterName: "COMP_HIGHCUT", canonicalLabel: "High Cut" },
78
+ "sidechain_low_cut": { parameterName: "COMP_LOWCUT", canonicalLabel: "Low Cut" },
79
+ "sidechain_q": { parameterName: "COMP_Q", canonicalLabel: "Q" },
80
+ "threshold": { parameterName: "COMP_THRESH", canonicalLabel: "Threshold" },
81
+ "type": { parameterName: "COMP_TYPE", canonicalLabel: "COMP_TYPE" },
82
+ },
83
+ delay: {
84
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
85
+ "bit_reduction": { parameterName: "DELAY_BITREDUCE", canonicalLabel: "Bit Reduction" },
86
+ "compander_threshold": { parameterName: "DELAY_COMPTHRESH", canonicalLabel: "Threshold" },
87
+ "compander_time": { parameterName: "DELAY_COMPTIME", canonicalLabel: "Time" },
88
+ "diffusion_time": { parameterName: "DELAY_DIFFTIME", canonicalLabel: "Diffusion Time" },
89
+ "diffusor": { parameterName: "DELAY_DIFFUSE", canonicalLabel: "Diffuser" },
90
+ "ducker_release": { parameterName: "DELAY_RELEASE", canonicalLabel: "Release" },
91
+ "ducker_threshold": { parameterName: "DELAY_THRESH", canonicalLabel: "Threshold" },
92
+ "ducking": { parameterName: "DELAY_ATTEN", canonicalLabel: "Ducking" },
93
+ "eq_freq_1": { parameterName: "DELAY_FREQ1", canonicalLabel: "Frequency 1" },
94
+ "eq_freq_2": { parameterName: "DELAY_FREQ2", canonicalLabel: "Frequency 2" },
95
+ "eq_gain_1": { parameterName: "DELAY_GAIN1", canonicalLabel: "Gain 1" },
96
+ "eq_gain_2": { parameterName: "DELAY_GAIN2", canonicalLabel: "Gain 2" },
97
+ "eq_q_1": { parameterName: "DELAY_Q1", canonicalLabel: "Q 1" },
98
+ "eq_q_2": { parameterName: "DELAY_Q2", canonicalLabel: "Q 2" },
99
+ "eq_q_high_low": { parameterName: "DELAY_FILTERQ", canonicalLabel: "Q (High + Low)" },
100
+ "feedback": { parameterName: "DELAY_FEED", canonicalLabel: "Feedback" },
101
+ "feedback_r": { parameterName: "DELAY_FEEDR", canonicalLabel: "Feedback R" },
102
+ "high_cut": { parameterName: "DELAY_HICUT", canonicalLabel: "High Cut" },
103
+ "hold_feedback": { parameterName: "DELAY_HOLDFDBK", canonicalLabel: "Hold Feedback" },
104
+ "input_gain": { parameterName: "DELAY_GAIN", canonicalLabel: "Input Gain" },
105
+ "lfo_depth": { parameterName: "DELAY_DIFFDEPTH", canonicalLabel: "LFO Depth" },
106
+ "lfo_rate": { parameterName: "DELAY_DIFFRATE", canonicalLabel: "LFO Rate" },
107
+ "low_cut": { parameterName: "DELAY_LOCUT", canonicalLabel: "Low Cut" },
108
+ "lr_time_ratio": { parameterName: "DELAY_RATIO", canonicalLabel: "L/R Time Ratio" },
109
+ "master_feedback": { parameterName: "DELAY_MSTRFDBK", canonicalLabel: "Master Feedback" },
110
+ "master_time": { parameterName: "DELAY_MSTRTIME", canonicalLabel: "Master Time" },
111
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
112
+ "motor_speed": { parameterName: "DELAY_SPEED", canonicalLabel: "Motor\nSpeed" },
113
+ "stack_feedback": { parameterName: "DELAY_STACKFDBK", canonicalLabel: "Stack Feedback" },
114
+ "stereo_spread": { parameterName: "DELAY_SPREAD", canonicalLabel: "Stereo Spread" },
115
+ "time": { parameterName: "DELAY_TIME", canonicalLabel: "Time" },
116
+ "type": { parameterName: "DELAY_MODEL", canonicalLabel: "DELAY_MODEL" },
117
+ },
118
+ drive: {
119
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
120
+ "bass": { parameterName: "FUZZ_LOW", canonicalLabel: "Bass" },
121
+ "bit_reduce": { parameterName: "FUZZ_BITREDUCE", canonicalLabel: "Bit Reduce" },
122
+ "drive": { parameterName: "FUZZ_DRIVE", canonicalLabel: "Drive" },
123
+ "geq_band_1": { parameterName: "FUZZ_EQ1", canonicalLabel: "100" },
124
+ "geq_band_10": { parameterName: "FUZZ_EQ10", canonicalLabel: "6400" },
125
+ "geq_band_2": { parameterName: "FUZZ_EQ2", canonicalLabel: "160" },
126
+ "geq_band_3": { parameterName: "FUZZ_EQ3", canonicalLabel: "250" },
127
+ "geq_band_4": { parameterName: "FUZZ_EQ4", canonicalLabel: "400" },
128
+ "geq_band_5": { parameterName: "FUZZ_EQ5", canonicalLabel: "640" },
129
+ "geq_band_6": { parameterName: "FUZZ_EQ6", canonicalLabel: "1000" },
130
+ "geq_band_7": { parameterName: "FUZZ_EQ7", canonicalLabel: "1600" },
131
+ "geq_band_8": { parameterName: "FUZZ_EQ8", canonicalLabel: "2500" },
132
+ "geq_band_9": { parameterName: "FUZZ_EQ9", canonicalLabel: "4000" },
133
+ "high_cut": { parameterName: "FUZZ_HICUT", canonicalLabel: "High Cut" },
134
+ "high_mid": { parameterName: "FUZZ_HIMID", canonicalLabel: "High Mid" },
135
+ "level": { parameterName: "FUZZ_LEVEL", canonicalLabel: "Level" },
136
+ "low_cut": { parameterName: "FUZZ_LOCUT", canonicalLabel: "Low Cut" },
137
+ "mid": { parameterName: "FUZZ_MID", canonicalLabel: "Mid" },
138
+ "mid_freq": { parameterName: "FUZZ_MIDFREQ", canonicalLabel: "Mid Frequency" },
139
+ "mix": { parameterName: "FUZZ_MIX", canonicalLabel: "Blend" },
140
+ "tone": { parameterName: "FUZZ_TONE", canonicalLabel: "Tone" },
141
+ "treble": { parameterName: "FUZZ_TREBLE", canonicalLabel: "Treble" },
142
+ "type": { parameterName: "FUZZ_TYPE", canonicalLabel: "FUZZ_TYPE" },
143
+ },
144
+ enhancer: {
145
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
146
+ "depth": { parameterName: "ENHANCER_DEPTH", canonicalLabel: "Depth" },
147
+ "high_cut": { parameterName: "ENHANCER_HICUT", canonicalLabel: "High Cut" },
148
+ "low_cut": { parameterName: "ENHANCER_LOWCUT", canonicalLabel: "Low Cut" },
149
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
150
+ "type": { parameterName: "ENHANCER_TYPE", canonicalLabel: "ENHANCER_TYPE" },
151
+ "width": { parameterName: "ENHANCER_WIDTH", canonicalLabel: "Width" },
152
+ },
153
+ filter: {
154
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
155
+ "feedback": { parameterName: "FILTER_FEEDBACK", canonicalLabel: "Feedback" },
156
+ "freq": { parameterName: "FILTER_FREQ", canonicalLabel: "Frequency" },
157
+ "high_cut": { parameterName: "FILTER_HICUT", canonicalLabel: "High Cut" },
158
+ "low_cut": { parameterName: "FILTER_LOWCUT", canonicalLabel: "Low Cut" },
159
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
160
+ "order": { parameterName: "FILTER_APORDER", canonicalLabel: "Order" },
161
+ "sensitivity": { parameterName: "FILTER_SENS", canonicalLabel: "Sensitivity" },
162
+ "type": { parameterName: "FILTER_TYPE", canonicalLabel: "Type" },
163
+ },
164
+ flanger: {
165
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
166
+ "depth": { parameterName: "FLANGER_DEPTH", canonicalLabel: "Depth" },
167
+ "feedback": { parameterName: "FLANGER_FEEDBACK", canonicalLabel: "Feedback" },
168
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
169
+ "rate": { parameterName: "FLANGER_RATE", canonicalLabel: "Rate" },
170
+ "type": { parameterName: "FLANGER_TYPE", canonicalLabel: "FLANGER_TYPE" },
171
+ },
172
+ gate: {
173
+ "attack": { parameterName: "GATE_ATTACK", canonicalLabel: "Attack" },
174
+ "attenuation": { parameterName: "GATE_RANGE", canonicalLabel: "Attenuation" },
175
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
176
+ "hold": { parameterName: "GATE_HOLD", canonicalLabel: "Hold" },
177
+ "release": { parameterName: "GATE_RELEASE", canonicalLabel: "Release" },
178
+ "threshold": { parameterName: "GATE_THRESH", canonicalLabel: "Threshold" },
179
+ "type": { parameterName: "GATE_TYPE", canonicalLabel: "GATE_TYPE" },
180
+ },
181
+ geq: {
182
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
183
+ "band_1": { parameterName: "GEQ_GAIN1", canonicalLabel: "100" },
184
+ "band_10": { parameterName: "GEQ_GAIN10", canonicalLabel: "16k" },
185
+ "band_2": { parameterName: "GEQ_GAIN2", canonicalLabel: "160" },
186
+ "band_3": { parameterName: "GEQ_GAIN3", canonicalLabel: "400" },
187
+ "band_4": { parameterName: "GEQ_GAIN4", canonicalLabel: "800" },
188
+ "band_5": { parameterName: "GEQ_GAIN5", canonicalLabel: "500" },
189
+ "band_6": { parameterName: "GEQ_GAIN6", canonicalLabel: "1k" },
190
+ "band_7": { parameterName: "GEQ_GAIN7", canonicalLabel: "2k" },
191
+ "band_8": { parameterName: "GEQ_GAIN8", canonicalLabel: "4k" },
192
+ "band_9": { parameterName: "GEQ_GAIN9", canonicalLabel: "8k" },
193
+ "master_q": { parameterName: "GEQ_MASTERQ", canonicalLabel: "Master Q" },
194
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
195
+ "type": { parameterName: "GEQ_TYPE", canonicalLabel: "GEQ_TYPE" },
196
+ },
197
+ peq: {
198
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
199
+ "channel_1_frequency": { parameterName: "PEQ_FREQ1", canonicalLabel: "Freq 1" },
200
+ "channel_1_gain": { parameterName: "PEQ_GAIN1", canonicalLabel: "Gain 1" },
201
+ "channel_1_q": { parameterName: "PEQ_Q1", canonicalLabel: "Q1" },
202
+ "channel_2_frequency": { parameterName: "PEQ_FREQ2", canonicalLabel: "Freq 2" },
203
+ "channel_2_gain": { parameterName: "PEQ_GAIN2", canonicalLabel: "Gain 2" },
204
+ "channel_2_q": { parameterName: "PEQ_Q2", canonicalLabel: "Q2" },
205
+ "channel_3_frequency": { parameterName: "PEQ_FREQ3", canonicalLabel: "Freq 3" },
206
+ "channel_3_gain": { parameterName: "PEQ_GAIN3", canonicalLabel: "Gain 3" },
207
+ "channel_3_q": { parameterName: "PEQ_Q3", canonicalLabel: "Q3" },
208
+ "channel_4_frequency": { parameterName: "PEQ_FREQ4", canonicalLabel: "Freq 4" },
209
+ "channel_4_gain": { parameterName: "PEQ_GAIN4", canonicalLabel: "Gain 4" },
210
+ "channel_4_q": { parameterName: "PEQ_Q4", canonicalLabel: "Q4" },
211
+ "channel_5_frequency": { parameterName: "PEQ_FREQ5", canonicalLabel: "Freq 5" },
212
+ "channel_5_gain": { parameterName: "PEQ_GAIN5", canonicalLabel: "Gain 5" },
213
+ "channel_5_q": { parameterName: "PEQ_Q5", canonicalLabel: "Q5" },
214
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
215
+ },
216
+ phaser: {
217
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
218
+ "feedback": { parameterName: "PHASER_FEEDBACK", canonicalLabel: "Feedback" },
219
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
220
+ "rate": { parameterName: "PHASER_RATE", canonicalLabel: "Rate" },
221
+ "type": { parameterName: "PHASER_TYPE", canonicalLabel: "Type" },
222
+ },
223
+ reverb: {
224
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
225
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
226
+ "shift_1": { parameterName: "REVERB_SHIFT1", canonicalLabel: "Voice 1 Shift" },
227
+ "shift_2": { parameterName: "REVERB_SHIFT2", canonicalLabel: "Voice 2 Shift" },
228
+ "size": { parameterName: "REVERB_SIZE", canonicalLabel: "Size" },
229
+ "spring_tone": { parameterName: "REVERB_TONE", canonicalLabel: "Tone" },
230
+ "springs": { parameterName: "REVERB_NUMSPRINGS", canonicalLabel: "# of Springs" },
231
+ "time": { parameterName: "REVERB_TIME", canonicalLabel: "Time" },
232
+ "type": { parameterName: "REVERB_TYPE", canonicalLabel: "REVERB_TYPE" },
233
+ },
234
+ rotary: {
235
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
236
+ "drive": { parameterName: "ROTARY_DRIVE", canonicalLabel: "Drive" },
237
+ "high_depth": { parameterName: "ROTARY_HFDEPTH", canonicalLabel: "High Depth" },
238
+ "high_level": { parameterName: "ROTARY_HFLEVEL", canonicalLabel: "High Level" },
239
+ "high_time_constant": { parameterName: "ROTARY_HIGHTIME", canonicalLabel: "High Time Constant" },
240
+ "low_depth": { parameterName: "ROTARY_LFDEPTH", canonicalLabel: "Low Depth" },
241
+ "low_rate_multiplier": { parameterName: "ROTARY_LOWRATE", canonicalLabel: "Low Rate Multiplier" },
242
+ "low_time_constant": { parameterName: "ROTARY_LOWTIME", canonicalLabel: "Low Time Constant" },
243
+ "mic_distance": { parameterName: "ROTARY_MICDIST", canonicalLabel: "Mic Distance" },
244
+ "mic_spacing": { parameterName: "ROTARY_WIDTH", canonicalLabel: "Mic\nSpacing" },
245
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
246
+ "rate": { parameterName: "ROTARY_RATE", canonicalLabel: "Rate" },
247
+ "rotor_length": { parameterName: "ROTARY_HFLENGTH", canonicalLabel: "Rotor Length" },
248
+ "stereo_spread": { parameterName: "ROTARY_SPREAD", canonicalLabel: "Stereo Spread" },
249
+ },
250
+ tremolo: {
251
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
252
+ "depth": { parameterName: "TREMOLO_DEPTH", canonicalLabel: "Depth" },
253
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
254
+ "rate": { parameterName: "TREMOLO_RATE", canonicalLabel: "Rate" },
255
+ "type": { parameterName: "TREMOLO_TYPE", canonicalLabel: "Type" },
256
+ },
257
+ volpan: {
258
+ "attack": { parameterName: "VOLUME_ATTACK", canonicalLabel: "Attack" },
259
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
260
+ "mode": { parameterName: "VOLUME_TYPE", canonicalLabel: "VOLUME_TYPE" },
261
+ "threshold": { parameterName: "VOLUME_THRESHOLD", canonicalLabel: "Threshold" },
262
+ },
263
+ wah: {
264
+ "balance": { parameterName: "BLOCK_PAN", canonicalLabel: "Balance" },
265
+ "drive": { parameterName: "WAH_DRIVE", canonicalLabel: "Drive" },
266
+ "fat": { parameterName: "WAH_MIX", canonicalLabel: "Fat" },
267
+ "graphic_eq_band_1": { parameterName: "WAH_EQ1", canonicalLabel: "160" },
268
+ "graphic_eq_band_2": { parameterName: "WAH_EQ2", canonicalLabel: "250" },
269
+ "graphic_eq_band_3": { parameterName: "WAH_EQ3", canonicalLabel: "400" },
270
+ "graphic_eq_band_4": { parameterName: "WAH_EQ4", canonicalLabel: "640" },
271
+ "graphic_eq_band_5": { parameterName: "WAH_EQ5", canonicalLabel: "1000" },
272
+ "graphic_eq_band_6": { parameterName: "WAH_EQ6", canonicalLabel: "1600" },
273
+ "graphic_eq_band_7": { parameterName: "WAH_EQ7", canonicalLabel: "2500" },
274
+ "graphic_eq_band_8": { parameterName: "WAH_EQ8", canonicalLabel: "4000" },
275
+ "inductor_bias": { parameterName: "WAH_BIAS", canonicalLabel: "Inductor Bias" },
276
+ "low_cut_frequency": { parameterName: "WAH_HPF", canonicalLabel: "Low Cut Frequency" },
277
+ "max_frequency": { parameterName: "WAH_FSTOP", canonicalLabel: "Maximum Frequency" },
278
+ "min_frequency": { parameterName: "WAH_FSTART", canonicalLabel: "Minimum Frequency" },
279
+ "mix": { parameterName: "BLOCK_MIX", canonicalLabel: "Mix" },
280
+ "q_resonance": { parameterName: "WAH_Q", canonicalLabel: "Resonance" },
281
+ "q_tracking": { parameterName: "WAH_TRACK", canonicalLabel: "Q Tracking " },
282
+ "type": { parameterName: "WAH_TYPE", canonicalLabel: "WAH_TYPE" },
283
+ "wah_control": { parameterName: "WAH_CONTROL", canonicalLabel: "Wah Control" },
284
+ },
285
+ };
286
+ /**
287
+ * Resolve the AM4-Edit canonical display label and symbolic
288
+ * parameterName for a (block, name) pair from paramNames.ts.
289
+ *
290
+ * Returns undefined if the (block, name) has no XML correspondence
291
+ * yet — the caller should fall back to the snake_case name from
292
+ * paramNames.ts as the display label.
293
+ */
294
+ export function resolveBridge(block, name) {
295
+ return PARAMETER_BRIDGE[block]?.[name];
296
+ }
297
+ /** Canonical label for a (block, name), or the original `name`. */
298
+ export function preferredDisplayLabel(block, name) {
299
+ return PARAMETER_BRIDGE[block]?.[name]?.canonicalLabel ?? name;
300
+ }