@libraz/libsonare 1.2.3 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +38 -1
  2. package/dist/index.d.ts +1 -2842
  3. package/dist/index.js +3667 -1984
  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 +4816 -483
  11. package/dist/worklet.js +747 -440
  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 +341 -4963
  26. package/src/live_audio.ts +47 -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 +203 -0
  31. package/src/project.ts +1614 -0
  32. package/src/public_types.ts +177 -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 +302 -4
  38. package/src/stream_analyzer.ts +275 -0
  39. package/src/stream_types.ts +26 -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 +366 -0
@@ -98,6 +98,8 @@ export interface WasmTimbreResult {
98
98
 
99
99
  export interface WasmDynamicsResult {
100
100
  dynamicRangeDb: number;
101
+ peakDb: number;
102
+ rmsDb: number;
101
103
  loudnessRangeDb: number;
102
104
  crestFactor: number;
103
105
  isCompressed: boolean;
@@ -107,6 +109,8 @@ export interface WasmRhythmResult {
107
109
  syncopation: number;
108
110
  grooveType: string;
109
111
  patternRegularity: number;
112
+ tempoStability: number;
113
+ timeSignature: WasmTimeSignatureResult;
110
114
  }
111
115
 
112
116
  export interface WasmTimeSignatureResult {
@@ -115,6 +119,14 @@ export interface WasmTimeSignatureResult {
115
119
  confidence: number;
116
120
  }
117
121
 
122
+ export interface WasmMelodyContourResult {
123
+ pitchRangeOctaves: number;
124
+ pitchStability: number;
125
+ meanFrequency: number;
126
+ vibratoRate: number;
127
+ pitches: WasmMelodyPoint[];
128
+ }
129
+
118
130
  export interface WasmAnalysisResult {
119
131
  bpm: number;
120
132
  bpmConfidence: number;
@@ -126,6 +138,7 @@ export interface WasmAnalysisResult {
126
138
  timbre: WasmTimbreResult;
127
139
  dynamics: WasmDynamicsResult;
128
140
  rhythm: WasmRhythmResult;
141
+ melody: WasmMelodyContourResult;
129
142
  form: string;
130
143
  }
131
144
 
@@ -163,6 +176,27 @@ export interface WasmDynamicsAnalysisResult {
163
176
  loudnessRmsDb: Float32Array;
164
177
  }
165
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
+
166
200
  export interface WasmTimbreFrameResult {
167
201
  brightness: number;
168
202
  warmth: number;
@@ -206,6 +240,9 @@ export interface WasmRoomGeometryOptions {
206
240
  widthM?: number;
207
241
  heightM?: number;
208
242
  absorption?: number;
243
+ materialPreset?: number;
244
+ bandAbsorption?: Float32Array | number[];
245
+ bandScattering?: Float32Array | number[];
209
246
  sourceX?: number;
210
247
  sourceY?: number;
211
248
  sourceZ?: number;
@@ -263,6 +300,11 @@ export interface WasmHpssResult {
263
300
  sampleRate: number;
264
301
  }
265
302
 
303
+ export interface WasmAudioFromMemoryResult {
304
+ samples: Float32Array;
305
+ sampleRate: number;
306
+ }
307
+
266
308
  export interface WasmHpssWithResidualResult {
267
309
  harmonic: Float32Array;
268
310
  percussive: Float32Array;
@@ -372,6 +414,12 @@ export interface WasmFourierTempogramResult {
372
414
  data: Float32Array;
373
415
  }
374
416
 
417
+ export interface WasmOnsetStrengthMultiResult {
418
+ nBands: number;
419
+ nFrames: number;
420
+ data: Float32Array;
421
+ }
422
+
375
423
  export interface WasmNnlsChromaResult {
376
424
  nChroma: number;
377
425
  nFrames: number;
@@ -470,7 +518,7 @@ export interface WasmMixResult {
470
518
 
471
519
  export interface WasmEngineClip {
472
520
  id?: number;
473
- channels: Float32Array[];
521
+ channels?: Float32Array[];
474
522
  startPpq: number;
475
523
  lengthSamples?: number;
476
524
  clipOffsetSamples?: number;
@@ -478,6 +526,15 @@ export interface WasmEngineClip {
478
526
  gain?: number;
479
527
  fadeInSamples?: number;
480
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;
481
538
  }
482
539
 
483
540
  export interface WasmEngineParameterInfo {
@@ -576,6 +633,8 @@ export interface WasmEngineCaptureStatus {
576
633
  overflowCount: number;
577
634
  armed: boolean;
578
635
  punchEnabled: boolean;
636
+ source: 'output' | 'input';
637
+ recordOffsetSamples: number;
579
638
  }
580
639
 
581
640
  export interface WasmEngineTransportState {
@@ -674,12 +733,81 @@ export interface WasmRealtimeEngine {
674
733
  graphConnectionCount: () => number;
675
734
  setClips: (clips: WasmEngineClip[]) => void;
676
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;
677
741
  setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
678
742
  armCapture: (armed: boolean) => void;
679
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;
680
747
  resetCapture: () => void;
681
748
  captureStatus: () => WasmEngineCaptureStatus;
682
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;
683
811
  process: (channels: Float32Array[]) => Float32Array[];
684
812
  prepareChannels: (numChannels: number, maxFrames: number) => void;
685
813
  getChannelBuffer: (channel: number, numFrames: number) => Float32Array;
@@ -696,7 +824,19 @@ export interface WasmRealtimeEngine {
696
824
  export type ProgressCallback = (progress: number, stage: string) => void;
697
825
  export type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;
698
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
+
699
837
  export interface SonareModule {
838
+ audioFromMemory: (bytes: Uint8Array) => WasmAudioFromMemoryResult;
839
+
700
840
  // Quick API (high-level)
701
841
  detectBpm: (samples: Float32Array, sampleRate: number) => number;
702
842
  detectKey: (samples: Float32Array, sampleRate: number) => WasmKeyResult;
@@ -745,7 +885,29 @@ export interface SonareModule {
745
885
  detectInversions: boolean,
746
886
  chromaMethod: number,
747
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[];
748
906
  analyze: (samples: Float32Array, sampleRate: number) => WasmAnalysisResult;
907
+ _synthEnumTables: () => WasmSynthEnumTables;
908
+ _synthPatchRoundTrip: (patch: unknown) => unknown;
909
+ _analysisResultSchemaPaths: () => string[];
910
+ _analysisResultSchemaFixture: () => WasmAnalysisResult;
749
911
  analyzeImpulseResponse: (
750
912
  samples: Float32Array,
751
913
  sampleRate: number,
@@ -865,6 +1027,12 @@ export interface SonareModule {
865
1027
  right: Float32Array,
866
1028
  sampleRate: number,
867
1029
  ) => { mid: Float32Array; side: Float32Array };
1030
+ meteringVectorscopeDecimated: (
1031
+ left: Float32Array,
1032
+ right: Float32Array,
1033
+ sampleRate: number,
1034
+ maxPoints: number,
1035
+ ) => { mid: Float32Array; side: Float32Array };
868
1036
  meteringPhaseScope: (
869
1037
  left: Float32Array,
870
1038
  right: Float32Array,
@@ -878,6 +1046,20 @@ export interface SonareModule {
878
1046
  averageAbsAngleRad: number;
879
1047
  maxRadius: number;
880
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
+ };
881
1063
  meteringSpectrum: (
882
1064
  samples: Float32Array,
883
1065
  sampleRate: number,
@@ -896,6 +1078,47 @@ export interface SonareModule {
896
1078
  nFft: number;
897
1079
  sampleRate: number;
898
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
+ }>;
899
1122
 
900
1123
  scaleQuantizeMidi: (
901
1124
  root: number,
@@ -932,6 +1155,15 @@ export interface SonareModule {
932
1155
  nIter: number,
933
1156
  beta: number,
934
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;
935
1167
  nnFilter: (
936
1168
  s: Float32Array,
937
1169
  nFeatures: number,
@@ -963,6 +1195,15 @@ export interface SonareModule {
963
1195
  currentMidi: number,
964
1196
  targetMidi: number,
965
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;
966
1207
  noteStretch: (
967
1208
  samples: Float32Array,
968
1209
  sampleRate: number,
@@ -1171,6 +1412,9 @@ export interface SonareModule {
1171
1412
  nFft: number,
1172
1413
  hopLength: number,
1173
1414
  nMels: number,
1415
+ fmin: number,
1416
+ fmax: number,
1417
+ htk: boolean,
1174
1418
  ) => WasmMelResult;
1175
1419
  mfcc: (
1176
1420
  samples: Float32Array,
@@ -1179,6 +1423,9 @@ export interface SonareModule {
1179
1423
  hopLength: number,
1180
1424
  nMels: number,
1181
1425
  nMfcc: number,
1426
+ fmin: number,
1427
+ fmax: number,
1428
+ htk: boolean,
1182
1429
  ) => WasmMfccResult;
1183
1430
 
1184
1431
  // Features - Inverse reconstruction
@@ -1190,6 +1437,7 @@ export interface SonareModule {
1190
1437
  nFft: number,
1191
1438
  fmin: number,
1192
1439
  fmax: number,
1440
+ htk: boolean,
1193
1441
  ) => WasmStftPowerResult;
1194
1442
  melToAudio: (
1195
1443
  melPower: Float32Array,
@@ -1201,6 +1449,7 @@ export interface SonareModule {
1201
1449
  fmin: number,
1202
1450
  fmax: number,
1203
1451
  nIter: number,
1452
+ htk: boolean,
1204
1453
  ) => Float32Array;
1205
1454
  mfccToMel: (
1206
1455
  mfcc: Float32Array,
@@ -1219,6 +1468,7 @@ export interface SonareModule {
1219
1468
  fmin: number,
1220
1469
  fmax: number,
1221
1470
  nIter: number,
1471
+ htk: boolean,
1222
1472
  ) => Float32Array;
1223
1473
 
1224
1474
  // Features - Chroma
@@ -1395,6 +1645,18 @@ export interface SonareModule {
1395
1645
  tempoMax: number,
1396
1646
  winLength: number,
1397
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;
1398
1660
  nnlsChroma: (samples: Float32Array, sampleRate: number) => WasmNnlsChromaResult;
1399
1661
  cqt: (
1400
1662
  samples: Float32Array,
@@ -1404,6 +1666,22 @@ export interface SonareModule {
1404
1666
  nBins: number,
1405
1667
  binsPerOctave: number,
1406
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;
1407
1685
  vqt: (
1408
1686
  samples: Float32Array,
1409
1687
  sampleRate: number,
@@ -1428,6 +1706,8 @@ export interface SonareModule {
1428
1706
  frameLength: number,
1429
1707
  hopLength: number,
1430
1708
  threshold: number,
1709
+ usePyin: boolean,
1710
+ center: boolean,
1431
1711
  ) => WasmMelodyResult;
1432
1712
  onsetEnvelope: (
1433
1713
  samples: Float32Array,
@@ -1436,6 +1716,14 @@ export interface SonareModule {
1436
1716
  hopLength: number,
1437
1717
  nMels: number,
1438
1718
  ) => Float32Array;
1719
+ onsetStrengthMulti: (
1720
+ samples: Float32Array,
1721
+ sampleRate: number,
1722
+ nFft: number,
1723
+ hopLength: number,
1724
+ nMels: number,
1725
+ nBands: number,
1726
+ ) => WasmOnsetStrengthMultiResult;
1439
1727
  fourierTempogram: (
1440
1728
  onsetEnvelope: Float32Array,
1441
1729
  sampleRate: number,
@@ -1507,6 +1795,7 @@ export interface SonareModule {
1507
1795
  };
1508
1796
 
1509
1797
  // Streaming - StreamAnalyzer
1798
+ streamAnalyzerConfigDefault: () => WasmStreamConfigDefaults;
1510
1799
  StreamAnalyzer: new (
1511
1800
  sampleRate: number,
1512
1801
  nFft: number,
@@ -1687,8 +1976,9 @@ export interface WasmMixer {
1687
1976
  timing: number,
1688
1977
  ) => number;
1689
1978
  setSendDb: (stripIndex: number, sendIndex: number, sendDb: number) => void;
1979
+ removeSend: (stripIndex: number, sendIndex: number) => void;
1690
1980
  meterTap: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
1691
- stripMeter: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
1981
+ stripMeter: (stripIndex: number) => WasmMixMeterSnapshot;
1692
1982
  scheduleFaderAutomation: (
1693
1983
  stripIndex: number,
1694
1984
  samplePos: number,
@@ -1719,9 +2009,16 @@ export interface WasmMixer {
1719
2009
  removeBus: (id: string) => void;
1720
2010
  busCount: () => number;
1721
2011
  addVcaGroup: (id: string, gainDb: number, members: string[]) => void;
2012
+ setVcaGroupGainDb: (id: string, gainDb: number) => void;
1722
2013
  removeVcaGroup: (id: string) => void;
1723
2014
  vcaGroupCount: () => number;
1724
2015
  toSceneJson: () => string;
2016
+ tailSamples: () => number;
2017
+ drainTailStereo: (numSamples: number) => {
2018
+ left: Float32Array;
2019
+ right: Float32Array;
2020
+ sampleRate: number;
2021
+ };
1725
2022
  delete: () => void;
1726
2023
  }
1727
2024
 
@@ -1826,10 +2123,11 @@ export interface WasmStreamFramesI16 {
1826
2123
  export interface WasmStreamAnalyzer {
1827
2124
  process: (samples: Float32Array) => void;
1828
2125
  processWithOffset: (samples: Float32Array, sampleOffset: number) => void;
2126
+ finalize: () => void;
1829
2127
  availableFrames: () => number;
1830
2128
  readFramesSoa: (maxFrames: number) => WasmFrameBuffer;
1831
- readFramesU8: (maxFrames: number) => WasmStreamFramesU8;
1832
- readFramesI16: (maxFrames: number) => WasmStreamFramesI16;
2129
+ readFramesU8: (maxFrames: number, quantizeConfig?: unknown) => WasmStreamFramesU8;
2130
+ readFramesI16: (maxFrames: number, quantizeConfig?: unknown) => WasmStreamFramesI16;
1833
2131
  reset: (baseSampleOffset?: number) => void;
1834
2132
  stats: () => WasmAnalyzerStats;
1835
2133
  frameCount: () => number;