@libraz/libsonare 1.1.0 → 1.2.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.
@@ -18,6 +18,11 @@ interface WasmKeyResult {
18
18
  shortName: string;
19
19
  }
20
20
 
21
+ interface WasmKeyCandidateResult {
22
+ key: WasmKeyResult;
23
+ correlation: number;
24
+ }
25
+
21
26
  interface WasmBeatResult {
22
27
  time: number;
23
28
  strength: number;
@@ -25,6 +30,7 @@ interface WasmBeatResult {
25
30
 
26
31
  interface WasmChordResult {
27
32
  root: number;
33
+ bass: number;
28
34
  quality: number;
29
35
  start: number;
30
36
  end: number;
@@ -82,6 +88,24 @@ interface WasmAnalysisResult {
82
88
  form: string;
83
89
  }
84
90
 
91
+ interface WasmChordAnalysisResult {
92
+ chords: WasmChordResult[];
93
+ }
94
+
95
+ interface WasmAcousticResult {
96
+ rt60: number;
97
+ edt: number;
98
+ c50: number;
99
+ c80: number;
100
+ d50: number;
101
+ rt60Bands: Float32Array;
102
+ edtBands: Float32Array;
103
+ c50Bands: Float32Array;
104
+ c80Bands: Float32Array;
105
+ confidence: number;
106
+ isBlind: boolean;
107
+ }
108
+
85
109
  interface WasmHpssResult {
86
110
  harmonic: Float32Array;
87
111
  percussive: Float32Array;
@@ -119,6 +143,18 @@ interface WasmMfccResult {
119
143
  coefficients: Float32Array;
120
144
  }
121
145
 
146
+ interface WasmStftPowerResult {
147
+ nBins: number;
148
+ nFrames: number;
149
+ power: Float32Array;
150
+ }
151
+
152
+ interface WasmMelPowerResult {
153
+ nMels: number;
154
+ nFrames: number;
155
+ power: Float32Array;
156
+ }
157
+
122
158
  interface WasmChromaResult {
123
159
  nChroma: number;
124
160
  nFrames: number;
@@ -154,6 +190,54 @@ interface WasmTempogramResult {
154
190
  data: Float32Array;
155
191
  }
156
192
 
193
+ interface WasmCyclicTempogramResult {
194
+ nFrames: number;
195
+ nBins: number;
196
+ data: Float32Array;
197
+ }
198
+
199
+ interface WasmFourierTempogramResult {
200
+ nBins: number;
201
+ nFrames: number;
202
+ data: Float32Array;
203
+ }
204
+
205
+ interface WasmNnlsChromaResult {
206
+ nChroma: number;
207
+ nFrames: number;
208
+ data: Float32Array;
209
+ }
210
+
211
+ interface WasmMelodyPoint {
212
+ time: number;
213
+ frequency: number;
214
+ confidence: number;
215
+ }
216
+
217
+ interface WasmMelodyResult {
218
+ points: WasmMelodyPoint[];
219
+ pitchRangeOctaves: number;
220
+ pitchStability: number;
221
+ meanFrequency: number;
222
+ vibratoRate: number;
223
+ }
224
+
225
+ interface WasmCqtResult {
226
+ nBins: number;
227
+ nFrames: number;
228
+ hopLength: number;
229
+ sampleRate: number;
230
+ magnitude: Float32Array;
231
+ frequencies: Float32Array;
232
+ }
233
+
234
+ interface WasmLufsResult {
235
+ integratedLufs: number;
236
+ momentaryLufs: number;
237
+ shortTermLufs: number;
238
+ loudnessRange: number;
239
+ }
240
+
157
241
  interface WasmMasteringResult {
158
242
  samples: Float32Array;
159
243
  sampleRate: number;
@@ -187,21 +271,320 @@ interface WasmMasteringStereoResult {
187
271
  latencySamples: number;
188
272
  }
189
273
 
274
+ interface WasmMixMeterSnapshot {
275
+ peakDbL: number;
276
+ peakDbR: number;
277
+ rmsDbL: number;
278
+ rmsDbR: number;
279
+ correlation: number;
280
+ monoCompatWidth: number;
281
+ monoCompatPeak: number;
282
+ monoCompatSideRms: number;
283
+ likelyMonoCompatible: boolean;
284
+ momentaryLufs: number;
285
+ shortTermLufs: number;
286
+ integratedLufs: number;
287
+ gainReductionDb: number;
288
+ truePeakDbL: number;
289
+ truePeakDbR: number;
290
+ maxTruePeakDb: number;
291
+ seq: number;
292
+ }
293
+
294
+ interface WasmMixResult {
295
+ left: Float32Array;
296
+ right: Float32Array;
297
+ sampleRate: number;
298
+ meters: WasmMixMeterSnapshot[];
299
+ }
300
+
301
+ interface WasmEngineClip {
302
+ id?: number;
303
+ channels: Float32Array[];
304
+ startPpq: number;
305
+ lengthSamples?: number;
306
+ clipOffsetSamples?: number;
307
+ loop?: boolean;
308
+ gain?: number;
309
+ fadeInSamples?: number;
310
+ fadeOutSamples?: number;
311
+ }
312
+
313
+ interface WasmEngineParameterInfo {
314
+ id: number;
315
+ name: string;
316
+ unit: string;
317
+ minValue: number;
318
+ maxValue: number;
319
+ defaultValue: number;
320
+ rtSafe: boolean;
321
+ defaultCurve: number;
322
+ }
323
+
324
+ interface WasmEngineAutomationPoint {
325
+ ppq: number;
326
+ value: number;
327
+ curveToNext?: number;
328
+ }
329
+
330
+ interface WasmEngineMarker {
331
+ id: number;
332
+ ppq: number;
333
+ name?: string;
334
+ }
335
+
336
+ interface WasmEngineMetronomeConfig {
337
+ enabled: boolean;
338
+ beatGain?: number;
339
+ accentGain?: number;
340
+ clickSamples?: number;
341
+ }
342
+
343
+ interface WasmEngineGraphNode {
344
+ id: string;
345
+ type?: number;
346
+ gainDb?: number;
347
+ numPorts?: number;
348
+ }
349
+
350
+ interface WasmEngineGraphConnection {
351
+ sourceNode: string;
352
+ sourcePort: number;
353
+ destNode: string;
354
+ destPort: number;
355
+ mix?: number;
356
+ }
357
+
358
+ interface WasmEngineGraphParameterBinding {
359
+ paramId: number;
360
+ nodeId: string;
361
+ }
362
+
363
+ interface WasmEngineGraphSpec {
364
+ nodes: WasmEngineGraphNode[];
365
+ connections: WasmEngineGraphConnection[];
366
+ inputNode: string;
367
+ outputNode: string;
368
+ numChannels: number;
369
+ parameterBindings?: WasmEngineGraphParameterBinding[];
370
+ }
371
+
372
+ interface WasmEngineTelemetry {
373
+ type: number;
374
+ error: number;
375
+ renderFrame: number;
376
+ timelineSample: number;
377
+ audibleTimelineSample: number;
378
+ graphLatencySamplesQ8: number;
379
+ value: number;
380
+ }
381
+
382
+ interface WasmEngineMeterTelemetry {
383
+ targetId: number;
384
+ renderFrame: number;
385
+ seq: number;
386
+ peakDbL: number;
387
+ peakDbR: number;
388
+ rmsDbL: number;
389
+ rmsDbR: number;
390
+ truePeakDbL: number;
391
+ truePeakDbR: number;
392
+ maxTruePeakDb: number;
393
+ correlation: number;
394
+ monoCompatWidth: number;
395
+ momentaryLufs: number;
396
+ shortTermLufs: number;
397
+ integratedLufs: number;
398
+ gainReductionDb: number;
399
+ droppedRecords: number;
400
+ }
401
+
402
+ interface WasmEngineCaptureStatus {
403
+ capturedFrames: number;
404
+ overflowCount: number;
405
+ armed: boolean;
406
+ punchEnabled: boolean;
407
+ }
408
+
409
+ interface WasmEngineTransportState {
410
+ playing: boolean;
411
+ looping: boolean;
412
+ renderFrame: number;
413
+ samplePosition: number;
414
+ ppq: number;
415
+ bpm: number;
416
+ loopStartPpq: number;
417
+ loopEndPpq: number;
418
+ sampleRate: number;
419
+ }
420
+
421
+ interface WasmEngineBounceOptions {
422
+ totalFrames: number;
423
+ blockSize?: number;
424
+ numChannels?: number;
425
+ targetSampleRate?: number;
426
+ sourceSampleRate?: number;
427
+ normalizeLufs?: boolean;
428
+ targetLufs?: number;
429
+ dither?: 0 | 1 | 2 | 3;
430
+ ditherBits?: number;
431
+ ditherSeed?: number;
432
+ }
433
+
434
+ interface WasmEngineBounceResult {
435
+ interleaved: Float32Array;
436
+ frames: number;
437
+ numChannels: number;
438
+ sampleRate: number;
439
+ integratedLufs: number;
440
+ }
441
+
442
+ interface WasmEngineFreezeOptions {
443
+ totalFrames: number;
444
+ blockSize?: number;
445
+ numChannels?: number;
446
+ clipId?: number;
447
+ startPpq?: number;
448
+ gain?: number;
449
+ }
450
+
451
+ interface WasmEngineFreezeResult {
452
+ clipId: number;
453
+ frames: number;
454
+ numChannels: number;
455
+ }
456
+
457
+ interface WasmEngineProcessWithMonitorResult {
458
+ output: Float32Array[];
459
+ monitor: Float32Array[];
460
+ }
461
+
462
+ interface WasmRealtimeEngine {
463
+ prepare: (
464
+ sampleRate: number,
465
+ maxBlockSize: number,
466
+ commandCapacity: number,
467
+ telemetryCapacity: number,
468
+ ) => void;
469
+ setParameter: (paramId: number, value: number, renderFrame: number) => void;
470
+ setParameterSmoothed: (paramId: number, value: number, renderFrame: number) => void;
471
+ getTransportState: () => WasmEngineTransportState;
472
+ play: (renderFrame: number) => void;
473
+ stop: (renderFrame: number) => void;
474
+ seekSample: (timelineSample: number, renderFrame: number) => void;
475
+ seekPpq: (ppq: number, renderFrame: number) => void;
476
+ setTempo: (bpm: number) => void;
477
+ setTimeSignature: (numerator: number, denominator: number) => void;
478
+ setLoop: (startPpq: number, endPpq: number, enabled: boolean) => void;
479
+ addParameter: (info: WasmEngineParameterInfo) => void;
480
+ parameterCount: () => number;
481
+ parameterInfoByIndex: (index: number) => WasmEngineParameterInfo;
482
+ parameterInfo: (id: number) => WasmEngineParameterInfo;
483
+ setAutomationLane: (paramId: number, points: WasmEngineAutomationPoint[]) => void;
484
+ automationLaneCount: () => number;
485
+ setMarkers: (markers: WasmEngineMarker[]) => void;
486
+ markerCount: () => number;
487
+ markerByIndex: (index: number) => WasmEngineMarker;
488
+ marker: (id: number) => WasmEngineMarker;
489
+ seekMarker: (id: number, renderFrame: number) => void;
490
+ setLoopFromMarkers: (startMarkerId: number, endMarkerId: number) => void;
491
+ setMetronome: (config: WasmEngineMetronomeConfig) => void;
492
+ metronome: () => Required<WasmEngineMetronomeConfig>;
493
+ countInEndSample: (startSample: number, bars: number) => number;
494
+ setGraph: (spec: WasmEngineGraphSpec) => void;
495
+ graphNodeCount: () => number;
496
+ graphConnectionCount: () => number;
497
+ setClips: (clips: WasmEngineClip[]) => void;
498
+ clipCount: () => number;
499
+ setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
500
+ armCapture: (armed: boolean) => void;
501
+ setCapturePunch: (startSample: number, endSample: number, enabled: boolean) => void;
502
+ resetCapture: () => void;
503
+ captureStatus: () => WasmEngineCaptureStatus;
504
+ capturedAudio: () => Float32Array[];
505
+ process: (channels: Float32Array[]) => Float32Array[];
506
+ processWithMonitor: (channels: Float32Array[]) => WasmEngineProcessWithMonitorResult;
507
+ renderOffline: (channels: Float32Array[], blockSize: number) => Float32Array[];
508
+ bounceOffline: (options: WasmEngineBounceOptions) => WasmEngineBounceResult;
509
+ freezeOffline: (options: WasmEngineFreezeOptions) => WasmEngineFreezeResult;
510
+ drainTelemetry: (maxRecords: number) => WasmEngineTelemetry[];
511
+ drainMeterTelemetry: (maxRecords: number) => WasmEngineMeterTelemetry[];
512
+ delete: () => void;
513
+ }
514
+
190
515
  type ProgressCallback = (progress: number, stage: string) => void;
516
+ type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
191
517
 
192
518
  interface SonareModule {
193
519
  // Quick API (high-level)
194
520
  detectBpm: (samples: Float32Array, sampleRate: number) => number;
195
521
  detectKey: (samples: Float32Array, sampleRate: number) => WasmKeyResult;
522
+ _detectKeyWithOptions: (
523
+ samples: Float32Array,
524
+ sampleRate: number,
525
+ nFft: number,
526
+ hopLength: number,
527
+ useHpss: boolean,
528
+ loudnessWeighted: boolean,
529
+ highPassHz: number,
530
+ modes: number[],
531
+ profileType: number,
532
+ genreHint: string,
533
+ ) => WasmKeyResult;
534
+ _detectKeyCandidates: (
535
+ samples: Float32Array,
536
+ sampleRate: number,
537
+ nFft: number,
538
+ hopLength: number,
539
+ useHpss: boolean,
540
+ loudnessWeighted: boolean,
541
+ highPassHz: number,
542
+ modes: number[],
543
+ profileType: number,
544
+ genreHint: string,
545
+ ) => WasmKeyCandidateResult[];
196
546
  detectOnsets: (samples: Float32Array, sampleRate: number) => Float32Array;
197
547
  detectBeats: (samples: Float32Array, sampleRate: number) => Float32Array;
548
+ detectDownbeats: (samples: Float32Array, sampleRate: number) => Float32Array;
549
+ detectChords: (
550
+ samples: Float32Array,
551
+ sampleRate: number,
552
+ minDuration: number,
553
+ smoothingWindow: number,
554
+ threshold: number,
555
+ useTriadsOnly: boolean,
556
+ nFft: number,
557
+ hopLength: number,
558
+ useBeatSync: boolean,
559
+ useHmm: boolean,
560
+ hmmBeamWidth: number,
561
+ useKeyContext: boolean,
562
+ keyRoot: number,
563
+ keyMode: number,
564
+ detectInversions: boolean,
565
+ chromaMethod: number,
566
+ ) => WasmChordAnalysisResult;
198
567
  analyze: (samples: Float32Array, sampleRate: number) => WasmAnalysisResult;
568
+ analyzeImpulseResponse: (
569
+ samples: Float32Array,
570
+ sampleRate: number,
571
+ nOctaveBands: number,
572
+ ) => WasmAcousticResult;
573
+ detectAcoustic: (
574
+ samples: Float32Array,
575
+ sampleRate: number,
576
+ nOctaveBands: number,
577
+ nThirdOctaveSubbands: number,
578
+ minDecayDb: number,
579
+ noiseFloorMarginDb: number,
580
+ ) => WasmAcousticResult;
199
581
  analyzeWithProgress: (
200
582
  samples: Float32Array,
201
583
  sampleRate: number,
202
584
  progressCallback: ProgressCallback | null,
203
585
  ) => WasmAnalysisResult;
204
586
  version: () => string;
587
+ engineAbiVersion: () => number;
205
588
 
206
589
  // Effects
207
590
  hpss: (
@@ -214,6 +597,25 @@ interface SonareModule {
214
597
  percussive: (samples: Float32Array, sampleRate: number) => Float32Array;
215
598
  timeStretch: (samples: Float32Array, sampleRate: number, rate: number) => Float32Array;
216
599
  pitchShift: (samples: Float32Array, sampleRate: number, semitones: number) => Float32Array;
600
+ pitchCorrectToMidi: (
601
+ samples: Float32Array,
602
+ sampleRate: number,
603
+ currentMidi: number,
604
+ targetMidi: number,
605
+ ) => Float32Array;
606
+ noteStretch: (
607
+ samples: Float32Array,
608
+ sampleRate: number,
609
+ onsetSample: number,
610
+ offsetSample: number,
611
+ stretchRatio: number,
612
+ ) => Float32Array;
613
+ voiceChange: (
614
+ samples: Float32Array,
615
+ sampleRate: number,
616
+ pitchSemitones: number,
617
+ formantFactor: number,
618
+ ) => Float32Array;
217
619
  normalize: (samples: Float32Array, sampleRate: number, targetDb: number) => Float32Array;
218
620
  mastering: (
219
621
  samples: Float32Array,
@@ -260,6 +662,21 @@ interface SonareModule {
260
662
  sampleRate: number,
261
663
  params: Record<string, number | boolean>,
262
664
  ) => string;
665
+ masteringAssistantSuggest: (
666
+ samples: Float32Array,
667
+ sampleRate: number,
668
+ params: Record<string, number | boolean>,
669
+ ) => string;
670
+ masteringAudioProfile: (
671
+ samples: Float32Array,
672
+ sampleRate: number,
673
+ params: Record<string, number | boolean>,
674
+ ) => string;
675
+ masteringStreamingPreview: (
676
+ samples: Float32Array,
677
+ sampleRate: number,
678
+ platforms: Array<{ name: string; targetLufs: number; ceilingDb: number }>,
679
+ ) => string;
263
680
  masteringChain: (
264
681
  samples: Float32Array,
265
682
  sampleRate: number,
@@ -298,6 +715,14 @@ interface SonareModule {
298
715
  sampleRate: number,
299
716
  overrides: Record<string, number | boolean> | null,
300
717
  ) => WasmMasteringStereoChainResult;
718
+ mixingScenePresetNames: () => string[];
719
+ mixingScenePresetJson: (presetName: string) => string;
720
+ mixStereo: (
721
+ leftChannels: Float32Array[],
722
+ rightChannels: Float32Array[],
723
+ sampleRate: number,
724
+ options: Record<string, unknown>,
725
+ ) => WasmMixResult;
301
726
  trim: (samples: Float32Array, sampleRate: number, thresholdDb: number) => Float32Array;
302
727
 
303
728
  // Features - Spectrogram
@@ -331,6 +756,47 @@ interface SonareModule {
331
756
  nMfcc: number,
332
757
  ) => WasmMfccResult;
333
758
 
759
+ // Features - Inverse reconstruction
760
+ melToStft: (
761
+ melPower: Float32Array,
762
+ nMels: number,
763
+ nFrames: number,
764
+ sampleRate: number,
765
+ nFft: number,
766
+ hopLength: number,
767
+ fmin: number,
768
+ fmax: number,
769
+ ) => WasmStftPowerResult;
770
+ melToAudio: (
771
+ melPower: Float32Array,
772
+ nMels: number,
773
+ nFrames: number,
774
+ sampleRate: number,
775
+ nFft: number,
776
+ hopLength: number,
777
+ nIter: number,
778
+ fmin: number,
779
+ fmax: number,
780
+ ) => Float32Array;
781
+ mfccToMel: (
782
+ mfcc: Float32Array,
783
+ nMfcc: number,
784
+ nFrames: number,
785
+ nMels: number,
786
+ ) => WasmMelPowerResult;
787
+ mfccToAudio: (
788
+ mfcc: Float32Array,
789
+ nMfcc: number,
790
+ nFrames: number,
791
+ nMels: number,
792
+ sampleRate: number,
793
+ nFft: number,
794
+ hopLength: number,
795
+ nIter: number,
796
+ fmin: number,
797
+ fmax: number,
798
+ ) => Float32Array;
799
+
334
800
  // Features - Chroma
335
801
  chroma: (
336
802
  samples: Float32Array,
@@ -453,7 +919,16 @@ interface SonareModule {
453
919
  sampleRate: number,
454
920
  hopLength: number,
455
921
  winLength: number,
922
+ mode: TempogramMode,
456
923
  ) => WasmTempogramResult;
924
+ cyclicTempogram: (
925
+ onsetEnvelope: Float32Array,
926
+ sampleRate: number,
927
+ hopLength: number,
928
+ winLength: number,
929
+ bpmMin: number,
930
+ nBins: number,
931
+ ) => WasmCyclicTempogramResult;
457
932
  plp: (
458
933
  onsetEnvelope: Float32Array,
459
934
  sampleRate: number,
@@ -462,6 +937,62 @@ interface SonareModule {
462
937
  tempoMax: number,
463
938
  winLength: number,
464
939
  ) => Float32Array;
940
+ nnlsChroma: (samples: Float32Array, sampleRate: number) => WasmNnlsChromaResult;
941
+ cqt: (
942
+ samples: Float32Array,
943
+ sampleRate: number,
944
+ hopLength: number,
945
+ fmin: number,
946
+ nBins: number,
947
+ binsPerOctave: number,
948
+ ) => WasmCqtResult;
949
+ vqt: (
950
+ samples: Float32Array,
951
+ sampleRate: number,
952
+ hopLength: number,
953
+ fmin: number,
954
+ nBins: number,
955
+ binsPerOctave: number,
956
+ gamma: number,
957
+ ) => WasmCqtResult;
958
+ analyzeSections: (
959
+ samples: Float32Array,
960
+ sampleRate: number,
961
+ nFft: number,
962
+ hopLength: number,
963
+ minSectionSec: number,
964
+ ) => WasmSectionResult[];
965
+ analyzeMelody: (
966
+ samples: Float32Array,
967
+ sampleRate: number,
968
+ fmin: number,
969
+ fmax: number,
970
+ frameLength: number,
971
+ hopLength: number,
972
+ threshold: number,
973
+ ) => WasmMelodyResult;
974
+ onsetEnvelope: (
975
+ samples: Float32Array,
976
+ sampleRate: number,
977
+ nFft: number,
978
+ hopLength: number,
979
+ nMels: number,
980
+ ) => Float32Array;
981
+ fourierTempogram: (
982
+ onsetEnvelope: Float32Array,
983
+ sampleRate: number,
984
+ hopLength: number,
985
+ winLength: number,
986
+ ) => WasmFourierTempogramResult;
987
+ tempogramRatio: (
988
+ tempogramData: Float32Array,
989
+ winLength: number,
990
+ sampleRate: number,
991
+ hopLength: number,
992
+ ) => Float32Array;
993
+ lufs: (samples: Float32Array, sampleRate: number) => WasmLufsResult;
994
+ momentaryLufs: (samples: Float32Array, sampleRate: number) => Float32Array;
995
+ shortTermLufs: (samples: Float32Array, sampleRate: number) => Float32Array;
465
996
 
466
997
  // Core - Resample
467
998
  resample: (samples: Float32Array, srcSr: number, targetSr: number) => Float32Array;
@@ -495,6 +1026,14 @@ interface SonareModule {
495
1026
  Minor7: { value: 6 };
496
1027
  Sus2: { value: 7 };
497
1028
  Sus4: { value: 8 };
1029
+ Unknown: { value: 9 };
1030
+ Add9: { value: 10 };
1031
+ MinorAdd9: { value: 11 };
1032
+ Dim7: { value: 12 };
1033
+ HalfDim7: { value: 13 };
1034
+ Major9: { value: 14 };
1035
+ Dominant9: { value: 15 };
1036
+ Sus2Add4: { value: 16 };
498
1037
  };
499
1038
  SectionType: {
500
1039
  Intro: { value: 0 };
@@ -504,6 +1043,7 @@ interface SonareModule {
504
1043
  Bridge: { value: 4 };
505
1044
  Instrumental: { value: 5 };
506
1045
  Outro: { value: 6 };
1046
+ Unknown: { value: 7 };
507
1047
  };
508
1048
 
509
1049
  // Streaming - StreamAnalyzer
@@ -512,14 +1052,41 @@ interface SonareModule {
512
1052
  nFft: number,
513
1053
  hopLength: number,
514
1054
  nMels: number,
1055
+ fmin: number,
1056
+ fmax: number,
1057
+ tuningRefHz: number,
1058
+ computeMagnitude: boolean,
515
1059
  computeMel: boolean,
516
1060
  computeChroma: boolean,
517
1061
  computeOnset: boolean,
1062
+ computeSpectral: boolean,
518
1063
  emitEveryNFrames: number,
1064
+ magnitudeDownsample: number,
1065
+ keyUpdateIntervalSec: number,
1066
+ bpmUpdateIntervalSec: number,
1067
+ window: number,
1068
+ outputFormat: number,
519
1069
  ) => WasmStreamAnalyzer;
520
1070
 
1071
+ RealtimeEngine: new (
1072
+ sampleRate: number,
1073
+ maxBlockSize: number,
1074
+ commandCapacity: number,
1075
+ telemetryCapacity: number,
1076
+ ) => WasmRealtimeEngine;
1077
+
521
1078
  // Streaming - StreamingMasteringChain
522
1079
  createStreamingMasteringChain: (config: Record<string, unknown>) => WasmStreamingMasteringChain;
1080
+
1081
+ // Streaming - StreamingEqualizer
1082
+ createEqualizer: (config: Record<string, unknown>) => WasmStreamingEqualizer;
1083
+
1084
+ // Streaming - StreamingRetune
1085
+ createStreamingRetune: (config: Record<string, unknown>) => WasmStreamingRetune;
1086
+
1087
+ // Mixing - scene-based Mixer
1088
+ createMixerFromSceneJson: (json: string, sampleRate: number, blockSize: number) => WasmMixer;
1089
+ mixerPresetJson: (presetName: string) => string;
523
1090
  }
524
1091
 
525
1092
  interface WasmStreamingMasteringChain {
@@ -535,6 +1102,135 @@ interface WasmStreamingMasteringChain {
535
1102
  delete: () => void;
536
1103
  }
537
1104
 
1105
+ interface WasmEqSpectrumSnapshot {
1106
+ preLeft: Float32Array;
1107
+ preRight: Float32Array;
1108
+ postLeft: Float32Array;
1109
+ postRight: Float32Array;
1110
+ bandGainDb: Float32Array;
1111
+ profileDb: Float32Array;
1112
+ lastAutoGainDb: number;
1113
+ seq: number;
1114
+ }
1115
+
1116
+ interface WasmStreamingEqualizer {
1117
+ setBand: (index: number, band: Record<string, unknown>) => void;
1118
+ clear: () => void;
1119
+ setPhaseMode: (mode: number) => void;
1120
+ setAutoGain: (enabled: boolean) => void;
1121
+ setGainScale: (scale: number) => void;
1122
+ setOutputGainDb: (gainDb: number) => void;
1123
+ setOutputPan: (pan: number) => void;
1124
+ setSidechainMono: (samples: Float32Array) => void;
1125
+ setSidechainStereo: (left: Float32Array, right: Float32Array) => void;
1126
+ clearSidechain: () => void;
1127
+ lastAutoGainDb: () => number;
1128
+ latencySamples: () => number;
1129
+ processMono: (samples: Float32Array) => Float32Array;
1130
+ processStereo: (
1131
+ left: Float32Array,
1132
+ right: Float32Array,
1133
+ ) => { left: Float32Array; right: Float32Array };
1134
+ spectrum: () => WasmEqSpectrumSnapshot;
1135
+ match: (source: Float32Array, reference: Float32Array, options: Record<string, unknown>) => void;
1136
+ delete: () => void;
1137
+ }
1138
+
1139
+ interface WasmStreamingRetune {
1140
+ prepare: (sampleRate: number, maxBlockSize: number) => void;
1141
+ reset: () => void;
1142
+ setConfig: (config: Record<string, unknown>) => void;
1143
+ config: () => { semitones: number; mix: number; grainSize: number };
1144
+ grainSize: () => number;
1145
+ processMono: (samples: Float32Array) => Float32Array;
1146
+ delete: () => void;
1147
+ }
1148
+
1149
+ interface WasmMixer {
1150
+ compile: () => void;
1151
+ processStereo: (
1152
+ leftChannels: Float32Array[],
1153
+ rightChannels: Float32Array[],
1154
+ ) => { left: Float32Array; right: Float32Array; sampleRate: number };
1155
+ processStereoInto: (
1156
+ leftChannels: Float32Array[],
1157
+ rightChannels: Float32Array[],
1158
+ outLeft: Float32Array,
1159
+ outRight: Float32Array,
1160
+ ) => void;
1161
+ inputLeftView: (index: number) => Float32Array;
1162
+ inputRightView: (index: number) => Float32Array;
1163
+ outputLeftView: () => Float32Array;
1164
+ outputRightView: () => Float32Array;
1165
+ processPreparedStereo: (numSamples: number) => void;
1166
+ stripCount: () => number;
1167
+ scheduleInsertAutomation: (
1168
+ stripIndex: number,
1169
+ insertIndex: number,
1170
+ paramId: number,
1171
+ samplePos: number,
1172
+ value: number,
1173
+ curve: number,
1174
+ ) => void;
1175
+ stripById: (id: string) => number;
1176
+ setSoloed: (stripIndex: number, soloed: boolean) => void;
1177
+ setSoloSafe: (stripIndex: number, soloSafe: boolean) => void;
1178
+ setPolarityInvert: (stripIndex: number, invertLeft: boolean, invertRight: boolean) => void;
1179
+ setPanLaw: (stripIndex: number, panLaw: number) => void;
1180
+ setChannelDelaySamples: (stripIndex: number, delaySamples: number) => void;
1181
+ setVcaOffsetDb: (stripIndex: number, offsetDb: number) => void;
1182
+ setDualPan: (stripIndex: number, leftPan: number, rightPan: number) => void;
1183
+ addSend: (
1184
+ stripIndex: number,
1185
+ id: string,
1186
+ destinationBusId: string,
1187
+ sendDb: number,
1188
+ timing: number,
1189
+ ) => number;
1190
+ setSendDb: (stripIndex: number, sendIndex: number, sendDb: number) => void;
1191
+ meterTap: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
1192
+ stripMeter: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
1193
+ scheduleFaderAutomation: (
1194
+ stripIndex: number,
1195
+ samplePos: number,
1196
+ faderDb: number,
1197
+ curve: number,
1198
+ ) => void;
1199
+ schedulePanAutomation: (
1200
+ stripIndex: number,
1201
+ samplePos: number,
1202
+ pan: number,
1203
+ curve: number,
1204
+ ) => void;
1205
+ scheduleWidthAutomation: (
1206
+ stripIndex: number,
1207
+ samplePos: number,
1208
+ width: number,
1209
+ curve: number,
1210
+ ) => void;
1211
+ scheduleSendAutomation: (
1212
+ stripIndex: number,
1213
+ sendIndex: number,
1214
+ samplePos: number,
1215
+ db: number,
1216
+ curve: number,
1217
+ ) => void;
1218
+ readGoniometerLatest: (stripIndex: number, maxPoints: number) => WasmGoniometerPoint[];
1219
+ addBus: (id: string, role: string) => void;
1220
+ removeBus: (id: string) => void;
1221
+ busCount: () => number;
1222
+ addVcaGroup: (id: string, gainDb: number, members: string[]) => void;
1223
+ removeVcaGroup: (id: string) => void;
1224
+ vcaGroupCount: () => number;
1225
+ toSceneJson: () => string;
1226
+ delete: () => void;
1227
+ }
1228
+
1229
+ interface WasmGoniometerPoint {
1230
+ left: number;
1231
+ right: number;
1232
+ }
1233
+
538
1234
  // Streaming types for StreamAnalyzer
539
1235
  interface WasmChordChange {
540
1236
  root: number;
@@ -566,6 +1262,7 @@ interface WasmProgressiveEstimate {
566
1262
  chordRoot: number;
567
1263
  chordQuality: number;
568
1264
  chordConfidence: number;
1265
+ chordStartTime: number;
569
1266
  chordProgression: WasmChordChange[];
570
1267
  barChordProgression: WasmBarChord[];
571
1268
  currentBar: number;
@@ -601,13 +1298,37 @@ interface WasmFrameBuffer {
601
1298
  chordConfidence: Float32Array;
602
1299
  }
603
1300
 
1301
+ interface WasmStreamFramesU8 {
1302
+ nFrames: number;
1303
+ nMels: number;
1304
+ timestamps: Float32Array;
1305
+ mel: Uint8Array;
1306
+ chroma: Uint8Array;
1307
+ onsetStrength: Uint8Array;
1308
+ rmsEnergy: Uint8Array;
1309
+ spectralCentroid: Uint8Array;
1310
+ spectralFlatness: Uint8Array;
1311
+ }
1312
+
1313
+ interface WasmStreamFramesI16 {
1314
+ nFrames: number;
1315
+ nMels: number;
1316
+ timestamps: Float32Array;
1317
+ mel: Int16Array;
1318
+ chroma: Int16Array;
1319
+ onsetStrength: Int16Array;
1320
+ rmsEnergy: Int16Array;
1321
+ spectralCentroid: Int16Array;
1322
+ spectralFlatness: Int16Array;
1323
+ }
1324
+
604
1325
  interface WasmStreamAnalyzer {
605
1326
  process: (samples: Float32Array) => void;
606
1327
  processWithOffset: (samples: Float32Array, sampleOffset: number) => void;
607
1328
  availableFrames: () => number;
608
1329
  readFramesSoa: (maxFrames: number) => WasmFrameBuffer;
609
- readFramesU8: (maxFrames: number) => unknown;
610
- readFramesI16: (maxFrames: number) => unknown;
1330
+ readFramesU8: (maxFrames: number) => WasmStreamFramesU8;
1331
+ readFramesI16: (maxFrames: number) => WasmStreamFramesI16;
611
1332
  reset: (baseSampleOffset?: number) => void;
612
1333
  stats: () => WasmAnalyzerStats;
613
1334
  frameCount: () => number;