@libraz/libsonare 1.0.4 → 1.2.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.
@@ -0,0 +1,852 @@
1
+ /**
2
+ * Pitch class enum (C=0, C#=1, ..., B=11)
3
+ */
4
+ export const PitchClass = {
5
+ C: 0,
6
+ Cs: 1,
7
+ D: 2,
8
+ Ds: 3,
9
+ E: 4,
10
+ F: 5,
11
+ Fs: 6,
12
+ G: 7,
13
+ Gs: 8,
14
+ A: 9,
15
+ As: 10,
16
+ B: 11,
17
+ } as const;
18
+
19
+ export type PitchClass = (typeof PitchClass)[keyof typeof PitchClass];
20
+
21
+ /**
22
+ * Musical mode
23
+ */
24
+ export const Mode = {
25
+ Major: 0,
26
+ Minor: 1,
27
+ Dorian: 2,
28
+ Phrygian: 3,
29
+ Lydian: 4,
30
+ Mixolydian: 5,
31
+ Locrian: 6,
32
+ } as const;
33
+
34
+ export type Mode = (typeof Mode)[keyof typeof Mode];
35
+
36
+ export type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
37
+
38
+ export const KeyProfile = {
39
+ KrumhanslSchmuckler: 0,
40
+ Temperley: 1,
41
+ Shaath: 2,
42
+ FaraldoEDMT: 3,
43
+ FaraldoEDMA: 4,
44
+ FaraldoEDMM: 5,
45
+ BellmanBudge: 6,
46
+ } as const;
47
+
48
+ export type KeyProfile = (typeof KeyProfile)[keyof typeof KeyProfile];
49
+
50
+ export type KeyProfileName =
51
+ | 'ks'
52
+ | 'krumhansl'
53
+ | 'temperley'
54
+ | 'shaath'
55
+ | 'keyfinder'
56
+ | 'faraldo-edmt'
57
+ | 'edmt'
58
+ | 'faraldo-edma'
59
+ | 'edma'
60
+ | 'faraldo-edmm'
61
+ | 'edmm'
62
+ | 'bellman-budge'
63
+ | 'bellman';
64
+
65
+ /**
66
+ * Chord quality
67
+ */
68
+ export const ChordQuality = {
69
+ Major: 0,
70
+ Minor: 1,
71
+ Diminished: 2,
72
+ Augmented: 3,
73
+ Dominant7: 4,
74
+ Major7: 5,
75
+ Minor7: 6,
76
+ Sus2: 7,
77
+ Sus4: 8,
78
+ Unknown: 9,
79
+ Add9: 10,
80
+ MinorAdd9: 11,
81
+ Dim7: 12,
82
+ HalfDim7: 13,
83
+ Major9: 14,
84
+ Dominant9: 15,
85
+ Sus2Add4: 16,
86
+ } as const;
87
+
88
+ export type ChordQuality = (typeof ChordQuality)[keyof typeof ChordQuality];
89
+
90
+ export type MasteringPreset =
91
+ | 'pop'
92
+ | 'edm'
93
+ | 'acoustic'
94
+ | 'hipHop'
95
+ | 'aiMusic'
96
+ | 'speech'
97
+ | 'streaming'
98
+ | 'youtube'
99
+ | 'broadcast'
100
+ | 'podcast'
101
+ | 'audiobook'
102
+ | 'cinema'
103
+ | 'jpop'
104
+ | 'ambient'
105
+ | 'lofi'
106
+ | 'classical'
107
+ | 'drumAndBass'
108
+ | 'techno'
109
+ | 'metal'
110
+ | 'trap'
111
+ | 'rnb'
112
+ | 'jazz'
113
+ | 'kpop'
114
+ | 'trance'
115
+ | 'gameOst';
116
+
117
+ export interface StreamingPlatform {
118
+ name: string;
119
+ targetLufs: number;
120
+ ceilingDb: number;
121
+ }
122
+
123
+ export type SoloProcessor =
124
+ | 'dynamics.brickwallLimiter'
125
+ | 'dynamics.compressor'
126
+ | 'dynamics.deesser'
127
+ | 'dynamics.expander'
128
+ | 'dynamics.gate'
129
+ | 'dynamics.limiter'
130
+ | 'dynamics.parallelComp'
131
+ | 'dynamics.sidechainRouter'
132
+ | 'dynamics.duckingProcessor'
133
+ | 'dynamics.transientShaper'
134
+ | 'dynamics.upwardCompressor'
135
+ | 'dynamics.upwardExpander'
136
+ | 'dynamics.vocalRider'
137
+ | 'eq.apiStyle'
138
+ | 'eq.bandPass'
139
+ | 'eq.cutFilter'
140
+ | 'eq.dynamic'
141
+ | 'eq.equalizer'
142
+ | 'eq.graphic'
143
+ | 'eq.linearPhase'
144
+ | 'eq.midSide'
145
+ | 'eq.minimumPhase'
146
+ | 'eq.parametric'
147
+ | 'eq.pultec'
148
+ | 'eq.shelving'
149
+ | 'eq.tilt'
150
+ | 'final.bitDepth'
151
+ | 'final.dither'
152
+ | 'final.outputChain'
153
+ | 'maximizer.adaptiveRelease'
154
+ | 'maximizer.loudnessOptimize'
155
+ | 'maximizer.maximizer'
156
+ | 'maximizer.softKneeMax'
157
+ | 'maximizer.truePeakLimiter'
158
+ | 'multiband.compressor'
159
+ | 'multiband.dynamicEq'
160
+ | 'multiband.expander'
161
+ | 'multiband.imager'
162
+ | 'multiband.limiter'
163
+ | 'multiband.saturation'
164
+ | 'repair.declick'
165
+ | 'repair.declip'
166
+ | 'repair.decrackle'
167
+ | 'repair.dehum'
168
+ | 'repair.denoiseClassical'
169
+ | 'repair.dereverbClassical'
170
+ | 'repair.trimSilence'
171
+ | 'saturation.bitcrusher'
172
+ | 'saturation.exciter'
173
+ | 'saturation.hardClipper'
174
+ | 'saturation.multibandExciter'
175
+ | 'saturation.softClipper'
176
+ | 'saturation.tape'
177
+ | 'saturation.transformer'
178
+ | 'saturation.tube'
179
+ | 'saturation.waveshaper'
180
+ | 'spectral.airBand'
181
+ | 'spectral.lowEndFocus'
182
+ | 'spectral.presenceEnhancer'
183
+ | 'spectral.spectralShaper'
184
+ | 'stereo.autoPan'
185
+ | 'stereo.haasEnhancer'
186
+ | 'stereo.imager'
187
+ | 'stereo.monoMaker'
188
+ | 'stereo.phaseAlign'
189
+ | 'stereo.stereoBalance';
190
+
191
+ export type PairProcessor =
192
+ | 'match.applyMatchEq'
193
+ | 'match.alignReferenceToSource'
194
+ | 'match.abSwitch'
195
+ | 'match.abCrossfade';
196
+
197
+ export type PairAnalysis =
198
+ | 'match.referenceLoudness'
199
+ | 'match.tonalBalance'
200
+ | 'match.tonalBalanceLogBands'
201
+ | 'match.matchEqCurve'
202
+ | 'match.estimateReferenceDelaySamples';
203
+
204
+ export type StereoAnalysis = 'stereo.monoCompatCheck' | 'stereo.monoCompatCheckLogBands';
205
+
206
+ /**
207
+ * Section type
208
+ */
209
+ export const SectionType = {
210
+ Intro: 0,
211
+ Verse: 1,
212
+ PreChorus: 2,
213
+ Chorus: 3,
214
+ Bridge: 4,
215
+ Instrumental: 5,
216
+ Outro: 6,
217
+ Unknown: 7,
218
+ } as const;
219
+
220
+ export type SectionType = (typeof SectionType)[keyof typeof SectionType];
221
+
222
+ /**
223
+ * Detected musical key
224
+ */
225
+ export interface Key {
226
+ root: PitchClass;
227
+ mode: Mode;
228
+ confidence: number;
229
+ name: string;
230
+ shortName: string;
231
+ }
232
+
233
+ export interface KeyDetectionOptions {
234
+ nFft?: number;
235
+ hopLength?: number;
236
+ useHpss?: boolean;
237
+ loudnessWeighted?: boolean;
238
+ highPassHz?: number;
239
+ modes?:
240
+ | Mode[]
241
+ | ('major' | 'minor' | 'dorian' | 'phrygian' | 'lydian' | 'mixolydian' | 'locrian')[]
242
+ | 'major-minor'
243
+ | 'all'
244
+ | 'modal';
245
+ profile?: KeyProfile | KeyProfileName;
246
+ genreHint?: 'auto' | 'edm' | 'electronic' | 'dance' | 'pop' | 'classical' | 'jazz' | string;
247
+ }
248
+
249
+ export interface KeyCandidate {
250
+ key: Key;
251
+ correlation: number;
252
+ }
253
+
254
+ export interface ChordDetectionOptions {
255
+ minDuration?: number;
256
+ smoothingWindow?: number;
257
+ threshold?: number;
258
+ useTriadsOnly?: boolean;
259
+ nFft?: number;
260
+ hopLength?: number;
261
+ useBeatSync?: boolean;
262
+ useHmm?: boolean;
263
+ hmmBeamWidth?: number;
264
+ useKeyContext?: boolean;
265
+ keyRoot?: PitchClass;
266
+ keyMode?: Mode;
267
+ detectInversions?: boolean;
268
+ chromaMethod?: 'stft' | 'nnls';
269
+ }
270
+
271
+ /**
272
+ * Detected beat
273
+ */
274
+ export interface Beat {
275
+ time: number;
276
+ strength: number;
277
+ }
278
+
279
+ /**
280
+ * Detected chord
281
+ */
282
+ export interface Chord {
283
+ root: PitchClass;
284
+ bass: PitchClass;
285
+ quality: ChordQuality;
286
+ start: number;
287
+ end: number;
288
+ confidence: number;
289
+ name: string;
290
+ }
291
+
292
+ export interface ChordAnalysisResult {
293
+ chords: Chord[];
294
+ }
295
+
296
+ /**
297
+ * Detected section
298
+ */
299
+ export interface Section {
300
+ type: SectionType;
301
+ start: number;
302
+ end: number;
303
+ energyLevel: number;
304
+ confidence: number;
305
+ name: string;
306
+ }
307
+
308
+ /**
309
+ * A single melody contour point (mirrors the C `SonareMelodyPoint`).
310
+ */
311
+ export interface MelodyPoint {
312
+ /** Frame time in seconds. */
313
+ time: number;
314
+ /** Estimated fundamental frequency in Hz (0 when unvoiced). */
315
+ frequency: number;
316
+ /** Voicing confidence in `[0, 1]`. */
317
+ confidence: number;
318
+ }
319
+
320
+ /**
321
+ * Melody analysis result (mirrors the C `SonareMelodyResult`).
322
+ */
323
+ export interface MelodyResult {
324
+ points: MelodyPoint[];
325
+ pitchRangeOctaves: number;
326
+ pitchStability: number;
327
+ meanFrequency: number;
328
+ vibratoRate: number;
329
+ }
330
+
331
+ /**
332
+ * Constant-Q / Variable-Q transform magnitude result (mirrors the C
333
+ * `SonareCqtResult`).
334
+ */
335
+ export interface CqtResult {
336
+ /** Number of frequency bins. */
337
+ nBins: number;
338
+ /** Number of time frames. */
339
+ nFrames: number;
340
+ /** Hop length in samples. */
341
+ hopLength: number;
342
+ /** Sample rate in Hz. */
343
+ sampleRate: number;
344
+ /** Row-major `[nBins x nFrames]` magnitude matrix. */
345
+ magnitude: Float32Array;
346
+ /** Center frequency (Hz) of each of the `nBins` bins. */
347
+ frequencies: Float32Array;
348
+ }
349
+
350
+ /**
351
+ * Timbre characteristics
352
+ */
353
+ export interface Timbre {
354
+ brightness: number;
355
+ warmth: number;
356
+ density: number;
357
+ roughness: number;
358
+ complexity: number;
359
+ }
360
+
361
+ /**
362
+ * Dynamics characteristics
363
+ */
364
+ export interface Dynamics {
365
+ dynamicRangeDb: number;
366
+ loudnessRangeDb: number;
367
+ crestFactor: number;
368
+ isCompressed: boolean;
369
+ }
370
+
371
+ /**
372
+ * Time signature
373
+ */
374
+ export interface TimeSignature {
375
+ numerator: number;
376
+ denominator: number;
377
+ confidence: number;
378
+ }
379
+
380
+ /**
381
+ * Rhythm features
382
+ */
383
+ export interface RhythmFeatures {
384
+ syncopation: number;
385
+ grooveType: string;
386
+ patternRegularity: number;
387
+ }
388
+
389
+ /**
390
+ * Complete analysis result
391
+ */
392
+ export interface AnalysisResult {
393
+ bpm: number;
394
+ bpmConfidence: number;
395
+ key: Key;
396
+ timeSignature: TimeSignature;
397
+ beatTimes: Float32Array;
398
+ beats: Beat[];
399
+ chords: Chord[];
400
+ sections: Section[];
401
+ timbre: Timbre;
402
+ dynamics: Dynamics;
403
+ rhythm: RhythmFeatures;
404
+ form: string;
405
+ }
406
+
407
+ /**
408
+ * Room acoustic parameters from an impulse response
409
+ */
410
+ export interface AcousticResult {
411
+ rt60: number;
412
+ edt: number;
413
+ c50: number;
414
+ c80: number;
415
+ d50: number;
416
+ rt60Bands: Float32Array;
417
+ edtBands: Float32Array;
418
+ c50Bands: Float32Array;
419
+ c80Bands: Float32Array;
420
+ confidence: number;
421
+ isBlind: boolean;
422
+ }
423
+
424
+ /**
425
+ * HPSS (Harmonic-Percussive Source Separation) result
426
+ */
427
+ export interface HpssResult {
428
+ harmonic: Float32Array;
429
+ percussive: Float32Array;
430
+ sampleRate: number;
431
+ }
432
+
433
+ /**
434
+ * Mastering loudness/true-peak processing result
435
+ */
436
+ export interface MasteringResult {
437
+ samples: Float32Array;
438
+ sampleRate: number;
439
+ inputLufs: number;
440
+ outputLufs: number;
441
+ appliedGainDb: number;
442
+ latencySamples?: number;
443
+ }
444
+
445
+ export type MasteringProcessorParams = Record<string, number | boolean>;
446
+
447
+ export type PanMode = 'balance' | 'stereoPan' | 'stereo-pan' | 'dualPan' | 'dual-pan' | number;
448
+
449
+ export interface MixOptions {
450
+ inputTrimDb?: number | number[];
451
+ faderDb?: number | number[];
452
+ pan?: number | number[];
453
+ panMode?: PanMode | PanMode[];
454
+ width?: number | number[];
455
+ muted?: boolean | boolean[];
456
+ }
457
+
458
+ export interface MixMeterSnapshot {
459
+ peakDbL: number;
460
+ peakDbR: number;
461
+ rmsDbL: number;
462
+ rmsDbR: number;
463
+ correlation: number;
464
+ monoCompatWidth: number;
465
+ monoCompatPeak: number;
466
+ monoCompatSideRms: number;
467
+ likelyMonoCompatible: boolean;
468
+ momentaryLufs: number;
469
+ shortTermLufs: number;
470
+ integratedLufs: number;
471
+ gainReductionDb: number;
472
+ truePeakDbL: number;
473
+ truePeakDbR: number;
474
+ maxTruePeakDb: number;
475
+ seq: number;
476
+ }
477
+
478
+ export interface MixResult {
479
+ left: Float32Array;
480
+ right: Float32Array;
481
+ sampleRate: number;
482
+ meters: MixMeterSnapshot[];
483
+ }
484
+
485
+ /** Mixed stereo master returned by {@link Mixer.processStereo}. */
486
+ export interface MixerProcessResult {
487
+ left: Float32Array;
488
+ right: Float32Array;
489
+ sampleRate: number;
490
+ }
491
+
492
+ /**
493
+ * Interpolation curve for scheduled automation events
494
+ * (see {@link Mixer.scheduleInsertAutomation}).
495
+ */
496
+ export type AutomationCurve = 'linear' | 'exponential' | 'hold' | 's-curve';
497
+
498
+ /**
499
+ * Pan law applied when computing left/right gains from a pan position
500
+ * (see {@link Mixer.setPanLaw}). Maps to the underlying integer code.
501
+ */
502
+ export type PanLaw = 'const3dB' | 'const4.5dB' | 'const6dB' | 'linear0dB';
503
+
504
+ /**
505
+ * Meter tap point for reading a strip's meter snapshot
506
+ * (see {@link Mixer.meterTap} and {@link Mixer.stripMeter}).
507
+ */
508
+ export type MeterTap = 'preFader' | 'postFader';
509
+
510
+ /** Pre/post-fader send timing (see {@link Mixer.addSend}). */
511
+ export type SendTiming = 'preFader' | 'postFader';
512
+
513
+ /** A single goniometer (left/right) sample returned by {@link Mixer.readGoniometerLatest}. */
514
+ export interface GoniometerPoint {
515
+ left: number;
516
+ right: number;
517
+ }
518
+
519
+ export interface MasteringChainConfig {
520
+ repair?: {
521
+ denoise?: boolean;
522
+ nFft?: number;
523
+ hopLength?: number;
524
+ ddAlpha?: number;
525
+ gainFloor?: number;
526
+ declick?: {
527
+ threshold?: number;
528
+ neighborRatio?: number;
529
+ maxClickSamples?: number;
530
+ lpcOrder?: number;
531
+ residualRatio?: number;
532
+ };
533
+ dereverb?: {
534
+ threshold?: number;
535
+ attenuation?: number;
536
+ nFft?: number;
537
+ hopLength?: number;
538
+ t60Sec?: number;
539
+ lateDelayMs?: number;
540
+ overSubtraction?: number;
541
+ spectralFloor?: number;
542
+ wpeEnabled?: boolean;
543
+ wpeIterations?: number;
544
+ wpeTaps?: number;
545
+ wpeStrength?: number;
546
+ };
547
+ };
548
+ eq?: {
549
+ tiltDb?: number;
550
+ pivotHz?: number;
551
+ };
552
+ dynamics?: {
553
+ compressor?: {
554
+ thresholdDb?: number;
555
+ ratio?: number;
556
+ attackMs?: number;
557
+ releaseMs?: number;
558
+ kneeDb?: number;
559
+ makeupGainDb?: number;
560
+ autoMakeup?: boolean;
561
+ };
562
+ deesser?: {
563
+ frequencyHz?: number;
564
+ thresholdDb?: number;
565
+ ratio?: number;
566
+ attackMs?: number;
567
+ releaseMs?: number;
568
+ rangeDb?: number;
569
+ bandpassQ?: number;
570
+ };
571
+ transientShaper?: {
572
+ attackGainDb?: number;
573
+ sustainGainDb?: number;
574
+ fastAttackMs?: number;
575
+ fastReleaseMs?: number;
576
+ slowAttackMs?: number;
577
+ slowReleaseMs?: number;
578
+ sensitivity?: number;
579
+ maxGainDb?: number;
580
+ gainSmoothingMs?: number;
581
+ lookaheadMs?: number;
582
+ };
583
+ multibandComp?: {
584
+ lowCutoffHz?: number;
585
+ highCutoffHz?: number;
586
+ lowThresholdDb?: number;
587
+ lowRatio?: number;
588
+ lowAttackMs?: number;
589
+ lowReleaseMs?: number;
590
+ midThresholdDb?: number;
591
+ midRatio?: number;
592
+ midAttackMs?: number;
593
+ midReleaseMs?: number;
594
+ highThresholdDb?: number;
595
+ highRatio?: number;
596
+ highAttackMs?: number;
597
+ highReleaseMs?: number;
598
+ };
599
+ };
600
+ saturation?: {
601
+ tape?: {
602
+ driveDb?: number;
603
+ saturation?: number;
604
+ hysteresis?: number;
605
+ outputGainDb?: number;
606
+ speedIps?: number;
607
+ headBumpDb?: number;
608
+ bias?: number;
609
+ gapLoss?: number;
610
+ };
611
+ exciter?: {
612
+ frequencyHz?: number;
613
+ driveDb?: number;
614
+ amount?: number;
615
+ q?: number;
616
+ evenOddMix?: number;
617
+ };
618
+ };
619
+ spectral?: {
620
+ airBand?: {
621
+ amount?: number;
622
+ shelfFrequencyHz?: number;
623
+ dynamicThresholdDb?: number;
624
+ dynamicRangeDb?: number;
625
+ };
626
+ };
627
+ stereo?: {
628
+ imager?: {
629
+ width?: number;
630
+ outputGainDb?: number;
631
+ decorrelationAmount?: number;
632
+ preserveEnergy?: boolean;
633
+ };
634
+ monoMaker?: {
635
+ amount?: number;
636
+ };
637
+ };
638
+ maximizer?: {
639
+ truePeakLimiter?: {
640
+ ceilingDb?: number;
641
+ lookaheadMs?: number;
642
+ releaseMs?: number;
643
+ oversampleFactor?: number;
644
+ applyGainAtInputRate?: boolean;
645
+ };
646
+ };
647
+ loudness?: {
648
+ targetLufs?: number;
649
+ ceilingDb?: number;
650
+ truePeakOversample?: number;
651
+ };
652
+ }
653
+
654
+ export interface MasteringChainResult extends MasteringResult {
655
+ stages: string[];
656
+ }
657
+
658
+ export interface MasteringStereoChainResult {
659
+ left: Float32Array;
660
+ right: Float32Array;
661
+ sampleRate: number;
662
+ inputLufs: number;
663
+ outputLufs: number;
664
+ appliedGainDb: number;
665
+ stages: string[];
666
+ latencySamples?: number;
667
+ }
668
+
669
+ export interface MasteringStereoResult {
670
+ left: Float32Array;
671
+ right: Float32Array;
672
+ sampleRate: number;
673
+ inputLufs: number;
674
+ outputLufs: number;
675
+ appliedGainDb: number;
676
+ latencySamples: number;
677
+ }
678
+
679
+ /**
680
+ * STFT (Short-Time Fourier Transform) result
681
+ */
682
+ export interface StftResult {
683
+ nBins: number;
684
+ nFrames: number;
685
+ nFft: number;
686
+ hopLength: number;
687
+ sampleRate: number;
688
+ magnitude: Float32Array;
689
+ power: Float32Array;
690
+ }
691
+
692
+ /**
693
+ * Mel spectrogram result
694
+ */
695
+ export interface MelSpectrogramResult {
696
+ nMels: number;
697
+ nFrames: number;
698
+ sampleRate: number;
699
+ hopLength: number;
700
+ power: Float32Array;
701
+ db: Float32Array;
702
+ }
703
+
704
+ /**
705
+ * MFCC result
706
+ */
707
+ export interface MfccResult {
708
+ nMfcc: number;
709
+ nFrames: number;
710
+ coefficients: Float32Array;
711
+ }
712
+
713
+ /**
714
+ * STFT power spectrogram result (from inverse Mel reconstruction)
715
+ */
716
+ export interface StftPowerResult {
717
+ nBins: number;
718
+ nFrames: number;
719
+ power: Float32Array;
720
+ }
721
+
722
+ /**
723
+ * Mel power spectrogram result (from inverse MFCC reconstruction)
724
+ */
725
+ export interface MelPowerResult {
726
+ nMels: number;
727
+ nFrames: number;
728
+ power: Float32Array;
729
+ }
730
+
731
+ /**
732
+ * Chroma features result
733
+ */
734
+ export interface ChromaResult {
735
+ nChroma: number;
736
+ nFrames: number;
737
+ sampleRate: number;
738
+ hopLength: number;
739
+ features: Float32Array;
740
+ meanEnergy: number[];
741
+ }
742
+
743
+ /**
744
+ * Pitch detection result
745
+ */
746
+ export interface PitchResult {
747
+ f0: Float32Array;
748
+ voicedProb: Float32Array;
749
+ voicedFlag: boolean[];
750
+ nFrames: number;
751
+ medianF0: number;
752
+ meanF0: number;
753
+ }
754
+
755
+ /**
756
+ * Loudness measurement result (EBU R128 / ITU-R BS.1770)
757
+ */
758
+ export interface LufsResult {
759
+ integratedLufs: number;
760
+ momentaryLufs: number;
761
+ shortTermLufs: number;
762
+ loudnessRange: number;
763
+ }
764
+
765
+ /**
766
+ * Realtime equalizer spectrum snapshot.
767
+ *
768
+ * Mirrors the C++ `EqualizerSpectrumSnapshot`: `preLeft`/`preRight` and
769
+ * `postLeft`/`postRight` are the pre- and post-EQ spectrum streams (trimmed to
770
+ * their valid count). `bandGainDb` holds per-band applied gain (24 entries),
771
+ * `profileDb` the smoothed magnitude profile (16 entries), `lastAutoGainDb`
772
+ * the latest auto-gain compensation, and `seq` increments each time a new
773
+ * snapshot is published.
774
+ */
775
+ export interface EqSpectrumSnapshot {
776
+ preLeft: Float32Array;
777
+ preRight: Float32Array;
778
+ postLeft: Float32Array;
779
+ postRight: Float32Array;
780
+ bandGainDb: Float32Array;
781
+ profileDb: Float32Array;
782
+ lastAutoGainDb: number;
783
+ seq: number;
784
+ }
785
+
786
+ /**
787
+ * Equalizer band type (string union mirroring `sonare::mastering::eq::EqBandType`).
788
+ */
789
+ export type EqBandType =
790
+ | 'Peak'
791
+ | 'LowShelf'
792
+ | 'HighShelf'
793
+ | 'LowPass'
794
+ | 'HighPass'
795
+ | 'BandPass'
796
+ | 'Notch'
797
+ | 'TiltShelf'
798
+ | 'FlatTilt';
799
+
800
+ /** Biquad coefficient design mode. */
801
+ export type EqCoeffMode = 'Rbj' | 'Vicanek';
802
+
803
+ /** Stereo placement for an EQ band. */
804
+ export type EqStereoPlacement = 'Stereo' | 'Left' | 'Right' | 'Mid' | 'Side';
805
+
806
+ /** Per-band phase behaviour. */
807
+ export type EqBandPhase = 'Inherit' | 'ZeroLatency' | 'NaturalPhase' | 'LinearPhase';
808
+
809
+ /**
810
+ * Equalizer band configuration accepted by {@link StreamingEqualizer.setBand}.
811
+ *
812
+ * All fields are optional; omitted values fall back to the C++ band defaults
813
+ * (Peak, 1000 Hz, 0 dB gain, Butterworth Q, disabled).
814
+ */
815
+ export interface EqBand {
816
+ type?: EqBandType;
817
+ frequencyHz?: number;
818
+ gainDb?: number;
819
+ q?: number;
820
+ enabled?: boolean;
821
+ coeffMode?: EqCoeffMode;
822
+ slopeDbOct?: number;
823
+ placement?: EqStereoPlacement;
824
+ phase?: EqBandPhase;
825
+ soloed?: boolean;
826
+ bypassed?: boolean;
827
+ proportionalQ?: boolean;
828
+ proportionalQStrength?: number;
829
+ dynamic?: boolean;
830
+ thresholdDb?: number;
831
+ autoThreshold?: boolean;
832
+ ratio?: number;
833
+ rangeDb?: number;
834
+ attackMs?: number;
835
+ releaseMs?: number;
836
+ lookaheadMs?: number;
837
+ externalSidechain?: boolean;
838
+ sidechainFreqHz?: number;
839
+ sidechainQ?: number;
840
+ }
841
+
842
+ /** Construction options for {@link StreamingEqualizer}. */
843
+ export interface StreamingEqualizerConfig {
844
+ sampleRate?: number;
845
+ maxBlockSize?: number;
846
+ }
847
+
848
+ /** Options for {@link StreamingEqualizer.match}. */
849
+ export interface EqMatchOptions {
850
+ sampleRate?: number;
851
+ maxBands?: number;
852
+ }