@libraz/libsonare 1.7.2 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +178 -0
- package/README.md +26 -203
- package/dist/_chain_config.d.ts +14 -0
- package/dist/_chain_config.d.ts.map +1 -0
- package/dist/_effects_common.d.ts +7 -0
- package/dist/_effects_common.d.ts.map +1 -0
- package/dist/_feature_validation.d.ts +8 -0
- package/dist/_feature_validation.d.ts.map +1 -0
- package/dist/_fft_options.d.ts +24 -0
- package/dist/_fft_options.d.ts.map +1 -0
- package/dist/align_take.d.ts +50 -0
- package/dist/align_take.d.ts.map +1 -0
- package/dist/analysis.d.ts +29 -5840
- package/dist/analysis.d.ts.map +1 -0
- package/dist/analysis.js +874 -722
- package/dist/analysis.js.map +1 -1
- package/dist/analysis_helpers.d.ts +9 -0
- package/dist/analysis_helpers.d.ts.map +1 -0
- package/dist/audio.d.ts +163 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/clip_page_streamer.d.ts +133 -0
- package/dist/clip_page_streamer.d.ts.map +1 -0
- package/dist/codes.d.ts +44 -0
- package/dist/codes.d.ts.map +1 -0
- package/dist/effects_mastering.d.ts +23 -0
- package/dist/effects_mastering.d.ts.map +1 -0
- package/dist/effects_note_ops.d.ts +502 -0
- package/dist/effects_note_ops.d.ts.map +1 -0
- package/dist/effects_percussive.d.ts +185 -0
- package/dist/effects_percussive.d.ts.map +1 -0
- package/dist/effects_separation.d.ts +65 -0
- package/dist/effects_separation.d.ts.map +1 -0
- package/dist/effects_spectral.d.ts +28 -0
- package/dist/effects_spectral.d.ts.map +1 -0
- package/dist/effects_timepitch.d.ts +134 -0
- package/dist/effects_timepitch.d.ts.map +1 -0
- package/dist/effects_voice_change.d.ts +53 -0
- package/dist/effects_voice_change.d.ts.map +1 -0
- package/dist/errors.d.ts +51 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/feature_core.d.ts +341 -0
- package/dist/feature_core.d.ts.map +1 -0
- package/dist/feature_decompose.d.ts +278 -0
- package/dist/feature_decompose.d.ts.map +1 -0
- package/dist/feature_inverse.d.ts +128 -0
- package/dist/feature_inverse.d.ts.map +1 -0
- package/dist/feature_loudness.d.ts +66 -0
- package/dist/feature_loudness.d.ts.map +1 -0
- package/dist/feature_music.d.ts +307 -0
- package/dist/feature_music.d.ts.map +1 -0
- package/dist/feature_pitch.d.ts +108 -0
- package/dist/feature_pitch.d.ts.map +1 -0
- package/dist/feature_resample.d.ts +16 -0
- package/dist/feature_resample.d.ts.map +1 -0
- package/dist/feature_spectral.d.ts +137 -0
- package/dist/feature_spectral.d.ts.map +1 -0
- package/dist/feature_spectrogram.d.ts +198 -0
- package/dist/feature_spectrogram.d.ts.map +1 -0
- package/dist/features.d.ts +10 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/hrtf/default.shrf +0 -0
- package/dist/index.d.ts +74 -7431
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4173 -1621
- package/dist/index.js.map +1 -1
- package/dist/instrument_types.d.ts +517 -0
- package/dist/instrument_types.d.ts.map +1 -0
- package/dist/live_audio.d.ts +35 -0
- package/dist/live_audio.d.ts.map +1 -0
- package/dist/mastering_chain.d.ts +213 -0
- package/dist/mastering_chain.d.ts.map +1 -0
- package/dist/mastering_core.d.ts +483 -0
- package/dist/mastering_core.d.ts.map +1 -0
- package/dist/mastering_dynamics.d.ts +80 -0
- package/dist/mastering_dynamics.d.ts.map +1 -0
- package/dist/metering.d.ts +287 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/mixer.d.ts +464 -0
- package/dist/mixer.d.ts.map +1 -0
- package/dist/mixing_assistant.d.ts +62 -0
- package/dist/mixing_assistant.d.ts.map +1 -0
- package/dist/mixing_oneshot.d.ts +40 -0
- package/dist/mixing_oneshot.d.ts.map +1 -0
- package/dist/module_state.d.ts +15 -0
- package/dist/module_state.d.ts.map +1 -0
- package/dist/opfs_clip_pages.d.ts +28 -0
- package/dist/opfs_clip_pages.d.ts.map +1 -0
- package/dist/playback_renderer.d.ts +128 -0
- package/dist/playback_renderer.d.ts.map +1 -0
- package/dist/polyphony.d.ts +202 -0
- package/dist/polyphony.d.ts.map +1 -0
- package/dist/project.d.ts +8 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project_class.d.ts +562 -0
- package/dist/project_class.d.ts.map +1 -0
- package/dist/project_internal.d.ts +194 -0
- package/dist/project_internal.d.ts.map +1 -0
- package/dist/project_synth.d.ts +74 -0
- package/dist/project_synth.d.ts.map +1 -0
- package/dist/project_types.d.ts +654 -0
- package/dist/project_types.d.ts.map +1 -0
- package/dist/public_types.d.ts +185 -0
- package/dist/public_types.d.ts.map +1 -0
- package/dist/public_types_acoustic.d.ts +215 -0
- package/dist/public_types_acoustic.d.ts.map +1 -0
- package/dist/public_types_mastering.d.ts +528 -0
- package/dist/public_types_mastering.d.ts.map +1 -0
- package/dist/public_types_mixing.d.ts +436 -0
- package/dist/public_types_mixing.d.ts.map +1 -0
- package/dist/public_types_music.d.ts +619 -0
- package/dist/public_types_music.d.ts.map +1 -0
- package/dist/public_types_playback.d.ts +165 -0
- package/dist/public_types_playback.d.ts.map +1 -0
- package/dist/public_types_realtime.d.ts +174 -0
- package/dist/public_types_realtime.d.ts.map +1 -0
- package/dist/public_types_repair.d.ts +424 -0
- package/dist/public_types_repair.d.ts.map +1 -0
- package/dist/public_types_spectral.d.ts +697 -0
- package/dist/public_types_spectral.d.ts.map +1 -0
- package/dist/quick_analysis.d.ts +445 -0
- package/dist/quick_analysis.d.ts.map +1 -0
- package/dist/realtime_engine.d.ts +893 -0
- package/dist/realtime_engine.d.ts.map +1 -0
- package/dist/realtime_voice_changer.d.ts +158 -0
- package/dist/realtime_voice_changer.d.ts.map +1 -0
- package/dist/repair_dereverb.d.ts +187 -0
- package/dist/repair_dereverb.d.ts.map +1 -0
- package/dist/repair_impulsive.d.ts +186 -0
- package/dist/repair_impulsive.d.ts.map +1 -0
- package/dist/repair_noise.d.ts +239 -0
- package/dist/repair_noise.d.ts.map +1 -0
- package/dist/repair_trim.d.ts +123 -0
- package/dist/repair_trim.d.ts.map +1 -0
- package/dist/sample_bank.d.ts +84 -0
- package/dist/sample_bank.d.ts.map +1 -0
- package/dist/scale.d.ts +10 -0
- package/dist/scale.d.ts.map +1 -0
- package/dist/schemas/mixer-scene.schema.json +393 -0
- package/dist/schemas/playback-renderer-config.schema.json +392 -0
- package/dist/sonare-analysis.d.ts +8 -0
- package/dist/sonare-analysis.js +2 -2
- package/dist/sonare-analysis.wasm +0 -0
- package/dist/sonare.d.ts +3945 -0
- package/dist/sonare.js +2 -2
- package/dist/sonare.wasm +0 -0
- package/dist/stream_analyzer.d.ts +163 -0
- package/dist/stream_analyzer.d.ts.map +1 -0
- package/dist/stream_types.d.ts +214 -0
- package/dist/stream_types.d.ts.map +1 -0
- package/dist/streaming_mixing.d.ts +6 -0
- package/dist/streaming_mixing.d.ts.map +1 -0
- package/dist/streaming_processors.d.ts +340 -0
- package/dist/streaming_processors.d.ts.map +1 -0
- package/dist/transcribe.d.ts +77 -0
- package/dist/transcribe.d.ts.map +1 -0
- package/dist/validation.d.ts +140 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/web_midi.d.ts +77 -0
- package/dist/web_midi.d.ts.map +1 -0
- package/dist/worker.d.ts +5 -48
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +94 -41
- package/dist/worker.js.map +1 -1
- package/dist/worker_client.d.ts +96 -0
- package/dist/worker_client.d.ts.map +1 -0
- package/dist/worker_protocol.d.ts +43 -0
- package/dist/worker_protocol.d.ts.map +1 -0
- package/dist/worklet/audio_types.d.ts +21 -0
- package/dist/worklet/audio_types.d.ts.map +1 -0
- package/dist/worklet/engine-automation.d.ts +29 -0
- package/dist/worklet/engine-automation.d.ts.map +1 -0
- package/dist/worklet/engine-capture-facade.d.ts +35 -0
- package/dist/worklet/engine-capture-facade.d.ts.map +1 -0
- package/dist/worklet/engine-clips.d.ts +23 -0
- package/dist/worklet/engine-clips.d.ts.map +1 -0
- package/dist/worklet/engine-markers.d.ts +40 -0
- package/dist/worklet/engine-markers.d.ts.map +1 -0
- package/dist/worklet/engine-mixer-facade.d.ts +164 -0
- package/dist/worklet/engine-mixer-facade.d.ts.map +1 -0
- package/dist/worklet/engine-node.d.ts +83 -0
- package/dist/worklet/engine-node.d.ts.map +1 -0
- package/dist/worklet/engine-offline.d.ts +81 -0
- package/dist/worklet/engine-offline.d.ts.map +1 -0
- package/dist/worklet/engine-options.d.ts +12 -0
- package/dist/worklet/engine-options.d.ts.map +1 -0
- package/dist/worklet/engine-parameter-facade.d.ts +106 -0
- package/dist/worklet/engine-parameter-facade.d.ts.map +1 -0
- package/dist/worklet/engine-processor.d.ts +72 -0
- package/dist/worklet/engine-processor.d.ts.map +1 -0
- package/dist/worklet/engine-register.d.ts +2 -0
- package/dist/worklet/engine-register.d.ts.map +1 -0
- package/dist/worklet/engine-strips.d.ts +75 -0
- package/dist/worklet/engine-strips.d.ts.map +1 -0
- package/dist/worklet/engine-sync.d.ts +39 -0
- package/dist/worklet/engine-sync.d.ts.map +1 -0
- package/dist/worklet/engine-tempo-facade.d.ts +48 -0
- package/dist/worklet/engine-tempo-facade.d.ts.map +1 -0
- package/dist/worklet/engine.d.ts +418 -0
- package/dist/worklet/engine.d.ts.map +1 -0
- package/dist/worklet/guards.d.ts +53 -0
- package/dist/worklet/guards.d.ts.map +1 -0
- package/dist/worklet/messages.d.ts +710 -0
- package/dist/worklet/messages.d.ts.map +1 -0
- package/dist/worklet/mixer-processor.d.ts +46 -0
- package/dist/worklet/mixer-processor.d.ts.map +1 -0
- package/dist/worklet/playback-processor.d.ts +62 -0
- package/dist/worklet/playback-processor.d.ts.map +1 -0
- package/dist/worklet/protocol.d.ts +331 -0
- package/dist/worklet/protocol.d.ts.map +1 -0
- package/dist/worklet/voice-changer-processor.d.ts +41 -0
- package/dist/worklet/voice-changer-processor.d.ts.map +1 -0
- package/dist/worklet.d.ts +16 -2515
- package/dist/worklet.d.ts.map +1 -0
- package/dist/worklet.js +3200 -541
- package/dist/worklet.js.map +1 -1
- package/package.json +23 -12
- package/src/_effects_common.ts +47 -0
- package/src/_feature_validation.ts +34 -0
- package/src/_fft_options.ts +39 -0
- package/src/align_take.ts +64 -0
- package/src/analysis.ts +56 -3
- package/src/analysis_helpers.ts +7 -0
- package/src/audio.ts +106 -3
- package/src/codes.ts +39 -2
- package/src/effects_mastering.ts +101 -22
- package/src/effects_note_ops.ts +683 -0
- package/src/effects_percussive.ts +217 -0
- package/src/effects_separation.ts +150 -0
- package/src/effects_spectral.ts +60 -0
- package/src/effects_timepitch.ts +388 -0
- package/src/errors.ts +23 -1
- package/src/feature_core.ts +127 -2
- package/src/feature_decompose.ts +633 -0
- package/src/feature_inverse.ts +454 -0
- package/src/feature_loudness.ts +125 -0
- package/src/feature_music.ts +107 -14
- package/src/feature_pitch.ts +96 -1
- package/src/feature_spectral.ts +16 -611
- package/src/feature_spectrogram.ts +63 -450
- package/src/features.ts +36 -22
- package/src/index.ts +288 -30
- package/src/instrument_types.ts +645 -0
- package/src/live_audio.ts +27 -1
- package/src/mastering_chain.ts +184 -0
- package/src/mastering_core.ts +441 -32
- package/src/mastering_dynamics.ts +22 -11
- package/src/metering.ts +67 -24
- package/src/mixer.ts +251 -22
- package/src/mixing_assistant.ts +138 -0
- package/src/mixing_oneshot.ts +10 -5
- package/src/module_state.ts +24 -2
- package/src/playback_renderer.ts +252 -0
- package/src/polyphony.ts +279 -0
- package/src/project.ts +61 -24
- package/src/project_class.ts +450 -27
- package/src/project_internal.ts +149 -42
- package/src/project_synth.ts +67 -1
- package/src/project_types.ts +271 -271
- package/src/public_types.ts +122 -3
- package/src/public_types_acoustic.ts +112 -3
- package/src/public_types_mastering.ts +275 -73
- package/src/public_types_mixing.ts +363 -1
- package/src/public_types_music.ts +312 -2
- package/src/public_types_playback.ts +196 -0
- package/src/public_types_realtime.ts +39 -7
- package/src/public_types_repair.ts +446 -0
- package/src/public_types_spectral.ts +491 -5
- package/src/quick_analysis.ts +203 -26
- package/src/realtime_engine.ts +773 -34
- package/src/realtime_voice_changer.ts +55 -1
- package/src/repair_dereverb.ts +299 -0
- package/src/repair_impulsive.ts +395 -0
- package/src/repair_noise.ts +425 -0
- package/src/repair_trim.ts +226 -0
- package/src/sample_bank.ts +113 -0
- package/src/sonare.js.d.ts +1158 -30
- package/src/stream_analyzer.ts +36 -4
- package/src/stream_types.ts +37 -0
- package/src/streaming_mixing.ts +1 -1
- package/src/streaming_processors.ts +202 -10
- package/src/transcribe.ts +89 -0
- package/src/validation.ts +285 -11
- package/src/web_midi.ts +1 -6
- package/src/worker.ts +18 -2
- package/src/worklet/audio_types.ts +37 -0
- package/src/worklet/engine-mixer-facade.ts +800 -32
- package/src/worklet/engine-node.ts +99 -29
- package/src/worklet/engine-offline.ts +14 -8
- package/src/worklet/engine-parameter-facade.ts +21 -0
- package/src/worklet/engine-processor.ts +332 -93
- package/src/worklet/engine-register.ts +32 -18
- package/src/worklet/engine-strips.ts +275 -9
- package/src/worklet/engine-sync.ts +20 -7
- package/src/worklet/engine.ts +394 -48
- package/src/worklet/guards.ts +195 -44
- package/src/worklet/messages.ts +229 -2
- package/src/worklet/mixer-processor.ts +117 -48
- package/src/worklet/playback-processor.ts +300 -0
- package/src/worklet/protocol.ts +82 -11
- package/src/worklet/voice-changer-processor.ts +17 -11
- package/src/worklet.ts +17 -0
- package/src/effects_transform.ts +0 -718
- 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
|
|
430
|
-
if (
|
|
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}:
|
|
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)
|
|
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/
|
|
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
|
|
459
|
-
|
|
460
|
-
|
|
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
|
|
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
|
|
473
|
-
|
|
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
|
-
|
|
480
|
-
|
|
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
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
|
499
|
-
if (!(
|
|
500
|
-
const request =
|
|
501
|
-
return
|
|
502
|
-
request.
|
|
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.
|
|
700
|
+
request.nFft,
|
|
505
701
|
request.fmin,
|
|
506
|
-
request.
|
|
507
|
-
request.
|
|
702
|
+
request.fmax,
|
|
703
|
+
request.htk,
|
|
508
704
|
request
|
|
509
705
|
);
|
|
510
706
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
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
|
|
517
|
-
if (!(
|
|
518
|
-
const request =
|
|
519
|
-
return
|
|
520
|
-
request.
|
|
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.
|
|
525
|
-
request.
|
|
724
|
+
request.fmax,
|
|
725
|
+
request.nIter,
|
|
726
|
+
request.htk,
|
|
526
727
|
request
|
|
527
728
|
);
|
|
528
729
|
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
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
|
|
535
|
-
if (!(
|
|
536
|
-
const request =
|
|
537
|
-
return
|
|
538
|
-
request.
|
|
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.
|
|
542
|
-
request.
|
|
543
|
-
request
|
|
544
|
-
|
|
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
|
|
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
|
-
|
|
570
|
-
return
|
|
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
|
|
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
|
-
|
|
654
|
-
return
|
|
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 =
|
|
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
|
|
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
|
-
|
|
744
|
-
|
|
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
|
-
|
|
761
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1302
|
+
return requireModule5().shortTermLufs(samples, sampleRate);
|
|
831
1303
|
}
|
|
832
1304
|
|
|
833
1305
|
// src/feature_pitch.ts
|
|
834
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
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
|
|
1415
|
+
function spectralCentroid(samples, sampleRate = 22050, nFft = 2048, hopLength = 512) {
|
|
1079
1416
|
if (!(samples instanceof Float32Array)) {
|
|
1080
|
-
|
|
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
|
|
1419
|
+
return requireModule7().spectralCentroid(samples, sampleRate, nFft, hopLength);
|
|
1084
1420
|
}
|
|
1085
|
-
function
|
|
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
|
|
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.
|
|
1429
|
+
r.nBands,
|
|
1430
|
+
r.fmin,
|
|
1431
|
+
r.quantile
|
|
1096
1432
|
);
|
|
1097
1433
|
}
|
|
1098
|
-
|
|
1099
|
-
const resolvedHardMask = resolveHardMask("hpssWithResidual", hardMask);
|
|
1100
|
-
return requireModule5().hpssWithResidualEx(
|
|
1434
|
+
return requireModule7().spectralContrast(
|
|
1101
1435
|
samples,
|
|
1102
1436
|
sampleRate,
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
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
|
|
1295
|
-
|
|
1296
|
-
|
|
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
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
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
|
-
|
|
1306
|
-
|
|
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
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
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
|
|
1314
|
-
|
|
1315
|
-
|
|
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
|
|
1488
|
+
function spectralFlux(samples, sampleRate = 22050, nFft = 2048, hopLength = 512, lag = 1) {
|
|
1322
1489
|
if (!(samples instanceof Float32Array)) {
|
|
1323
|
-
|
|
1324
|
-
|
|
1490
|
+
return spectralFlux(
|
|
1491
|
+
samples.samples,
|
|
1492
|
+
samples.sampleRate,
|
|
1493
|
+
samples.nFft,
|
|
1494
|
+
samples.hopLength,
|
|
1495
|
+
samples.lag
|
|
1496
|
+
);
|
|
1325
1497
|
}
|
|
1326
|
-
|
|
1327
|
-
|
|
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
|
-
|
|
1330
|
-
|
|
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
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
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
|
-
|
|
1358
|
-
return
|
|
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
|
-
|
|
1367
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1420
|
-
return
|
|
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
|
-
|
|
1613
|
+
const fft = resolveFftOptions("melSpectrogram", nFft, hopLength);
|
|
1614
|
+
validatePositiveIntegers("melSpectrogram", { nMels });
|
|
1439
1615
|
validateMelFrequencyRange("melSpectrogram", fmin, fmax, sampleRate);
|
|
1440
|
-
return
|
|
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
|
-
|
|
1645
|
+
const fft = resolveFftOptions("mfcc", nFft, hopLength);
|
|
1646
|
+
validatePositiveIntegers("mfcc", { nMels, nMfcc });
|
|
1470
1647
|
validateMelFrequencyRange("mfcc", fmin, fmax, sampleRate);
|
|
1471
|
-
return
|
|
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
|
|
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
|
|
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
|
-
|
|
1692
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1761
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1860
|
-
|
|
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,126 @@ 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
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1898
|
+
assertInterleavedSamples(
|
|
1899
|
+
"waveformPeaks",
|
|
1900
|
+
request.samples,
|
|
1901
|
+
request.channels,
|
|
1902
|
+
request.validate !== false
|
|
1903
|
+
);
|
|
1873
1904
|
const samplesPerBucket = request.samplesPerBucket ?? 512;
|
|
1874
|
-
|
|
1875
|
-
|
|
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
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
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
|
|
1887
|
-
throw new RangeError("waveformPeakPyramid: samplesPerBucketLevels must be
|
|
1917
|
+
if (levels.length === 0) {
|
|
1918
|
+
throw new RangeError("waveformPeakPyramid: samplesPerBucketLevels must not be empty");
|
|
1888
1919
|
}
|
|
1889
|
-
|
|
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.gsEfx",
|
|
1945
|
+
"effects.modulation.autoWah",
|
|
1946
|
+
"effects.modulation.chorus",
|
|
1947
|
+
"effects.modulation.ensemble",
|
|
1948
|
+
"effects.modulation.flanger",
|
|
1949
|
+
"effects.modulation.phaser",
|
|
1950
|
+
"effects.modulation.pitchShifter",
|
|
1951
|
+
"effects.modulation.ringModulator",
|
|
1952
|
+
"effects.modulation.rotary",
|
|
1953
|
+
"effects.modulation.wah",
|
|
1954
|
+
"effects.reverb.convolution",
|
|
1955
|
+
"effects.reverb.dattorro",
|
|
1956
|
+
"effects.reverb.fdn",
|
|
1957
|
+
"effects.reverb.plate",
|
|
1958
|
+
"effects.reverb.room",
|
|
1959
|
+
"effects.reverb.velvet",
|
|
1960
|
+
"eq.apiStyle",
|
|
1961
|
+
"eq.bandPass",
|
|
1962
|
+
"eq.cutFilter",
|
|
1963
|
+
"eq.dynamic",
|
|
1964
|
+
"eq.equalizer",
|
|
1965
|
+
"eq.graphic",
|
|
1966
|
+
"eq.linearPhase",
|
|
1967
|
+
"eq.midSide",
|
|
1968
|
+
"eq.minimumPhase",
|
|
1969
|
+
"eq.parametric",
|
|
1970
|
+
"eq.pultec",
|
|
1971
|
+
"eq.shelving",
|
|
1972
|
+
"eq.tilt",
|
|
1973
|
+
"final.bitDepth",
|
|
1974
|
+
"final.dither",
|
|
1975
|
+
"final.outputChain",
|
|
1976
|
+
"maximizer.adaptiveRelease",
|
|
1977
|
+
"maximizer.loudnessOptimize",
|
|
1978
|
+
"maximizer.maximizer",
|
|
1979
|
+
"maximizer.softKneeMax",
|
|
1980
|
+
"maximizer.truePeakLimiter",
|
|
1981
|
+
"multiband.compressor",
|
|
1982
|
+
"multiband.dynamicEq",
|
|
1983
|
+
"multiband.expander",
|
|
1984
|
+
"multiband.imager",
|
|
1985
|
+
"multiband.limiter",
|
|
1986
|
+
"multiband.saturation",
|
|
1987
|
+
"repair.declick",
|
|
1988
|
+
"repair.declip",
|
|
1989
|
+
"repair.decrackle",
|
|
1990
|
+
"repair.dehum",
|
|
1991
|
+
"repair.denoiseClassical",
|
|
1992
|
+
"repair.dereverbClassical",
|
|
1993
|
+
"repair.trimSilence",
|
|
1994
|
+
"saturation.ampSim",
|
|
1995
|
+
"saturation.bitcrusher",
|
|
1996
|
+
"saturation.exciter",
|
|
1997
|
+
"saturation.hardClipper",
|
|
1998
|
+
"saturation.multibandExciter",
|
|
1999
|
+
"saturation.softClipper",
|
|
2000
|
+
"saturation.tape",
|
|
2001
|
+
"saturation.transformer",
|
|
2002
|
+
"saturation.tube",
|
|
2003
|
+
"saturation.waveshaper",
|
|
2004
|
+
"spectral.airBand",
|
|
2005
|
+
"spectral.lowEndFocus",
|
|
2006
|
+
"spectral.presenceEnhancer",
|
|
2007
|
+
"spectral.spectralShaper",
|
|
2008
|
+
"stereo.autoPan",
|
|
2009
|
+
"stereo.binaural",
|
|
2010
|
+
"stereo.haasEnhancer",
|
|
2011
|
+
"stereo.imager",
|
|
2012
|
+
"stereo.monoMaker",
|
|
2013
|
+
"stereo.phaseAlign",
|
|
2014
|
+
"stereo.stereoBalance",
|
|
2015
|
+
"utility.gain"
|
|
2016
|
+
];
|
|
2017
|
+
|
|
1892
2018
|
// src/public_types_music.ts
|
|
1893
2019
|
var PitchClass = {
|
|
1894
2020
|
C: 0,
|
|
@@ -1939,7 +2065,15 @@ var ChordQuality = {
|
|
|
1939
2065
|
HalfDim7: 13,
|
|
1940
2066
|
Major9: 14,
|
|
1941
2067
|
Dominant9: 15,
|
|
1942
|
-
Sus2Add4: 16
|
|
2068
|
+
Sus2Add4: 16,
|
|
2069
|
+
Major6: 17,
|
|
2070
|
+
Minor6: 18,
|
|
2071
|
+
MinorMajor7: 19,
|
|
2072
|
+
Dominant7Sus4: 20,
|
|
2073
|
+
Dominant11: 21,
|
|
2074
|
+
Dominant13: 22,
|
|
2075
|
+
Dominant7Flat9: 23,
|
|
2076
|
+
Dominant7Sharp9: 24
|
|
1943
2077
|
};
|
|
1944
2078
|
var SectionType = {
|
|
1945
2079
|
Intro: 0,
|
|
@@ -1981,6 +2115,16 @@ function resolveEnumOrdinal(value, values, enumName) {
|
|
|
1981
2115
|
}
|
|
1982
2116
|
throw new RangeError(`Invalid ${enumName}: ${String(value)}`);
|
|
1983
2117
|
}
|
|
2118
|
+
var AUTOMATION_CURVE_VALUES = {
|
|
2119
|
+
linear: 0,
|
|
2120
|
+
exponential: 1,
|
|
2121
|
+
hold: 2,
|
|
2122
|
+
"s-curve": 3
|
|
2123
|
+
};
|
|
2124
|
+
var PROJECT_AUTOMATION_CURVE_VALUES = {
|
|
2125
|
+
...AUTOMATION_CURVE_VALUES,
|
|
2126
|
+
scurve: 3
|
|
2127
|
+
};
|
|
1984
2128
|
|
|
1985
2129
|
// src/analysis_helpers.ts
|
|
1986
2130
|
var PITCH_CLASS_NAMES = [
|
|
@@ -2072,6 +2216,7 @@ function convertChordAnalysisResult(wasm) {
|
|
|
2072
2216
|
quality: c.quality,
|
|
2073
2217
|
start: c.start,
|
|
2074
2218
|
end: c.end,
|
|
2219
|
+
duration: c.end - c.start,
|
|
2075
2220
|
confidence: c.confidence,
|
|
2076
2221
|
name: c.name
|
|
2077
2222
|
}))
|
|
@@ -2110,6 +2255,10 @@ function convertAnalysisResult(wasm) {
|
|
|
2110
2255
|
timeSignatureCandidates: wasm.timeSignatureCandidates,
|
|
2111
2256
|
beatTimes,
|
|
2112
2257
|
beats: wasm.beats,
|
|
2258
|
+
downbeatIndices: wasm.downbeatIndices,
|
|
2259
|
+
downbeatPhase: wasm.downbeatPhase,
|
|
2260
|
+
beatObservations: wasm.beatObservations,
|
|
2261
|
+
beatLocalBpm: wasm.beatLocalBpm,
|
|
2113
2262
|
chords: wasm.chords.map((c) => ({
|
|
2114
2263
|
root: c.root,
|
|
2115
2264
|
bass: c.bass,
|
|
@@ -2118,8 +2267,10 @@ function convertAnalysisResult(wasm) {
|
|
|
2118
2267
|
quality: c.quality,
|
|
2119
2268
|
start: c.start,
|
|
2120
2269
|
end: c.end,
|
|
2270
|
+
duration: c.end - c.start,
|
|
2121
2271
|
confidence: c.confidence,
|
|
2122
|
-
name: c.name
|
|
2272
|
+
name: c.name,
|
|
2273
|
+
romanNumeral: c.romanNumeral
|
|
2123
2274
|
})),
|
|
2124
2275
|
sections: wasm.sections.map((s) => ({
|
|
2125
2276
|
type: s.type,
|
|
@@ -2138,7 +2289,7 @@ function convertAnalysisResult(wasm) {
|
|
|
2138
2289
|
}
|
|
2139
2290
|
|
|
2140
2291
|
// src/quick_analysis.ts
|
|
2141
|
-
function
|
|
2292
|
+
function requireModule10() {
|
|
2142
2293
|
return getSonareModule();
|
|
2143
2294
|
}
|
|
2144
2295
|
function validateAnalysisInput(fnName, samples, sampleRate, options = {}) {
|
|
@@ -2148,12 +2299,12 @@ function validateAnalysisInput(fnName, samples, sampleRate, options = {}) {
|
|
|
2148
2299
|
function detectBpm(samples, sampleRate = 22050, options = {}) {
|
|
2149
2300
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2150
2301
|
validateAnalysisInput("detectBpm", request.samples, request.sampleRate ?? 22050, request);
|
|
2151
|
-
return
|
|
2302
|
+
return requireModule10().detectBpm(request.samples, request.sampleRate ?? 22050);
|
|
2152
2303
|
}
|
|
2153
2304
|
function detectKey(samples, sampleRate = 22050, options = {}) {
|
|
2154
2305
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2155
2306
|
validateAnalysisInput("detectKey", request.samples, request.sampleRate ?? 22050, request);
|
|
2156
|
-
const result =
|
|
2307
|
+
const result = requireModule10()._detectKeyWithOptions(
|
|
2157
2308
|
request.samples,
|
|
2158
2309
|
request.sampleRate ?? 22050,
|
|
2159
2310
|
request.nFft ?? 4096,
|
|
@@ -2181,7 +2332,7 @@ function detectKeyCandidates(samples, sampleRate = 22050, options = {}) {
|
|
|
2181
2332
|
request.sampleRate ?? 22050,
|
|
2182
2333
|
request
|
|
2183
2334
|
);
|
|
2184
|
-
const candidates =
|
|
2335
|
+
const candidates = requireModule10()._detectKeyCandidates(
|
|
2185
2336
|
request.samples,
|
|
2186
2337
|
request.sampleRate ?? 22050,
|
|
2187
2338
|
request.nFft ?? 4096,
|
|
@@ -2198,22 +2349,22 @@ function detectKeyCandidates(samples, sampleRate = 22050, options = {}) {
|
|
|
2198
2349
|
function detectOnsets(samples, sampleRate = 22050, options = {}) {
|
|
2199
2350
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2200
2351
|
validateAnalysisInput("detectOnsets", request.samples, request.sampleRate ?? 22050, request);
|
|
2201
|
-
return
|
|
2352
|
+
return requireModule10().detectOnsets(request.samples, request.sampleRate ?? 22050, request);
|
|
2202
2353
|
}
|
|
2203
2354
|
function detectBeats(samples, sampleRate = 22050, options = {}) {
|
|
2204
2355
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2205
2356
|
validateAnalysisInput("detectBeats", request.samples, request.sampleRate ?? 22050, request);
|
|
2206
|
-
return
|
|
2357
|
+
return requireModule10().detectBeats(request.samples, request.sampleRate ?? 22050);
|
|
2207
2358
|
}
|
|
2208
2359
|
function detectDownbeats(samples, sampleRate = 22050, options = {}) {
|
|
2209
2360
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2210
2361
|
validateAnalysisInput("detectDownbeats", request.samples, request.sampleRate ?? 22050, request);
|
|
2211
|
-
return
|
|
2362
|
+
return requireModule10().detectDownbeats(request.samples, request.sampleRate ?? 22050);
|
|
2212
2363
|
}
|
|
2213
2364
|
function detectChords(samples, sampleRate = 22050, options = {}) {
|
|
2214
2365
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2215
2366
|
validateAnalysisInput("detectChords", request.samples, request.sampleRate ?? 22050, request);
|
|
2216
|
-
const result =
|
|
2367
|
+
const result = requireModule10().detectChords(
|
|
2217
2368
|
request.samples,
|
|
2218
2369
|
request.sampleRate ?? 22050,
|
|
2219
2370
|
request.minDuration ?? 0.3,
|
|
@@ -2229,7 +2380,8 @@ function detectChords(samples, sampleRate = 22050, options = {}) {
|
|
|
2229
2380
|
request.keyRoot ?? PitchClass.C,
|
|
2230
2381
|
request.keyMode ?? Mode.Major,
|
|
2231
2382
|
request.detectInversions ?? false,
|
|
2232
|
-
chordChromaMethodValue(request.chromaMethod ?? "stft")
|
|
2383
|
+
chordChromaMethodValue(request.chromaMethod ?? "stft"),
|
|
2384
|
+
request.tuning ?? 0
|
|
2233
2385
|
);
|
|
2234
2386
|
return convertChordAnalysisResult(result);
|
|
2235
2387
|
}
|
|
@@ -2241,7 +2393,7 @@ function chordFunctionalAnalysis(samples, keyRoot, keyMode, sampleRate = 22050,
|
|
|
2241
2393
|
request.sampleRate ?? 22050,
|
|
2242
2394
|
request
|
|
2243
2395
|
);
|
|
2244
|
-
return
|
|
2396
|
+
return requireModule10().chordFunctionalAnalysis(
|
|
2245
2397
|
request.samples,
|
|
2246
2398
|
request.keyRoot,
|
|
2247
2399
|
request.keyMode ?? Mode.Major,
|
|
@@ -2257,20 +2409,21 @@ function chordFunctionalAnalysis(samples, keyRoot, keyMode, sampleRate = 22050,
|
|
|
2257
2409
|
request.hmmBeamWidth ?? 24,
|
|
2258
2410
|
request.useKeyContext ?? false,
|
|
2259
2411
|
request.detectInversions ?? false,
|
|
2260
|
-
chordChromaMethodValue(request.chromaMethod ?? "stft")
|
|
2412
|
+
chordChromaMethodValue(request.chromaMethod ?? "stft"),
|
|
2413
|
+
request.tuning ?? 0
|
|
2261
2414
|
);
|
|
2262
2415
|
}
|
|
2263
2416
|
function analyze(samples, sampleRate = 22050, options = {}) {
|
|
2264
2417
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2265
2418
|
validateAnalysisInput("analyze", request.samples, request.sampleRate ?? 22050, request);
|
|
2266
|
-
const result =
|
|
2419
|
+
const result = requireModule10().analyze(request.samples, request.sampleRate ?? 22050, request);
|
|
2267
2420
|
return convertAnalysisResult(result);
|
|
2268
2421
|
}
|
|
2422
|
+
function estimateMeter(request) {
|
|
2423
|
+
return requireModule10().estimateMeter(request.beatTimes, request.beatStrengths, request);
|
|
2424
|
+
}
|
|
2269
2425
|
function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, minDecayDb) {
|
|
2270
2426
|
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
2427
|
const resolvedMinDecayDb = request.minDecayDb === void 0 ? 30 : request.minDecayDb;
|
|
2275
2428
|
assertFiniteScalar("analyzeImpulseResponse", resolvedMinDecayDb, "minDecayDb");
|
|
2276
2429
|
if (resolvedMinDecayDb <= 0) {
|
|
@@ -2282,7 +2435,7 @@ function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, mi
|
|
|
2282
2435
|
request.sampleRate ?? 48e3,
|
|
2283
2436
|
request
|
|
2284
2437
|
);
|
|
2285
|
-
const result =
|
|
2438
|
+
const result = requireModule10().analyzeImpulseResponseEx(
|
|
2286
2439
|
request.samples,
|
|
2287
2440
|
request.sampleRate ?? 48e3,
|
|
2288
2441
|
request.nOctaveBands ?? 6,
|
|
@@ -2293,7 +2446,7 @@ function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, mi
|
|
|
2293
2446
|
function detectAcoustic(samples, sampleRate = 48e3, options = {}) {
|
|
2294
2447
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2295
2448
|
validateAnalysisInput("detectAcoustic", request.samples, request.sampleRate ?? 48e3, request);
|
|
2296
|
-
const result =
|
|
2449
|
+
const result = requireModule10().detectAcoustic(
|
|
2297
2450
|
request.samples,
|
|
2298
2451
|
request.sampleRate ?? 48e3,
|
|
2299
2452
|
request.nOctaveBands ?? 6,
|
|
@@ -2303,17 +2456,18 @@ function detectAcoustic(samples, sampleRate = 48e3, options = {}) {
|
|
|
2303
2456
|
);
|
|
2304
2457
|
return result;
|
|
2305
2458
|
}
|
|
2306
|
-
function analyzeWithProgress(samples, sampleRate = 22050, onProgress) {
|
|
2307
|
-
const request = samples instanceof Float32Array ? { samples, sampleRate, onProgress } : samples;
|
|
2459
|
+
function analyzeWithProgress(samples, sampleRate = 22050, onProgress, options) {
|
|
2460
|
+
const request = samples instanceof Float32Array ? { samples, sampleRate, onProgress, options } : samples;
|
|
2308
2461
|
validateAnalysisInput(
|
|
2309
2462
|
"analyzeWithProgress",
|
|
2310
2463
|
request.samples,
|
|
2311
2464
|
request.sampleRate ?? 22050,
|
|
2312
2465
|
request
|
|
2313
2466
|
);
|
|
2314
|
-
const result =
|
|
2467
|
+
const result = requireModule10().analyzeWithProgress(
|
|
2315
2468
|
request.samples,
|
|
2316
2469
|
request.sampleRate ?? 22050,
|
|
2470
|
+
request.options ?? {},
|
|
2317
2471
|
request.onProgress ?? (() => {
|
|
2318
2472
|
}),
|
|
2319
2473
|
request.cancel ?? (() => false)
|
|
@@ -2324,7 +2478,7 @@ function analyzeBpm(samples, sampleRate = 22050, options = {}) {
|
|
|
2324
2478
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2325
2479
|
validateAnalysisInput("analyzeBpm", request.samples, request.sampleRate ?? 22050, request);
|
|
2326
2480
|
assertNonNegativeInteger("analyzeBpm", request.maxCandidates ?? 5, "maxCandidates");
|
|
2327
|
-
return
|
|
2481
|
+
return requireModule10().analyzeBpm(
|
|
2328
2482
|
request.samples,
|
|
2329
2483
|
request.sampleRate ?? 22050,
|
|
2330
2484
|
request.bpmMin ?? 30,
|
|
@@ -2338,7 +2492,7 @@ function analyzeBpm(samples, sampleRate = 22050, options = {}) {
|
|
|
2338
2492
|
function analyzeRhythm(samples, sampleRate = 22050, options = {}) {
|
|
2339
2493
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2340
2494
|
validateAnalysisInput("analyzeRhythm", request.samples, request.sampleRate ?? 22050, request);
|
|
2341
|
-
return
|
|
2495
|
+
return requireModule10().analyzeRhythm(
|
|
2342
2496
|
request.samples,
|
|
2343
2497
|
request.sampleRate ?? 22050,
|
|
2344
2498
|
request.bpmMin ?? 60,
|
|
@@ -2351,7 +2505,7 @@ function analyzeRhythm(samples, sampleRate = 22050, options = {}) {
|
|
|
2351
2505
|
function analyzeDynamics(samples, sampleRate = 22050, options = {}) {
|
|
2352
2506
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2353
2507
|
validateAnalysisInput("analyzeDynamics", request.samples, request.sampleRate ?? 22050, request);
|
|
2354
|
-
return
|
|
2508
|
+
return requireModule10().analyzeDynamics(
|
|
2355
2509
|
request.samples,
|
|
2356
2510
|
request.sampleRate ?? 22050,
|
|
2357
2511
|
request.windowSec ?? 0.4,
|
|
@@ -2362,7 +2516,7 @@ function analyzeDynamics(samples, sampleRate = 22050, options = {}) {
|
|
|
2362
2516
|
function analyzeTimbre(samples, sampleRate = 22050, options = {}) {
|
|
2363
2517
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2364
2518
|
validateAnalysisInput("analyzeTimbre", request.samples, request.sampleRate ?? 22050, request);
|
|
2365
|
-
return
|
|
2519
|
+
return requireModule10().analyzeTimbre(
|
|
2366
2520
|
request.samples,
|
|
2367
2521
|
request.sampleRate ?? 22050,
|
|
2368
2522
|
request.nFft ?? 2048,
|
|
@@ -2373,7 +2527,7 @@ function analyzeTimbre(samples, sampleRate = 22050, options = {}) {
|
|
|
2373
2527
|
);
|
|
2374
2528
|
}
|
|
2375
2529
|
function hasFfmpegSupport() {
|
|
2376
|
-
return
|
|
2530
|
+
return requireModule10().hasFfmpegSupport();
|
|
2377
2531
|
}
|
|
2378
2532
|
|
|
2379
2533
|
// src/analysis.ts
|
|
@@ -2437,6 +2591,7 @@ export {
|
|
|
2437
2591
|
KeyProfile,
|
|
2438
2592
|
Mode,
|
|
2439
2593
|
PitchClass,
|
|
2594
|
+
SOLO_PROCESSORS,
|
|
2440
2595
|
SectionType,
|
|
2441
2596
|
SonareError,
|
|
2442
2597
|
abiVersion,
|
|
@@ -2463,11 +2618,10 @@ export {
|
|
|
2463
2618
|
cyclicTempogram,
|
|
2464
2619
|
dbToAmplitude,
|
|
2465
2620
|
dbToPower,
|
|
2466
|
-
decompose,
|
|
2467
|
-
decomposeWithInit,
|
|
2468
2621
|
deemphasis,
|
|
2469
2622
|
detectAcoustic,
|
|
2470
2623
|
detectBeats,
|
|
2624
|
+
detectBoundaries,
|
|
2471
2625
|
detectBpm,
|
|
2472
2626
|
detectChords,
|
|
2473
2627
|
detectDownbeats,
|
|
@@ -2476,6 +2630,7 @@ export {
|
|
|
2476
2630
|
detectOnsets,
|
|
2477
2631
|
ebur128LoudnessRange,
|
|
2478
2632
|
engineAbiVersion,
|
|
2633
|
+
estimateMeter,
|
|
2479
2634
|
estimateTuning,
|
|
2480
2635
|
fixFrames,
|
|
2481
2636
|
fixLength,
|
|
@@ -2485,7 +2640,6 @@ export {
|
|
|
2485
2640
|
framesToTime,
|
|
2486
2641
|
griffinLim,
|
|
2487
2642
|
hasFfmpegSupport,
|
|
2488
|
-
hpssWithResidual,
|
|
2489
2643
|
hybridCqt,
|
|
2490
2644
|
hzToMel,
|
|
2491
2645
|
hzToMidi,
|
|
@@ -2495,6 +2649,7 @@ export {
|
|
|
2495
2649
|
isSonareError,
|
|
2496
2650
|
lufs,
|
|
2497
2651
|
lufsInterleaved,
|
|
2652
|
+
lufsSeriesInterleaved,
|
|
2498
2653
|
melDelta,
|
|
2499
2654
|
melSpectrogram,
|
|
2500
2655
|
melToAudio,
|
|
@@ -2522,7 +2677,6 @@ export {
|
|
|
2522
2677
|
mfccToMel,
|
|
2523
2678
|
midiToHz,
|
|
2524
2679
|
momentaryLufs,
|
|
2525
|
-
nnFilter,
|
|
2526
2680
|
nnlsChroma,
|
|
2527
2681
|
noteSegments,
|
|
2528
2682
|
noteToHz,
|
|
@@ -2532,7 +2686,6 @@ export {
|
|
|
2532
2686
|
padCenter,
|
|
2533
2687
|
pcen,
|
|
2534
2688
|
peakPick,
|
|
2535
|
-
phaseVocoder,
|
|
2536
2689
|
piptrack,
|
|
2537
2690
|
pitchPyin,
|
|
2538
2691
|
pitchTuning,
|
|
@@ -2543,8 +2696,6 @@ export {
|
|
|
2543
2696
|
preemphasis,
|
|
2544
2697
|
pseudoCqt,
|
|
2545
2698
|
reassignedSpectrogram,
|
|
2546
|
-
remix,
|
|
2547
|
-
resample,
|
|
2548
2699
|
rmsEnergy,
|
|
2549
2700
|
samplesToFrames,
|
|
2550
2701
|
segmentAgglomerative,
|
|
@@ -2562,6 +2713,8 @@ export {
|
|
|
2562
2713
|
spectralFlux,
|
|
2563
2714
|
spectralRolloff,
|
|
2564
2715
|
splitSilence,
|
|
2716
|
+
splitSilenceCommon,
|
|
2717
|
+
splitSilenceCommonWithReport,
|
|
2565
2718
|
stft,
|
|
2566
2719
|
stftDb,
|
|
2567
2720
|
tempogram,
|
|
@@ -2569,7 +2722,6 @@ export {
|
|
|
2569
2722
|
timeToFrames,
|
|
2570
2723
|
tone,
|
|
2571
2724
|
tonnetz,
|
|
2572
|
-
trim,
|
|
2573
2725
|
trimSilence,
|
|
2574
2726
|
vectorNormalize,
|
|
2575
2727
|
version,
|