@libraz/libsonare 1.5.4 → 1.6.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 (79) hide show
  1. package/README.md +109 -20
  2. package/dist/analysis.d.ts +5730 -0
  3. package/dist/analysis.js +2464 -0
  4. package/dist/analysis.js.map +1 -0
  5. package/dist/index.d.ts +873 -63
  6. package/dist/index.js +1037 -265
  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 +707 -0
  16. package/dist/worker.js.map +1 -0
  17. package/dist/worklet.d.ts +596 -86
  18. package/dist/worklet.js +1658 -235
  19. package/dist/worklet.js.map +1 -1
  20. package/package.json +23 -11
  21. package/src/_chain_config.ts +5 -23
  22. package/src/analysis.ts +137 -0
  23. package/src/analysis_helpers.ts +29 -0
  24. package/src/audio.ts +5 -3
  25. package/src/clip_page_streamer.ts +62 -8
  26. package/src/codes.ts +51 -64
  27. package/src/effects_mastering.ts +1 -0
  28. package/src/effects_transform.ts +12 -6
  29. package/src/errors.ts +1 -0
  30. package/src/feature_core.ts +159 -3
  31. package/src/feature_music.ts +35 -16
  32. package/src/feature_pitch.ts +75 -6
  33. package/src/feature_spectral.ts +234 -8
  34. package/src/feature_spectrogram.ts +186 -5
  35. package/src/features.ts +16 -1
  36. package/src/index.ts +104 -7
  37. package/src/mastering_chain.ts +20 -8
  38. package/src/mastering_core.ts +7 -0
  39. package/src/mastering_dynamics.ts +7 -1
  40. package/src/metering.ts +51 -5
  41. package/src/mixer.ts +14 -1
  42. package/src/opfs_clip_pages.ts +26 -1
  43. package/src/project.ts +7 -0
  44. package/src/project_class.ts +74 -13
  45. package/src/project_internal.ts +24 -29
  46. package/src/project_types.ts +69 -10
  47. package/src/public_types.ts +68 -0
  48. package/src/public_types_mastering.ts +28 -0
  49. package/src/public_types_mixing.ts +11 -2
  50. package/src/public_types_music.ts +13 -0
  51. package/src/public_types_spectral.ts +43 -3
  52. package/src/quick_analysis.ts +48 -12
  53. package/src/realtime_engine.ts +162 -4
  54. package/src/realtime_voice_changer.ts +51 -77
  55. package/src/sonare-analysis.js.d.ts +8 -0
  56. package/src/sonare.js.d.ts +305 -9
  57. package/src/streaming_processors.ts +22 -1
  58. package/src/validation.ts +6 -0
  59. package/src/web_midi.ts +36 -4
  60. package/src/worker.ts +196 -0
  61. package/src/worker_client.ts +352 -0
  62. package/src/worker_protocol.ts +59 -0
  63. package/src/worklet/engine-automation.ts +2 -1
  64. package/src/worklet/engine-capture-facade.ts +13 -4
  65. package/src/worklet/engine-clips.ts +12 -3
  66. package/src/worklet/engine-node.ts +212 -4
  67. package/src/worklet/engine-offline.ts +7 -2
  68. package/src/worklet/engine-parameter-facade.ts +26 -5
  69. package/src/worklet/engine-processor.ts +383 -42
  70. package/src/worklet/engine-register.ts +8 -0
  71. package/src/worklet/engine-strips.ts +17 -1
  72. package/src/worklet/engine-sync.ts +2 -6
  73. package/src/worklet/engine-tempo-facade.ts +8 -6
  74. package/src/worklet/engine.ts +380 -13
  75. package/src/worklet/guards.ts +22 -1
  76. package/src/worklet/messages.ts +141 -9
  77. package/src/worklet/protocol.ts +303 -17
  78. package/src/worklet/voice-changer-processor.ts +12 -15
  79. 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;
@@ -458,6 +485,8 @@ export interface WasmLufsResult {
458
485
  integratedLufs: number;
459
486
  momentaryLufs: number;
460
487
  shortTermLufs: number;
488
+ maxMomentaryLufs: number;
489
+ maxShortTermLufs: number;
461
490
  loudnessRange: number;
462
491
  }
463
492
 
@@ -467,6 +496,7 @@ export interface WasmMasteringResult {
467
496
  inputLufs: number;
468
497
  outputLufs: number;
469
498
  appliedGainDb: number;
499
+ loudnessTargetLimited?: boolean;
470
500
  latencySamples?: number;
471
501
  }
472
502
 
@@ -475,11 +505,30 @@ export interface WasmStageGainReduction {
475
505
  gainReductionDb: number;
476
506
  }
477
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
+
478
525
  export interface WasmMasteringChainResult extends WasmMasteringResult {
479
526
  stages: string[];
480
527
  outputTruePeakDbtp: number;
481
528
  outputLra: number;
529
+ loudnessTargetLimited: boolean;
482
530
  stageGainReductions: WasmStageGainReduction[];
531
+ report: WasmMasteringReport;
483
532
  }
484
533
 
485
534
  export interface WasmMasteringStereoChainResult {
@@ -492,7 +541,9 @@ export interface WasmMasteringStereoChainResult {
492
541
  stages: string[];
493
542
  outputTruePeakDbtp: number;
494
543
  outputLra: number;
544
+ loudnessTargetLimited: boolean;
495
545
  stageGainReductions: WasmStageGainReduction[];
546
+ report: WasmMasteringReport;
496
547
  }
497
548
 
498
549
  export interface WasmMasteringStereoResult {
@@ -619,13 +670,44 @@ export interface WasmProjectMarker {
619
670
  keyFifths?: number;
620
671
  keyMinor?: boolean;
621
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
+ }
622
703
 
623
704
  export interface WasmEngineMetronomeConfig {
624
705
  enabled: boolean;
625
706
  beatGain?: number;
626
707
  accentGain?: number;
708
+ /** Explicit click length in samples (0..384000). The engine caps it to one second at its sample rate. */
627
709
  clickSamples?: number;
628
- /** Optional click length in seconds; > 0 overrides the engine 2 ms default. */
710
+ /** Optional click length in seconds (0..1); > 0 overrides the engine 2 ms default. */
629
711
  clickSeconds?: number;
630
712
  }
631
713
 
@@ -837,6 +919,7 @@ export interface WasmRealtimeEngine {
837
919
  stop: (renderFrame: number) => void;
838
920
  seekSample: (timelineSample: number, renderFrame: number) => void;
839
921
  settleParameters: () => void;
922
+ flushControlCommands: () => void;
840
923
  seekPpq: (ppq: number, renderFrame: number) => void;
841
924
  setTempo: (bpm: number) => void;
842
925
  setTempoSegments: (segments: WasmEngineTempoSegment[]) => void;
@@ -920,10 +1003,14 @@ export interface WasmRealtimeEngine {
920
1003
  clearClipPage: (providerId: number, pageIndex: number) => void;
921
1004
  destroyClipPageProvider: (providerId: number) => void;
922
1005
  popClipPageRequest: () => WasmClipPageRequest | null;
1006
+ popClipPageRequestToScratch: () => boolean;
1007
+ clipPageRequestScratchClipId: () => number;
1008
+ clipPageRequestScratchSample: () => number;
1009
+ clipPageRequestOverflowCount: () => number;
923
1010
  setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
924
1011
  armCapture: (armed: boolean) => void;
925
1012
  setCapturePunch: (startSample: number, endSample: number, enabled: boolean) => void;
926
- setCaptureSource: (source: WasmEngineCaptureStatus['source']) => void;
1013
+ setCaptureSource: (source: WasmEngineCaptureStatus['source'] | number) => void;
927
1014
  setRecordOffsetSamples: (offsetSamples: number) => void;
928
1015
  setInputMonitor: (enabled: boolean, gain: number) => void;
929
1016
  resetCapture: () => void;
@@ -943,6 +1030,7 @@ export interface WasmRealtimeEngine {
943
1030
  minValue: number,
944
1031
  maxValue: number,
945
1032
  ) => void;
1033
+ bindMidiCcBinding: (binding: import('./project_types').ProjectMidiCcBinding) => void;
946
1034
  clearMidiCcBindings: () => void;
947
1035
  midiCcBindingCount: () => number;
948
1036
  setMidiFx: (destinationId: number, configJson: string) => void;
@@ -995,14 +1083,29 @@ export interface WasmRealtimeEngine {
995
1083
  value: number,
996
1084
  renderFrame: number,
997
1085
  ) => void;
1086
+ pushMidiUmp: (destinationId: number, word0: number, renderFrame: number) => void;
998
1087
  pushMidiSysex: (destinationId: number, data: Uint8Array, renderFrame: number) => void;
999
1088
  pushMidiPanic: (renderFrame: number) => void;
1000
1089
  setMidiDestinationExternal: (destinationId: number, external: boolean) => void;
1001
1090
  setExternalMidiClockEnabled: (enabled: boolean) => void;
1002
1091
  externalMidiDroppedCount: () => number;
1092
+ externalMidiPendingCount: () => number;
1003
1093
  drainExternalMidi: (maxRecords: number) => WasmExternalMidiEvent[];
1094
+ popExternalMidiToScratch: () => boolean;
1095
+ externalMidiScratchDestinationId: () => number;
1096
+ externalMidiScratchRenderFrame: () => number;
1097
+ externalMidiScratchByteWord: () => number;
1098
+ externalMidiScratchByteCount: () => number;
1099
+ consumeExternalMidiScratch: () => void;
1004
1100
  clearParameters: () => void;
1005
1101
  process: (channels: Float32Array[]) => Float32Array[];
1102
+ prepareWithChannels: (
1103
+ sampleRate: number,
1104
+ maxBlockSize: number,
1105
+ commandCapacity: number,
1106
+ telemetryCapacity: number,
1107
+ maxChannels: number,
1108
+ ) => void;
1006
1109
  prepareChannels: (numChannels: number, maxFrames: number) => void;
1007
1110
  getChannelBuffer: (channel: number, numFrames: number) => Float32Array;
1008
1111
  processPrepared: (numFrames: number) => void;
@@ -1011,19 +1114,40 @@ export interface WasmRealtimeEngine {
1011
1114
  bounceOffline: (options: WasmEngineBounceOptions) => WasmEngineBounceResult;
1012
1115
  freezeOffline: (options: WasmEngineFreezeOptions) => WasmEngineFreezeResult;
1013
1116
  drainTelemetry: (maxRecords: number) => WasmEngineTelemetry[];
1117
+ popTelemetryToScratch: () => boolean;
1118
+ telemetryScratchType: () => number;
1119
+ telemetryScratchError: () => number;
1120
+ telemetryScratchRenderFrame: () => number;
1121
+ telemetryScratchTimelineSample: () => number;
1122
+ telemetryScratchAudibleTimelineSample: () => number;
1123
+ telemetryScratchGraphLatencySamplesQ8: () => number;
1124
+ telemetryScratchValue: () => number;
1125
+ popMeterTelemetryToScratch: () => boolean;
1126
+ meterScratchTargetId: () => number;
1127
+ meterScratchRenderFrame: () => number;
1128
+ meterScratchValue: (field: number) => number;
1014
1129
  drainMeterTelemetry: (maxRecords: number) => WasmEngineMeterTelemetry[];
1015
1130
  drainMeterTelemetryWide: (maxRecords: number) => WasmEngineMeterTelemetryWide[];
1016
1131
  configureScopeTelemetry: (intervalFrames: number, bandCount: number) => number;
1017
1132
  drainScopeTelemetry: (maxRecords: number) => WasmEngineScopeTelemetry[];
1133
+ popScopeTelemetryToScratch: () => boolean;
1134
+ scopeScratchTargetId: () => number;
1135
+ scopeScratchRenderFrame: () => number;
1136
+ scopeScratchBandCount: () => number;
1137
+ scopeScratchBand: (index: number) => number;
1138
+ scopeScratchPointCount: () => number;
1139
+ scopeScratchPointLeft: (index: number) => number;
1140
+ scopeScratchPointRight: (index: number) => number;
1018
1141
  delete: () => void;
1019
1142
  }
1020
1143
 
1021
- export type ProgressCallback = (progress: number, stage: string) => void;
1144
+ export type { ProgressCallback } from './public_types';
1022
1145
  export type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
1023
1146
 
1024
1147
  export interface WasmSynthEnumTables {
1025
1148
  engineModes: string[];
1026
1149
  waveforms: string[];
1150
+ builtinWaveforms: string[];
1027
1151
  filterModels: string[];
1028
1152
  filterOutputs: string[];
1029
1153
  bodyTypes: string[];
@@ -1061,7 +1185,7 @@ export interface SonareModule {
1061
1185
  profileType: number,
1062
1186
  genreHint: string,
1063
1187
  ) => WasmKeyCandidateResult[];
1064
- detectOnsets: (samples: Float32Array, sampleRate: number) => Float32Array;
1188
+ detectOnsets: (samples: Float32Array, sampleRate: number, options: object) => Float32Array;
1065
1189
  detectBeats: (samples: Float32Array, sampleRate: number) => Float32Array;
1066
1190
  detectDownbeats: (samples: Float32Array, sampleRate: number) => Float32Array;
1067
1191
  detectChords: (
@@ -1100,7 +1224,7 @@ export interface SonareModule {
1100
1224
  detectInversions: boolean,
1101
1225
  chromaMethod: number,
1102
1226
  ) => string[];
1103
- analyze: (samples: Float32Array, sampleRate: number) => WasmAnalysisResult;
1227
+ analyze: (samples: Float32Array, sampleRate: number, options: object) => WasmAnalysisResult;
1104
1228
  _synthEnumTables: () => WasmSynthEnumTables;
1105
1229
  _synthPatchRoundTrip: (patch: unknown) => unknown;
1106
1230
  _analysisResultSchemaPaths: () => string[];
@@ -1135,6 +1259,7 @@ export interface SonareModule {
1135
1259
  samples: Float32Array,
1136
1260
  sampleRate: number,
1137
1261
  progressCallback: ProgressCallback | null,
1262
+ cancelCallback: (() => boolean) | null,
1138
1263
  ) => WasmAnalysisResult;
1139
1264
  analyzeBpm: (
1140
1265
  samples: Float32Array,
@@ -1174,14 +1299,23 @@ export interface SonareModule {
1174
1299
  detectKeyCandidates: (samples: Float32Array, sampleRate: number) => WasmKeyCandidateResult[];
1175
1300
  hasFfmpegSupport: () => boolean;
1176
1301
  version: () => string;
1302
+ capabilities: () => SonareCapabilities;
1303
+ capabilityCatalog: () => string;
1177
1304
  abiVersion: () => number;
1178
1305
  engineAbiVersion: () => number;
1179
1306
  voiceChangerAbiVersion: () => number;
1180
- voiceCharacterPresetId: (preset: number) => string | null;
1181
- realtimeVoiceChangerPresetConfig: (preset: number) => WasmRealtimeVoiceChangerPodConfig | null;
1307
+ voiceCharacterPresetId: (preset: number) => string;
1308
+ realtimeVoiceChangerPresetConfig: (preset: number) => WasmRealtimeVoiceChangerPodConfig;
1182
1309
 
1183
1310
  meteringPeakDb: (samples: Float32Array, sampleRate: number) => number;
1184
1311
  meteringRmsDb: (samples: Float32Array, sampleRate: number) => number;
1312
+ meteringSilenceRatio: (
1313
+ samples: Float32Array,
1314
+ sampleRate: number,
1315
+ thresholdDb: number,
1316
+ frameLength: number,
1317
+ hopLength: number,
1318
+ ) => number;
1185
1319
  meteringCrestFactorDb: (samples: Float32Array, sampleRate: number) => number;
1186
1320
  meteringDcOffset: (samples: Float32Array, sampleRate: number) => number;
1187
1321
  meteringTruePeakDb: (
@@ -1576,6 +1710,7 @@ export interface SonareModule {
1576
1710
  sampleRate: number,
1577
1711
  config: Record<string, unknown>,
1578
1712
  progressCallback: ProgressCallback | null,
1713
+ cancelCallback: (() => boolean) | null,
1579
1714
  ) => WasmMasteringChainResult;
1580
1715
  masteringChainStereoWithProgress: (
1581
1716
  left: Float32Array,
@@ -1583,6 +1718,7 @@ export interface SonareModule {
1583
1718
  sampleRate: number,
1584
1719
  config: Record<string, unknown>,
1585
1720
  progressCallback: ProgressCallback | null,
1721
+ cancelCallback: (() => boolean) | null,
1586
1722
  ) => WasmMasteringStereoChainResult;
1587
1723
  masteringPresetNames: () => string[];
1588
1724
  masterAudio: (
@@ -1604,6 +1740,7 @@ export interface SonareModule {
1604
1740
  sampleRate: number,
1605
1741
  overrides: Record<string, number | boolean> | null,
1606
1742
  progressCallback: ProgressCallback | null,
1743
+ cancelCallback: (() => boolean) | null,
1607
1744
  ) => WasmMasteringChainResult;
1608
1745
  masterAudioStereoWithProgress: (
1609
1746
  presetName: string,
@@ -1612,6 +1749,7 @@ export interface SonareModule {
1612
1749
  sampleRate: number,
1613
1750
  overrides: Record<string, number | boolean> | null,
1614
1751
  progressCallback: ProgressCallback | null,
1752
+ cancelCallback: (() => boolean) | null,
1615
1753
  ) => WasmMasteringStereoChainResult;
1616
1754
  mixingScenePresetNames: () => string[];
1617
1755
  mixingScenePresetJson: (presetName: string) => string;
@@ -1666,6 +1804,79 @@ export interface SonareModule {
1666
1804
  htk: boolean,
1667
1805
  lifter: number,
1668
1806
  ) => WasmMfccResult;
1807
+ melDelta: (
1808
+ features: Float32Array,
1809
+ nFeatures: number,
1810
+ nFrames: number,
1811
+ width: number,
1812
+ ) => Float32Array;
1813
+ reassignedSpectrogram: (
1814
+ samples: Float32Array,
1815
+ sampleRate: number,
1816
+ nFft: number,
1817
+ hopLength: number,
1818
+ refPower: number,
1819
+ fillNan: boolean,
1820
+ ) => {
1821
+ nBins: number;
1822
+ nFrames: number;
1823
+ magnitude: Float32Array;
1824
+ times: Float32Array;
1825
+ frequencies: Float32Array;
1826
+ };
1827
+ segmentCrossSimilarity: (
1828
+ x: Float32Array,
1829
+ xRows: number,
1830
+ xCols: number,
1831
+ y: Float32Array,
1832
+ yRows: number,
1833
+ yCols: number,
1834
+ k: number,
1835
+ metric: string,
1836
+ mode: string,
1837
+ ) => WasmSegmentMatrixResult;
1838
+ segmentRecurrenceMatrix: (
1839
+ data: Float32Array,
1840
+ rows: number,
1841
+ cols: number,
1842
+ k: number,
1843
+ width: number,
1844
+ sym: boolean,
1845
+ metric: string,
1846
+ mode: string,
1847
+ ) => WasmSegmentMatrixResult;
1848
+ segmentRecurrenceToLag: (
1849
+ recurrence: Float32Array,
1850
+ n: number,
1851
+ pad: boolean,
1852
+ ) => WasmSegmentMatrixResult;
1853
+ segmentLagToRecurrence: (
1854
+ lag: Float32Array,
1855
+ rows: number,
1856
+ lags: number,
1857
+ ) => WasmSegmentMatrixResult;
1858
+ segmentSubsegment: (
1859
+ data: Float32Array,
1860
+ rows: number,
1861
+ cols: number,
1862
+ boundaries: Int32Array,
1863
+ nSegments: number,
1864
+ ) => Int32Array;
1865
+ segmentAgglomerative: (
1866
+ data: Float32Array,
1867
+ rows: number,
1868
+ cols: number,
1869
+ k: number,
1870
+ linkage: string,
1871
+ ) => Int32Array;
1872
+ segmentPathEnhance: (
1873
+ recurrence: Float32Array,
1874
+ n: number,
1875
+ win: number,
1876
+ maxRatio: number,
1877
+ minRatio: number,
1878
+ nFilters: number,
1879
+ ) => WasmSegmentMatrixResult;
1669
1880
 
1670
1881
  // Features - Inverse reconstruction
1671
1882
  melToStft: (
@@ -1690,11 +1901,22 @@ export interface SonareModule {
1690
1901
  nIter: number,
1691
1902
  htk: boolean,
1692
1903
  ) => Float32Array;
1904
+ griffinLim: (
1905
+ magnitude: Float32Array,
1906
+ nBins: number,
1907
+ nFrames: number,
1908
+ sampleRate: number,
1909
+ nFft: number,
1910
+ hopLength: number,
1911
+ nIter: number,
1912
+ momentum: number,
1913
+ ) => Float32Array;
1693
1914
  mfccToMel: (
1694
1915
  mfcc: Float32Array,
1695
1916
  nMfcc: number,
1696
1917
  nFrames: number,
1697
1918
  nMels: number,
1919
+ lifter: number,
1698
1920
  ) => WasmMelPowerResult;
1699
1921
  mfccToAudio: (
1700
1922
  mfcc: Float32Array,
@@ -1708,6 +1930,7 @@ export interface SonareModule {
1708
1930
  fmax: number,
1709
1931
  nIter: number,
1710
1932
  htk: boolean,
1933
+ lifter: number,
1711
1934
  ) => Float32Array;
1712
1935
 
1713
1936
  // Features - Chroma
@@ -1730,6 +1953,7 @@ export interface SonareModule {
1730
1953
  sampleRate: number,
1731
1954
  nFft: number,
1732
1955
  hopLength: number,
1956
+ p: number,
1733
1957
  ) => Float32Array;
1734
1958
  spectralRolloff: (
1735
1959
  samples: Float32Array,
@@ -1744,6 +1968,13 @@ export interface SonareModule {
1744
1968
  nFft: number,
1745
1969
  hopLength: number,
1746
1970
  ) => Float32Array;
1971
+ spectralFlux: (
1972
+ samples: Float32Array,
1973
+ sampleRate: number,
1974
+ nFft: number,
1975
+ hopLength: number,
1976
+ lag: number,
1977
+ ) => Float32Array;
1747
1978
  zeroCrossingRate: (
1748
1979
  samples: Float32Array,
1749
1980
  sampleRate: number,
@@ -1810,6 +2041,30 @@ export interface SonareModule {
1810
2041
  threshold: number,
1811
2042
  fillNa: boolean,
1812
2043
  ) => WasmPitchResult;
2044
+ piptrack: (
2045
+ samples: Float32Array,
2046
+ sampleRate: number,
2047
+ nFft: number,
2048
+ hopLength: number,
2049
+ fmin: number,
2050
+ fmax: number,
2051
+ threshold: number,
2052
+ ) => {
2053
+ nBins: number;
2054
+ nFrames: number;
2055
+ pitches: Float32Array;
2056
+ magnitudes: Float32Array;
2057
+ };
2058
+ noteSegments: (
2059
+ f0Hz: Float32Array,
2060
+ voicedProb: Float32Array,
2061
+ frameRate: number,
2062
+ options: {
2063
+ segmentationThresholdCents?: number;
2064
+ minNoteMs?: number;
2065
+ referenceHz?: number;
2066
+ },
2067
+ ) => WasmNoteSegment[];
1813
2068
 
1814
2069
  // Core - Conversion
1815
2070
  hzToMel: (hz: number) => number;
@@ -1841,9 +2096,31 @@ export interface SonareModule {
1841
2096
  hopLength: number,
1842
2097
  ) => Int32Array;
1843
2098
  frameSignal: (samples: Float32Array, frameLength: number, hopLength: number) => WasmFrameResult;
2099
+ tone: (
2100
+ frequency: number,
2101
+ sampleRate: number,
2102
+ duration: number,
2103
+ phase: number,
2104
+ amplitude: number,
2105
+ ) => Float32Array;
2106
+ chirp: (
2107
+ fmin: number,
2108
+ fmax: number,
2109
+ sampleRate: number,
2110
+ duration: number,
2111
+ linear: boolean,
2112
+ ) => Float32Array;
2113
+ clicks: (
2114
+ times: Float32Array,
2115
+ sampleRate: number,
2116
+ length: number,
2117
+ frequency: number,
2118
+ clickDuration: number,
2119
+ ) => Float32Array;
1844
2120
  padCenter: (values: Float32Array, size: number, padValue: number) => Float32Array;
1845
2121
  fixLength: (values: Float32Array, size: number, padValue: number) => Float32Array;
1846
2122
  fixFrames: (frames: Int32Array, xMin: number, xMax: number, pad: boolean) => Int32Array;
2123
+ onsetBacktrack: (events: Int32Array, energy: Float32Array) => Int32Array;
1847
2124
  peakPick: (
1848
2125
  values: Float32Array,
1849
2126
  preMax: number,
@@ -1867,6 +2144,8 @@ export interface SonareModule {
1867
2144
  hopLength: number,
1868
2145
  winLength: number,
1869
2146
  mode: TempogramMode,
2147
+ center: boolean,
2148
+ norm: boolean,
1870
2149
  ) => WasmTempogramResult;
1871
2150
  cyclicTempogram: (
1872
2151
  onsetEnvelope: Float32Array,
@@ -1889,12 +2168,14 @@ export interface SonareModule {
1889
2168
  sampleRate: number,
1890
2169
  hopLength: number,
1891
2170
  nChroma: number,
2171
+ binsPerOctave: number,
1892
2172
  ) => WasmChromaResult;
1893
2173
  chromaCqt: (
1894
2174
  samples: Float32Array,
1895
2175
  sampleRate: number,
1896
2176
  hopLength: number,
1897
2177
  nChroma: number,
2178
+ binsPerOctave: number,
1898
2179
  ) => WasmChromaResult;
1899
2180
  bassChroma: (
1900
2181
  samples: Float32Array,
@@ -1902,7 +2183,13 @@ export interface SonareModule {
1902
2183
  hopLength: number,
1903
2184
  nChroma: number,
1904
2185
  ) => WasmChromaResult;
1905
- nnlsChroma: (samples: Float32Array, sampleRate: number) => WasmNnlsChromaResult;
2186
+ nnlsChroma: (
2187
+ samples: Float32Array,
2188
+ sampleRate: number,
2189
+ enableStftBlend: boolean,
2190
+ stftBlendWeight: number,
2191
+ stftBlendNFft: number,
2192
+ ) => WasmNnlsChromaResult;
1906
2193
  cqt: (
1907
2194
  samples: Float32Array,
1908
2195
  sampleRate: number,
@@ -1995,6 +2282,8 @@ export interface SonareModule {
1995
2282
  sampleRate: number,
1996
2283
  hopLength: number,
1997
2284
  winLength: number,
2285
+ center: boolean,
2286
+ norm: boolean,
1998
2287
  ) => WasmFourierTempogramResult;
1999
2288
  tempogramRatio: (
2000
2289
  tempogramData: Float32Array,
@@ -2091,6 +2380,7 @@ export interface SonareModule {
2091
2380
  maxBlockSize: number,
2092
2381
  commandCapacity: number,
2093
2382
  telemetryCapacity: number,
2383
+ maxChannels?: number,
2094
2384
  ) => WasmRealtimeEngine;
2095
2385
 
2096
2386
  // Streaming - StreamingMasteringChain
@@ -2128,6 +2418,8 @@ export interface WasmStreamingMasteringChain {
2128
2418
  left: Float32Array,
2129
2419
  right: Float32Array,
2130
2420
  ) => { left: Float32Array; right: Float32Array };
2421
+ flushMono: () => Float32Array;
2422
+ flushStereo: () => { left: Float32Array; right: Float32Array };
2131
2423
  reset: () => void;
2132
2424
  latencySamples: () => number;
2133
2425
  stageNames: () => string[];
@@ -2182,8 +2474,10 @@ export interface WasmRealtimeVoiceChanger {
2182
2474
  prepare: (sampleRate: number, maxBlockSize: number, channels: number) => void;
2183
2475
  reset: () => void;
2184
2476
  setConfig: (config: Record<string, unknown> | string) => void;
2477
+ setPodConfig: (config: WasmRealtimeVoiceChangerPodConfig) => void;
2185
2478
  configJson: () => string;
2186
2479
  latencySamples: () => number;
2480
+ bufferGeneration: () => number;
2187
2481
  processMono: (samples: Float32Array) => Float32Array;
2188
2482
  processMonoInto: (samples: Float32Array, output: Float32Array) => void;
2189
2483
  processInterleaved: (samples: Float32Array, channels: number) => Float32Array;
@@ -2255,6 +2549,7 @@ export interface WasmMixer {
2255
2549
  removeSend: (stripIndex: number, sendIndex: number) => void;
2256
2550
  meterTap: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
2257
2551
  stripMeter: (stripIndex: number) => WasmMixMeterSnapshot;
2552
+ busMeter: (busId: string) => WasmMixMeterSnapshot;
2258
2553
  scheduleFaderAutomation: (
2259
2554
  stripIndex: number,
2260
2555
  samplePos: number,
@@ -2286,6 +2581,7 @@ export interface WasmMixer {
2286
2581
  busCount: () => number;
2287
2582
  addVcaGroup: (id: string, gainDb: number, members: string[]) => void;
2288
2583
  setVcaGroupGainDb: (id: string, gainDb: number) => void;
2584
+ setVcaGroupMembers: (id: string, members: string[]) => void;
2289
2585
  removeVcaGroup: (id: string) => void;
2290
2586
  vcaGroupCount: () => number;
2291
2587
  toSceneJson: () => string;
@@ -1,3 +1,4 @@
1
+ import { flattenChainConfig } from './_chain_config';
1
2
  import { getSonareModule } from './module_state';
2
3
  import type {
3
4
  EqBand,
@@ -64,7 +65,12 @@ export class StreamingMasteringChain {
64
65
 
65
66
  constructor(config: StreamingMasteringChainConfig) {
66
67
  const module = getSonareModule();
67
- this.chain = module.createStreamingMasteringChain(config as Record<string, unknown>);
68
+ const { loudnessStaticGainDb, loudnessStaticGainPeakDb, ...chainConfig } = config;
69
+ this.chain = module.createStreamingMasteringChain({
70
+ __flatParams: flattenChainConfig(chainConfig),
71
+ loudnessStaticGainDb,
72
+ loudnessStaticGainPeakDb,
73
+ });
68
74
  }
69
75
 
70
76
  /**
@@ -98,6 +104,21 @@ export class StreamingMasteringChain {
98
104
  return this.chain.processStereo(left, right);
99
105
  }
100
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
+
101
122
  /** Reset all processor state without rebuilding. */
102
123
  reset(): void {
103
124
  this.chain.reset();
package/src/validation.ts CHANGED
@@ -78,6 +78,12 @@ export function assertSampleRate(fnName: string, sampleRate: number): void {
78
78
  }
79
79
  }
80
80
 
81
+ /** Validate and retain the public Audio.fromBuffer construction contract. */
82
+ export function validateAudioBuffer(samples: Float32Array, sampleRate: number): void {
83
+ assertSamples('Audio.fromBuffer', samples, true);
84
+ assertSampleRate('Audio.fromBuffer', sampleRate);
85
+ }
86
+
81
87
  export function assertNonNegativeInteger(fnName: string, value: number, argName: string): void {
82
88
  if (!Number.isInteger(value) || value < 0) {
83
89
  throw new RangeError(`${fnName}: ${argName} must be a non-negative integer`);