@libraz/libsonare 1.5.2 → 1.5.3

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 (46) hide show
  1. package/README.md +18 -3
  2. package/dist/index.d.ts +1147 -181
  3. package/dist/index.js +4826 -3941
  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 +1067 -973
  9. package/dist/worklet.js.map +1 -1
  10. package/package.json +2 -1
  11. package/src/_chain_config.ts +46 -0
  12. package/src/audio.ts +24 -4
  13. package/src/effects_mastering.ts +25 -1
  14. package/src/effects_transform.ts +283 -43
  15. package/src/effects_voice_change.ts +46 -53
  16. package/src/feature_core.ts +316 -12
  17. package/src/feature_music.ts +357 -0
  18. package/src/feature_pitch.ts +61 -0
  19. package/src/feature_resample.ts +17 -2
  20. package/src/feature_spectral.ts +349 -2
  21. package/src/feature_spectrogram.ts +336 -0
  22. package/src/index.ts +130 -1
  23. package/src/mastering_chain.ts +305 -50
  24. package/src/mastering_core.ts +232 -16
  25. package/src/mastering_dynamics.ts +66 -10
  26. package/src/mastering_repair.ts +119 -7
  27. package/src/metering.ts +366 -81
  28. package/src/mixer.ts +9 -2
  29. package/src/mixing_oneshot.ts +25 -5
  30. package/src/module_state.ts +1 -1
  31. package/src/project_class.ts +17 -6
  32. package/src/project_internal.ts +10 -2
  33. package/src/project_types.ts +25 -2
  34. package/src/public_types_mastering.ts +114 -4
  35. package/src/public_types_spectral.ts +7 -0
  36. package/src/quick_analysis.ts +325 -117
  37. package/src/realtime_engine.ts +8 -0
  38. package/src/sonare.js.d.ts +31 -0
  39. package/src/stream_analyzer.ts +20 -1
  40. package/src/stream_types.ts +12 -1
  41. package/src/validation.ts +17 -2
  42. package/src/worklet/engine-clips.ts +67 -2
  43. package/src/worklet/engine-processor.ts +33 -5
  44. package/src/worklet/engine.ts +7 -3
  45. package/src/worklet/guards.ts +3 -0
  46. package/src/worklet/messages.ts +27 -0
@@ -15,6 +15,68 @@ function requireModule() {
15
15
  return getSonareModule();
16
16
  }
17
17
 
18
+ /** Canonical request form for loudness/true-peak mastering. */
19
+ export interface MasteringRequest extends MasteringOptions {
20
+ samples: Float32Array;
21
+ sampleRate?: number;
22
+ }
23
+
24
+ export interface MasteringProcessRequest {
25
+ processorName: SoloProcessor;
26
+ samples: Float32Array;
27
+ sampleRate?: number;
28
+ params?: MasteringProcessorParams;
29
+ }
30
+
31
+ export interface MasteringProcessStereoRequest {
32
+ processorName: SoloProcessor;
33
+ left: Float32Array;
34
+ right: Float32Array;
35
+ sampleRate?: number;
36
+ params?: MasteringProcessorParams;
37
+ }
38
+
39
+ /** Canonical request form for a two-input match processor. */
40
+ export interface MasteringPairProcessRequest {
41
+ processorName: PairProcessor;
42
+ source: Float32Array;
43
+ reference: Float32Array;
44
+ sampleRate?: number;
45
+ params?: MasteringProcessorParams;
46
+ }
47
+
48
+ /** Canonical request form for a two-input match analysis. */
49
+ export interface MasteringPairAnalyzeRequest {
50
+ analysisName: PairAnalysis;
51
+ source: Float32Array;
52
+ reference: Float32Array;
53
+ sampleRate?: number;
54
+ params?: MasteringProcessorParams;
55
+ }
56
+
57
+ /** Canonical request form for a stereo analysis. */
58
+ export interface MasteringStereoAnalyzeRequest {
59
+ analysisName: StereoAnalysis;
60
+ left: Float32Array;
61
+ right: Float32Array;
62
+ sampleRate?: number;
63
+ params?: MasteringProcessorParams;
64
+ }
65
+
66
+ /** Canonical request form for assistant/profile calls. */
67
+ export interface MasteringSamplesParamsRequest {
68
+ samples: Float32Array;
69
+ sampleRate?: number;
70
+ params?: MasteringProcessorParams;
71
+ }
72
+
73
+ /** Canonical request form for streaming-platform preview. */
74
+ export interface MasteringStreamingPreviewRequest {
75
+ samples: Float32Array;
76
+ sampleRate?: number;
77
+ platforms?: StreamingPlatform[];
78
+ }
79
+
18
80
  /**
19
81
  * Apply mastering loudness normalization with a true-peak ceiling.
20
82
  *
@@ -23,19 +85,26 @@ function requireModule() {
23
85
  * @param options - Loudness/ceiling settings ({@link MasteringOptions})
24
86
  * @returns Processed audio and loudness metadata
25
87
  */
88
+ export function mastering(request: MasteringRequest): MasteringResult;
26
89
  export function mastering(
27
90
  samples: Float32Array,
91
+ sampleRate?: number,
92
+ options?: MasteringOptions,
93
+ ): MasteringResult;
94
+ export function mastering(
95
+ samples: MasteringRequest | Float32Array,
28
96
  sampleRate = 22050,
29
97
  options: MasteringOptions = {},
30
98
  ): MasteringResult {
99
+ const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
31
100
  return requireModule().mastering(
32
- samples,
33
- sampleRate,
34
- options.targetLufs ?? -14.0,
35
- options.ceilingDb ?? -1.0,
36
- options.truePeakOversample ?? 4,
37
- options.releaseMs ?? 0, // 0 => library default (50 ms)
38
- options.applyGainAtInputRate ?? false,
101
+ request.samples,
102
+ request.sampleRate ?? 22050,
103
+ request.targetLufs ?? -14.0,
104
+ request.ceilingDb ?? -1.0,
105
+ request.truePeakOversample ?? 4,
106
+ request.releaseMs ?? 0, // 0 => library default (50 ms)
107
+ request.applyGainAtInputRate ?? false,
39
108
  );
40
109
  }
41
110
 
@@ -172,26 +241,68 @@ export function masteringStereoAnalysisNames(): StereoAnalysis[] {
172
241
  return Array.from(requireModule().masteringStereoAnalysisNames()) as StereoAnalysis[];
173
242
  }
174
243
 
244
+ export function masteringProcess(request: MasteringProcessRequest): MasteringResult;
175
245
  export function masteringProcess(
176
246
  processorName: SoloProcessor,
177
247
  samples: Float32Array,
248
+ sampleRate?: number,
249
+ params?: MasteringProcessorParams,
250
+ ): MasteringResult;
251
+ export function masteringProcess(
252
+ processorName: SoloProcessor | MasteringProcessRequest,
253
+ samples?: Float32Array,
178
254
  sampleRate = 22050,
179
255
  params: MasteringProcessorParams = {},
180
256
  ): MasteringResult {
181
- return requireModule().masteringProcess(processorName, samples, sampleRate, params);
257
+ const request =
258
+ typeof processorName === 'string'
259
+ ? { processorName, samples: samples as Float32Array, sampleRate, params }
260
+ : processorName;
261
+ return requireModule().masteringProcess(
262
+ request.processorName,
263
+ request.samples,
264
+ request.sampleRate ?? 22050,
265
+ request.params ?? {},
266
+ );
182
267
  }
183
268
 
269
+ export function masteringProcessStereo(
270
+ request: MasteringProcessStereoRequest,
271
+ ): MasteringStereoResult;
184
272
  export function masteringProcessStereo(
185
273
  processorName: SoloProcessor,
186
274
  left: Float32Array,
187
275
  right: Float32Array,
276
+ sampleRate?: number,
277
+ params?: MasteringProcessorParams,
278
+ ): MasteringStereoResult;
279
+ export function masteringProcessStereo(
280
+ processorName: SoloProcessor | MasteringProcessStereoRequest,
281
+ left?: Float32Array,
282
+ right?: Float32Array,
188
283
  sampleRate = 22050,
189
284
  params: MasteringProcessorParams = {},
190
285
  ): MasteringStereoResult {
191
- if (left.length !== right.length) {
286
+ const request =
287
+ typeof processorName === 'string'
288
+ ? {
289
+ processorName,
290
+ left: left as Float32Array,
291
+ right: right as Float32Array,
292
+ sampleRate,
293
+ params,
294
+ }
295
+ : processorName;
296
+ if (request.left.length !== request.right.length) {
192
297
  throw new Error('Stereo channel lengths must match.');
193
298
  }
194
- return requireModule().masteringProcessStereo(processorName, left, right, sampleRate, params);
299
+ return requireModule().masteringProcessStereo(
300
+ request.processorName,
301
+ request.left,
302
+ request.right,
303
+ request.sampleRate ?? 22050,
304
+ request.params ?? {},
305
+ );
195
306
  }
196
307
 
197
308
  /**
@@ -199,60 +310,165 @@ export function masteringProcessStereo(
199
310
  * independent lengths — the match primitives consume each buffer at its own
200
311
  * length.
201
312
  */
313
+ export function masteringPairProcess(request: MasteringPairProcessRequest): MasteringResult;
202
314
  export function masteringPairProcess(
203
315
  processorName: PairProcessor,
204
316
  source: Float32Array,
205
317
  reference: Float32Array,
318
+ sampleRate?: number,
319
+ params?: MasteringProcessorParams,
320
+ ): MasteringResult;
321
+ export function masteringPairProcess(
322
+ processorName: PairProcessor | MasteringPairProcessRequest,
323
+ source?: Float32Array,
324
+ reference?: Float32Array,
206
325
  sampleRate = 22050,
207
326
  params: MasteringProcessorParams = {},
208
327
  ): MasteringResult {
209
- return requireModule().masteringPairProcess(processorName, source, reference, sampleRate, params);
328
+ const request =
329
+ typeof processorName === 'string'
330
+ ? {
331
+ processorName,
332
+ source: source as Float32Array,
333
+ reference: reference as Float32Array,
334
+ sampleRate,
335
+ params,
336
+ }
337
+ : processorName;
338
+ return requireModule().masteringPairProcess(
339
+ request.processorName,
340
+ request.source,
341
+ request.reference,
342
+ request.sampleRate ?? 22050,
343
+ request.params ?? {},
344
+ );
210
345
  }
211
346
 
212
347
  /**
213
348
  * Analyze a `source` against a `reference` with a two-input analysis. The two
214
349
  * buffers may have independent lengths.
215
350
  */
351
+ export function masteringPairAnalyze(request: MasteringPairAnalyzeRequest): string;
216
352
  export function masteringPairAnalyze(
217
353
  analysisName: PairAnalysis,
218
354
  source: Float32Array,
219
355
  reference: Float32Array,
356
+ sampleRate?: number,
357
+ params?: MasteringProcessorParams,
358
+ ): string;
359
+ export function masteringPairAnalyze(
360
+ analysisName: PairAnalysis | MasteringPairAnalyzeRequest,
361
+ source?: Float32Array,
362
+ reference?: Float32Array,
220
363
  sampleRate = 22050,
221
364
  params: MasteringProcessorParams = {},
222
365
  ): string {
223
- return requireModule().masteringPairAnalyze(analysisName, source, reference, sampleRate, params);
366
+ const request =
367
+ typeof analysisName === 'string'
368
+ ? {
369
+ analysisName,
370
+ source: source as Float32Array,
371
+ reference: reference as Float32Array,
372
+ sampleRate,
373
+ params,
374
+ }
375
+ : analysisName;
376
+ return requireModule().masteringPairAnalyze(
377
+ request.analysisName,
378
+ request.source,
379
+ request.reference,
380
+ request.sampleRate ?? 22050,
381
+ request.params ?? {},
382
+ );
224
383
  }
225
384
 
385
+ export function masteringStereoAnalyze(request: MasteringStereoAnalyzeRequest): string;
226
386
  export function masteringStereoAnalyze(
227
387
  analysisName: StereoAnalysis,
228
388
  left: Float32Array,
229
389
  right: Float32Array,
390
+ sampleRate?: number,
391
+ params?: MasteringProcessorParams,
392
+ ): string;
393
+ export function masteringStereoAnalyze(
394
+ analysisName: StereoAnalysis | MasteringStereoAnalyzeRequest,
395
+ left?: Float32Array,
396
+ right?: Float32Array,
230
397
  sampleRate = 22050,
231
398
  params: MasteringProcessorParams = {},
232
399
  ): string {
233
- return requireModule().masteringStereoAnalyze(analysisName, left, right, sampleRate, params);
400
+ const request =
401
+ typeof analysisName === 'string'
402
+ ? {
403
+ analysisName,
404
+ left: left as Float32Array,
405
+ right: right as Float32Array,
406
+ sampleRate,
407
+ params,
408
+ }
409
+ : analysisName;
410
+ return requireModule().masteringStereoAnalyze(
411
+ request.analysisName,
412
+ request.left,
413
+ request.right,
414
+ request.sampleRate ?? 22050,
415
+ request.params ?? {},
416
+ );
234
417
  }
235
418
 
419
+ export function masteringAssistantSuggest(request: MasteringSamplesParamsRequest): string;
236
420
  export function masteringAssistantSuggest(
237
421
  samples: Float32Array,
422
+ sampleRate?: number,
423
+ params?: MasteringProcessorParams,
424
+ ): string;
425
+ export function masteringAssistantSuggest(
426
+ samples: Float32Array | MasteringSamplesParamsRequest,
238
427
  sampleRate = 22050,
239
428
  params: MasteringProcessorParams = {},
240
429
  ): string {
241
- return requireModule().masteringAssistantSuggest(samples, sampleRate, params);
430
+ const request = samples instanceof Float32Array ? { samples, sampleRate, params } : samples;
431
+ return requireModule().masteringAssistantSuggest(
432
+ request.samples,
433
+ request.sampleRate ?? 22050,
434
+ request.params ?? {},
435
+ );
242
436
  }
243
437
 
438
+ export function masteringAudioProfile(request: MasteringSamplesParamsRequest): string;
244
439
  export function masteringAudioProfile(
245
440
  samples: Float32Array,
441
+ sampleRate?: number,
442
+ params?: MasteringProcessorParams,
443
+ ): string;
444
+ export function masteringAudioProfile(
445
+ samples: Float32Array | MasteringSamplesParamsRequest,
246
446
  sampleRate = 22050,
247
447
  params: MasteringProcessorParams = {},
248
448
  ): string {
249
- return requireModule().masteringAudioProfile(samples, sampleRate, params);
449
+ const request = samples instanceof Float32Array ? { samples, sampleRate, params } : samples;
450
+ return requireModule().masteringAudioProfile(
451
+ request.samples,
452
+ request.sampleRate ?? 22050,
453
+ request.params ?? {},
454
+ );
250
455
  }
251
456
 
457
+ export function masteringStreamingPreview(request: MasteringStreamingPreviewRequest): string;
252
458
  export function masteringStreamingPreview(
253
459
  samples: Float32Array,
460
+ sampleRate?: number,
461
+ platforms?: StreamingPlatform[],
462
+ ): string;
463
+ export function masteringStreamingPreview(
464
+ samples: Float32Array | MasteringStreamingPreviewRequest,
254
465
  sampleRate = 22050,
255
466
  platforms: StreamingPlatform[] = [],
256
467
  ): string {
257
- return requireModule().masteringStreamingPreview(samples, sampleRate, platforms);
468
+ const request = samples instanceof Float32Array ? { samples, sampleRate, platforms } : samples;
469
+ return requireModule().masteringStreamingPreview(
470
+ request.samples,
471
+ request.sampleRate ?? 22050,
472
+ request.platforms ?? [],
473
+ );
258
474
  }
@@ -29,6 +29,12 @@ export interface CompressorOptions extends ValidateOptions {
29
29
  pdrReleaseScale?: number;
30
30
  }
31
31
 
32
+ /** Canonical request form for the offline compressor. */
33
+ export interface MasteringDynamicsCompressorRequest extends CompressorOptions {
34
+ samples: Float32Array;
35
+ sampleRate: number;
36
+ }
37
+
32
38
  /** Options for `masteringDynamicsGate`. */
33
39
  export interface GateOptions extends ValidateOptions {
34
40
  thresholdDb?: number;
@@ -40,6 +46,12 @@ export interface GateOptions extends ValidateOptions {
40
46
  keyHpfHz?: number;
41
47
  }
42
48
 
49
+ /** Canonical request form for the offline gate. */
50
+ export interface MasteringDynamicsGateRequest extends GateOptions {
51
+ samples: Float32Array;
52
+ sampleRate: number;
53
+ }
54
+
43
55
  /** Options for `masteringDynamicsTransientShaper`. */
44
56
  export interface TransientShaperOptions extends ValidateOptions {
45
57
  attackGainDb?: number;
@@ -54,6 +66,12 @@ export interface TransientShaperOptions extends ValidateOptions {
54
66
  lookaheadMs?: number;
55
67
  }
56
68
 
69
+ /** Canonical request form for the offline transient shaper. */
70
+ export interface MasteringDynamicsTransientShaperRequest extends TransientShaperOptions {
71
+ samples: Float32Array;
72
+ sampleRate: number;
73
+ }
74
+
57
75
  /** Result envelope returned by offline mastering dynamics processors. */
58
76
  export interface DynamicsResult {
59
77
  samples: Float32Array;
@@ -67,39 +85,77 @@ const COMPRESSOR_DETECTOR_MAP: Record<CompressorDetector, number> = {
67
85
  };
68
86
 
69
87
  /** Offline feed-forward compressor (soft knee, optional auto-makeup / sidechain HPF). */
88
+ export function masteringDynamicsCompressor(
89
+ request: MasteringDynamicsCompressorRequest,
90
+ ): DynamicsResult;
70
91
  export function masteringDynamicsCompressor(
71
92
  samples: Float32Array,
72
93
  sampleRate: number,
94
+ options?: CompressorOptions,
95
+ ): DynamicsResult;
96
+ export function masteringDynamicsCompressor(
97
+ samples: Float32Array | MasteringDynamicsCompressorRequest,
98
+ sampleRate?: number,
73
99
  options: CompressorOptions = {},
74
100
  ): DynamicsResult {
75
- assertSamples('masteringDynamicsCompressor', samples, options.validate !== false);
101
+ const request =
102
+ samples instanceof Float32Array
103
+ ? { samples, sampleRate: sampleRate as number, ...options }
104
+ : samples;
105
+ assertSamples('masteringDynamicsCompressor', request.samples, request.validate !== false);
76
106
  const detector =
77
- typeof options.detector === 'string'
78
- ? COMPRESSOR_DETECTOR_MAP[options.detector]
79
- : options.detector;
80
- const opts: Record<string, unknown> = { ...options };
107
+ typeof request.detector === 'string'
108
+ ? COMPRESSOR_DETECTOR_MAP[request.detector]
109
+ : request.detector;
110
+ const opts: Record<string, unknown> = { ...request };
81
111
  if (detector !== undefined) {
82
112
  opts.detector = detector;
83
113
  }
84
- return requireModule().masteringDynamicsCompressor(samples, sampleRate, opts);
114
+ return requireModule().masteringDynamicsCompressor(request.samples, request.sampleRate, opts);
85
115
  }
86
116
 
87
117
  /** Offline noise gate (hysteresis, hold, optional key HPF). */
118
+ export function masteringDynamicsGate(request: MasteringDynamicsGateRequest): DynamicsResult;
88
119
  export function masteringDynamicsGate(
89
120
  samples: Float32Array,
90
121
  sampleRate: number,
122
+ options?: GateOptions,
123
+ ): DynamicsResult;
124
+ export function masteringDynamicsGate(
125
+ samples: Float32Array | MasteringDynamicsGateRequest,
126
+ sampleRate?: number,
91
127
  options: GateOptions = {},
92
128
  ): DynamicsResult {
93
- assertSamples('masteringDynamicsGate', samples, options.validate !== false);
94
- return requireModule().masteringDynamicsGate(samples, sampleRate, options);
129
+ const request =
130
+ samples instanceof Float32Array
131
+ ? { samples, sampleRate: sampleRate as number, ...options }
132
+ : samples;
133
+ assertSamples('masteringDynamicsGate', request.samples, request.validate !== false);
134
+ return requireModule().masteringDynamicsGate(request.samples, request.sampleRate, request);
95
135
  }
96
136
 
97
137
  /** Offline transient shaper (envelope-difference attack/sustain control). */
138
+ export function masteringDynamicsTransientShaper(
139
+ request: MasteringDynamicsTransientShaperRequest,
140
+ ): DynamicsResult;
98
141
  export function masteringDynamicsTransientShaper(
99
142
  samples: Float32Array,
100
143
  sampleRate: number,
144
+ options?: TransientShaperOptions,
145
+ ): DynamicsResult;
146
+ export function masteringDynamicsTransientShaper(
147
+ samples: Float32Array | MasteringDynamicsTransientShaperRequest,
148
+ sampleRate?: number,
101
149
  options: TransientShaperOptions = {},
102
150
  ): DynamicsResult {
103
- assertSamples('masteringDynamicsTransientShaper', samples, options.validate !== false);
104
- return requireModule().masteringDynamicsTransientShaper(samples, sampleRate, options);
151
+ const request =
152
+ samples instanceof Float32Array
153
+ ? { samples, sampleRate: sampleRate as number, ...options }
154
+ : samples;
155
+ assertSamples('masteringDynamicsTransientShaper', request.samples, request.validate !== false);
156
+ return requireModule().masteringDynamicsTransientShaper(
157
+ request.samples,
158
+ request.sampleRate,
159
+ request,
160
+ );
105
161
  }
@@ -17,6 +17,10 @@ export interface DeclickOptions {
17
17
  lpcOrder?: number;
18
18
  residualRatio?: number;
19
19
  }
20
+ export interface MasteringRepairDeclickRequest extends DeclickOptions {
21
+ samples: Float32Array;
22
+ sampleRate: number;
23
+ }
20
24
 
21
25
  /** Algorithms accepted by `masteringRepairDenoiseClassical`. */
22
26
  export type DenoiseClassicalMode = 'logMmse' | 'mmseStsa' | 'spectralSubtraction';
@@ -38,23 +42,53 @@ export interface DenoiseClassicalOptions {
38
42
  speechPresenceGain?: boolean;
39
43
  gainSmoothing?: boolean;
40
44
  }
45
+ export interface MasteringRepairDenoiseClassicalRequest extends DenoiseClassicalOptions {
46
+ samples: Float32Array;
47
+ sampleRate: number;
48
+ }
41
49
 
42
50
  /** Offline LPC-based declicker. */
51
+ export function masteringRepairDeclick(request: MasteringRepairDeclickRequest): Float32Array;
43
52
  export function masteringRepairDeclick(
44
53
  samples: Float32Array,
45
54
  sampleRate: number,
55
+ options?: DeclickOptions,
56
+ ): Float32Array;
57
+ export function masteringRepairDeclick(
58
+ samples: Float32Array | MasteringRepairDeclickRequest,
59
+ sampleRate?: number,
46
60
  options: DeclickOptions = {},
47
61
  ): Float32Array {
48
- return requireModule().masteringRepairDeclick(samples, sampleRate, options);
62
+ const request =
63
+ samples instanceof Float32Array
64
+ ? { samples, sampleRate: sampleRate as number, ...options }
65
+ : samples;
66
+ return requireModule().masteringRepairDeclick(request.samples, request.sampleRate, request);
49
67
  }
50
68
 
51
69
  /** Offline STFT-domain classical denoiser (LogMMSE / MMSE-STSA / SpectralSubtraction). */
70
+ export function masteringRepairDenoiseClassical(
71
+ request: MasteringRepairDenoiseClassicalRequest,
72
+ ): Float32Array;
52
73
  export function masteringRepairDenoiseClassical(
53
74
  samples: Float32Array,
54
75
  sampleRate: number,
76
+ options?: DenoiseClassicalOptions,
77
+ ): Float32Array;
78
+ export function masteringRepairDenoiseClassical(
79
+ samples: Float32Array | MasteringRepairDenoiseClassicalRequest,
80
+ sampleRate?: number,
55
81
  options: DenoiseClassicalOptions = {},
56
82
  ): Float32Array {
57
- return requireModule().masteringRepairDenoiseClassical(samples, sampleRate, options);
83
+ const request =
84
+ samples instanceof Float32Array
85
+ ? { samples, sampleRate: sampleRate as number, ...options }
86
+ : samples;
87
+ return requireModule().masteringRepairDenoiseClassical(
88
+ request.samples,
89
+ request.sampleRate,
90
+ request,
91
+ );
58
92
  }
59
93
 
60
94
  /** Options for `masteringRepairDeclip`. */
@@ -64,6 +98,10 @@ export interface DeclipOptions {
64
98
  iterations?: number;
65
99
  lpcBlend?: number;
66
100
  }
101
+ export interface MasteringRepairDeclipRequest extends DeclipOptions {
102
+ samples: Float32Array;
103
+ sampleRate: number;
104
+ }
67
105
 
68
106
  /** Algorithms accepted by `masteringRepairDecrackle`. */
69
107
  export type DecrackleMode = 'median' | 'waveletShrinkage';
@@ -74,6 +112,10 @@ export interface DecrackleOptions {
74
112
  mode?: DecrackleMode;
75
113
  levels?: number;
76
114
  }
115
+ export interface MasteringRepairDecrackleRequest extends DecrackleOptions {
116
+ samples: Float32Array;
117
+ sampleRate: number;
118
+ }
77
119
 
78
120
  /** Options for `masteringRepairDehum`. */
79
121
  export interface DehumOptions {
@@ -86,6 +128,10 @@ export interface DehumOptions {
86
128
  frameSize?: number;
87
129
  pllBandwidth?: number;
88
130
  }
131
+ export interface MasteringRepairDehumRequest extends DehumOptions {
132
+ samples: Float32Array;
133
+ sampleRate: number;
134
+ }
89
135
 
90
136
  /** Options for `masteringRepairDereverbClassical`. */
91
137
  export interface DereverbClassicalOptions {
@@ -102,6 +148,10 @@ export interface DereverbClassicalOptions {
102
148
  wpeTaps?: number;
103
149
  wpeStrength?: number;
104
150
  }
151
+ export interface MasteringRepairDereverbClassicalRequest extends DereverbClassicalOptions {
152
+ samples: Float32Array;
153
+ sampleRate: number;
154
+ }
105
155
 
106
156
  /** Trimming modes accepted by `masteringRepairTrimSilence`. */
107
157
  export type TrimSilenceMode = 'peak' | 'lufsGated';
@@ -114,48 +164,110 @@ export interface TrimSilenceOptions {
114
164
  gateLufs?: number;
115
165
  windowMs?: number;
116
166
  }
167
+ export interface MasteringRepairTrimSilenceRequest extends TrimSilenceOptions {
168
+ samples: Float32Array;
169
+ sampleRate: number;
170
+ }
117
171
 
118
172
  /** Offline LPC-based declipper. */
173
+ export function masteringRepairDeclip(request: MasteringRepairDeclipRequest): Float32Array;
119
174
  export function masteringRepairDeclip(
120
175
  samples: Float32Array,
121
176
  sampleRate: number,
177
+ options?: DeclipOptions,
178
+ ): Float32Array;
179
+ export function masteringRepairDeclip(
180
+ samples: Float32Array | MasteringRepairDeclipRequest,
181
+ sampleRate?: number,
122
182
  options: DeclipOptions = {},
123
183
  ): Float32Array {
124
- return requireModule().masteringRepairDeclip(samples, sampleRate, options);
184
+ const request =
185
+ samples instanceof Float32Array
186
+ ? { samples, sampleRate: sampleRate as number, ...options }
187
+ : samples;
188
+ return requireModule().masteringRepairDeclip(request.samples, request.sampleRate, request);
125
189
  }
126
190
 
127
191
  /** Offline crackle suppressor (median or wavelet-shrinkage). */
192
+ export function masteringRepairDecrackle(request: MasteringRepairDecrackleRequest): Float32Array;
128
193
  export function masteringRepairDecrackle(
129
194
  samples: Float32Array,
130
195
  sampleRate: number,
196
+ options?: DecrackleOptions,
197
+ ): Float32Array;
198
+ export function masteringRepairDecrackle(
199
+ samples: Float32Array | MasteringRepairDecrackleRequest,
200
+ sampleRate?: number,
131
201
  options: DecrackleOptions = {},
132
202
  ): Float32Array {
133
- return requireModule().masteringRepairDecrackle(samples, sampleRate, options);
203
+ const request =
204
+ samples instanceof Float32Array
205
+ ? { samples, sampleRate: sampleRate as number, ...options }
206
+ : samples;
207
+ return requireModule().masteringRepairDecrackle(request.samples, request.sampleRate, request);
134
208
  }
135
209
 
136
210
  /** Offline mains-hum remover. */
211
+ export function masteringRepairDehum(request: MasteringRepairDehumRequest): Float32Array;
137
212
  export function masteringRepairDehum(
138
213
  samples: Float32Array,
139
214
  sampleRate: number,
215
+ options?: DehumOptions,
216
+ ): Float32Array;
217
+ export function masteringRepairDehum(
218
+ samples: Float32Array | MasteringRepairDehumRequest,
219
+ sampleRate?: number,
140
220
  options: DehumOptions = {},
141
221
  ): Float32Array {
142
- return requireModule().masteringRepairDehum(samples, sampleRate, options);
222
+ const request =
223
+ samples instanceof Float32Array
224
+ ? { samples, sampleRate: sampleRate as number, ...options }
225
+ : samples;
226
+ return requireModule().masteringRepairDehum(request.samples, request.sampleRate, request);
143
227
  }
144
228
 
145
229
  /** Offline classical dereverberator (spectral subtraction + optional WPE). */
230
+ export function masteringRepairDereverbClassical(
231
+ request: MasteringRepairDereverbClassicalRequest,
232
+ ): Float32Array;
146
233
  export function masteringRepairDereverbClassical(
147
234
  samples: Float32Array,
148
235
  sampleRate: number,
236
+ options?: DereverbClassicalOptions,
237
+ ): Float32Array;
238
+ export function masteringRepairDereverbClassical(
239
+ samples: Float32Array | MasteringRepairDereverbClassicalRequest,
240
+ sampleRate?: number,
149
241
  options: DereverbClassicalOptions = {},
150
242
  ): Float32Array {
151
- return requireModule().masteringRepairDereverbClassical(samples, sampleRate, options);
243
+ const request =
244
+ samples instanceof Float32Array
245
+ ? { samples, sampleRate: sampleRate as number, ...options }
246
+ : samples;
247
+ return requireModule().masteringRepairDereverbClassical(
248
+ request.samples,
249
+ request.sampleRate,
250
+ request,
251
+ );
152
252
  }
153
253
 
154
254
  /** Offline silence trimmer (peak threshold or LUFS-gated). */
255
+ export function masteringRepairTrimSilence(
256
+ request: MasteringRepairTrimSilenceRequest,
257
+ ): Float32Array;
155
258
  export function masteringRepairTrimSilence(
156
259
  samples: Float32Array,
157
260
  sampleRate: number,
261
+ options?: TrimSilenceOptions,
262
+ ): Float32Array;
263
+ export function masteringRepairTrimSilence(
264
+ samples: Float32Array | MasteringRepairTrimSilenceRequest,
265
+ sampleRate?: number,
158
266
  options: TrimSilenceOptions = {},
159
267
  ): Float32Array {
160
- return requireModule().masteringRepairTrimSilence(samples, sampleRate, options);
268
+ const request =
269
+ samples instanceof Float32Array
270
+ ? { samples, sampleRate: sampleRate as number, ...options }
271
+ : samples;
272
+ return requireModule().masteringRepairTrimSilence(request.samples, request.sampleRate, request);
161
273
  }