@libraz/libsonare 1.7.2 → 1.8.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 (303) hide show
  1. package/NOTICE +178 -0
  2. package/README.md +26 -203
  3. package/dist/_chain_config.d.ts +14 -0
  4. package/dist/_chain_config.d.ts.map +1 -0
  5. package/dist/_effects_common.d.ts +6 -0
  6. package/dist/_effects_common.d.ts.map +1 -0
  7. package/dist/_feature_validation.d.ts +8 -0
  8. package/dist/_feature_validation.d.ts.map +1 -0
  9. package/dist/_fft_options.d.ts +24 -0
  10. package/dist/_fft_options.d.ts.map +1 -0
  11. package/dist/align_take.d.ts +50 -0
  12. package/dist/align_take.d.ts.map +1 -0
  13. package/dist/analysis.d.ts +29 -5840
  14. package/dist/analysis.d.ts.map +1 -0
  15. package/dist/analysis.js +873 -722
  16. package/dist/analysis.js.map +1 -1
  17. package/dist/analysis_helpers.d.ts +9 -0
  18. package/dist/analysis_helpers.d.ts.map +1 -0
  19. package/dist/audio.d.ts +163 -0
  20. package/dist/audio.d.ts.map +1 -0
  21. package/dist/clip_page_streamer.d.ts +133 -0
  22. package/dist/clip_page_streamer.d.ts.map +1 -0
  23. package/dist/codes.d.ts +44 -0
  24. package/dist/codes.d.ts.map +1 -0
  25. package/dist/effects_mastering.d.ts +23 -0
  26. package/dist/effects_mastering.d.ts.map +1 -0
  27. package/dist/effects_note_ops.d.ts +477 -0
  28. package/dist/effects_note_ops.d.ts.map +1 -0
  29. package/dist/effects_percussive.d.ts +185 -0
  30. package/dist/effects_percussive.d.ts.map +1 -0
  31. package/dist/effects_separation.d.ts +65 -0
  32. package/dist/effects_separation.d.ts.map +1 -0
  33. package/dist/effects_spectral.d.ts +28 -0
  34. package/dist/effects_spectral.d.ts.map +1 -0
  35. package/dist/effects_timepitch.d.ts +129 -0
  36. package/dist/effects_timepitch.d.ts.map +1 -0
  37. package/dist/effects_voice_change.d.ts +53 -0
  38. package/dist/effects_voice_change.d.ts.map +1 -0
  39. package/dist/errors.d.ts +51 -0
  40. package/dist/errors.d.ts.map +1 -0
  41. package/dist/feature_core.d.ts +341 -0
  42. package/dist/feature_core.d.ts.map +1 -0
  43. package/dist/feature_decompose.d.ts +278 -0
  44. package/dist/feature_decompose.d.ts.map +1 -0
  45. package/dist/feature_inverse.d.ts +128 -0
  46. package/dist/feature_inverse.d.ts.map +1 -0
  47. package/dist/feature_loudness.d.ts +66 -0
  48. package/dist/feature_loudness.d.ts.map +1 -0
  49. package/dist/feature_music.d.ts +307 -0
  50. package/dist/feature_music.d.ts.map +1 -0
  51. package/dist/feature_pitch.d.ts +108 -0
  52. package/dist/feature_pitch.d.ts.map +1 -0
  53. package/dist/feature_resample.d.ts +16 -0
  54. package/dist/feature_resample.d.ts.map +1 -0
  55. package/dist/feature_spectral.d.ts +137 -0
  56. package/dist/feature_spectral.d.ts.map +1 -0
  57. package/dist/feature_spectrogram.d.ts +198 -0
  58. package/dist/feature_spectrogram.d.ts.map +1 -0
  59. package/dist/features.d.ts +10 -0
  60. package/dist/features.d.ts.map +1 -0
  61. package/dist/hrtf/default.shrf +0 -0
  62. package/dist/index.d.ts +74 -7431
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +3758 -1362
  65. package/dist/index.js.map +1 -1
  66. package/dist/instrument_types.d.ts +517 -0
  67. package/dist/instrument_types.d.ts.map +1 -0
  68. package/dist/live_audio.d.ts +35 -0
  69. package/dist/live_audio.d.ts.map +1 -0
  70. package/dist/mastering_chain.d.ts +213 -0
  71. package/dist/mastering_chain.d.ts.map +1 -0
  72. package/dist/mastering_core.d.ts +457 -0
  73. package/dist/mastering_core.d.ts.map +1 -0
  74. package/dist/mastering_dynamics.d.ts +80 -0
  75. package/dist/mastering_dynamics.d.ts.map +1 -0
  76. package/dist/metering.d.ts +287 -0
  77. package/dist/metering.d.ts.map +1 -0
  78. package/dist/mixer.d.ts +464 -0
  79. package/dist/mixer.d.ts.map +1 -0
  80. package/dist/mixing_assistant.d.ts +62 -0
  81. package/dist/mixing_assistant.d.ts.map +1 -0
  82. package/dist/mixing_oneshot.d.ts +40 -0
  83. package/dist/mixing_oneshot.d.ts.map +1 -0
  84. package/dist/module_state.d.ts +15 -0
  85. package/dist/module_state.d.ts.map +1 -0
  86. package/dist/opfs_clip_pages.d.ts +28 -0
  87. package/dist/opfs_clip_pages.d.ts.map +1 -0
  88. package/dist/playback_renderer.d.ts +128 -0
  89. package/dist/playback_renderer.d.ts.map +1 -0
  90. package/dist/polyphony.d.ts +202 -0
  91. package/dist/polyphony.d.ts.map +1 -0
  92. package/dist/project.d.ts +8 -0
  93. package/dist/project.d.ts.map +1 -0
  94. package/dist/project_class.d.ts +562 -0
  95. package/dist/project_class.d.ts.map +1 -0
  96. package/dist/project_internal.d.ts +194 -0
  97. package/dist/project_internal.d.ts.map +1 -0
  98. package/dist/project_synth.d.ts +74 -0
  99. package/dist/project_synth.d.ts.map +1 -0
  100. package/dist/project_types.d.ts +652 -0
  101. package/dist/project_types.d.ts.map +1 -0
  102. package/dist/public_types.d.ts +185 -0
  103. package/dist/public_types.d.ts.map +1 -0
  104. package/dist/public_types_acoustic.d.ts +215 -0
  105. package/dist/public_types_acoustic.d.ts.map +1 -0
  106. package/dist/public_types_mastering.d.ts +510 -0
  107. package/dist/public_types_mastering.d.ts.map +1 -0
  108. package/dist/public_types_mixing.d.ts +436 -0
  109. package/dist/public_types_mixing.d.ts.map +1 -0
  110. package/dist/public_types_music.d.ts +619 -0
  111. package/dist/public_types_music.d.ts.map +1 -0
  112. package/dist/public_types_playback.d.ts +164 -0
  113. package/dist/public_types_playback.d.ts.map +1 -0
  114. package/dist/public_types_realtime.d.ts +174 -0
  115. package/dist/public_types_realtime.d.ts.map +1 -0
  116. package/dist/public_types_repair.d.ts +424 -0
  117. package/dist/public_types_repair.d.ts.map +1 -0
  118. package/dist/public_types_spectral.d.ts +697 -0
  119. package/dist/public_types_spectral.d.ts.map +1 -0
  120. package/dist/quick_analysis.d.ts +445 -0
  121. package/dist/quick_analysis.d.ts.map +1 -0
  122. package/dist/realtime_engine.d.ts +850 -0
  123. package/dist/realtime_engine.d.ts.map +1 -0
  124. package/dist/realtime_voice_changer.d.ts +158 -0
  125. package/dist/realtime_voice_changer.d.ts.map +1 -0
  126. package/dist/repair_dereverb.d.ts +187 -0
  127. package/dist/repair_dereverb.d.ts.map +1 -0
  128. package/dist/repair_impulsive.d.ts +186 -0
  129. package/dist/repair_impulsive.d.ts.map +1 -0
  130. package/dist/repair_noise.d.ts +239 -0
  131. package/dist/repair_noise.d.ts.map +1 -0
  132. package/dist/repair_trim.d.ts +123 -0
  133. package/dist/repair_trim.d.ts.map +1 -0
  134. package/dist/sample_bank.d.ts +84 -0
  135. package/dist/sample_bank.d.ts.map +1 -0
  136. package/dist/scale.d.ts +10 -0
  137. package/dist/scale.d.ts.map +1 -0
  138. package/dist/schemas/mixer-scene.schema.json +393 -0
  139. package/dist/schemas/playback-renderer-config.schema.json +392 -0
  140. package/dist/sonare-analysis.d.ts +8 -0
  141. package/dist/sonare-analysis.js +2 -2
  142. package/dist/sonare-analysis.wasm +0 -0
  143. package/dist/sonare.d.ts +3909 -0
  144. package/dist/sonare.js +2 -2
  145. package/dist/sonare.wasm +0 -0
  146. package/dist/stream_analyzer.d.ts +163 -0
  147. package/dist/stream_analyzer.d.ts.map +1 -0
  148. package/dist/stream_types.d.ts +214 -0
  149. package/dist/stream_types.d.ts.map +1 -0
  150. package/dist/streaming_mixing.d.ts +6 -0
  151. package/dist/streaming_mixing.d.ts.map +1 -0
  152. package/dist/streaming_processors.d.ts +335 -0
  153. package/dist/streaming_processors.d.ts.map +1 -0
  154. package/dist/transcribe.d.ts +77 -0
  155. package/dist/transcribe.d.ts.map +1 -0
  156. package/dist/validation.d.ts +140 -0
  157. package/dist/validation.d.ts.map +1 -0
  158. package/dist/web_midi.d.ts +77 -0
  159. package/dist/web_midi.d.ts.map +1 -0
  160. package/dist/worker.d.ts +5 -48
  161. package/dist/worker.d.ts.map +1 -0
  162. package/dist/worker.js +94 -41
  163. package/dist/worker.js.map +1 -1
  164. package/dist/worker_client.d.ts +96 -0
  165. package/dist/worker_client.d.ts.map +1 -0
  166. package/dist/worker_protocol.d.ts +43 -0
  167. package/dist/worker_protocol.d.ts.map +1 -0
  168. package/dist/worklet/audio_types.d.ts +21 -0
  169. package/dist/worklet/audio_types.d.ts.map +1 -0
  170. package/dist/worklet/engine-automation.d.ts +29 -0
  171. package/dist/worklet/engine-automation.d.ts.map +1 -0
  172. package/dist/worklet/engine-capture-facade.d.ts +35 -0
  173. package/dist/worklet/engine-capture-facade.d.ts.map +1 -0
  174. package/dist/worklet/engine-clips.d.ts +23 -0
  175. package/dist/worklet/engine-clips.d.ts.map +1 -0
  176. package/dist/worklet/engine-markers.d.ts +40 -0
  177. package/dist/worklet/engine-markers.d.ts.map +1 -0
  178. package/dist/worklet/engine-mixer-facade.d.ts +128 -0
  179. package/dist/worklet/engine-mixer-facade.d.ts.map +1 -0
  180. package/dist/worklet/engine-node.d.ts +81 -0
  181. package/dist/worklet/engine-node.d.ts.map +1 -0
  182. package/dist/worklet/engine-offline.d.ts +81 -0
  183. package/dist/worklet/engine-offline.d.ts.map +1 -0
  184. package/dist/worklet/engine-options.d.ts +12 -0
  185. package/dist/worklet/engine-options.d.ts.map +1 -0
  186. package/dist/worklet/engine-parameter-facade.d.ts +106 -0
  187. package/dist/worklet/engine-parameter-facade.d.ts.map +1 -0
  188. package/dist/worklet/engine-processor.d.ts +68 -0
  189. package/dist/worklet/engine-processor.d.ts.map +1 -0
  190. package/dist/worklet/engine-register.d.ts +2 -0
  191. package/dist/worklet/engine-register.d.ts.map +1 -0
  192. package/dist/worklet/engine-strips.d.ts +73 -0
  193. package/dist/worklet/engine-strips.d.ts.map +1 -0
  194. package/dist/worklet/engine-sync.d.ts +37 -0
  195. package/dist/worklet/engine-sync.d.ts.map +1 -0
  196. package/dist/worklet/engine-tempo-facade.d.ts +48 -0
  197. package/dist/worklet/engine-tempo-facade.d.ts.map +1 -0
  198. package/dist/worklet/engine.d.ts +397 -0
  199. package/dist/worklet/engine.d.ts.map +1 -0
  200. package/dist/worklet/guards.d.ts +47 -0
  201. package/dist/worklet/guards.d.ts.map +1 -0
  202. package/dist/worklet/messages.d.ts +710 -0
  203. package/dist/worklet/messages.d.ts.map +1 -0
  204. package/dist/worklet/mixer-processor.d.ts +46 -0
  205. package/dist/worklet/mixer-processor.d.ts.map +1 -0
  206. package/dist/worklet/playback-processor.d.ts +62 -0
  207. package/dist/worklet/playback-processor.d.ts.map +1 -0
  208. package/dist/worklet/protocol.d.ts +323 -0
  209. package/dist/worklet/protocol.d.ts.map +1 -0
  210. package/dist/worklet/voice-changer-processor.d.ts +41 -0
  211. package/dist/worklet/voice-changer-processor.d.ts.map +1 -0
  212. package/dist/worklet.d.ts +16 -2515
  213. package/dist/worklet.d.ts.map +1 -0
  214. package/dist/worklet.js +2763 -501
  215. package/dist/worklet.js.map +1 -1
  216. package/package.json +23 -12
  217. package/src/_effects_common.ts +17 -0
  218. package/src/_feature_validation.ts +34 -0
  219. package/src/_fft_options.ts +39 -0
  220. package/src/align_take.ts +64 -0
  221. package/src/analysis.ts +56 -3
  222. package/src/analysis_helpers.ts +7 -0
  223. package/src/audio.ts +106 -3
  224. package/src/codes.ts +39 -2
  225. package/src/effects_mastering.ts +97 -22
  226. package/src/effects_note_ops.ts +635 -0
  227. package/src/effects_percussive.ts +217 -0
  228. package/src/effects_separation.ts +150 -0
  229. package/src/effects_spectral.ts +60 -0
  230. package/src/effects_timepitch.ts +377 -0
  231. package/src/errors.ts +23 -1
  232. package/src/feature_core.ts +127 -2
  233. package/src/feature_decompose.ts +633 -0
  234. package/src/feature_inverse.ts +454 -0
  235. package/src/feature_loudness.ts +125 -0
  236. package/src/feature_music.ts +107 -14
  237. package/src/feature_pitch.ts +96 -1
  238. package/src/feature_spectral.ts +16 -611
  239. package/src/feature_spectrogram.ts +63 -450
  240. package/src/features.ts +36 -22
  241. package/src/index.ts +282 -30
  242. package/src/instrument_types.ts +645 -0
  243. package/src/live_audio.ts +27 -1
  244. package/src/mastering_chain.ts +184 -0
  245. package/src/mastering_core.ts +346 -32
  246. package/src/mastering_dynamics.ts +22 -11
  247. package/src/metering.ts +67 -24
  248. package/src/mixer.ts +212 -3
  249. package/src/mixing_assistant.ts +138 -0
  250. package/src/mixing_oneshot.ts +10 -5
  251. package/src/module_state.ts +24 -2
  252. package/src/playback_renderer.ts +252 -0
  253. package/src/polyphony.ts +279 -0
  254. package/src/project.ts +61 -24
  255. package/src/project_class.ts +450 -27
  256. package/src/project_internal.ts +149 -42
  257. package/src/project_synth.ts +67 -1
  258. package/src/project_types.ts +268 -270
  259. package/src/public_types.ts +122 -3
  260. package/src/public_types_acoustic.ts +112 -3
  261. package/src/public_types_mastering.ts +254 -73
  262. package/src/public_types_mixing.ts +363 -1
  263. package/src/public_types_music.ts +312 -2
  264. package/src/public_types_playback.ts +195 -0
  265. package/src/public_types_realtime.ts +39 -7
  266. package/src/public_types_repair.ts +446 -0
  267. package/src/public_types_spectral.ts +487 -1
  268. package/src/quick_analysis.ts +203 -26
  269. package/src/realtime_engine.ts +711 -28
  270. package/src/realtime_voice_changer.ts +55 -1
  271. package/src/repair_dereverb.ts +299 -0
  272. package/src/repair_impulsive.ts +395 -0
  273. package/src/repair_noise.ts +425 -0
  274. package/src/repair_trim.ts +226 -0
  275. package/src/sample_bank.ts +113 -0
  276. package/src/sonare.js.d.ts +1122 -30
  277. package/src/stream_analyzer.ts +36 -4
  278. package/src/stream_types.ts +37 -0
  279. package/src/streaming_mixing.ts +1 -1
  280. package/src/streaming_processors.ts +194 -10
  281. package/src/transcribe.ts +89 -0
  282. package/src/validation.ts +285 -11
  283. package/src/web_midi.ts +1 -6
  284. package/src/worker.ts +18 -2
  285. package/src/worklet/audio_types.ts +37 -0
  286. package/src/worklet/engine-mixer-facade.ts +444 -10
  287. package/src/worklet/engine-node.ts +78 -26
  288. package/src/worklet/engine-offline.ts +14 -8
  289. package/src/worklet/engine-parameter-facade.ts +21 -0
  290. package/src/worklet/engine-processor.ts +272 -83
  291. package/src/worklet/engine-register.ts +32 -18
  292. package/src/worklet/engine-strips.ts +280 -9
  293. package/src/worklet/engine-sync.ts +14 -6
  294. package/src/worklet/engine.ts +365 -31
  295. package/src/worklet/guards.ts +140 -44
  296. package/src/worklet/messages.ts +227 -2
  297. package/src/worklet/mixer-processor.ts +109 -47
  298. package/src/worklet/playback-processor.ts +300 -0
  299. package/src/worklet/protocol.ts +53 -3
  300. package/src/worklet/voice-changer-processor.ts +17 -11
  301. package/src/worklet.ts +17 -0
  302. package/src/effects_transform.ts +0 -718
  303. package/src/mastering_repair.ts +0 -273
@@ -1,8 +1,25 @@
1
1
  /**
2
- * Type declarations for the Emscripten-generated WASM module with embind
2
+ * Hand-written type declarations describing the Emscripten/embind WASM module.
3
+ *
4
+ * This file is NOT generated — nothing in the build writes it. A new embind
5
+ * registration reaches TypeScript only when someone declares it here, in the
6
+ * same change as the binding, so a missing declaration is a lockstep omission
7
+ * rather than a stale artifact waiting on a rebuild.
3
8
  */
4
9
 
10
+ import type { SplitSilenceCommonWithReportResult } from './feature_core';
11
+ import type { StripMeteringOptions } from './mixer';
5
12
  import type {
13
+ NoteEditInput,
14
+ NoteObject,
15
+ NoteObjectInput,
16
+ NoteSetEntry,
17
+ NoteTarget,
18
+ NoteTargetAssignResult,
19
+ NoteTargetUnmatchedPolicy,
20
+ PercussiveEvent,
21
+ PercussiveEventInput,
22
+ PitchDecompositionResult,
6
23
  ProgressCallback,
7
24
  SonareCapabilities,
8
25
  SpectralRegionOp,
@@ -74,9 +91,30 @@ export interface WasmRealtimeVoiceChangerPodConfig {
74
91
 
75
92
  export interface WasmBeatResult {
76
93
  time: number;
94
+ /**
95
+ * Onset-envelope value sampled at the beat's frame — a single raw frame, not
96
+ * a normalized or relative salience. Use
97
+ * `WasmBeatObservationsResult.onsetStrength` for accent scoring.
98
+ */
77
99
  strength: number;
78
100
  }
79
101
 
102
+ /** Beat-level evidence behind the downbeat and meter decisions. */
103
+ export interface WasmBeatObservationsResult {
104
+ onsetStrength: number[];
105
+ lowFrequencyEnergy: number[];
106
+ chordChange: number[];
107
+ }
108
+
109
+ export interface WasmMeterEstimateResult {
110
+ timeSignature: WasmTimeSignatureResult;
111
+ downbeatPhase: number;
112
+ searched: boolean;
113
+ grouping: number[];
114
+ candidateScores: number[];
115
+ candidates: WasmTimeSignatureResult[];
116
+ }
117
+
80
118
  export interface WasmChordResult {
81
119
  root: number;
82
120
  bass: number;
@@ -87,6 +125,10 @@ export interface WasmChordResult {
87
125
  name: string;
88
126
  }
89
127
 
128
+ export interface WasmAnalysisChordResult extends WasmChordResult {
129
+ romanNumeral: string;
130
+ }
131
+
90
132
  export interface WasmSectionResult {
91
133
  type: number;
92
134
  start: number;
@@ -143,7 +185,11 @@ export interface WasmAnalysisResult {
143
185
  timeSignature: WasmTimeSignatureResult;
144
186
  timeSignatureCandidates: WasmTimeSignatureResult[];
145
187
  beats: WasmBeatResult[];
146
- chords: WasmChordResult[];
188
+ downbeatIndices: number[];
189
+ downbeatPhase: number;
190
+ beatObservations: WasmBeatObservationsResult;
191
+ beatLocalBpm: number[];
192
+ chords: WasmAnalysisChordResult[];
147
193
  sections: WasmSectionResult[];
148
194
  timbre: WasmTimbreResult;
149
195
  dynamics: WasmDynamicsResult;
@@ -270,6 +316,9 @@ export interface WasmRoomGeometryOptions {
270
316
  ismOrder?: number;
271
317
  seed?: number;
272
318
  maxSeconds?: number;
319
+ airAbsorptionEnabled?: boolean;
320
+ airTemperatureC?: number;
321
+ airHumidityPercent?: number;
273
322
  }
274
323
 
275
324
  export interface WasmRirSynthOptions extends WasmRoomGeometryOptions {
@@ -279,10 +328,24 @@ export interface WasmRirSynthOptions extends WasmRoomGeometryOptions {
279
328
  crossfadeMs?: number;
280
329
  }
281
330
 
331
+ export interface WasmRirDiagnostic {
332
+ code: string;
333
+ message: string;
334
+ severity: 'info' | 'warning' | 'error';
335
+ }
336
+
337
+ export interface WasmRoomMorphResult {
338
+ audio: Float32Array;
339
+ sampleRate: number;
340
+ diagnostics: WasmRirDiagnostic[];
341
+ }
342
+
282
343
  export interface WasmRirResult {
283
344
  rir: Float32Array;
284
345
  sampleRate: number;
285
346
  hasError: boolean;
347
+ errorMessage: string;
348
+ diagnostics: WasmRirDiagnostic[];
286
349
  }
287
350
 
288
351
  export interface WasmRoomEstimateOptions {
@@ -307,6 +370,199 @@ export interface WasmRoomEstimateResult {
307
370
  rt60Bands: Float32Array;
308
371
  }
309
372
 
373
+ /** Every field of a dereverb config, as `masteringRepairDereverbConfigForRoom` returns it. */
374
+ export interface WasmDereverbClassicalConfig {
375
+ threshold: number;
376
+ attenuation: number;
377
+ nFft: number;
378
+ hopLength: number;
379
+ t60Sec: number;
380
+ lateDelayMs: number;
381
+ overSubtraction: number;
382
+ spectralFloor: number;
383
+ wpeEnabled: boolean;
384
+ wpeIterations: number;
385
+ wpeTaps: number;
386
+ wpeStrength: number;
387
+ }
388
+
389
+ /** What a declick analysis found in one channel, as `masteringRepairDeclickStereo` returns it. Runs, not samples. */
390
+ export interface WasmClickDetection {
391
+ count: number;
392
+ rejected: number;
393
+ longestRunSamples: number;
394
+ perSecond: number;
395
+ }
396
+
397
+ /** What a declick pass found in one channel of a stereo declick and what it did to it. */
398
+ export interface WasmDeclickReport {
399
+ detected: WasmClickDetection;
400
+ repairedRuns: number;
401
+ repairedSamples: number;
402
+ linkedRuns: number;
403
+ lpcModelUsed: boolean;
404
+ }
405
+
406
+ export interface WasmDeclickStereoResult {
407
+ left: Float32Array;
408
+ right: Float32Array;
409
+ leftReport: WasmDeclickReport;
410
+ rightReport: WasmDeclickReport;
411
+ }
412
+
413
+ /** What a declip analysis found in one channel, as `masteringRepairDeclipStereo` returns it. */
414
+ export interface WasmClipDetection {
415
+ sampleCount: number;
416
+ sampleFraction: number;
417
+ runCount: number;
418
+ longestRunSamples: number;
419
+ flatRunCount: number;
420
+ longestFlatRunSamples: number;
421
+ flatSampleCount: number;
422
+ flatLevel: number;
423
+ }
424
+
425
+ /** What a declip pass found in one channel of a stereo declip and what it did to it. */
426
+ export interface WasmDeclipReport {
427
+ detected: WasmClipDetection;
428
+ lpcReconstructedRuns: number;
429
+ interpolatedRuns: number;
430
+ repairedSamples: number;
431
+ linkedRuns: number;
432
+ }
433
+
434
+ export interface WasmDeclipStereoResult {
435
+ left: Float32Array;
436
+ right: Float32Array;
437
+ leftReport: WasmDeclipReport;
438
+ rightReport: WasmDeclipReport;
439
+ }
440
+
441
+ /** What a decrackle analysis found in one channel, as `masteringRepairDecrackleStereo` returns it. */
442
+ export interface WasmCrackleDetection {
443
+ sampleCount: number;
444
+ sampleFraction: number;
445
+ perSecond: number;
446
+ }
447
+
448
+ /** What a decrackle pass found in one channel of a stereo decrackle and what it did to it. */
449
+ export interface WasmDecrackleReport {
450
+ detected: WasmCrackleDetection;
451
+ replacedSamples: number;
452
+ detailCoefficients: number;
453
+ shrunkCoefficients: number;
454
+ noiseSigma: number;
455
+ }
456
+
457
+ export interface WasmDecrackleStereoResult {
458
+ left: Float32Array;
459
+ right: Float32Array;
460
+ leftReport: WasmDecrackleReport;
461
+ rightReport: WasmDecrackleReport;
462
+ }
463
+
464
+ /** What a dehum analysis found in one channel, as `masteringRepairDehumStereo` returns it. */
465
+ export interface WasmHumDetection {
466
+ fundamentalHz: number;
467
+ fundamentalProminence: number;
468
+ harmonics: number;
469
+ harmonicDbfs: Float32Array;
470
+ }
471
+
472
+ /** What a dehum pass found in one channel of a stereo dehum and what it did to it. */
473
+ export interface WasmDehumReport {
474
+ detected: WasmHumDetection;
475
+ notchedHarmonics: number;
476
+ appliedFundamentalHz: number;
477
+ fundamentalDriftHz: number;
478
+ }
479
+
480
+ export interface WasmDehumStereoResult {
481
+ left: Float32Array;
482
+ right: Float32Array;
483
+ leftReport: WasmDehumReport;
484
+ rightReport: WasmDehumReport;
485
+ }
486
+
487
+ /** What a denoise analysis found, as `masteringRepairDenoiseClassicalStereo` returns it. */
488
+ export interface WasmNoiseDetection {
489
+ floorDbfs: number;
490
+ bandFloorDbfs: Float32Array;
491
+ }
492
+
493
+ /** What a stereo denoise pass found and what it removed. */
494
+ export interface WasmDenoiseReport {
495
+ detected: WasmNoiseDetection;
496
+ meanReductionDb: number;
497
+ maxReductionDb: number;
498
+ floorLimitedFraction: number;
499
+ }
500
+
501
+ /** One `report`, not a per-channel pair: the gain mask is one array applied to both channels. */
502
+ export interface WasmDenoiseStereoResult {
503
+ left: Float32Array;
504
+ right: Float32Array;
505
+ report: WasmDenoiseReport;
506
+ }
507
+
508
+ /** The N-channel form: one mask over the set, and one report whose `detected` is the set's. */
509
+ export interface WasmDenoiseLinkedResult {
510
+ channels: Float32Array[];
511
+ report: WasmDenoiseReport;
512
+ }
513
+
514
+ /** What a dereverb analysis found, as `masteringRepairDereverbClassicalStereo` returns it. */
515
+ export interface WasmReverbDetection {
516
+ lateDecayRatioDb: number;
517
+ latePredictability: number;
518
+ }
519
+
520
+ /** What a stereo dereverb pass found and what it removed. */
521
+ export interface WasmDereverbReport {
522
+ detected: WasmReverbDetection;
523
+ meanReductionDb: number;
524
+ suppressedFraction: number;
525
+ wpePredictorNorm: number;
526
+ }
527
+
528
+ /** One `report`, not a per-channel pair: the mask and the WPE predictor set are each one
529
+ * object applied to both channels. */
530
+ export interface WasmDereverbStereoResult {
531
+ left: Float32Array;
532
+ right: Float32Array;
533
+ report: WasmDereverbReport;
534
+ }
535
+
536
+ /** The N-channel form: one mask and one WPE predictor set over the whole channel set. */
537
+ export interface WasmDereverbLinkedResult {
538
+ channels: Float32Array[];
539
+ report: WasmDereverbReport;
540
+ }
541
+
542
+ /** One half-open input-buffer range, as a trim pass reports it. */
543
+ export interface WasmTrimRange {
544
+ first: number;
545
+ lastExclusive: number;
546
+ }
547
+
548
+ /** What a trim pass kept and what it dropped. */
549
+ export interface WasmTrimReport {
550
+ range: WasmTrimRange;
551
+ removedHeadSamples: number;
552
+ removedTailSamples: number;
553
+ }
554
+
555
+ /** Arrays SHORTER than the input, and empty when neither channel carries signal. `report.range`
556
+ * is the union applied to both channels; the two per-channel ranges are what it was formed
557
+ * from. */
558
+ export interface WasmTrimSilenceStereoResult {
559
+ left: Float32Array;
560
+ right: Float32Array;
561
+ report: WasmTrimReport;
562
+ leftRange: WasmTrimRange;
563
+ rightRange: WasmTrimRange;
564
+ }
565
+
310
566
  export interface WasmRoomMorphOptions extends WasmRoomGeometryOptions {
311
567
  wet?: number;
312
568
  sourceTailSuppression?: number;
@@ -464,6 +720,48 @@ export interface WasmMelodyPoint {
464
720
  confidence: number;
465
721
  }
466
722
 
723
+ /**
724
+ * Boundary options as the embind wrapper reads them. Every field is optional
725
+ * because the wrapper seeds the bag from `BoundaryConfig`, so an omitted one
726
+ * takes the core's own default.
727
+ *
728
+ * Declaring them required is what obliged the facade to spell all ten defaults
729
+ * before the call, which made those literals the effective defaults on npm and
730
+ * put the core's out of reach. That shape did buy one thing — a field name
731
+ * drifting from the embind reader failed to compile instead of falling back in
732
+ * silence — and the typed-options test carries it instead: it sends a
733
+ * wrong-typed value for each of the ten keys and requires the module to refuse,
734
+ * which stops happening the moment the reader stops reading one of them.
735
+ */
736
+ export interface WasmBoundaryOptions {
737
+ nFft?: number;
738
+ hopLength?: number;
739
+ kernelSize?: number;
740
+ threshold?: number;
741
+ absoluteThreshold?: number;
742
+ nMfcc?: number;
743
+ nChroma?: number;
744
+ peakDistance?: number;
745
+ useMfcc?: boolean;
746
+ useChroma?: boolean;
747
+ }
748
+
749
+ export interface WasmBoundary {
750
+ time: number;
751
+ frame: number;
752
+ strength: number;
753
+ }
754
+
755
+ export interface WasmBoundaryResult {
756
+ boundaries: WasmBoundary[];
757
+ noveltyCurve: Float32Array;
758
+ noveltyPeak: number;
759
+ sampleRate: number;
760
+ hopLength: number;
761
+ nFrames: number;
762
+ frameStride: number;
763
+ }
764
+
467
765
  export interface WasmMelodyResult {
468
766
  points: WasmMelodyPoint[];
469
767
  pitchRangeOctaves: number;
@@ -490,6 +788,17 @@ export interface WasmLufsResult {
490
788
  loudnessRange: number;
491
789
  }
492
790
 
791
+ /**
792
+ * The two per-block loudness series a multi-channel measurement builds, in
793
+ * LUFS. A signal shorter than a window yields an empty series for it.
794
+ */
795
+ export interface WasmLufsSeriesResult {
796
+ /** 400 ms momentary series. */
797
+ momentary: Float32Array;
798
+ /** 3 s short-term series. */
799
+ shortTerm: Float32Array;
800
+ }
801
+
493
802
  export interface WasmMasteringResult {
494
803
  samples: Float32Array;
495
804
  sampleRate: number;
@@ -498,6 +807,26 @@ export interface WasmMasteringResult {
498
807
  appliedGainDb: number;
499
808
  loudnessTargetLimited?: boolean;
500
809
  latencySamples?: number;
810
+ /**
811
+ * Samples the named processor replaced with a finite in-domain one,
812
+ * keeping the output finite and in range. A non-finite sample supplied by
813
+ * the caller is rejected before the processor runs, so a replacement is
814
+ * always of a value the processor itself produced.
815
+ *
816
+ * Whether this can be non-zero depends on which processor was named: one
817
+ * that does not substitute reports zero because it has nothing to replace
818
+ * with, not because nothing needed replacing.
819
+ */
820
+ nonFiniteSubstitutionCount: number;
821
+ }
822
+
823
+ export interface WasmLoudnessMatchResult {
824
+ samples: Float32Array;
825
+ sampleRate: number;
826
+ referenceLufs: number;
827
+ sourceLufs: number;
828
+ appliedGainDb: number;
829
+ matchedTruePeakDbtp: number;
501
830
  }
502
831
 
503
832
  export interface WasmStageGainReduction {
@@ -527,6 +856,19 @@ export interface WasmMasteringChainResult extends WasmMasteringResult {
527
856
  outputTruePeakDbtp: number;
528
857
  outputLra: number;
529
858
  loudnessTargetLimited: boolean;
859
+ /**
860
+ * Samples a stage replaced with a finite in-domain one, keeping the
861
+ * output finite and in range. A non-finite sample supplied by the caller
862
+ * is rejected before any stage runs, so a replacement is always of a
863
+ * value a stage itself produced.
864
+ *
865
+ * Only the true-peak limiters replace anything, so with the maximizer's
866
+ * limiter and the loudness stage both disabled a zero here means no
867
+ * stage was able to replace anything rather than that nothing needed
868
+ * replacing. Overrides the inherited {@link WasmMasteringResult} doc,
869
+ * which describes a single named processor rather than a chain.
870
+ */
871
+ nonFiniteSubstitutionCount: number;
530
872
  stageGainReductions: WasmStageGainReduction[];
531
873
  report: WasmMasteringReport;
532
874
  }
@@ -542,6 +884,8 @@ export interface WasmMasteringStereoChainResult {
542
884
  outputTruePeakDbtp: number;
543
885
  outputLra: number;
544
886
  loudnessTargetLimited: boolean;
887
+ /** See {@link WasmMasteringChainResult} for field semantics. Aggregated over both channels. */
888
+ nonFiniteSubstitutionCount: number;
545
889
  stageGainReductions: WasmStageGainReduction[];
546
890
  report: WasmMasteringReport;
547
891
  }
@@ -554,6 +898,9 @@ export interface WasmMasteringStereoResult {
554
898
  outputLufs: number;
555
899
  appliedGainDb: number;
556
900
  latencySamples: number;
901
+ loudnessTargetLimited: boolean;
902
+ /** Aggregated over both channels. */
903
+ nonFiniteSubstitutionCount: number;
557
904
  }
558
905
 
559
906
  export interface WasmMixMeterSnapshot {
@@ -570,13 +917,24 @@ export interface WasmMixMeterSnapshot {
570
917
  shortTermLufs: number;
571
918
  integratedLufs: number;
572
919
  gainReductionDb: number;
920
+ /**
921
+ * Left-channel inter-sample (true) peak in dB, from the ITU-R BS.1770-4
922
+ * polyphase reconstruction at 4x. A streaming measurement: the centered
923
+ * reconstruction stencil needs a few future samples a realtime path does not
924
+ * have, so each block's last samples read marginally low (about 0.1 dB across
925
+ * 64..8192-sample blocks on a near-Nyquist tone, always under-reading). Use
926
+ * `meteringTruePeakDb` over the whole signal for an exact dBTP number.
927
+ */
573
928
  truePeakDbL: number;
929
+ /** Right-channel inter-sample (true) peak in dB. See {@link truePeakDbL}. */
574
930
  truePeakDbR: number;
931
+ /** Maximum inter-sample peak across channels in dB. See {@link truePeakDbL}. */
575
932
  maxTruePeakDb: number;
576
933
  seq: number;
577
934
  channelCount: number;
578
935
  peakDb: number[];
579
936
  rmsDb: number[];
937
+ /** Per-plane inter-sample peak in dB; [0]/[1] mirror {@link truePeakDbL}/R. */
580
938
  truePeakDb: number[];
581
939
  }
582
940
 
@@ -598,7 +956,7 @@ export interface WasmEngineClip {
598
956
  gain?: number;
599
957
  fadeInSamples?: number;
600
958
  fadeOutSamples?: number;
601
- warpMode?: 'off' | 'repitch' | 'tempo-sync' | 0 | 1 | 2;
959
+ warpMode?: 'off' | 'repitch' | 'tempo-sync' | 'time-stretch' | 0 | 1 | 2 | 3;
602
960
  warpAnchors?: Array<{ warpSample: number; sourceSample: number }>;
603
961
  pageProvider?: number | { readonly id: number };
604
962
  }
@@ -628,6 +986,13 @@ export interface WasmEngineBus {
628
986
  busId: number;
629
987
  gainDb?: number;
630
988
  channelLayout?: number;
989
+ /**
990
+ * Bus this bus's output sums into instead of the master mix; 0 or absent
991
+ * keeps it on the master mix.
992
+ */
993
+ outputBusId?: number;
994
+ /** Sends to other buses, in the same shape as a track lane's sends. */
995
+ sends?: WasmEngineTrackSend[];
631
996
  }
632
997
 
633
998
  export interface WasmClipPageRequest {
@@ -639,12 +1004,18 @@ export interface WasmClipPageRequest {
639
1004
  export interface WasmEngineParameterInfo {
640
1005
  id: number;
641
1006
  name: string;
642
- unit: string;
643
- minValue: number;
644
- maxValue: number;
645
- defaultValue: number;
646
- rtSafe: boolean;
647
- defaultCurve: number;
1007
+ /** Display unit; omit for an empty string. */
1008
+ unit?: string;
1009
+ /** Lower end of the parameter range. Default `0`. */
1010
+ minValue?: number;
1011
+ /** Upper end of the parameter range. Default `1`. */
1012
+ maxValue?: number;
1013
+ /** Value the parameter starts at. Default `0`. */
1014
+ defaultValue?: number;
1015
+ /** Whether the parameter is safe to change from the realtime thread. Default `true`. */
1016
+ rtSafe?: boolean;
1017
+ /** Curve used by automation points that omit `curveToNext`. Default `1` (exponential). */
1018
+ defaultCurve?: number;
648
1019
  }
649
1020
 
650
1021
  export interface WasmEngineAutomationPoint {
@@ -727,6 +1098,13 @@ export interface WasmEngineGraphConnection {
727
1098
  sourcePort: number;
728
1099
  destNode: string;
729
1100
  destPort: number;
1101
+ /**
1102
+ * Mixing intent (`0` = replace, `1` = add).
1103
+ *
1104
+ * NOTE: not currently honored — the compiled graph always sums edges into a
1105
+ * shared destination port in an order-independent way (the first edge into a
1106
+ * port overwrites, every later edge adds), regardless of this value.
1107
+ */
730
1108
  mix?: number;
731
1109
  }
732
1110
 
@@ -755,6 +1133,12 @@ export interface WasmEngineTelemetry {
755
1133
  }
756
1134
 
757
1135
  export interface WasmEngineMeterTelemetry {
1136
+ /**
1137
+ * Telemetry tap target id: `0` master mix, `laneIndex + 1` (1..32) for track
1138
+ * lanes, `33 + busIndex` (33..40) for buses, and `0xFFFF` for the
1139
+ * input-monitor capture tap. Handle `0xFFFF` explicitly -- a naive
1140
+ * `targetId - 1` index into a 32-entry lane array runs past its end.
1141
+ */
758
1142
  targetId: number;
759
1143
  renderFrame: number;
760
1144
  seq: number;
@@ -762,8 +1146,18 @@ export interface WasmEngineMeterTelemetry {
762
1146
  peakDbR: number;
763
1147
  rmsDbL: number;
764
1148
  rmsDbR: number;
1149
+ /**
1150
+ * Left-channel inter-sample (true) peak in dB, from the ITU-R BS.1770-4
1151
+ * polyphase reconstruction at 4x. A streaming measurement: the centered
1152
+ * reconstruction stencil needs a few future samples a realtime path does not
1153
+ * have, so each block's last samples read marginally low (about 0.1 dB across
1154
+ * 64..8192-sample blocks on a near-Nyquist tone, always under-reading). Use
1155
+ * `meteringTruePeakDb` over the whole signal for an exact dBTP number.
1156
+ */
765
1157
  truePeakDbL: number;
1158
+ /** Right-channel inter-sample (true) peak in dB. See {@link truePeakDbL}. */
766
1159
  truePeakDbR: number;
1160
+ /** Maximum inter-sample peak across channels in dB. See {@link truePeakDbL}. */
767
1161
  maxTruePeakDb: number;
768
1162
  correlation: number;
769
1163
  monoCompatWidth: number;
@@ -775,13 +1169,29 @@ export interface WasmEngineMeterTelemetry {
775
1169
  }
776
1170
 
777
1171
  export interface WasmEngineMeterTelemetryWide {
1172
+ /**
1173
+ * Telemetry tap target id: `0` master mix, `laneIndex + 1` (1..32) for track
1174
+ * lanes, `33 + busIndex` (33..40) for buses, and `0xFFFF` for the
1175
+ * input-monitor capture tap. Handle `0xFFFF` explicitly -- a naive
1176
+ * `targetId - 1` index into a 32-entry lane array runs past its end.
1177
+ */
778
1178
  targetId: number;
779
1179
  renderFrame: number;
780
1180
  seq: number;
781
1181
  channelCount: number;
782
1182
  peakDb: number[];
783
1183
  rmsDb: number[];
1184
+ /**
1185
+ * Per-plane inter-sample (true) peak in dB (length `channelCount`), from the
1186
+ * ITU-R BS.1770-4 polyphase reconstruction at 4x. A streaming measurement: the
1187
+ * centered reconstruction stencil needs a few future samples a realtime path
1188
+ * does not have, so each block's last samples read marginally low (about
1189
+ * 0.1 dB across 64..8192-sample blocks on a near-Nyquist tone, always
1190
+ * under-reading). Use `meteringTruePeakDb` over the whole signal for an exact
1191
+ * dBTP number.
1192
+ */
784
1193
  truePeakDb: number[];
1194
+ /** Maximum inter-sample peak across channels in dB. See {@link truePeakDb}. */
785
1195
  maxTruePeakDb: number;
786
1196
  correlation: number;
787
1197
  monoCompatWidth: number;
@@ -793,6 +1203,12 @@ export interface WasmEngineMeterTelemetryWide {
793
1203
  }
794
1204
 
795
1205
  export interface WasmEngineScopeTelemetry {
1206
+ /**
1207
+ * Telemetry tap target id: `0` master mix, `laneIndex + 1` (1..32) for track
1208
+ * lanes, `33 + busIndex` (33..40) for buses, and `0xFFFF` for the
1209
+ * input-monitor capture tap. Handle `0xFFFF` explicitly -- a naive
1210
+ * `targetId - 1` index into a 32-entry lane array runs past its end.
1211
+ */
796
1212
  targetId: number;
797
1213
  renderFrame: number;
798
1214
  seq: number;
@@ -838,12 +1254,37 @@ export interface WasmEngineTransportState {
838
1254
  }
839
1255
 
840
1256
  export interface WasmEngineBounceOptions {
1257
+ /**
1258
+ * Length of the bounce in frames. The whole result is held in memory, so the
1259
+ * span is capped by a 1 GiB peak budget over the full-size float buffers a
1260
+ * bounce holds at once, and exceeding it throws an `InvalidParameter`
1261
+ * `SonareError`.
1262
+ *
1263
+ * The cap is a **frame** count: inversely proportional to `numChannels`, and
1264
+ * independent of the sample rate. Stereo refuses past 44,739,242 frames, or
1265
+ * past 33,554,432 frames when `dither` is set, which adds one more copy; 5.1
1266
+ * refuses past a third of each. Read as a **duration** those two stereo counts
1267
+ * are 15 min 32 s and 11 min 39 s at 48 kHz, and half that at 96 kHz. When
1268
+ * `sourceSampleRate` and `targetSampleRate` differ both the source and the
1269
+ * resampled length are checked, so the longer of the two is what binds.
1270
+ *
1271
+ * Render longer material in chunks via `renderOffline({ finalize: false })`.
1272
+ * The cap is a fixed budget, not a probe of the module's heap, which on wasm32
1273
+ * can run out below it.
1274
+ */
841
1275
  totalFrames: number;
842
1276
  blockSize?: number;
843
1277
  numChannels?: number;
844
1278
  targetSampleRate?: number;
845
1279
  sourceSampleRate?: number;
846
1280
  normalizeLufs?: boolean;
1281
+ /**
1282
+ * Target integrated loudness when `normalizeLufs` is set. Omitting it, passing
1283
+ * `0`, and passing a non-finite value all mean the library default of
1284
+ * -14 LUFS: the non-finite case resolves rather than being reported, matching
1285
+ * the C ABI, because the loudness stage derives a per-sample gain from this
1286
+ * and checks nothing itself.
1287
+ */
847
1288
  targetLufs?: number;
848
1289
  dither?: 0 | 1 | 2 | 3;
849
1290
  ditherBits?: number;
@@ -914,18 +1355,20 @@ export interface WasmRealtimeEngine {
914
1355
  commandCapacity: number,
915
1356
  telemetryCapacity: number,
916
1357
  ) => void;
917
- setParameter: (paramId: number, value: number, renderFrame: number) => void;
918
- setParameterSmoothed: (paramId: number, value: number, renderFrame: number) => void;
1358
+ setParameter: (paramId: number, value: number, renderFrame?: number) => void;
1359
+ setParameterSmoothed: (paramId: number, value: number, renderFrame?: number) => void;
919
1360
  setParamSmoothingMs: (smoothingMs: number) => void;
920
- setSoloMute: (laneIndex: number, solo: boolean, mute: boolean, renderFrame: number) => void;
921
- setTrackMonitorMode: (laneIndex: number, mode: number, renderFrame: number) => void;
1361
+ setSoloMute: (laneIndex: number, solo: boolean, mute: boolean, renderFrame?: number) => void;
1362
+ setTrackMonitorMode: (laneIndex: number, mode: number, renderFrame?: number) => void;
922
1363
  getTransportState: () => WasmEngineTransportState;
923
- play: (renderFrame: number) => void;
924
- stop: (renderFrame: number) => void;
925
- seekSample: (timelineSample: number, renderFrame: number) => void;
1364
+ play: (renderFrame?: number) => void;
1365
+ stop: (renderFrame?: number) => void;
1366
+ seekSample: (timelineSample: number, renderFrame?: number) => void;
926
1367
  settleParameters: () => void;
1368
+ settleInsertParameters: () => void;
927
1369
  flushControlCommands: () => void;
928
- seekPpq: (ppq: number, renderFrame: number) => void;
1370
+ applyCommandsDueNowPreservingFuture: () => void;
1371
+ seekPpq: (ppq: number, renderFrame?: number) => void;
929
1372
  setTempo: (bpm: number) => void;
930
1373
  setTempoSegments: (segments: WasmEngineTempoSegment[]) => void;
931
1374
  setTimeSignature: (numerator: number, denominator: number) => void;
@@ -934,15 +1377,15 @@ export interface WasmRealtimeEngine {
934
1377
  setLoop: (startPpq: number, endPpq: number, enabled: boolean) => void;
935
1378
  addParameter: (info: WasmEngineParameterInfo) => void;
936
1379
  parameterCount: () => number;
937
- parameterInfoByIndex: (index: number) => WasmEngineParameterInfo;
938
- parameterInfo: (id: number) => WasmEngineParameterInfo;
1380
+ parameterInfoByIndex: (index: number) => Required<WasmEngineParameterInfo>;
1381
+ parameterInfo: (id: number) => Required<WasmEngineParameterInfo>;
939
1382
  setAutomationLane: (paramId: number, points: WasmEngineAutomationPoint[]) => void;
940
1383
  automationLaneCount: () => number;
941
1384
  setMarkers: (markers: WasmEngineMarker[]) => void;
942
1385
  markerCount: () => number;
943
1386
  markerByIndex: (index: number) => WasmEngineMarker;
944
1387
  marker: (id: number) => WasmEngineMarker;
945
- seekMarker: (id: number, renderFrame: number) => void;
1388
+ seekMarker: (id: number, renderFrame?: number) => void;
946
1389
  setLoopFromMarkers: (startMarkerId: number, endMarkerId: number) => void;
947
1390
  setMetronome: (config: WasmEngineMetronomeConfig) => void;
948
1391
  metronome: () => Required<WasmEngineMetronomeConfig>;
@@ -956,9 +1399,17 @@ export interface WasmRealtimeEngine {
956
1399
  setTrackLanes: (lanes: Array<number | WasmEngineTrackLane>) => void;
957
1400
  setLaneSidechain: (trackId: number, insertIndex: number, sourceTrackId: number) => void;
958
1401
  setTrackBuses: (buses: WasmEngineBus[]) => void;
1402
+ setBusSidechain: (
1403
+ busId: number,
1404
+ insertIndex: number,
1405
+ sourceKind: number,
1406
+ sourceId: number,
1407
+ ) => void;
1408
+ setMasterSidechain: (insertIndex: number, sourceKind: number, sourceId: number) => void;
959
1409
  setBusStripJson: (busId: number, sceneJson: string) => void;
960
1410
  setTrackStripJson: (trackId: number, sceneJson: string) => void;
961
1411
  setTrackStripEqBandJson: (trackId: number, bandIndex: number, bandJson: string) => void;
1412
+ setBusStripEqBandJson: (busId: number, bandIndex: number, bandJson: string) => void;
962
1413
  setTrackStripInsertBypassed: (
963
1414
  trackId: number,
964
1415
  insertIndex: number,
@@ -978,13 +1429,50 @@ export interface WasmRealtimeEngine {
978
1429
  paramName: string,
979
1430
  value: number,
980
1431
  ) => void;
1432
+ applyTrackStripInsertParamByNameNow: (
1433
+ trackId: number,
1434
+ insertIndex: number,
1435
+ paramName: string,
1436
+ value: number,
1437
+ ) => boolean;
1438
+ restoreTrackStripInsertParamByName: (
1439
+ trackId: number,
1440
+ insertIndex: number,
1441
+ paramName: string,
1442
+ value: number,
1443
+ ) => void;
981
1444
  setMasterStripInsertParamByName: (insertIndex: number, paramName: string, value: number) => void;
1445
+ applyMasterStripInsertParamByNameNow: (
1446
+ insertIndex: number,
1447
+ paramName: string,
1448
+ value: number,
1449
+ ) => boolean;
1450
+ restoreMasterStripInsertParamByName: (
1451
+ insertIndex: number,
1452
+ paramName: string,
1453
+ value: number,
1454
+ ) => void;
982
1455
  setBusStripInsertParamByName: (
983
1456
  busId: number,
984
1457
  insertIndex: number,
985
1458
  paramName: string,
986
1459
  value: number,
987
1460
  ) => void;
1461
+ applyBusStripInsertParamByNameNow: (
1462
+ busId: number,
1463
+ insertIndex: number,
1464
+ paramName: string,
1465
+ value: number,
1466
+ ) => boolean;
1467
+ restoreBusStripInsertParamByName: (
1468
+ busId: number,
1469
+ insertIndex: number,
1470
+ paramName: string,
1471
+ value: number,
1472
+ ) => void;
1473
+ clearTrackInsertParameterBases: (trackId: number) => void;
1474
+ clearBusInsertParameterBases: (busId: number) => void;
1475
+ clearMasterInsertParameterBases: () => void;
988
1476
  setBusStripInsertBypassed: (
989
1477
  busId: number,
990
1478
  insertIndex: number,
@@ -998,10 +1486,15 @@ export interface WasmRealtimeEngine {
998
1486
  ) => number;
999
1487
  resolveMasterInsertAutomationId: (insertIndex: number, paramName: string) => number;
1000
1488
  resolveBusInsertAutomationId: (busId: number, insertIndex: number, paramName: string) => number;
1489
+ resolveInstrumentAutomationId: (destinationId: number, paramName: string) => number;
1001
1490
  setTrackStripPan: (trackId: number, pan: number) => void;
1002
1491
  setTrackStripPanLaw: (trackId: number, panLaw: number) => void;
1003
1492
  setTrackStripPanMode: (trackId: number, panMode: number) => void;
1004
1493
  setTrackStripDualPan: (trackId: number, leftPan: number, rightPan: number) => void;
1494
+ setBusStripPan: (busId: number, pan: number) => void;
1495
+ setBusStripPanLaw: (busId: number, panLaw: number) => void;
1496
+ setBusStripPanMode: (busId: number, panMode: number) => void;
1497
+ setBusStripDualPan: (busId: number, leftPan: number, rightPan: number) => void;
1005
1498
  setTrackStripChannelDelaySamples: (trackId: number, delaySamples: number) => void;
1006
1499
  createClipPageProvider: (numChannels: number, numSamples: number, pageFrames: number) => number;
1007
1500
  supplyClipPage: (providerId: number, pageIndex: number, channels: Float32Array[]) => void;
@@ -1012,6 +1505,11 @@ export interface WasmRealtimeEngine {
1012
1505
  clipPageRequestScratchClipId: () => number;
1013
1506
  clipPageRequestScratchSample: () => number;
1014
1507
  clipPageRequestOverflowCount: () => number;
1508
+ warpStretchOverflowCount: () => number;
1509
+ setWarpVoiceCapacity: (voices: number) => void;
1510
+ warpVoiceCapacity: () => number;
1511
+ setClipPagePrefetchFrames: (frames: number) => void;
1512
+ clipPagePrefetchFrames: () => number;
1015
1513
  setCaptureBuffer: (numChannels: number, capacityFrames: number) => void;
1016
1514
  armCapture: (armed: boolean) => void;
1017
1515
  setCapturePunch: (startSample: number, endSample: number, enabled: boolean) => void;
@@ -1038,6 +1536,34 @@ export interface WasmRealtimeEngine {
1038
1536
  bindMidiCcBinding: (binding: import('./project_types').ProjectMidiCcBinding) => void;
1039
1537
  clearMidiCcBindings: () => void;
1040
1538
  midiCcBindingCount: () => number;
1539
+ setControllerProfile: (destinationId: number, presetName: string) => void;
1540
+ bindController: (
1541
+ destinationId: number,
1542
+ binding: import('./instrument_types').ControllerBinding,
1543
+ ) => void;
1544
+ clearControllerBindings: (destinationId: number) => void;
1545
+ controllerBindingCount: (destinationId: number) => number;
1546
+ setControllerVelocityMeaningful: (destinationId: number, meaningful: boolean) => void;
1547
+ controllerVelocityMeaningful: (destinationId: number) => boolean;
1548
+ setControllerNoteTracking: (
1549
+ destinationId: number,
1550
+ dimension: import('./instrument_types').MpeDimension | number,
1551
+ tracking: import('./instrument_types').NoteTracking | number,
1552
+ ) => void;
1553
+ controllerNoteTracking: (
1554
+ destinationId: number,
1555
+ dimension: import('./instrument_types').MpeDimension | number,
1556
+ ) => import('./instrument_types').NoteTracking | number;
1557
+ setArticulation: (
1558
+ destinationId: number,
1559
+ channel: number,
1560
+ articulation: import('./instrument_types').Articulation | number,
1561
+ ) => void;
1562
+ articulation: (
1563
+ destinationId: number,
1564
+ channel: number,
1565
+ ) => import('./instrument_types').Articulation | number;
1566
+ legatoFallbackCount: (destinationId: number) => number;
1041
1567
  setMidiFx: (destinationId: number, configJson: string) => void;
1042
1568
  clearMidiFx: (destinationId: number) => void;
1043
1569
  setMidiInputSource: (destinationId: number) => void;
@@ -1064,13 +1590,32 @@ export interface WasmRealtimeEngine {
1064
1590
  value: number,
1065
1591
  portTimeSamples: number,
1066
1592
  ) => void;
1593
+ pushMidiInputPitchBend: (
1594
+ group: number,
1595
+ channel: number,
1596
+ bend14: number,
1597
+ portTimeSamples: number,
1598
+ ) => void;
1599
+ pushMidiInputChannelPressure: (
1600
+ group: number,
1601
+ channel: number,
1602
+ pressure: number,
1603
+ portTimeSamples: number,
1604
+ ) => void;
1605
+ pushMidiInputPolyPressure: (
1606
+ group: number,
1607
+ channel: number,
1608
+ note: number,
1609
+ pressure: number,
1610
+ portTimeSamples: number,
1611
+ ) => void;
1067
1612
  pushMidiNoteOn: (
1068
1613
  destinationId: number,
1069
1614
  group: number,
1070
1615
  channel: number,
1071
1616
  note: number,
1072
1617
  velocity: number,
1073
- renderFrame: number,
1618
+ renderFrame?: number,
1074
1619
  ) => void;
1075
1620
  pushMidiNoteOff: (
1076
1621
  destinationId: number,
@@ -1078,7 +1623,7 @@ export interface WasmRealtimeEngine {
1078
1623
  channel: number,
1079
1624
  note: number,
1080
1625
  velocity: number,
1081
- renderFrame: number,
1626
+ renderFrame?: number,
1082
1627
  ) => void;
1083
1628
  pushMidiCc: (
1084
1629
  destinationId: number,
@@ -1086,11 +1631,38 @@ export interface WasmRealtimeEngine {
1086
1631
  channel: number,
1087
1632
  controller: number,
1088
1633
  value: number,
1089
- renderFrame: number,
1634
+ renderFrame?: number,
1090
1635
  ) => void;
1091
- pushMidiUmp: (destinationId: number, word0: number, renderFrame: number) => void;
1092
- pushMidiSysex: (destinationId: number, data: Uint8Array, renderFrame: number) => void;
1093
- pushMidiPanic: (renderFrame: number) => void;
1636
+ pushMidiPitchBend: (
1637
+ destinationId: number,
1638
+ group: number,
1639
+ channel: number,
1640
+ bend14: number,
1641
+ renderFrame?: number,
1642
+ ) => void;
1643
+ pushMidiChannelPressure: (
1644
+ destinationId: number,
1645
+ group: number,
1646
+ channel: number,
1647
+ pressure: number,
1648
+ renderFrame?: number,
1649
+ ) => void;
1650
+ pushMidiPolyPressure: (
1651
+ destinationId: number,
1652
+ group: number,
1653
+ channel: number,
1654
+ note: number,
1655
+ pressure: number,
1656
+ renderFrame?: number,
1657
+ ) => void;
1658
+ pushMidiUmp: (
1659
+ destinationId: number,
1660
+ words: Uint32Array | readonly number[],
1661
+ renderFrame?: number,
1662
+ ) => void;
1663
+ pushMidiInputUmp: (words: Uint32Array | readonly number[], portTimeSamples: number) => void;
1664
+ pushMidiSysex: (destinationId: number, data: Uint8Array, renderFrame?: number) => void;
1665
+ pushMidiPanic: (renderFrame?: number) => void;
1094
1666
  setMidiDestinationExternal: (destinationId: number, external: boolean) => void;
1095
1667
  setExternalMidiClockEnabled: (enabled: boolean) => void;
1096
1668
  externalMidiDroppedCount: () => number;
@@ -1118,7 +1690,8 @@ export interface WasmRealtimeEngine {
1118
1690
  getMonitorChannelBuffer: (channel: number, numFrames: number) => Float32Array;
1119
1691
  processPreparedWithMonitor: (numFrames: number) => void;
1120
1692
  processWithMonitor: (channels: Float32Array[]) => WasmEngineProcessWithMonitorResult;
1121
- renderOffline: (channels: Float32Array[], blockSize: number) => Float32Array[];
1693
+ renderOffline: (channels: Float32Array[], blockSize: number, finalize: boolean) => Float32Array[];
1694
+ finishOfflineRender: () => void;
1122
1695
  bounceOffline: (options: WasmEngineBounceOptions) => WasmEngineBounceResult;
1123
1696
  freezeOffline: (options: WasmEngineFreezeOptions) => WasmEngineFreezeResult;
1124
1697
  drainTelemetry: (maxRecords: number) => WasmEngineTelemetry[];
@@ -1161,6 +1734,11 @@ export interface WasmSynthEnumTables {
1161
1734
  bodyTypes: string[];
1162
1735
  modSources: string[];
1163
1736
  modDestinations: string[];
1737
+ controllerInputs: string[];
1738
+ controllerAxes: string[];
1739
+ articulations: string[];
1740
+ mpeDimensions: string[];
1741
+ noteTrackings: string[];
1164
1742
  }
1165
1743
 
1166
1744
  export interface SonareModule {
@@ -1213,6 +1791,7 @@ export interface SonareModule {
1213
1791
  keyMode: number,
1214
1792
  detectInversions: boolean,
1215
1793
  chromaMethod: number,
1794
+ tuning: number,
1216
1795
  ) => WasmChordAnalysisResult;
1217
1796
  chordFunctionalAnalysis: (
1218
1797
  samples: Float32Array,
@@ -1231,10 +1810,76 @@ export interface SonareModule {
1231
1810
  useKeyContext: boolean,
1232
1811
  detectInversions: boolean,
1233
1812
  chromaMethod: number,
1813
+ tuning: number,
1234
1814
  ) => string[];
1235
1815
  analyze: (samples: Float32Array, sampleRate: number, options: object) => WasmAnalysisResult;
1816
+ estimateMeter: (
1817
+ beatTimes: ArrayLike<number>,
1818
+ beatStrengths: ArrayLike<number>,
1819
+ options: object,
1820
+ ) => WasmMeterEstimateResult;
1236
1821
  _synthEnumTables: () => WasmSynthEnumTables;
1237
1822
  _synthPatchRoundTrip: (patch: unknown) => unknown;
1823
+ // Arrangement surface. Present only in a build with arrangement support, like
1824
+ // the mixing and voice-changer entries elsewhere in this interface; callers
1825
+ // probe for it at runtime (see projectModule() in project_internal.ts) rather
1826
+ // than through the type. `unknown` marks the shapes the facade owns — this
1827
+ // file describes the raw module and does not depend on the facade's types.
1828
+ projectAbiVersion: () => number;
1829
+ synthPresetNames: () => string[];
1830
+ synthPresetPatch: (name: string) => unknown;
1831
+ synthGsDrumKitName: (program: number) => string | null;
1832
+ synthGsDrumKitIsVoicedApart: (program: number) => number;
1833
+ synthGsVariationIsVoicedApart: (bank: number, program: number) => number;
1834
+ controllerProfileNames: () => string[];
1835
+ midiGmInstrumentName: (program: number) => string | null;
1836
+ midiGmProgramForName: (name: string) => number;
1837
+ midiGmFamilyName: (family: number) => string | null;
1838
+ midiGmFamilyFirstProgram: (family: number) => number;
1839
+ midiGm2InstrumentName: (bankLsb: number, program: number) => string | null;
1840
+ midiGmDrumName: (note: number) => string | null;
1841
+ midiGmDrumNoteForName: (name: string) => number;
1842
+ midiGm2DrumSetName: (bankLsb: number) => string | null;
1843
+ midiGm2DrumName: (bankLsb: number, note: number) => string | null;
1844
+ midiCcName: (controller: number) => string | null;
1845
+ midiCcIndexForName: (name: string) => number;
1846
+ midiPerNoteControllerName: (index: number) => string | null;
1847
+ midiBankProgram: (
1848
+ ppq: number,
1849
+ group: number,
1850
+ channel: number,
1851
+ bankMsb: number,
1852
+ bankLsb: number,
1853
+ program: number,
1854
+ ) => unknown;
1855
+ midiRouteEvents: (events: readonly unknown[], config: unknown) => unknown;
1856
+ midiCcLearn: (
1857
+ events: readonly unknown[],
1858
+ paramId: number,
1859
+ minValue: number,
1860
+ maxValue: number,
1861
+ minMovement: number,
1862
+ ) => unknown;
1863
+ midiCcToBreakpoint: (bindings: readonly unknown[], event: unknown) => unknown;
1864
+ midiParamToCc: (
1865
+ bindings: readonly unknown[],
1866
+ paramId: number,
1867
+ unitValue: number,
1868
+ group: number,
1869
+ ppq: number,
1870
+ ) => unknown;
1871
+ transcribe: (
1872
+ samples: Float32Array,
1873
+ sampleRate: number,
1874
+ tempoBpm: number | undefined,
1875
+ config: unknown,
1876
+ ) => unknown;
1877
+ alignTakeToReference: (
1878
+ reference: Float32Array,
1879
+ take: Float32Array,
1880
+ sampleRate: number,
1881
+ config: unknown,
1882
+ ) => unknown;
1238
1883
  _analysisResultSchemaPaths: () => string[];
1239
1884
  _analysisResultSchemaFixture: () => WasmAnalysisResult;
1240
1885
  analyzeImpulseResponse: (
@@ -1268,10 +1913,11 @@ export interface SonareModule {
1268
1913
  samples: Float32Array,
1269
1914
  sampleRate: number,
1270
1915
  options: WasmRoomMorphOptions,
1271
- ) => Float32Array;
1916
+ ) => WasmRoomMorphResult;
1272
1917
  analyzeWithProgress: (
1273
1918
  samples: Float32Array,
1274
1919
  sampleRate: number,
1920
+ options: object,
1275
1921
  progressCallback: ProgressCallback | null,
1276
1922
  cancelCallback: (() => boolean) | null,
1277
1923
  ) => WasmAnalysisResult;
@@ -1547,6 +2193,48 @@ export interface SonareModule {
1547
2193
  sampleRate: number,
1548
2194
  alignZeros: boolean,
1549
2195
  ) => Float32Array;
2196
+ decomposeStems: (
2197
+ samples: Float32Array,
2198
+ sampleRate: number,
2199
+ options: {
2200
+ nComponents?: number;
2201
+ nFft?: number;
2202
+ hopLength?: number;
2203
+ nIter?: number;
2204
+ beta?: number;
2205
+ init?: string;
2206
+ maskPower?: number;
2207
+ },
2208
+ ) => {
2209
+ components: Float32Array[];
2210
+ w: Float32Array;
2211
+ h: Float32Array;
2212
+ sampleRate: number;
2213
+ };
2214
+ decomposeStemsLinked: (
2215
+ channels: Float32Array[],
2216
+ sampleRate: number,
2217
+ options: {
2218
+ nComponents?: number;
2219
+ nFft?: number;
2220
+ hopLength?: number;
2221
+ nIter?: number;
2222
+ beta?: number;
2223
+ init?: string;
2224
+ maskPower?: number;
2225
+ },
2226
+ ) => {
2227
+ components: Float32Array[][];
2228
+ w: Float32Array;
2229
+ h: Float32Array;
2230
+ sampleRate: number;
2231
+ };
2232
+ remixAlignedIntervals: (
2233
+ samples: Float32Array,
2234
+ intervals: Int32Array,
2235
+ sampleRate: number,
2236
+ alignZeros: boolean,
2237
+ ) => Int32Array;
1550
2238
  phaseVocoder: (
1551
2239
  samples: Float32Array,
1552
2240
  sampleRate: number,
@@ -1620,6 +2308,114 @@ export interface SonareModule {
1620
2308
  offsetSample: number,
1621
2309
  targetOnsetSample: number,
1622
2310
  ) => Float32Array;
2311
+ extractNotes: (
2312
+ samples: Float32Array,
2313
+ sampleRate: number,
2314
+ f0Hz: Float32Array,
2315
+ voicedProb: Float32Array | undefined,
2316
+ voiced: Float32Array | undefined,
2317
+ frameRate: number,
2318
+ options: {
2319
+ segmentationThresholdCents?: number;
2320
+ minNoteMs?: number;
2321
+ referenceHz?: number;
2322
+ voicedThreshold?: number;
2323
+ },
2324
+ ) => NoteObject[];
2325
+ renderNotes: (
2326
+ samples: Float32Array,
2327
+ sampleRate: number,
2328
+ notes: readonly NoteObjectInput[],
2329
+ options: {
2330
+ fadeMs?: number;
2331
+ f0Hz?: Float32Array;
2332
+ frameRate?: number;
2333
+ vibratoCutoffHz?: number;
2334
+ },
2335
+ ) => Float32Array;
2336
+ decomposeNotePitch: (
2337
+ f0Hz: Float32Array,
2338
+ frameRate: number,
2339
+ medianHz: number,
2340
+ vibratoCutoffHz: number,
2341
+ ) => PitchDecompositionResult;
2342
+ splitNote: (
2343
+ samples: Float32Array,
2344
+ sampleRate: number,
2345
+ f0Hz: Float32Array,
2346
+ voicedProb: Float32Array | undefined,
2347
+ voiced: Float32Array | undefined,
2348
+ frameRate: number,
2349
+ notes: readonly NoteSetEntry[],
2350
+ index: number,
2351
+ frame: number,
2352
+ options: {
2353
+ segmentationThresholdCents?: number;
2354
+ minNoteMs?: number;
2355
+ referenceHz?: number;
2356
+ voicedThreshold?: number;
2357
+ },
2358
+ ) => NoteObject[];
2359
+ mergeNotes: (
2360
+ samples: Float32Array,
2361
+ sampleRate: number,
2362
+ f0Hz: Float32Array,
2363
+ voicedProb: Float32Array | undefined,
2364
+ voiced: Float32Array | undefined,
2365
+ frameRate: number,
2366
+ notes: readonly NoteSetEntry[],
2367
+ first: number,
2368
+ last: number,
2369
+ options: {
2370
+ segmentationThresholdCents?: number;
2371
+ minNoteMs?: number;
2372
+ referenceHz?: number;
2373
+ voicedThreshold?: number;
2374
+ },
2375
+ ) => NoteObject[];
2376
+ assignNoteTargets: (
2377
+ notes: readonly NoteObject[],
2378
+ sampleRate: number,
2379
+ targets: readonly NoteTarget[],
2380
+ options: {
2381
+ unmatchedPolicy?: NoteTargetUnmatchedPolicy;
2382
+ minOverlapRatio?: number;
2383
+ maxCorrectionSemitones?: number;
2384
+ },
2385
+ ) => NoteTargetAssignResult;
2386
+ /** Absent from a build without arrangement support, which is what links the MIDI reader. */
2387
+ noteTargetsFromSmf?: (data: Uint8Array, trackIndex: number) => NoteTarget[];
2388
+ createPolyphonicAnalysis: (
2389
+ samples: Float32Array,
2390
+ sampleRate: number,
2391
+ config: Record<string, unknown>,
2392
+ ) => WasmPolyphonicAnalysis;
2393
+ extractPercussiveEvents: (
2394
+ samples: Float32Array | readonly number[],
2395
+ sampleRate: number,
2396
+ options: {
2397
+ nFft?: number;
2398
+ hopLength?: number;
2399
+ hpssKernelHarmonic?: number;
2400
+ hpssKernelPercussive?: number;
2401
+ onsetWait?: number;
2402
+ onsetDelta?: number;
2403
+ maxEventMs?: number;
2404
+ minPercussiveRatio?: number;
2405
+ },
2406
+ ) => PercussiveEvent[];
2407
+ renderPercussiveEvents: (
2408
+ samples: Float32Array | readonly number[],
2409
+ sampleRate: number,
2410
+ events: readonly PercussiveEventInput[],
2411
+ options: {
2412
+ nFft?: number;
2413
+ hopLength?: number;
2414
+ hpssKernelHarmonic?: number;
2415
+ hpssKernelPercussive?: number;
2416
+ fadeMs?: number;
2417
+ },
2418
+ ) => Float32Array;
1623
2419
  voiceChange: (
1624
2420
  samples: Float32Array,
1625
2421
  sampleRate: number,
@@ -1639,6 +2435,13 @@ export interface SonareModule {
1639
2435
  targetDb: number,
1640
2436
  mode: string,
1641
2437
  ) => Float32Array;
2438
+ normalizeStereo: (
2439
+ left: Float32Array,
2440
+ right: Float32Array,
2441
+ sampleRate: number,
2442
+ targetDb: number,
2443
+ mode: string,
2444
+ ) => { left: Float32Array; right: Float32Array; appliedGainDb: number };
1642
2445
  mastering: (
1643
2446
  samples: Float32Array,
1644
2447
  sampleRate: number,
@@ -1652,6 +2455,17 @@ export interface SonareModule {
1652
2455
  masteringPairProcessorNames: () => string[];
1653
2456
  masteringPairAnalysisNames: () => string[];
1654
2457
  masteringStereoAnalysisNames: () => string[];
2458
+ masteringInsertNames: () => string[];
2459
+ masteringInsertParamNames: (name: string) => string[];
2460
+ // These return JSON the facade parses; the raw module has no object shape here.
2461
+ masteringInsertParamInfo: (name: string) => string;
2462
+ masteringProcessorCatalog: () => string;
2463
+ masteringAmpPresetCatalog: () => string;
2464
+ masteringInsertTiming: (
2465
+ name: string,
2466
+ paramsJson: string,
2467
+ sampleRate: number,
2468
+ ) => { latencySamples: number; tailSamples: number };
1655
2469
  masteringProcess: (
1656
2470
  processorName: string,
1657
2471
  samples: Float32Array,
@@ -1679,6 +2493,11 @@ export interface SonareModule {
1679
2493
  sampleRate: number,
1680
2494
  params: Record<string, number | boolean>,
1681
2495
  ) => string;
2496
+ masteringAbMatchLoudness: (
2497
+ source: Float32Array,
2498
+ reference: Float32Array,
2499
+ sampleRate: number,
2500
+ ) => WasmLoudnessMatchResult;
1682
2501
  masteringStereoAnalyze: (
1683
2502
  analysisName: string,
1684
2503
  left: Float32Array,
@@ -1689,8 +2508,13 @@ export interface SonareModule {
1689
2508
  masteringAssistantSuggest: (
1690
2509
  samples: Float32Array,
1691
2510
  sampleRate: number,
1692
- params: Record<string, number | boolean>,
2511
+ params: Record<string, number | boolean | string>,
1693
2512
  ) => string;
2513
+ masteringAssistantSuggestChain: (
2514
+ samples: Float32Array,
2515
+ sampleRate: number,
2516
+ params: Record<string, number | boolean | string>,
2517
+ ) => Record<string, number | boolean>;
1694
2518
  masteringAudioProfile: (
1695
2519
  samples: Float32Array,
1696
2520
  sampleRate: number,
@@ -1705,8 +2529,14 @@ export interface SonareModule {
1705
2529
  left: Float32Array,
1706
2530
  right: Float32Array,
1707
2531
  sampleRate: number,
1708
- params: Record<string, number | boolean>,
2532
+ params: Record<string, number | boolean | string>,
1709
2533
  ) => string;
2534
+ masteringAssistantSuggestChainStereo: (
2535
+ left: Float32Array,
2536
+ right: Float32Array,
2537
+ sampleRate: number,
2538
+ params: Record<string, number | boolean | string>,
2539
+ ) => Record<string, number | boolean>;
1710
2540
  masteringAudioProfileStereo: (
1711
2541
  left: Float32Array,
1712
2542
  right: Float32Array,
@@ -1724,36 +2554,134 @@ export interface SonareModule {
1724
2554
  sampleRate: number,
1725
2555
  options: object,
1726
2556
  ) => Float32Array;
2557
+ masteringRepairDeclickStereo: (
2558
+ left: Float32Array,
2559
+ right: Float32Array,
2560
+ sampleRate: number,
2561
+ options: object,
2562
+ ) => WasmDeclickStereoResult;
1727
2563
  masteringRepairDenoiseClassical: (
1728
2564
  samples: Float32Array,
1729
2565
  sampleRate: number,
1730
2566
  options: object,
1731
2567
  ) => Float32Array;
2568
+ masteringRepairDenoiseClassicalStereo: (
2569
+ left: Float32Array,
2570
+ right: Float32Array,
2571
+ sampleRate: number,
2572
+ options: object,
2573
+ ) => WasmDenoiseStereoResult;
2574
+ masteringRepairDenoiseClassicalLinked: (
2575
+ channels: Float32Array[],
2576
+ sampleRate: number,
2577
+ options: object,
2578
+ ) => WasmDenoiseLinkedResult;
1732
2579
  masteringRepairDeclip: (
1733
2580
  samples: Float32Array,
1734
2581
  sampleRate: number,
1735
2582
  options: object,
1736
2583
  ) => Float32Array;
2584
+ masteringRepairDeclipStereo: (
2585
+ left: Float32Array,
2586
+ right: Float32Array,
2587
+ sampleRate: number,
2588
+ options: object,
2589
+ ) => WasmDeclipStereoResult;
1737
2590
  masteringRepairDecrackle: (
1738
2591
  samples: Float32Array,
1739
2592
  sampleRate: number,
1740
2593
  options: object,
1741
2594
  ) => Float32Array;
2595
+ masteringRepairDecrackleStereo: (
2596
+ left: Float32Array,
2597
+ right: Float32Array,
2598
+ sampleRate: number,
2599
+ options: object,
2600
+ ) => WasmDecrackleStereoResult;
1742
2601
  masteringRepairDehum: (
1743
2602
  samples: Float32Array,
1744
2603
  sampleRate: number,
1745
2604
  options: object,
1746
2605
  ) => Float32Array;
2606
+ masteringRepairDehumStereo: (
2607
+ left: Float32Array,
2608
+ right: Float32Array,
2609
+ sampleRate: number,
2610
+ options: object,
2611
+ ) => WasmDehumStereoResult;
1747
2612
  masteringRepairDereverbClassical: (
1748
2613
  samples: Float32Array,
1749
2614
  sampleRate: number,
1750
2615
  options: object,
1751
2616
  ) => Float32Array;
2617
+ masteringRepairDereverbClassicalStereo: (
2618
+ left: Float32Array,
2619
+ right: Float32Array,
2620
+ sampleRate: number,
2621
+ options: object,
2622
+ ) => WasmDereverbStereoResult;
2623
+ masteringRepairDereverbClassicalLinked: (
2624
+ channels: Float32Array[],
2625
+ sampleRate: number,
2626
+ options: object,
2627
+ ) => WasmDereverbLinkedResult;
2628
+ masteringRepairDereverbConfigForRoom: (
2629
+ estimate: WasmRoomEstimateResult,
2630
+ options: object,
2631
+ ) => WasmDereverbClassicalConfig;
1752
2632
  masteringRepairTrimSilence: (
1753
2633
  samples: Float32Array,
1754
2634
  sampleRate: number,
1755
2635
  options: object,
1756
2636
  ) => Float32Array;
2637
+ masteringRepairTrimSilenceStereo: (
2638
+ left: Float32Array,
2639
+ right: Float32Array,
2640
+ sampleRate: number,
2641
+ options: object,
2642
+ ) => WasmTrimSilenceStereoResult;
2643
+ masteringRepairDetectClicks: (
2644
+ samples: Float32Array,
2645
+ sampleRate: number,
2646
+ options: object,
2647
+ ) => WasmClickDetection;
2648
+ masteringRepairDetectNoiseFloor: (
2649
+ samples: Float32Array,
2650
+ sampleRate: number,
2651
+ options: object,
2652
+ ) => WasmNoiseDetection;
2653
+ masteringRepairNoiseBandBins: (nFft: number, sampleRate: number) => Int32Array;
2654
+ masteringRepairDetectClipping: (
2655
+ samples: Float32Array,
2656
+ sampleRate: number,
2657
+ options: object,
2658
+ ) => WasmClipDetection;
2659
+ masteringRepairDetectCrackle: (
2660
+ samples: Float32Array,
2661
+ sampleRate: number,
2662
+ options: object,
2663
+ ) => WasmCrackleDetection;
2664
+ masteringRepairDetectHum: (
2665
+ samples: Float32Array,
2666
+ sampleRate: number,
2667
+ options: object,
2668
+ ) => WasmHumDetection;
2669
+ masteringRepairDetectReverb: (
2670
+ samples: Float32Array,
2671
+ sampleRate: number,
2672
+ options: object,
2673
+ ) => WasmReverbDetection;
2674
+ masteringRepairDetectTrimRange: (
2675
+ samples: Float32Array,
2676
+ sampleRate: number,
2677
+ options: object,
2678
+ ) => WasmTrimRange;
2679
+ masteringRepairDetectTrimRangeStereo: (
2680
+ left: Float32Array,
2681
+ right: Float32Array,
2682
+ sampleRate: number,
2683
+ options: object,
2684
+ ) => WasmTrimRange;
1757
2685
  masteringDynamicsCompressor: (
1758
2686
  samples: Float32Array,
1759
2687
  sampleRate: number,
@@ -1796,6 +2724,8 @@ export interface SonareModule {
1796
2724
  cancelCallback: (() => boolean) | null,
1797
2725
  ) => WasmMasteringStereoChainResult;
1798
2726
  masteringPresetNames: () => string[];
2727
+ masteringPresetParams: (preset: string) => Record<string, number | boolean>;
2728
+ masteringPlatformNames: () => string[];
1799
2729
  masterAudio: (
1800
2730
  presetName: string,
1801
2731
  samples: Float32Array,
@@ -1834,6 +2764,24 @@ export interface SonareModule {
1834
2764
  sampleRate: number,
1835
2765
  options: Record<string, unknown>,
1836
2766
  ) => WasmMixResult;
2767
+ mixingAssistantSuggest: (
2768
+ leftChannels: Float32Array[],
2769
+ rightChannels: (Float32Array | null)[] | null,
2770
+ trackIds: string[],
2771
+ trackNames: (string | null)[] | null,
2772
+ sampleRate: number,
2773
+ params: Record<string, number | boolean>,
2774
+ ) => string;
2775
+ mixingAssistantSuggestSceneJson: (
2776
+ leftChannels: Float32Array[],
2777
+ rightChannels: (Float32Array | null)[] | null,
2778
+ trackIds: string[],
2779
+ trackNames: (string | null)[] | null,
2780
+ sampleRate: number,
2781
+ params: Record<string, number | boolean>,
2782
+ ) => string;
2783
+ mixingAssistantSourceClassNames: () => string[];
2784
+ mixingAssistantSourceClassFromName: (name: string) => number;
1837
2785
  trim: (samples: Float32Array, sampleRate: number, thresholdDb: number) => Float32Array;
1838
2786
  trimEx: (
1839
2787
  samples: Float32Array,
@@ -2145,6 +3093,7 @@ export interface SonareModule {
2145
3093
  segmentationThresholdCents?: number;
2146
3094
  minNoteMs?: number;
2147
3095
  referenceHz?: number;
3096
+ voicedThreshold?: number;
2148
3097
  },
2149
3098
  ) => WasmNoteSegment[];
2150
3099
 
@@ -2177,6 +3126,18 @@ export interface SonareModule {
2177
3126
  frameLength: number,
2178
3127
  hopLength: number,
2179
3128
  ) => Int32Array;
3129
+ splitSilenceCommon: (
3130
+ signals: Float32Array[],
3131
+ topDb: number,
3132
+ frameLength: number,
3133
+ hopLength: number,
3134
+ ) => Int32Array;
3135
+ splitSilenceCommonWithReport: (
3136
+ signals: Float32Array[],
3137
+ topDb: number,
3138
+ frameLength: number,
3139
+ hopLength: number,
3140
+ ) => SplitSilenceCommonWithReportResult;
2180
3141
  frameSignal: (samples: Float32Array, frameLength: number, hopLength: number) => WasmFrameResult;
2181
3142
  tone: (
2182
3143
  frequency: number,
@@ -2341,6 +3302,11 @@ export interface SonareModule {
2341
3302
  hopLength: number,
2342
3303
  minSectionSec: number,
2343
3304
  ) => WasmSectionResult[];
3305
+ detectBoundaries: (
3306
+ samples: Float32Array,
3307
+ sampleRate: number,
3308
+ options: WasmBoundaryOptions,
3309
+ ) => WasmBoundaryResult;
2344
3310
  analyzeMelody: (
2345
3311
  samples: Float32Array,
2346
3312
  sampleRate: number,
@@ -2386,6 +3352,11 @@ export interface SonareModule {
2386
3352
  momentaryLufs: (samples: Float32Array, sampleRate: number) => Float32Array;
2387
3353
  shortTermLufs: (samples: Float32Array, sampleRate: number) => Float32Array;
2388
3354
  lufsInterleaved: (samples: Float32Array, channels: number, sampleRate: number) => WasmLufsResult;
3355
+ lufsSeriesInterleaved: (
3356
+ samples: Float32Array,
3357
+ channels: number,
3358
+ sampleRate: number,
3359
+ ) => WasmLufsSeriesResult;
2389
3360
  ebur128LoudnessRange: (samples: Float32Array, sampleRate: number) => number;
2390
3361
 
2391
3362
  // Core - Resample
@@ -2428,6 +3399,14 @@ export interface SonareModule {
2428
3399
  Major9: { value: 14 };
2429
3400
  Dominant9: { value: 15 };
2430
3401
  Sus2Add4: { value: 16 };
3402
+ Major6: { value: 17 };
3403
+ Minor6: { value: 18 };
3404
+ MinorMajor7: { value: 19 };
3405
+ Dominant7Sus4: { value: 20 };
3406
+ Dominant11: { value: 21 };
3407
+ Dominant13: { value: 22 };
3408
+ Dominant7Flat9: { value: 23 };
3409
+ Dominant7Sharp9: { value: 24 };
2431
3410
  };
2432
3411
  SectionType: {
2433
3412
  Intro: { value: 0 };
@@ -2492,6 +3471,23 @@ export interface SonareModule {
2492
3471
  error?: string;
2493
3472
  };
2494
3473
 
3474
+ // Playback - renderer, HRTF set and program loudness meter
3475
+ createHrtfSet: (bytes: Uint8Array) => WasmHrtfSet;
3476
+ createPlaybackRenderer: (
3477
+ configJson: string,
3478
+ hrtf: WasmHrtfSet | null,
3479
+ sampleRate: number,
3480
+ maxBlockSize: number,
3481
+ ) => WasmPlaybackRenderer;
3482
+ createPlaybackLoudnessMeter: (channels: number, sampleRate: number) => WasmPlaybackLoudnessMeter;
3483
+ renderPlayback: (
3484
+ samples: Float32Array,
3485
+ channels: number,
3486
+ sampleRate: number,
3487
+ configJson: string,
3488
+ hrtf: WasmHrtfSet | null,
3489
+ ) => { samples: Float32Array; channels: number };
3490
+
2495
3491
  // Mixing - scene-based Mixer
2496
3492
  createMixerFromSceneJson: (json: string, sampleRate: number, blockSize: number) => WasmMixer;
2497
3493
 
@@ -2499,6 +3495,28 @@ export interface SonareModule {
2499
3495
  // surfaces a C++ throw as the raw pointer number) into a structured error.
2500
3496
  // Consumed by the module-error wrapper in module_state.ts.
2501
3497
  sonareExceptionInfo: (ptr: number) => { code: number; codeName: string; message: string };
3498
+
3499
+ // Drops the reference emscripten's __cxa_throw took on the exception object
3500
+ // before rethrowing its pointer into JS. Nothing else ever drops it, so the
3501
+ // module-error wrapper releases every pointer it surfaces.
3502
+ sonareReleaseException: (ptr: number) => void;
3503
+ }
3504
+
3505
+ // The polyphonic editing analysis. `noteCount` and `frameCount` are embind
3506
+ // properties rather than methods; everything else is a call.
3507
+ export interface WasmPolyphonicAnalysis {
3508
+ readonly noteCount: number;
3509
+ readonly frameCount: number;
3510
+ notes: () => NoteObject[];
3511
+ setNoteEdit: (note: number, edit: NoteEditInput) => void;
3512
+ polyphony: () => Int32Array;
3513
+ noteF0: (note: number) => Float32Array;
3514
+ noteAmplitude: (note: number) => Float32Array;
3515
+ noteSalience: (note: number) => Float32Array;
3516
+ noteInharmonicity: () => Float32Array;
3517
+ noteEnvelope: (note: number) => Float32Array;
3518
+ render: (options: Record<string, unknown>) => Float32Array;
3519
+ delete: () => void;
2502
3520
  }
2503
3521
 
2504
3522
  export interface WasmStreamingMasteringChain {
@@ -2513,6 +3531,10 @@ export interface WasmStreamingMasteringChain {
2513
3531
  reset: () => void;
2514
3532
  latencySamples: () => number;
2515
3533
  stageNames: () => string[];
3534
+ /** Cumulative since prepare(), which rebuilds the stages and so clears it. */
3535
+ nonFiniteSubstitutionCount: () => number;
3536
+ /** Not the same measurement as nonFiniteSubstitutionCount; see the facade. */
3537
+ nonFiniteDiscardCount: () => number;
2516
3538
  delete: () => void;
2517
3539
  }
2518
3540
 
@@ -2540,11 +3562,13 @@ export interface WasmStreamingEqualizer {
2540
3562
  clearSidechain: () => void;
2541
3563
  lastAutoGainDb: () => number;
2542
3564
  latencySamples: () => number;
3565
+ nonFiniteDiscardCount: () => number;
2543
3566
  processMono: (samples: Float32Array) => Float32Array;
2544
3567
  processStereo: (
2545
3568
  left: Float32Array,
2546
3569
  right: Float32Array,
2547
3570
  ) => { left: Float32Array; right: Float32Array };
3571
+ magnitudeResponse: (placement: number, frequenciesHz: Float32Array) => Float32Array;
2548
3572
  spectrum: () => WasmEqSpectrumSnapshot;
2549
3573
  match: (source: Float32Array, reference: Float32Array, options: Record<string, unknown>) => void;
2550
3574
  delete: () => void;
@@ -2556,6 +3580,7 @@ export interface WasmStreamingRetune {
2556
3580
  setConfig: (config: Record<string, unknown>) => void;
2557
3581
  config: () => { semitones: number; mix: number; grainSize: number };
2558
3582
  grainSize: () => number;
3583
+ latencySamples: () => number;
2559
3584
  processMono: (samples: Float32Array) => Float32Array;
2560
3585
  delete: () => void;
2561
3586
  }
@@ -2567,6 +3592,7 @@ export interface WasmRealtimeVoiceChanger {
2567
3592
  setPodConfig: (config: WasmRealtimeVoiceChangerPodConfig) => void;
2568
3593
  configJson: () => string;
2569
3594
  latencySamples: () => number;
3595
+ nonFiniteDiscardCount: () => number;
2570
3596
  bufferGeneration: () => number;
2571
3597
  processMono: (samples: Float32Array) => Float32Array;
2572
3598
  processMonoInto: (samples: Float32Array, output: Float32Array) => void;
@@ -2587,6 +3613,58 @@ export interface WasmRealtimeVoiceChanger {
2587
3613
  delete: () => void;
2588
3614
  }
2589
3615
 
3616
+ export interface WasmHrtfSet {
3617
+ delete: () => void;
3618
+ }
3619
+
3620
+ export interface WasmPlaybackRenderer {
3621
+ processPlanar: (planes: Float32Array[]) => Float32Array[];
3622
+ processInterleaved: (samples: Float32Array, inChannels: number) => Float32Array;
3623
+ setConfig: (configJson: string) => void;
3624
+ configJson: () => string;
3625
+ setHeadOrientation: (yawDeg: number, pitchDeg: number, rollDeg: number) => void;
3626
+ reset: () => void;
3627
+ latencySamples: () => number;
3628
+ inputChannels: () => number;
3629
+ outputChannels: () => number;
3630
+ diagnosticsJson: () => string;
3631
+ nonFiniteDiscardCount: () => number;
3632
+ // AudioWorklet path: heap views allocated once at construction (they detach
3633
+ // on memory growth and are then re-acquired), and a SonareError code instead
3634
+ // of a throw for a rejected block.
3635
+ inputPlane: (channel: number) => Float32Array;
3636
+ outputPlane: (channel: number) => Float32Array;
3637
+ processPrepared: (inChannels: number, frames: number) => number;
3638
+ processPreparedSilence: (frames: number) => number;
3639
+ delete: () => void;
3640
+ }
3641
+
3642
+ export interface WasmPlaybackLoudnessMeter {
3643
+ pushInterleaved: (samples: Float32Array) => void;
3644
+ integratedLufs: () => number;
3645
+ delete: () => void;
3646
+ }
3647
+
3648
+ /** One block's worth of meter readings, all dB fields floored at -120. */
3649
+ export interface WasmMixerMeterSnapshot {
3650
+ peakDbL: number;
3651
+ peakDbR: number;
3652
+ rmsDbL: number;
3653
+ rmsDbR: number;
3654
+ correlation: number;
3655
+ /**
3656
+ * Left-channel inter-sample (true) peak in dB, from the ITU-R BS.1770-4
3657
+ * polyphase reconstruction at 4x. A streaming measurement: the centered
3658
+ * reconstruction stencil needs a few future samples a realtime path does not
3659
+ * have, so each block's last samples read marginally low (about 0.1 dB across
3660
+ * 64..8192-sample blocks on a near-Nyquist tone, always under-reading). Use
3661
+ * `meteringTruePeakDb` over the whole signal for an exact dBTP number.
3662
+ */
3663
+ truePeakDbL: number;
3664
+ /** Right-channel inter-sample (true) peak in dB. See {@link truePeakDbL}. */
3665
+ truePeakDbR: number;
3666
+ }
3667
+
2590
3668
  export interface WasmMixer {
2591
3669
  compile: () => void;
2592
3670
  processStereo: (
@@ -2604,6 +3682,10 @@ export interface WasmMixer {
2604
3682
  outputLeftView: () => Float32Array;
2605
3683
  outputRightView: () => Float32Array;
2606
3684
  processPreparedStereo: (numSamples: number) => void;
3685
+ configureMeter: (enabled: boolean, truePeakOversample: number) => void;
3686
+ meterSnapshot: () => WasmMixerMeterSnapshot;
3687
+ latchMeterSnapshot: () => boolean;
3688
+ meterScratchValue: (field: number) => number;
2607
3689
  stripCount: () => number;
2608
3690
  sceneWarnings: () => string[];
2609
3691
  scheduleInsertAutomation: (
@@ -2619,6 +3701,7 @@ export interface WasmMixer {
2619
3701
  setFaderDb: (stripIndex: number, db: number) => void;
2620
3702
  setPan: (stripIndex: number, pan: number, panMode: number) => void;
2621
3703
  setWidth: (stripIndex: number, width: number) => void;
3704
+ settle: (stripIndex: number) => void;
2622
3705
  setMuted: (stripIndex: number, muted: boolean) => void;
2623
3706
  setSoloed: (stripIndex: number, soloed: boolean) => void;
2624
3707
  setSoloSafe: (stripIndex: number, soloSafe: boolean) => void;
@@ -2640,6 +3723,8 @@ export interface WasmMixer {
2640
3723
  meterTap: (stripIndex: number, tap: number) => WasmMixMeterSnapshot;
2641
3724
  stripMeter: (stripIndex: number) => WasmMixMeterSnapshot;
2642
3725
  busMeter: (busId: string) => WasmMixMeterSnapshot;
3726
+ stripNonFiniteDiscardCount: (stripIndex: number) => number;
3727
+ busNonFiniteDiscardCount: (busId: string) => number;
2643
3728
  scheduleFaderAutomation: (
2644
3729
  stripIndex: number,
2645
3730
  samplePos: number,
@@ -2666,6 +3751,7 @@ export interface WasmMixer {
2666
3751
  curve: number,
2667
3752
  ) => void;
2668
3753
  readGoniometerLatest: (stripIndex: number, maxPoints: number) => WasmGoniometerPoint[];
3754
+ addStrip: (id: string, metering: StripMeteringOptions) => void;
2669
3755
  addBus: (id: string, role: string) => void;
2670
3756
  removeBus: (id: string) => void;
2671
3757
  busCount: () => number;
@@ -2744,6 +3830,7 @@ export interface WasmAnalyzerStats {
2744
3830
  droppedOutputFrames: number;
2745
3831
  droppedChordProgressionEntries: number;
2746
3832
  droppedBarProgressionEntries: number;
3833
+ nonFiniteDiscardBlocks: number;
2747
3834
  estimate: WasmProgressiveEstimate;
2748
3835
  }
2749
3836
 
@@ -2794,8 +3881,11 @@ export interface WasmStreamFramesI16 {
2794
3881
  }
2795
3882
 
2796
3883
  export interface WasmStreamAnalyzer {
3884
+ /** Throws (invalid state) when the stream was already finalized; reset first. */
2797
3885
  process: (samples: Float32Array) => void;
3886
+ /** Rejects a gap, a seek, a mode switch, and a chunk fed after finalize. */
2798
3887
  processWithOffset: (samples: Float32Array, sampleOffset: number) => void;
3888
+ /** Idempotent on success; a failed call leaves the stream un-finalized. */
2799
3889
  finalize: () => void;
2800
3890
  availableFrames: () => number;
2801
3891
  readFramesSoa: (maxFrames: number) => WasmFrameBuffer;
@@ -2807,7 +3897,9 @@ export interface WasmStreamAnalyzer {
2807
3897
  currentTime: () => number;
2808
3898
  sampleRate: () => number;
2809
3899
  setExpectedDuration: (durationSeconds: number) => void;
3900
+ /** Throws outside 0.01..100; the request is refused, never clamped. */
2810
3901
  setNormalizationGain: (gain: number) => void;
3902
+ /** Throws outside 220..880 Hz; the request is refused, never clamped. */
2811
3903
  setTuningRefHz: (refHz: number) => void;
2812
3904
  delete: () => void;
2813
3905
  }