@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
package/dist/analysis.js CHANGED
@@ -9,6 +9,7 @@ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
9
9
  ErrorCode2[ErrorCode2["NotSupported"] = 6] = "NotSupported";
10
10
  ErrorCode2[ErrorCode2["InvalidState"] = 7] = "InvalidState";
11
11
  ErrorCode2[ErrorCode2["Cancelled"] = 8] = "Cancelled";
12
+ ErrorCode2[ErrorCode2["EncodeFailed"] = 9] = "EncodeFailed";
12
13
  ErrorCode2[ErrorCode2["Unknown"] = 99] = "Unknown";
13
14
  return ErrorCode2;
14
15
  })(ErrorCode || {});
@@ -19,6 +20,17 @@ var SonareError = class extends Error {
19
20
  this.code = code;
20
21
  this.codeName = codeName;
21
22
  }
23
+ /**
24
+ * Brand-based `instanceof`: an error that carries the shape narrows here even
25
+ * when it is not literally an instance of this class. That is not a
26
+ * hypothetical — an error posted from the analysis worker arrives as a
27
+ * structured clone with its prototype gone, which a prototype-based
28
+ * `instanceof` would silently miss. Delegates to {@link isSonareError} so the
29
+ * two never disagree.
30
+ */
31
+ static [Symbol.hasInstance](value) {
32
+ return isSonareError(value);
33
+ }
22
34
  };
23
35
  function isSonareError(value) {
24
36
  return value instanceof Error && value.name === "SonareError" && typeof value.code === "number";
@@ -50,6 +62,11 @@ function makeSonareError(raw, thrown) {
50
62
  message = info.message || message;
51
63
  }
52
64
  } catch {
65
+ } finally {
66
+ try {
67
+ raw.sonareReleaseException(thrown);
68
+ } catch {
69
+ }
53
70
  }
54
71
  return new SonareError(code, codeName, message);
55
72
  }
@@ -70,6 +87,10 @@ function wrapModuleErrors(raw) {
70
87
  if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer || value instanceof Promise) {
71
88
  return value;
72
89
  }
90
+ const proto = Object.getPrototypeOf(value);
91
+ if (Array.isArray(value) || proto === Object.prototype || proto === null) {
92
+ return value;
93
+ }
73
94
  const objectValue = value;
74
95
  const cached = objectCache.get(objectValue);
75
96
  if (cached) {
@@ -272,6 +293,22 @@ function splitSilence(samples, topDb = 60, frameLength = 2048, hopLength = 512)
272
293
  }
273
294
  return requireModule().splitSilence(samples, topDb, frameLength, hopLength);
274
295
  }
296
+ function splitSilenceCommon(request) {
297
+ return requireModule().splitSilenceCommon(
298
+ request.signals,
299
+ request.topDb ?? 60,
300
+ request.frameLength ?? 2048,
301
+ request.hopLength ?? 512
302
+ );
303
+ }
304
+ function splitSilenceCommonWithReport(request) {
305
+ return requireModule().splitSilenceCommonWithReport(
306
+ request.signals,
307
+ request.topDb ?? 60,
308
+ request.frameLength ?? 2048,
309
+ request.hopLength ?? 512
310
+ );
311
+ }
275
312
  function frameSignal(samples, frameLength, hopLength) {
276
313
  if (!(samples instanceof Float32Array)) {
277
314
  return frameSignal(samples.samples, samples.frameLength, samples.hopLength);
@@ -421,28 +458,70 @@ function assertSamples(fnName, samples, validate, argName = "samples") {
421
458
  assertNonEmptySamples(fnName, samples, argName);
422
459
  assertFiniteSamples(fnName, samples, validate, argName);
423
460
  }
461
+ function assertSamplesInWindow(fnName, samples, validate, windowStart, windowLength, argName = "samples") {
462
+ assertNonEmptySamples(fnName, samples, argName);
463
+ if (!validate) {
464
+ return;
465
+ }
466
+ const start = Math.min(Math.max(Math.floor(windowStart), 0), samples.length);
467
+ const stop = Math.min(start + Math.max(Math.ceil(windowLength), 0), samples.length);
468
+ for (let i = start; i < stop; i++) {
469
+ const v = samples[i];
470
+ if (!Number.isFinite(v)) {
471
+ throw new RangeError(`${fnName}: ${argName} contains NaN or Inf at index ${i}`);
472
+ }
473
+ }
474
+ }
424
475
  function assertFiniteScalar(fnName, value, argName) {
425
476
  if (!Number.isFinite(value)) {
426
477
  throw new RangeError(`${fnName}: ${argName} must be a finite number`);
427
478
  }
428
479
  }
429
- function assertSampleRate(fnName, sampleRate) {
430
- if (!Number.isInteger(sampleRate) || sampleRate < MIN_AUDIO_SAMPLE_RATE || sampleRate > MAX_AUDIO_SAMPLE_RATE) {
480
+ function assertVqtGamma(fnName, gamma) {
481
+ if (gamma === Number.POSITIVE_INFINITY || gamma === Number.NEGATIVE_INFINITY) {
482
+ throw new RangeError(`${fnName}: gamma must not be infinite`);
483
+ }
484
+ }
485
+ function assertSampleRate(fnName, sampleRate, argName = "sampleRate") {
486
+ if (!Number.isInteger(sampleRate)) {
487
+ throw new RangeError(`${fnName}: ${argName} must be an integer`);
488
+ }
489
+ if (sampleRate < MIN_AUDIO_SAMPLE_RATE || sampleRate > MAX_AUDIO_SAMPLE_RATE) {
431
490
  throw new RangeError(
432
- `${fnName}: sampleRate out of supported range [${MIN_AUDIO_SAMPLE_RATE}, ${MAX_AUDIO_SAMPLE_RATE}]`
491
+ `${fnName}: ${argName} out of supported range [${MIN_AUDIO_SAMPLE_RATE}, ${MAX_AUDIO_SAMPLE_RATE}]`
433
492
  );
434
493
  }
435
494
  }
495
+ var C_INT_MAX = 2147483647;
436
496
  function assertNonNegativeInteger(fnName, value, argName) {
437
497
  if (!Number.isInteger(value) || value < 0) {
438
498
  throw new RangeError(`${fnName}: ${argName} must be a non-negative integer`);
439
499
  }
440
500
  }
441
501
  function assertPositiveInteger(fnName, value, argName) {
442
- if (!Number.isInteger(value) || value <= 0) {
502
+ if (!Number.isInteger(value)) {
503
+ throw new RangeError(`${fnName}: ${argName} must be an integer`);
504
+ }
505
+ if (value <= 0 || value > C_INT_MAX) {
443
506
  throw new RangeError(`${fnName}: ${argName} must be a positive integer`);
444
507
  }
445
508
  }
509
+ function assertIntegerValue(fnName, value, argName) {
510
+ if (typeof value !== "number") {
511
+ throw new TypeError(`${fnName}: ${argName} must be an integer`);
512
+ }
513
+ if (!Number.isInteger(value)) {
514
+ throw new RangeError(`${fnName}: ${argName} must be an integer`);
515
+ }
516
+ }
517
+ function assertEvenIntegerAtLeast(fnName, value, argName, min, max) {
518
+ if (!Number.isInteger(value) || value < min || value > max) {
519
+ throw new RangeError(`${fnName}: ${argName} must be an integer in [${min}, ${max}]`);
520
+ }
521
+ if (value % 2 !== 0) {
522
+ throw new RangeError(`${fnName}: ${argName} must be an even integer`);
523
+ }
524
+ }
446
525
  function assertInterleavedSamples(fnName, samples, channels, validate) {
447
526
  assertSamples(fnName, samples, validate);
448
527
  assertPositiveInteger(fnName, channels, "channels");
@@ -451,103 +530,444 @@ function assertInterleavedSamples(fnName, samples, channels, validate) {
451
530
  }
452
531
  }
453
532
 
454
- // src/feature_music.ts
533
+ // src/_fft_options.ts
534
+ function resolveFftOptions(fnName, nFft, hopLength) {
535
+ const resolvedNFft = nFft === void 0 ? 2048 : nFft;
536
+ const resolvedHopLength = hopLength === void 0 ? 512 : hopLength;
537
+ assertIntegerValue(fnName, resolvedNFft, "nFft");
538
+ assertEvenIntegerAtLeast(fnName, resolvedNFft, "nFft", 2, 2 ** 30);
539
+ assertIntegerValue(fnName, resolvedHopLength, "hopLength");
540
+ assertPositiveInteger(fnName, resolvedHopLength, "hopLength");
541
+ return { nFft: resolvedNFft, hopLength: resolvedHopLength };
542
+ }
543
+
544
+ // src/feature_decompose.ts
455
545
  function requireModule2() {
456
546
  return getSonareModule();
457
547
  }
458
- function validateMusicSamples(fnName, samples, sampleRate, options = {}) {
459
- assertSampleRate(fnName, sampleRate);
460
- assertSamples(fnName, samples, options.validate !== false);
548
+ function validateSegmentMatrix(fnName, data, rows, cols, dataName) {
549
+ assertPositiveInteger(fnName, rows, "rows");
550
+ assertPositiveInteger(fnName, cols, "cols");
551
+ assertSamples(fnName, data, true, dataName);
552
+ const expected = rows * cols;
553
+ if (!Number.isSafeInteger(expected) || data.length !== expected) {
554
+ throw new RangeError(`${fnName}: ${dataName} length must equal rows * cols`);
555
+ }
556
+ }
557
+ function segmentCrossSimilarity(request) {
558
+ validateSegmentMatrix("segmentCrossSimilarity", request.x, request.xRows, request.xCols, "x");
559
+ validateSegmentMatrix("segmentCrossSimilarity", request.y, request.yRows, request.yCols, "y");
560
+ if (request.xRows !== request.yRows) {
561
+ throw new RangeError("segmentCrossSimilarity: feature dimensions must match");
562
+ }
563
+ assertNonNegativeInteger("segmentCrossSimilarity", request.k ?? 0, "k");
564
+ return requireModule2().segmentCrossSimilarity(
565
+ request.x,
566
+ request.xRows,
567
+ request.xCols,
568
+ request.y,
569
+ request.yRows,
570
+ request.yCols,
571
+ request.k ?? 0,
572
+ request.metric ?? "cosine",
573
+ request.mode ?? "connectivity"
574
+ );
575
+ }
576
+ function segmentRecurrenceMatrix(request) {
577
+ validateSegmentMatrix(
578
+ "segmentRecurrenceMatrix",
579
+ request.data,
580
+ request.rows,
581
+ request.cols,
582
+ "data"
583
+ );
584
+ assertNonNegativeInteger("segmentRecurrenceMatrix", request.k ?? 0, "k");
585
+ assertNonNegativeInteger("segmentRecurrenceMatrix", request.width ?? 1, "width");
586
+ return requireModule2().segmentRecurrenceMatrix(
587
+ request.data,
588
+ request.rows,
589
+ request.cols,
590
+ request.k ?? 0,
591
+ request.width ?? 1,
592
+ request.sym ?? false,
593
+ request.metric ?? "euclidean",
594
+ request.mode ?? "connectivity"
595
+ );
596
+ }
597
+ function segmentRecurrenceToLag(request) {
598
+ validateSegmentMatrix(
599
+ "segmentRecurrenceToLag",
600
+ request.recurrence,
601
+ request.n,
602
+ request.n,
603
+ "recurrence"
604
+ );
605
+ return requireModule2().segmentRecurrenceToLag(
606
+ request.recurrence,
607
+ request.n,
608
+ request.pad ?? false
609
+ );
610
+ }
611
+ function segmentLagToRecurrence(request) {
612
+ validateSegmentMatrix("segmentLagToRecurrence", request.lag, request.rows, request.lags, "lag");
613
+ return requireModule2().segmentLagToRecurrence(request.lag, request.rows, request.lags);
614
+ }
615
+ function segmentSubsegment(request) {
616
+ validateSegmentMatrix("segmentSubsegment", request.data, request.rows, request.cols, "data");
617
+ assertPositiveInteger("segmentSubsegment", request.nSegments ?? 4, "nSegments");
618
+ return requireModule2().segmentSubsegment(
619
+ request.data,
620
+ request.rows,
621
+ request.cols,
622
+ request.boundaries,
623
+ request.nSegments ?? 4
624
+ );
625
+ }
626
+ function segmentAgglomerative(request) {
627
+ validateSegmentMatrix("segmentAgglomerative", request.data, request.rows, request.cols, "data");
628
+ assertPositiveInteger("segmentAgglomerative", request.k, "k");
629
+ return requireModule2().segmentAgglomerative(
630
+ request.data,
631
+ request.rows,
632
+ request.cols,
633
+ request.k,
634
+ request.linkage ?? "average"
635
+ );
636
+ }
637
+ function segmentPathEnhance(request) {
638
+ validateSegmentMatrix(
639
+ "segmentPathEnhance",
640
+ request.recurrence,
641
+ request.n,
642
+ request.n,
643
+ "recurrence"
644
+ );
645
+ assertPositiveInteger("segmentPathEnhance", request.win, "win");
646
+ assertPositiveInteger("segmentPathEnhance", request.maxRatio ?? 2, "maxRatio");
647
+ assertNonNegativeInteger("segmentPathEnhance", request.minRatio ?? 0, "minRatio");
648
+ assertPositiveInteger("segmentPathEnhance", request.nFilters ?? 7, "nFilters");
649
+ return requireModule2().segmentPathEnhance(
650
+ request.recurrence,
651
+ request.n,
652
+ request.win,
653
+ request.maxRatio ?? 2,
654
+ request.minRatio ?? 0,
655
+ request.nFilters ?? 7
656
+ );
461
657
  }
658
+
659
+ // src/_feature_validation.ts
462
660
  function validatePositiveIntegers(fnName, values) {
463
661
  for (const [name, value] of Object.entries(values)) {
464
662
  assertPositiveInteger(fnName, value, name);
465
663
  }
466
664
  }
467
- function validateFrequencyBounds(fnName, fmin, fmax) {
665
+ function validateMelFrequencyRange(fnName, fmin, fmax, sampleRate) {
468
666
  assertFiniteScalar(fnName, fmin, "fmin");
667
+ assertFiniteScalar(fnName, fmax, "fmax");
469
668
  if (fmin < 0) {
470
669
  throw new RangeError(`${fnName}: fmin must be non-negative`);
471
670
  }
472
- if (fmax !== void 0) {
473
- assertFiniteScalar(fnName, fmax, "fmax");
474
- if (fmax <= fmin) {
475
- throw new RangeError(`${fnName}: fmax must be greater than fmin`);
476
- }
671
+ if (fmax < 0) {
672
+ throw new RangeError(`${fnName}: fmax must be non-negative`);
477
673
  }
478
- }
479
- function nnlsChroma(samples, sampleRate = 22050, options = {}) {
480
- if (!(samples instanceof Float32Array)) {
481
- return nnlsChroma(samples.samples, samples.sampleRate, samples);
674
+ const effectiveFmax = fmax === 0 ? sampleRate / 2 : fmax;
675
+ if (effectiveFmax <= fmin) {
676
+ throw new RangeError(`${fnName}: fmax must be greater than fmin`);
482
677
  }
483
- validateMusicSamples("nnlsChroma", samples, sampleRate, options);
484
- const hopLength = options.hopLength === void 0 ? 512 : options.hopLength;
485
- assertPositiveInteger("nnlsChroma", hopLength, "hopLength");
486
- if (hopLength > 2 ** 31 - 1) {
487
- throw new RangeError("nnlsChroma: hopLength must fit in a signed 32-bit integer");
678
+ }
679
+
680
+ // src/feature_inverse.ts
681
+ function requireModule3() {
682
+ return getSonareModule();
683
+ }
684
+ function validateMatrix(fnName, data, rows, frames, dataName, rowName, options = {}) {
685
+ validatePositiveIntegers(fnName, { [rowName]: rows, nFrames: frames });
686
+ assertSamples(fnName, data, options.validate !== false, dataName);
687
+ const expectedLength = rows * frames;
688
+ if (!Number.isSafeInteger(expectedLength) || data.length !== expectedLength) {
689
+ throw new RangeError(`${fnName}: ${dataName} length must equal ${rowName} * nFrames`);
488
690
  }
489
- return requireModule2().nnlsChromaEx(
490
- samples,
491
- sampleRate,
492
- options.enableStftBlend ?? true,
493
- options.stftBlendWeight ?? 0.55,
494
- options.stftBlendNFft ?? 4096,
495
- hopLength
496
- );
497
691
  }
498
- function cqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, options = {}) {
499
- if (!(samples instanceof Float32Array)) {
500
- const request = samples;
501
- return cqt(
502
- request.samples,
692
+ function melToStft(melPower, nMels = 0, nFrames = 0, sampleRate = 22050, nFft = 2048, fmin = 0, fmax = 0, htk = false, options = {}) {
693
+ if (!(melPower instanceof Float32Array)) {
694
+ const request = melPower;
695
+ return melToStft(
696
+ request.melPower,
697
+ request.nMels,
698
+ request.nFrames,
503
699
  request.sampleRate,
504
- request.hopLength,
700
+ request.nFft,
505
701
  request.fmin,
506
- request.nBins,
507
- request.binsPerOctave,
702
+ request.fmax,
703
+ request.htk,
508
704
  request
509
705
  );
510
706
  }
511
- validateMusicSamples("cqt", samples, sampleRate, options);
512
- validatePositiveIntegers("cqt", { hopLength, nBins, binsPerOctave });
513
- validateFrequencyBounds("cqt", fmin);
514
- return requireModule2().cqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);
707
+ assertSampleRate("melToStft", sampleRate);
708
+ validateMatrix("melToStft", melPower, nMels, nFrames, "melPower", "nMels", options);
709
+ validatePositiveIntegers("melToStft", { nFft });
710
+ validateMelFrequencyRange("melToStft", fmin, fmax, sampleRate);
711
+ return requireModule3().melToStft(melPower, nMels, nFrames, sampleRate, nFft, fmin, fmax, htk);
515
712
  }
516
- function pseudoCqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, options = {}) {
517
- if (!(samples instanceof Float32Array)) {
518
- const request = samples;
519
- return pseudoCqt(
520
- request.samples,
713
+ function melToAudio(melPower, nMels = 0, nFrames = 0, sampleRate = 22050, nFft = 2048, hopLength = 512, fmin = 0, fmax = 0, nIter = 32, htk = false, options = {}) {
714
+ if (!(melPower instanceof Float32Array)) {
715
+ const request = melPower;
716
+ return melToAudio(
717
+ request.melPower,
718
+ request.nMels,
719
+ request.nFrames,
521
720
  request.sampleRate,
721
+ request.nFft,
522
722
  request.hopLength,
523
723
  request.fmin,
524
- request.nBins,
525
- request.binsPerOctave,
724
+ request.fmax,
725
+ request.nIter,
726
+ request.htk,
526
727
  request
527
728
  );
528
729
  }
529
- validateMusicSamples("pseudoCqt", samples, sampleRate, options);
530
- validatePositiveIntegers("pseudoCqt", { hopLength, nBins, binsPerOctave });
531
- validateFrequencyBounds("pseudoCqt", fmin);
532
- return requireModule2().pseudoCqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);
730
+ assertSampleRate("melToAudio", sampleRate);
731
+ validateMatrix("melToAudio", melPower, nMels, nFrames, "melPower", "nMels", options);
732
+ const fft = resolveFftOptions("melToAudio", nFft, hopLength);
733
+ validatePositiveIntegers("melToAudio", { nIter });
734
+ validateMelFrequencyRange("melToAudio", fmin, fmax, sampleRate);
735
+ return requireModule3().melToAudio(
736
+ melPower,
737
+ nMels,
738
+ nFrames,
739
+ sampleRate,
740
+ fft.nFft,
741
+ fft.hopLength,
742
+ fmin,
743
+ fmax,
744
+ nIter,
745
+ htk
746
+ );
533
747
  }
534
- function hybridCqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, options = {}) {
535
- if (!(samples instanceof Float32Array)) {
536
- const request = samples;
537
- return hybridCqt(
538
- request.samples,
748
+ function griffinLim(magnitude, nBins = 0, nFrames = 0, sampleRate = 22050, nFft = 2048, hopLength = 512, nIter = 32, momentum = 0.99, options = {}) {
749
+ if (!(magnitude instanceof Float32Array)) {
750
+ const request = magnitude;
751
+ return griffinLim(
752
+ request.magnitude,
753
+ request.nBins,
754
+ request.nFrames,
539
755
  request.sampleRate,
756
+ request.nFft,
540
757
  request.hopLength,
541
- request.fmin,
542
- request.nBins,
543
- request.binsPerOctave,
544
- request
758
+ request.nIter,
759
+ request.momentum,
760
+ request
761
+ );
762
+ }
763
+ assertSampleRate("griffinLim", sampleRate);
764
+ validateMatrix("griffinLim", magnitude, nBins, nFrames, "magnitude", "nBins", options);
765
+ const fft = resolveFftOptions("griffinLim", nFft, hopLength);
766
+ validatePositiveIntegers("griffinLim", { nIter });
767
+ return requireModule3().griffinLim(
768
+ magnitude,
769
+ nBins,
770
+ nFrames,
771
+ sampleRate,
772
+ fft.nFft,
773
+ fft.hopLength,
774
+ nIter,
775
+ momentum
776
+ );
777
+ }
778
+ function mfccToMel(mfccCoefficients, nMfcc = 0, nFrames = 0, nMels = 128, lifter = 0, options = {}) {
779
+ if (!(mfccCoefficients instanceof Float32Array)) {
780
+ const request = mfccCoefficients;
781
+ return mfccToMel(
782
+ request.mfccCoefficients,
783
+ request.nMfcc,
784
+ request.nFrames,
785
+ request.nMels,
786
+ request.lifter,
787
+ request
788
+ );
789
+ }
790
+ validateMatrix(
791
+ "mfccToMel",
792
+ mfccCoefficients,
793
+ nMfcc,
794
+ nFrames,
795
+ "mfccCoefficients",
796
+ "nMfcc",
797
+ options
798
+ );
799
+ validatePositiveIntegers("mfccToMel", { nMels });
800
+ return requireModule3().mfccToMel(mfccCoefficients, nMfcc, nFrames, nMels, lifter);
801
+ }
802
+ function mfccToAudio(mfccCoefficients, nMfcc = 0, nFrames = 0, nMels = 128, sampleRate = 22050, nFft = 2048, hopLength = 512, fmin = 0, fmax = 0, nIter = 32, htk = false, lifter = 0, options = {}) {
803
+ if (!(mfccCoefficients instanceof Float32Array)) {
804
+ const request = mfccCoefficients;
805
+ return mfccToAudio(
806
+ request.mfccCoefficients,
807
+ request.nMfcc,
808
+ request.nFrames,
809
+ request.nMels,
810
+ request.sampleRate,
811
+ request.nFft,
812
+ request.hopLength,
813
+ request.fmin,
814
+ request.fmax,
815
+ request.nIter,
816
+ request.htk,
817
+ request.lifter,
818
+ request
819
+ );
820
+ }
821
+ assertSampleRate("mfccToAudio", sampleRate);
822
+ validateMatrix(
823
+ "mfccToAudio",
824
+ mfccCoefficients,
825
+ nMfcc,
826
+ nFrames,
827
+ "mfccCoefficients",
828
+ "nMfcc",
829
+ options
830
+ );
831
+ const fft = resolveFftOptions("mfccToAudio", nFft, hopLength);
832
+ validatePositiveIntegers("mfccToAudio", { nMels, nIter });
833
+ validateMelFrequencyRange("mfccToAudio", fmin, fmax, sampleRate);
834
+ return requireModule3().mfccToAudio(
835
+ mfccCoefficients,
836
+ nMfcc,
837
+ nFrames,
838
+ nMels,
839
+ sampleRate,
840
+ fft.nFft,
841
+ fft.hopLength,
842
+ fmin,
843
+ fmax,
844
+ nIter,
845
+ htk,
846
+ lifter
847
+ );
848
+ }
849
+
850
+ // src/feature_loudness.ts
851
+ function requireModule4() {
852
+ return getSonareModule();
853
+ }
854
+ function lufsInterleaved(samples, channels = 0, sampleRate = 22050, options = {}) {
855
+ if (!(samples instanceof Float32Array)) {
856
+ const r = samples;
857
+ return lufsInterleaved(r.samples, r.channels, r.sampleRate, r);
858
+ }
859
+ assertSampleRate("lufsInterleaved", sampleRate);
860
+ assertInterleavedSamples("lufsInterleaved", samples, channels, options.validate !== false);
861
+ return requireModule4().lufsInterleaved(samples, channels, sampleRate);
862
+ }
863
+ function lufsSeriesInterleaved(samples, channels = 0, sampleRate = 22050, options = {}) {
864
+ if (!(samples instanceof Float32Array)) {
865
+ const r = samples;
866
+ return lufsSeriesInterleaved(r.samples, r.channels, r.sampleRate, r);
867
+ }
868
+ assertSampleRate("lufsSeriesInterleaved", sampleRate);
869
+ assertInterleavedSamples("lufsSeriesInterleaved", samples, channels, options.validate !== false);
870
+ return requireModule4().lufsSeriesInterleaved(samples, channels, sampleRate);
871
+ }
872
+ function ebur128LoudnessRange(samples, sampleRate = 22050) {
873
+ if (!(samples instanceof Float32Array)) {
874
+ return ebur128LoudnessRange(samples.samples, samples.sampleRate);
875
+ }
876
+ return requireModule4().ebur128LoudnessRange(samples, sampleRate);
877
+ }
878
+
879
+ // src/feature_music.ts
880
+ function requireModule5() {
881
+ return getSonareModule();
882
+ }
883
+ function validateMusicSamples(fnName, samples, sampleRate, options = {}) {
884
+ assertSampleRate(fnName, sampleRate);
885
+ assertSamples(fnName, samples, options.validate !== false);
886
+ }
887
+ function validateFrequencyBounds(fnName, fmin, fmax) {
888
+ assertFiniteScalar(fnName, fmin, "fmin");
889
+ if (fmin < 0) {
890
+ throw new RangeError(`${fnName}: fmin must be non-negative`);
891
+ }
892
+ if (fmax !== void 0) {
893
+ assertFiniteScalar(fnName, fmax, "fmax");
894
+ if (fmax <= fmin) {
895
+ throw new RangeError(`${fnName}: fmax must be greater than fmin`);
896
+ }
897
+ }
898
+ }
899
+ function nnlsChroma(samples, sampleRate = 22050, options = {}) {
900
+ if (!(samples instanceof Float32Array)) {
901
+ return nnlsChroma(samples.samples, samples.sampleRate, samples);
902
+ }
903
+ validateMusicSamples("nnlsChroma", samples, sampleRate, options);
904
+ const hopLength = options.hopLength === void 0 ? 512 : options.hopLength;
905
+ assertPositiveInteger("nnlsChroma", hopLength, "hopLength");
906
+ if (hopLength > 2 ** 31 - 1) {
907
+ throw new RangeError("nnlsChroma: hopLength must fit in a signed 32-bit integer");
908
+ }
909
+ return requireModule5().nnlsChromaEx(
910
+ samples,
911
+ sampleRate,
912
+ options.enableStftBlend ?? true,
913
+ options.stftBlendWeight ?? 0.55,
914
+ options.stftBlendNFft ?? 4096,
915
+ hopLength
916
+ );
917
+ }
918
+ function cqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, options = {}) {
919
+ if (!(samples instanceof Float32Array)) {
920
+ const request = samples;
921
+ return cqt(
922
+ request.samples,
923
+ request.sampleRate,
924
+ request.hopLength,
925
+ request.fmin,
926
+ request.nBins,
927
+ request.binsPerOctave,
928
+ request
929
+ );
930
+ }
931
+ validateMusicSamples("cqt", samples, sampleRate, options);
932
+ validatePositiveIntegers("cqt", { hopLength, nBins, binsPerOctave });
933
+ validateFrequencyBounds("cqt", fmin);
934
+ return requireModule5().cqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);
935
+ }
936
+ function pseudoCqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, options = {}) {
937
+ if (!(samples instanceof Float32Array)) {
938
+ const request = samples;
939
+ return pseudoCqt(
940
+ request.samples,
941
+ request.sampleRate,
942
+ request.hopLength,
943
+ request.fmin,
944
+ request.nBins,
945
+ request.binsPerOctave,
946
+ request
947
+ );
948
+ }
949
+ validateMusicSamples("pseudoCqt", samples, sampleRate, options);
950
+ validatePositiveIntegers("pseudoCqt", { hopLength, nBins, binsPerOctave });
951
+ validateFrequencyBounds("pseudoCqt", fmin);
952
+ return requireModule5().pseudoCqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);
953
+ }
954
+ function hybridCqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, options = {}) {
955
+ if (!(samples instanceof Float32Array)) {
956
+ const request = samples;
957
+ return hybridCqt(
958
+ request.samples,
959
+ request.sampleRate,
960
+ request.hopLength,
961
+ request.fmin,
962
+ request.nBins,
963
+ request.binsPerOctave,
964
+ request
545
965
  );
546
966
  }
547
967
  validateMusicSamples("hybridCqt", samples, sampleRate, options);
548
968
  validatePositiveIntegers("hybridCqt", { hopLength, nBins, binsPerOctave });
549
969
  validateFrequencyBounds("hybridCqt", fmin);
550
- return requireModule2().hybridCqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);
970
+ return requireModule5().hybridCqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);
551
971
  }
552
972
  function vqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257483, nBins = 84, binsPerOctave = 12, gamma = -1, options = {}) {
553
973
  if (!(samples instanceof Float32Array)) {
@@ -566,8 +986,8 @@ function vqt(samples, sampleRate = 22050, hopLength = 512, fmin = 32.70319566257
566
986
  validateMusicSamples("vqt", samples, sampleRate, options);
567
987
  validatePositiveIntegers("vqt", { hopLength, nBins, binsPerOctave });
568
988
  validateFrequencyBounds("vqt", fmin);
569
- assertFiniteScalar("vqt", gamma, "gamma");
570
- return requireModule2().vqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave, gamma);
989
+ assertVqtGamma("vqt", gamma);
990
+ return requireModule5().vqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave, gamma);
571
991
  }
572
992
  function validateCqtInverse(fnName, magnitude, nBins, nFrames, sampleRate, hopLength, fmin, binsPerOctave, nIter, options) {
573
993
  assertSampleRate(fnName, sampleRate);
@@ -611,7 +1031,7 @@ function cqtToAudio(magnitude, nBins = 0, nFrames = 0, sampleRate = 22050, hopLe
611
1031
  nIter,
612
1032
  options
613
1033
  );
614
- return requireModule2().cqtToAudio(
1034
+ return requireModule5().cqtToAudio(
615
1035
  magnitude,
616
1036
  nBins,
617
1037
  nFrames,
@@ -650,8 +1070,8 @@ function vqtToAudio(magnitude, nBins = 0, nFrames = 0, sampleRate = 22050, hopLe
650
1070
  nIter,
651
1071
  options
652
1072
  );
653
- assertFiniteScalar("vqtToAudio", gamma, "gamma");
654
- return requireModule2().vqtToAudio(
1073
+ assertVqtGamma("vqtToAudio", gamma);
1074
+ return requireModule5().vqtToAudio(
655
1075
  magnitude,
656
1076
  nBins,
657
1077
  nFrames,
@@ -677,7 +1097,7 @@ function analyzeSections(samples, sampleRate = 22050, options = {}) {
677
1097
  if ((options.minSectionSec ?? 4) < 0) {
678
1098
  throw new RangeError("analyzeSections: minSectionSec must be non-negative");
679
1099
  }
680
- const sections = requireModule2().analyzeSections(
1100
+ const sections = requireModule5().analyzeSections(
681
1101
  samples,
682
1102
  sampleRate,
683
1103
  options.nFft ?? 2048,
@@ -686,6 +1106,49 @@ function analyzeSections(samples, sampleRate = 22050, options = {}) {
686
1106
  );
687
1107
  return Array.from(sections, (s) => ({ ...s, type: s.type }));
688
1108
  }
1109
+ function detectBoundaries(request) {
1110
+ const { samples, sampleRate = 22050 } = request;
1111
+ validateMusicSamples("detectBoundaries", samples, sampleRate, request);
1112
+ const sizes = {};
1113
+ for (const name of ["nFft", "hopLength", "kernelSize", "nMfcc", "nChroma"]) {
1114
+ const value = request[name];
1115
+ if (value != null) {
1116
+ sizes[name] = value;
1117
+ }
1118
+ }
1119
+ validatePositiveIntegers("detectBoundaries", sizes);
1120
+ for (const name of ["threshold", "absoluteThreshold", "peakDistance"]) {
1121
+ const value = request[name];
1122
+ if (value == null) {
1123
+ continue;
1124
+ }
1125
+ assertFiniteScalar("detectBoundaries", value, name);
1126
+ if (value < 0) {
1127
+ throw new RangeError(`detectBoundaries: ${name} must be non-negative`);
1128
+ }
1129
+ }
1130
+ if (request.useMfcc === false && request.useChroma === false) {
1131
+ throw new SonareError(
1132
+ 4 /* InvalidParameter */,
1133
+ "InvalidParameter",
1134
+ "detectBoundaries: require useMfcc or useChroma"
1135
+ );
1136
+ }
1137
+ const result = requireModule5().detectBoundaries(samples, sampleRate, request);
1138
+ return {
1139
+ boundaries: Array.from(result.boundaries, (b) => ({
1140
+ time: b.time,
1141
+ frame: b.frame,
1142
+ strength: b.strength
1143
+ })),
1144
+ noveltyCurve: result.noveltyCurve,
1145
+ noveltyPeak: result.noveltyPeak,
1146
+ sampleRate: result.sampleRate,
1147
+ hopLength: result.hopLength,
1148
+ nFrames: result.nFrames,
1149
+ frameStride: result.frameStride
1150
+ };
1151
+ }
689
1152
  function analyzeMelody(samples, sampleRate = 22050, options = {}) {
690
1153
  if (!(samples instanceof Float32Array)) {
691
1154
  const r = samples;
@@ -715,7 +1178,7 @@ function analyzeMelody(samples, sampleRate = 22050, options = {}) {
715
1178
  "analyzeMelody: threshold must be positive"
716
1179
  );
717
1180
  }
718
- return requireModule2().analyzeMelody(
1181
+ return requireModule5().analyzeMelody(
719
1182
  samples,
720
1183
  sampleRate,
721
1184
  options.fmin ?? 65,
@@ -740,8 +1203,9 @@ function onsetEnvelope(samples, sampleRate = 22050, nFft = 2048, hopLength = 512
740
1203
  );
741
1204
  }
742
1205
  validateMusicSamples("onsetEnvelope", samples, sampleRate, options);
743
- validatePositiveIntegers("onsetEnvelope", { nFft, hopLength, nMels });
744
- return requireModule2().onsetEnvelope(samples, sampleRate, nFft, hopLength, nMels);
1206
+ const fft = resolveFftOptions("onsetEnvelope", nFft, hopLength);
1207
+ validatePositiveIntegers("onsetEnvelope", { nMels });
1208
+ return requireModule5().onsetEnvelope(samples, sampleRate, fft.nFft, fft.hopLength, nMels);
745
1209
  }
746
1210
  function onsetStrengthMulti(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, nMels = 128, nBands = 3, options = {}) {
747
1211
  if (!(samples instanceof Float32Array)) {
@@ -757,8 +1221,16 @@ function onsetStrengthMulti(samples, sampleRate = 22050, nFft = 2048, hopLength
757
1221
  );
758
1222
  }
759
1223
  validateMusicSamples("onsetStrengthMulti", samples, sampleRate, options);
760
- validatePositiveIntegers("onsetStrengthMulti", { nFft, hopLength, nMels, nBands });
761
- return requireModule2().onsetStrengthMulti(samples, sampleRate, nFft, hopLength, nMels, nBands);
1224
+ const fft = resolveFftOptions("onsetStrengthMulti", nFft, hopLength);
1225
+ validatePositiveIntegers("onsetStrengthMulti", { nMels, nBands });
1226
+ return requireModule5().onsetStrengthMulti(
1227
+ samples,
1228
+ sampleRate,
1229
+ fft.nFft,
1230
+ fft.hopLength,
1231
+ nMels,
1232
+ nBands
1233
+ );
762
1234
  }
763
1235
  function fourierTempogram(onsetEnvelope2, sampleRate = 22050, hopLength = 512, winLength = 384, center = true, norm = true, options = {}) {
764
1236
  if (!(onsetEnvelope2 instanceof Float32Array)) {
@@ -776,7 +1248,7 @@ function fourierTempogram(onsetEnvelope2, sampleRate = 22050, hopLength = 512, w
776
1248
  assertSampleRate("fourierTempogram", sampleRate);
777
1249
  assertSamples("fourierTempogram", onsetEnvelope2, options.validate !== false, "onsetEnvelope");
778
1250
  validatePositiveIntegers("fourierTempogram", { hopLength, winLength });
779
- return requireModule2().fourierTempogram(
1251
+ return requireModule5().fourierTempogram(
780
1252
  onsetEnvelope2,
781
1253
  sampleRate,
782
1254
  hopLength,
@@ -800,7 +1272,7 @@ function tempogramRatio(tempogramData, winLength = 384, sampleRate = 22050, hopL
800
1272
  assertSampleRate("tempogramRatio", sampleRate);
801
1273
  assertSamples("tempogramRatio", tempogramData, options.validate !== false, "tempogramData");
802
1274
  validatePositiveIntegers("tempogramRatio", { winLength, hopLength });
803
- return requireModule2().tempogramRatio(tempogramData, winLength, sampleRate, hopLength, factors);
1275
+ return requireModule5().tempogramRatio(tempogramData, winLength, sampleRate, hopLength, factors);
804
1276
  }
805
1277
  function lufs(samples, sampleRate = 22050, options = {}) {
806
1278
  if (!(samples instanceof Float32Array)) {
@@ -809,7 +1281,7 @@ function lufs(samples, sampleRate = 22050, options = {}) {
809
1281
  }
810
1282
  assertSampleRate("lufs", sampleRate);
811
1283
  assertSamples("lufs", samples, options.validate !== false);
812
- return requireModule2().lufs(samples, sampleRate);
1284
+ return requireModule5().lufs(samples, sampleRate);
813
1285
  }
814
1286
  function momentaryLufs(samples, sampleRate = 22050, options = {}) {
815
1287
  if (!(samples instanceof Float32Array)) {
@@ -818,7 +1290,7 @@ function momentaryLufs(samples, sampleRate = 22050, options = {}) {
818
1290
  }
819
1291
  assertSampleRate("momentaryLufs", sampleRate);
820
1292
  assertSamples("momentaryLufs", samples, options.validate !== false);
821
- return requireModule2().momentaryLufs(samples, sampleRate);
1293
+ return requireModule5().momentaryLufs(samples, sampleRate);
822
1294
  }
823
1295
  function shortTermLufs(samples, sampleRate = 22050, options = {}) {
824
1296
  if (!(samples instanceof Float32Array)) {
@@ -827,11 +1299,11 @@ function shortTermLufs(samples, sampleRate = 22050, options = {}) {
827
1299
  }
828
1300
  assertSampleRate("shortTermLufs", sampleRate);
829
1301
  assertSamples("shortTermLufs", samples, options.validate !== false);
830
- return requireModule2().shortTermLufs(samples, sampleRate);
1302
+ return requireModule5().shortTermLufs(samples, sampleRate);
831
1303
  }
832
1304
 
833
1305
  // src/feature_pitch.ts
834
- function requireModule3() {
1306
+ function requireModule6() {
835
1307
  return getSonareModule();
836
1308
  }
837
1309
  function piptrack(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, fmin = 150, fmax = 4e3, threshold = 0.1) {
@@ -847,7 +1319,7 @@ function piptrack(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, fmi
847
1319
  request.threshold
848
1320
  );
849
1321
  }
850
- return requireModule3().piptrack(samples, sampleRate, nFft, hopLength, fmin, fmax, threshold);
1322
+ return requireModule6().piptrack(samples, sampleRate, nFft, hopLength, fmin, fmax, threshold);
851
1323
  }
852
1324
  function pitchYin(samples, sampleRate = 22050, frameLength = 2048, hopLength = 512, fmin = 65, fmax = 2093, threshold = 0.1, fillNa = false) {
853
1325
  if (!(samples instanceof Float32Array)) {
@@ -863,7 +1335,7 @@ function pitchYin(samples, sampleRate = 22050, frameLength = 2048, hopLength = 5
863
1335
  request.fillNa
864
1336
  );
865
1337
  }
866
- return requireModule3().pitchYin(
1338
+ return requireModule6().pitchYin(
867
1339
  samples,
868
1340
  sampleRate,
869
1341
  frameLength,
@@ -888,7 +1360,7 @@ function pitchPyin(samples, sampleRate = 22050, frameLength = 2048, hopLength =
888
1360
  request.fillNa
889
1361
  );
890
1362
  }
891
- return requireModule3().pitchPyin(
1363
+ return requireModule6().pitchPyin(
892
1364
  samples,
893
1365
  sampleRate,
894
1366
  frameLength,
@@ -900,115 +1372,19 @@ function pitchPyin(samples, sampleRate = 22050, frameLength = 2048, hopLength =
900
1372
  );
901
1373
  }
902
1374
  function noteSegments(request) {
903
- return requireModule3().noteSegments(request.f0Hz, request.voicedProb, request.frameRate, {
1375
+ return requireModule6().noteSegments(request.f0Hz, request.voicedProb, request.frameRate, {
904
1376
  segmentationThresholdCents: request.segmentationThresholdCents,
905
1377
  minNoteMs: request.minNoteMs,
906
- referenceHz: request.referenceHz
1378
+ referenceHz: request.referenceHz,
1379
+ voicedThreshold: request.voicedThreshold
907
1380
  });
908
1381
  }
909
-
910
- // src/feature_resample.ts
911
- function requireModule4() {
912
- return getSonareModule();
913
- }
914
- function resample(samples, srcSr, targetSr) {
915
- if (!(samples instanceof Float32Array)) {
916
- return resample(samples.samples, samples.srcSr, samples.targetSr);
917
- }
918
- return requireModule4().resample(samples, srcSr, targetSr);
919
- }
920
-
921
- // src/feature_spectral.ts
922
- function requireModule5() {
923
- return getSonareModule();
924
- }
925
- function resolveEffectFftOptions(fnName, nFft, hopLength) {
926
- const resolvedNFft = nFft === void 0 ? 2048 : nFft;
927
- const resolvedHopLength = hopLength === void 0 ? 512 : hopLength;
928
- if (typeof resolvedNFft !== "number" || !Number.isInteger(resolvedNFft)) {
929
- throw new TypeError(`${fnName}: nFft must be an integer`);
930
- }
931
- if (resolvedNFft < 2 || resolvedNFft > 2 ** 30) {
932
- throw new RangeError(`${fnName}: nFft must be an even power of two >= 2`);
933
- }
934
- if ((resolvedNFft & resolvedNFft - 1) !== 0) {
935
- throw new RangeError(`${fnName}: nFft must be an even power of two >= 2`);
936
- }
937
- if (typeof resolvedHopLength !== "number" || !Number.isInteger(resolvedHopLength)) {
938
- throw new TypeError(`${fnName}: hopLength must be an integer`);
939
- }
940
- if (resolvedHopLength <= 0 || resolvedHopLength > 2 ** 31 - 1) {
941
- throw new RangeError(`${fnName}: hopLength must be a positive integer`);
942
- }
943
- return { nFft: resolvedNFft, hopLength: resolvedHopLength };
944
- }
945
- function resolveHardMask(fnName, value) {
946
- if (value === void 0) {
947
- return false;
948
- }
949
- if (typeof value !== "boolean") {
950
- throw new TypeError(`${fnName}: hardMask must be a boolean`);
951
- }
952
- return value;
953
- }
954
- function validateSegmentMatrix(fnName, data, rows, cols, dataName) {
955
- assertPositiveInteger(fnName, rows, "rows");
956
- assertPositiveInteger(fnName, cols, "cols");
957
- assertSamples(fnName, data, true, dataName);
958
- const expected = rows * cols;
959
- if (!Number.isSafeInteger(expected) || data.length !== expected) {
960
- throw new RangeError(`${fnName}: ${dataName} length must equal rows * cols`);
961
- }
962
- }
963
- function spectralCentroid(samples, sampleRate = 22050, nFft = 2048, hopLength = 512) {
964
- if (!(samples instanceof Float32Array)) {
965
- return spectralCentroid(samples.samples, samples.sampleRate, samples.nFft, samples.hopLength);
966
- }
967
- return requireModule5().spectralCentroid(samples, sampleRate, nFft, hopLength);
968
- }
969
- function spectralContrast(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, nBands = 6, fmin = 200, quantile = 0.02) {
970
- if (!(samples instanceof Float32Array)) {
971
- const r = samples;
972
- return spectralContrast(
973
- r.samples,
974
- r.sampleRate,
975
- r.nFft,
976
- r.hopLength,
977
- r.nBands,
978
- r.fmin,
979
- r.quantile
980
- );
981
- }
982
- return requireModule5().spectralContrast(
983
- samples,
984
- sampleRate,
985
- nFft,
986
- hopLength,
987
- nBands,
988
- fmin,
989
- quantile
990
- );
991
- }
992
- function polyFeatures(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, order = 1) {
993
- if (!(samples instanceof Float32Array)) {
994
- const r = samples;
995
- return polyFeatures(r.samples, r.sampleRate, r.nFft, r.hopLength, r.order);
996
- }
997
- return requireModule5().polyFeatures(samples, sampleRate, nFft, hopLength, order);
998
- }
999
- function zeroCrossings(samples, threshold = 1e-10, refMagnitude = false, pad = true, zeroPos = true) {
1000
- if (!(samples instanceof Float32Array)) {
1001
- const r = samples;
1002
- return zeroCrossings(r.samples, r.threshold, r.refMagnitude, r.pad, r.zeroPos);
1003
- }
1004
- return requireModule5().zeroCrossings(samples, threshold, refMagnitude, pad, zeroPos);
1005
- }
1006
1382
  function pitchTuning(frequencies, resolution = 0.01, binsPerOctave = 12) {
1007
1383
  if (!(frequencies instanceof Float32Array)) {
1008
1384
  const r = frequencies;
1009
1385
  return pitchTuning(r.frequencies, r.resolution, r.binsPerOctave);
1010
1386
  }
1011
- return requireModule5().pitchTuning(frequencies, resolution, binsPerOctave);
1387
+ return requireModule6().pitchTuning(frequencies, resolution, binsPerOctave);
1012
1388
  }
1013
1389
  function estimateTuning(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, resolution = 0.01, binsPerOctave = 12) {
1014
1390
  if (!(samples instanceof Float32Array)) {
@@ -1022,7 +1398,7 @@ function estimateTuning(samples, sampleRate = 22050, nFft = 2048, hopLength = 51
1022
1398
  r.binsPerOctave
1023
1399
  );
1024
1400
  }
1025
- return requireModule5().estimateTuning(
1401
+ return requireModule6().estimateTuning(
1026
1402
  samples,
1027
1403
  sampleRate,
1028
1404
  nFft,
@@ -1031,322 +1407,121 @@ function estimateTuning(samples, sampleRate = 22050, nFft = 2048, hopLength = 51
1031
1407
  binsPerOctave
1032
1408
  );
1033
1409
  }
1034
- function decompose(s, nFeatures = 0, nFrames = 0, nComponents = 0, nIter = 50, beta = 2) {
1035
- if (!(s instanceof Float32Array)) {
1036
- const request = s;
1037
- return decompose(
1038
- request.s,
1039
- request.nFeatures,
1040
- request.nFrames,
1041
- request.nComponents,
1042
- request.nIter,
1043
- request.beta
1044
- );
1045
- }
1046
- return requireModule5().decompose(s, nFeatures, nFrames, nComponents, nIter, beta);
1047
- }
1048
- function decomposeWithInit(s, nFeatures = 0, nFrames = 0, nComponents = 0, nIter = 50, beta = 2, init2 = "random") {
1049
- if (!(s instanceof Float32Array)) {
1050
- const request = s;
1051
- return decomposeWithInit(
1052
- request.s,
1053
- request.nFeatures,
1054
- request.nFrames,
1055
- request.nComponents,
1056
- request.nIter,
1057
- request.beta,
1058
- request.init
1059
- );
1060
- }
1061
- return requireModule5().decomposeWithInit(s, nFeatures, nFrames, nComponents, nIter, beta, init2);
1062
- }
1063
- function nnFilter(s, nFeatures = 0, nFrames = 0, aggregate = "mean", k = 7, width = 1) {
1064
- if (!(s instanceof Float32Array)) {
1065
- const r = s;
1066
- return nnFilter(r.s, r.nFeatures, r.nFrames, r.aggregate, r.k, r.width);
1067
- }
1068
- return requireModule5().nnFilter(s, nFeatures, nFrames, aggregate, k, width);
1069
- }
1070
- function remix(samples, intervals, sampleRate = 22050, alignZeros = false) {
1071
- if (!(samples instanceof Float32Array)) {
1072
- const r = samples;
1073
- return remix(r.samples, r.intervals, r.sampleRate, r.alignZeros);
1074
- }
1075
- const intervalsI32 = intervals instanceof Int32Array ? intervals : Int32Array.from(intervals, (v) => Math.trunc(v));
1076
- return requireModule5().remix(samples, intervalsI32, sampleRate, alignZeros);
1410
+
1411
+ // src/feature_spectral.ts
1412
+ function requireModule7() {
1413
+ return getSonareModule();
1077
1414
  }
1078
- function phaseVocoder(samples, sampleRate = 22050, rate = 1, nFft = 2048, hopLength = 512) {
1415
+ function spectralCentroid(samples, sampleRate = 22050, nFft = 2048, hopLength = 512) {
1079
1416
  if (!(samples instanceof Float32Array)) {
1080
- const r = samples;
1081
- return phaseVocoder(r.samples, r.sampleRate ?? 22050, r.rate, r.nFft, r.hopLength);
1417
+ return spectralCentroid(samples.samples, samples.sampleRate, samples.nFft, samples.hopLength);
1082
1418
  }
1083
- return requireModule5().phaseVocoder(samples, sampleRate, rate, nFft, hopLength);
1419
+ return requireModule7().spectralCentroid(samples, sampleRate, nFft, hopLength);
1084
1420
  }
1085
- function hpssWithResidual(samples, sampleRate = 22050, kernelHarmonic = 31, kernelPercussive = 31, nFft, hopLength, hardMask) {
1421
+ function spectralContrast(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, nBands = 6, fmin = 200, quantile = 0.02) {
1086
1422
  if (!(samples instanceof Float32Array)) {
1087
1423
  const r = samples;
1088
- return hpssWithResidual(
1424
+ return spectralContrast(
1089
1425
  r.samples,
1090
1426
  r.sampleRate,
1091
- r.kernelHarmonic,
1092
- r.kernelPercussive,
1093
1427
  r.nFft,
1094
1428
  r.hopLength,
1095
- r.hardMask
1429
+ r.nBands,
1430
+ r.fmin,
1431
+ r.quantile
1096
1432
  );
1097
1433
  }
1098
- const fftOptions = resolveEffectFftOptions("hpssWithResidual", nFft, hopLength);
1099
- const resolvedHardMask = resolveHardMask("hpssWithResidual", hardMask);
1100
- return requireModule5().hpssWithResidualEx(
1434
+ return requireModule7().spectralContrast(
1101
1435
  samples,
1102
1436
  sampleRate,
1103
- kernelHarmonic,
1104
- kernelPercussive,
1105
- fftOptions.nFft,
1106
- fftOptions.hopLength,
1107
- resolvedHardMask
1108
- );
1109
- }
1110
- function lufsInterleaved(samples, channels = 0, sampleRate = 22050, options = {}) {
1111
- if (!(samples instanceof Float32Array)) {
1112
- const r = samples;
1113
- return lufsInterleaved(r.samples, r.channels, r.sampleRate, r);
1114
- }
1115
- assertSampleRate("lufsInterleaved", sampleRate);
1116
- assertInterleavedSamples("lufsInterleaved", samples, channels, options.validate !== false);
1117
- return requireModule5().lufsInterleaved(samples, channels, sampleRate);
1118
- }
1119
- function ebur128LoudnessRange(samples, sampleRate = 22050) {
1120
- if (!(samples instanceof Float32Array)) {
1121
- return ebur128LoudnessRange(samples.samples, samples.sampleRate);
1122
- }
1123
- return requireModule5().ebur128LoudnessRange(samples, sampleRate);
1124
- }
1125
- function spectralBandwidth(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, p = 2) {
1126
- if (!(samples instanceof Float32Array)) {
1127
- return spectralBandwidth(
1128
- samples.samples,
1129
- samples.sampleRate,
1130
- samples.nFft,
1131
- samples.hopLength,
1132
- samples.p
1133
- );
1134
- }
1135
- return requireModule5().spectralBandwidth(samples, sampleRate, nFft, hopLength, p);
1136
- }
1137
- function spectralRolloff(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, rollPercent = 0.85) {
1138
- if (!(samples instanceof Float32Array)) {
1139
- return spectralRolloff(
1140
- samples.samples,
1141
- samples.sampleRate,
1142
- samples.nFft,
1143
- samples.hopLength,
1144
- samples.rollPercent
1145
- );
1146
- }
1147
- return requireModule5().spectralRolloff(samples, sampleRate, nFft, hopLength, rollPercent);
1148
- }
1149
- function spectralFlatness(samples, sampleRate = 22050, nFft = 2048, hopLength = 512) {
1150
- if (!(samples instanceof Float32Array)) {
1151
- return spectralFlatness(samples.samples, samples.sampleRate, samples.nFft, samples.hopLength);
1152
- }
1153
- return requireModule5().spectralFlatness(samples, sampleRate, nFft, hopLength);
1154
- }
1155
- function spectralFlux(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, lag = 1) {
1156
- if (!(samples instanceof Float32Array)) {
1157
- return spectralFlux(
1158
- samples.samples,
1159
- samples.sampleRate,
1160
- samples.nFft,
1161
- samples.hopLength,
1162
- samples.lag
1163
- );
1164
- }
1165
- return requireModule5().spectralFlux(samples, sampleRate, nFft, hopLength, lag);
1166
- }
1167
- function zeroCrossingRate(samples, sampleRate = 22050, frameLength = 2048, hopLength = 512) {
1168
- if (!(samples instanceof Float32Array)) {
1169
- return zeroCrossingRate(
1170
- samples.samples,
1171
- samples.sampleRate,
1172
- samples.frameLength,
1173
- samples.hopLength
1174
- );
1175
- }
1176
- return requireModule5().zeroCrossingRate(samples, sampleRate, frameLength, hopLength);
1177
- }
1178
- function rmsEnergy(samples, sampleRate = 22050, frameLength = 2048, hopLength = 512) {
1179
- if (!(samples instanceof Float32Array)) {
1180
- return rmsEnergy(samples.samples, samples.sampleRate, samples.frameLength, samples.hopLength);
1181
- }
1182
- return requireModule5().rmsEnergy(samples, sampleRate, frameLength, hopLength);
1183
- }
1184
- function segmentCrossSimilarity(request) {
1185
- validateSegmentMatrix("segmentCrossSimilarity", request.x, request.xRows, request.xCols, "x");
1186
- validateSegmentMatrix("segmentCrossSimilarity", request.y, request.yRows, request.yCols, "y");
1187
- if (request.xRows !== request.yRows) {
1188
- throw new RangeError("segmentCrossSimilarity: feature dimensions must match");
1189
- }
1190
- assertNonNegativeInteger("segmentCrossSimilarity", request.k ?? 0, "k");
1191
- return requireModule5().segmentCrossSimilarity(
1192
- request.x,
1193
- request.xRows,
1194
- request.xCols,
1195
- request.y,
1196
- request.yRows,
1197
- request.yCols,
1198
- request.k ?? 0,
1199
- request.metric ?? "cosine",
1200
- request.mode ?? "connectivity"
1201
- );
1202
- }
1203
- function segmentRecurrenceMatrix(request) {
1204
- validateSegmentMatrix(
1205
- "segmentRecurrenceMatrix",
1206
- request.data,
1207
- request.rows,
1208
- request.cols,
1209
- "data"
1210
- );
1211
- assertNonNegativeInteger("segmentRecurrenceMatrix", request.k ?? 0, "k");
1212
- assertNonNegativeInteger("segmentRecurrenceMatrix", request.width ?? 1, "width");
1213
- return requireModule5().segmentRecurrenceMatrix(
1214
- request.data,
1215
- request.rows,
1216
- request.cols,
1217
- request.k ?? 0,
1218
- request.width ?? 1,
1219
- request.sym ?? false,
1220
- request.metric ?? "euclidean",
1221
- request.mode ?? "connectivity"
1222
- );
1223
- }
1224
- function segmentRecurrenceToLag(request) {
1225
- validateSegmentMatrix(
1226
- "segmentRecurrenceToLag",
1227
- request.recurrence,
1228
- request.n,
1229
- request.n,
1230
- "recurrence"
1231
- );
1232
- return requireModule5().segmentRecurrenceToLag(
1233
- request.recurrence,
1234
- request.n,
1235
- request.pad ?? false
1236
- );
1237
- }
1238
- function segmentLagToRecurrence(request) {
1239
- validateSegmentMatrix("segmentLagToRecurrence", request.lag, request.rows, request.lags, "lag");
1240
- return requireModule5().segmentLagToRecurrence(request.lag, request.rows, request.lags);
1241
- }
1242
- function segmentSubsegment(request) {
1243
- validateSegmentMatrix("segmentSubsegment", request.data, request.rows, request.cols, "data");
1244
- assertPositiveInteger("segmentSubsegment", request.nSegments ?? 4, "nSegments");
1245
- return requireModule5().segmentSubsegment(
1246
- request.data,
1247
- request.rows,
1248
- request.cols,
1249
- request.boundaries,
1250
- request.nSegments ?? 4
1251
- );
1252
- }
1253
- function segmentAgglomerative(request) {
1254
- validateSegmentMatrix("segmentAgglomerative", request.data, request.rows, request.cols, "data");
1255
- assertPositiveInteger("segmentAgglomerative", request.k, "k");
1256
- return requireModule5().segmentAgglomerative(
1257
- request.data,
1258
- request.rows,
1259
- request.cols,
1260
- request.k,
1261
- request.linkage ?? "average"
1262
- );
1263
- }
1264
- function segmentPathEnhance(request) {
1265
- validateSegmentMatrix(
1266
- "segmentPathEnhance",
1267
- request.recurrence,
1268
- request.n,
1269
- request.n,
1270
- "recurrence"
1271
- );
1272
- assertPositiveInteger("segmentPathEnhance", request.win, "win");
1273
- assertPositiveInteger("segmentPathEnhance", request.maxRatio ?? 2, "maxRatio");
1274
- assertNonNegativeInteger("segmentPathEnhance", request.minRatio ?? 0, "minRatio");
1275
- assertPositiveInteger("segmentPathEnhance", request.nFilters ?? 7, "nFilters");
1276
- return requireModule5().segmentPathEnhance(
1277
- request.recurrence,
1278
- request.n,
1279
- request.win,
1280
- request.maxRatio ?? 2,
1281
- request.minRatio ?? 0,
1282
- request.nFilters ?? 7
1283
- );
1284
- }
1285
-
1286
- // src/feature_spectrogram.ts
1287
- function requireModule6() {
1288
- return getSonareModule();
1289
- }
1290
- function validateSpectrogramSamples(fnName, samples, sampleRate, options = {}) {
1291
- assertSampleRate(fnName, sampleRate);
1292
- assertSamples(fnName, samples, options.validate !== false);
1437
+ nFft,
1438
+ hopLength,
1439
+ nBands,
1440
+ fmin,
1441
+ quantile
1442
+ );
1293
1443
  }
1294
- function validatePositiveIntegers2(fnName, values) {
1295
- for (const [name, value] of Object.entries(values)) {
1296
- assertPositiveInteger(fnName, value, name);
1444
+ function polyFeatures(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, order = 1) {
1445
+ if (!(samples instanceof Float32Array)) {
1446
+ const r = samples;
1447
+ return polyFeatures(r.samples, r.sampleRate, r.nFft, r.hopLength, r.order);
1297
1448
  }
1449
+ return requireModule7().polyFeatures(samples, sampleRate, nFft, hopLength, order);
1298
1450
  }
1299
- function validateMelFrequencyRange(fnName, fmin, fmax, sampleRate) {
1300
- assertFiniteScalar(fnName, fmin, "fmin");
1301
- assertFiniteScalar(fnName, fmax, "fmax");
1302
- if (fmin < 0) {
1303
- throw new RangeError(`${fnName}: fmin must be non-negative`);
1451
+ function zeroCrossings(samples, threshold = 1e-10, refMagnitude = false, pad = true, zeroPos = true) {
1452
+ if (!(samples instanceof Float32Array)) {
1453
+ const r = samples;
1454
+ return zeroCrossings(r.samples, r.threshold, r.refMagnitude, r.pad, r.zeroPos);
1304
1455
  }
1305
- if (fmax < 0) {
1306
- throw new RangeError(`${fnName}: fmax must be non-negative`);
1456
+ return requireModule7().zeroCrossings(samples, threshold, refMagnitude, pad, zeroPos);
1457
+ }
1458
+ function spectralBandwidth(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, p = 2) {
1459
+ if (!(samples instanceof Float32Array)) {
1460
+ return spectralBandwidth(
1461
+ samples.samples,
1462
+ samples.sampleRate,
1463
+ samples.nFft,
1464
+ samples.hopLength,
1465
+ samples.p
1466
+ );
1307
1467
  }
1308
- const effectiveFmax = fmax === 0 ? sampleRate / 2 : fmax;
1309
- if (effectiveFmax <= fmin) {
1310
- throw new RangeError(`${fnName}: fmax must be greater than fmin`);
1468
+ return requireModule7().spectralBandwidth(samples, sampleRate, nFft, hopLength, p);
1469
+ }
1470
+ function spectralRolloff(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, rollPercent = 0.85) {
1471
+ if (!(samples instanceof Float32Array)) {
1472
+ return spectralRolloff(
1473
+ samples.samples,
1474
+ samples.sampleRate,
1475
+ samples.nFft,
1476
+ samples.hopLength,
1477
+ samples.rollPercent
1478
+ );
1311
1479
  }
1480
+ return requireModule7().spectralRolloff(samples, sampleRate, nFft, hopLength, rollPercent);
1312
1481
  }
1313
- function validateMatrix(fnName, data, rows, frames, dataName, rowName, options = {}) {
1314
- validatePositiveIntegers2(fnName, { [rowName]: rows, nFrames: frames });
1315
- assertSamples(fnName, data, options.validate !== false, dataName);
1316
- const expectedLength = rows * frames;
1317
- if (!Number.isSafeInteger(expectedLength) || data.length !== expectedLength) {
1318
- throw new RangeError(`${fnName}: ${dataName} length must equal ${rowName} * nFrames`);
1482
+ function spectralFlatness(samples, sampleRate = 22050, nFft = 2048, hopLength = 512) {
1483
+ if (!(samples instanceof Float32Array)) {
1484
+ return spectralFlatness(samples.samples, samples.sampleRate, samples.nFft, samples.hopLength);
1319
1485
  }
1486
+ return requireModule7().spectralFlatness(samples, sampleRate, nFft, hopLength);
1320
1487
  }
1321
- function trim(samples, sampleRate = 22050, thresholdDb = -60, frameLengthOrOptions, hopLength, options = {}) {
1488
+ function spectralFlux(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, lag = 1) {
1322
1489
  if (!(samples instanceof Float32Array)) {
1323
- const r = samples;
1324
- return trim(r.samples, r.sampleRate, r.thresholdDb, r.frameLength, r.hopLength, r);
1490
+ return spectralFlux(
1491
+ samples.samples,
1492
+ samples.sampleRate,
1493
+ samples.nFft,
1494
+ samples.hopLength,
1495
+ samples.lag
1496
+ );
1325
1497
  }
1326
- if (frameLengthOrOptions === null) {
1327
- throw new TypeError("trim: frameLength must be an integer or options object");
1498
+ return requireModule7().spectralFlux(samples, sampleRate, nFft, hopLength, lag);
1499
+ }
1500
+ function zeroCrossingRate(samples, sampleRate = 22050, frameLength = 2048, hopLength = 512) {
1501
+ if (!(samples instanceof Float32Array)) {
1502
+ return zeroCrossingRate(
1503
+ samples.samples,
1504
+ samples.sampleRate,
1505
+ samples.frameLength,
1506
+ samples.hopLength
1507
+ );
1328
1508
  }
1329
- if (frameLengthOrOptions !== void 0 && typeof frameLengthOrOptions !== "number" && typeof frameLengthOrOptions !== "object") {
1330
- throw new TypeError("trim: frameLength must be an integer or options object");
1509
+ return requireModule7().zeroCrossingRate(samples, sampleRate, frameLength, hopLength);
1510
+ }
1511
+ function rmsEnergy(samples, sampleRate = 22050, frameLength = 2048, hopLength = 512) {
1512
+ if (!(samples instanceof Float32Array)) {
1513
+ return rmsEnergy(samples.samples, samples.sampleRate, samples.frameLength, samples.hopLength);
1331
1514
  }
1332
- const positionalOptions = typeof frameLengthOrOptions === "object" && frameLengthOrOptions !== null ? frameLengthOrOptions : options;
1333
- const positionalFrameLength = typeof frameLengthOrOptions === "number" ? frameLengthOrOptions : void 0;
1334
- const resolvedFrameLength = positionalFrameLength ?? 2048;
1335
- const resolvedHopLength = hopLength === void 0 ? 512 : hopLength;
1336
- validateSpectrogramSamples("trim", samples, sampleRate, positionalOptions);
1337
- assertFiniteScalar("trim", thresholdDb, "thresholdDb");
1338
- assertPositiveInteger("trim", resolvedFrameLength, "frameLength");
1339
- assertPositiveInteger("trim", resolvedHopLength, "hopLength");
1340
- if (resolvedFrameLength > 2 ** 31 - 1 || resolvedHopLength > 2 ** 31 - 1) {
1341
- throw new RangeError("trim: frameLength and hopLength must fit in a signed 32-bit integer");
1342
- }
1343
- return requireModule6().trimEx(
1344
- samples,
1345
- sampleRate,
1346
- thresholdDb,
1347
- resolvedFrameLength,
1348
- resolvedHopLength
1349
- );
1515
+ return requireModule7().rmsEnergy(samples, sampleRate, frameLength, hopLength);
1516
+ }
1517
+
1518
+ // src/feature_spectrogram.ts
1519
+ function requireModule8() {
1520
+ return getSonareModule();
1521
+ }
1522
+ function validateSpectrogramSamples(fnName, samples, sampleRate, options = {}) {
1523
+ assertSampleRate(fnName, sampleRate);
1524
+ assertSamples(fnName, samples, options.validate !== false);
1350
1525
  }
1351
1526
  function stft(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, options = {}) {
1352
1527
  if (!(samples instanceof Float32Array)) {
@@ -1354,8 +1529,8 @@ function stft(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, options
1354
1529
  return stft(request.samples, request.sampleRate, request.nFft, request.hopLength, request);
1355
1530
  }
1356
1531
  validateSpectrogramSamples("stft", samples, sampleRate, options);
1357
- validatePositiveIntegers2("stft", { nFft, hopLength });
1358
- return requireModule6().stft(samples, sampleRate, nFft, hopLength);
1532
+ const fft = resolveFftOptions("stft", nFft, hopLength);
1533
+ return requireModule8().stft(samples, sampleRate, fft.nFft, fft.hopLength);
1359
1534
  }
1360
1535
  function stftDb(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, options = {}) {
1361
1536
  if (!(samples instanceof Float32Array)) {
@@ -1363,8 +1538,8 @@ function stftDb(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, optio
1363
1538
  return stftDb(request.samples, request.sampleRate, request.nFft, request.hopLength, request);
1364
1539
  }
1365
1540
  validateSpectrogramSamples("stftDb", samples, sampleRate, options);
1366
- validatePositiveIntegers2("stftDb", { nFft, hopLength });
1367
- return requireModule6().stftDb(samples, sampleRate, nFft, hopLength);
1541
+ const fft = resolveFftOptions("stftDb", nFft, hopLength);
1542
+ return requireModule8().stftDb(samples, sampleRate, fft.nFft, fft.hopLength);
1368
1543
  }
1369
1544
  function chromaCens(samples, sampleRate = 22050, hopLength = 512, nChroma = 12, binsPerOctave = 36, options = {}) {
1370
1545
  if (!(samples instanceof Float32Array)) {
@@ -1379,11 +1554,11 @@ function chromaCens(samples, sampleRate = 22050, hopLength = 512, nChroma = 12,
1379
1554
  );
1380
1555
  }
1381
1556
  validateSpectrogramSamples("chromaCens", samples, sampleRate, options);
1382
- validatePositiveIntegers2("chromaCens", { hopLength, nChroma, binsPerOctave });
1557
+ validatePositiveIntegers("chromaCens", { hopLength, nChroma, binsPerOctave });
1383
1558
  if (binsPerOctave % nChroma !== 0) {
1384
1559
  throw new RangeError("chromaCens: binsPerOctave must be a multiple of nChroma");
1385
1560
  }
1386
- return requireModule6().chromaCens(samples, sampleRate, hopLength, nChroma, binsPerOctave);
1561
+ return requireModule8().chromaCens(samples, sampleRate, hopLength, nChroma, binsPerOctave);
1387
1562
  }
1388
1563
  function chromaCqt(samples, sampleRate = 22050, hopLength = 512, nChroma = 12, binsPerOctave = 36, options = {}) {
1389
1564
  if (!(samples instanceof Float32Array)) {
@@ -1398,11 +1573,11 @@ function chromaCqt(samples, sampleRate = 22050, hopLength = 512, nChroma = 12, b
1398
1573
  );
1399
1574
  }
1400
1575
  validateSpectrogramSamples("chromaCqt", samples, sampleRate, options);
1401
- validatePositiveIntegers2("chromaCqt", { hopLength, nChroma, binsPerOctave });
1576
+ validatePositiveIntegers("chromaCqt", { hopLength, nChroma, binsPerOctave });
1402
1577
  if (binsPerOctave % nChroma !== 0) {
1403
1578
  throw new RangeError("chromaCqt: binsPerOctave must be a multiple of nChroma");
1404
1579
  }
1405
- return requireModule6().chromaCqt(samples, sampleRate, hopLength, nChroma, binsPerOctave);
1580
+ return requireModule8().chromaCqt(samples, sampleRate, hopLength, nChroma, binsPerOctave);
1406
1581
  }
1407
1582
  function bassChroma(samples, sampleRate = 22050, hopLength = 512, nChroma = 12, options = {}) {
1408
1583
  if (!(samples instanceof Float32Array)) {
@@ -1416,8 +1591,8 @@ function bassChroma(samples, sampleRate = 22050, hopLength = 512, nChroma = 12,
1416
1591
  );
1417
1592
  }
1418
1593
  validateSpectrogramSamples("bassChroma", samples, sampleRate, options);
1419
- validatePositiveIntegers2("bassChroma", { hopLength, nChroma });
1420
- return requireModule6().bassChroma(samples, sampleRate, hopLength, nChroma);
1594
+ validatePositiveIntegers("bassChroma", { hopLength, nChroma });
1595
+ return requireModule8().bassChroma(samples, sampleRate, hopLength, nChroma);
1421
1596
  }
1422
1597
  function melSpectrogram(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, nMels = 128, fmin = 0, fmax = 0, htk = false, options = {}) {
1423
1598
  if (!(samples instanceof Float32Array)) {
@@ -1435,13 +1610,14 @@ function melSpectrogram(samples, sampleRate = 22050, nFft = 2048, hopLength = 51
1435
1610
  );
1436
1611
  }
1437
1612
  validateSpectrogramSamples("melSpectrogram", samples, sampleRate, options);
1438
- validatePositiveIntegers2("melSpectrogram", { nFft, hopLength, nMels });
1613
+ const fft = resolveFftOptions("melSpectrogram", nFft, hopLength);
1614
+ validatePositiveIntegers("melSpectrogram", { nMels });
1439
1615
  validateMelFrequencyRange("melSpectrogram", fmin, fmax, sampleRate);
1440
- return requireModule6().melSpectrogram(
1616
+ return requireModule8().melSpectrogram(
1441
1617
  samples,
1442
1618
  sampleRate,
1443
- nFft,
1444
- hopLength,
1619
+ fft.nFft,
1620
+ fft.hopLength,
1445
1621
  nMels,
1446
1622
  fmin,
1447
1623
  fmax,
@@ -1466,13 +1642,14 @@ function mfcc(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, nMels =
1466
1642
  );
1467
1643
  }
1468
1644
  validateSpectrogramSamples("mfcc", samples, sampleRate, options);
1469
- validatePositiveIntegers2("mfcc", { nFft, hopLength, nMels, nMfcc });
1645
+ const fft = resolveFftOptions("mfcc", nFft, hopLength);
1646
+ validatePositiveIntegers("mfcc", { nMels, nMfcc });
1470
1647
  validateMelFrequencyRange("mfcc", fmin, fmax, sampleRate);
1471
- return requireModule6().mfcc(
1648
+ return requireModule8().mfcc(
1472
1649
  samples,
1473
1650
  sampleRate,
1474
- nFft,
1475
- hopLength,
1651
+ fft.nFft,
1652
+ fft.hopLength,
1476
1653
  nMels,
1477
1654
  nMfcc,
1478
1655
  fmin,
@@ -1492,7 +1669,7 @@ function melDelta(features, nFeatures, nFrames, width = 9) {
1492
1669
  if (request.features.length !== request.nFeatures * request.nFrames) {
1493
1670
  throw new RangeError("melDelta: feature matrix length must equal nFeatures * nFrames");
1494
1671
  }
1495
- return requireModule6().melDelta(
1672
+ return requireModule8().melDelta(
1496
1673
  request.features,
1497
1674
  request.nFeatures,
1498
1675
  request.nFrames,
@@ -1519,7 +1696,7 @@ function reassignedSpectrogram(samples, sampleRate = 22050, nFft = 2048, hopLeng
1519
1696
  if (refPower < 0) {
1520
1697
  throw new RangeError("reassignedSpectrogram: refPower must be non-negative");
1521
1698
  }
1522
- return requireModule6().reassignedSpectrogram(
1699
+ return requireModule8().reassignedSpectrogram(
1523
1700
  samples,
1524
1701
  sampleRate,
1525
1702
  nFft,
@@ -1528,171 +1705,18 @@ function reassignedSpectrogram(samples, sampleRate = 22050, nFft = 2048, hopLeng
1528
1705
  fillNan
1529
1706
  );
1530
1707
  }
1531
- function melToStft(melPower, nMels = 0, nFrames = 0, sampleRate = 22050, nFft = 2048, fmin = 0, fmax = 0, htk = false, options = {}) {
1532
- if (!(melPower instanceof Float32Array)) {
1533
- const request = melPower;
1534
- return melToStft(
1535
- request.melPower,
1536
- request.nMels,
1537
- request.nFrames,
1538
- request.sampleRate,
1539
- request.nFft,
1540
- request.fmin,
1541
- request.fmax,
1542
- request.htk,
1543
- request
1544
- );
1545
- }
1546
- assertSampleRate("melToStft", sampleRate);
1547
- validateMatrix("melToStft", melPower, nMels, nFrames, "melPower", "nMels", options);
1548
- validatePositiveIntegers2("melToStft", { nFft });
1549
- validateMelFrequencyRange("melToStft", fmin, fmax, sampleRate);
1550
- return requireModule6().melToStft(melPower, nMels, nFrames, sampleRate, nFft, fmin, fmax, htk);
1551
- }
1552
- function melToAudio(melPower, nMels = 0, nFrames = 0, sampleRate = 22050, nFft = 2048, hopLength = 512, fmin = 0, fmax = 0, nIter = 32, htk = false, options = {}) {
1553
- if (!(melPower instanceof Float32Array)) {
1554
- const request = melPower;
1555
- return melToAudio(
1556
- request.melPower,
1557
- request.nMels,
1558
- request.nFrames,
1559
- request.sampleRate,
1560
- request.nFft,
1561
- request.hopLength,
1562
- request.fmin,
1563
- request.fmax,
1564
- request.nIter,
1565
- request.htk,
1566
- request
1567
- );
1568
- }
1569
- assertSampleRate("melToAudio", sampleRate);
1570
- validateMatrix("melToAudio", melPower, nMels, nFrames, "melPower", "nMels", options);
1571
- validatePositiveIntegers2("melToAudio", { nFft, hopLength, nIter });
1572
- validateMelFrequencyRange("melToAudio", fmin, fmax, sampleRate);
1573
- return requireModule6().melToAudio(
1574
- melPower,
1575
- nMels,
1576
- nFrames,
1577
- sampleRate,
1578
- nFft,
1579
- hopLength,
1580
- fmin,
1581
- fmax,
1582
- nIter,
1583
- htk
1584
- );
1585
- }
1586
- function griffinLim(magnitude, nBins = 0, nFrames = 0, sampleRate = 22050, nFft = 2048, hopLength = 512, nIter = 32, momentum = 0.99, options = {}) {
1587
- if (!(magnitude instanceof Float32Array)) {
1588
- const request = magnitude;
1589
- return griffinLim(
1590
- request.magnitude,
1591
- request.nBins,
1592
- request.nFrames,
1593
- request.sampleRate,
1594
- request.nFft,
1595
- request.hopLength,
1596
- request.nIter,
1597
- request.momentum,
1598
- request
1599
- );
1600
- }
1601
- assertSampleRate("griffinLim", sampleRate);
1602
- validateMatrix("griffinLim", magnitude, nBins, nFrames, "magnitude", "nBins", options);
1603
- validatePositiveIntegers2("griffinLim", { nFft, hopLength, nIter });
1604
- return requireModule6().griffinLim(
1605
- magnitude,
1606
- nBins,
1607
- nFrames,
1608
- sampleRate,
1609
- nFft,
1610
- hopLength,
1611
- nIter,
1612
- momentum
1613
- );
1614
- }
1615
- function mfccToMel(mfccCoefficients, nMfcc = 0, nFrames = 0, nMels = 128, lifter = 0, options = {}) {
1616
- if (!(mfccCoefficients instanceof Float32Array)) {
1617
- const request = mfccCoefficients;
1618
- return mfccToMel(
1619
- request.mfccCoefficients,
1620
- request.nMfcc,
1621
- request.nFrames,
1622
- request.nMels,
1623
- request.lifter,
1624
- request
1625
- );
1626
- }
1627
- validateMatrix(
1628
- "mfccToMel",
1629
- mfccCoefficients,
1630
- nMfcc,
1631
- nFrames,
1632
- "mfccCoefficients",
1633
- "nMfcc",
1634
- options
1635
- );
1636
- validatePositiveIntegers2("mfccToMel", { nMels });
1637
- return requireModule6().mfccToMel(mfccCoefficients, nMfcc, nFrames, nMels, lifter);
1638
- }
1639
- function mfccToAudio(mfccCoefficients, nMfcc = 0, nFrames = 0, nMels = 128, sampleRate = 22050, nFft = 2048, hopLength = 512, fmin = 0, fmax = 0, nIter = 32, htk = false, lifter = 0, options = {}) {
1640
- if (!(mfccCoefficients instanceof Float32Array)) {
1641
- const request = mfccCoefficients;
1642
- return mfccToAudio(
1643
- request.mfccCoefficients,
1644
- request.nMfcc,
1645
- request.nFrames,
1646
- request.nMels,
1647
- request.sampleRate,
1648
- request.nFft,
1649
- request.hopLength,
1650
- request.fmin,
1651
- request.fmax,
1652
- request.nIter,
1653
- request.htk,
1654
- request.lifter,
1655
- request
1656
- );
1657
- }
1658
- assertSampleRate("mfccToAudio", sampleRate);
1659
- validateMatrix(
1660
- "mfccToAudio",
1661
- mfccCoefficients,
1662
- nMfcc,
1663
- nFrames,
1664
- "mfccCoefficients",
1665
- "nMfcc",
1666
- options
1667
- );
1668
- validatePositiveIntegers2("mfccToAudio", { nMels, nFft, hopLength, nIter });
1669
- validateMelFrequencyRange("mfccToAudio", fmin, fmax, sampleRate);
1670
- return requireModule6().mfccToAudio(
1671
- mfccCoefficients,
1672
- nMfcc,
1673
- nFrames,
1674
- nMels,
1675
- sampleRate,
1676
- nFft,
1677
- hopLength,
1678
- fmin,
1679
- fmax,
1680
- nIter,
1681
- htk,
1682
- lifter
1683
- );
1684
- }
1685
1708
  function chroma(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, options = {}) {
1686
1709
  if (!(samples instanceof Float32Array)) {
1687
1710
  const request = samples;
1688
1711
  return chroma(request.samples, request.sampleRate, request.nFft, request.hopLength, request);
1689
1712
  }
1690
1713
  validateSpectrogramSamples("chroma", samples, sampleRate, options);
1691
- validatePositiveIntegers2("chroma", { nFft, hopLength });
1692
- return requireModule6().chroma(samples, sampleRate, nFft, hopLength);
1714
+ const fft = resolveFftOptions("chroma", nFft, hopLength);
1715
+ return requireModule8().chroma(samples, sampleRate, fft.nFft, fft.hopLength);
1693
1716
  }
1694
1717
 
1695
1718
  // src/metering.ts
1719
+ var DEFAULT_SPECTRUM_N_FFT = 2048;
1696
1720
  function assertOversampleFactor(fnName, factor) {
1697
1721
  const normalized = factor === 0 ? 4 : factor;
1698
1722
  if (!Number.isInteger(normalized) || normalized < 1 || normalized > 16 || (normalized & normalized - 1) !== 0) {
@@ -1703,23 +1727,23 @@ function assertOversampleFactor(fnName, factor) {
1703
1727
  );
1704
1728
  }
1705
1729
  }
1706
- function requireModule7() {
1730
+ function requireModule9() {
1707
1731
  return getSonareModule();
1708
1732
  }
1709
1733
  function meteringPeakDb(samples, sampleRate = 22050, options = {}) {
1710
1734
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1711
1735
  assertSamples("meteringPeakDb", request.samples, request.validate !== false);
1712
- return requireModule7().meteringPeakDb(request.samples, request.sampleRate ?? 22050);
1736
+ return requireModule9().meteringPeakDb(request.samples, request.sampleRate ?? 22050);
1713
1737
  }
1714
1738
  function meteringRmsDb(samples, sampleRate = 22050, options = {}) {
1715
1739
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1716
1740
  assertSamples("meteringRmsDb", request.samples, request.validate !== false);
1717
- return requireModule7().meteringRmsDb(request.samples, request.sampleRate ?? 22050);
1741
+ return requireModule9().meteringRmsDb(request.samples, request.sampleRate ?? 22050);
1718
1742
  }
1719
1743
  function meteringSilenceRatio(samples, sampleRate = 22050, thresholdDb = -45, frameLength = 1024, hopLength = 256, options = {}) {
1720
1744
  const request = samples instanceof Float32Array ? { samples, sampleRate, thresholdDb, frameLength, hopLength, ...options } : samples;
1721
1745
  assertSamples("meteringSilenceRatio", request.samples, request.validate !== false);
1722
- return requireModule7().meteringSilenceRatio(
1746
+ return requireModule9().meteringSilenceRatio(
1723
1747
  request.samples,
1724
1748
  request.sampleRate ?? 22050,
1725
1749
  request.thresholdDb ?? -45,
@@ -1730,12 +1754,12 @@ function meteringSilenceRatio(samples, sampleRate = 22050, thresholdDb = -45, fr
1730
1754
  function meteringCrestFactorDb(samples, sampleRate = 22050, options = {}) {
1731
1755
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1732
1756
  assertSamples("meteringCrestFactorDb", request.samples, request.validate !== false);
1733
- return requireModule7().meteringCrestFactorDb(request.samples, request.sampleRate ?? 22050);
1757
+ return requireModule9().meteringCrestFactorDb(request.samples, request.sampleRate ?? 22050);
1734
1758
  }
1735
1759
  function meteringCrestFactorDbStereo(request) {
1736
1760
  assertSamples("meteringCrestFactorDbStereo", request.left, request.validate !== false);
1737
1761
  assertSamples("meteringCrestFactorDbStereo", request.right, request.validate !== false);
1738
- return requireModule7().meteringCrestFactorDbStereo(
1762
+ return requireModule9().meteringCrestFactorDbStereo(
1739
1763
  request.left,
1740
1764
  request.right,
1741
1765
  request.sampleRate ?? 22050
@@ -1744,23 +1768,21 @@ function meteringCrestFactorDbStereo(request) {
1744
1768
  function meteringDcOffset(samples, sampleRate = 22050, options = {}) {
1745
1769
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1746
1770
  assertSamples("meteringDcOffset", request.samples, request.validate !== false);
1747
- return requireModule7().meteringDcOffset(request.samples, request.sampleRate ?? 22050);
1771
+ return requireModule9().meteringDcOffset(request.samples, request.sampleRate ?? 22050);
1748
1772
  }
1749
1773
  function meteringTruePeakDb(samples, sampleRate = 22050, oversampleFactor = 4, options = {}) {
1750
1774
  const request = samples instanceof Float32Array ? { samples, sampleRate, oversampleFactor, ...options } : samples;
1751
1775
  assertSamples("meteringTruePeakDb", request.samples, request.validate !== false);
1752
1776
  const factor = request.oversampleFactor ?? 4;
1753
1777
  assertOversampleFactor("meteringTruePeakDb", factor);
1754
- return requireModule7().meteringTruePeakDb(request.samples, request.sampleRate ?? 22050, factor);
1778
+ return requireModule9().meteringTruePeakDb(request.samples, request.sampleRate ?? 22050, factor);
1755
1779
  }
1756
1780
  function meteringDetectClipping(samples, sampleRate = 22050, options = {}) {
1757
1781
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1758
1782
  assertSamples("meteringDetectClipping", request.samples, request.validate !== false);
1759
1783
  const minRegionSamples = request.minRegionSamples ?? 1;
1760
- if (!Number.isInteger(minRegionSamples) || minRegionSamples < 0) {
1761
- throw new RangeError("meteringDetectClipping: minRegionSamples must be a non-negative integer");
1762
- }
1763
- return requireModule7().meteringDetectClipping(
1784
+ assertNonNegativeInteger("meteringDetectClipping", minRegionSamples, "minRegionSamples");
1785
+ return requireModule9().meteringDetectClipping(
1764
1786
  request.samples,
1765
1787
  request.sampleRate ?? 22050,
1766
1788
  request.threshold ?? 0.999,
@@ -1770,7 +1792,7 @@ function meteringDetectClipping(samples, sampleRate = 22050, options = {}) {
1770
1792
  function meteringDynamicRange(samples, sampleRate = 22050, options = {}) {
1771
1793
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1772
1794
  assertSamples("meteringDynamicRange", request.samples, request.validate !== false);
1773
- return requireModule7().meteringDynamicRange(
1795
+ return requireModule9().meteringDynamicRange(
1774
1796
  request.samples,
1775
1797
  request.sampleRate ?? 22050,
1776
1798
  request.windowSec ?? 0,
@@ -1784,7 +1806,7 @@ function meteringStereoCorrelation(left, right, sampleRate = 22050, options = {}
1784
1806
  const validate = request.validate !== false;
1785
1807
  assertSamples("meteringStereoCorrelation", request.left, validate, "left");
1786
1808
  assertSamples("meteringStereoCorrelation", request.right, validate, "right");
1787
- return requireModule7().meteringStereoCorrelation(
1809
+ return requireModule9().meteringStereoCorrelation(
1788
1810
  request.left,
1789
1811
  request.right,
1790
1812
  request.sampleRate ?? 22050
@@ -1795,7 +1817,7 @@ function meteringStereoWidth(left, right, sampleRate = 22050, options = {}) {
1795
1817
  const validate = request.validate !== false;
1796
1818
  assertSamples("meteringStereoWidth", request.left, validate, "left");
1797
1819
  assertSamples("meteringStereoWidth", request.right, validate, "right");
1798
- return requireModule7().meteringStereoWidth(
1820
+ return requireModule9().meteringStereoWidth(
1799
1821
  request.left,
1800
1822
  request.right,
1801
1823
  request.sampleRate ?? 22050
@@ -1806,7 +1828,7 @@ function meteringVectorscope(left, right, sampleRate = 22050, options = {}) {
1806
1828
  const validate = request.validate !== false;
1807
1829
  assertSamples("meteringVectorscope", request.left, validate, "left");
1808
1830
  assertSamples("meteringVectorscope", request.right, validate, "right");
1809
- return requireModule7().meteringVectorscopeDecimated(
1831
+ return requireModule9().meteringVectorscopeDecimated(
1810
1832
  request.left,
1811
1833
  request.right,
1812
1834
  request.sampleRate ?? 22050,
@@ -1818,7 +1840,7 @@ function meteringVectorscopeDecimated(left, right, sampleRate = 22050, maxPoints
1818
1840
  const validate = request.validate !== false;
1819
1841
  assertSamples("meteringVectorscopeDecimated", request.left, validate, "left");
1820
1842
  assertSamples("meteringVectorscopeDecimated", request.right, validate, "right");
1821
- return requireModule7().meteringVectorscopeDecimated(
1843
+ return requireModule9().meteringVectorscopeDecimated(
1822
1844
  request.left,
1823
1845
  request.right,
1824
1846
  request.sampleRate ?? 22050,
@@ -1830,7 +1852,7 @@ function meteringPhaseScope(left, right, sampleRate = 22050, options = {}) {
1830
1852
  const validate = request.validate !== false;
1831
1853
  assertSamples("meteringPhaseScope", request.left, validate, "left");
1832
1854
  assertSamples("meteringPhaseScope", request.right, validate, "right");
1833
- return requireModule7().meteringPhaseScopeDecimated(
1855
+ return requireModule9().meteringPhaseScopeDecimated(
1834
1856
  request.left,
1835
1857
  request.right,
1836
1858
  request.sampleRate ?? 22050,
@@ -1842,7 +1864,7 @@ function meteringPhaseScopeDecimated(left, right, sampleRate = 22050, maxPoints
1842
1864
  const validate = request.validate !== false;
1843
1865
  assertSamples("meteringPhaseScopeDecimated", request.left, validate, "left");
1844
1866
  assertSamples("meteringPhaseScopeDecimated", request.right, validate, "right");
1845
- return requireModule7().meteringPhaseScopeDecimated(
1867
+ return requireModule9().meteringPhaseScopeDecimated(
1846
1868
  request.left,
1847
1869
  request.right,
1848
1870
  request.sampleRate ?? 22050,
@@ -1852,12 +1874,19 @@ function meteringPhaseScopeDecimated(left, right, sampleRate = 22050, maxPoints
1852
1874
  function meteringSpectrum(samples, sampleRate = 22050, options = {}) {
1853
1875
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
1854
1876
  assertSamples("meteringSpectrum", request.samples, request.validate !== false);
1855
- return requireModule7().meteringSpectrum(request.samples, request.sampleRate ?? 22050, request);
1877
+ return requireModule9().meteringSpectrum(request.samples, request.sampleRate ?? 22050, request);
1856
1878
  }
1857
1879
  function meteringSpectrumFrame(samples, sampleRate = 22050, frameOffset = 0, options = {}) {
1858
1880
  const request = samples instanceof Float32Array ? { samples, sampleRate, frameOffset, ...options } : samples;
1859
- assertSamples("meteringSpectrumFrame", request.samples, request.validate !== false);
1860
- return requireModule7().meteringSpectrumFrame(
1881
+ const nFft = request.nFft ?? 0;
1882
+ assertSamplesInWindow(
1883
+ "meteringSpectrumFrame",
1884
+ request.samples,
1885
+ request.validate !== false,
1886
+ request.frameOffset ?? 0,
1887
+ nFft > 0 ? nFft : DEFAULT_SPECTRUM_N_FFT
1888
+ );
1889
+ return requireModule9().meteringSpectrumFrame(
1861
1890
  request.samples,
1862
1891
  request.sampleRate ?? 22050,
1863
1892
  request.frameOffset ?? 0,
@@ -1866,29 +1895,125 @@ function meteringSpectrumFrame(samples, sampleRate = 22050, frameOffset = 0, opt
1866
1895
  }
1867
1896
  function waveformPeaks(samples, channels, options = {}) {
1868
1897
  const request = samples instanceof Float32Array ? { samples, channels, ...options } : samples;
1869
- assertSamples("waveformPeaks", request.samples, request.validate !== false);
1870
- if (request.channels <= 0 || request.samples.length % request.channels !== 0) {
1871
- throw new RangeError("waveformPeaks: samples length must be a multiple of channels");
1872
- }
1898
+ assertInterleavedSamples(
1899
+ "waveformPeaks",
1900
+ request.samples,
1901
+ request.channels,
1902
+ request.validate !== false
1903
+ );
1873
1904
  const samplesPerBucket = request.samplesPerBucket ?? 512;
1874
- if (samplesPerBucket <= 0) {
1875
- throw new RangeError("waveformPeaks: samplesPerBucket must be > 0");
1876
- }
1877
- return requireModule7().waveformPeaks(request.samples, request.channels, samplesPerBucket);
1905
+ assertPositiveInteger("waveformPeaks", samplesPerBucket, "samplesPerBucket");
1906
+ return requireModule9().waveformPeaks(request.samples, request.channels, samplesPerBucket);
1878
1907
  }
1879
1908
  function waveformPeakPyramid(samples, channels, options = {}) {
1880
1909
  const request = samples instanceof Float32Array ? { samples, channels, ...options } : samples;
1881
- assertSamples("waveformPeakPyramid", request.samples, request.validate !== false);
1882
- if (request.channels <= 0 || request.samples.length % request.channels !== 0) {
1883
- throw new RangeError("waveformPeakPyramid: samples length must be a multiple of channels");
1884
- }
1910
+ assertInterleavedSamples(
1911
+ "waveformPeakPyramid",
1912
+ request.samples,
1913
+ request.channels,
1914
+ request.validate !== false
1915
+ );
1885
1916
  const levels = request.samplesPerBucketLevels ?? [512, 1024, 2048, 4096];
1886
- if (levels.length === 0 || levels.some((level) => level <= 0)) {
1887
- throw new RangeError("waveformPeakPyramid: samplesPerBucketLevels must be non-empty and > 0");
1917
+ if (levels.length === 0) {
1918
+ throw new RangeError("waveformPeakPyramid: samplesPerBucketLevels must not be empty");
1888
1919
  }
1889
- return requireModule7().waveformPeakPyramid(request.samples, request.channels, levels);
1920
+ levels.forEach((level, index) => {
1921
+ assertPositiveInteger("waveformPeakPyramid", level, `samplesPerBucketLevels[${index}]`);
1922
+ });
1923
+ return requireModule9().waveformPeakPyramid(request.samples, request.channels, levels);
1890
1924
  }
1891
1925
 
1926
+ // src/public_types_mastering.ts
1927
+ var SOLO_PROCESSORS = [
1928
+ "dynamics.brickwallLimiter",
1929
+ "dynamics.compressor",
1930
+ "dynamics.deesser",
1931
+ "dynamics.duckingProcessor",
1932
+ "dynamics.expander",
1933
+ "dynamics.gate",
1934
+ "dynamics.limiter",
1935
+ "dynamics.parallelComp",
1936
+ "dynamics.sidechainRouter",
1937
+ "dynamics.transientShaper",
1938
+ "dynamics.upwardCompressor",
1939
+ "dynamics.upwardExpander",
1940
+ "dynamics.vocalRider",
1941
+ "effects.acoustic.roomMorph",
1942
+ "effects.delay.stereo",
1943
+ "effects.filter.vowel",
1944
+ "effects.modulation.autoWah",
1945
+ "effects.modulation.chorus",
1946
+ "effects.modulation.ensemble",
1947
+ "effects.modulation.flanger",
1948
+ "effects.modulation.phaser",
1949
+ "effects.modulation.pitchShifter",
1950
+ "effects.modulation.ringModulator",
1951
+ "effects.modulation.rotary",
1952
+ "effects.modulation.wah",
1953
+ "effects.reverb.convolution",
1954
+ "effects.reverb.dattorro",
1955
+ "effects.reverb.fdn",
1956
+ "effects.reverb.plate",
1957
+ "effects.reverb.room",
1958
+ "effects.reverb.velvet",
1959
+ "eq.apiStyle",
1960
+ "eq.bandPass",
1961
+ "eq.cutFilter",
1962
+ "eq.dynamic",
1963
+ "eq.equalizer",
1964
+ "eq.graphic",
1965
+ "eq.linearPhase",
1966
+ "eq.midSide",
1967
+ "eq.minimumPhase",
1968
+ "eq.parametric",
1969
+ "eq.pultec",
1970
+ "eq.shelving",
1971
+ "eq.tilt",
1972
+ "final.bitDepth",
1973
+ "final.dither",
1974
+ "final.outputChain",
1975
+ "maximizer.adaptiveRelease",
1976
+ "maximizer.loudnessOptimize",
1977
+ "maximizer.maximizer",
1978
+ "maximizer.softKneeMax",
1979
+ "maximizer.truePeakLimiter",
1980
+ "multiband.compressor",
1981
+ "multiband.dynamicEq",
1982
+ "multiband.expander",
1983
+ "multiband.imager",
1984
+ "multiband.limiter",
1985
+ "multiband.saturation",
1986
+ "repair.declick",
1987
+ "repair.declip",
1988
+ "repair.decrackle",
1989
+ "repair.dehum",
1990
+ "repair.denoiseClassical",
1991
+ "repair.dereverbClassical",
1992
+ "repair.trimSilence",
1993
+ "saturation.ampSim",
1994
+ "saturation.bitcrusher",
1995
+ "saturation.exciter",
1996
+ "saturation.hardClipper",
1997
+ "saturation.multibandExciter",
1998
+ "saturation.softClipper",
1999
+ "saturation.tape",
2000
+ "saturation.transformer",
2001
+ "saturation.tube",
2002
+ "saturation.waveshaper",
2003
+ "spectral.airBand",
2004
+ "spectral.lowEndFocus",
2005
+ "spectral.presenceEnhancer",
2006
+ "spectral.spectralShaper",
2007
+ "stereo.autoPan",
2008
+ "stereo.binaural",
2009
+ "stereo.haasEnhancer",
2010
+ "stereo.imager",
2011
+ "stereo.monoMaker",
2012
+ "stereo.phaseAlign",
2013
+ "stereo.stereoBalance",
2014
+ "utility.gain"
2015
+ ];
2016
+
1892
2017
  // src/public_types_music.ts
1893
2018
  var PitchClass = {
1894
2019
  C: 0,
@@ -1939,7 +2064,15 @@ var ChordQuality = {
1939
2064
  HalfDim7: 13,
1940
2065
  Major9: 14,
1941
2066
  Dominant9: 15,
1942
- Sus2Add4: 16
2067
+ Sus2Add4: 16,
2068
+ Major6: 17,
2069
+ Minor6: 18,
2070
+ MinorMajor7: 19,
2071
+ Dominant7Sus4: 20,
2072
+ Dominant11: 21,
2073
+ Dominant13: 22,
2074
+ Dominant7Flat9: 23,
2075
+ Dominant7Sharp9: 24
1943
2076
  };
1944
2077
  var SectionType = {
1945
2078
  Intro: 0,
@@ -1981,6 +2114,16 @@ function resolveEnumOrdinal(value, values, enumName) {
1981
2114
  }
1982
2115
  throw new RangeError(`Invalid ${enumName}: ${String(value)}`);
1983
2116
  }
2117
+ var AUTOMATION_CURVE_VALUES = {
2118
+ linear: 0,
2119
+ exponential: 1,
2120
+ hold: 2,
2121
+ "s-curve": 3
2122
+ };
2123
+ var PROJECT_AUTOMATION_CURVE_VALUES = {
2124
+ ...AUTOMATION_CURVE_VALUES,
2125
+ scurve: 3
2126
+ };
1984
2127
 
1985
2128
  // src/analysis_helpers.ts
1986
2129
  var PITCH_CLASS_NAMES = [
@@ -2072,6 +2215,7 @@ function convertChordAnalysisResult(wasm) {
2072
2215
  quality: c.quality,
2073
2216
  start: c.start,
2074
2217
  end: c.end,
2218
+ duration: c.end - c.start,
2075
2219
  confidence: c.confidence,
2076
2220
  name: c.name
2077
2221
  }))
@@ -2110,6 +2254,10 @@ function convertAnalysisResult(wasm) {
2110
2254
  timeSignatureCandidates: wasm.timeSignatureCandidates,
2111
2255
  beatTimes,
2112
2256
  beats: wasm.beats,
2257
+ downbeatIndices: wasm.downbeatIndices,
2258
+ downbeatPhase: wasm.downbeatPhase,
2259
+ beatObservations: wasm.beatObservations,
2260
+ beatLocalBpm: wasm.beatLocalBpm,
2113
2261
  chords: wasm.chords.map((c) => ({
2114
2262
  root: c.root,
2115
2263
  bass: c.bass,
@@ -2118,8 +2266,10 @@ function convertAnalysisResult(wasm) {
2118
2266
  quality: c.quality,
2119
2267
  start: c.start,
2120
2268
  end: c.end,
2269
+ duration: c.end - c.start,
2121
2270
  confidence: c.confidence,
2122
- name: c.name
2271
+ name: c.name,
2272
+ romanNumeral: c.romanNumeral
2123
2273
  })),
2124
2274
  sections: wasm.sections.map((s) => ({
2125
2275
  type: s.type,
@@ -2138,7 +2288,7 @@ function convertAnalysisResult(wasm) {
2138
2288
  }
2139
2289
 
2140
2290
  // src/quick_analysis.ts
2141
- function requireModule8() {
2291
+ function requireModule10() {
2142
2292
  return getSonareModule();
2143
2293
  }
2144
2294
  function validateAnalysisInput(fnName, samples, sampleRate, options = {}) {
@@ -2148,12 +2298,12 @@ function validateAnalysisInput(fnName, samples, sampleRate, options = {}) {
2148
2298
  function detectBpm(samples, sampleRate = 22050, options = {}) {
2149
2299
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2150
2300
  validateAnalysisInput("detectBpm", request.samples, request.sampleRate ?? 22050, request);
2151
- return requireModule8().detectBpm(request.samples, request.sampleRate ?? 22050);
2301
+ return requireModule10().detectBpm(request.samples, request.sampleRate ?? 22050);
2152
2302
  }
2153
2303
  function detectKey(samples, sampleRate = 22050, options = {}) {
2154
2304
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2155
2305
  validateAnalysisInput("detectKey", request.samples, request.sampleRate ?? 22050, request);
2156
- const result = requireModule8()._detectKeyWithOptions(
2306
+ const result = requireModule10()._detectKeyWithOptions(
2157
2307
  request.samples,
2158
2308
  request.sampleRate ?? 22050,
2159
2309
  request.nFft ?? 4096,
@@ -2181,7 +2331,7 @@ function detectKeyCandidates(samples, sampleRate = 22050, options = {}) {
2181
2331
  request.sampleRate ?? 22050,
2182
2332
  request
2183
2333
  );
2184
- const candidates = requireModule8()._detectKeyCandidates(
2334
+ const candidates = requireModule10()._detectKeyCandidates(
2185
2335
  request.samples,
2186
2336
  request.sampleRate ?? 22050,
2187
2337
  request.nFft ?? 4096,
@@ -2198,22 +2348,22 @@ function detectKeyCandidates(samples, sampleRate = 22050, options = {}) {
2198
2348
  function detectOnsets(samples, sampleRate = 22050, options = {}) {
2199
2349
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2200
2350
  validateAnalysisInput("detectOnsets", request.samples, request.sampleRate ?? 22050, request);
2201
- return requireModule8().detectOnsets(request.samples, request.sampleRate ?? 22050, request);
2351
+ return requireModule10().detectOnsets(request.samples, request.sampleRate ?? 22050, request);
2202
2352
  }
2203
2353
  function detectBeats(samples, sampleRate = 22050, options = {}) {
2204
2354
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2205
2355
  validateAnalysisInput("detectBeats", request.samples, request.sampleRate ?? 22050, request);
2206
- return requireModule8().detectBeats(request.samples, request.sampleRate ?? 22050);
2356
+ return requireModule10().detectBeats(request.samples, request.sampleRate ?? 22050);
2207
2357
  }
2208
2358
  function detectDownbeats(samples, sampleRate = 22050, options = {}) {
2209
2359
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2210
2360
  validateAnalysisInput("detectDownbeats", request.samples, request.sampleRate ?? 22050, request);
2211
- return requireModule8().detectDownbeats(request.samples, request.sampleRate ?? 22050);
2361
+ return requireModule10().detectDownbeats(request.samples, request.sampleRate ?? 22050);
2212
2362
  }
2213
2363
  function detectChords(samples, sampleRate = 22050, options = {}) {
2214
2364
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2215
2365
  validateAnalysisInput("detectChords", request.samples, request.sampleRate ?? 22050, request);
2216
- const result = requireModule8().detectChords(
2366
+ const result = requireModule10().detectChords(
2217
2367
  request.samples,
2218
2368
  request.sampleRate ?? 22050,
2219
2369
  request.minDuration ?? 0.3,
@@ -2229,7 +2379,8 @@ function detectChords(samples, sampleRate = 22050, options = {}) {
2229
2379
  request.keyRoot ?? PitchClass.C,
2230
2380
  request.keyMode ?? Mode.Major,
2231
2381
  request.detectInversions ?? false,
2232
- chordChromaMethodValue(request.chromaMethod ?? "stft")
2382
+ chordChromaMethodValue(request.chromaMethod ?? "stft"),
2383
+ request.tuning ?? 0
2233
2384
  );
2234
2385
  return convertChordAnalysisResult(result);
2235
2386
  }
@@ -2241,7 +2392,7 @@ function chordFunctionalAnalysis(samples, keyRoot, keyMode, sampleRate = 22050,
2241
2392
  request.sampleRate ?? 22050,
2242
2393
  request
2243
2394
  );
2244
- return requireModule8().chordFunctionalAnalysis(
2395
+ return requireModule10().chordFunctionalAnalysis(
2245
2396
  request.samples,
2246
2397
  request.keyRoot,
2247
2398
  request.keyMode ?? Mode.Major,
@@ -2257,20 +2408,21 @@ function chordFunctionalAnalysis(samples, keyRoot, keyMode, sampleRate = 22050,
2257
2408
  request.hmmBeamWidth ?? 24,
2258
2409
  request.useKeyContext ?? false,
2259
2410
  request.detectInversions ?? false,
2260
- chordChromaMethodValue(request.chromaMethod ?? "stft")
2411
+ chordChromaMethodValue(request.chromaMethod ?? "stft"),
2412
+ request.tuning ?? 0
2261
2413
  );
2262
2414
  }
2263
2415
  function analyze(samples, sampleRate = 22050, options = {}) {
2264
2416
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2265
2417
  validateAnalysisInput("analyze", request.samples, request.sampleRate ?? 22050, request);
2266
- const result = requireModule8().analyze(request.samples, request.sampleRate ?? 22050, request);
2418
+ const result = requireModule10().analyze(request.samples, request.sampleRate ?? 22050, request);
2267
2419
  return convertAnalysisResult(result);
2268
2420
  }
2421
+ function estimateMeter(request) {
2422
+ return requireModule10().estimateMeter(request.beatTimes, request.beatStrengths, request);
2423
+ }
2269
2424
  function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, minDecayDb) {
2270
2425
  const request = samples instanceof Float32Array ? { samples, sampleRate, nOctaveBands, minDecayDb } : samples;
2271
- if (request.minDecayDb === null) {
2272
- throw new TypeError("analyzeImpulseResponse: minDecayDb must be a finite number");
2273
- }
2274
2426
  const resolvedMinDecayDb = request.minDecayDb === void 0 ? 30 : request.minDecayDb;
2275
2427
  assertFiniteScalar("analyzeImpulseResponse", resolvedMinDecayDb, "minDecayDb");
2276
2428
  if (resolvedMinDecayDb <= 0) {
@@ -2282,7 +2434,7 @@ function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, mi
2282
2434
  request.sampleRate ?? 48e3,
2283
2435
  request
2284
2436
  );
2285
- const result = requireModule8().analyzeImpulseResponseEx(
2437
+ const result = requireModule10().analyzeImpulseResponseEx(
2286
2438
  request.samples,
2287
2439
  request.sampleRate ?? 48e3,
2288
2440
  request.nOctaveBands ?? 6,
@@ -2293,7 +2445,7 @@ function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, mi
2293
2445
  function detectAcoustic(samples, sampleRate = 48e3, options = {}) {
2294
2446
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2295
2447
  validateAnalysisInput("detectAcoustic", request.samples, request.sampleRate ?? 48e3, request);
2296
- const result = requireModule8().detectAcoustic(
2448
+ const result = requireModule10().detectAcoustic(
2297
2449
  request.samples,
2298
2450
  request.sampleRate ?? 48e3,
2299
2451
  request.nOctaveBands ?? 6,
@@ -2303,17 +2455,18 @@ function detectAcoustic(samples, sampleRate = 48e3, options = {}) {
2303
2455
  );
2304
2456
  return result;
2305
2457
  }
2306
- function analyzeWithProgress(samples, sampleRate = 22050, onProgress) {
2307
- const request = samples instanceof Float32Array ? { samples, sampleRate, onProgress } : samples;
2458
+ function analyzeWithProgress(samples, sampleRate = 22050, onProgress, options) {
2459
+ const request = samples instanceof Float32Array ? { samples, sampleRate, onProgress, options } : samples;
2308
2460
  validateAnalysisInput(
2309
2461
  "analyzeWithProgress",
2310
2462
  request.samples,
2311
2463
  request.sampleRate ?? 22050,
2312
2464
  request
2313
2465
  );
2314
- const result = requireModule8().analyzeWithProgress(
2466
+ const result = requireModule10().analyzeWithProgress(
2315
2467
  request.samples,
2316
2468
  request.sampleRate ?? 22050,
2469
+ request.options ?? {},
2317
2470
  request.onProgress ?? (() => {
2318
2471
  }),
2319
2472
  request.cancel ?? (() => false)
@@ -2324,7 +2477,7 @@ function analyzeBpm(samples, sampleRate = 22050, options = {}) {
2324
2477
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2325
2478
  validateAnalysisInput("analyzeBpm", request.samples, request.sampleRate ?? 22050, request);
2326
2479
  assertNonNegativeInteger("analyzeBpm", request.maxCandidates ?? 5, "maxCandidates");
2327
- return requireModule8().analyzeBpm(
2480
+ return requireModule10().analyzeBpm(
2328
2481
  request.samples,
2329
2482
  request.sampleRate ?? 22050,
2330
2483
  request.bpmMin ?? 30,
@@ -2338,7 +2491,7 @@ function analyzeBpm(samples, sampleRate = 22050, options = {}) {
2338
2491
  function analyzeRhythm(samples, sampleRate = 22050, options = {}) {
2339
2492
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2340
2493
  validateAnalysisInput("analyzeRhythm", request.samples, request.sampleRate ?? 22050, request);
2341
- return requireModule8().analyzeRhythm(
2494
+ return requireModule10().analyzeRhythm(
2342
2495
  request.samples,
2343
2496
  request.sampleRate ?? 22050,
2344
2497
  request.bpmMin ?? 60,
@@ -2351,7 +2504,7 @@ function analyzeRhythm(samples, sampleRate = 22050, options = {}) {
2351
2504
  function analyzeDynamics(samples, sampleRate = 22050, options = {}) {
2352
2505
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2353
2506
  validateAnalysisInput("analyzeDynamics", request.samples, request.sampleRate ?? 22050, request);
2354
- return requireModule8().analyzeDynamics(
2507
+ return requireModule10().analyzeDynamics(
2355
2508
  request.samples,
2356
2509
  request.sampleRate ?? 22050,
2357
2510
  request.windowSec ?? 0.4,
@@ -2362,7 +2515,7 @@ function analyzeDynamics(samples, sampleRate = 22050, options = {}) {
2362
2515
  function analyzeTimbre(samples, sampleRate = 22050, options = {}) {
2363
2516
  const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
2364
2517
  validateAnalysisInput("analyzeTimbre", request.samples, request.sampleRate ?? 22050, request);
2365
- return requireModule8().analyzeTimbre(
2518
+ return requireModule10().analyzeTimbre(
2366
2519
  request.samples,
2367
2520
  request.sampleRate ?? 22050,
2368
2521
  request.nFft ?? 2048,
@@ -2373,7 +2526,7 @@ function analyzeTimbre(samples, sampleRate = 22050, options = {}) {
2373
2526
  );
2374
2527
  }
2375
2528
  function hasFfmpegSupport() {
2376
- return requireModule8().hasFfmpegSupport();
2529
+ return requireModule10().hasFfmpegSupport();
2377
2530
  }
2378
2531
 
2379
2532
  // src/analysis.ts
@@ -2437,6 +2590,7 @@ export {
2437
2590
  KeyProfile,
2438
2591
  Mode,
2439
2592
  PitchClass,
2593
+ SOLO_PROCESSORS,
2440
2594
  SectionType,
2441
2595
  SonareError,
2442
2596
  abiVersion,
@@ -2463,11 +2617,10 @@ export {
2463
2617
  cyclicTempogram,
2464
2618
  dbToAmplitude,
2465
2619
  dbToPower,
2466
- decompose,
2467
- decomposeWithInit,
2468
2620
  deemphasis,
2469
2621
  detectAcoustic,
2470
2622
  detectBeats,
2623
+ detectBoundaries,
2471
2624
  detectBpm,
2472
2625
  detectChords,
2473
2626
  detectDownbeats,
@@ -2476,6 +2629,7 @@ export {
2476
2629
  detectOnsets,
2477
2630
  ebur128LoudnessRange,
2478
2631
  engineAbiVersion,
2632
+ estimateMeter,
2479
2633
  estimateTuning,
2480
2634
  fixFrames,
2481
2635
  fixLength,
@@ -2485,7 +2639,6 @@ export {
2485
2639
  framesToTime,
2486
2640
  griffinLim,
2487
2641
  hasFfmpegSupport,
2488
- hpssWithResidual,
2489
2642
  hybridCqt,
2490
2643
  hzToMel,
2491
2644
  hzToMidi,
@@ -2495,6 +2648,7 @@ export {
2495
2648
  isSonareError,
2496
2649
  lufs,
2497
2650
  lufsInterleaved,
2651
+ lufsSeriesInterleaved,
2498
2652
  melDelta,
2499
2653
  melSpectrogram,
2500
2654
  melToAudio,
@@ -2522,7 +2676,6 @@ export {
2522
2676
  mfccToMel,
2523
2677
  midiToHz,
2524
2678
  momentaryLufs,
2525
- nnFilter,
2526
2679
  nnlsChroma,
2527
2680
  noteSegments,
2528
2681
  noteToHz,
@@ -2532,7 +2685,6 @@ export {
2532
2685
  padCenter,
2533
2686
  pcen,
2534
2687
  peakPick,
2535
- phaseVocoder,
2536
2688
  piptrack,
2537
2689
  pitchPyin,
2538
2690
  pitchTuning,
@@ -2543,8 +2695,6 @@ export {
2543
2695
  preemphasis,
2544
2696
  pseudoCqt,
2545
2697
  reassignedSpectrogram,
2546
- remix,
2547
- resample,
2548
2698
  rmsEnergy,
2549
2699
  samplesToFrames,
2550
2700
  segmentAgglomerative,
@@ -2562,6 +2712,8 @@ export {
2562
2712
  spectralFlux,
2563
2713
  spectralRolloff,
2564
2714
  splitSilence,
2715
+ splitSilenceCommon,
2716
+ splitSilenceCommonWithReport,
2565
2717
  stft,
2566
2718
  stftDb,
2567
2719
  tempogram,
@@ -2569,7 +2721,6 @@ export {
2569
2721
  timeToFrames,
2570
2722
  tone,
2571
2723
  tonnetz,
2572
- trim,
2573
2724
  trimSilence,
2574
2725
  vectorNormalize,
2575
2726
  version,