@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
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Inverse transforms: reconstructing a linear spectrogram or audio from a mel
3
+ * or MFCC representation, and the phase reconstruction they share.
4
+ */
5
+
6
+ import type { GuardedOptions } from './_feature_validation';
7
+ import { validateMelFrequencyRange, validatePositiveIntegers } from './_feature_validation';
8
+ import { resolveFftOptions } from './_fft_options';
9
+ import type { SpectralFrameRequest } from './feature_spectral';
10
+ import { getSonareModule } from './module_state';
11
+ import type { MelPowerResult, StftPowerResult } from './public_types';
12
+ import { assertFiniteScalar, assertSampleRate, assertSamples } from './validation';
13
+
14
+ function requireModule() {
15
+ return getSonareModule();
16
+ }
17
+
18
+ export interface MfccToMelRequest extends GuardedOptions {
19
+ mfccCoefficients: Float32Array;
20
+ nMfcc: number;
21
+ nFrames: number;
22
+ nMels?: number;
23
+ /** Lifter used by the forward MFCC transform; zero means no liftering. */
24
+ lifter?: number;
25
+ }
26
+
27
+ /** Canonical request form for reconstruction from a Mel power spectrogram. */
28
+ export interface MelToStftRequest extends GuardedOptions {
29
+ melPower: Float32Array;
30
+ nMels: number;
31
+ nFrames: number;
32
+ sampleRate?: number;
33
+ nFft?: number;
34
+ fmin?: number;
35
+ fmax?: number;
36
+ htk?: boolean;
37
+ }
38
+
39
+ /** Canonical request form for Griffin-Lim reconstruction from Mel power. */
40
+ export interface MelToAudioRequest extends MelToStftRequest {
41
+ hopLength?: number;
42
+ nIter?: number;
43
+ }
44
+
45
+ export interface GriffinLimRequest extends GuardedOptions {
46
+ magnitude: Float32Array;
47
+ nBins: number;
48
+ nFrames: number;
49
+ sampleRate?: number;
50
+ nFft?: number;
51
+ hopLength?: number;
52
+ nIter?: number;
53
+ momentum?: number;
54
+ }
55
+
56
+ /** Canonical request form for Griffin-Lim reconstruction from MFCCs. */
57
+ export interface MfccToAudioRequest extends MfccToMelRequest {
58
+ sampleRate?: number;
59
+ nFft?: number;
60
+ hopLength?: number;
61
+ fmin?: number;
62
+ fmax?: number;
63
+ nIter?: number;
64
+ htk?: boolean;
65
+ }
66
+
67
+ function validateMatrix(
68
+ fnName: string,
69
+ data: Float32Array,
70
+ rows: number,
71
+ frames: number,
72
+ dataName: string,
73
+ rowName: string,
74
+ options: GuardedOptions = {},
75
+ ): void {
76
+ validatePositiveIntegers(fnName, { [rowName]: rows, nFrames: frames });
77
+ assertSamples(fnName, data, options.validate !== false, dataName);
78
+ const expectedLength = rows * frames;
79
+ if (!Number.isSafeInteger(expectedLength) || data.length !== expectedLength) {
80
+ throw new RangeError(`${fnName}: ${dataName} length must equal ${rowName} * nFrames`);
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Approximate inverse of a Mel filterbank: Mel power spectrogram -> STFT power
86
+ * spectrogram. Mirrors `feature::mel_to_stft`.
87
+ *
88
+ * @param melPower - Mel power spectrogram [nMels x nFrames] row-major
89
+ * @param nMels - Number of Mel bands
90
+ * @param nFrames - Number of time frames
91
+ * @param sampleRate - Sample rate in Hz
92
+ * @param nFft - FFT size (default: 2048)
93
+ * @param fmin - Lower Mel band edge in Hz (default: 0)
94
+ * @param fmax - Upper Mel band edge in Hz (default: sr/2 when 0)
95
+ * @param htk - Use the HTK Mel formula instead of Slaney (default: false)
96
+ * @returns STFT power spectrogram result
97
+ */
98
+ export function melToStft(request: MelToStftRequest): StftPowerResult;
99
+ export function melToStft(
100
+ melPower: Float32Array,
101
+ nMels: number,
102
+ nFrames: number,
103
+ sampleRate?: number,
104
+ nFft?: number,
105
+ fmin?: number,
106
+ fmax?: number,
107
+ htk?: boolean,
108
+ options?: GuardedOptions,
109
+ ): StftPowerResult;
110
+ export function melToStft(
111
+ melPower: Float32Array | MelToStftRequest,
112
+ nMels = 0,
113
+ nFrames = 0,
114
+ sampleRate = 22050,
115
+ nFft = 2048,
116
+ fmin = 0,
117
+ fmax = 0,
118
+ htk = false,
119
+ options: GuardedOptions = {},
120
+ ): StftPowerResult {
121
+ if (!(melPower instanceof Float32Array)) {
122
+ const request = melPower;
123
+ return melToStft(
124
+ request.melPower,
125
+ request.nMels,
126
+ request.nFrames,
127
+ request.sampleRate,
128
+ request.nFft,
129
+ request.fmin,
130
+ request.fmax,
131
+ request.htk,
132
+ request,
133
+ );
134
+ }
135
+ assertSampleRate('melToStft', sampleRate);
136
+ validateMatrix('melToStft', melPower, nMels, nFrames, 'melPower', 'nMels', options);
137
+ // Not on the shared FFT rule: this inverts a filterbank rather than running a
138
+ // transform, so `nFft` only sizes the output to `nFft / 2 + 1` bins and an odd
139
+ // size is accepted by the core and by the Node surface alike.
140
+ validatePositiveIntegers('melToStft', { nFft });
141
+ validateMelFrequencyRange('melToStft', fmin, fmax, sampleRate);
142
+ return requireModule().melToStft(melPower, nMels, nFrames, sampleRate, nFft, fmin, fmax, htk);
143
+ }
144
+
145
+ /**
146
+ * Reconstruct audio from a Mel power spectrogram via Griffin-Lim. Mirrors
147
+ * `feature::mel_to_audio`.
148
+ *
149
+ * @param melPower - Mel power spectrogram [nMels x nFrames] row-major
150
+ * @param nMels - Number of Mel bands
151
+ * @param nFrames - Number of time frames
152
+ * @param sampleRate - Sample rate in Hz
153
+ * @param nFft - FFT size (default: 2048)
154
+ * @param hopLength - Hop length (default: 512)
155
+ * @param fmin - Minimum Mel frequency in Hz (default: 0)
156
+ * @param fmax - Maximum Mel frequency in Hz (default: 0 = sr/2)
157
+ * @param nIter - Griffin-Lim iterations (default: 32)
158
+ * @param htk - Use the HTK Mel formula instead of Slaney (default: false)
159
+ * @returns Reconstructed audio samples (mono, float32)
160
+ */
161
+ export function melToAudio(request: MelToAudioRequest): Float32Array;
162
+ export function melToAudio(
163
+ melPower: Float32Array,
164
+ nMels: number,
165
+ nFrames: number,
166
+ sampleRate?: number,
167
+ nFft?: number,
168
+ hopLength?: number,
169
+ fmin?: number,
170
+ fmax?: number,
171
+ nIter?: number,
172
+ htk?: boolean,
173
+ options?: GuardedOptions,
174
+ ): Float32Array;
175
+ export function melToAudio(
176
+ melPower: Float32Array | MelToAudioRequest,
177
+ nMels = 0,
178
+ nFrames = 0,
179
+ sampleRate = 22050,
180
+ nFft = 2048,
181
+ hopLength = 512,
182
+ fmin = 0,
183
+ fmax = 0,
184
+ nIter = 32,
185
+ htk = false,
186
+ options: GuardedOptions = {},
187
+ ): Float32Array {
188
+ if (!(melPower instanceof Float32Array)) {
189
+ const request = melPower;
190
+ return melToAudio(
191
+ request.melPower,
192
+ request.nMels,
193
+ request.nFrames,
194
+ request.sampleRate,
195
+ request.nFft,
196
+ request.hopLength,
197
+ request.fmin,
198
+ request.fmax,
199
+ request.nIter,
200
+ request.htk,
201
+ request,
202
+ );
203
+ }
204
+ assertSampleRate('melToAudio', sampleRate);
205
+ validateMatrix('melToAudio', melPower, nMels, nFrames, 'melPower', 'nMels', options);
206
+ const fft = resolveFftOptions('melToAudio', nFft, hopLength);
207
+ validatePositiveIntegers('melToAudio', { nIter });
208
+ validateMelFrequencyRange('melToAudio', fmin, fmax, sampleRate);
209
+ return requireModule().melToAudio(
210
+ melPower,
211
+ nMels,
212
+ nFrames,
213
+ sampleRate,
214
+ fft.nFft,
215
+ fft.hopLength,
216
+ fmin,
217
+ fmax,
218
+ nIter,
219
+ htk,
220
+ );
221
+ }
222
+
223
+ /** Reconstruct audio from an STFT magnitude matrix via Griffin-Lim. */
224
+ export function griffinLim(request: GriffinLimRequest): Float32Array;
225
+ export function griffinLim(
226
+ magnitude: Float32Array,
227
+ nBins: number,
228
+ nFrames: number,
229
+ sampleRate?: number,
230
+ nFft?: number,
231
+ hopLength?: number,
232
+ nIter?: number,
233
+ momentum?: number,
234
+ options?: GuardedOptions,
235
+ ): Float32Array;
236
+ export function griffinLim(
237
+ magnitude: Float32Array | GriffinLimRequest,
238
+ nBins = 0,
239
+ nFrames = 0,
240
+ sampleRate = 22050,
241
+ nFft = 2048,
242
+ hopLength = 512,
243
+ nIter = 32,
244
+ momentum = 0.99,
245
+ options: GuardedOptions = {},
246
+ ): Float32Array {
247
+ if (!(magnitude instanceof Float32Array)) {
248
+ const request = magnitude;
249
+ return griffinLim(
250
+ request.magnitude,
251
+ request.nBins,
252
+ request.nFrames,
253
+ request.sampleRate,
254
+ request.nFft,
255
+ request.hopLength,
256
+ request.nIter,
257
+ request.momentum,
258
+ request,
259
+ );
260
+ }
261
+ assertSampleRate('griffinLim', sampleRate);
262
+ validateMatrix('griffinLim', magnitude, nBins, nFrames, 'magnitude', 'nBins', options);
263
+ const fft = resolveFftOptions('griffinLim', nFft, hopLength);
264
+ validatePositiveIntegers('griffinLim', { nIter });
265
+ return requireModule().griffinLim(
266
+ magnitude,
267
+ nBins,
268
+ nFrames,
269
+ sampleRate,
270
+ fft.nFft,
271
+ fft.hopLength,
272
+ nIter,
273
+ momentum,
274
+ );
275
+ }
276
+
277
+ /**
278
+ * Invert MFCC coefficients back to a Mel power spectrogram. Mirrors
279
+ * `feature::mfcc_to_mel`.
280
+ *
281
+ * @param mfccCoefficients - MFCC matrix [nMfcc x nFrames] row-major
282
+ * @param nMfcc - Number of MFCC coefficients
283
+ * @param nFrames - Number of time frames
284
+ * @param nMels - Number of Mel bins to reconstruct (default: 128)
285
+ * @returns Mel power spectrogram result
286
+ */
287
+ export function mfccToMel(request: MfccToMelRequest): MelPowerResult;
288
+ export function mfccToMel(
289
+ mfccCoefficients: Float32Array,
290
+ nMfcc: number,
291
+ nFrames: number,
292
+ nMels?: number,
293
+ lifter?: number,
294
+ options?: GuardedOptions,
295
+ ): MelPowerResult;
296
+ export function mfccToMel(
297
+ mfccCoefficients: Float32Array | MfccToMelRequest,
298
+ nMfcc = 0,
299
+ nFrames = 0,
300
+ nMels = 128,
301
+ lifter = 0,
302
+ options: GuardedOptions = {},
303
+ ): MelPowerResult {
304
+ if (!(mfccCoefficients instanceof Float32Array)) {
305
+ const request = mfccCoefficients;
306
+ return mfccToMel(
307
+ request.mfccCoefficients,
308
+ request.nMfcc,
309
+ request.nFrames,
310
+ request.nMels,
311
+ request.lifter,
312
+ request,
313
+ );
314
+ }
315
+ validateMatrix(
316
+ 'mfccToMel',
317
+ mfccCoefficients,
318
+ nMfcc,
319
+ nFrames,
320
+ 'mfccCoefficients',
321
+ 'nMfcc',
322
+ options,
323
+ );
324
+ validatePositiveIntegers('mfccToMel', { nMels });
325
+ return requireModule().mfccToMel(mfccCoefficients, nMfcc, nFrames, nMels, lifter);
326
+ }
327
+
328
+ /**
329
+ * Reconstruct audio directly from MFCC coefficients via Griffin-Lim. Mirrors
330
+ * `feature::mfcc_to_audio`.
331
+ *
332
+ * @param mfccCoefficients - MFCC matrix [nMfcc x nFrames] row-major
333
+ * @param nMfcc - Number of MFCC coefficients
334
+ * @param nFrames - Number of time frames
335
+ * @param nMels - Number of Mel bins (default: 128)
336
+ * @param sampleRate - Sample rate in Hz (default: 22050)
337
+ * @param nFft - FFT size (default: 2048)
338
+ * @param hopLength - Hop length (default: 512)
339
+ * @param fmin - Minimum Mel frequency in Hz (default: 0)
340
+ * @param fmax - Maximum Mel frequency in Hz (default: 0 = sr/2)
341
+ * @param nIter - Griffin-Lim iterations (default: 32)
342
+ * @param htk - Use the HTK Mel formula instead of Slaney (default: false)
343
+ * @returns Reconstructed audio samples (mono, float32)
344
+ */
345
+ export function mfccToAudio(request: MfccToAudioRequest): Float32Array;
346
+ export function mfccToAudio(
347
+ mfccCoefficients: Float32Array,
348
+ nMfcc: number,
349
+ nFrames: number,
350
+ nMels?: number,
351
+ sampleRate?: number,
352
+ nFft?: number,
353
+ hopLength?: number,
354
+ fmin?: number,
355
+ fmax?: number,
356
+ nIter?: number,
357
+ htk?: boolean,
358
+ lifter?: number,
359
+ options?: GuardedOptions,
360
+ ): Float32Array;
361
+ export function mfccToAudio(
362
+ mfccCoefficients: Float32Array | MfccToAudioRequest,
363
+ nMfcc = 0,
364
+ nFrames = 0,
365
+ nMels = 128,
366
+ sampleRate = 22050,
367
+ nFft = 2048,
368
+ hopLength = 512,
369
+ fmin = 0,
370
+ fmax = 0,
371
+ nIter = 32,
372
+ htk = false,
373
+ lifter = 0,
374
+ options: GuardedOptions = {},
375
+ ): Float32Array {
376
+ if (!(mfccCoefficients instanceof Float32Array)) {
377
+ const request = mfccCoefficients;
378
+ return mfccToAudio(
379
+ request.mfccCoefficients,
380
+ request.nMfcc,
381
+ request.nFrames,
382
+ request.nMels,
383
+ request.sampleRate,
384
+ request.nFft,
385
+ request.hopLength,
386
+ request.fmin,
387
+ request.fmax,
388
+ request.nIter,
389
+ request.htk,
390
+ request.lifter,
391
+ request,
392
+ );
393
+ }
394
+ assertSampleRate('mfccToAudio', sampleRate);
395
+ validateMatrix(
396
+ 'mfccToAudio',
397
+ mfccCoefficients,
398
+ nMfcc,
399
+ nFrames,
400
+ 'mfccCoefficients',
401
+ 'nMfcc',
402
+ options,
403
+ );
404
+ const fft = resolveFftOptions('mfccToAudio', nFft, hopLength);
405
+ validatePositiveIntegers('mfccToAudio', { nMels, nIter });
406
+ validateMelFrequencyRange('mfccToAudio', fmin, fmax, sampleRate);
407
+ return requireModule().mfccToAudio(
408
+ mfccCoefficients,
409
+ nMfcc,
410
+ nFrames,
411
+ nMels,
412
+ sampleRate,
413
+ fft.nFft,
414
+ fft.hopLength,
415
+ fmin,
416
+ fmax,
417
+ nIter,
418
+ htk,
419
+ lifter,
420
+ );
421
+ }
422
+
423
+ export interface PhaseVocoderRequest extends SpectralFrameRequest {
424
+ rate: number;
425
+ }
426
+
427
+ /**
428
+ * Phase-vocoder time-scale modification (rate > 1 faster, < 1 slower).
429
+ */
430
+ export function phaseVocoder(request: PhaseVocoderRequest): Float32Array;
431
+ export function phaseVocoder(
432
+ samples: Float32Array,
433
+ sampleRate: number,
434
+ rate: number,
435
+ nFft?: number,
436
+ hopLength?: number,
437
+ ): Float32Array;
438
+ export function phaseVocoder(
439
+ samples: Float32Array | PhaseVocoderRequest,
440
+ sampleRate = 22050,
441
+ rate = 1,
442
+ nFft = 2048,
443
+ hopLength = 512,
444
+ ): Float32Array {
445
+ if (!(samples instanceof Float32Array)) {
446
+ const r = samples;
447
+ return phaseVocoder(r.samples, r.sampleRate ?? 22050, r.rate, r.nFft, r.hopLength);
448
+ }
449
+ // Matches the addon. A finite value too wide for a float is not covered here
450
+ // and cannot be — it is still finite to Number.isFinite; the core's own guard
451
+ // refuses the infinity it becomes.
452
+ assertFiniteScalar('phaseVocoder', rate, 'rate');
453
+ return requireModule().phaseVocoder(samples, sampleRate, rate, nFft, hopLength);
454
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Programme loudness over interleaved audio, as the broadcast standards define
3
+ * it.
4
+ */
5
+
6
+ import { getSonareModule } from './module_state';
7
+ import type { WasmLufsResult, WasmLufsSeriesResult } from './sonare.js';
8
+ import type { ValidateOptions } from './validation';
9
+ import { assertInterleavedSamples, assertSampleRate } from './validation';
10
+
11
+ function requireModule() {
12
+ return getSonareModule();
13
+ }
14
+
15
+ export interface LufsInterleavedRequest extends ValidateOptions {
16
+ samples: Float32Array;
17
+ channels: number;
18
+ sampleRate?: number;
19
+ }
20
+
21
+ export interface LufsSeriesInterleavedRequest extends ValidateOptions {
22
+ samples: Float32Array;
23
+ channels: number;
24
+ sampleRate?: number;
25
+ }
26
+
27
+ export interface Ebur128LoudnessRangeRequest extends ValidateOptions {
28
+ samples: Float32Array;
29
+ sampleRate?: number;
30
+ }
31
+
32
+ /**
33
+ * Channel-weighted multichannel integrated loudness + LRA (ITU-R BS.1770 /
34
+ * EBU R128) from an interleaved buffer of `frames * channels` samples. The
35
+ * per-channel frame count is derived from the buffer length and `channels`.
36
+ *
37
+ * Pass the buffer's actual `sampleRate`: the default (22050) is non-standard for
38
+ * audio, and K-weighting is sample-rate dependent, so a wrong rate yields wrong
39
+ * loudness.
40
+ */
41
+ export function lufsInterleaved(request: LufsInterleavedRequest): WasmLufsResult;
42
+ export function lufsInterleaved(
43
+ samples: Float32Array,
44
+ channels: number,
45
+ sampleRate?: number,
46
+ options?: ValidateOptions,
47
+ ): WasmLufsResult;
48
+ export function lufsInterleaved(
49
+ samples: Float32Array | LufsInterleavedRequest,
50
+ channels = 0,
51
+ sampleRate = 22050,
52
+ options: ValidateOptions = {},
53
+ ): WasmLufsResult {
54
+ if (!(samples instanceof Float32Array)) {
55
+ const r = samples;
56
+ return lufsInterleaved(r.samples, r.channels, r.sampleRate, r);
57
+ }
58
+ assertSampleRate('lufsInterleaved', sampleRate);
59
+ assertInterleavedSamples('lufsInterleaved', samples, channels, options.validate !== false);
60
+ return requireModule().lufsInterleaved(samples, channels, sampleRate);
61
+ }
62
+
63
+ /**
64
+ * Per-block momentary (400 ms) and short-term (3 s) LUFS series for an
65
+ * interleaved buffer of `frames * channels` samples, measured with ITU-R
66
+ * BS.1770-4 channel summing. The per-channel frame count is derived from the
67
+ * buffer length and `channels`.
68
+ *
69
+ * This is not recoverable from `momentaryLufs` / `shortTermLufs`: those measure
70
+ * one channel each, and the standard sums the K-weighted per-channel block
71
+ * energies rather than mixing per-channel loudness in dB. Both series come out
72
+ * of one K-weighting pass. For `channels === 1` they match the mono meters
73
+ * element for element.
74
+ *
75
+ * Pass the buffer's actual `sampleRate`: the default (22050) is non-standard for
76
+ * audio, and K-weighting is sample-rate dependent, so a wrong rate yields wrong
77
+ * loudness.
78
+ *
79
+ * @example
80
+ * ```ts
81
+ * const { momentary, shortTerm } = lufsSeriesInterleaved({
82
+ * samples: interleavedStereo,
83
+ * channels: 2,
84
+ * sampleRate: 48000,
85
+ * });
86
+ * ```
87
+ */
88
+ export function lufsSeriesInterleaved(request: LufsSeriesInterleavedRequest): WasmLufsSeriesResult;
89
+ export function lufsSeriesInterleaved(
90
+ samples: Float32Array,
91
+ channels: number,
92
+ sampleRate?: number,
93
+ options?: ValidateOptions,
94
+ ): WasmLufsSeriesResult;
95
+ export function lufsSeriesInterleaved(
96
+ samples: Float32Array | LufsSeriesInterleavedRequest,
97
+ channels = 0,
98
+ sampleRate = 22050,
99
+ options: ValidateOptions = {},
100
+ ): WasmLufsSeriesResult {
101
+ if (!(samples instanceof Float32Array)) {
102
+ const r = samples;
103
+ return lufsSeriesInterleaved(r.samples, r.channels, r.sampleRate, r);
104
+ }
105
+ assertSampleRate('lufsSeriesInterleaved', sampleRate);
106
+ assertInterleavedSamples('lufsSeriesInterleaved', samples, channels, options.validate !== false);
107
+ return requireModule().lufsSeriesInterleaved(samples, channels, sampleRate);
108
+ }
109
+
110
+ /**
111
+ * Standards-compliant EBU R128 loudness range (LRA) in LU. Pass the buffer's
112
+ * actual `sampleRate`: the default (22050) is non-standard and K-weighting is
113
+ * sample-rate dependent.
114
+ */
115
+ export function ebur128LoudnessRange(request: Ebur128LoudnessRangeRequest): number;
116
+ export function ebur128LoudnessRange(samples: Float32Array, sampleRate?: number): number;
117
+ export function ebur128LoudnessRange(
118
+ samples: Float32Array | Ebur128LoudnessRangeRequest,
119
+ sampleRate = 22050,
120
+ ): number {
121
+ if (!(samples instanceof Float32Array)) {
122
+ return ebur128LoudnessRange(samples.samples, samples.sampleRate);
123
+ }
124
+ return requireModule().ebur128LoudnessRange(samples, sampleRate);
125
+ }