@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.
- package/README.md +18 -3
- package/dist/index.d.ts +1147 -181
- package/dist/index.js +4826 -3941
- 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 +1067 -973
- package/dist/worklet.js.map +1 -1
- package/package.json +2 -1
- package/src/_chain_config.ts +46 -0
- package/src/audio.ts +24 -4
- package/src/effects_mastering.ts +25 -1
- package/src/effects_transform.ts +283 -43
- package/src/effects_voice_change.ts +46 -53
- package/src/feature_core.ts +316 -12
- package/src/feature_music.ts +357 -0
- 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 +366 -81
- 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 +17 -6
- package/src/project_internal.ts +10 -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/sonare.js.d.ts +31 -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/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 {
|
|
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,
|
package/src/mastering_chain.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
95
|
-
):
|
|
96
|
-
|
|
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
|
|
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
|
|
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:
|
|
296
|
+
overrides: MasteringChainConfig = {},
|
|
297
|
+
onProgress?: ProgressCallback,
|
|
131
298
|
): MasteringChainResult {
|
|
132
|
-
|
|
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
|
|
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:
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
):
|
|
189
|
-
|
|
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
|
}
|