@libraz/libsonare 1.5.5 → 1.7.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 (80) hide show
  1. package/README.md +109 -20
  2. package/dist/analysis.d.ts +5809 -0
  3. package/dist/analysis.js +2574 -0
  4. package/dist/analysis.js.map +1 -0
  5. package/dist/index.d.ts +884 -55
  6. package/dist/index.js +1302 -292
  7. package/dist/index.js.map +1 -1
  8. package/dist/schemas/realtime-voice-changer-preset-pack.schema.json +27 -0
  9. package/dist/schemas/realtime-voice-changer-preset.schema.json +140 -0
  10. package/dist/sonare-analysis.js +2 -0
  11. package/dist/sonare-analysis.wasm +0 -0
  12. package/dist/sonare.js +1 -1
  13. package/dist/sonare.wasm +0 -0
  14. package/dist/worker.d.ts +65 -0
  15. package/dist/worker.js +734 -0
  16. package/dist/worker.js.map +1 -0
  17. package/dist/worklet.d.ts +628 -88
  18. package/dist/worklet.js +1816 -266
  19. package/dist/worklet.js.map +1 -1
  20. package/package.json +23 -11
  21. package/src/_chain_config.ts +5 -3
  22. package/src/analysis.ts +137 -0
  23. package/src/analysis_helpers.ts +40 -29
  24. package/src/audio.ts +7 -2
  25. package/src/clip_page_streamer.ts +62 -8
  26. package/src/codes.ts +87 -64
  27. package/src/effects_mastering.ts +1 -0
  28. package/src/effects_transform.ts +179 -10
  29. package/src/errors.ts +1 -0
  30. package/src/feature_core.ts +140 -2
  31. package/src/feature_music.ts +25 -3
  32. package/src/feature_pitch.ts +70 -1
  33. package/src/feature_spectral.ts +295 -7
  34. package/src/feature_spectrogram.ts +203 -3
  35. package/src/features.ts +16 -1
  36. package/src/index.ts +120 -8
  37. package/src/mastering_chain.ts +20 -8
  38. package/src/mastering_core.ts +5 -0
  39. package/src/mastering_dynamics.ts +7 -1
  40. package/src/metering.ts +6 -1
  41. package/src/mixer.ts +3 -3
  42. package/src/opfs_clip_pages.ts +26 -1
  43. package/src/project.ts +13 -0
  44. package/src/project_class.ts +204 -23
  45. package/src/project_internal.ts +38 -34
  46. package/src/project_types.ts +114 -11
  47. package/src/public_types.ts +68 -0
  48. package/src/public_types_mastering.ts +22 -0
  49. package/src/public_types_mixing.ts +27 -2
  50. package/src/public_types_music.ts +9 -0
  51. package/src/public_types_realtime.ts +23 -5
  52. package/src/public_types_spectral.ts +33 -0
  53. package/src/quick_analysis.ts +46 -10
  54. package/src/realtime_engine.ts +167 -6
  55. package/src/realtime_voice_changer.ts +51 -77
  56. package/src/sonare-analysis.js.d.ts +8 -0
  57. package/src/sonare.js.d.ts +340 -6
  58. package/src/stream_analyzer.ts +6 -1
  59. package/src/streaming_processors.ts +15 -0
  60. package/src/web_midi.ts +46 -11
  61. package/src/worker.ts +196 -0
  62. package/src/worker_client.ts +352 -0
  63. package/src/worker_protocol.ts +59 -0
  64. package/src/worklet/engine-automation.ts +2 -1
  65. package/src/worklet/engine-capture-facade.ts +13 -4
  66. package/src/worklet/engine-clips.ts +12 -3
  67. package/src/worklet/engine-node.ts +264 -21
  68. package/src/worklet/engine-offline.ts +7 -2
  69. package/src/worklet/engine-parameter-facade.ts +55 -5
  70. package/src/worklet/engine-processor.ts +435 -62
  71. package/src/worklet/engine-register.ts +9 -1
  72. package/src/worklet/engine-strips.ts +19 -3
  73. package/src/worklet/engine-sync.ts +2 -6
  74. package/src/worklet/engine-tempo-facade.ts +8 -6
  75. package/src/worklet/engine.ts +390 -13
  76. package/src/worklet/guards.ts +121 -8
  77. package/src/worklet/messages.ts +166 -8
  78. package/src/worklet/protocol.ts +305 -17
  79. package/src/worklet/voice-changer-processor.ts +12 -15
  80. package/src/worklet.ts +20 -1
@@ -2,7 +2,12 @@
2
2
  * Type declarations for the Emscripten-generated WASM module with embind
3
3
  */
4
4
 
5
- import type { SpectralRegionOp, SurroundPan } from './public_types';
5
+ import type {
6
+ ProgressCallback,
7
+ SonareCapabilities,
8
+ SpectralRegionOp,
9
+ SurroundPan,
10
+ } from './public_types';
6
11
 
7
12
  export interface SonareModuleOptions {
8
13
  locateFile?: (path: string, prefix: string) => string;
@@ -133,8 +138,10 @@ export interface WasmMelodyContourResult {
133
138
  export interface WasmAnalysisResult {
134
139
  bpm: number;
135
140
  bpmConfidence: number;
141
+ bpmCandidates: WasmBpmHypothesis[];
136
142
  key: WasmKeyResult;
137
143
  timeSignature: WasmTimeSignatureResult;
144
+ timeSignatureCandidates: WasmTimeSignatureResult[];
138
145
  beats: WasmBeatResult[];
139
146
  chords: WasmChordResult[];
140
147
  sections: WasmSectionResult[];
@@ -145,6 +152,12 @@ export interface WasmAnalysisResult {
145
152
  form: string;
146
153
  }
147
154
 
155
+ export interface WasmBpmHypothesis {
156
+ value: number;
157
+ confidence: number;
158
+ relation: 'primary' | 'half' | 'double' | 'other';
159
+ }
160
+
148
161
  export interface WasmBpmCandidate {
149
162
  bpm: number;
150
163
  confidence: number;
@@ -324,6 +337,12 @@ export interface WasmMatrix2dResult {
324
337
  cols: number;
325
338
  }
326
339
 
340
+ export interface WasmSegmentMatrixResult {
341
+ rows: number;
342
+ cols: number;
343
+ values: Float32Array;
344
+ }
345
+
327
346
  export interface WasmDecomposeResult {
328
347
  w: Float32Array;
329
348
  h: Float32Array;
@@ -390,6 +409,14 @@ export interface WasmPitchResult {
390
409
  meanF0: number;
391
410
  }
392
411
 
412
+ export interface WasmNoteSegment {
413
+ frameStart: number;
414
+ frameEnd: number;
415
+ startSeconds: number;
416
+ endSeconds: number;
417
+ medianCents: number;
418
+ }
419
+
393
420
  export interface WasmTrimResult {
394
421
  audio: Float32Array;
395
422
  startSample: number;
@@ -478,12 +505,30 @@ export interface WasmStageGainReduction {
478
505
  gainReductionDb: number;
479
506
  }
480
507
 
508
+ export interface WasmMasteringLoudnessSummary {
509
+ integratedLufs: number;
510
+ maxMomentaryLufs: number;
511
+ maxShortTermLufs: number;
512
+ truePeakDbtp: number;
513
+ loudnessRange: number;
514
+ }
515
+
516
+ export interface WasmMasteringReport {
517
+ before: WasmMasteringLoudnessSummary;
518
+ after: WasmMasteringLoudnessSummary;
519
+ appliedGainDb: number;
520
+ maxGainReductionDb: number;
521
+ loudnessTargetLimited: boolean;
522
+ bandEnergyDeltaDb: Float32Array;
523
+ }
524
+
481
525
  export interface WasmMasteringChainResult extends WasmMasteringResult {
482
526
  stages: string[];
483
527
  outputTruePeakDbtp: number;
484
528
  outputLra: number;
485
529
  loudnessTargetLimited: boolean;
486
530
  stageGainReductions: WasmStageGainReduction[];
531
+ report: WasmMasteringReport;
487
532
  }
488
533
 
489
534
  export interface WasmMasteringStereoChainResult {
@@ -498,6 +543,7 @@ export interface WasmMasteringStereoChainResult {
498
543
  outputLra: number;
499
544
  loudnessTargetLimited: boolean;
500
545
  stageGainReductions: WasmStageGainReduction[];
546
+ report: WasmMasteringReport;
501
547
  }
502
548
 
503
549
  export interface WasmMasteringStereoResult {
@@ -624,6 +670,40 @@ export interface WasmProjectMarker {
624
670
  keyFifths?: number;
625
671
  keyMinor?: boolean;
626
672
  }
673
+ export interface WasmProjectTrack {
674
+ id: number;
675
+ kind: number;
676
+ midiDestinationId: number;
677
+ gain: number;
678
+ pan: number;
679
+ mute: boolean;
680
+ solo: boolean;
681
+ name: string;
682
+ }
683
+ export interface WasmProjectClip {
684
+ id: number;
685
+ trackId: number;
686
+ sourceId: number;
687
+ sourceKind: number;
688
+ startPpq: number;
689
+ lengthPpq: number;
690
+ sourceOffsetPpq: number;
691
+ gain: number;
692
+ loopMode: number;
693
+ loopLengthPpq: number;
694
+ }
695
+ export interface WasmProjectSource {
696
+ id: number;
697
+ kind: number;
698
+ channelCount: number;
699
+ storageHandleId: number;
700
+ sampleRateHint: number;
701
+ nameOrUri: string;
702
+ /** Owning content hash for audio sources; empty for MIDI sources. */
703
+ contentHash: string;
704
+ /** External source-separation role for audio sources; empty for MIDI sources. */
705
+ externalStemRole: string;
706
+ }
627
707
 
628
708
  export interface WasmEngineMetronomeConfig {
629
709
  enabled: boolean;
@@ -838,11 +918,13 @@ export interface WasmRealtimeEngine {
838
918
  setParameterSmoothed: (paramId: number, value: number, renderFrame: number) => void;
839
919
  setParamSmoothingMs: (smoothingMs: number) => void;
840
920
  setSoloMute: (laneIndex: number, solo: boolean, mute: boolean, renderFrame: number) => void;
921
+ setTrackMonitorMode: (laneIndex: number, mode: number, renderFrame: number) => void;
841
922
  getTransportState: () => WasmEngineTransportState;
842
923
  play: (renderFrame: number) => void;
843
924
  stop: (renderFrame: number) => void;
844
925
  seekSample: (timelineSample: number, renderFrame: number) => void;
845
926
  settleParameters: () => void;
927
+ flushControlCommands: () => void;
846
928
  seekPpq: (ppq: number, renderFrame: number) => void;
847
929
  setTempo: (bpm: number) => void;
848
930
  setTempoSegments: (segments: WasmEngineTempoSegment[]) => void;
@@ -926,10 +1008,14 @@ export interface WasmRealtimeEngine {
926
1008
  clearClipPage: (providerId: number, pageIndex: number) => void;
927
1009
  destroyClipPageProvider: (providerId: number) => void;
928
1010
  popClipPageRequest: () => WasmClipPageRequest | null;
1011
+ popClipPageRequestToScratch: () => boolean;
1012
+ clipPageRequestScratchClipId: () => number;
1013
+ clipPageRequestScratchSample: () => number;
1014
+ clipPageRequestOverflowCount: () => number;
929
1015
  setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
930
1016
  armCapture: (armed: boolean) => void;
931
1017
  setCapturePunch: (startSample: number, endSample: number, enabled: boolean) => void;
932
- setCaptureSource: (source: WasmEngineCaptureStatus['source']) => void;
1018
+ setCaptureSource: (source: WasmEngineCaptureStatus['source'] | number) => void;
933
1019
  setRecordOffsetSamples: (offsetSamples: number) => void;
934
1020
  setInputMonitor: (enabled: boolean, gain: number) => void;
935
1021
  resetCapture: () => void;
@@ -1002,14 +1088,29 @@ export interface WasmRealtimeEngine {
1002
1088
  value: number,
1003
1089
  renderFrame: number,
1004
1090
  ) => void;
1091
+ pushMidiUmp: (destinationId: number, word0: number, renderFrame: number) => void;
1005
1092
  pushMidiSysex: (destinationId: number, data: Uint8Array, renderFrame: number) => void;
1006
1093
  pushMidiPanic: (renderFrame: number) => void;
1007
1094
  setMidiDestinationExternal: (destinationId: number, external: boolean) => void;
1008
1095
  setExternalMidiClockEnabled: (enabled: boolean) => void;
1009
1096
  externalMidiDroppedCount: () => number;
1097
+ externalMidiPendingCount: () => number;
1010
1098
  drainExternalMidi: (maxRecords: number) => WasmExternalMidiEvent[];
1099
+ popExternalMidiToScratch: () => boolean;
1100
+ externalMidiScratchDestinationId: () => number;
1101
+ externalMidiScratchRenderFrame: () => number;
1102
+ externalMidiScratchByteWord: () => number;
1103
+ externalMidiScratchByteCount: () => number;
1104
+ consumeExternalMidiScratch: () => void;
1011
1105
  clearParameters: () => void;
1012
1106
  process: (channels: Float32Array[]) => Float32Array[];
1107
+ prepareWithChannels: (
1108
+ sampleRate: number,
1109
+ maxBlockSize: number,
1110
+ commandCapacity: number,
1111
+ telemetryCapacity: number,
1112
+ maxChannels: number,
1113
+ ) => void;
1013
1114
  prepareChannels: (numChannels: number, maxFrames: number) => void;
1014
1115
  getChannelBuffer: (channel: number, numFrames: number) => Float32Array;
1015
1116
  processPrepared: (numFrames: number) => void;
@@ -1018,19 +1119,40 @@ export interface WasmRealtimeEngine {
1018
1119
  bounceOffline: (options: WasmEngineBounceOptions) => WasmEngineBounceResult;
1019
1120
  freezeOffline: (options: WasmEngineFreezeOptions) => WasmEngineFreezeResult;
1020
1121
  drainTelemetry: (maxRecords: number) => WasmEngineTelemetry[];
1122
+ popTelemetryToScratch: () => boolean;
1123
+ telemetryScratchType: () => number;
1124
+ telemetryScratchError: () => number;
1125
+ telemetryScratchRenderFrame: () => number;
1126
+ telemetryScratchTimelineSample: () => number;
1127
+ telemetryScratchAudibleTimelineSample: () => number;
1128
+ telemetryScratchGraphLatencySamplesQ8: () => number;
1129
+ telemetryScratchValue: () => number;
1130
+ popMeterTelemetryToScratch: () => boolean;
1131
+ meterScratchTargetId: () => number;
1132
+ meterScratchRenderFrame: () => number;
1133
+ meterScratchValue: (field: number) => number;
1021
1134
  drainMeterTelemetry: (maxRecords: number) => WasmEngineMeterTelemetry[];
1022
1135
  drainMeterTelemetryWide: (maxRecords: number) => WasmEngineMeterTelemetryWide[];
1023
1136
  configureScopeTelemetry: (intervalFrames: number, bandCount: number) => number;
1024
1137
  drainScopeTelemetry: (maxRecords: number) => WasmEngineScopeTelemetry[];
1138
+ popScopeTelemetryToScratch: () => boolean;
1139
+ scopeScratchTargetId: () => number;
1140
+ scopeScratchRenderFrame: () => number;
1141
+ scopeScratchBandCount: () => number;
1142
+ scopeScratchBand: (index: number) => number;
1143
+ scopeScratchPointCount: () => number;
1144
+ scopeScratchPointLeft: (index: number) => number;
1145
+ scopeScratchPointRight: (index: number) => number;
1025
1146
  delete: () => void;
1026
1147
  }
1027
1148
 
1028
- export type ProgressCallback = (progress: number, stage: string) => void;
1149
+ export type { ProgressCallback } from './public_types';
1029
1150
  export type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
1030
1151
 
1031
1152
  export interface WasmSynthEnumTables {
1032
1153
  engineModes: string[];
1033
1154
  waveforms: string[];
1155
+ builtinWaveforms: string[];
1034
1156
  filterModels: string[];
1035
1157
  filterOutputs: string[];
1036
1158
  bodyTypes: string[];
@@ -1068,7 +1190,7 @@ export interface SonareModule {
1068
1190
  profileType: number,
1069
1191
  genreHint: string,
1070
1192
  ) => WasmKeyCandidateResult[];
1071
- detectOnsets: (samples: Float32Array, sampleRate: number) => Float32Array;
1193
+ detectOnsets: (samples: Float32Array, sampleRate: number, options: object) => Float32Array;
1072
1194
  detectBeats: (samples: Float32Array, sampleRate: number) => Float32Array;
1073
1195
  detectDownbeats: (samples: Float32Array, sampleRate: number) => Float32Array;
1074
1196
  detectChords: (
@@ -1117,6 +1239,12 @@ export interface SonareModule {
1117
1239
  sampleRate: number,
1118
1240
  nOctaveBands: number,
1119
1241
  ) => WasmAcousticResult;
1242
+ analyzeImpulseResponseEx: (
1243
+ samples: Float32Array,
1244
+ sampleRate: number,
1245
+ nOctaveBands: number,
1246
+ minDecayDb: number,
1247
+ ) => WasmAcousticResult;
1120
1248
  detectAcoustic: (
1121
1249
  samples: Float32Array,
1122
1250
  sampleRate: number,
@@ -1142,6 +1270,7 @@ export interface SonareModule {
1142
1270
  samples: Float32Array,
1143
1271
  sampleRate: number,
1144
1272
  progressCallback: ProgressCallback | null,
1273
+ cancelCallback: (() => boolean) | null,
1145
1274
  ) => WasmAnalysisResult;
1146
1275
  analyzeBpm: (
1147
1276
  samples: Float32Array,
@@ -1181,11 +1310,13 @@ export interface SonareModule {
1181
1310
  detectKeyCandidates: (samples: Float32Array, sampleRate: number) => WasmKeyCandidateResult[];
1182
1311
  hasFfmpegSupport: () => boolean;
1183
1312
  version: () => string;
1313
+ capabilities: () => SonareCapabilities;
1314
+ capabilityCatalog: () => string;
1184
1315
  abiVersion: () => number;
1185
1316
  engineAbiVersion: () => number;
1186
1317
  voiceChangerAbiVersion: () => number;
1187
- voiceCharacterPresetId: (preset: number) => string | null;
1188
- realtimeVoiceChangerPresetConfig: (preset: number) => WasmRealtimeVoiceChangerPodConfig | null;
1318
+ voiceCharacterPresetId: (preset: number) => string;
1319
+ realtimeVoiceChangerPresetConfig: (preset: number) => WasmRealtimeVoiceChangerPodConfig;
1189
1320
 
1190
1321
  meteringPeakDb: (samples: Float32Array, sampleRate: number) => number;
1191
1322
  meteringRmsDb: (samples: Float32Array, sampleRate: number) => number;
@@ -1353,12 +1484,30 @@ export interface SonareModule {
1353
1484
  kernelHarmonic: number,
1354
1485
  kernelPercussive: number,
1355
1486
  ) => WasmHpssResult;
1487
+ hpssEx: (
1488
+ samples: Float32Array,
1489
+ sampleRate: number,
1490
+ kernelHarmonic: number,
1491
+ kernelPercussive: number,
1492
+ nFft: number,
1493
+ hopLength: number,
1494
+ hardMask: boolean,
1495
+ ) => WasmHpssResult;
1356
1496
  hpssWithResidual: (
1357
1497
  samples: Float32Array,
1358
1498
  sampleRate: number,
1359
1499
  kernelHarmonic: number,
1360
1500
  kernelPercussive: number,
1361
1501
  ) => WasmHpssWithResidualResult;
1502
+ hpssWithResidualEx: (
1503
+ samples: Float32Array,
1504
+ sampleRate: number,
1505
+ kernelHarmonic: number,
1506
+ kernelPercussive: number,
1507
+ nFft: number,
1508
+ hopLength: number,
1509
+ hardMask: boolean,
1510
+ ) => WasmHpssWithResidualResult;
1362
1511
  decompose: (
1363
1512
  s: Float32Array,
1364
1513
  nFeatures: number,
@@ -1400,7 +1549,21 @@ export interface SonareModule {
1400
1549
  harmonic: (samples: Float32Array, sampleRate: number) => Float32Array;
1401
1550
  percussive: (samples: Float32Array, sampleRate: number) => Float32Array;
1402
1551
  timeStretch: (samples: Float32Array, sampleRate: number, rate: number) => Float32Array;
1552
+ timeStretchEx: (
1553
+ samples: Float32Array,
1554
+ sampleRate: number,
1555
+ rate: number,
1556
+ nFft: number,
1557
+ hopLength: number,
1558
+ ) => Float32Array;
1403
1559
  pitchShift: (samples: Float32Array, sampleRate: number, semitones: number) => Float32Array;
1560
+ pitchShiftEx: (
1561
+ samples: Float32Array,
1562
+ sampleRate: number,
1563
+ semitones: number,
1564
+ nFft: number,
1565
+ hopLength: number,
1566
+ ) => Float32Array;
1404
1567
  pitchCorrectToMidi: (
1405
1568
  samples: Float32Array,
1406
1569
  sampleRate: number,
@@ -1462,6 +1625,12 @@ export interface SonareModule {
1462
1625
  channels: number,
1463
1626
  ) => Float32Array;
1464
1627
  normalize: (samples: Float32Array, sampleRate: number, targetDb: number) => Float32Array;
1628
+ normalizeEx: (
1629
+ samples: Float32Array,
1630
+ sampleRate: number,
1631
+ targetDb: number,
1632
+ mode: string,
1633
+ ) => Float32Array;
1465
1634
  mastering: (
1466
1635
  samples: Float32Array,
1467
1636
  sampleRate: number,
@@ -1590,6 +1759,7 @@ export interface SonareModule {
1590
1759
  sampleRate: number,
1591
1760
  config: Record<string, unknown>,
1592
1761
  progressCallback: ProgressCallback | null,
1762
+ cancelCallback: (() => boolean) | null,
1593
1763
  ) => WasmMasteringChainResult;
1594
1764
  masteringChainStereoWithProgress: (
1595
1765
  left: Float32Array,
@@ -1597,6 +1767,7 @@ export interface SonareModule {
1597
1767
  sampleRate: number,
1598
1768
  config: Record<string, unknown>,
1599
1769
  progressCallback: ProgressCallback | null,
1770
+ cancelCallback: (() => boolean) | null,
1600
1771
  ) => WasmMasteringStereoChainResult;
1601
1772
  masteringPresetNames: () => string[];
1602
1773
  masterAudio: (
@@ -1618,6 +1789,7 @@ export interface SonareModule {
1618
1789
  sampleRate: number,
1619
1790
  overrides: Record<string, number | boolean> | null,
1620
1791
  progressCallback: ProgressCallback | null,
1792
+ cancelCallback: (() => boolean) | null,
1621
1793
  ) => WasmMasteringChainResult;
1622
1794
  masterAudioStereoWithProgress: (
1623
1795
  presetName: string,
@@ -1626,6 +1798,7 @@ export interface SonareModule {
1626
1798
  sampleRate: number,
1627
1799
  overrides: Record<string, number | boolean> | null,
1628
1800
  progressCallback: ProgressCallback | null,
1801
+ cancelCallback: (() => boolean) | null,
1629
1802
  ) => WasmMasteringStereoChainResult;
1630
1803
  mixingScenePresetNames: () => string[];
1631
1804
  mixingScenePresetJson: (presetName: string) => string;
@@ -1636,6 +1809,13 @@ export interface SonareModule {
1636
1809
  options: Record<string, unknown>,
1637
1810
  ) => WasmMixResult;
1638
1811
  trim: (samples: Float32Array, sampleRate: number, thresholdDb: number) => Float32Array;
1812
+ trimEx: (
1813
+ samples: Float32Array,
1814
+ sampleRate: number,
1815
+ thresholdDb: number,
1816
+ frameLength: number,
1817
+ hopLength: number,
1818
+ ) => Float32Array;
1639
1819
  spectralEdit: (
1640
1820
  samples: Float32Array,
1641
1821
  sampleRate: number,
@@ -1680,6 +1860,79 @@ export interface SonareModule {
1680
1860
  htk: boolean,
1681
1861
  lifter: number,
1682
1862
  ) => WasmMfccResult;
1863
+ melDelta: (
1864
+ features: Float32Array,
1865
+ nFeatures: number,
1866
+ nFrames: number,
1867
+ width: number,
1868
+ ) => Float32Array;
1869
+ reassignedSpectrogram: (
1870
+ samples: Float32Array,
1871
+ sampleRate: number,
1872
+ nFft: number,
1873
+ hopLength: number,
1874
+ refPower: number,
1875
+ fillNan: boolean,
1876
+ ) => {
1877
+ nBins: number;
1878
+ nFrames: number;
1879
+ magnitude: Float32Array;
1880
+ times: Float32Array;
1881
+ frequencies: Float32Array;
1882
+ };
1883
+ segmentCrossSimilarity: (
1884
+ x: Float32Array,
1885
+ xRows: number,
1886
+ xCols: number,
1887
+ y: Float32Array,
1888
+ yRows: number,
1889
+ yCols: number,
1890
+ k: number,
1891
+ metric: string,
1892
+ mode: string,
1893
+ ) => WasmSegmentMatrixResult;
1894
+ segmentRecurrenceMatrix: (
1895
+ data: Float32Array,
1896
+ rows: number,
1897
+ cols: number,
1898
+ k: number,
1899
+ width: number,
1900
+ sym: boolean,
1901
+ metric: string,
1902
+ mode: string,
1903
+ ) => WasmSegmentMatrixResult;
1904
+ segmentRecurrenceToLag: (
1905
+ recurrence: Float32Array,
1906
+ n: number,
1907
+ pad: boolean,
1908
+ ) => WasmSegmentMatrixResult;
1909
+ segmentLagToRecurrence: (
1910
+ lag: Float32Array,
1911
+ rows: number,
1912
+ lags: number,
1913
+ ) => WasmSegmentMatrixResult;
1914
+ segmentSubsegment: (
1915
+ data: Float32Array,
1916
+ rows: number,
1917
+ cols: number,
1918
+ boundaries: Int32Array,
1919
+ nSegments: number,
1920
+ ) => Int32Array;
1921
+ segmentAgglomerative: (
1922
+ data: Float32Array,
1923
+ rows: number,
1924
+ cols: number,
1925
+ k: number,
1926
+ linkage: string,
1927
+ ) => Int32Array;
1928
+ segmentPathEnhance: (
1929
+ recurrence: Float32Array,
1930
+ n: number,
1931
+ win: number,
1932
+ maxRatio: number,
1933
+ minRatio: number,
1934
+ nFilters: number,
1935
+ ) => WasmSegmentMatrixResult;
1683
1936
 
1684
1937
  // Features - Inverse reconstruction
1685
1938
  melToStft: (
@@ -1704,6 +1957,16 @@ export interface SonareModule {
1704
1957
  nIter: number,
1705
1958
  htk: boolean,
1706
1959
  ) => Float32Array;
1960
+ griffinLim: (
1961
+ magnitude: Float32Array,
1962
+ nBins: number,
1963
+ nFrames: number,
1964
+ sampleRate: number,
1965
+ nFft: number,
1966
+ hopLength: number,
1967
+ nIter: number,
1968
+ momentum: number,
1969
+ ) => Float32Array;
1707
1970
  mfccToMel: (
1708
1971
  mfcc: Float32Array,
1709
1972
  nMfcc: number,
@@ -1746,6 +2009,7 @@ export interface SonareModule {
1746
2009
  sampleRate: number,
1747
2010
  nFft: number,
1748
2011
  hopLength: number,
2012
+ p: number,
1749
2013
  ) => Float32Array;
1750
2014
  spectralRolloff: (
1751
2015
  samples: Float32Array,
@@ -1760,6 +2024,13 @@ export interface SonareModule {
1760
2024
  nFft: number,
1761
2025
  hopLength: number,
1762
2026
  ) => Float32Array;
2027
+ spectralFlux: (
2028
+ samples: Float32Array,
2029
+ sampleRate: number,
2030
+ nFft: number,
2031
+ hopLength: number,
2032
+ lag: number,
2033
+ ) => Float32Array;
1763
2034
  zeroCrossingRate: (
1764
2035
  samples: Float32Array,
1765
2036
  sampleRate: number,
@@ -1826,6 +2097,30 @@ export interface SonareModule {
1826
2097
  threshold: number,
1827
2098
  fillNa: boolean,
1828
2099
  ) => WasmPitchResult;
2100
+ piptrack: (
2101
+ samples: Float32Array,
2102
+ sampleRate: number,
2103
+ nFft: number,
2104
+ hopLength: number,
2105
+ fmin: number,
2106
+ fmax: number,
2107
+ threshold: number,
2108
+ ) => {
2109
+ nBins: number;
2110
+ nFrames: number;
2111
+ pitches: Float32Array;
2112
+ magnitudes: Float32Array;
2113
+ };
2114
+ noteSegments: (
2115
+ f0Hz: Float32Array,
2116
+ voicedProb: Float32Array,
2117
+ frameRate: number,
2118
+ options: {
2119
+ segmentationThresholdCents?: number;
2120
+ minNoteMs?: number;
2121
+ referenceHz?: number;
2122
+ },
2123
+ ) => WasmNoteSegment[];
1829
2124
 
1830
2125
  // Core - Conversion
1831
2126
  hzToMel: (hz: number) => number;
@@ -1857,9 +2152,31 @@ export interface SonareModule {
1857
2152
  hopLength: number,
1858
2153
  ) => Int32Array;
1859
2154
  frameSignal: (samples: Float32Array, frameLength: number, hopLength: number) => WasmFrameResult;
2155
+ tone: (
2156
+ frequency: number,
2157
+ sampleRate: number,
2158
+ duration: number,
2159
+ phase: number,
2160
+ amplitude: number,
2161
+ ) => Float32Array;
2162
+ chirp: (
2163
+ fmin: number,
2164
+ fmax: number,
2165
+ sampleRate: number,
2166
+ duration: number,
2167
+ linear: boolean,
2168
+ ) => Float32Array;
2169
+ clicks: (
2170
+ times: Float32Array,
2171
+ sampleRate: number,
2172
+ length: number,
2173
+ frequency: number,
2174
+ clickDuration: number,
2175
+ ) => Float32Array;
1860
2176
  padCenter: (values: Float32Array, size: number, padValue: number) => Float32Array;
1861
2177
  fixLength: (values: Float32Array, size: number, padValue: number) => Float32Array;
1862
2178
  fixFrames: (frames: Int32Array, xMin: number, xMax: number, pad: boolean) => Int32Array;
2179
+ onsetBacktrack: (events: Int32Array, energy: Float32Array) => Int32Array;
1863
2180
  peakPick: (
1864
2181
  values: Float32Array,
1865
2182
  preMax: number,
@@ -1883,6 +2200,8 @@ export interface SonareModule {
1883
2200
  hopLength: number,
1884
2201
  winLength: number,
1885
2202
  mode: TempogramMode,
2203
+ center: boolean,
2204
+ norm: boolean,
1886
2205
  ) => WasmTempogramResult;
1887
2206
  cyclicTempogram: (
1888
2207
  onsetEnvelope: Float32Array,
@@ -1927,6 +2246,14 @@ export interface SonareModule {
1927
2246
  stftBlendWeight: number,
1928
2247
  stftBlendNFft: number,
1929
2248
  ) => WasmNnlsChromaResult;
2249
+ nnlsChromaEx: (
2250
+ samples: Float32Array,
2251
+ sampleRate: number,
2252
+ enableStftBlend: boolean,
2253
+ stftBlendWeight: number,
2254
+ stftBlendNFft: number,
2255
+ hopLength: number,
2256
+ ) => WasmNnlsChromaResult;
1930
2257
  cqt: (
1931
2258
  samples: Float32Array,
1932
2259
  sampleRate: number,
@@ -2019,6 +2346,8 @@ export interface SonareModule {
2019
2346
  sampleRate: number,
2020
2347
  hopLength: number,
2021
2348
  winLength: number,
2349
+ center: boolean,
2350
+ norm: boolean,
2022
2351
  ) => WasmFourierTempogramResult;
2023
2352
  tempogramRatio: (
2024
2353
  tempogramData: Float32Array,
@@ -2115,6 +2444,7 @@ export interface SonareModule {
2115
2444
  maxBlockSize: number,
2116
2445
  commandCapacity: number,
2117
2446
  telemetryCapacity: number,
2447
+ maxChannels?: number,
2118
2448
  ) => WasmRealtimeEngine;
2119
2449
 
2120
2450
  // Streaming - StreamingMasteringChain
@@ -2152,6 +2482,8 @@ export interface WasmStreamingMasteringChain {
2152
2482
  left: Float32Array,
2153
2483
  right: Float32Array,
2154
2484
  ) => { left: Float32Array; right: Float32Array };
2485
+ flushMono: () => Float32Array;
2486
+ flushStereo: () => { left: Float32Array; right: Float32Array };
2155
2487
  reset: () => void;
2156
2488
  latencySamples: () => number;
2157
2489
  stageNames: () => string[];
@@ -2206,8 +2538,10 @@ export interface WasmRealtimeVoiceChanger {
2206
2538
  prepare: (sampleRate: number, maxBlockSize: number, channels: number) => void;
2207
2539
  reset: () => void;
2208
2540
  setConfig: (config: Record<string, unknown> | string) => void;
2541
+ setPodConfig: (config: WasmRealtimeVoiceChangerPodConfig) => void;
2209
2542
  configJson: () => string;
2210
2543
  latencySamples: () => number;
2544
+ bufferGeneration: () => number;
2211
2545
  processMono: (samples: Float32Array) => Float32Array;
2212
2546
  processMonoInto: (samples: Float32Array, output: Float32Array) => void;
2213
2547
  processInterleaved: (samples: Float32Array, channels: number) => Float32Array;
@@ -1,3 +1,4 @@
1
+ import { resolveOrdinalInRange } from './codes';
1
2
  import { getSonareModule } from './module_state';
2
3
  import type { ChordQuality, PitchClass } from './public_types';
3
4
  import type { WasmStreamAnalyzer } from './sonare.js';
@@ -73,6 +74,10 @@ export class StreamAnalyzer {
73
74
  ) {
74
75
  throw new TypeError('outputFormat must be the integer 0 (Float32)');
75
76
  }
77
+ const window =
78
+ config.window === undefined
79
+ ? undefined
80
+ : resolveOrdinalInRange(config.window, 0, 3, 'stream analyzer window');
76
81
  const module = getSonareModule();
77
82
  const defaults = streamAnalyzerConfigDefaults();
78
83
  this.analyzer = new module.StreamAnalyzer(
@@ -94,7 +99,7 @@ export class StreamAnalyzer {
94
99
  config.maxProgressionEntries ?? defaults.maxProgressionEntries,
95
100
  config.keyUpdateIntervalSec ?? defaults.keyUpdateIntervalSec,
96
101
  config.bpmUpdateIntervalSec ?? defaults.bpmUpdateIntervalSec,
97
- config.window ?? defaults.window,
102
+ window ?? defaults.window,
98
103
  config.outputFormat ?? defaults.outputFormat,
99
104
  );
100
105
  }
@@ -104,6 +104,21 @@ export class StreamingMasteringChain {
104
104
  return this.chain.processStereo(left, right);
105
105
  }
106
106
 
107
+ /**
108
+ * Emit delayed audio and finite processor tails after the final mono block.
109
+ * Call until this returns an empty array. The initial `latencySamples()`
110
+ * samples of the concatenated stream are delayed and should be discarded for
111
+ * time-aligned output.
112
+ */
113
+ flushMono(): Float32Array {
114
+ return this.chain.flushMono();
115
+ }
116
+
117
+ /** Stereo counterpart of {@link flushMono}. */
118
+ flushStereo(): { left: Float32Array; right: Float32Array } {
119
+ return this.chain.flushStereo();
120
+ }
121
+
107
122
  /** Reset all processor state without rebuilding. */
108
123
  reset(): void {
109
124
  this.chain.reset();