@libraz/libsonare 1.2.2 → 1.3.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 (44) hide show
  1. package/README.md +38 -1
  2. package/dist/index.d.ts +1 -2722
  3. package/dist/index.js +3659 -1896
  4. package/dist/index.js.map +1 -1
  5. package/dist/sonare-rt-module.js +1 -1
  6. package/dist/sonare-rt.js +1 -1
  7. package/dist/sonare-rt.wasm +0 -0
  8. package/dist/sonare.js +1 -1
  9. package/dist/sonare.wasm +0 -0
  10. package/dist/worklet.d.ts +4827 -455
  11. package/dist/worklet.js +1076 -494
  12. package/dist/worklet.js.map +1 -1
  13. package/package.json +2 -1
  14. package/src/analysis_helpers.ts +152 -0
  15. package/src/audio.ts +493 -0
  16. package/src/codes.ts +56 -0
  17. package/src/effects_mastering.ts +964 -0
  18. package/src/feature_core.ts +248 -0
  19. package/src/feature_music.ts +419 -0
  20. package/src/feature_pitch.ts +80 -0
  21. package/src/feature_resample.ts +21 -0
  22. package/src/feature_spectral.ts +330 -0
  23. package/src/feature_spectrogram.ts +454 -0
  24. package/src/features.ts +84 -0
  25. package/src/index.ts +352 -4793
  26. package/src/live_audio.ts +45 -0
  27. package/src/metering.ts +380 -0
  28. package/src/mixer.ts +523 -0
  29. package/src/module_state.ts +14 -0
  30. package/src/opfs_clip_pages.ts +188 -0
  31. package/src/project.ts +1614 -0
  32. package/src/public_types.ts +244 -2
  33. package/src/quick_analysis.ts +508 -0
  34. package/src/realtime_engine.ts +667 -0
  35. package/src/realtime_voice_changer.ts +275 -0
  36. package/src/scale.ts +42 -0
  37. package/src/sonare.js.d.ts +386 -4
  38. package/src/stream_analyzer.ts +275 -0
  39. package/src/stream_types.ts +29 -1
  40. package/src/streaming_mixing.ts +18 -0
  41. package/src/streaming_processors.ts +335 -0
  42. package/src/validation.ts +82 -0
  43. package/src/web_midi.ts +367 -0
  44. package/src/worklet.ts +525 -81
@@ -60,6 +60,8 @@ export interface WasmRealtimeVoiceChangerPodConfig {
60
60
  reverb_seed: number;
61
61
  limiter_ceiling_db: number;
62
62
  limiter_release_ms: number;
63
+ limiter_enable_isp_limiter: boolean;
64
+ limiter_isp_ceiling_dbtp: number;
63
65
  }
64
66
 
65
67
  export interface WasmBeatResult {
@@ -96,6 +98,8 @@ export interface WasmTimbreResult {
96
98
 
97
99
  export interface WasmDynamicsResult {
98
100
  dynamicRangeDb: number;
101
+ peakDb: number;
102
+ rmsDb: number;
99
103
  loudnessRangeDb: number;
100
104
  crestFactor: number;
101
105
  isCompressed: boolean;
@@ -105,6 +109,8 @@ export interface WasmRhythmResult {
105
109
  syncopation: number;
106
110
  grooveType: string;
107
111
  patternRegularity: number;
112
+ tempoStability: number;
113
+ timeSignature: WasmTimeSignatureResult;
108
114
  }
109
115
 
110
116
  export interface WasmTimeSignatureResult {
@@ -113,6 +119,14 @@ export interface WasmTimeSignatureResult {
113
119
  confidence: number;
114
120
  }
115
121
 
122
+ export interface WasmMelodyContourResult {
123
+ pitchRangeOctaves: number;
124
+ pitchStability: number;
125
+ meanFrequency: number;
126
+ vibratoRate: number;
127
+ pitches: WasmMelodyPoint[];
128
+ }
129
+
116
130
  export interface WasmAnalysisResult {
117
131
  bpm: number;
118
132
  bpmConfidence: number;
@@ -124,6 +138,7 @@ export interface WasmAnalysisResult {
124
138
  timbre: WasmTimbreResult;
125
139
  dynamics: WasmDynamicsResult;
126
140
  rhythm: WasmRhythmResult;
141
+ melody: WasmMelodyContourResult;
127
142
  form: string;
128
143
  }
129
144
 
@@ -161,6 +176,27 @@ export interface WasmDynamicsAnalysisResult {
161
176
  loudnessRmsDb: Float32Array;
162
177
  }
163
178
 
179
+ export interface WasmStreamConfigDefaults {
180
+ sampleRate: number;
181
+ nFft: number;
182
+ hopLength: number;
183
+ nMels: number;
184
+ fmin: number;
185
+ fmax: number;
186
+ tuningRefHz: number;
187
+ computeMagnitude: boolean;
188
+ computeMel: boolean;
189
+ computeChroma: boolean;
190
+ computeOnset: boolean;
191
+ computeSpectral: boolean;
192
+ emitEveryNFrames: number;
193
+ magnitudeDownsample: number;
194
+ keyUpdateIntervalSec: number;
195
+ bpmUpdateIntervalSec: number;
196
+ window: number;
197
+ outputFormat: number;
198
+ }
199
+
164
200
  export interface WasmTimbreFrameResult {
165
201
  brightness: number;
166
202
  warmth: number;
@@ -199,12 +235,76 @@ export interface WasmAcousticResult {
199
235
  isBlind: boolean;
200
236
  }
201
237
 
238
+ export interface WasmRoomGeometryOptions {
239
+ lengthM?: number;
240
+ widthM?: number;
241
+ heightM?: number;
242
+ absorption?: number;
243
+ materialPreset?: number;
244
+ bandAbsorption?: Float32Array | number[];
245
+ bandScattering?: Float32Array | number[];
246
+ sourceX?: number;
247
+ sourceY?: number;
248
+ sourceZ?: number;
249
+ listenerX?: number;
250
+ listenerY?: number;
251
+ listenerZ?: number;
252
+ ismOrder?: number;
253
+ seed?: number;
254
+ maxSeconds?: number;
255
+ }
256
+
257
+ export interface WasmRirSynthOptions extends WasmRoomGeometryOptions {
258
+ sampleRate?: number;
259
+ preferEyring?: boolean;
260
+ mixingTimeMs?: number;
261
+ crossfadeMs?: number;
262
+ }
263
+
264
+ export interface WasmRirResult {
265
+ rir: Float32Array;
266
+ sampleRate: number;
267
+ hasError: boolean;
268
+ }
269
+
270
+ export interface WasmRoomEstimateOptions {
271
+ aspectHintLw?: number;
272
+ aspectHintLh?: number;
273
+ referenceAbsorption?: number;
274
+ preferEyring?: boolean;
275
+ nOctaveBands?: number;
276
+ mode?: number;
277
+ minDecayDb?: number;
278
+ noiseFloorMarginDb?: number;
279
+ }
280
+
281
+ export interface WasmRoomEstimateResult {
282
+ volume: number;
283
+ length: number;
284
+ width: number;
285
+ height: number;
286
+ drrDb: number;
287
+ confidence: number;
288
+ absorptionBands: Float32Array;
289
+ rt60Bands: Float32Array;
290
+ }
291
+
292
+ export interface WasmRoomMorphOptions extends WasmRoomGeometryOptions {
293
+ wet?: number;
294
+ sourceTailSuppression?: number;
295
+ }
296
+
202
297
  export interface WasmHpssResult {
203
298
  harmonic: Float32Array;
204
299
  percussive: Float32Array;
205
300
  sampleRate: number;
206
301
  }
207
302
 
303
+ export interface WasmAudioFromMemoryResult {
304
+ samples: Float32Array;
305
+ sampleRate: number;
306
+ }
307
+
208
308
  export interface WasmHpssWithResidualResult {
209
309
  harmonic: Float32Array;
210
310
  percussive: Float32Array;
@@ -314,6 +414,12 @@ export interface WasmFourierTempogramResult {
314
414
  data: Float32Array;
315
415
  }
316
416
 
417
+ export interface WasmOnsetStrengthMultiResult {
418
+ nBands: number;
419
+ nFrames: number;
420
+ data: Float32Array;
421
+ }
422
+
317
423
  export interface WasmNnlsChromaResult {
318
424
  nChroma: number;
319
425
  nFrames: number;
@@ -412,7 +518,7 @@ export interface WasmMixResult {
412
518
 
413
519
  export interface WasmEngineClip {
414
520
  id?: number;
415
- channels: Float32Array[];
521
+ channels?: Float32Array[];
416
522
  startPpq: number;
417
523
  lengthSamples?: number;
418
524
  clipOffsetSamples?: number;
@@ -420,6 +526,15 @@ export interface WasmEngineClip {
420
526
  gain?: number;
421
527
  fadeInSamples?: number;
422
528
  fadeOutSamples?: number;
529
+ warpMode?: 'off' | 'repitch' | 'tempo-sync' | 0 | 1 | 2;
530
+ warpAnchors?: Array<{ warpSample: number; sourceSample: number }>;
531
+ pageProvider?: number | { readonly id: number };
532
+ }
533
+
534
+ export interface WasmClipPageRequest {
535
+ clipId: number;
536
+ channel: number;
537
+ sample: number;
423
538
  }
424
539
 
425
540
  export interface WasmEngineParameterInfo {
@@ -450,6 +565,8 @@ export interface WasmEngineMetronomeConfig {
450
565
  beatGain?: number;
451
566
  accentGain?: number;
452
567
  clickSamples?: number;
568
+ /** Optional click length in seconds; > 0 overrides the engine 2 ms default. */
569
+ clickSeconds?: number;
453
570
  }
454
571
 
455
572
  export interface WasmEngineGraphNode {
@@ -516,6 +633,8 @@ export interface WasmEngineCaptureStatus {
516
633
  overflowCount: number;
517
634
  armed: boolean;
518
635
  punchEnabled: boolean;
636
+ source: 'output' | 'input';
637
+ recordOffsetSamples: number;
519
638
  }
520
639
 
521
640
  export interface WasmEngineTransportState {
@@ -528,6 +647,12 @@ export interface WasmEngineTransportState {
528
647
  loopStartPpq: number;
529
648
  loopEndPpq: number;
530
649
  sampleRate: number;
650
+ /** PPQ of the current bar's downbeat (derived from the tempo map). */
651
+ barStartPpq: number;
652
+ /** Zero-based index of the current bar. */
653
+ barCount: number;
654
+ /** Time signature in effect at the current PPQ. */
655
+ timeSignature: { numerator: number; denominator: number; confidence: number };
531
656
  }
532
657
 
533
658
  export interface WasmEngineBounceOptions {
@@ -608,13 +733,85 @@ export interface WasmRealtimeEngine {
608
733
  graphConnectionCount: () => number;
609
734
  setClips: (clips: WasmEngineClip[]) => void;
610
735
  clipCount: () => number;
736
+ createClipPageProvider: (numChannels: number, numSamples: number, pageFrames: number) => number;
737
+ supplyClipPage: (providerId: number, pageIndex: number, channels: Float32Array[]) => void;
738
+ clearClipPage: (providerId: number, pageIndex: number) => void;
739
+ destroyClipPageProvider: (providerId: number) => void;
740
+ popClipPageRequest: () => WasmClipPageRequest | null;
611
741
  setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
612
742
  armCapture: (armed: boolean) => void;
613
743
  setCapturePunch: (startSample: number, endSample: number, enabled: boolean) => void;
744
+ setCaptureSource: (source: WasmEngineCaptureStatus['source']) => void;
745
+ setRecordOffsetSamples: (offsetSamples: number) => void;
746
+ setInputMonitor: (enabled: boolean, gain: number) => void;
614
747
  resetCapture: () => void;
615
748
  captureStatus: () => WasmEngineCaptureStatus;
616
749
  capturedAudio: () => Float32Array[];
750
+ setBuiltinInstrument: (destinationId: number, config: object) => void;
751
+ clearMidiInstrument: (destinationId: number) => void;
752
+ midiInstrumentCount: () => number;
753
+ bindMidiCc: (
754
+ channel: number,
755
+ controller: number,
756
+ paramId: number,
757
+ minValue: number,
758
+ maxValue: number,
759
+ ) => void;
760
+ clearMidiCcBindings: () => void;
761
+ midiCcBindingCount: () => number;
762
+ setMidiInputSource: (destinationId: number) => void;
763
+ clearMidiInputSource: () => void;
764
+ midiInputPendingCount: () => number;
765
+ pushMidiInputNoteOn: (
766
+ group: number,
767
+ channel: number,
768
+ note: number,
769
+ velocity: number,
770
+ portTimeSamples: number,
771
+ ) => void;
772
+ pushMidiInputNoteOff: (
773
+ group: number,
774
+ channel: number,
775
+ note: number,
776
+ velocity: number,
777
+ portTimeSamples: number,
778
+ ) => void;
779
+ pushMidiInputCc: (
780
+ group: number,
781
+ channel: number,
782
+ controller: number,
783
+ value: number,
784
+ portTimeSamples: number,
785
+ ) => void;
786
+ pushMidiNoteOn: (
787
+ destinationId: number,
788
+ group: number,
789
+ channel: number,
790
+ note: number,
791
+ velocity: number,
792
+ renderFrame: number,
793
+ ) => void;
794
+ pushMidiNoteOff: (
795
+ destinationId: number,
796
+ group: number,
797
+ channel: number,
798
+ note: number,
799
+ velocity: number,
800
+ renderFrame: number,
801
+ ) => void;
802
+ pushMidiCc: (
803
+ destinationId: number,
804
+ group: number,
805
+ channel: number,
806
+ controller: number,
807
+ value: number,
808
+ renderFrame: number,
809
+ ) => void;
810
+ pushMidiPanic: (renderFrame: number) => void;
617
811
  process: (channels: Float32Array[]) => Float32Array[];
812
+ prepareChannels: (numChannels: number, maxFrames: number) => void;
813
+ getChannelBuffer: (channel: number, numFrames: number) => Float32Array;
814
+ processPrepared: (numFrames: number) => void;
618
815
  processWithMonitor: (channels: Float32Array[]) => WasmEngineProcessWithMonitorResult;
619
816
  renderOffline: (channels: Float32Array[], blockSize: number) => Float32Array[];
620
817
  bounceOffline: (options: WasmEngineBounceOptions) => WasmEngineBounceResult;
@@ -627,7 +824,19 @@ export interface WasmRealtimeEngine {
627
824
  export type ProgressCallback = (progress: number, stage: string) => void;
628
825
  export type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
629
826
 
827
+ export interface WasmSynthEnumTables {
828
+ engineModes: string[];
829
+ waveforms: string[];
830
+ filterModels: string[];
831
+ filterOutputs: string[];
832
+ bodyTypes: string[];
833
+ modSources: string[];
834
+ modDestinations: string[];
835
+ }
836
+
630
837
  export interface SonareModule {
838
+ audioFromMemory: (bytes: Uint8Array) => WasmAudioFromMemoryResult;
839
+
631
840
  // Quick API (high-level)
632
841
  detectBpm: (samples: Float32Array, sampleRate: number) => number;
633
842
  detectKey: (samples: Float32Array, sampleRate: number) => WasmKeyResult;
@@ -676,7 +885,29 @@ export interface SonareModule {
676
885
  detectInversions: boolean,
677
886
  chromaMethod: number,
678
887
  ) => WasmChordAnalysisResult;
888
+ chordFunctionalAnalysis: (
889
+ samples: Float32Array,
890
+ keyRoot: number,
891
+ keyMode: number,
892
+ sampleRate: number,
893
+ minDuration: number,
894
+ smoothingWindow: number,
895
+ threshold: number,
896
+ useTriadsOnly: boolean,
897
+ nFft: number,
898
+ hopLength: number,
899
+ useBeatSync: boolean,
900
+ useHmm: boolean,
901
+ hmmBeamWidth: number,
902
+ useKeyContext: boolean,
903
+ detectInversions: boolean,
904
+ chromaMethod: number,
905
+ ) => string[];
679
906
  analyze: (samples: Float32Array, sampleRate: number) => WasmAnalysisResult;
907
+ _synthEnumTables: () => WasmSynthEnumTables;
908
+ _synthPatchRoundTrip: (patch: unknown) => unknown;
909
+ _analysisResultSchemaPaths: () => string[];
910
+ _analysisResultSchemaFixture: () => WasmAnalysisResult;
680
911
  analyzeImpulseResponse: (
681
912
  samples: Float32Array,
682
913
  sampleRate: number,
@@ -690,6 +921,19 @@ export interface SonareModule {
690
921
  minDecayDb: number,
691
922
  noiseFloorMarginDb: number,
692
923
  ) => WasmAcousticResult;
924
+ // Acoustic-simulation entry points are present only in builds compiled with
925
+ // SONARE_WITH_ACOUSTIC_SIM; absent otherwise (the wrappers throw a clear error).
926
+ synthesizeRir?: (options: WasmRirSynthOptions) => WasmRirResult;
927
+ estimateRoom?: (
928
+ samples: Float32Array,
929
+ sampleRate: number,
930
+ options: WasmRoomEstimateOptions,
931
+ ) => WasmRoomEstimateResult;
932
+ roomMorph?: (
933
+ samples: Float32Array,
934
+ sampleRate: number,
935
+ options: WasmRoomMorphOptions,
936
+ ) => Float32Array;
693
937
  analyzeWithProgress: (
694
938
  samples: Float32Array,
695
939
  sampleRate: number,
@@ -783,6 +1027,12 @@ export interface SonareModule {
783
1027
  right: Float32Array,
784
1028
  sampleRate: number,
785
1029
  ) => { mid: Float32Array; side: Float32Array };
1030
+ meteringVectorscopeDecimated: (
1031
+ left: Float32Array,
1032
+ right: Float32Array,
1033
+ sampleRate: number,
1034
+ maxPoints: number,
1035
+ ) => { mid: Float32Array; side: Float32Array };
786
1036
  meteringPhaseScope: (
787
1037
  left: Float32Array,
788
1038
  right: Float32Array,
@@ -796,6 +1046,20 @@ export interface SonareModule {
796
1046
  averageAbsAngleRad: number;
797
1047
  maxRadius: number;
798
1048
  };
1049
+ meteringPhaseScopeDecimated: (
1050
+ left: Float32Array,
1051
+ right: Float32Array,
1052
+ sampleRate: number,
1053
+ maxPoints: number,
1054
+ ) => {
1055
+ mid: Float32Array;
1056
+ side: Float32Array;
1057
+ radius: Float32Array;
1058
+ angleRad: Float32Array;
1059
+ correlation: number;
1060
+ averageAbsAngleRad: number;
1061
+ maxRadius: number;
1062
+ };
799
1063
  meteringSpectrum: (
800
1064
  samples: Float32Array,
801
1065
  sampleRate: number,
@@ -814,6 +1078,47 @@ export interface SonareModule {
814
1078
  nFft: number;
815
1079
  sampleRate: number;
816
1080
  };
1081
+ meteringSpectrumFrame: (
1082
+ samples: Float32Array,
1083
+ sampleRate: number,
1084
+ frameOffset: number,
1085
+ options: {
1086
+ nFft?: number;
1087
+ applyOctaveSmoothing?: boolean;
1088
+ octaveFraction?: number;
1089
+ dbRef?: number;
1090
+ dbAmin?: number;
1091
+ },
1092
+ ) => {
1093
+ frequencies: Float32Array;
1094
+ magnitude: Float32Array;
1095
+ power: Float32Array;
1096
+ db: Float32Array;
1097
+ nFft: number;
1098
+ sampleRate: number;
1099
+ };
1100
+ waveformPeaks: (
1101
+ samples: Float32Array,
1102
+ channels: number,
1103
+ samplesPerBucket: number,
1104
+ ) => {
1105
+ min: Float32Array;
1106
+ max: Float32Array;
1107
+ channels: number;
1108
+ bucketCount: number;
1109
+ samplesPerBucket: number;
1110
+ };
1111
+ waveformPeakPyramid: (
1112
+ samples: Float32Array,
1113
+ channels: number,
1114
+ samplesPerBucketLevels: number[],
1115
+ ) => Array<{
1116
+ min: Float32Array;
1117
+ max: Float32Array;
1118
+ channels: number;
1119
+ bucketCount: number;
1120
+ samplesPerBucket: number;
1121
+ }>;
817
1122
 
818
1123
  scaleQuantizeMidi: (
819
1124
  root: number,
@@ -850,6 +1155,15 @@ export interface SonareModule {
850
1155
  nIter: number,
851
1156
  beta: number,
852
1157
  ) => WasmDecomposeResult;
1158
+ decomposeWithInit: (
1159
+ s: Float32Array,
1160
+ nFeatures: number,
1161
+ nFrames: number,
1162
+ nComponents: number,
1163
+ nIter: number,
1164
+ beta: number,
1165
+ init: string,
1166
+ ) => WasmDecomposeResult;
853
1167
  nnFilter: (
854
1168
  s: Float32Array,
855
1169
  nFeatures: number,
@@ -881,6 +1195,15 @@ export interface SonareModule {
881
1195
  currentMidi: number,
882
1196
  targetMidi: number,
883
1197
  ) => Float32Array;
1198
+ pitchCorrectToMidiTimevarying: (
1199
+ samples: Float32Array,
1200
+ sampleRate: number,
1201
+ f0Hz: Float32Array,
1202
+ targetMidi: number,
1203
+ hopLength: number,
1204
+ voiced?: Float32Array,
1205
+ voicedProb?: Float32Array,
1206
+ ) => Float32Array;
884
1207
  noteStretch: (
885
1208
  samples: Float32Array,
886
1209
  sampleRate: number,
@@ -1089,6 +1412,9 @@ export interface SonareModule {
1089
1412
  nFft: number,
1090
1413
  hopLength: number,
1091
1414
  nMels: number,
1415
+ fmin: number,
1416
+ fmax: number,
1417
+ htk: boolean,
1092
1418
  ) => WasmMelResult;
1093
1419
  mfcc: (
1094
1420
  samples: Float32Array,
@@ -1097,6 +1423,9 @@ export interface SonareModule {
1097
1423
  hopLength: number,
1098
1424
  nMels: number,
1099
1425
  nMfcc: number,
1426
+ fmin: number,
1427
+ fmax: number,
1428
+ htk: boolean,
1100
1429
  ) => WasmMfccResult;
1101
1430
 
1102
1431
  // Features - Inverse reconstruction
@@ -1108,6 +1437,7 @@ export interface SonareModule {
1108
1437
  nFft: number,
1109
1438
  fmin: number,
1110
1439
  fmax: number,
1440
+ htk: boolean,
1111
1441
  ) => WasmStftPowerResult;
1112
1442
  melToAudio: (
1113
1443
  melPower: Float32Array,
@@ -1119,6 +1449,7 @@ export interface SonareModule {
1119
1449
  fmin: number,
1120
1450
  fmax: number,
1121
1451
  nIter: number,
1452
+ htk: boolean,
1122
1453
  ) => Float32Array;
1123
1454
  mfccToMel: (
1124
1455
  mfcc: Float32Array,
@@ -1137,6 +1468,7 @@ export interface SonareModule {
1137
1468
  fmin: number,
1138
1469
  fmax: number,
1139
1470
  nIter: number,
1471
+ htk: boolean,
1140
1472
  ) => Float32Array;
1141
1473
 
1142
1474
  // Features - Chroma
@@ -1313,6 +1645,18 @@ export interface SonareModule {
1313
1645
  tempoMax: number,
1314
1646
  winLength: number,
1315
1647
  ) => Float32Array;
1648
+ chromaCens: (
1649
+ samples: Float32Array,
1650
+ sampleRate: number,
1651
+ hopLength: number,
1652
+ nChroma: number,
1653
+ ) => WasmChromaResult;
1654
+ bassChroma: (
1655
+ samples: Float32Array,
1656
+ sampleRate: number,
1657
+ hopLength: number,
1658
+ nChroma: number,
1659
+ ) => WasmChromaResult;
1316
1660
  nnlsChroma: (samples: Float32Array, sampleRate: number) => WasmNnlsChromaResult;
1317
1661
  cqt: (
1318
1662
  samples: Float32Array,
@@ -1322,6 +1666,22 @@ export interface SonareModule {
1322
1666
  nBins: number,
1323
1667
  binsPerOctave: number,
1324
1668
  ) => WasmCqtResult;
1669
+ pseudoCqt: (
1670
+ samples: Float32Array,
1671
+ sampleRate: number,
1672
+ hopLength: number,
1673
+ fmin: number,
1674
+ nBins: number,
1675
+ binsPerOctave: number,
1676
+ ) => WasmCqtResult;
1677
+ hybridCqt: (
1678
+ samples: Float32Array,
1679
+ sampleRate: number,
1680
+ hopLength: number,
1681
+ fmin: number,
1682
+ nBins: number,
1683
+ binsPerOctave: number,
1684
+ ) => WasmCqtResult;
1325
1685
  vqt: (
1326
1686
  samples: Float32Array,
1327
1687
  sampleRate: number,
@@ -1346,6 +1706,8 @@ export interface SonareModule {
1346
1706
  frameLength: number,
1347
1707
  hopLength: number,
1348
1708
  threshold: number,
1709
+ usePyin: boolean,
1710
+ center: boolean,
1349
1711
  ) => WasmMelodyResult;
1350
1712
  onsetEnvelope: (
1351
1713
  samples: Float32Array,
@@ -1354,6 +1716,14 @@ export interface SonareModule {
1354
1716
  hopLength: number,
1355
1717
  nMels: number,
1356
1718
  ) => Float32Array;
1719
+ onsetStrengthMulti: (
1720
+ samples: Float32Array,
1721
+ sampleRate: number,
1722
+ nFft: number,
1723
+ hopLength: number,
1724
+ nMels: number,
1725
+ nBands: number,
1726
+ ) => WasmOnsetStrengthMultiResult;
1357
1727
  fourierTempogram: (
1358
1728
  onsetEnvelope: Float32Array,
1359
1729
  sampleRate: number,
@@ -1425,6 +1795,7 @@ export interface SonareModule {
1425
1795
  };
1426
1796
 
1427
1797
  // Streaming - StreamAnalyzer
1798
+ streamAnalyzerConfigDefault: () => WasmStreamConfigDefaults;
1428
1799
  StreamAnalyzer: new (
1429
1800
  sampleRate: number,
1430
1801
  nFft: number,
@@ -1605,8 +1976,9 @@ export interface WasmMixer {
1605
1976
  timing: number,
1606
1977
  ) => number;
1607
1978
  setSendDb: (stripIndex: number, sendIndex: number, sendDb: number) => void;
1979
+ removeSend: (stripIndex: number, sendIndex: number) => void;
1608
1980
  meterTap: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
1609
- stripMeter: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
1981
+ stripMeter: (stripIndex: number) => WasmMixMeterSnapshot;
1610
1982
  scheduleFaderAutomation: (
1611
1983
  stripIndex: number,
1612
1984
  samplePos: number,
@@ -1637,9 +2009,16 @@ export interface WasmMixer {
1637
2009
  removeBus: (id: string) => void;
1638
2010
  busCount: () => number;
1639
2011
  addVcaGroup: (id: string, gainDb: number, members: string[]) => void;
2012
+ setVcaGroupGainDb: (id: string, gainDb: number) => void;
1640
2013
  removeVcaGroup: (id: string) => void;
1641
2014
  vcaGroupCount: () => number;
1642
2015
  toSceneJson: () => string;
2016
+ tailSamples: () => number;
2017
+ drainTailStereo: (numSamples: number) => {
2018
+ left: Float32Array;
2019
+ right: Float32Array;
2020
+ sampleRate: number;
2021
+ };
1643
2022
  delete: () => void;
1644
2023
  }
1645
2024
 
@@ -1703,6 +2082,8 @@ export interface WasmAnalyzerStats {
1703
2082
 
1704
2083
  export interface WasmFrameBuffer {
1705
2084
  nFrames: number;
2085
+ /** Number of mel bands; flat `mel` is `[nFrames * nMels]` row-major. */
2086
+ nMels: number;
1706
2087
  timestamps: Float32Array;
1707
2088
  mel: Float32Array;
1708
2089
  chroma: Float32Array;
@@ -1742,10 +2123,11 @@ export interface WasmStreamFramesI16 {
1742
2123
  export interface WasmStreamAnalyzer {
1743
2124
  process: (samples: Float32Array) => void;
1744
2125
  processWithOffset: (samples: Float32Array, sampleOffset: number) => void;
2126
+ finalize: () => void;
1745
2127
  availableFrames: () => number;
1746
2128
  readFramesSoa: (maxFrames: number) => WasmFrameBuffer;
1747
- readFramesU8: (maxFrames: number) => WasmStreamFramesU8;
1748
- readFramesI16: (maxFrames: number) => WasmStreamFramesI16;
2129
+ readFramesU8: (maxFrames: number, quantizeConfig?: unknown) => WasmStreamFramesU8;
2130
+ readFramesI16: (maxFrames: number, quantizeConfig?: unknown) => WasmStreamFramesI16;
1749
2131
  reset: (baseSampleOffset?: number) => void;
1750
2132
  stats: () => WasmAnalyzerStats;
1751
2133
  frameCount: () => number;