@libraz/libsonare 1.5.1 → 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 +1165 -178
- package/dist/index.js +4830 -3871
- 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 +1068 -974
- 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 +462 -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/features.ts +2 -0
- package/src/index.ts +133 -1
- package/src/mastering_chain.ts +305 -50
- package/src/mastering_core.ts +242 -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 +10 -3
- 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_music.ts +1 -0
- 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 +56 -0
- package/src/stream_analyzer.ts +25 -2
- package/src/stream_types.ts +16 -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,
|
|
@@ -125,6 +221,7 @@ export {
|
|
|
125
221
|
chromaCens,
|
|
126
222
|
chromaCqt,
|
|
127
223
|
cqt,
|
|
224
|
+
cqtToAudio,
|
|
128
225
|
cyclicTempogram,
|
|
129
226
|
dbToAmplitude,
|
|
130
227
|
dbToPower,
|
|
@@ -193,24 +290,42 @@ export {
|
|
|
193
290
|
trimSilence,
|
|
194
291
|
vectorNormalize,
|
|
195
292
|
vqt,
|
|
293
|
+
vqtToAudio,
|
|
196
294
|
zeroCrossingRate,
|
|
197
295
|
zeroCrossings,
|
|
198
296
|
} from './features';
|
|
199
297
|
export type { BindMicrophoneInputOptions, MicrophoneInputBinding } from './live_audio';
|
|
200
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';
|
|
201
306
|
export type {
|
|
202
307
|
ClippingRegion,
|
|
203
308
|
ClippingReport,
|
|
204
309
|
DynamicRangeReport,
|
|
205
310
|
MeteringDetectClippingOptions,
|
|
311
|
+
MeteringDetectClippingRequest,
|
|
206
312
|
MeteringDynamicRangeOptions,
|
|
313
|
+
MeteringDynamicRangeRequest,
|
|
314
|
+
MeteringSamplesRequest,
|
|
315
|
+
MeteringSpectrumFrameRequest,
|
|
316
|
+
MeteringSpectrumRequest,
|
|
317
|
+
MeteringStereoDecimatedRequest,
|
|
318
|
+
MeteringStereoRequest,
|
|
319
|
+
MeteringTruePeakRequest,
|
|
207
320
|
PhaseScopeReport,
|
|
208
321
|
SpectrumOptions,
|
|
209
322
|
SpectrumReport,
|
|
210
323
|
VectorscopeReport,
|
|
211
324
|
WaveformPeakPyramidOptions,
|
|
325
|
+
WaveformPeakPyramidRequest,
|
|
212
326
|
WaveformPeaksOptions,
|
|
213
327
|
WaveformPeaksReport,
|
|
328
|
+
WaveformPeaksRequest,
|
|
214
329
|
} from './metering';
|
|
215
330
|
export {
|
|
216
331
|
meteringCrestFactorDb,
|
|
@@ -332,6 +447,7 @@ export type {
|
|
|
332
447
|
LufsResult,
|
|
333
448
|
MasteringChainConfig,
|
|
334
449
|
MasteringChainResult,
|
|
450
|
+
MasteringChainStereoResult,
|
|
335
451
|
MasteringOptions,
|
|
336
452
|
MasteringPreset,
|
|
337
453
|
MasteringProcessorParams,
|
|
@@ -371,6 +487,7 @@ export type {
|
|
|
371
487
|
SpectralEditOptions,
|
|
372
488
|
SpectralEditWindow,
|
|
373
489
|
SpectralRegionOp,
|
|
490
|
+
StageGainReduction,
|
|
374
491
|
StereoAnalysis,
|
|
375
492
|
StftPowerResult,
|
|
376
493
|
StftResult,
|
|
@@ -391,10 +508,23 @@ export {
|
|
|
391
508
|
SectionType,
|
|
392
509
|
} from './public_types';
|
|
393
510
|
export type {
|
|
511
|
+
AnalyzeBpmRequest,
|
|
512
|
+
AnalyzeDynamicsRequest,
|
|
513
|
+
AnalyzeImpulseResponseRequest,
|
|
514
|
+
AnalyzeRhythmRequest,
|
|
515
|
+
AnalyzeTimbreRequest,
|
|
516
|
+
AnalyzeWithProgressRequest,
|
|
394
517
|
BpmAnalysisResult,
|
|
395
518
|
BpmCandidate,
|
|
519
|
+
ChordFunctionalAnalysisRequest,
|
|
520
|
+
DetectAcousticRequest,
|
|
521
|
+
DetectChordsRequest,
|
|
522
|
+
DetectKeyRequest,
|
|
396
523
|
DynamicsAnalysisResult,
|
|
524
|
+
EstimateRoomRequest,
|
|
397
525
|
RhythmAnalysisResult,
|
|
526
|
+
RoomMorphRequest,
|
|
527
|
+
SamplesRequest,
|
|
398
528
|
TimbreAnalysisResult,
|
|
399
529
|
TimbreFrame,
|
|
400
530
|
} from './quick_analysis';
|
|
@@ -421,6 +551,7 @@ export {
|
|
|
421
551
|
synthesizeRir,
|
|
422
552
|
} from './quick_analysis';
|
|
423
553
|
export type {
|
|
554
|
+
ClipPageRequest,
|
|
424
555
|
EngineAutomationPoint,
|
|
425
556
|
EngineBounceOptions,
|
|
426
557
|
EngineBounceResult,
|
|
@@ -445,6 +576,7 @@ export type {
|
|
|
445
576
|
EngineTrackLane,
|
|
446
577
|
EngineTrackSend,
|
|
447
578
|
EngineTransportState,
|
|
579
|
+
ExternalMidiEvent,
|
|
448
580
|
MidiCcBindOptions,
|
|
449
581
|
} from './realtime_engine';
|
|
450
582
|
export { EXPECTED_ENGINE_ABI_VERSION, engineCapabilities, RealtimeEngine } from './realtime_engine';
|
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
|
}
|