@libraz/libsonare 1.5.2 → 1.5.4

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 (48) hide show
  1. package/README.md +69 -725
  2. package/dist/index.d.ts +1155 -183
  3. package/dist/index.js +4924 -3935
  4. package/dist/index.js.map +1 -1
  5. package/dist/sonare.js +1 -1
  6. package/dist/sonare.wasm +0 -0
  7. package/dist/worklet.d.ts +29 -1
  8. package/dist/worklet.js +1141 -970
  9. package/dist/worklet.js.map +1 -1
  10. package/package.json +15 -3
  11. package/src/_chain_config.ts +46 -0
  12. package/src/audio.ts +24 -4
  13. package/src/codes.ts +27 -4
  14. package/src/effects_mastering.ts +25 -1
  15. package/src/effects_transform.ts +292 -46
  16. package/src/effects_voice_change.ts +46 -53
  17. package/src/feature_core.ts +316 -12
  18. package/src/feature_music.ts +371 -4
  19. package/src/feature_pitch.ts +61 -0
  20. package/src/feature_resample.ts +17 -2
  21. package/src/feature_spectral.ts +349 -2
  22. package/src/feature_spectrogram.ts +336 -0
  23. package/src/index.ts +130 -1
  24. package/src/mastering_chain.ts +305 -50
  25. package/src/mastering_core.ts +232 -16
  26. package/src/mastering_dynamics.ts +66 -10
  27. package/src/mastering_repair.ts +119 -7
  28. package/src/metering.ts +370 -83
  29. package/src/mixer.ts +9 -2
  30. package/src/mixing_oneshot.ts +25 -5
  31. package/src/module_state.ts +1 -1
  32. package/src/project_class.ts +30 -6
  33. package/src/project_internal.ts +12 -2
  34. package/src/project_types.ts +25 -2
  35. package/src/public_types_mastering.ts +114 -4
  36. package/src/public_types_spectral.ts +7 -0
  37. package/src/quick_analysis.ts +325 -117
  38. package/src/realtime_engine.ts +8 -0
  39. package/src/realtime_voice_changer.ts +79 -3
  40. package/src/sonare.js.d.ts +35 -0
  41. package/src/stream_analyzer.ts +20 -1
  42. package/src/stream_types.ts +12 -1
  43. package/src/validation.ts +17 -2
  44. package/src/worklet/engine-clips.ts +67 -2
  45. package/src/worklet/engine-processor.ts +33 -5
  46. package/src/worklet/engine.ts +7 -3
  47. package/src/worklet/guards.ts +3 -0
  48. package/src/worklet/messages.ts +27 -0
package/src/index.ts CHANGED
@@ -52,13 +52,33 @@ export type {
52
52
  DynamicsResult,
53
53
  GateOptions,
54
54
  MasteringChannelPolicy,
55
+ MasteringDynamicsCompressorRequest,
56
+ MasteringDynamicsGateRequest,
57
+ MasteringDynamicsTransientShaperRequest,
55
58
  MasteringInsertParamInfo,
59
+ MasteringPairAnalyzeRequest,
60
+ MasteringPairProcessRequest,
56
61
  MasteringProcessorCatalogEntry,
62
+ MasteringProcessRequest,
63
+ MasteringProcessStereoRequest,
64
+ MasteringRepairDeclickRequest,
65
+ MasteringRepairDeclipRequest,
66
+ MasteringRepairDecrackleRequest,
67
+ MasteringRepairDehumRequest,
68
+ MasteringRepairDenoiseClassicalRequest,
69
+ MasteringRepairDereverbClassicalRequest,
70
+ MasteringRepairTrimSilenceRequest,
71
+ MasteringSamplesParamsRequest,
72
+ MasteringStereoAnalyzeRequest,
73
+ MasteringStreamingPreviewRequest,
74
+ MixStereoRequest,
57
75
  TransientShaperOptions,
58
76
  TrimSilenceMode,
59
77
  TrimSilenceOptions,
60
78
  VoiceChangeOptions,
61
79
  VoiceChangeRealtimeOptions,
80
+ VoiceChangeRealtimeRequest,
81
+ VoiceChangeRequest,
62
82
  } from './effects_mastering';
63
83
  export {
64
84
  harmonic,
@@ -103,6 +123,7 @@ export {
103
123
  mixingScenePresetNames,
104
124
  mixStereo,
105
125
  normalize,
126
+ noteMove,
106
127
  noteStretch,
107
128
  percussive,
108
129
  pitchCorrectTimevarying,
@@ -114,8 +135,83 @@ export {
114
135
  voiceChange,
115
136
  voiceChangeRealtime,
116
137
  } from './effects_mastering';
138
+ export type {
139
+ HarmonicRequest,
140
+ HpssRequest,
141
+ NormalizeRequest,
142
+ NoteMoveRequest,
143
+ NoteStretchRequest,
144
+ PercussiveRequest,
145
+ PitchCorrectTimevaryingRequest,
146
+ PitchCorrectToMidiRequest,
147
+ PitchCorrectToMidiTimevaryingRequest,
148
+ PitchShiftRequest,
149
+ SpectralEditRequest,
150
+ TimeStretchRequest,
151
+ } from './effects_transform';
117
152
  export { ErrorCode, isSonareError, SonareError } from './errors';
118
- export type { MelodyOptions } from './feature_music';
153
+ export type {
154
+ CyclicTempogramRequest,
155
+ DbConversionRequest,
156
+ EmphasisRequest,
157
+ FixFramesRequest,
158
+ FixLengthRequest,
159
+ FrameSignalRequest,
160
+ PadCenterRequest,
161
+ PcenRequest,
162
+ PeakPickRequest,
163
+ PlpRequest,
164
+ SilenceRequest,
165
+ TempogramRequest,
166
+ TonnetzRequest,
167
+ VectorNormalizeRequest,
168
+ } from './feature_core';
169
+ export type {
170
+ AnalyzeMelodyRequest,
171
+ AnalyzeSectionsRequest,
172
+ CqtRequest,
173
+ CqtToAudioRequest,
174
+ FourierTempogramRequest,
175
+ LufsRequest,
176
+ MelodyOptions,
177
+ NnlsChromaRequest,
178
+ OnsetEnvelopeRequest,
179
+ OnsetStrengthMultiRequest,
180
+ TempogramRatioRequest,
181
+ VqtRequest,
182
+ VqtToAudioRequest,
183
+ } from './feature_music';
184
+ export type { PitchPyinRequest, PitchYinRequest } from './feature_pitch';
185
+ export type { ResampleRequest } from './feature_resample';
186
+ export type {
187
+ DecomposeRequest,
188
+ DecomposeWithInitRequest,
189
+ Ebur128LoudnessRangeRequest,
190
+ EstimateTuningRequest,
191
+ HpssWithResidualRequest,
192
+ LufsInterleavedRequest,
193
+ NnFilterRequest,
194
+ PhaseVocoderRequest,
195
+ PitchTuningRequest,
196
+ PolyFeaturesRequest,
197
+ RemixRequest,
198
+ SpectralContrastRequest,
199
+ SpectralFrameRequest,
200
+ SpectralRolloffRequest,
201
+ ZeroCrossingRateRequest,
202
+ ZeroCrossingsRequest,
203
+ } from './feature_spectral';
204
+ export type {
205
+ ChromaSpectrogramRequest,
206
+ MelSpectrogramRequest,
207
+ MelToAudioRequest,
208
+ MelToStftRequest,
209
+ MfccRequest,
210
+ MfccToAudioRequest,
211
+ MfccToMelRequest,
212
+ SpectrogramRequest,
213
+ TrimRequest,
214
+ } from './feature_spectrogram';
119
215
  export {
120
216
  amplitudeToDb,
121
217
  analyzeMelody,
@@ -200,19 +296,36 @@ export {
200
296
  } from './features';
201
297
  export type { BindMicrophoneInputOptions, MicrophoneInputBinding } from './live_audio';
202
298
  export { bindMicrophoneInput } from './live_audio';
299
+ export type {
300
+ MasterAudioRequest,
301
+ MasterAudioStereoRequest,
302
+ MasteringChainRequest,
303
+ MasteringChainStereoRequest,
304
+ } from './mastering_chain';
305
+ export type { MasteringRequest } from './mastering_core';
203
306
  export type {
204
307
  ClippingRegion,
205
308
  ClippingReport,
206
309
  DynamicRangeReport,
207
310
  MeteringDetectClippingOptions,
311
+ MeteringDetectClippingRequest,
208
312
  MeteringDynamicRangeOptions,
313
+ MeteringDynamicRangeRequest,
314
+ MeteringSamplesRequest,
315
+ MeteringSpectrumFrameRequest,
316
+ MeteringSpectrumRequest,
317
+ MeteringStereoDecimatedRequest,
318
+ MeteringStereoRequest,
319
+ MeteringTruePeakRequest,
209
320
  PhaseScopeReport,
210
321
  SpectrumOptions,
211
322
  SpectrumReport,
212
323
  VectorscopeReport,
213
324
  WaveformPeakPyramidOptions,
325
+ WaveformPeakPyramidRequest,
214
326
  WaveformPeaksOptions,
215
327
  WaveformPeaksReport,
328
+ WaveformPeaksRequest,
216
329
  } from './metering';
217
330
  export {
218
331
  meteringCrestFactorDb,
@@ -334,6 +447,7 @@ export type {
334
447
  LufsResult,
335
448
  MasteringChainConfig,
336
449
  MasteringChainResult,
450
+ MasteringChainStereoResult,
337
451
  MasteringOptions,
338
452
  MasteringPreset,
339
453
  MasteringProcessorParams,
@@ -373,6 +487,7 @@ export type {
373
487
  SpectralEditOptions,
374
488
  SpectralEditWindow,
375
489
  SpectralRegionOp,
490
+ StageGainReduction,
376
491
  StereoAnalysis,
377
492
  StftPowerResult,
378
493
  StftResult,
@@ -393,10 +508,23 @@ export {
393
508
  SectionType,
394
509
  } from './public_types';
395
510
  export type {
511
+ AnalyzeBpmRequest,
512
+ AnalyzeDynamicsRequest,
513
+ AnalyzeImpulseResponseRequest,
514
+ AnalyzeRhythmRequest,
515
+ AnalyzeTimbreRequest,
516
+ AnalyzeWithProgressRequest,
396
517
  BpmAnalysisResult,
397
518
  BpmCandidate,
519
+ ChordFunctionalAnalysisRequest,
520
+ DetectAcousticRequest,
521
+ DetectChordsRequest,
522
+ DetectKeyRequest,
398
523
  DynamicsAnalysisResult,
524
+ EstimateRoomRequest,
399
525
  RhythmAnalysisResult,
526
+ RoomMorphRequest,
527
+ SamplesRequest,
400
528
  TimbreAnalysisResult,
401
529
  TimbreFrame,
402
530
  } from './quick_analysis';
@@ -423,6 +551,7 @@ export {
423
551
  synthesizeRir,
424
552
  } from './quick_analysis';
425
553
  export type {
554
+ ClipPageRequest,
426
555
  EngineAutomationPoint,
427
556
  EngineBounceOptions,
428
557
  EngineBounceResult,
@@ -1,9 +1,10 @@
1
+ import { flattenChainConfig } from './_chain_config';
1
2
  import { getSonareModule } from './module_state';
2
3
  import type {
3
4
  MasteringChainConfig,
4
5
  MasteringChainResult,
6
+ MasteringChainStereoResult,
5
7
  MasteringPreset,
6
- MasteringStereoChainResult,
7
8
  } from './public_types';
8
9
  import type { ProgressCallback } from './sonare.js';
9
10
 
@@ -11,6 +12,85 @@ function requireModule() {
11
12
  return getSonareModule();
12
13
  }
13
14
 
15
+ /** Internal envelope selecting the core dotted-param parser in the embind layer. */
16
+ function canonicalChainConfig(config: MasteringChainConfig): Record<string, unknown> {
17
+ return { __flatParams: flattenChainConfig(config) };
18
+ }
19
+
20
+ export interface MasteringChainRequest {
21
+ samples: Float32Array;
22
+ sampleRate?: number;
23
+ config?: MasteringChainConfig;
24
+ onProgress?: ProgressCallback;
25
+ }
26
+
27
+ export interface MasteringChainStereoRequest {
28
+ left: Float32Array;
29
+ right: Float32Array;
30
+ sampleRate?: number;
31
+ config?: MasteringChainConfig;
32
+ onProgress?: ProgressCallback;
33
+ }
34
+
35
+ /** Canonical request form for one-shot preset mastering. */
36
+ export interface MasterAudioRequest {
37
+ samples: Float32Array;
38
+ sampleRate?: number;
39
+ preset?: MasteringPreset;
40
+ overrides?: MasteringChainConfig;
41
+ onProgress?: ProgressCallback;
42
+ }
43
+
44
+ /** Canonical request form for one-shot stereo preset mastering. */
45
+ export interface MasterAudioStereoRequest {
46
+ left: Float32Array;
47
+ right: Float32Array;
48
+ sampleRate?: number;
49
+ preset?: MasteringPreset;
50
+ overrides?: MasteringChainConfig;
51
+ onProgress?: ProgressCallback;
52
+ }
53
+
54
+ function masterAudioRequest(
55
+ requestOrSamples: MasterAudioRequest | Float32Array,
56
+ sampleRate: number,
57
+ preset: MasteringPreset,
58
+ overrides: MasteringChainConfig | null,
59
+ onProgress?: ProgressCallback,
60
+ ): MasterAudioRequest {
61
+ if (requestOrSamples instanceof Float32Array) {
62
+ return {
63
+ samples: requestOrSamples,
64
+ sampleRate,
65
+ preset,
66
+ overrides: overrides ?? {},
67
+ onProgress,
68
+ };
69
+ }
70
+ return requestOrSamples;
71
+ }
72
+
73
+ function masterAudioStereoRequest(
74
+ requestOrLeft: MasterAudioStereoRequest | Float32Array,
75
+ right: Float32Array | undefined,
76
+ sampleRate: number,
77
+ preset: MasteringPreset,
78
+ overrides: MasteringChainConfig | null,
79
+ onProgress?: ProgressCallback,
80
+ ): MasterAudioStereoRequest {
81
+ if (requestOrLeft instanceof Float32Array) {
82
+ return {
83
+ left: requestOrLeft,
84
+ right: right as Float32Array,
85
+ sampleRate,
86
+ preset,
87
+ overrides: overrides ?? {},
88
+ onProgress,
89
+ };
90
+ }
91
+ return requestOrLeft;
92
+ }
93
+
14
94
  /**
15
95
  * Apply a configurable mastering chain in WASM.
16
96
  *
@@ -19,12 +99,34 @@ function requireModule() {
19
99
  * @param config - Chain stage configuration
20
100
  * @returns Processed audio, loudness metadata, and applied stage names
21
101
  */
102
+ export function masteringChain(request: MasteringChainRequest): MasteringChainResult;
22
103
  export function masteringChain(
23
104
  samples: Float32Array,
105
+ sampleRate?: number,
106
+ config?: MasteringChainConfig,
107
+ onProgress?: ProgressCallback,
108
+ ): MasteringChainResult;
109
+ export function masteringChain(
110
+ samples: Float32Array | MasteringChainRequest,
24
111
  sampleRate = 22050,
25
- config: MasteringChainConfig,
112
+ config: MasteringChainConfig = {},
113
+ onProgress?: ProgressCallback,
26
114
  ): MasteringChainResult {
27
- return requireModule().masteringChain(samples, sampleRate, config as Record<string, unknown>);
115
+ const request =
116
+ samples instanceof Float32Array ? { samples, sampleRate, config, onProgress } : samples;
117
+ if (request.onProgress) {
118
+ return requireModule().masteringChainWithProgress(
119
+ request.samples,
120
+ request.sampleRate ?? 22050,
121
+ canonicalChainConfig(request.config ?? {}),
122
+ request.onProgress,
123
+ );
124
+ }
125
+ return requireModule().masteringChain(
126
+ request.samples,
127
+ request.sampleRate ?? 22050,
128
+ canonicalChainConfig(request.config ?? {}),
129
+ );
28
130
  }
29
131
 
30
132
  /**
@@ -36,20 +138,44 @@ export function masteringChain(
36
138
  * @param config - Chain stage configuration
37
139
  * @returns Processed stereo audio, loudness metadata, and applied stage names
38
140
  */
141
+ export function masteringChainStereo(
142
+ request: MasteringChainStereoRequest,
143
+ ): MasteringChainStereoResult;
39
144
  export function masteringChainStereo(
40
145
  left: Float32Array,
41
146
  right: Float32Array,
147
+ sampleRate?: number,
148
+ config?: MasteringChainConfig,
149
+ onProgress?: ProgressCallback,
150
+ ): MasteringChainStereoResult;
151
+ export function masteringChainStereo(
152
+ left: Float32Array | MasteringChainStereoRequest,
153
+ right?: Float32Array,
42
154
  sampleRate = 22050,
43
- config: MasteringChainConfig,
44
- ): MasteringStereoChainResult {
45
- if (left.length !== right.length) {
155
+ config: MasteringChainConfig = {},
156
+ onProgress?: ProgressCallback,
157
+ ): MasteringChainStereoResult {
158
+ const request =
159
+ left instanceof Float32Array
160
+ ? { left, right: right as Float32Array, sampleRate, config, onProgress }
161
+ : left;
162
+ if (request.left.length !== request.right.length) {
46
163
  throw new Error('Stereo channel lengths must match.');
47
164
  }
165
+ if (request.onProgress) {
166
+ return requireModule().masteringChainStereoWithProgress(
167
+ request.left,
168
+ request.right,
169
+ request.sampleRate ?? 22050,
170
+ canonicalChainConfig(request.config ?? {}),
171
+ request.onProgress,
172
+ );
173
+ }
48
174
  return requireModule().masteringChainStereo(
49
- left,
50
- right,
51
- sampleRate,
52
- config as Record<string, unknown>,
175
+ request.left,
176
+ request.right,
177
+ request.sampleRate ?? 22050,
178
+ canonicalChainConfig(request.config ?? {}),
53
179
  );
54
180
  }
55
181
 
@@ -62,17 +188,31 @@ export function masteringChainStereo(
62
188
  * @param onProgress - Progress callback (progress: 0-1, stage: string)
63
189
  * @returns Processed audio, loudness metadata, and applied stage names
64
190
  */
191
+ export function masteringChainWithProgress(
192
+ request: MasteringChainRequest & Required<Pick<MasteringChainRequest, 'onProgress'>>,
193
+ ): MasteringChainResult;
65
194
  export function masteringChainWithProgress(
66
195
  samples: Float32Array,
196
+ sampleRate?: number,
197
+ config?: MasteringChainConfig,
198
+ onProgress?: ProgressCallback,
199
+ ): MasteringChainResult;
200
+ export function masteringChainWithProgress(
201
+ samples: Float32Array | MasteringChainRequest,
67
202
  sampleRate = 22050,
68
- config: MasteringChainConfig,
69
- onProgress: ProgressCallback,
203
+ config: MasteringChainConfig = {},
204
+ onProgress?: ProgressCallback,
70
205
  ): MasteringChainResult {
206
+ const request =
207
+ samples instanceof Float32Array ? { samples, sampleRate, config, onProgress } : samples;
208
+ if (!request.onProgress) {
209
+ throw new TypeError('masteringChainWithProgress: onProgress is required');
210
+ }
71
211
  return requireModule().masteringChainWithProgress(
72
- samples,
73
- sampleRate,
74
- config as Record<string, unknown>,
75
- onProgress,
212
+ request.samples,
213
+ request.sampleRate ?? 22050,
214
+ canonicalChainConfig(request.config ?? {}),
215
+ request.onProgress,
76
216
  );
77
217
  }
78
218
 
@@ -86,22 +226,39 @@ export function masteringChainWithProgress(
86
226
  * @param onProgress - Progress callback (progress: 0-1, stage: string)
87
227
  * @returns Processed stereo audio, loudness metadata, and applied stage names
88
228
  */
229
+ export function masteringChainStereoWithProgress(
230
+ request: MasteringChainStereoRequest & Required<Pick<MasteringChainStereoRequest, 'onProgress'>>,
231
+ ): MasteringChainStereoResult;
89
232
  export function masteringChainStereoWithProgress(
90
233
  left: Float32Array,
91
234
  right: Float32Array,
235
+ sampleRate?: number,
236
+ config?: MasteringChainConfig,
237
+ onProgress?: ProgressCallback,
238
+ ): MasteringChainStereoResult;
239
+ export function masteringChainStereoWithProgress(
240
+ left: Float32Array | MasteringChainStereoRequest,
241
+ right?: Float32Array,
92
242
  sampleRate = 22050,
93
- config: MasteringChainConfig,
94
- onProgress: ProgressCallback,
95
- ): MasteringStereoChainResult {
96
- if (left.length !== right.length) {
243
+ config: MasteringChainConfig = {},
244
+ onProgress?: ProgressCallback,
245
+ ): MasteringChainStereoResult {
246
+ const request =
247
+ left instanceof Float32Array
248
+ ? { left, right: right as Float32Array, sampleRate, config, onProgress }
249
+ : left;
250
+ if (!request.onProgress) {
251
+ throw new TypeError('masteringChainStereoWithProgress: onProgress is required');
252
+ }
253
+ if (request.left.length !== request.right.length) {
97
254
  throw new Error('Stereo channel lengths must match.');
98
255
  }
99
256
  return requireModule().masteringChainStereoWithProgress(
100
- left,
101
- right,
102
- sampleRate,
103
- config as Record<string, unknown>,
104
- onProgress,
257
+ request.left,
258
+ request.right,
259
+ request.sampleRate ?? 22050,
260
+ canonicalChainConfig(request.config ?? {}),
261
+ request.onProgress,
105
262
  );
106
263
  }
107
264
 
@@ -120,16 +277,42 @@ export function masteringPresetNames(): MasteringPreset[] {
120
277
  * @param samples - Audio samples (mono, float32)
121
278
  * @param sampleRate - Sample rate in Hz (default: 22050)
122
279
  * @param presetName - Preset identifier from {@link masteringPresetNames}
123
- * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.
280
+ * @param overrides - Optional nested {@link MasteringChainConfig} applied on top of the preset (e.g. `{ loudness: { targetLufs: -14 } }`). Pass `null` for preset defaults.
281
+ * @param onProgress - Optional per-stage progress callback (progress: 0-1, stage: string).
124
282
  * @returns Processed audio, loudness metadata, and applied stage names
125
283
  */
284
+ export function masterAudio(request: MasterAudioRequest): MasteringChainResult;
126
285
  export function masterAudio(
127
286
  samples: Float32Array,
287
+ sampleRate?: number,
288
+ presetName?: MasteringPreset,
289
+ overrides?: MasteringChainConfig,
290
+ onProgress?: ProgressCallback,
291
+ ): MasteringChainResult;
292
+ export function masterAudio(
293
+ samples: MasterAudioRequest | Float32Array,
128
294
  sampleRate = 22050,
129
295
  presetName: MasteringPreset = 'pop',
130
- overrides: Record<string, number | boolean> = {},
296
+ overrides: MasteringChainConfig = {},
297
+ onProgress?: ProgressCallback,
131
298
  ): MasteringChainResult {
132
- return requireModule().masterAudio(presetName, samples, sampleRate, overrides);
299
+ const request = masterAudioRequest(samples, sampleRate, presetName, overrides, onProgress);
300
+ const flat = flattenChainConfig(request.overrides ?? {});
301
+ if (request.onProgress) {
302
+ return requireModule().masterAudioWithProgress(
303
+ request.preset ?? 'pop',
304
+ request.samples,
305
+ request.sampleRate ?? 22050,
306
+ flat,
307
+ request.onProgress,
308
+ );
309
+ }
310
+ return requireModule().masterAudio(
311
+ request.preset ?? 'pop',
312
+ request.samples,
313
+ request.sampleRate ?? 22050,
314
+ flat,
315
+ );
133
316
  }
134
317
 
135
318
  /**
@@ -139,62 +322,134 @@ export function masterAudio(
139
322
  * @param right - Right channel samples
140
323
  * @param sampleRate - Sample rate in Hz
141
324
  * @param presetName - Preset identifier from {@link masteringPresetNames}
142
- * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.
325
+ * @param overrides - Optional nested {@link MasteringChainConfig} applied on top of the preset (e.g. `{ loudness: { targetLufs: -14 } }`). Pass `null` for preset defaults.
326
+ * @param onProgress - Optional per-stage progress callback (progress: 0-1, stage: string).
143
327
  * @returns Processed stereo audio, loudness metadata, and applied stage names
144
328
  */
329
+ export function masterAudioStereo(request: MasterAudioStereoRequest): MasteringChainStereoResult;
145
330
  export function masterAudioStereo(
146
331
  left: Float32Array,
147
332
  right: Float32Array,
333
+ sampleRate?: number,
334
+ presetName?: MasteringPreset,
335
+ overrides?: MasteringChainConfig,
336
+ onProgress?: ProgressCallback,
337
+ ): MasteringChainStereoResult;
338
+ export function masterAudioStereo(
339
+ left: MasterAudioStereoRequest | Float32Array,
340
+ right: Float32Array | undefined = undefined,
148
341
  sampleRate = 22050,
149
342
  presetName: MasteringPreset = 'pop',
150
- overrides: Record<string, number | boolean> = {},
151
- ): MasteringStereoChainResult {
152
- if (left.length !== right.length) {
343
+ overrides: MasteringChainConfig = {},
344
+ onProgress?: ProgressCallback,
345
+ ): MasteringChainStereoResult {
346
+ const request = masterAudioStereoRequest(
347
+ left,
348
+ right,
349
+ sampleRate,
350
+ presetName,
351
+ overrides,
352
+ onProgress,
353
+ );
354
+ const flat = flattenChainConfig(request.overrides ?? {});
355
+ if (request.left.length !== request.right.length) {
153
356
  throw new Error('Stereo channel lengths must match.');
154
357
  }
155
- return requireModule().masterAudioStereo(presetName, left, right, sampleRate, overrides);
358
+ if (request.onProgress) {
359
+ return requireModule().masterAudioStereoWithProgress(
360
+ request.preset ?? 'pop',
361
+ request.left,
362
+ request.right,
363
+ request.sampleRate ?? 22050,
364
+ flat,
365
+ request.onProgress,
366
+ );
367
+ }
368
+ return requireModule().masterAudioStereo(
369
+ request.preset ?? 'pop',
370
+ request.left,
371
+ request.right,
372
+ request.sampleRate ?? 22050,
373
+ flat,
374
+ );
156
375
  }
157
376
 
158
377
  /**
159
378
  * Mono `masterAudio` with per-stage progress reporting. `onProgress` is invoked
160
379
  * with `(progress, stage)` between each chain stage (progress is in [0,1]).
161
380
  */
381
+ export function masterAudioWithProgress(
382
+ request: MasterAudioRequest & Required<Pick<MasterAudioRequest, 'onProgress'>>,
383
+ ): MasteringChainResult;
162
384
  export function masterAudioWithProgress(
163
385
  samples: Float32Array,
386
+ sampleRate?: number,
387
+ presetName?: MasteringPreset,
388
+ overrides?: MasteringChainConfig | null,
389
+ onProgress?: ProgressCallback,
390
+ ): MasteringChainResult;
391
+ export function masterAudioWithProgress(
392
+ samples: MasterAudioRequest | Float32Array,
164
393
  sampleRate = 22050,
165
- presetName: MasteringPreset,
166
- onProgress: ProgressCallback,
167
- overrides: Record<string, number | boolean> | null = null,
394
+ presetName: MasteringPreset = 'pop',
395
+ overrides: MasteringChainConfig | null = null,
396
+ onProgress?: ProgressCallback,
168
397
  ): MasteringChainResult {
398
+ const request = masterAudioRequest(samples, sampleRate, presetName, overrides, onProgress);
399
+ if (!request.onProgress) {
400
+ throw new TypeError('masterAudioWithProgress: onProgress is required');
401
+ }
169
402
  return requireModule().masterAudioWithProgress(
170
- presetName,
171
- samples,
172
- sampleRate,
173
- overrides,
174
- onProgress,
403
+ request.preset ?? 'pop',
404
+ request.samples,
405
+ request.sampleRate ?? 22050,
406
+ flattenChainConfig(request.overrides ?? {}),
407
+ request.onProgress,
175
408
  );
176
409
  }
177
410
 
178
411
  /**
179
412
  * Stereo `masterAudio` with per-stage progress reporting.
180
413
  */
414
+ export function masterAudioStereoWithProgress(
415
+ request: MasterAudioStereoRequest & Required<Pick<MasterAudioStereoRequest, 'onProgress'>>,
416
+ ): MasteringChainStereoResult;
181
417
  export function masterAudioStereoWithProgress(
182
418
  left: Float32Array,
183
419
  right: Float32Array,
420
+ sampleRate?: number,
421
+ presetName?: MasteringPreset,
422
+ overrides?: MasteringChainConfig | null,
423
+ onProgress?: ProgressCallback,
424
+ ): MasteringChainStereoResult;
425
+ export function masterAudioStereoWithProgress(
426
+ left: MasterAudioStereoRequest | Float32Array,
427
+ right: Float32Array | undefined = undefined,
184
428
  sampleRate = 22050,
185
- presetName: MasteringPreset,
186
- onProgress: ProgressCallback,
187
- overrides: Record<string, number | boolean> | null = null,
188
- ): MasteringStereoChainResult {
189
- if (left.length !== right.length) {
190
- throw new Error('Stereo channel lengths must match.');
191
- }
192
- return requireModule().masterAudioStereoWithProgress(
193
- presetName,
429
+ presetName: MasteringPreset = 'pop',
430
+ overrides: MasteringChainConfig | null = null,
431
+ onProgress?: ProgressCallback,
432
+ ): MasteringChainStereoResult {
433
+ const request = masterAudioStereoRequest(
194
434
  left,
195
435
  right,
196
436
  sampleRate,
437
+ presetName,
197
438
  overrides,
198
439
  onProgress,
199
440
  );
441
+ if (!request.onProgress) {
442
+ throw new TypeError('masterAudioStereoWithProgress: onProgress is required');
443
+ }
444
+ if (request.left.length !== request.right.length) {
445
+ throw new Error('Stereo channel lengths must match.');
446
+ }
447
+ return requireModule().masterAudioStereoWithProgress(
448
+ request.preset ?? 'pop',
449
+ request.left,
450
+ request.right,
451
+ request.sampleRate ?? 22050,
452
+ flattenChainConfig(request.overrides ?? {}),
453
+ request.onProgress,
454
+ );
200
455
  }