@libraz/libsonare 1.4.1 → 1.5.1

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 (66) hide show
  1. package/README.md +51 -20
  2. package/dist/index.d.ts +5416 -1
  3. package/dist/index.js +938 -583
  4. package/dist/index.js.map +1 -1
  5. package/dist/sonare.js +2 -2
  6. package/dist/sonare.wasm +0 -0
  7. package/dist/worklet.d.ts +1083 -5227
  8. package/dist/worklet.js +2683 -2451
  9. package/dist/worklet.js.map +1 -1
  10. package/package.json +4 -9
  11. package/src/clip_page_streamer.ts +298 -0
  12. package/src/effects_mastering.ts +85 -1089
  13. package/src/effects_transform.ts +286 -0
  14. package/src/effects_voice_change.ts +118 -0
  15. package/src/feature_music.ts +5 -2
  16. package/src/feature_spectrogram.ts +42 -2
  17. package/src/features.ts +1 -0
  18. package/src/index.ts +23 -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/mixer.ts +8 -0
  24. package/src/mixing_oneshot.ts +54 -0
  25. package/src/module_state.ts +1 -2
  26. package/src/project.ts +71 -1712
  27. package/src/project_class.ts +871 -0
  28. package/src/project_internal.ts +333 -0
  29. package/src/project_synth.ts +43 -0
  30. package/src/project_types.ts +570 -0
  31. package/src/public_types.ts +6 -1221
  32. package/src/public_types_acoustic.ts +115 -0
  33. package/src/public_types_mastering.ts +333 -0
  34. package/src/public_types_mixing.ts +97 -0
  35. package/src/public_types_music.ts +352 -0
  36. package/src/public_types_realtime.ts +163 -0
  37. package/src/public_types_spectral.ts +194 -0
  38. package/src/realtime_engine.ts +94 -0
  39. package/src/sonare.js.d.ts +117 -38
  40. package/src/stream_analyzer.ts +3 -0
  41. package/src/stream_types.ts +4 -0
  42. package/src/worklet/engine-automation.ts +73 -0
  43. package/src/worklet/engine-capture-facade.ts +80 -0
  44. package/src/worklet/engine-clips.ts +71 -0
  45. package/src/worklet/engine-markers.ts +93 -0
  46. package/src/worklet/engine-mixer-facade.ts +186 -0
  47. package/src/worklet/engine-node.ts +451 -0
  48. package/src/worklet/engine-offline.ts +162 -0
  49. package/src/worklet/engine-options.ts +13 -0
  50. package/src/worklet/engine-parameter-facade.ts +172 -0
  51. package/src/worklet/engine-processor.ts +764 -0
  52. package/src/worklet/engine-register.ts +136 -0
  53. package/src/worklet/engine-strips.ts +315 -0
  54. package/src/worklet/engine-sync.ts +94 -0
  55. package/src/worklet/engine-tempo-facade.ts +141 -0
  56. package/src/worklet/engine.ts +998 -0
  57. package/src/worklet/guards.ts +14 -1
  58. package/src/worklet/messages.ts +60 -20
  59. package/src/worklet/mixer-processor.ts +368 -0
  60. package/src/worklet/protocol.ts +3 -0
  61. package/src/worklet/voice-changer-processor.ts +246 -0
  62. package/src/worklet.ts +20 -3549
  63. package/dist/sonare-rt-module.js +0 -2
  64. package/dist/sonare-rt.js +0 -2
  65. package/dist/sonare-rt.wasm +0 -0
  66. package/src/sonare-rt.d.ts +0 -93
@@ -0,0 +1,115 @@
1
+ import type { ValidateOptions } from './validation';
2
+
3
+ /** Options for `detectAcoustic`. All fields are optional. */
4
+ export interface AcousticOptions extends ValidateOptions {
5
+ /** Number of octave bands. Default 6. */
6
+ nOctaveBands?: number;
7
+ /** Number of 1/3-octave sub-bands. Default 24. */
8
+ nThirdOctaveSubbands?: number;
9
+ /** Minimum decay range (dB) for a valid RT60 fit. Default 30. */
10
+ minDecayDb?: number;
11
+ /** Margin (dB) above the noise floor for the decay fit. Default 10. */
12
+ noiseFloorMarginDb?: number;
13
+ }
14
+
15
+ /**
16
+ * Room acoustic parameters from an impulse response
17
+ */
18
+ export interface AcousticResult {
19
+ rt60: number;
20
+ edt: number;
21
+ c50: number;
22
+ c80: number;
23
+ d50: number;
24
+ rt60Bands: Float32Array;
25
+ edtBands: Float32Array;
26
+ c50Bands: Float32Array;
27
+ c80Bands: Float32Array;
28
+ confidence: number;
29
+ isBlind: boolean;
30
+ }
31
+
32
+ /** Shoebox geometry + placement shared by RIR synthesis and the room morph. */
33
+ export interface RoomGeometryOptions {
34
+ lengthM?: number;
35
+ widthM?: number;
36
+ heightM?: number;
37
+ /** Uniform wall absorption, clamped to [0, 0.999] (the back-compat scalar). */
38
+ absorption?: number;
39
+ /**
40
+ * Optional per-octave-band wall absorption (125/250/500/1k/2k/4k.. Hz). When
41
+ * provided it overrides `absorption` unless `materialPreset` is set.
42
+ */
43
+ bandAbsorption?: Float32Array | number[];
44
+ /** Optional per-band wall scattering; missing bands default to 0. */
45
+ bandScattering?: Float32Array | number[];
46
+ /**
47
+ * Named wall-material preset (0 none; 1 concrete, 2 wood, 3 curtain,
48
+ * 4 carpet, 5 glass). A non-zero preset wins over `bandAbsorption`/`absorption`.
49
+ */
50
+ materialPreset?: number;
51
+ sourceX?: number;
52
+ sourceY?: number;
53
+ sourceZ?: number;
54
+ listenerX?: number;
55
+ listenerY?: number;
56
+ listenerZ?: number;
57
+ ismOrder?: number;
58
+ seed?: number;
59
+ maxSeconds?: number;
60
+ }
61
+
62
+ export interface RirSynthOptions extends RoomGeometryOptions {
63
+ sampleRate?: number;
64
+ /** Use the Eyring statistical late-tail model (default true); false = Sabine. */
65
+ preferEyring?: boolean;
66
+ /** Early/late crossover in ms (0 = auto, ~sqrt(V) ms). */
67
+ mixingTimeMs?: number;
68
+ /** Equal-power crossfade width around the mixing time in ms (0 = default). */
69
+ crossfadeMs?: number;
70
+ }
71
+
72
+ export interface RirResult {
73
+ rir: Float32Array;
74
+ sampleRate: number;
75
+ hasError: boolean;
76
+ }
77
+
78
+ export interface RoomEstimateOptions {
79
+ aspectHintLw?: number;
80
+ aspectHintLh?: number;
81
+ referenceAbsorption?: number;
82
+ preferEyring?: boolean;
83
+ nOctaveBands?: number;
84
+ /** Analyzer routing: 0 = auto, 1 = blind, 2 = impulse-response. */
85
+ mode?: number;
86
+ /** Analyzer decay-fit span in dB (0 = library default). */
87
+ minDecayDb?: number;
88
+ /** Analyzer noise-floor margin in dB (0 = library default). */
89
+ noiseFloorMarginDb?: number;
90
+ }
91
+
92
+ export interface RoomEstimateResult {
93
+ volume: number;
94
+ length: number;
95
+ width: number;
96
+ height: number;
97
+ drrDb: number;
98
+ confidence: number;
99
+ absorptionBands: Float32Array;
100
+ rt60Bands: Float32Array;
101
+ }
102
+
103
+ export interface RoomMorphOptions extends RoomGeometryOptions {
104
+ wet?: number;
105
+ sourceTailSuppression?: number;
106
+ /**
107
+ * Use the Eyring statistical late-tail model for the target room (default
108
+ * true); false = Sabine. Matches {@link RirSynthOptions.preferEyring}.
109
+ */
110
+ preferEyring?: boolean;
111
+ /** Early/late crossover in ms (0 = auto, ~sqrt(V) ms). */
112
+ mixingTimeMs?: number;
113
+ /** Equal-power crossfade width around the mixing time in ms (0 = default). */
114
+ crossfadeMs?: number;
115
+ }
@@ -0,0 +1,333 @@
1
+ export type MasteringPreset =
2
+ | 'pop'
3
+ | 'edm'
4
+ | 'acoustic'
5
+ | 'hipHop'
6
+ | 'aiMusic'
7
+ | 'speech'
8
+ | 'streaming'
9
+ | 'youtube'
10
+ | 'broadcast'
11
+ | 'podcast'
12
+ | 'audiobook'
13
+ | 'cinema'
14
+ | 'jpop'
15
+ | 'ambient'
16
+ | 'lofi'
17
+ | 'classical'
18
+ | 'drumAndBass'
19
+ | 'techno'
20
+ | 'metal'
21
+ | 'trap'
22
+ | 'rnb'
23
+ | 'jazz'
24
+ | 'kpop'
25
+ | 'trance'
26
+ | 'gameOst';
27
+
28
+ export interface StreamingPlatform {
29
+ name: string;
30
+ targetLufs: number;
31
+ ceilingDb: number;
32
+ }
33
+
34
+ export type SoloProcessor =
35
+ | 'dynamics.brickwallLimiter'
36
+ | 'dynamics.compressor'
37
+ | 'dynamics.deesser'
38
+ | 'dynamics.expander'
39
+ | 'dynamics.gate'
40
+ | 'dynamics.limiter'
41
+ | 'dynamics.parallelComp'
42
+ | 'dynamics.sidechainRouter'
43
+ | 'dynamics.duckingProcessor'
44
+ | 'dynamics.transientShaper'
45
+ | 'dynamics.upwardCompressor'
46
+ | 'dynamics.upwardExpander'
47
+ | 'dynamics.vocalRider'
48
+ | 'eq.apiStyle'
49
+ | 'eq.bandPass'
50
+ | 'eq.cutFilter'
51
+ | 'eq.dynamic'
52
+ | 'eq.equalizer'
53
+ | 'eq.graphic'
54
+ | 'eq.linearPhase'
55
+ | 'eq.midSide'
56
+ | 'eq.minimumPhase'
57
+ | 'eq.parametric'
58
+ | 'eq.pultec'
59
+ | 'eq.shelving'
60
+ | 'eq.tilt'
61
+ | 'final.bitDepth'
62
+ | 'final.dither'
63
+ | 'final.outputChain'
64
+ | 'maximizer.adaptiveRelease'
65
+ | 'maximizer.loudnessOptimize'
66
+ | 'maximizer.maximizer'
67
+ | 'maximizer.softKneeMax'
68
+ | 'maximizer.truePeakLimiter'
69
+ | 'multiband.compressor'
70
+ | 'multiband.dynamicEq'
71
+ | 'multiband.expander'
72
+ | 'multiband.imager'
73
+ | 'multiband.limiter'
74
+ | 'multiband.saturation'
75
+ | 'repair.declick'
76
+ | 'repair.declip'
77
+ | 'repair.decrackle'
78
+ | 'repair.dehum'
79
+ | 'repair.denoiseClassical'
80
+ | 'repair.dereverbClassical'
81
+ | 'repair.trimSilence'
82
+ | 'saturation.bitcrusher'
83
+ | 'saturation.exciter'
84
+ | 'saturation.hardClipper'
85
+ | 'saturation.multibandExciter'
86
+ | 'saturation.ampSim'
87
+ | 'saturation.softClipper'
88
+ | 'saturation.tape'
89
+ | 'saturation.transformer'
90
+ | 'saturation.tube'
91
+ | 'saturation.waveshaper'
92
+ | 'spectral.airBand'
93
+ | 'spectral.lowEndFocus'
94
+ | 'spectral.presenceEnhancer'
95
+ | 'spectral.spectralShaper'
96
+ | 'stereo.autoPan'
97
+ | 'stereo.haasEnhancer'
98
+ | 'stereo.imager'
99
+ | 'stereo.monoMaker'
100
+ | 'stereo.phaseAlign'
101
+ | 'stereo.stereoBalance';
102
+
103
+ export type PairProcessor =
104
+ | 'match.applyMatchEq'
105
+ | 'match.alignReferenceToSource'
106
+ | 'match.abSwitch'
107
+ | 'match.abCrossfade';
108
+
109
+ export type PairAnalysis =
110
+ | 'match.referenceLoudness'
111
+ | 'match.tonalBalance'
112
+ | 'match.tonalBalanceLogBands'
113
+ | 'match.matchEqCurve'
114
+ | 'match.estimateReferenceDelaySamples';
115
+
116
+ export type StereoAnalysis = 'stereo.monoCompatCheck' | 'stereo.monoCompatCheckLogBands';
117
+
118
+ /** Options for `mastering`. All fields are optional. */
119
+ export interface MasteringOptions {
120
+ /** Target integrated LUFS. Default -14. */
121
+ targetLufs?: number;
122
+ /** True/sample peak ceiling in dBFS. Default -1. */
123
+ ceilingDb?: number;
124
+ /** Oversampling factor used for peak estimation. Default 4. */
125
+ truePeakOversample?: number;
126
+ /** Post true-peak limiter release in ms. Default 0 => library default (50 ms). */
127
+ releaseMs?: number;
128
+ /** Apply the static loudness gain at the input (pre-oversample) rate. Default false. */
129
+ applyGainAtInputRate?: boolean;
130
+ }
131
+
132
+ /**
133
+ * Mastering loudness/true-peak processing result
134
+ */
135
+ export interface MasteringResult {
136
+ samples: Float32Array;
137
+ sampleRate: number;
138
+ inputLufs: number;
139
+ outputLufs: number;
140
+ appliedGainDb: number;
141
+ latencySamples?: number;
142
+ }
143
+
144
+ export type MasteringProcessorParams = Record<string, number | boolean>;
145
+
146
+ export interface MasteringChainConfig {
147
+ repair?: {
148
+ denoise?: boolean;
149
+ nFft?: number;
150
+ hopLength?: number;
151
+ ddAlpha?: number;
152
+ gainFloor?: number;
153
+ declick?: {
154
+ threshold?: number;
155
+ neighborRatio?: number;
156
+ maxClickSamples?: number;
157
+ lpcOrder?: number;
158
+ residualRatio?: number;
159
+ };
160
+ dereverb?: {
161
+ threshold?: number;
162
+ attenuation?: number;
163
+ nFft?: number;
164
+ hopLength?: number;
165
+ t60Sec?: number;
166
+ lateDelayMs?: number;
167
+ overSubtraction?: number;
168
+ spectralFloor?: number;
169
+ wpeEnabled?: boolean;
170
+ wpeIterations?: number;
171
+ wpeTaps?: number;
172
+ wpeStrength?: number;
173
+ };
174
+ };
175
+ eq?: {
176
+ tiltDb?: number;
177
+ pivotHz?: number;
178
+ };
179
+ dynamics?: {
180
+ compressor?: {
181
+ thresholdDb?: number;
182
+ ratio?: number;
183
+ attackMs?: number;
184
+ releaseMs?: number;
185
+ kneeDb?: number;
186
+ makeupGainDb?: number;
187
+ autoMakeup?: boolean;
188
+ };
189
+ deesser?: {
190
+ frequencyHz?: number;
191
+ thresholdDb?: number;
192
+ ratio?: number;
193
+ attackMs?: number;
194
+ releaseMs?: number;
195
+ rangeDb?: number;
196
+ bandpassQ?: number;
197
+ };
198
+ transientShaper?: {
199
+ attackGainDb?: number;
200
+ sustainGainDb?: number;
201
+ fastAttackMs?: number;
202
+ fastReleaseMs?: number;
203
+ slowAttackMs?: number;
204
+ slowReleaseMs?: number;
205
+ sensitivity?: number;
206
+ maxGainDb?: number;
207
+ gainSmoothingMs?: number;
208
+ lookaheadMs?: number;
209
+ };
210
+ multibandComp?: {
211
+ lowCutoffHz?: number;
212
+ highCutoffHz?: number;
213
+ lowThresholdDb?: number;
214
+ lowRatio?: number;
215
+ lowAttackMs?: number;
216
+ lowReleaseMs?: number;
217
+ midThresholdDb?: number;
218
+ midRatio?: number;
219
+ midAttackMs?: number;
220
+ midReleaseMs?: number;
221
+ highThresholdDb?: number;
222
+ highRatio?: number;
223
+ highAttackMs?: number;
224
+ highReleaseMs?: number;
225
+ };
226
+ };
227
+ saturation?: {
228
+ tape?: {
229
+ driveDb?: number;
230
+ saturation?: number;
231
+ hysteresis?: number;
232
+ outputGainDb?: number;
233
+ speedIps?: number;
234
+ headBumpDb?: number;
235
+ bias?: number;
236
+ gapLoss?: number;
237
+ };
238
+ exciter?: {
239
+ frequencyHz?: number;
240
+ driveDb?: number;
241
+ amount?: number;
242
+ q?: number;
243
+ evenOddMix?: number;
244
+ };
245
+ };
246
+ spectral?: {
247
+ airBand?: {
248
+ amount?: number;
249
+ shelfFrequencyHz?: number;
250
+ dynamicThresholdDb?: number;
251
+ dynamicRangeDb?: number;
252
+ };
253
+ };
254
+ stereo?: {
255
+ imager?: {
256
+ width?: number;
257
+ outputGainDb?: number;
258
+ decorrelationAmount?: number;
259
+ preserveEnergy?: boolean;
260
+ };
261
+ monoMaker?: {
262
+ amount?: number;
263
+ };
264
+ };
265
+ maximizer?: {
266
+ truePeakLimiter?: {
267
+ ceilingDb?: number;
268
+ lookaheadMs?: number;
269
+ releaseMs?: number;
270
+ oversampleFactor?: number;
271
+ applyGainAtInputRate?: boolean;
272
+ };
273
+ };
274
+ loudness?: {
275
+ targetLufs?: number;
276
+ ceilingDb?: number;
277
+ truePeakOversample?: number;
278
+ };
279
+ }
280
+
281
+ /**
282
+ * Configuration for the block-by-block {@link StreamingMasteringChain}.
283
+ *
284
+ * Extends {@link MasteringChainConfig} with optional precomputed loudness
285
+ * parameters. The streaming chain cannot measure whole-signal integrated LUFS,
286
+ * so an enabled `loudness` stage normally throws at construction. To let a
287
+ * preset's streaming preview match its offline render, the caller may
288
+ * precompute the loudness normalization gain offline (e.g.
289
+ * `targetLufs - measuredIntegratedLufs`) and supply it here.
290
+ */
291
+ export interface StreamingMasteringChainConfig extends MasteringChainConfig {
292
+ /**
293
+ * Precomputed static loudness gain in dB. When omitted (the default), an
294
+ * enabled `loudness` stage still throws. When provided and `loudness.enabled`
295
+ * is set, the chain applies this fixed gain per block before the loudness
296
+ * stage's true-peak limiter instead of throwing.
297
+ */
298
+ loudnessStaticGainDb?: number;
299
+
300
+ /**
301
+ * Offline-measured true-peak (dBFS) of the source the static gain was
302
+ * computed for. When provided, the static gain is clamped to
303
+ * `loudness.ceilingDb - loudnessStaticGainPeakDb` so the streaming preview
304
+ * does not drive the loudness limiter harder than the offline chain. When
305
+ * omitted (the default) the static gain is applied verbatim.
306
+ */
307
+ loudnessStaticGainPeakDb?: number;
308
+ }
309
+
310
+ export interface MasteringChainResult extends MasteringResult {
311
+ stages: string[];
312
+ }
313
+
314
+ export interface MasteringStereoChainResult {
315
+ left: Float32Array;
316
+ right: Float32Array;
317
+ sampleRate: number;
318
+ inputLufs: number;
319
+ outputLufs: number;
320
+ appliedGainDb: number;
321
+ stages: string[];
322
+ latencySamples?: number;
323
+ }
324
+
325
+ export interface MasteringStereoResult {
326
+ left: Float32Array;
327
+ right: Float32Array;
328
+ sampleRate: number;
329
+ inputLufs: number;
330
+ outputLufs: number;
331
+ appliedGainDb: number;
332
+ latencySamples: number;
333
+ }
@@ -0,0 +1,97 @@
1
+ export type PanMode = 'balance' | 'stereoPan' | 'stereo-pan' | 'dualPan' | 'dual-pan' | number;
2
+
3
+ /**
4
+ * Surround pan position for a strip feeding a >2-channel bus. Phase 1 honors
5
+ * `azimuth`/`divergence`/`lfe`; `elevation`/`distance` are reserved. All fields
6
+ * are optional and default to a centered point source.
7
+ */
8
+ export interface SurroundPan {
9
+ /** -180..180 deg, 0 = front-center, positive = right. */
10
+ azimuth?: number;
11
+ /** Reserved (no height beds in phase 1). */
12
+ elevation?: number;
13
+ /** 0 = point source, 1 = spread across the front. */
14
+ divergence?: number;
15
+ /** 0..1 scalar send into the LFE plane. */
16
+ lfe?: number;
17
+ /** Reserved (focus/spread), defaults to 1. */
18
+ distance?: number;
19
+ }
20
+
21
+ export interface MixOptions {
22
+ inputTrimDb?: number | number[];
23
+ faderDb?: number | number[];
24
+ pan?: number | number[];
25
+ panMode?: PanMode | PanMode[];
26
+ width?: number | number[];
27
+ muted?: boolean | boolean[];
28
+ }
29
+
30
+ export interface MixMeterSnapshot {
31
+ peakDbL: number;
32
+ peakDbR: number;
33
+ rmsDbL: number;
34
+ rmsDbR: number;
35
+ correlation: number;
36
+ monoCompatWidth: number;
37
+ monoCompatPeak: number;
38
+ monoCompatSideRms: number;
39
+ likelyMonoCompatible: boolean;
40
+ momentaryLufs: number;
41
+ shortTermLufs: number;
42
+ integratedLufs: number;
43
+ gainReductionDb: number;
44
+ truePeakDbL: number;
45
+ truePeakDbR: number;
46
+ maxTruePeakDb: number;
47
+ seq: number;
48
+ /** Number of valid surround planes (5.1/7.1); 0 before the meter sees audio. */
49
+ channelCount: number;
50
+ /** Per-plane peak dB, length channelCount; [0]/[1] mirror peakDbL/peakDbR. */
51
+ peakDb: number[];
52
+ /** Per-plane RMS dB, length channelCount; [0]/[1] mirror rmsDbL/rmsDbR. */
53
+ rmsDb: number[];
54
+ /** Per-plane true-peak dB, length channelCount; [0]/[1] mirror truePeakDbL/R. */
55
+ truePeakDb: number[];
56
+ }
57
+
58
+ export interface MixResult {
59
+ left: Float32Array;
60
+ right: Float32Array;
61
+ sampleRate: number;
62
+ meters: MixMeterSnapshot[];
63
+ }
64
+
65
+ /** Mixed stereo master returned by {@link Mixer.processStereo}. */
66
+ export interface MixerProcessResult {
67
+ left: Float32Array;
68
+ right: Float32Array;
69
+ sampleRate: number;
70
+ }
71
+
72
+ /**
73
+ * Interpolation curve for scheduled automation events
74
+ * (see {@link Mixer.scheduleInsertAutomation}).
75
+ */
76
+ export type AutomationCurve = 'linear' | 'exponential' | 'hold' | 's-curve';
77
+
78
+ /**
79
+ * Pan law applied when computing left/right gains from a pan position
80
+ * (see {@link Mixer.setPanLaw}). Maps to the underlying integer code.
81
+ */
82
+ export type PanLaw = 'const3dB' | 'const4.5dB' | 'const6dB' | 'linear0dB';
83
+
84
+ /**
85
+ * Meter tap point for reading a strip's meter snapshot
86
+ * (see {@link Mixer.meterTap} and {@link Mixer.stripMeter}).
87
+ */
88
+ export type MeterTap = 'preFader' | 'postFader';
89
+
90
+ /** Pre/post-fader send timing (see {@link Mixer.addSend}). */
91
+ export type SendTiming = 'preFader' | 'postFader';
92
+
93
+ /** A single goniometer (left/right) sample returned by {@link Mixer.readGoniometerLatest}. */
94
+ export interface GoniometerPoint {
95
+ left: number;
96
+ right: number;
97
+ }