@libraz/libsonare 1.7.2 → 1.8.1

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 (303) hide show
  1. package/NOTICE +178 -0
  2. package/README.md +26 -203
  3. package/dist/_chain_config.d.ts +14 -0
  4. package/dist/_chain_config.d.ts.map +1 -0
  5. package/dist/_effects_common.d.ts +7 -0
  6. package/dist/_effects_common.d.ts.map +1 -0
  7. package/dist/_feature_validation.d.ts +8 -0
  8. package/dist/_feature_validation.d.ts.map +1 -0
  9. package/dist/_fft_options.d.ts +24 -0
  10. package/dist/_fft_options.d.ts.map +1 -0
  11. package/dist/align_take.d.ts +50 -0
  12. package/dist/align_take.d.ts.map +1 -0
  13. package/dist/analysis.d.ts +29 -5840
  14. package/dist/analysis.d.ts.map +1 -0
  15. package/dist/analysis.js +874 -722
  16. package/dist/analysis.js.map +1 -1
  17. package/dist/analysis_helpers.d.ts +9 -0
  18. package/dist/analysis_helpers.d.ts.map +1 -0
  19. package/dist/audio.d.ts +163 -0
  20. package/dist/audio.d.ts.map +1 -0
  21. package/dist/clip_page_streamer.d.ts +133 -0
  22. package/dist/clip_page_streamer.d.ts.map +1 -0
  23. package/dist/codes.d.ts +44 -0
  24. package/dist/codes.d.ts.map +1 -0
  25. package/dist/effects_mastering.d.ts +23 -0
  26. package/dist/effects_mastering.d.ts.map +1 -0
  27. package/dist/effects_note_ops.d.ts +502 -0
  28. package/dist/effects_note_ops.d.ts.map +1 -0
  29. package/dist/effects_percussive.d.ts +185 -0
  30. package/dist/effects_percussive.d.ts.map +1 -0
  31. package/dist/effects_separation.d.ts +65 -0
  32. package/dist/effects_separation.d.ts.map +1 -0
  33. package/dist/effects_spectral.d.ts +28 -0
  34. package/dist/effects_spectral.d.ts.map +1 -0
  35. package/dist/effects_timepitch.d.ts +134 -0
  36. package/dist/effects_timepitch.d.ts.map +1 -0
  37. package/dist/effects_voice_change.d.ts +53 -0
  38. package/dist/effects_voice_change.d.ts.map +1 -0
  39. package/dist/errors.d.ts +51 -0
  40. package/dist/errors.d.ts.map +1 -0
  41. package/dist/feature_core.d.ts +341 -0
  42. package/dist/feature_core.d.ts.map +1 -0
  43. package/dist/feature_decompose.d.ts +278 -0
  44. package/dist/feature_decompose.d.ts.map +1 -0
  45. package/dist/feature_inverse.d.ts +128 -0
  46. package/dist/feature_inverse.d.ts.map +1 -0
  47. package/dist/feature_loudness.d.ts +66 -0
  48. package/dist/feature_loudness.d.ts.map +1 -0
  49. package/dist/feature_music.d.ts +307 -0
  50. package/dist/feature_music.d.ts.map +1 -0
  51. package/dist/feature_pitch.d.ts +108 -0
  52. package/dist/feature_pitch.d.ts.map +1 -0
  53. package/dist/feature_resample.d.ts +16 -0
  54. package/dist/feature_resample.d.ts.map +1 -0
  55. package/dist/feature_spectral.d.ts +137 -0
  56. package/dist/feature_spectral.d.ts.map +1 -0
  57. package/dist/feature_spectrogram.d.ts +198 -0
  58. package/dist/feature_spectrogram.d.ts.map +1 -0
  59. package/dist/features.d.ts +10 -0
  60. package/dist/features.d.ts.map +1 -0
  61. package/dist/hrtf/default.shrf +0 -0
  62. package/dist/index.d.ts +74 -7431
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +4173 -1621
  65. package/dist/index.js.map +1 -1
  66. package/dist/instrument_types.d.ts +517 -0
  67. package/dist/instrument_types.d.ts.map +1 -0
  68. package/dist/live_audio.d.ts +35 -0
  69. package/dist/live_audio.d.ts.map +1 -0
  70. package/dist/mastering_chain.d.ts +213 -0
  71. package/dist/mastering_chain.d.ts.map +1 -0
  72. package/dist/mastering_core.d.ts +483 -0
  73. package/dist/mastering_core.d.ts.map +1 -0
  74. package/dist/mastering_dynamics.d.ts +80 -0
  75. package/dist/mastering_dynamics.d.ts.map +1 -0
  76. package/dist/metering.d.ts +287 -0
  77. package/dist/metering.d.ts.map +1 -0
  78. package/dist/mixer.d.ts +464 -0
  79. package/dist/mixer.d.ts.map +1 -0
  80. package/dist/mixing_assistant.d.ts +62 -0
  81. package/dist/mixing_assistant.d.ts.map +1 -0
  82. package/dist/mixing_oneshot.d.ts +40 -0
  83. package/dist/mixing_oneshot.d.ts.map +1 -0
  84. package/dist/module_state.d.ts +15 -0
  85. package/dist/module_state.d.ts.map +1 -0
  86. package/dist/opfs_clip_pages.d.ts +28 -0
  87. package/dist/opfs_clip_pages.d.ts.map +1 -0
  88. package/dist/playback_renderer.d.ts +128 -0
  89. package/dist/playback_renderer.d.ts.map +1 -0
  90. package/dist/polyphony.d.ts +202 -0
  91. package/dist/polyphony.d.ts.map +1 -0
  92. package/dist/project.d.ts +8 -0
  93. package/dist/project.d.ts.map +1 -0
  94. package/dist/project_class.d.ts +562 -0
  95. package/dist/project_class.d.ts.map +1 -0
  96. package/dist/project_internal.d.ts +194 -0
  97. package/dist/project_internal.d.ts.map +1 -0
  98. package/dist/project_synth.d.ts +74 -0
  99. package/dist/project_synth.d.ts.map +1 -0
  100. package/dist/project_types.d.ts +654 -0
  101. package/dist/project_types.d.ts.map +1 -0
  102. package/dist/public_types.d.ts +185 -0
  103. package/dist/public_types.d.ts.map +1 -0
  104. package/dist/public_types_acoustic.d.ts +215 -0
  105. package/dist/public_types_acoustic.d.ts.map +1 -0
  106. package/dist/public_types_mastering.d.ts +528 -0
  107. package/dist/public_types_mastering.d.ts.map +1 -0
  108. package/dist/public_types_mixing.d.ts +436 -0
  109. package/dist/public_types_mixing.d.ts.map +1 -0
  110. package/dist/public_types_music.d.ts +619 -0
  111. package/dist/public_types_music.d.ts.map +1 -0
  112. package/dist/public_types_playback.d.ts +165 -0
  113. package/dist/public_types_playback.d.ts.map +1 -0
  114. package/dist/public_types_realtime.d.ts +174 -0
  115. package/dist/public_types_realtime.d.ts.map +1 -0
  116. package/dist/public_types_repair.d.ts +424 -0
  117. package/dist/public_types_repair.d.ts.map +1 -0
  118. package/dist/public_types_spectral.d.ts +697 -0
  119. package/dist/public_types_spectral.d.ts.map +1 -0
  120. package/dist/quick_analysis.d.ts +445 -0
  121. package/dist/quick_analysis.d.ts.map +1 -0
  122. package/dist/realtime_engine.d.ts +893 -0
  123. package/dist/realtime_engine.d.ts.map +1 -0
  124. package/dist/realtime_voice_changer.d.ts +158 -0
  125. package/dist/realtime_voice_changer.d.ts.map +1 -0
  126. package/dist/repair_dereverb.d.ts +187 -0
  127. package/dist/repair_dereverb.d.ts.map +1 -0
  128. package/dist/repair_impulsive.d.ts +186 -0
  129. package/dist/repair_impulsive.d.ts.map +1 -0
  130. package/dist/repair_noise.d.ts +239 -0
  131. package/dist/repair_noise.d.ts.map +1 -0
  132. package/dist/repair_trim.d.ts +123 -0
  133. package/dist/repair_trim.d.ts.map +1 -0
  134. package/dist/sample_bank.d.ts +84 -0
  135. package/dist/sample_bank.d.ts.map +1 -0
  136. package/dist/scale.d.ts +10 -0
  137. package/dist/scale.d.ts.map +1 -0
  138. package/dist/schemas/mixer-scene.schema.json +393 -0
  139. package/dist/schemas/playback-renderer-config.schema.json +392 -0
  140. package/dist/sonare-analysis.d.ts +8 -0
  141. package/dist/sonare-analysis.js +2 -2
  142. package/dist/sonare-analysis.wasm +0 -0
  143. package/dist/sonare.d.ts +3945 -0
  144. package/dist/sonare.js +2 -2
  145. package/dist/sonare.wasm +0 -0
  146. package/dist/stream_analyzer.d.ts +163 -0
  147. package/dist/stream_analyzer.d.ts.map +1 -0
  148. package/dist/stream_types.d.ts +214 -0
  149. package/dist/stream_types.d.ts.map +1 -0
  150. package/dist/streaming_mixing.d.ts +6 -0
  151. package/dist/streaming_mixing.d.ts.map +1 -0
  152. package/dist/streaming_processors.d.ts +340 -0
  153. package/dist/streaming_processors.d.ts.map +1 -0
  154. package/dist/transcribe.d.ts +77 -0
  155. package/dist/transcribe.d.ts.map +1 -0
  156. package/dist/validation.d.ts +140 -0
  157. package/dist/validation.d.ts.map +1 -0
  158. package/dist/web_midi.d.ts +77 -0
  159. package/dist/web_midi.d.ts.map +1 -0
  160. package/dist/worker.d.ts +5 -48
  161. package/dist/worker.d.ts.map +1 -0
  162. package/dist/worker.js +94 -41
  163. package/dist/worker.js.map +1 -1
  164. package/dist/worker_client.d.ts +96 -0
  165. package/dist/worker_client.d.ts.map +1 -0
  166. package/dist/worker_protocol.d.ts +43 -0
  167. package/dist/worker_protocol.d.ts.map +1 -0
  168. package/dist/worklet/audio_types.d.ts +21 -0
  169. package/dist/worklet/audio_types.d.ts.map +1 -0
  170. package/dist/worklet/engine-automation.d.ts +29 -0
  171. package/dist/worklet/engine-automation.d.ts.map +1 -0
  172. package/dist/worklet/engine-capture-facade.d.ts +35 -0
  173. package/dist/worklet/engine-capture-facade.d.ts.map +1 -0
  174. package/dist/worklet/engine-clips.d.ts +23 -0
  175. package/dist/worklet/engine-clips.d.ts.map +1 -0
  176. package/dist/worklet/engine-markers.d.ts +40 -0
  177. package/dist/worklet/engine-markers.d.ts.map +1 -0
  178. package/dist/worklet/engine-mixer-facade.d.ts +164 -0
  179. package/dist/worklet/engine-mixer-facade.d.ts.map +1 -0
  180. package/dist/worklet/engine-node.d.ts +83 -0
  181. package/dist/worklet/engine-node.d.ts.map +1 -0
  182. package/dist/worklet/engine-offline.d.ts +81 -0
  183. package/dist/worklet/engine-offline.d.ts.map +1 -0
  184. package/dist/worklet/engine-options.d.ts +12 -0
  185. package/dist/worklet/engine-options.d.ts.map +1 -0
  186. package/dist/worklet/engine-parameter-facade.d.ts +106 -0
  187. package/dist/worklet/engine-parameter-facade.d.ts.map +1 -0
  188. package/dist/worklet/engine-processor.d.ts +72 -0
  189. package/dist/worklet/engine-processor.d.ts.map +1 -0
  190. package/dist/worklet/engine-register.d.ts +2 -0
  191. package/dist/worklet/engine-register.d.ts.map +1 -0
  192. package/dist/worklet/engine-strips.d.ts +75 -0
  193. package/dist/worklet/engine-strips.d.ts.map +1 -0
  194. package/dist/worklet/engine-sync.d.ts +39 -0
  195. package/dist/worklet/engine-sync.d.ts.map +1 -0
  196. package/dist/worklet/engine-tempo-facade.d.ts +48 -0
  197. package/dist/worklet/engine-tempo-facade.d.ts.map +1 -0
  198. package/dist/worklet/engine.d.ts +418 -0
  199. package/dist/worklet/engine.d.ts.map +1 -0
  200. package/dist/worklet/guards.d.ts +53 -0
  201. package/dist/worklet/guards.d.ts.map +1 -0
  202. package/dist/worklet/messages.d.ts +710 -0
  203. package/dist/worklet/messages.d.ts.map +1 -0
  204. package/dist/worklet/mixer-processor.d.ts +46 -0
  205. package/dist/worklet/mixer-processor.d.ts.map +1 -0
  206. package/dist/worklet/playback-processor.d.ts +62 -0
  207. package/dist/worklet/playback-processor.d.ts.map +1 -0
  208. package/dist/worklet/protocol.d.ts +331 -0
  209. package/dist/worklet/protocol.d.ts.map +1 -0
  210. package/dist/worklet/voice-changer-processor.d.ts +41 -0
  211. package/dist/worklet/voice-changer-processor.d.ts.map +1 -0
  212. package/dist/worklet.d.ts +16 -2515
  213. package/dist/worklet.d.ts.map +1 -0
  214. package/dist/worklet.js +3200 -541
  215. package/dist/worklet.js.map +1 -1
  216. package/package.json +23 -12
  217. package/src/_effects_common.ts +47 -0
  218. package/src/_feature_validation.ts +34 -0
  219. package/src/_fft_options.ts +39 -0
  220. package/src/align_take.ts +64 -0
  221. package/src/analysis.ts +56 -3
  222. package/src/analysis_helpers.ts +7 -0
  223. package/src/audio.ts +106 -3
  224. package/src/codes.ts +39 -2
  225. package/src/effects_mastering.ts +101 -22
  226. package/src/effects_note_ops.ts +683 -0
  227. package/src/effects_percussive.ts +217 -0
  228. package/src/effects_separation.ts +150 -0
  229. package/src/effects_spectral.ts +60 -0
  230. package/src/effects_timepitch.ts +388 -0
  231. package/src/errors.ts +23 -1
  232. package/src/feature_core.ts +127 -2
  233. package/src/feature_decompose.ts +633 -0
  234. package/src/feature_inverse.ts +454 -0
  235. package/src/feature_loudness.ts +125 -0
  236. package/src/feature_music.ts +107 -14
  237. package/src/feature_pitch.ts +96 -1
  238. package/src/feature_spectral.ts +16 -611
  239. package/src/feature_spectrogram.ts +63 -450
  240. package/src/features.ts +36 -22
  241. package/src/index.ts +288 -30
  242. package/src/instrument_types.ts +645 -0
  243. package/src/live_audio.ts +27 -1
  244. package/src/mastering_chain.ts +184 -0
  245. package/src/mastering_core.ts +441 -32
  246. package/src/mastering_dynamics.ts +22 -11
  247. package/src/metering.ts +67 -24
  248. package/src/mixer.ts +251 -22
  249. package/src/mixing_assistant.ts +138 -0
  250. package/src/mixing_oneshot.ts +10 -5
  251. package/src/module_state.ts +24 -2
  252. package/src/playback_renderer.ts +252 -0
  253. package/src/polyphony.ts +279 -0
  254. package/src/project.ts +61 -24
  255. package/src/project_class.ts +450 -27
  256. package/src/project_internal.ts +149 -42
  257. package/src/project_synth.ts +67 -1
  258. package/src/project_types.ts +271 -271
  259. package/src/public_types.ts +122 -3
  260. package/src/public_types_acoustic.ts +112 -3
  261. package/src/public_types_mastering.ts +275 -73
  262. package/src/public_types_mixing.ts +363 -1
  263. package/src/public_types_music.ts +312 -2
  264. package/src/public_types_playback.ts +196 -0
  265. package/src/public_types_realtime.ts +39 -7
  266. package/src/public_types_repair.ts +446 -0
  267. package/src/public_types_spectral.ts +491 -5
  268. package/src/quick_analysis.ts +203 -26
  269. package/src/realtime_engine.ts +773 -34
  270. package/src/realtime_voice_changer.ts +55 -1
  271. package/src/repair_dereverb.ts +299 -0
  272. package/src/repair_impulsive.ts +395 -0
  273. package/src/repair_noise.ts +425 -0
  274. package/src/repair_trim.ts +226 -0
  275. package/src/sample_bank.ts +113 -0
  276. package/src/sonare.js.d.ts +1158 -30
  277. package/src/stream_analyzer.ts +36 -4
  278. package/src/stream_types.ts +37 -0
  279. package/src/streaming_mixing.ts +1 -1
  280. package/src/streaming_processors.ts +202 -10
  281. package/src/transcribe.ts +89 -0
  282. package/src/validation.ts +285 -11
  283. package/src/web_midi.ts +1 -6
  284. package/src/worker.ts +18 -2
  285. package/src/worklet/audio_types.ts +37 -0
  286. package/src/worklet/engine-mixer-facade.ts +800 -32
  287. package/src/worklet/engine-node.ts +99 -29
  288. package/src/worklet/engine-offline.ts +14 -8
  289. package/src/worklet/engine-parameter-facade.ts +21 -0
  290. package/src/worklet/engine-processor.ts +332 -93
  291. package/src/worklet/engine-register.ts +32 -18
  292. package/src/worklet/engine-strips.ts +275 -9
  293. package/src/worklet/engine-sync.ts +20 -7
  294. package/src/worklet/engine.ts +394 -48
  295. package/src/worklet/guards.ts +195 -44
  296. package/src/worklet/messages.ts +229 -2
  297. package/src/worklet/mixer-processor.ts +117 -48
  298. package/src/worklet/playback-processor.ts +300 -0
  299. package/src/worklet/protocol.ts +82 -11
  300. package/src/worklet/voice-changer-processor.ts +17 -11
  301. package/src/worklet.ts +17 -0
  302. package/src/effects_transform.ts +0 -718
  303. package/src/mastering_repair.ts +0 -273
@@ -7,11 +7,170 @@ import type {
7
7
  MasteringPreset,
8
8
  } from './public_types';
9
9
  import type { ProgressCallback } from './sonare.js';
10
+ import type { ValidateOptions } from './validation';
11
+ import { assertSamples } from './validation';
10
12
 
11
13
  function requireModule() {
12
14
  return getSonareModule();
13
15
  }
14
16
 
17
+ export type NormalizeMode = 'peak' | 'rms';
18
+
19
+ // `context` is the calling entry point's name: the refusal is about that
20
+ // caller's argument, so naming a fixed one would send a normalizeStereo user
21
+ // looking at normalize.
22
+ function resolveNormalizeMode(value: unknown, context = 'normalize'): NormalizeMode {
23
+ if (value === undefined) {
24
+ return 'peak';
25
+ }
26
+ if (typeof value !== 'string') {
27
+ throw new TypeError(`${context}: mode must be the string 'peak' or 'rms'`);
28
+ }
29
+ if (value !== 'peak' && value !== 'rms') {
30
+ throw new RangeError(`${context}: mode must be the string 'peak' or 'rms'`);
31
+ }
32
+ return value;
33
+ }
34
+
35
+ export interface NormalizeRequest extends ValidateOptions {
36
+ samples: Float32Array;
37
+ sampleRate?: number;
38
+ targetDb?: number;
39
+ mode?: NormalizeMode;
40
+ }
41
+
42
+ /**
43
+ * Normalize audio to a target peak or RMS level.
44
+ *
45
+ * @param samples - Audio samples (mono, float32)
46
+ * @param sampleRate - Sample rate in Hz (default: 22050)
47
+ * @param targetDb - Finite target at or below 0 dBFS (default: 0 dB = full scale).
48
+ * For `mode: 'peak'`, this is the peak target; for `mode: 'rms'`, this is the RMS target.
49
+ * @param mode - Normalization mode: `'peak'` (default) or `'rms'`.
50
+ * @returns Normalized audio
51
+ */
52
+ export function normalize(request: NormalizeRequest): Float32Array;
53
+ export function normalize(
54
+ samples: Float32Array,
55
+ sampleRate: number,
56
+ targetDb?: number,
57
+ options?: ValidateOptions,
58
+ ): Float32Array;
59
+ export function normalize(
60
+ samples: Float32Array,
61
+ sampleRate: number,
62
+ targetDb?: number,
63
+ mode?: NormalizeMode,
64
+ options?: ValidateOptions,
65
+ ): Float32Array;
66
+ export function normalize(
67
+ samples: Float32Array | NormalizeRequest,
68
+ sampleRate?: number,
69
+ targetDb = 0.0,
70
+ modeOrOptions: NormalizeMode | ValidateOptions = 'peak',
71
+ options: ValidateOptions = {},
72
+ ): Float32Array {
73
+ if (
74
+ modeOrOptions !== undefined &&
75
+ modeOrOptions !== null &&
76
+ typeof modeOrOptions !== 'string' &&
77
+ typeof modeOrOptions !== 'object'
78
+ ) {
79
+ throw new TypeError("normalize: mode must be the string 'peak' or 'rms'");
80
+ }
81
+ if (modeOrOptions === null) {
82
+ throw new TypeError("normalize: mode must be the string 'peak' or 'rms'");
83
+ }
84
+ const positionalOptions =
85
+ typeof modeOrOptions === 'object' && modeOrOptions !== null ? modeOrOptions : options;
86
+ const positionalMode = typeof modeOrOptions === 'string' ? modeOrOptions : undefined;
87
+ const request: NormalizeRequest =
88
+ samples instanceof Float32Array
89
+ ? { samples, sampleRate, targetDb, mode: positionalMode, ...positionalOptions }
90
+ : samples;
91
+ assertSamples('normalize', request.samples, request.validate !== false);
92
+ const mode = resolveNormalizeMode(request.mode);
93
+ return requireModule().normalizeEx(
94
+ request.samples,
95
+ request.sampleRate ?? 22050,
96
+ request.targetDb ?? 0.0,
97
+ mode,
98
+ );
99
+ }
100
+
101
+ export interface NormalizeStereoRequest extends ValidateOptions {
102
+ left: Float32Array;
103
+ right: Float32Array;
104
+ sampleRate?: number;
105
+ targetDb?: number;
106
+ mode?: NormalizeMode;
107
+ }
108
+
109
+ /** A normalized channel pair and the gain both channels were moved by. */
110
+ export interface NormalizeStereoResult {
111
+ left: Float32Array;
112
+ right: Float32Array;
113
+ /**
114
+ * One figure rather than a pair: the gain is one decision shared by both
115
+ * channels. Silence leaves the pair untouched and reports 0.
116
+ */
117
+ appliedGainDb: number;
118
+ }
119
+
120
+ /**
121
+ * Normalize a stereo pair on a gain measured across both channels.
122
+ *
123
+ * Normalizing the two channels separately lifts the quieter one until the peaks
124
+ * match, which changes the balance rather than the level. The level here is read
125
+ * from the pair and the resulting gain goes to both channels, so the image is
126
+ * preserved: for `mode: 'peak'` the louder channel reaches `targetDb` and the
127
+ * other keeps its distance from it; for `mode: 'rms'` the quantity driven to
128
+ * `targetDb` is the root mean square over both channels' samples together — the
129
+ * quadratic mean of the per-channel figures, not their average — and the output
130
+ * is hard-clipped to [-1, 1].
131
+ *
132
+ * @param request.left - Left channel samples (float32)
133
+ * @param request.right - Right channel samples, same length as `left`
134
+ * @param request.sampleRate - Sample rate in Hz (default: 22050)
135
+ * @param request.targetDb - Finite target at or below 0 dBFS. Defaults to 0 for
136
+ * `mode: 'peak'` and -20 for `mode: 'rms'`, matching the library and the other
137
+ * language surfaces.
138
+ * @param request.mode - `'peak'` (default) or `'rms'`
139
+ * @returns The normalized pair and the shared gain in dB
140
+ * @throws RangeError when the two channels differ in length
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * const { left, right, appliedGainDb } = normalizeStereo({
145
+ * left: leftSamples,
146
+ * right: rightSamples,
147
+ * sampleRate: 44100,
148
+ * targetDb: -1,
149
+ * });
150
+ * ```
151
+ */
152
+ export function normalizeStereo(request: NormalizeStereoRequest): NormalizeStereoResult {
153
+ assertSamples('normalizeStereo', request.left, request.validate !== false);
154
+ assertSamples('normalizeStereo', request.right, request.validate !== false);
155
+ if (request.left.length !== request.right.length) {
156
+ throw new RangeError('Stereo channel lengths must match.');
157
+ }
158
+ const mode = resolveNormalizeMode(request.mode, 'normalizeStereo');
159
+ // Mode-dependent, unlike the mono `normalize` on this surface, which defaults
160
+ // to 0 dB in both modes. 0 dBFS RMS is not a usable default -- the peaks sit
161
+ // well above the RMS, so every one of them clips -- and the library and the
162
+ // other surfaces all default RMS to -20. A new entry point takes the shared
163
+ // default rather than inheriting a surface-local one.
164
+ const targetDb = request.targetDb ?? (mode === 'rms' ? -20.0 : 0.0);
165
+ return requireModule().normalizeStereo(
166
+ request.left,
167
+ request.right,
168
+ request.sampleRate ?? 22050,
169
+ targetDb,
170
+ mode,
171
+ );
172
+ }
173
+
15
174
  /** Internal envelope selecting the core dotted-param parser in the embind layer. */
16
175
  function canonicalChainConfig(config: MasteringChainConfig): Record<string, unknown> {
17
176
  return { __flatParams: flattenChainConfig(config) };
@@ -279,6 +438,31 @@ export function masteringPresetNames(): MasteringPreset[] {
279
438
  return Array.from(requireModule().masteringPresetNames()) as MasteringPreset[];
280
439
  }
281
440
 
441
+ /**
442
+ * The flat `{key: number|boolean}` params of preset `preset`'s built-in chain
443
+ * configuration, in the same key space {@link masteringAssistantSuggestChain}
444
+ * returns. Passing this straight through as `overrides` to {@link masterAudio}
445
+ * reproduces the preset unchanged, bit for bit in the C++ core.
446
+ *
447
+ * @param preset - Preset identifier from {@link masteringPresetNames}.
448
+ * @throws For an unknown `preset`.
449
+ */
450
+ export function masteringPresetParams(preset: MasteringPreset): Record<string, number | boolean> {
451
+ return requireModule().masteringPresetParams(preset);
452
+ }
453
+
454
+ /**
455
+ * List the delivery targets the mastering assistant accepts as `targetPlatform`.
456
+ *
457
+ * Read from the library rather than from a list kept here, so a target added in
458
+ * the core is discoverable without a binding change.
459
+ *
460
+ * @returns Target names in index order (e.g. "streaming", "broadcast", "club")
461
+ */
462
+ export function masteringPlatformNames(): string[] {
463
+ return Array.from(requireModule().masteringPlatformNames());
464
+ }
465
+
282
466
  /**
283
467
  * Apply a named mastering preset chain to mono audio.
284
468
  *