@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.
- package/README.md +69 -725
- package/dist/index.d.ts +1155 -183
- package/dist/index.js +4924 -3935
- package/dist/index.js.map +1 -1
- package/dist/sonare.js +1 -1
- package/dist/sonare.wasm +0 -0
- package/dist/worklet.d.ts +29 -1
- package/dist/worklet.js +1141 -970
- package/dist/worklet.js.map +1 -1
- package/package.json +15 -3
- package/src/_chain_config.ts +46 -0
- package/src/audio.ts +24 -4
- package/src/codes.ts +27 -4
- package/src/effects_mastering.ts +25 -1
- package/src/effects_transform.ts +292 -46
- package/src/effects_voice_change.ts +46 -53
- package/src/feature_core.ts +316 -12
- package/src/feature_music.ts +371 -4
- package/src/feature_pitch.ts +61 -0
- package/src/feature_resample.ts +17 -2
- package/src/feature_spectral.ts +349 -2
- package/src/feature_spectrogram.ts +336 -0
- package/src/index.ts +130 -1
- package/src/mastering_chain.ts +305 -50
- package/src/mastering_core.ts +232 -16
- package/src/mastering_dynamics.ts +66 -10
- package/src/mastering_repair.ts +119 -7
- package/src/metering.ts +370 -83
- package/src/mixer.ts +9 -2
- package/src/mixing_oneshot.ts +25 -5
- package/src/module_state.ts +1 -1
- package/src/project_class.ts +30 -6
- package/src/project_internal.ts +12 -2
- package/src/project_types.ts +25 -2
- package/src/public_types_mastering.ts +114 -4
- package/src/public_types_spectral.ts +7 -0
- package/src/quick_analysis.ts +325 -117
- package/src/realtime_engine.ts +8 -0
- package/src/realtime_voice_changer.ts +79 -3
- package/src/sonare.js.d.ts +35 -0
- package/src/stream_analyzer.ts +20 -1
- package/src/stream_types.ts +12 -1
- package/src/validation.ts +17 -2
- package/src/worklet/engine-clips.ts +67 -2
- package/src/worklet/engine-processor.ts +33 -5
- package/src/worklet/engine.ts +7 -3
- package/src/worklet/guards.ts +3 -0
- package/src/worklet/messages.ts +27 -0
package/src/mastering_core.ts
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
78
|
-
? COMPRESSOR_DETECTOR_MAP[
|
|
79
|
-
:
|
|
80
|
-
const opts: Record<string, unknown> = { ...
|
|
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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
104
|
-
|
|
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
|
}
|
package/src/mastering_repair.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|