@libraz/libsonare 1.4.0 → 1.5.0

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 (65) hide show
  1. package/README.md +50 -19
  2. package/dist/index.d.ts +5384 -1
  3. package/dist/index.js +884 -574
  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 +1084 -5220
  8. package/dist/worklet.js +2677 -2452
  9. package/dist/worklet.js.map +1 -1
  10. package/package.json +4 -9
  11. package/src/clip_page_streamer.ts +250 -0
  12. package/src/effects_mastering.ts +85 -1082
  13. package/src/effects_transform.ts +286 -0
  14. package/src/effects_voice_change.ts +118 -0
  15. package/src/feature_music.ts +13 -9
  16. package/src/feature_spectrogram.ts +42 -2
  17. package/src/features.ts +1 -0
  18. package/src/index.ts +11 -0
  19. package/src/mastering_chain.ts +200 -0
  20. package/src/mastering_core.ts +248 -0
  21. package/src/mastering_dynamics.ts +105 -0
  22. package/src/mastering_repair.ts +161 -0
  23. package/src/mixing_oneshot.ts +54 -0
  24. package/src/module_state.ts +1 -2
  25. package/src/project.ts +71 -1688
  26. package/src/project_class.ts +861 -0
  27. package/src/project_internal.ts +332 -0
  28. package/src/project_synth.ts +43 -0
  29. package/src/project_types.ts +570 -0
  30. package/src/public_types.ts +6 -1217
  31. package/src/public_types_acoustic.ts +115 -0
  32. package/src/public_types_mastering.ts +333 -0
  33. package/src/public_types_mixing.ts +97 -0
  34. package/src/public_types_music.ts +352 -0
  35. package/src/public_types_realtime.ts +163 -0
  36. package/src/public_types_spectral.ts +194 -0
  37. package/src/quick_analysis.ts +18 -14
  38. package/src/realtime_engine.ts +94 -0
  39. package/src/realtime_voice_changer.ts +2 -1
  40. package/src/sonare.js.d.ts +74 -0
  41. package/src/worklet/engine-automation.ts +73 -0
  42. package/src/worklet/engine-capture-facade.ts +80 -0
  43. package/src/worklet/engine-clips.ts +71 -0
  44. package/src/worklet/engine-markers.ts +93 -0
  45. package/src/worklet/engine-mixer-facade.ts +186 -0
  46. package/src/worklet/engine-node.ts +451 -0
  47. package/src/worklet/engine-offline.ts +162 -0
  48. package/src/worklet/engine-options.ts +13 -0
  49. package/src/worklet/engine-parameter-facade.ts +172 -0
  50. package/src/worklet/engine-processor.ts +764 -0
  51. package/src/worklet/engine-register.ts +136 -0
  52. package/src/worklet/engine-strips.ts +315 -0
  53. package/src/worklet/engine-sync.ts +94 -0
  54. package/src/worklet/engine-tempo-facade.ts +141 -0
  55. package/src/worklet/engine.ts +998 -0
  56. package/src/worklet/guards.ts +14 -1
  57. package/src/worklet/messages.ts +60 -20
  58. package/src/worklet/mixer-processor.ts +368 -0
  59. package/src/worklet/protocol.ts +3 -0
  60. package/src/worklet/voice-changer-processor.ts +246 -0
  61. package/src/worklet.ts +20 -3549
  62. package/dist/sonare-rt-module.js +0 -2
  63. package/dist/sonare-rt.js +0 -2
  64. package/dist/sonare-rt.wasm +0 -0
  65. package/src/sonare-rt.d.ts +0 -93
@@ -1,1082 +1,85 @@
1
- import { getSonareModule } from './module_state';
2
- import type {
3
- HpssResult,
4
- MasteringChainConfig,
5
- MasteringChainResult,
6
- MasteringOptions,
7
- MasteringPreset,
8
- MasteringProcessorParams,
9
- MasteringResult,
10
- MasteringStereoChainResult,
11
- MasteringStereoResult,
12
- MixOptions,
13
- MixResult,
14
- NoteStretchOptions,
15
- PairAnalysis,
16
- PairProcessor,
17
- RealtimeVoiceChangerConfigInput,
18
- SoloProcessor,
19
- SpectralEditOptions,
20
- SpectralRegionOp,
21
- StereoAnalysis,
22
- StreamingPlatform,
23
- } from './public_types';
24
- import type { ProgressCallback } from './sonare.js';
25
- import { RealtimeVoiceChanger } from './streaming_mixing';
26
- import type { ValidateOptions } from './validation';
27
- import { assertSampleRate, assertSamples } from './validation';
28
-
29
- function requireModule() {
30
- return getSonareModule();
31
- }
32
-
33
- // ============================================================================
34
- // Effects
35
- // ============================================================================
36
-
37
- /**
38
- * Perform Harmonic-Percussive Source Separation (HPSS).
39
- *
40
- * @param samples - Audio samples (mono, float32)
41
- * @param sampleRate - Sample rate in Hz (default: 22050)
42
- * @param kernelHarmonic - Horizontal median filter size for harmonic (default: 31)
43
- * @param kernelPercussive - Vertical median filter size for percussive (default: 31)
44
- * @returns Separated harmonic and percussive components
45
- */
46
- export function hpss(
47
- samples: Float32Array,
48
- sampleRate = 22050,
49
- kernelHarmonic = 31,
50
- kernelPercussive = 31,
51
- ): HpssResult {
52
- return requireModule().hpss(samples, sampleRate, kernelHarmonic, kernelPercussive);
53
- }
54
-
55
- /**
56
- * Extract harmonic component from audio.
57
- *
58
- * @param samples - Audio samples (mono, float32)
59
- * @param sampleRate - Sample rate in Hz
60
- * @returns Harmonic component
61
- */
62
- export function harmonic(
63
- samples: Float32Array,
64
- sampleRate: number,
65
- options: ValidateOptions = {},
66
- ): Float32Array {
67
- assertSamples('harmonic', samples, options.validate !== false);
68
- return requireModule().harmonic(samples, sampleRate);
69
- }
70
-
71
- /**
72
- * Extract percussive component from audio.
73
- *
74
- * @param samples - Audio samples (mono, float32)
75
- * @param sampleRate - Sample rate in Hz
76
- * @returns Percussive component
77
- */
78
- export function percussive(
79
- samples: Float32Array,
80
- sampleRate: number,
81
- options: ValidateOptions = {},
82
- ): Float32Array {
83
- assertSamples('percussive', samples, options.validate !== false);
84
- return requireModule().percussive(samples, sampleRate);
85
- }
86
-
87
- /**
88
- * Time-stretch audio without changing pitch.
89
- *
90
- * @param samples - Audio samples (mono, float32)
91
- * @param sampleRate - Sample rate in Hz
92
- * @param rate - Time stretch rate (0.5 = double duration, 2.0 = half duration)
93
- * @returns Time-stretched audio
94
- */
95
- export function timeStretch(
96
- samples: Float32Array,
97
- sampleRate: number,
98
- rate: number,
99
- options: ValidateOptions = {},
100
- ): Float32Array {
101
- assertSamples('timeStretch', samples, options.validate !== false);
102
- return requireModule().timeStretch(samples, sampleRate, rate);
103
- }
104
-
105
- /**
106
- * Pitch-shift audio without changing duration.
107
- *
108
- * @param samples - Audio samples (mono, float32)
109
- * @param sampleRate - Sample rate in Hz
110
- * @param semitones - Pitch shift in semitones (+12 = one octave up, -12 = one octave down)
111
- * @returns Pitch-shifted audio
112
- */
113
- export function pitchShift(
114
- samples: Float32Array,
115
- sampleRate: number,
116
- semitones: number,
117
- options: ValidateOptions = {},
118
- ): Float32Array {
119
- assertSamples('pitchShift', samples, options.validate !== false);
120
- return requireModule().pitchShift(samples, sampleRate, semitones);
121
- }
122
-
123
- /**
124
- * Pitch-correct audio from a current MIDI note to a target MIDI note.
125
- *
126
- * @param samples - Audio samples (mono, float32)
127
- * @param sampleRate - Sample rate in Hz
128
- * @param currentMidi - Detected/current MIDI note number
129
- * @param targetMidi - Desired MIDI note number
130
- * @returns Pitch-corrected audio
131
- */
132
- export function pitchCorrectToMidi(
133
- samples: Float32Array,
134
- sampleRate = 22050,
135
- currentMidi = 69.0,
136
- targetMidi = 69.0,
137
- options: ValidateOptions = {},
138
- ): Float32Array {
139
- assertSamples('pitchCorrectToMidi', samples, options.validate !== false);
140
- return requireModule().pitchCorrectToMidi(samples, sampleRate, currentMidi, targetMidi);
141
- }
142
-
143
- /**
144
- * Contour-following ("time-varying") pitch correction toward a MIDI target.
145
- *
146
- * Unlike {@link pitchCorrectToMidi} (a single constant transpose), this follows
147
- * the caller-supplied per-frame `f0Hz` contour and retunes every voiced frame
148
- * toward `targetMidi`, so vibrato/drift in the source is tracked rather than
149
- * flattened. `voiced` (non-zero = voiced) and `voicedProb` ([0,1]) are optional;
150
- * omitting them treats every frame as voiced.
151
- *
152
- * @param samples - Audio samples (mono, float32)
153
- * @param f0Hz - Per-frame measured F0 in Hz (one entry per analysis frame)
154
- * @param targetMidi - Desired MIDI note number
155
- * @param sampleRate - Sample rate in Hz
156
- * @param hopLength - F0 hop in samples (frame i covers sample i*hopLength)
157
- * @param voiced - Optional per-frame voiced flags (non-zero = voiced)
158
- * @param voicedProb - Optional per-frame voicing probability in [0, 1]
159
- * @returns Pitch-corrected audio
160
- */
161
- export function pitchCorrectToMidiTimevarying(
162
- samples: Float32Array,
163
- f0Hz: Float32Array,
164
- targetMidi: number,
165
- sampleRate = 22050,
166
- hopLength = 512,
167
- voiced?: Int32Array,
168
- voicedProb?: Float32Array,
169
- options: ValidateOptions = {},
170
- ): Float32Array {
171
- assertSamples('pitchCorrectToMidiTimevarying', samples, options.validate !== false);
172
- if (voiced && voiced.length !== f0Hz.length) {
173
- throw new RangeError('pitchCorrectToMidiTimevarying: voiced length must match f0Hz length');
174
- }
175
- if (voicedProb && voicedProb.length !== f0Hz.length) {
176
- throw new RangeError('pitchCorrectToMidiTimevarying: voicedProb length must match f0Hz length');
177
- }
178
- // The embind layer reads the companion arrays as Float32Array (voiced uses
179
- // 0.0/1.0); convert here so a single native conversion path suffices.
180
- const voicedF32 = voiced ? Float32Array.from(voiced) : undefined;
181
- return requireModule().pitchCorrectToMidiTimevarying(
182
- samples,
183
- sampleRate,
184
- f0Hz,
185
- targetMidi,
186
- hopLength,
187
- voicedF32,
188
- voicedProb,
189
- );
190
- }
191
-
192
- /**
193
- * Time-stretch a note region between two sample offsets without changing pitch.
194
- *
195
- * @param samples - Audio samples (mono, float32)
196
- * @param sampleRate - Sample rate in Hz
197
- * @param onsetSample - Note onset position in samples
198
- * @param offsetSample - Note offset position in samples
199
- * @param stretchRatio - Stretch ratio (0.5 = double duration, 2.0 = half duration)
200
- * @returns Audio with the note region stretched
201
- */
202
- export function noteStretch(
203
- samples: Float32Array,
204
- sampleRate = 22050,
205
- options: NoteStretchOptions & ValidateOptions = {},
206
- ): Float32Array {
207
- assertSamples('noteStretch', samples, options.validate !== false);
208
- return requireModule().noteStretch(
209
- samples,
210
- sampleRate,
211
- options.onsetSample ?? 0,
212
- options.offsetSample ?? 0,
213
- options.stretchRatio ?? 1.0,
214
- );
215
- }
216
-
217
- /** Options for {@link voiceChange}. All fields are optional. */
218
- export interface VoiceChangeOptions extends ValidateOptions {
219
- /** Pitch shift in semitones (negative = down). Default 0. */
220
- pitchSemitones?: number;
221
- /** Formant scale factor (>1 brightens, <1 darkens). Default 1. */
222
- formantFactor?: number;
223
- }
224
-
225
- /**
226
- * Apply a voice change by shifting pitch and formants independently.
227
- *
228
- * @param samples - Audio samples (mono, float32)
229
- * @param sampleRate - Sample rate in Hz
230
- * @param options - Pitch/formant settings ({@link VoiceChangeOptions})
231
- * @returns Voice-changed audio
232
- */
233
- export function voiceChange(
234
- samples: Float32Array,
235
- sampleRate = 22050,
236
- options: VoiceChangeOptions = {},
237
- ): Float32Array {
238
- assertSamples('voiceChange', samples, options.validate !== false);
239
- return requireModule().voiceChange(
240
- samples,
241
- sampleRate,
242
- options.pitchSemitones ?? 0.0,
243
- options.formantFactor ?? 1.0,
244
- );
245
- }
246
-
247
- /** Options for the offline {@link voiceChangeRealtime} convenience wrapper. */
248
- export interface VoiceChangeRealtimeOptions extends ValidateOptions {
249
- sampleRate?: number;
250
- /** Voice-changer preset id or full config object. */
251
- preset?: RealtimeVoiceChangerConfigInput;
252
- /** Channel count (1 = mono, 2 = interleaved stereo). */
253
- channels?: 1 | 2;
254
- /** Block size for the internal render loop (default 512). */
255
- blockSize?: number;
256
- }
257
-
258
- function latencyCompensatedVoiceChange(
259
- changer: RealtimeVoiceChanger,
260
- samples: Float32Array,
261
- channels: 1 | 2,
262
- blockFrames: number,
263
- ): Float32Array {
264
- const latencyFrames = Math.max(0, changer.latencySamples());
265
- if (channels === 1) {
266
- const total = samples.length + latencyFrames;
267
- const input = new Float32Array(total);
268
- input.set(samples);
269
- const processed = new Float32Array(total);
270
- for (let offset = 0; offset < total; offset += blockFrames) {
271
- const block = input.subarray(offset, Math.min(offset + blockFrames, total));
272
- processed.set(changer.processMono(block), offset);
273
- }
274
- return processed.slice(latencyFrames, latencyFrames + samples.length);
275
- }
276
-
277
- const frames = samples.length / 2;
278
- const totalFrames = frames + latencyFrames;
279
- const input = new Float32Array(totalFrames * 2);
280
- input.set(samples);
281
- const processed = new Float32Array(totalFrames * 2);
282
- const frameStride = blockFrames * 2;
283
- for (let offset = 0; offset < input.length; offset += frameStride) {
284
- const block = input.subarray(offset, Math.min(offset + frameStride, input.length));
285
- processed.set(changer.processInterleaved(block, 2), offset);
286
- }
287
- const start = latencyFrames * 2;
288
- return processed.slice(start, start + samples.length);
289
- }
290
-
291
- /**
292
- * Applies the realtime voice-changer chain to a whole buffer in one call.
293
- *
294
- * Constructs and prepares a {@link RealtimeVoiceChanger}, runs the block loop
295
- * for the caller, then disposes it — matching the Python `voice_change_realtime`
296
- * and Node `voiceChangeRealtime` convenience wrappers. For mono, `samples` is a
297
- * plain mono buffer; for stereo, `samples` is interleaved (L0,R0,L1,R1,...).
298
- *
299
- * @returns The processed buffer (same layout/length as the input).
300
- */
301
- export function voiceChangeRealtime(
302
- samples: Float32Array,
303
- options: VoiceChangeRealtimeOptions = {},
304
- ): Float32Array {
305
- assertSamples('voiceChangeRealtime', samples, options.validate !== false);
306
- const channels = options.channels ?? 1;
307
- if (channels !== 1 && channels !== 2) {
308
- throw new Error('voiceChangeRealtime: channels must be 1 or 2.');
309
- }
310
- if (channels === 2 && samples.length % 2 !== 0) {
311
- throw new Error('voiceChangeRealtime: stereo input length must be a multiple of 2.');
312
- }
313
- // 48000 matches the Python voice_change_realtime and Node voiceChangeRealtime
314
- // convenience wrappers (and the RealtimeVoiceChanger default).
315
- const sampleRate = options.sampleRate ?? 48000;
316
- const blockSize = Math.max(1, Math.floor(options.blockSize ?? 512));
317
- const changer = new RealtimeVoiceChanger(options.preset ?? 'neutral-monitor');
318
- try {
319
- changer.prepare(sampleRate, blockSize, channels);
320
- return latencyCompensatedVoiceChange(changer, samples, channels, blockSize);
321
- } finally {
322
- changer.delete();
323
- }
324
- }
325
-
326
- /**
327
- * Normalize audio to target peak level.
328
- *
329
- * @param samples - Audio samples (mono, float32)
330
- * @param sampleRate - Sample rate in Hz
331
- * @param targetDb - Target peak level in dB (default: 0 dB = full scale)
332
- * @returns Normalized audio
333
- */
334
- export function normalize(
335
- samples: Float32Array,
336
- sampleRate: number,
337
- targetDb = 0.0,
338
- options: ValidateOptions = {},
339
- ): Float32Array {
340
- assertSamples('normalize', samples, options.validate !== false);
341
- return requireModule().normalize(samples, sampleRate, targetDb);
342
- }
343
-
344
- /**
345
- * Apply region-based spectral edits (gain/attenuate/mute/heal) to mono audio.
346
- *
347
- * Each op is a time x frequency rectangle applied in array order over a single
348
- * STFT buffer, so a later op observes the result of earlier ops. The output has
349
- * the same length and sample rate as the input; an empty `ops` list is an
350
- * identity transform (within the iSTFT's own tolerance).
351
- *
352
- * @param samples - Audio samples (mono, float32)
353
- * @param sampleRate - Sample rate in Hz
354
- * @param ops - Region edit ops applied in order ({@link SpectralRegionOp})
355
- * @param options - STFT + heal configuration ({@link SpectralEditOptions})
356
- * @returns Edited audio
357
- */
358
- export function spectralEdit(
359
- samples: Float32Array,
360
- sampleRate: number,
361
- ops: SpectralRegionOp[] = [],
362
- options: SpectralEditOptions & ValidateOptions = {},
363
- ): Float32Array {
364
- assertSamples('spectralEdit', samples, options.validate !== false);
365
- assertSampleRate('spectralEdit', sampleRate);
366
- return requireModule().spectralEdit(samples, sampleRate, ops, options as Record<string, unknown>);
367
- }
368
-
369
- /**
370
- * Apply mastering loudness normalization with a true-peak ceiling.
371
- *
372
- * @param samples - Audio samples (mono, float32)
373
- * @param sampleRate - Sample rate in Hz (default: 22050)
374
- * @param options - Loudness/ceiling settings ({@link MasteringOptions})
375
- * @returns Processed audio and loudness metadata
376
- */
377
- export function mastering(
378
- samples: Float32Array,
379
- sampleRate = 22050,
380
- options: MasteringOptions = {},
381
- ): MasteringResult {
382
- return requireModule().mastering(
383
- samples,
384
- sampleRate,
385
- options.targetLufs ?? -14.0,
386
- options.ceilingDb ?? -1.0,
387
- options.truePeakOversample ?? 4,
388
- );
389
- }
390
-
391
- export function masteringProcessorNames(): SoloProcessor[] {
392
- return requireModule().masteringProcessorNames() as SoloProcessor[];
393
- }
394
-
395
- /**
396
- * Names of the insert processors the mastering chain can instantiate by name
397
- * (`mastering::api::insert_factory_names`). Mirrors the C-ABI
398
- * `sonare_mastering_insert_names` (which joins this list) as a `string[]`.
399
- */
400
- export function masteringInsertNames(): string[] {
401
- return (
402
- requireModule() as unknown as { masteringInsertNames: () => string[] }
403
- ).masteringInsertNames();
404
- }
405
-
406
- /**
407
- * Returns the camelCase parameter names a given insert / FX processor reads, for
408
- * tooling/validation. Any key NOT in this list is silently ignored by the
409
- * processor (and would be reported via {@link Mixer.sceneWarnings} when a scene
410
- * carrying it is loaded). Band/sub-band processors enumerate their indexed
411
- * `band{i}.<field>` keys. Returns an empty array for an unknown name (or one
412
- * whose insert needs an unavailable build feature, e.g. FX).
413
- *
414
- * @param name - Insert processor name (see {@link masteringInsertNames}).
415
- */
416
- export function masteringInsertParamNames(name: string): string[] {
417
- return (
418
- requireModule() as unknown as { masteringInsertParamNames: (name: string) => string[] }
419
- ).masteringInsertParamNames(name);
420
- }
421
-
422
- /** One realtime-automatable parameter of an insert processor. */
423
- export interface MasteringInsertParamInfo {
424
- /** JSON-key parameter name, as used in scene insert params. */
425
- name: string;
426
- /** Integer param id for realtime automation lanes / MIDI-CC binding. */
427
- id: number;
428
- /** Whether the param can be changed live from the audio thread. */
429
- rtSafe: boolean;
430
- }
431
-
432
- /**
433
- * Returns the realtime-automatable parameter descriptors for an insert / FX
434
- * processor: each entry maps a JSON-key parameter name to the integer id used by
435
- * realtime automation and reports whether it is realtime-safe. Unlike
436
- * {@link masteringInsertParamNames} (every construction key), this lists only the
437
- * realtime-controllable subset — the keys accepted by
438
- * {@link RealtimeEngine.setTrackStripInsertParamByName}. Returns an empty array
439
- * for an unknown name or a processor with no automatable parameters.
440
- *
441
- * @param name - Insert processor name (see {@link masteringInsertNames}).
442
- */
443
- export function masteringInsertParamInfo(name: string): MasteringInsertParamInfo[] {
444
- const json = (
445
- requireModule() as unknown as { masteringInsertParamInfo: (name: string) => string }
446
- ).masteringInsertParamInfo(name);
447
- return JSON.parse(json) as MasteringInsertParamInfo[];
448
- }
449
-
450
- /**
451
- * How a processor handles a buffer with more than two channels (a surround
452
- * bed). "multichannel" processes every plane in one call; "stereoPairOnly"
453
- * operates on the front L/R pair and passes any surround planes through dry.
454
- * "perChannel"/"passthrough" are reserved and unused by the current catalog.
455
- */
456
- export type MasteringChannelPolicy =
457
- | 'multichannel'
458
- | 'stereoPairOnly'
459
- | 'perChannel'
460
- | 'passthrough';
461
-
462
- /** One processor's realtime/offline/pair classification in the catalog. */
463
- export interface MasteringProcessorCatalogEntry {
464
- /** Processor id (the name used for scene inserts / named processors). */
465
- id: string;
466
- /**
467
- * Primary classification, by precedence pair > realtime > offline: "pair" for
468
- * two-input match.* processors, "realtime" for ids that build as a realtime
469
- * scene insert, "offline" for whole-file-only processors.
470
- */
471
- kind: 'realtime' | 'offline' | 'pair';
472
- /** True exactly for ids that always succeed as a realtime scene insert. */
473
- realtimeInsertable: boolean;
474
- /** True for processors with no mono implementation (stereo-only). */
475
- stereoOnly: boolean;
476
- /**
477
- * How the mixer wraps the processor on a >2-channel (surround) bus insert:
478
- * "multichannel" (one full-buffer call) or "stereoPairOnly" (front L/R pair,
479
- * surround planes passed through dry).
480
- */
481
- channelPolicy: MasteringChannelPolicy;
482
- }
483
-
484
- /**
485
- * Returns the machine-readable classification catalog for every named processor
486
- * id, merging the offline registry, the realtime insert factory, and the pair
487
- * registry. Lets a host filter a processor picker by realtime insertability
488
- * instead of offering ids the realtime strip would reject.
489
- */
490
- export function masteringProcessorCatalog(): MasteringProcessorCatalogEntry[] {
491
- const json = (
492
- requireModule() as unknown as { masteringProcessorCatalog: () => string }
493
- ).masteringProcessorCatalog();
494
- return JSON.parse(json) as MasteringProcessorCatalogEntry[];
495
- }
496
-
497
- export function masteringPairProcessorNames(): PairProcessor[] {
498
- return requireModule().masteringPairProcessorNames() as PairProcessor[];
499
- }
500
-
501
- export function masteringPairAnalysisNames(): PairAnalysis[] {
502
- return requireModule().masteringPairAnalysisNames() as PairAnalysis[];
503
- }
504
-
505
- export function masteringStereoAnalysisNames(): StereoAnalysis[] {
506
- return requireModule().masteringStereoAnalysisNames() as StereoAnalysis[];
507
- }
508
-
509
- export function masteringProcess(
510
- processorName: SoloProcessor,
511
- samples: Float32Array,
512
- sampleRate = 22050,
513
- params: MasteringProcessorParams = {},
514
- ): MasteringResult {
515
- return requireModule().masteringProcess(processorName, samples, sampleRate, params);
516
- }
517
-
518
- export function masteringProcessStereo(
519
- processorName: SoloProcessor,
520
- left: Float32Array,
521
- right: Float32Array,
522
- sampleRate = 22050,
523
- params: MasteringProcessorParams = {},
524
- ): MasteringStereoResult {
525
- if (left.length !== right.length) {
526
- throw new Error('Stereo channel lengths must match.');
527
- }
528
- return requireModule().masteringProcessStereo(processorName, left, right, sampleRate, params);
529
- }
530
-
531
- /**
532
- * Apply a two-input `match.*` processor. `source` and `reference` may have
533
- * independent lengths — the match primitives consume each buffer at its own
534
- * length.
535
- */
536
- export function masteringPairProcess(
537
- processorName: PairProcessor,
538
- source: Float32Array,
539
- reference: Float32Array,
540
- sampleRate = 22050,
541
- params: MasteringProcessorParams = {},
542
- ): MasteringResult {
543
- return requireModule().masteringPairProcess(processorName, source, reference, sampleRate, params);
544
- }
545
-
546
- /**
547
- * Analyze a `source` against a `reference` with a two-input analysis. The two
548
- * buffers may have independent lengths.
549
- */
550
- export function masteringPairAnalyze(
551
- analysisName: PairAnalysis,
552
- source: Float32Array,
553
- reference: Float32Array,
554
- sampleRate = 22050,
555
- params: MasteringProcessorParams = {},
556
- ): string {
557
- return requireModule().masteringPairAnalyze(analysisName, source, reference, sampleRate, params);
558
- }
559
-
560
- export function masteringStereoAnalyze(
561
- analysisName: StereoAnalysis,
562
- left: Float32Array,
563
- right: Float32Array,
564
- sampleRate = 22050,
565
- params: MasteringProcessorParams = {},
566
- ): string {
567
- return requireModule().masteringStereoAnalyze(analysisName, left, right, sampleRate, params);
568
- }
569
-
570
- export function masteringAssistantSuggest(
571
- samples: Float32Array,
572
- sampleRate = 22050,
573
- params: MasteringProcessorParams = {},
574
- ): string {
575
- return requireModule().masteringAssistantSuggest(samples, sampleRate, params);
576
- }
577
-
578
- export function masteringAudioProfile(
579
- samples: Float32Array,
580
- sampleRate = 22050,
581
- params: MasteringProcessorParams = {},
582
- ): string {
583
- return requireModule().masteringAudioProfile(samples, sampleRate, params);
584
- }
585
-
586
- export function masteringStreamingPreview(
587
- samples: Float32Array,
588
- sampleRate = 22050,
589
- platforms: StreamingPlatform[] = [],
590
- ): string {
591
- return requireModule().masteringStreamingPreview(samples, sampleRate, platforms);
592
- }
593
-
594
- // ============================================================================
595
- // Mastering repair (declick, denoise_classical, declip, decrackle, dehum,
596
- // dereverb_classical, trim_silence) — hand-written bindings.
597
- // ============================================================================
598
-
599
- /** Options for `masteringRepairDeclick`. */
600
- export interface DeclickOptions {
601
- threshold?: number;
602
- neighborRatio?: number;
603
- maxClickSamples?: number;
604
- lpcOrder?: number;
605
- residualRatio?: number;
606
- }
607
-
608
- /** Algorithms accepted by `masteringRepairDenoiseClassical`. */
609
- export type DenoiseClassicalMode = 'logMmse' | 'mmseStsa' | 'spectralSubtraction';
610
-
611
- /** Noise PSD estimators accepted by `masteringRepairDenoiseClassical`. */
612
- export type DenoiseClassicalNoiseEstimator = 'quantile' | 'mcra' | 'imcra';
613
-
614
- /** Options for `masteringRepairDenoiseClassical`. */
615
- export interface DenoiseClassicalOptions {
616
- mode?: DenoiseClassicalMode;
617
- noiseEstimator?: DenoiseClassicalNoiseEstimator;
618
- nFft?: number;
619
- hopLength?: number;
620
- ddAlpha?: number;
621
- gainFloor?: number;
622
- overSubtraction?: number;
623
- spectralFloor?: number;
624
- noiseEstimationQuantile?: number;
625
- speechPresenceGain?: boolean;
626
- gainSmoothing?: boolean;
627
- }
628
-
629
- /** Offline LPC-based declicker. */
630
- export function masteringRepairDeclick(
631
- samples: Float32Array,
632
- sampleRate: number,
633
- options: DeclickOptions = {},
634
- ): Float32Array {
635
- return requireModule().masteringRepairDeclick(samples, sampleRate, options);
636
- }
637
-
638
- /** Offline STFT-domain classical denoiser (LogMMSE / MMSE-STSA / SpectralSubtraction). */
639
- export function masteringRepairDenoiseClassical(
640
- samples: Float32Array,
641
- sampleRate: number,
642
- options: DenoiseClassicalOptions = {},
643
- ): Float32Array {
644
- return requireModule().masteringRepairDenoiseClassical(samples, sampleRate, options);
645
- }
646
-
647
- /** Options for `masteringRepairDeclip`. */
648
- export interface DeclipOptions {
649
- clipThreshold?: number;
650
- lpcOrder?: number;
651
- iterations?: number;
652
- lpcBlend?: number;
653
- }
654
-
655
- /** Algorithms accepted by `masteringRepairDecrackle`. */
656
- export type DecrackleMode = 'median' | 'waveletShrinkage';
657
-
658
- /** Options for `masteringRepairDecrackle`. */
659
- export interface DecrackleOptions {
660
- threshold?: number;
661
- mode?: DecrackleMode;
662
- levels?: number;
663
- }
664
-
665
- /** Options for `masteringRepairDehum`. */
666
- export interface DehumOptions {
667
- fundamentalHz?: number;
668
- harmonics?: number;
669
- q?: number;
670
- adaptive?: boolean;
671
- searchRangeHz?: number;
672
- adaptation?: number;
673
- frameSize?: number;
674
- pllBandwidth?: number;
675
- }
676
-
677
- /** Options for `masteringRepairDereverbClassical`. */
678
- export interface DereverbClassicalOptions {
679
- threshold?: number;
680
- attenuation?: number;
681
- nFft?: number;
682
- hopLength?: number;
683
- t60Sec?: number;
684
- lateDelayMs?: number;
685
- overSubtraction?: number;
686
- spectralFloor?: number;
687
- wpeEnabled?: boolean;
688
- wpeIterations?: number;
689
- wpeTaps?: number;
690
- wpeStrength?: number;
691
- }
692
-
693
- /** Trimming modes accepted by `masteringRepairTrimSilence`. */
694
- export type TrimSilenceMode = 'peak' | 'lufsGated';
695
-
696
- /** Options for `masteringRepairTrimSilence`. */
697
- export interface TrimSilenceOptions {
698
- threshold?: number;
699
- paddingSamples?: number;
700
- mode?: TrimSilenceMode;
701
- gateLufs?: number;
702
- windowMs?: number;
703
- }
704
-
705
- /** Offline LPC-based declipper. */
706
- export function masteringRepairDeclip(
707
- samples: Float32Array,
708
- sampleRate: number,
709
- options: DeclipOptions = {},
710
- ): Float32Array {
711
- return requireModule().masteringRepairDeclip(samples, sampleRate, options);
712
- }
713
-
714
- /** Offline crackle suppressor (median or wavelet-shrinkage). */
715
- export function masteringRepairDecrackle(
716
- samples: Float32Array,
717
- sampleRate: number,
718
- options: DecrackleOptions = {},
719
- ): Float32Array {
720
- return requireModule().masteringRepairDecrackle(samples, sampleRate, options);
721
- }
722
-
723
- /** Offline mains-hum remover. */
724
- export function masteringRepairDehum(
725
- samples: Float32Array,
726
- sampleRate: number,
727
- options: DehumOptions = {},
728
- ): Float32Array {
729
- return requireModule().masteringRepairDehum(samples, sampleRate, options);
730
- }
731
-
732
- /** Offline classical dereverberator (spectral subtraction + optional WPE). */
733
- export function masteringRepairDereverbClassical(
734
- samples: Float32Array,
735
- sampleRate: number,
736
- options: DereverbClassicalOptions = {},
737
- ): Float32Array {
738
- return requireModule().masteringRepairDereverbClassical(samples, sampleRate, options);
739
- }
740
-
741
- /** Offline silence trimmer (peak threshold or LUFS-gated). */
742
- export function masteringRepairTrimSilence(
743
- samples: Float32Array,
744
- sampleRate: number,
745
- options: TrimSilenceOptions = {},
746
- ): Float32Array {
747
- return requireModule().masteringRepairTrimSilence(samples, sampleRate, options);
748
- }
749
-
750
- // ============================================================================
751
- // Mastering — offline dynamics processors (compressor / gate / transient_shaper)
752
- // ============================================================================
753
-
754
- /** Compressor sidechain detector mode. */
755
- export type CompressorDetector = 'peak' | 'rms' | 'log_rms';
756
-
757
- /** Options for `masteringDynamicsCompressor`. */
758
- export interface CompressorOptions extends ValidateOptions {
759
- thresholdDb?: number;
760
- ratio?: number;
761
- attackMs?: number;
762
- releaseMs?: number;
763
- kneeDb?: number;
764
- makeupGainDb?: number;
765
- autoMakeup?: boolean;
766
- detector?: CompressorDetector | number;
767
- sidechainHpfEnabled?: boolean;
768
- sidechainHpfHz?: number;
769
- pdrTimeMs?: number;
770
- pdrReleaseScale?: number;
771
- }
772
-
773
- /** Options for `masteringDynamicsGate`. */
774
- export interface GateOptions extends ValidateOptions {
775
- thresholdDb?: number;
776
- attackMs?: number;
777
- releaseMs?: number;
778
- rangeDb?: number;
779
- holdMs?: number;
780
- closeThresholdDb?: number;
781
- keyHpfHz?: number;
782
- }
783
-
784
- /** Options for `masteringDynamicsTransientShaper`. */
785
- export interface TransientShaperOptions extends ValidateOptions {
786
- attackGainDb?: number;
787
- sustainGainDb?: number;
788
- fastAttackMs?: number;
789
- fastReleaseMs?: number;
790
- slowAttackMs?: number;
791
- slowReleaseMs?: number;
792
- sensitivity?: number;
793
- maxGainDb?: number;
794
- gainSmoothingMs?: number;
795
- lookaheadMs?: number;
796
- }
797
-
798
- /** Result envelope returned by offline mastering dynamics processors. */
799
- export interface DynamicsResult {
800
- samples: Float32Array;
801
- latencySamples: number;
802
- }
803
-
804
- const COMPRESSOR_DETECTOR_MAP: Record<CompressorDetector, number> = {
805
- peak: 0,
806
- rms: 1,
807
- log_rms: 2,
808
- };
809
-
810
- /** Offline feed-forward compressor (soft knee, optional auto-makeup / sidechain HPF). */
811
- export function masteringDynamicsCompressor(
812
- samples: Float32Array,
813
- sampleRate: number,
814
- options: CompressorOptions = {},
815
- ): DynamicsResult {
816
- assertSamples('masteringDynamicsCompressor', samples, options.validate !== false);
817
- const detector =
818
- typeof options.detector === 'string'
819
- ? COMPRESSOR_DETECTOR_MAP[options.detector]
820
- : options.detector;
821
- const opts: Record<string, unknown> = { ...options };
822
- if (detector !== undefined) {
823
- opts.detector = detector;
824
- }
825
- return requireModule().masteringDynamicsCompressor(samples, sampleRate, opts);
826
- }
827
-
828
- /** Offline noise gate (hysteresis, hold, optional key HPF). */
829
- export function masteringDynamicsGate(
830
- samples: Float32Array,
831
- sampleRate: number,
832
- options: GateOptions = {},
833
- ): DynamicsResult {
834
- assertSamples('masteringDynamicsGate', samples, options.validate !== false);
835
- return requireModule().masteringDynamicsGate(samples, sampleRate, options);
836
- }
837
-
838
- /** Offline transient shaper (envelope-difference attack/sustain control). */
839
- export function masteringDynamicsTransientShaper(
840
- samples: Float32Array,
841
- sampleRate: number,
842
- options: TransientShaperOptions = {},
843
- ): DynamicsResult {
844
- assertSamples('masteringDynamicsTransientShaper', samples, options.validate !== false);
845
- return requireModule().masteringDynamicsTransientShaper(samples, sampleRate, options);
846
- }
847
-
848
- /**
849
- * Apply a configurable mastering chain in WASM.
850
- *
851
- * @param samples - Audio samples (mono, float32)
852
- * @param sampleRate - Sample rate in Hz (default: 22050)
853
- * @param config - Chain stage configuration
854
- * @returns Processed audio, loudness metadata, and applied stage names
855
- */
856
- export function masteringChain(
857
- samples: Float32Array,
858
- sampleRate = 22050,
859
- config: MasteringChainConfig,
860
- ): MasteringChainResult {
861
- return requireModule().masteringChain(samples, sampleRate, config as Record<string, unknown>);
862
- }
863
-
864
- /**
865
- * Apply a configurable stereo mastering chain in WASM.
866
- *
867
- * @param left - Left channel samples
868
- * @param right - Right channel samples
869
- * @param sampleRate - Sample rate in Hz
870
- * @param config - Chain stage configuration
871
- * @returns Processed stereo audio, loudness metadata, and applied stage names
872
- */
873
- export function masteringChainStereo(
874
- left: Float32Array,
875
- right: Float32Array,
876
- sampleRate = 22050,
877
- config: MasteringChainConfig,
878
- ): MasteringStereoChainResult {
879
- if (left.length !== right.length) {
880
- throw new Error('Stereo channel lengths must match.');
881
- }
882
- return requireModule().masteringChainStereo(
883
- left,
884
- right,
885
- sampleRate,
886
- config as Record<string, unknown>,
887
- );
888
- }
889
-
890
- /**
891
- * Apply a configurable mastering chain in WASM with progress reporting.
892
- *
893
- * @param samples - Audio samples (mono, float32)
894
- * @param sampleRate - Sample rate in Hz (default: 22050)
895
- * @param config - Chain stage configuration
896
- * @param onProgress - Progress callback (progress: 0-1, stage: string)
897
- * @returns Processed audio, loudness metadata, and applied stage names
898
- */
899
- export function masteringChainWithProgress(
900
- samples: Float32Array,
901
- sampleRate = 22050,
902
- config: MasteringChainConfig,
903
- onProgress: ProgressCallback,
904
- ): MasteringChainResult {
905
- return requireModule().masteringChainWithProgress(
906
- samples,
907
- sampleRate,
908
- config as Record<string, unknown>,
909
- onProgress,
910
- );
911
- }
912
-
913
- /**
914
- * Apply a configurable stereo mastering chain in WASM with progress reporting.
915
- *
916
- * @param left - Left channel samples
917
- * @param right - Right channel samples
918
- * @param sampleRate - Sample rate in Hz
919
- * @param config - Chain stage configuration
920
- * @param onProgress - Progress callback (progress: 0-1, stage: string)
921
- * @returns Processed stereo audio, loudness metadata, and applied stage names
922
- */
923
- export function masteringChainStereoWithProgress(
924
- left: Float32Array,
925
- right: Float32Array,
926
- sampleRate = 22050,
927
- config: MasteringChainConfig,
928
- onProgress: ProgressCallback,
929
- ): MasteringStereoChainResult {
930
- if (left.length !== right.length) {
931
- throw new Error('Stereo channel lengths must match.');
932
- }
933
- return requireModule().masteringChainStereoWithProgress(
934
- left,
935
- right,
936
- sampleRate,
937
- config as Record<string, unknown>,
938
- onProgress,
939
- );
940
- }
941
-
942
- /**
943
- * List built-in mastering preset identifiers.
944
- *
945
- * @returns Preset names in display order (e.g. "pop", "edm", "aiMusic")
946
- */
947
- export function masteringPresetNames(): MasteringPreset[] {
948
- return requireModule().masteringPresetNames() as MasteringPreset[];
949
- }
950
-
951
- /**
952
- * Apply a named mastering preset chain to mono audio.
953
- *
954
- * @param samples - Audio samples (mono, float32)
955
- * @param sampleRate - Sample rate in Hz (default: 22050)
956
- * @param presetName - Preset identifier from {@link masteringPresetNames}
957
- * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.
958
- * @returns Processed audio, loudness metadata, and applied stage names
959
- */
960
- export function masterAudio(
961
- samples: Float32Array,
962
- sampleRate = 22050,
963
- presetName: MasteringPreset = 'pop',
964
- overrides: Record<string, number | boolean> = {},
965
- ): MasteringChainResult {
966
- return requireModule().masterAudio(presetName, samples, sampleRate, overrides);
967
- }
968
-
969
- /**
970
- * Apply a named mastering preset chain to stereo audio.
971
- *
972
- * @param left - Left channel samples
973
- * @param right - Right channel samples
974
- * @param sampleRate - Sample rate in Hz
975
- * @param presetName - Preset identifier from {@link masteringPresetNames}
976
- * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.
977
- * @returns Processed stereo audio, loudness metadata, and applied stage names
978
- */
979
- export function masterAudioStereo(
980
- left: Float32Array,
981
- right: Float32Array,
982
- sampleRate = 22050,
983
- presetName: MasteringPreset = 'pop',
984
- overrides: Record<string, number | boolean> = {},
985
- ): MasteringStereoChainResult {
986
- if (left.length !== right.length) {
987
- throw new Error('Stereo channel lengths must match.');
988
- }
989
- return requireModule().masterAudioStereo(presetName, left, right, sampleRate, overrides);
990
- }
991
-
992
- /**
993
- * Mono `masterAudio` with per-stage progress reporting. `onProgress` is invoked
994
- * with `(progress, stage)` between each chain stage (progress is in [0,1]).
995
- */
996
- export function masterAudioWithProgress(
997
- samples: Float32Array,
998
- sampleRate = 22050,
999
- presetName: MasteringPreset,
1000
- onProgress: ProgressCallback,
1001
- overrides: Record<string, number | boolean> | null = null,
1002
- ): MasteringChainResult {
1003
- return requireModule().masterAudioWithProgress(
1004
- presetName,
1005
- samples,
1006
- sampleRate,
1007
- overrides,
1008
- onProgress,
1009
- );
1010
- }
1011
-
1012
- /**
1013
- * Stereo `masterAudio` with per-stage progress reporting.
1014
- */
1015
- export function masterAudioStereoWithProgress(
1016
- left: Float32Array,
1017
- right: Float32Array,
1018
- sampleRate = 22050,
1019
- presetName: MasteringPreset,
1020
- onProgress: ProgressCallback,
1021
- overrides: Record<string, number | boolean> | null = null,
1022
- ): MasteringStereoChainResult {
1023
- if (left.length !== right.length) {
1024
- throw new Error('Stereo channel lengths must match.');
1025
- }
1026
- return requireModule().masterAudioStereoWithProgress(
1027
- presetName,
1028
- left,
1029
- right,
1030
- sampleRate,
1031
- overrides,
1032
- onProgress,
1033
- );
1034
- }
1035
-
1036
- export function mixingScenePresetNames(): string[] {
1037
- return requireModule().mixingScenePresetNames();
1038
- }
1039
-
1040
- /**
1041
- * Get a built-in mixing scene preset serialized as JSON. This is the canonical
1042
- * name shared with the Node and Python bindings; the returned JSON loads
1043
- * directly into a {@link Mixer} via {@link Mixer.fromSceneJson}.
1044
- *
1045
- * @param presetName - Preset name (see {@link mixingScenePresetNames})
1046
- * @returns Scene JSON string
1047
- */
1048
- export function mixingScenePresetJson(presetName: string): string {
1049
- return requireModule().mixingScenePresetJson(presetName);
1050
- }
1051
-
1052
- /**
1053
- * One-shot stereo mix of multiple strips through the routing graph + master bus.
1054
- *
1055
- * Each returned per-strip meter reflects only this single one-shot block. The
1056
- * integrating-meter fields (`momentaryLufs`, `shortTermLufs`, `integratedLufs`
1057
- * and the true-peak fields) require sustained streaming to populate; on a short
1058
- * one-shot mix they read the -120 dB floor sentinel. Drive a streaming
1059
- * {@link Mixer} block-by-block if you need meaningful loudness/true-peak
1060
- * readings.
1061
- *
1062
- * @param leftChannels - Per-strip left input buffers (all the same length)
1063
- * @param rightChannels - Per-strip right input buffers (all the same length)
1064
- * @param sampleRate - Sample rate in Hz
1065
- * @param options - Per-strip mix options (trim, fader, pan, width, mute)
1066
- */
1067
- export function mixStereo(
1068
- leftChannels: Float32Array[],
1069
- rightChannels: Float32Array[],
1070
- sampleRate = 48000,
1071
- options: MixOptions = {},
1072
- ): MixResult {
1073
- if (leftChannels.length === 0 || leftChannels.length !== rightChannels.length) {
1074
- throw new Error('leftChannels and rightChannels must have the same non-zero length.');
1075
- }
1076
- return requireModule().mixStereo(
1077
- leftChannels,
1078
- rightChannels,
1079
- sampleRate,
1080
- options as Record<string, unknown>,
1081
- );
1082
- }
1
+ export {
2
+ harmonic,
3
+ hpss,
4
+ normalize,
5
+ noteStretch,
6
+ percussive,
7
+ pitchCorrectTimevarying,
8
+ pitchCorrectToMidi,
9
+ pitchCorrectToMidiTimevarying,
10
+ pitchShift,
11
+ spectralEdit,
12
+ timeStretch,
13
+ } from './effects_transform';
14
+ export type { VoiceChangeOptions, VoiceChangeRealtimeOptions } from './effects_voice_change';
15
+ export { voiceChange, voiceChangeRealtime } from './effects_voice_change';
16
+ export {
17
+ masterAudio,
18
+ masterAudioStereo,
19
+ masterAudioStereoWithProgress,
20
+ masterAudioWithProgress,
21
+ masteringChain,
22
+ masteringChainStereo,
23
+ masteringChainStereoWithProgress,
24
+ masteringChainWithProgress,
25
+ masteringPresetNames,
26
+ } from './mastering_chain';
27
+ export type {
28
+ MasteringChannelPolicy,
29
+ MasteringInsertParamInfo,
30
+ MasteringProcessorCatalogEntry,
31
+ } from './mastering_core';
32
+ export {
33
+ mastering,
34
+ masteringAssistantSuggest,
35
+ masteringAudioProfile,
36
+ masteringInsertNames,
37
+ masteringInsertParamInfo,
38
+ masteringInsertParamNames,
39
+ masteringPairAnalysisNames,
40
+ masteringPairAnalyze,
41
+ masteringPairProcess,
42
+ masteringPairProcessorNames,
43
+ masteringProcess,
44
+ masteringProcessorCatalog,
45
+ masteringProcessorNames,
46
+ masteringProcessStereo,
47
+ masteringStereoAnalysisNames,
48
+ masteringStereoAnalyze,
49
+ masteringStreamingPreview,
50
+ } from './mastering_core';
51
+ export type {
52
+ CompressorDetector,
53
+ CompressorOptions,
54
+ DynamicsResult,
55
+ GateOptions,
56
+ TransientShaperOptions,
57
+ } from './mastering_dynamics';
58
+ export {
59
+ masteringDynamicsCompressor,
60
+ masteringDynamicsGate,
61
+ masteringDynamicsTransientShaper,
62
+ } from './mastering_dynamics';
63
+ export type {
64
+ DeclickOptions,
65
+ DeclipOptions,
66
+ DecrackleMode,
67
+ DecrackleOptions,
68
+ DehumOptions,
69
+ DenoiseClassicalMode,
70
+ DenoiseClassicalNoiseEstimator,
71
+ DenoiseClassicalOptions,
72
+ DereverbClassicalOptions,
73
+ TrimSilenceMode,
74
+ TrimSilenceOptions,
75
+ } from './mastering_repair';
76
+ export {
77
+ masteringRepairDeclick,
78
+ masteringRepairDeclip,
79
+ masteringRepairDecrackle,
80
+ masteringRepairDehum,
81
+ masteringRepairDenoiseClassical,
82
+ masteringRepairDereverbClassical,
83
+ masteringRepairTrimSilence,
84
+ } from './mastering_repair';
85
+ export { mixingScenePresetJson, mixingScenePresetNames, mixStereo } from './mixing_oneshot';