@libraz/libsonare 1.5.5 → 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 (75) 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 +759 -35
  6. package/dist/index.js +904 -209
  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 +574 -86
  18. package/dist/worklet.js +1634 -235
  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 +6 -0
  24. package/src/clip_page_streamer.ts +62 -8
  25. package/src/codes.ts +51 -64
  26. package/src/effects_mastering.ts +1 -0
  27. package/src/errors.ts +1 -0
  28. package/src/feature_core.ts +140 -2
  29. package/src/feature_music.ts +17 -2
  30. package/src/feature_pitch.ts +70 -1
  31. package/src/feature_spectral.ts +231 -5
  32. package/src/feature_spectrogram.ts +159 -0
  33. package/src/features.ts +16 -1
  34. package/src/index.ts +101 -7
  35. package/src/mastering_chain.ts +20 -8
  36. package/src/mastering_core.ts +5 -0
  37. package/src/mastering_dynamics.ts +7 -1
  38. package/src/metering.ts +6 -1
  39. package/src/opfs_clip_pages.ts +26 -1
  40. package/src/project.ts +7 -0
  41. package/src/project_class.ts +62 -8
  42. package/src/project_internal.ts +24 -29
  43. package/src/project_types.ts +69 -10
  44. package/src/public_types.ts +68 -0
  45. package/src/public_types_mastering.ts +22 -0
  46. package/src/public_types_mixing.ts +11 -2
  47. package/src/public_types_music.ts +9 -0
  48. package/src/public_types_spectral.ts +33 -0
  49. package/src/quick_analysis.ts +25 -7
  50. package/src/realtime_engine.ts +153 -3
  51. package/src/realtime_voice_changer.ts +51 -77
  52. package/src/sonare-analysis.js.d.ts +8 -0
  53. package/src/sonare.js.d.ts +276 -6
  54. package/src/streaming_processors.ts +15 -0
  55. package/src/web_midi.ts +36 -4
  56. package/src/worker.ts +196 -0
  57. package/src/worker_client.ts +352 -0
  58. package/src/worker_protocol.ts +59 -0
  59. package/src/worklet/engine-automation.ts +2 -1
  60. package/src/worklet/engine-capture-facade.ts +13 -4
  61. package/src/worklet/engine-clips.ts +12 -3
  62. package/src/worklet/engine-node.ts +212 -4
  63. package/src/worklet/engine-offline.ts +7 -2
  64. package/src/worklet/engine-parameter-facade.ts +26 -5
  65. package/src/worklet/engine-processor.ts +383 -42
  66. package/src/worklet/engine-register.ts +8 -0
  67. package/src/worklet/engine-strips.ts +17 -1
  68. package/src/worklet/engine-sync.ts +2 -6
  69. package/src/worklet/engine-tempo-facade.ts +8 -6
  70. package/src/worklet/engine.ts +380 -13
  71. package/src/worklet/guards.ts +22 -1
  72. package/src/worklet/messages.ts +125 -7
  73. package/src/worklet/protocol.ts +301 -17
  74. package/src/worklet/voice-changer-processor.ts +12 -15
  75. 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,36 @@ 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
+ }
627
703
 
628
704
  export interface WasmEngineMetronomeConfig {
629
705
  enabled: boolean;
@@ -843,6 +919,7 @@ export interface WasmRealtimeEngine {
843
919
  stop: (renderFrame: number) => void;
844
920
  seekSample: (timelineSample: number, renderFrame: number) => void;
845
921
  settleParameters: () => void;
922
+ flushControlCommands: () => void;
846
923
  seekPpq: (ppq: number, renderFrame: number) => void;
847
924
  setTempo: (bpm: number) => void;
848
925
  setTempoSegments: (segments: WasmEngineTempoSegment[]) => void;
@@ -926,10 +1003,14 @@ export interface WasmRealtimeEngine {
926
1003
  clearClipPage: (providerId: number, pageIndex: number) => void;
927
1004
  destroyClipPageProvider: (providerId: number) => void;
928
1005
  popClipPageRequest: () => WasmClipPageRequest | null;
1006
+ popClipPageRequestToScratch: () => boolean;
1007
+ clipPageRequestScratchClipId: () => number;
1008
+ clipPageRequestScratchSample: () => number;
1009
+ clipPageRequestOverflowCount: () => number;
929
1010
  setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
930
1011
  armCapture: (armed: boolean) => void;
931
1012
  setCapturePunch: (startSample: number, endSample: number, enabled: boolean) => void;
932
- setCaptureSource: (source: WasmEngineCaptureStatus['source']) => void;
1013
+ setCaptureSource: (source: WasmEngineCaptureStatus['source'] | number) => void;
933
1014
  setRecordOffsetSamples: (offsetSamples: number) => void;
934
1015
  setInputMonitor: (enabled: boolean, gain: number) => void;
935
1016
  resetCapture: () => void;
@@ -1002,14 +1083,29 @@ export interface WasmRealtimeEngine {
1002
1083
  value: number,
1003
1084
  renderFrame: number,
1004
1085
  ) => void;
1086
+ pushMidiUmp: (destinationId: number, word0: number, renderFrame: number) => void;
1005
1087
  pushMidiSysex: (destinationId: number, data: Uint8Array, renderFrame: number) => void;
1006
1088
  pushMidiPanic: (renderFrame: number) => void;
1007
1089
  setMidiDestinationExternal: (destinationId: number, external: boolean) => void;
1008
1090
  setExternalMidiClockEnabled: (enabled: boolean) => void;
1009
1091
  externalMidiDroppedCount: () => number;
1092
+ externalMidiPendingCount: () => number;
1010
1093
  drainExternalMidi: (maxRecords: number) => WasmExternalMidiEvent[];
1094
+ popExternalMidiToScratch: () => boolean;
1095
+ externalMidiScratchDestinationId: () => number;
1096
+ externalMidiScratchRenderFrame: () => number;
1097
+ externalMidiScratchByteWord: () => number;
1098
+ externalMidiScratchByteCount: () => number;
1099
+ consumeExternalMidiScratch: () => void;
1011
1100
  clearParameters: () => void;
1012
1101
  process: (channels: Float32Array[]) => Float32Array[];
1102
+ prepareWithChannels: (
1103
+ sampleRate: number,
1104
+ maxBlockSize: number,
1105
+ commandCapacity: number,
1106
+ telemetryCapacity: number,
1107
+ maxChannels: number,
1108
+ ) => void;
1013
1109
  prepareChannels: (numChannels: number, maxFrames: number) => void;
1014
1110
  getChannelBuffer: (channel: number, numFrames: number) => Float32Array;
1015
1111
  processPrepared: (numFrames: number) => void;
@@ -1018,19 +1114,40 @@ export interface WasmRealtimeEngine {
1018
1114
  bounceOffline: (options: WasmEngineBounceOptions) => WasmEngineBounceResult;
1019
1115
  freezeOffline: (options: WasmEngineFreezeOptions) => WasmEngineFreezeResult;
1020
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;
1021
1129
  drainMeterTelemetry: (maxRecords: number) => WasmEngineMeterTelemetry[];
1022
1130
  drainMeterTelemetryWide: (maxRecords: number) => WasmEngineMeterTelemetryWide[];
1023
1131
  configureScopeTelemetry: (intervalFrames: number, bandCount: number) => number;
1024
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;
1025
1141
  delete: () => void;
1026
1142
  }
1027
1143
 
1028
- export type ProgressCallback = (progress: number, stage: string) => void;
1144
+ export type { ProgressCallback } from './public_types';
1029
1145
  export type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
1030
1146
 
1031
1147
  export interface WasmSynthEnumTables {
1032
1148
  engineModes: string[];
1033
1149
  waveforms: string[];
1150
+ builtinWaveforms: string[];
1034
1151
  filterModels: string[];
1035
1152
  filterOutputs: string[];
1036
1153
  bodyTypes: string[];
@@ -1068,7 +1185,7 @@ export interface SonareModule {
1068
1185
  profileType: number,
1069
1186
  genreHint: string,
1070
1187
  ) => WasmKeyCandidateResult[];
1071
- detectOnsets: (samples: Float32Array, sampleRate: number) => Float32Array;
1188
+ detectOnsets: (samples: Float32Array, sampleRate: number, options: object) => Float32Array;
1072
1189
  detectBeats: (samples: Float32Array, sampleRate: number) => Float32Array;
1073
1190
  detectDownbeats: (samples: Float32Array, sampleRate: number) => Float32Array;
1074
1191
  detectChords: (
@@ -1142,6 +1259,7 @@ export interface SonareModule {
1142
1259
  samples: Float32Array,
1143
1260
  sampleRate: number,
1144
1261
  progressCallback: ProgressCallback | null,
1262
+ cancelCallback: (() => boolean) | null,
1145
1263
  ) => WasmAnalysisResult;
1146
1264
  analyzeBpm: (
1147
1265
  samples: Float32Array,
@@ -1181,11 +1299,13 @@ export interface SonareModule {
1181
1299
  detectKeyCandidates: (samples: Float32Array, sampleRate: number) => WasmKeyCandidateResult[];
1182
1300
  hasFfmpegSupport: () => boolean;
1183
1301
  version: () => string;
1302
+ capabilities: () => SonareCapabilities;
1303
+ capabilityCatalog: () => string;
1184
1304
  abiVersion: () => number;
1185
1305
  engineAbiVersion: () => number;
1186
1306
  voiceChangerAbiVersion: () => number;
1187
- voiceCharacterPresetId: (preset: number) => string | null;
1188
- realtimeVoiceChangerPresetConfig: (preset: number) => WasmRealtimeVoiceChangerPodConfig | null;
1307
+ voiceCharacterPresetId: (preset: number) => string;
1308
+ realtimeVoiceChangerPresetConfig: (preset: number) => WasmRealtimeVoiceChangerPodConfig;
1189
1309
 
1190
1310
  meteringPeakDb: (samples: Float32Array, sampleRate: number) => number;
1191
1311
  meteringRmsDb: (samples: Float32Array, sampleRate: number) => number;
@@ -1590,6 +1710,7 @@ export interface SonareModule {
1590
1710
  sampleRate: number,
1591
1711
  config: Record<string, unknown>,
1592
1712
  progressCallback: ProgressCallback | null,
1713
+ cancelCallback: (() => boolean) | null,
1593
1714
  ) => WasmMasteringChainResult;
1594
1715
  masteringChainStereoWithProgress: (
1595
1716
  left: Float32Array,
@@ -1597,6 +1718,7 @@ export interface SonareModule {
1597
1718
  sampleRate: number,
1598
1719
  config: Record<string, unknown>,
1599
1720
  progressCallback: ProgressCallback | null,
1721
+ cancelCallback: (() => boolean) | null,
1600
1722
  ) => WasmMasteringStereoChainResult;
1601
1723
  masteringPresetNames: () => string[];
1602
1724
  masterAudio: (
@@ -1618,6 +1740,7 @@ export interface SonareModule {
1618
1740
  sampleRate: number,
1619
1741
  overrides: Record<string, number | boolean> | null,
1620
1742
  progressCallback: ProgressCallback | null,
1743
+ cancelCallback: (() => boolean) | null,
1621
1744
  ) => WasmMasteringChainResult;
1622
1745
  masterAudioStereoWithProgress: (
1623
1746
  presetName: string,
@@ -1626,6 +1749,7 @@ export interface SonareModule {
1626
1749
  sampleRate: number,
1627
1750
  overrides: Record<string, number | boolean> | null,
1628
1751
  progressCallback: ProgressCallback | null,
1752
+ cancelCallback: (() => boolean) | null,
1629
1753
  ) => WasmMasteringStereoChainResult;
1630
1754
  mixingScenePresetNames: () => string[];
1631
1755
  mixingScenePresetJson: (presetName: string) => string;
@@ -1680,6 +1804,79 @@ export interface SonareModule {
1680
1804
  htk: boolean,
1681
1805
  lifter: number,
1682
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;
1683
1880
 
1684
1881
  // Features - Inverse reconstruction
1685
1882
  melToStft: (
@@ -1704,6 +1901,16 @@ export interface SonareModule {
1704
1901
  nIter: number,
1705
1902
  htk: boolean,
1706
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;
1707
1914
  mfccToMel: (
1708
1915
  mfcc: Float32Array,
1709
1916
  nMfcc: number,
@@ -1746,6 +1953,7 @@ export interface SonareModule {
1746
1953
  sampleRate: number,
1747
1954
  nFft: number,
1748
1955
  hopLength: number,
1956
+ p: number,
1749
1957
  ) => Float32Array;
1750
1958
  spectralRolloff: (
1751
1959
  samples: Float32Array,
@@ -1760,6 +1968,13 @@ export interface SonareModule {
1760
1968
  nFft: number,
1761
1969
  hopLength: number,
1762
1970
  ) => Float32Array;
1971
+ spectralFlux: (
1972
+ samples: Float32Array,
1973
+ sampleRate: number,
1974
+ nFft: number,
1975
+ hopLength: number,
1976
+ lag: number,
1977
+ ) => Float32Array;
1763
1978
  zeroCrossingRate: (
1764
1979
  samples: Float32Array,
1765
1980
  sampleRate: number,
@@ -1826,6 +2041,30 @@ export interface SonareModule {
1826
2041
  threshold: number,
1827
2042
  fillNa: boolean,
1828
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[];
1829
2068
 
1830
2069
  // Core - Conversion
1831
2070
  hzToMel: (hz: number) => number;
@@ -1857,9 +2096,31 @@ export interface SonareModule {
1857
2096
  hopLength: number,
1858
2097
  ) => Int32Array;
1859
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;
1860
2120
  padCenter: (values: Float32Array, size: number, padValue: number) => Float32Array;
1861
2121
  fixLength: (values: Float32Array, size: number, padValue: number) => Float32Array;
1862
2122
  fixFrames: (frames: Int32Array, xMin: number, xMax: number, pad: boolean) => Int32Array;
2123
+ onsetBacktrack: (events: Int32Array, energy: Float32Array) => Int32Array;
1863
2124
  peakPick: (
1864
2125
  values: Float32Array,
1865
2126
  preMax: number,
@@ -1883,6 +2144,8 @@ export interface SonareModule {
1883
2144
  hopLength: number,
1884
2145
  winLength: number,
1885
2146
  mode: TempogramMode,
2147
+ center: boolean,
2148
+ norm: boolean,
1886
2149
  ) => WasmTempogramResult;
1887
2150
  cyclicTempogram: (
1888
2151
  onsetEnvelope: Float32Array,
@@ -2019,6 +2282,8 @@ export interface SonareModule {
2019
2282
  sampleRate: number,
2020
2283
  hopLength: number,
2021
2284
  winLength: number,
2285
+ center: boolean,
2286
+ norm: boolean,
2022
2287
  ) => WasmFourierTempogramResult;
2023
2288
  tempogramRatio: (
2024
2289
  tempogramData: Float32Array,
@@ -2115,6 +2380,7 @@ export interface SonareModule {
2115
2380
  maxBlockSize: number,
2116
2381
  commandCapacity: number,
2117
2382
  telemetryCapacity: number,
2383
+ maxChannels?: number,
2118
2384
  ) => WasmRealtimeEngine;
2119
2385
 
2120
2386
  // Streaming - StreamingMasteringChain
@@ -2152,6 +2418,8 @@ export interface WasmStreamingMasteringChain {
2152
2418
  left: Float32Array,
2153
2419
  right: Float32Array,
2154
2420
  ) => { left: Float32Array; right: Float32Array };
2421
+ flushMono: () => Float32Array;
2422
+ flushStereo: () => { left: Float32Array; right: Float32Array };
2155
2423
  reset: () => void;
2156
2424
  latencySamples: () => number;
2157
2425
  stageNames: () => string[];
@@ -2206,8 +2474,10 @@ export interface WasmRealtimeVoiceChanger {
2206
2474
  prepare: (sampleRate: number, maxBlockSize: number, channels: number) => void;
2207
2475
  reset: () => void;
2208
2476
  setConfig: (config: Record<string, unknown> | string) => void;
2477
+ setPodConfig: (config: WasmRealtimeVoiceChangerPodConfig) => void;
2209
2478
  configJson: () => string;
2210
2479
  latencySamples: () => number;
2480
+ bufferGeneration: () => number;
2211
2481
  processMono: (samples: Float32Array) => Float32Array;
2212
2482
  processMonoInto: (samples: Float32Array, output: Float32Array) => void;
2213
2483
  processInterleaved: (samples: Float32Array, channels: number) => Float32Array;
@@ -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();
package/src/web_midi.ts CHANGED
@@ -1,4 +1,36 @@
1
- import type { MidiCcBindOptions, RealtimeEngine } from './realtime_engine';
1
+ import type { MidiCcBindOptions } from './realtime_engine';
2
+
3
+ export interface WebMidiEngine {
4
+ bindMidiCc(
5
+ channel: number,
6
+ controller: number,
7
+ paramId: number,
8
+ options?: MidiCcBindOptions,
9
+ ): void;
10
+ setMidiInputSource(destinationId?: number): void;
11
+ clearMidiInputSource(): void;
12
+ pushMidiInputNoteOn(
13
+ group: number,
14
+ channel: number,
15
+ note: number,
16
+ velocity: number,
17
+ time?: number,
18
+ ): void;
19
+ pushMidiInputNoteOff(
20
+ group: number,
21
+ channel: number,
22
+ note: number,
23
+ velocity?: number,
24
+ time?: number,
25
+ ): void;
26
+ pushMidiInputCc(
27
+ group: number,
28
+ channel: number,
29
+ controller: number,
30
+ value: number,
31
+ time?: number,
32
+ ): void;
33
+ }
2
34
 
3
35
  type MidiInputState = 'connected' | 'disconnected';
4
36
 
@@ -103,7 +135,7 @@ export function isWebMidiAvailable(): boolean {
103
135
  }
104
136
 
105
137
  export async function bindWebMidi(
106
- engine: RealtimeEngine,
138
+ engine: WebMidiEngine,
107
139
  options: BindWebMidiOptions = {},
108
140
  ): Promise<WebMidiBinding> {
109
141
  const navigatorWithMidi = globalThis.navigator as NavigatorWithMidi | undefined;
@@ -237,7 +269,7 @@ export async function bindWebMidi(
237
269
  }
238
270
 
239
271
  function dispatchMidiMessage(
240
- engine: RealtimeEngine,
272
+ engine: WebMidiEngine,
241
273
  event: MidiMessageEventLike,
242
274
  group: number,
243
275
  runningStatus: number,
@@ -300,7 +332,7 @@ function dispatchMidiMessage(
300
332
  }
301
333
 
302
334
  function dispatchUmpMessage(
303
- engine: RealtimeEngine,
335
+ engine: WebMidiEngine,
304
336
  words: ArrayLike<number>,
305
337
  portTimeSamples: number,
306
338
  ): void {