@libraz/libsonare 1.7.2 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +6 -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 +873 -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 +477 -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 +129 -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 +3758 -1362
- 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 +457 -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 +652 -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 +510 -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 +164 -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 +850 -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 +3909 -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 +335 -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 +128 -0
- package/dist/worklet/engine-mixer-facade.d.ts.map +1 -0
- package/dist/worklet/engine-node.d.ts +81 -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 +68 -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 +73 -0
- package/dist/worklet/engine-strips.d.ts.map +1 -0
- package/dist/worklet/engine-sync.d.ts +37 -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 +397 -0
- package/dist/worklet/engine.d.ts.map +1 -0
- package/dist/worklet/guards.d.ts +47 -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 +323 -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 +2763 -501
- package/dist/worklet.js.map +1 -1
- package/package.json +23 -12
- package/src/_effects_common.ts +17 -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 +97 -22
- package/src/effects_note_ops.ts +635 -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 +377 -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 +282 -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 +346 -32
- package/src/mastering_dynamics.ts +22 -11
- package/src/metering.ts +67 -24
- package/src/mixer.ts +212 -3
- 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 +268 -270
- package/src/public_types.ts +122 -3
- package/src/public_types_acoustic.ts +112 -3
- package/src/public_types_mastering.ts +254 -73
- package/src/public_types_mixing.ts +363 -1
- package/src/public_types_music.ts +312 -2
- package/src/public_types_playback.ts +195 -0
- package/src/public_types_realtime.ts +39 -7
- package/src/public_types_repair.ts +446 -0
- package/src/public_types_spectral.ts +487 -1
- package/src/quick_analysis.ts +203 -26
- package/src/realtime_engine.ts +711 -28
- 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 +1122 -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 +194 -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 +444 -10
- package/src/worklet/engine-node.ts +78 -26
- package/src/worklet/engine-offline.ts +14 -8
- package/src/worklet/engine-parameter-facade.ts +21 -0
- package/src/worklet/engine-processor.ts +272 -83
- package/src/worklet/engine-register.ts +32 -18
- package/src/worklet/engine-strips.ts +280 -9
- package/src/worklet/engine-sync.ts +14 -6
- package/src/worklet/engine.ts +365 -31
- package/src/worklet/guards.ts +140 -44
- package/src/worklet/messages.ts +227 -2
- package/src/worklet/mixer-processor.ts +109 -47
- package/src/worklet/playback-processor.ts +300 -0
- package/src/worklet/protocol.ts +53 -3
- 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,125 @@ function meteringSpectrumFrame(samples, sampleRate = 22050, frameOffset = 0, opt
|
|
|
1866
1895
|
}
|
|
1867
1896
|
function waveformPeaks(samples, channels, options = {}) {
|
|
1868
1897
|
const request = samples instanceof Float32Array ? { samples, channels, ...options } : samples;
|
|
1869
|
-
|
|
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.modulation.autoWah",
|
|
1945
|
+
"effects.modulation.chorus",
|
|
1946
|
+
"effects.modulation.ensemble",
|
|
1947
|
+
"effects.modulation.flanger",
|
|
1948
|
+
"effects.modulation.phaser",
|
|
1949
|
+
"effects.modulation.pitchShifter",
|
|
1950
|
+
"effects.modulation.ringModulator",
|
|
1951
|
+
"effects.modulation.rotary",
|
|
1952
|
+
"effects.modulation.wah",
|
|
1953
|
+
"effects.reverb.convolution",
|
|
1954
|
+
"effects.reverb.dattorro",
|
|
1955
|
+
"effects.reverb.fdn",
|
|
1956
|
+
"effects.reverb.plate",
|
|
1957
|
+
"effects.reverb.room",
|
|
1958
|
+
"effects.reverb.velvet",
|
|
1959
|
+
"eq.apiStyle",
|
|
1960
|
+
"eq.bandPass",
|
|
1961
|
+
"eq.cutFilter",
|
|
1962
|
+
"eq.dynamic",
|
|
1963
|
+
"eq.equalizer",
|
|
1964
|
+
"eq.graphic",
|
|
1965
|
+
"eq.linearPhase",
|
|
1966
|
+
"eq.midSide",
|
|
1967
|
+
"eq.minimumPhase",
|
|
1968
|
+
"eq.parametric",
|
|
1969
|
+
"eq.pultec",
|
|
1970
|
+
"eq.shelving",
|
|
1971
|
+
"eq.tilt",
|
|
1972
|
+
"final.bitDepth",
|
|
1973
|
+
"final.dither",
|
|
1974
|
+
"final.outputChain",
|
|
1975
|
+
"maximizer.adaptiveRelease",
|
|
1976
|
+
"maximizer.loudnessOptimize",
|
|
1977
|
+
"maximizer.maximizer",
|
|
1978
|
+
"maximizer.softKneeMax",
|
|
1979
|
+
"maximizer.truePeakLimiter",
|
|
1980
|
+
"multiband.compressor",
|
|
1981
|
+
"multiband.dynamicEq",
|
|
1982
|
+
"multiband.expander",
|
|
1983
|
+
"multiband.imager",
|
|
1984
|
+
"multiband.limiter",
|
|
1985
|
+
"multiband.saturation",
|
|
1986
|
+
"repair.declick",
|
|
1987
|
+
"repair.declip",
|
|
1988
|
+
"repair.decrackle",
|
|
1989
|
+
"repair.dehum",
|
|
1990
|
+
"repair.denoiseClassical",
|
|
1991
|
+
"repair.dereverbClassical",
|
|
1992
|
+
"repair.trimSilence",
|
|
1993
|
+
"saturation.ampSim",
|
|
1994
|
+
"saturation.bitcrusher",
|
|
1995
|
+
"saturation.exciter",
|
|
1996
|
+
"saturation.hardClipper",
|
|
1997
|
+
"saturation.multibandExciter",
|
|
1998
|
+
"saturation.softClipper",
|
|
1999
|
+
"saturation.tape",
|
|
2000
|
+
"saturation.transformer",
|
|
2001
|
+
"saturation.tube",
|
|
2002
|
+
"saturation.waveshaper",
|
|
2003
|
+
"spectral.airBand",
|
|
2004
|
+
"spectral.lowEndFocus",
|
|
2005
|
+
"spectral.presenceEnhancer",
|
|
2006
|
+
"spectral.spectralShaper",
|
|
2007
|
+
"stereo.autoPan",
|
|
2008
|
+
"stereo.binaural",
|
|
2009
|
+
"stereo.haasEnhancer",
|
|
2010
|
+
"stereo.imager",
|
|
2011
|
+
"stereo.monoMaker",
|
|
2012
|
+
"stereo.phaseAlign",
|
|
2013
|
+
"stereo.stereoBalance",
|
|
2014
|
+
"utility.gain"
|
|
2015
|
+
];
|
|
2016
|
+
|
|
1892
2017
|
// src/public_types_music.ts
|
|
1893
2018
|
var PitchClass = {
|
|
1894
2019
|
C: 0,
|
|
@@ -1939,7 +2064,15 @@ var ChordQuality = {
|
|
|
1939
2064
|
HalfDim7: 13,
|
|
1940
2065
|
Major9: 14,
|
|
1941
2066
|
Dominant9: 15,
|
|
1942
|
-
Sus2Add4: 16
|
|
2067
|
+
Sus2Add4: 16,
|
|
2068
|
+
Major6: 17,
|
|
2069
|
+
Minor6: 18,
|
|
2070
|
+
MinorMajor7: 19,
|
|
2071
|
+
Dominant7Sus4: 20,
|
|
2072
|
+
Dominant11: 21,
|
|
2073
|
+
Dominant13: 22,
|
|
2074
|
+
Dominant7Flat9: 23,
|
|
2075
|
+
Dominant7Sharp9: 24
|
|
1943
2076
|
};
|
|
1944
2077
|
var SectionType = {
|
|
1945
2078
|
Intro: 0,
|
|
@@ -1981,6 +2114,16 @@ function resolveEnumOrdinal(value, values, enumName) {
|
|
|
1981
2114
|
}
|
|
1982
2115
|
throw new RangeError(`Invalid ${enumName}: ${String(value)}`);
|
|
1983
2116
|
}
|
|
2117
|
+
var AUTOMATION_CURVE_VALUES = {
|
|
2118
|
+
linear: 0,
|
|
2119
|
+
exponential: 1,
|
|
2120
|
+
hold: 2,
|
|
2121
|
+
"s-curve": 3
|
|
2122
|
+
};
|
|
2123
|
+
var PROJECT_AUTOMATION_CURVE_VALUES = {
|
|
2124
|
+
...AUTOMATION_CURVE_VALUES,
|
|
2125
|
+
scurve: 3
|
|
2126
|
+
};
|
|
1984
2127
|
|
|
1985
2128
|
// src/analysis_helpers.ts
|
|
1986
2129
|
var PITCH_CLASS_NAMES = [
|
|
@@ -2072,6 +2215,7 @@ function convertChordAnalysisResult(wasm) {
|
|
|
2072
2215
|
quality: c.quality,
|
|
2073
2216
|
start: c.start,
|
|
2074
2217
|
end: c.end,
|
|
2218
|
+
duration: c.end - c.start,
|
|
2075
2219
|
confidence: c.confidence,
|
|
2076
2220
|
name: c.name
|
|
2077
2221
|
}))
|
|
@@ -2110,6 +2254,10 @@ function convertAnalysisResult(wasm) {
|
|
|
2110
2254
|
timeSignatureCandidates: wasm.timeSignatureCandidates,
|
|
2111
2255
|
beatTimes,
|
|
2112
2256
|
beats: wasm.beats,
|
|
2257
|
+
downbeatIndices: wasm.downbeatIndices,
|
|
2258
|
+
downbeatPhase: wasm.downbeatPhase,
|
|
2259
|
+
beatObservations: wasm.beatObservations,
|
|
2260
|
+
beatLocalBpm: wasm.beatLocalBpm,
|
|
2113
2261
|
chords: wasm.chords.map((c) => ({
|
|
2114
2262
|
root: c.root,
|
|
2115
2263
|
bass: c.bass,
|
|
@@ -2118,8 +2266,10 @@ function convertAnalysisResult(wasm) {
|
|
|
2118
2266
|
quality: c.quality,
|
|
2119
2267
|
start: c.start,
|
|
2120
2268
|
end: c.end,
|
|
2269
|
+
duration: c.end - c.start,
|
|
2121
2270
|
confidence: c.confidence,
|
|
2122
|
-
name: c.name
|
|
2271
|
+
name: c.name,
|
|
2272
|
+
romanNumeral: c.romanNumeral
|
|
2123
2273
|
})),
|
|
2124
2274
|
sections: wasm.sections.map((s) => ({
|
|
2125
2275
|
type: s.type,
|
|
@@ -2138,7 +2288,7 @@ function convertAnalysisResult(wasm) {
|
|
|
2138
2288
|
}
|
|
2139
2289
|
|
|
2140
2290
|
// src/quick_analysis.ts
|
|
2141
|
-
function
|
|
2291
|
+
function requireModule10() {
|
|
2142
2292
|
return getSonareModule();
|
|
2143
2293
|
}
|
|
2144
2294
|
function validateAnalysisInput(fnName, samples, sampleRate, options = {}) {
|
|
@@ -2148,12 +2298,12 @@ function validateAnalysisInput(fnName, samples, sampleRate, options = {}) {
|
|
|
2148
2298
|
function detectBpm(samples, sampleRate = 22050, options = {}) {
|
|
2149
2299
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2150
2300
|
validateAnalysisInput("detectBpm", request.samples, request.sampleRate ?? 22050, request);
|
|
2151
|
-
return
|
|
2301
|
+
return requireModule10().detectBpm(request.samples, request.sampleRate ?? 22050);
|
|
2152
2302
|
}
|
|
2153
2303
|
function detectKey(samples, sampleRate = 22050, options = {}) {
|
|
2154
2304
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2155
2305
|
validateAnalysisInput("detectKey", request.samples, request.sampleRate ?? 22050, request);
|
|
2156
|
-
const result =
|
|
2306
|
+
const result = requireModule10()._detectKeyWithOptions(
|
|
2157
2307
|
request.samples,
|
|
2158
2308
|
request.sampleRate ?? 22050,
|
|
2159
2309
|
request.nFft ?? 4096,
|
|
@@ -2181,7 +2331,7 @@ function detectKeyCandidates(samples, sampleRate = 22050, options = {}) {
|
|
|
2181
2331
|
request.sampleRate ?? 22050,
|
|
2182
2332
|
request
|
|
2183
2333
|
);
|
|
2184
|
-
const candidates =
|
|
2334
|
+
const candidates = requireModule10()._detectKeyCandidates(
|
|
2185
2335
|
request.samples,
|
|
2186
2336
|
request.sampleRate ?? 22050,
|
|
2187
2337
|
request.nFft ?? 4096,
|
|
@@ -2198,22 +2348,22 @@ function detectKeyCandidates(samples, sampleRate = 22050, options = {}) {
|
|
|
2198
2348
|
function detectOnsets(samples, sampleRate = 22050, options = {}) {
|
|
2199
2349
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2200
2350
|
validateAnalysisInput("detectOnsets", request.samples, request.sampleRate ?? 22050, request);
|
|
2201
|
-
return
|
|
2351
|
+
return requireModule10().detectOnsets(request.samples, request.sampleRate ?? 22050, request);
|
|
2202
2352
|
}
|
|
2203
2353
|
function detectBeats(samples, sampleRate = 22050, options = {}) {
|
|
2204
2354
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2205
2355
|
validateAnalysisInput("detectBeats", request.samples, request.sampleRate ?? 22050, request);
|
|
2206
|
-
return
|
|
2356
|
+
return requireModule10().detectBeats(request.samples, request.sampleRate ?? 22050);
|
|
2207
2357
|
}
|
|
2208
2358
|
function detectDownbeats(samples, sampleRate = 22050, options = {}) {
|
|
2209
2359
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2210
2360
|
validateAnalysisInput("detectDownbeats", request.samples, request.sampleRate ?? 22050, request);
|
|
2211
|
-
return
|
|
2361
|
+
return requireModule10().detectDownbeats(request.samples, request.sampleRate ?? 22050);
|
|
2212
2362
|
}
|
|
2213
2363
|
function detectChords(samples, sampleRate = 22050, options = {}) {
|
|
2214
2364
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2215
2365
|
validateAnalysisInput("detectChords", request.samples, request.sampleRate ?? 22050, request);
|
|
2216
|
-
const result =
|
|
2366
|
+
const result = requireModule10().detectChords(
|
|
2217
2367
|
request.samples,
|
|
2218
2368
|
request.sampleRate ?? 22050,
|
|
2219
2369
|
request.minDuration ?? 0.3,
|
|
@@ -2229,7 +2379,8 @@ function detectChords(samples, sampleRate = 22050, options = {}) {
|
|
|
2229
2379
|
request.keyRoot ?? PitchClass.C,
|
|
2230
2380
|
request.keyMode ?? Mode.Major,
|
|
2231
2381
|
request.detectInversions ?? false,
|
|
2232
|
-
chordChromaMethodValue(request.chromaMethod ?? "stft")
|
|
2382
|
+
chordChromaMethodValue(request.chromaMethod ?? "stft"),
|
|
2383
|
+
request.tuning ?? 0
|
|
2233
2384
|
);
|
|
2234
2385
|
return convertChordAnalysisResult(result);
|
|
2235
2386
|
}
|
|
@@ -2241,7 +2392,7 @@ function chordFunctionalAnalysis(samples, keyRoot, keyMode, sampleRate = 22050,
|
|
|
2241
2392
|
request.sampleRate ?? 22050,
|
|
2242
2393
|
request
|
|
2243
2394
|
);
|
|
2244
|
-
return
|
|
2395
|
+
return requireModule10().chordFunctionalAnalysis(
|
|
2245
2396
|
request.samples,
|
|
2246
2397
|
request.keyRoot,
|
|
2247
2398
|
request.keyMode ?? Mode.Major,
|
|
@@ -2257,20 +2408,21 @@ function chordFunctionalAnalysis(samples, keyRoot, keyMode, sampleRate = 22050,
|
|
|
2257
2408
|
request.hmmBeamWidth ?? 24,
|
|
2258
2409
|
request.useKeyContext ?? false,
|
|
2259
2410
|
request.detectInversions ?? false,
|
|
2260
|
-
chordChromaMethodValue(request.chromaMethod ?? "stft")
|
|
2411
|
+
chordChromaMethodValue(request.chromaMethod ?? "stft"),
|
|
2412
|
+
request.tuning ?? 0
|
|
2261
2413
|
);
|
|
2262
2414
|
}
|
|
2263
2415
|
function analyze(samples, sampleRate = 22050, options = {}) {
|
|
2264
2416
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2265
2417
|
validateAnalysisInput("analyze", request.samples, request.sampleRate ?? 22050, request);
|
|
2266
|
-
const result =
|
|
2418
|
+
const result = requireModule10().analyze(request.samples, request.sampleRate ?? 22050, request);
|
|
2267
2419
|
return convertAnalysisResult(result);
|
|
2268
2420
|
}
|
|
2421
|
+
function estimateMeter(request) {
|
|
2422
|
+
return requireModule10().estimateMeter(request.beatTimes, request.beatStrengths, request);
|
|
2423
|
+
}
|
|
2269
2424
|
function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, minDecayDb) {
|
|
2270
2425
|
const request = samples instanceof Float32Array ? { samples, sampleRate, nOctaveBands, minDecayDb } : samples;
|
|
2271
|
-
if (request.minDecayDb === null) {
|
|
2272
|
-
throw new TypeError("analyzeImpulseResponse: minDecayDb must be a finite number");
|
|
2273
|
-
}
|
|
2274
2426
|
const resolvedMinDecayDb = request.minDecayDb === void 0 ? 30 : request.minDecayDb;
|
|
2275
2427
|
assertFiniteScalar("analyzeImpulseResponse", resolvedMinDecayDb, "minDecayDb");
|
|
2276
2428
|
if (resolvedMinDecayDb <= 0) {
|
|
@@ -2282,7 +2434,7 @@ function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, mi
|
|
|
2282
2434
|
request.sampleRate ?? 48e3,
|
|
2283
2435
|
request
|
|
2284
2436
|
);
|
|
2285
|
-
const result =
|
|
2437
|
+
const result = requireModule10().analyzeImpulseResponseEx(
|
|
2286
2438
|
request.samples,
|
|
2287
2439
|
request.sampleRate ?? 48e3,
|
|
2288
2440
|
request.nOctaveBands ?? 6,
|
|
@@ -2293,7 +2445,7 @@ function analyzeImpulseResponse(samples, sampleRate = 48e3, nOctaveBands = 6, mi
|
|
|
2293
2445
|
function detectAcoustic(samples, sampleRate = 48e3, options = {}) {
|
|
2294
2446
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2295
2447
|
validateAnalysisInput("detectAcoustic", request.samples, request.sampleRate ?? 48e3, request);
|
|
2296
|
-
const result =
|
|
2448
|
+
const result = requireModule10().detectAcoustic(
|
|
2297
2449
|
request.samples,
|
|
2298
2450
|
request.sampleRate ?? 48e3,
|
|
2299
2451
|
request.nOctaveBands ?? 6,
|
|
@@ -2303,17 +2455,18 @@ function detectAcoustic(samples, sampleRate = 48e3, options = {}) {
|
|
|
2303
2455
|
);
|
|
2304
2456
|
return result;
|
|
2305
2457
|
}
|
|
2306
|
-
function analyzeWithProgress(samples, sampleRate = 22050, onProgress) {
|
|
2307
|
-
const request = samples instanceof Float32Array ? { samples, sampleRate, onProgress } : samples;
|
|
2458
|
+
function analyzeWithProgress(samples, sampleRate = 22050, onProgress, options) {
|
|
2459
|
+
const request = samples instanceof Float32Array ? { samples, sampleRate, onProgress, options } : samples;
|
|
2308
2460
|
validateAnalysisInput(
|
|
2309
2461
|
"analyzeWithProgress",
|
|
2310
2462
|
request.samples,
|
|
2311
2463
|
request.sampleRate ?? 22050,
|
|
2312
2464
|
request
|
|
2313
2465
|
);
|
|
2314
|
-
const result =
|
|
2466
|
+
const result = requireModule10().analyzeWithProgress(
|
|
2315
2467
|
request.samples,
|
|
2316
2468
|
request.sampleRate ?? 22050,
|
|
2469
|
+
request.options ?? {},
|
|
2317
2470
|
request.onProgress ?? (() => {
|
|
2318
2471
|
}),
|
|
2319
2472
|
request.cancel ?? (() => false)
|
|
@@ -2324,7 +2477,7 @@ function analyzeBpm(samples, sampleRate = 22050, options = {}) {
|
|
|
2324
2477
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2325
2478
|
validateAnalysisInput("analyzeBpm", request.samples, request.sampleRate ?? 22050, request);
|
|
2326
2479
|
assertNonNegativeInteger("analyzeBpm", request.maxCandidates ?? 5, "maxCandidates");
|
|
2327
|
-
return
|
|
2480
|
+
return requireModule10().analyzeBpm(
|
|
2328
2481
|
request.samples,
|
|
2329
2482
|
request.sampleRate ?? 22050,
|
|
2330
2483
|
request.bpmMin ?? 30,
|
|
@@ -2338,7 +2491,7 @@ function analyzeBpm(samples, sampleRate = 22050, options = {}) {
|
|
|
2338
2491
|
function analyzeRhythm(samples, sampleRate = 22050, options = {}) {
|
|
2339
2492
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2340
2493
|
validateAnalysisInput("analyzeRhythm", request.samples, request.sampleRate ?? 22050, request);
|
|
2341
|
-
return
|
|
2494
|
+
return requireModule10().analyzeRhythm(
|
|
2342
2495
|
request.samples,
|
|
2343
2496
|
request.sampleRate ?? 22050,
|
|
2344
2497
|
request.bpmMin ?? 60,
|
|
@@ -2351,7 +2504,7 @@ function analyzeRhythm(samples, sampleRate = 22050, options = {}) {
|
|
|
2351
2504
|
function analyzeDynamics(samples, sampleRate = 22050, options = {}) {
|
|
2352
2505
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2353
2506
|
validateAnalysisInput("analyzeDynamics", request.samples, request.sampleRate ?? 22050, request);
|
|
2354
|
-
return
|
|
2507
|
+
return requireModule10().analyzeDynamics(
|
|
2355
2508
|
request.samples,
|
|
2356
2509
|
request.sampleRate ?? 22050,
|
|
2357
2510
|
request.windowSec ?? 0.4,
|
|
@@ -2362,7 +2515,7 @@ function analyzeDynamics(samples, sampleRate = 22050, options = {}) {
|
|
|
2362
2515
|
function analyzeTimbre(samples, sampleRate = 22050, options = {}) {
|
|
2363
2516
|
const request = samples instanceof Float32Array ? { samples, sampleRate, ...options } : samples;
|
|
2364
2517
|
validateAnalysisInput("analyzeTimbre", request.samples, request.sampleRate ?? 22050, request);
|
|
2365
|
-
return
|
|
2518
|
+
return requireModule10().analyzeTimbre(
|
|
2366
2519
|
request.samples,
|
|
2367
2520
|
request.sampleRate ?? 22050,
|
|
2368
2521
|
request.nFft ?? 2048,
|
|
@@ -2373,7 +2526,7 @@ function analyzeTimbre(samples, sampleRate = 22050, options = {}) {
|
|
|
2373
2526
|
);
|
|
2374
2527
|
}
|
|
2375
2528
|
function hasFfmpegSupport() {
|
|
2376
|
-
return
|
|
2529
|
+
return requireModule10().hasFfmpegSupport();
|
|
2377
2530
|
}
|
|
2378
2531
|
|
|
2379
2532
|
// src/analysis.ts
|
|
@@ -2437,6 +2590,7 @@ export {
|
|
|
2437
2590
|
KeyProfile,
|
|
2438
2591
|
Mode,
|
|
2439
2592
|
PitchClass,
|
|
2593
|
+
SOLO_PROCESSORS,
|
|
2440
2594
|
SectionType,
|
|
2441
2595
|
SonareError,
|
|
2442
2596
|
abiVersion,
|
|
@@ -2463,11 +2617,10 @@ export {
|
|
|
2463
2617
|
cyclicTempogram,
|
|
2464
2618
|
dbToAmplitude,
|
|
2465
2619
|
dbToPower,
|
|
2466
|
-
decompose,
|
|
2467
|
-
decomposeWithInit,
|
|
2468
2620
|
deemphasis,
|
|
2469
2621
|
detectAcoustic,
|
|
2470
2622
|
detectBeats,
|
|
2623
|
+
detectBoundaries,
|
|
2471
2624
|
detectBpm,
|
|
2472
2625
|
detectChords,
|
|
2473
2626
|
detectDownbeats,
|
|
@@ -2476,6 +2629,7 @@ export {
|
|
|
2476
2629
|
detectOnsets,
|
|
2477
2630
|
ebur128LoudnessRange,
|
|
2478
2631
|
engineAbiVersion,
|
|
2632
|
+
estimateMeter,
|
|
2479
2633
|
estimateTuning,
|
|
2480
2634
|
fixFrames,
|
|
2481
2635
|
fixLength,
|
|
@@ -2485,7 +2639,6 @@ export {
|
|
|
2485
2639
|
framesToTime,
|
|
2486
2640
|
griffinLim,
|
|
2487
2641
|
hasFfmpegSupport,
|
|
2488
|
-
hpssWithResidual,
|
|
2489
2642
|
hybridCqt,
|
|
2490
2643
|
hzToMel,
|
|
2491
2644
|
hzToMidi,
|
|
@@ -2495,6 +2648,7 @@ export {
|
|
|
2495
2648
|
isSonareError,
|
|
2496
2649
|
lufs,
|
|
2497
2650
|
lufsInterleaved,
|
|
2651
|
+
lufsSeriesInterleaved,
|
|
2498
2652
|
melDelta,
|
|
2499
2653
|
melSpectrogram,
|
|
2500
2654
|
melToAudio,
|
|
@@ -2522,7 +2676,6 @@ export {
|
|
|
2522
2676
|
mfccToMel,
|
|
2523
2677
|
midiToHz,
|
|
2524
2678
|
momentaryLufs,
|
|
2525
|
-
nnFilter,
|
|
2526
2679
|
nnlsChroma,
|
|
2527
2680
|
noteSegments,
|
|
2528
2681
|
noteToHz,
|
|
@@ -2532,7 +2685,6 @@ export {
|
|
|
2532
2685
|
padCenter,
|
|
2533
2686
|
pcen,
|
|
2534
2687
|
peakPick,
|
|
2535
|
-
phaseVocoder,
|
|
2536
2688
|
piptrack,
|
|
2537
2689
|
pitchPyin,
|
|
2538
2690
|
pitchTuning,
|
|
@@ -2543,8 +2695,6 @@ export {
|
|
|
2543
2695
|
preemphasis,
|
|
2544
2696
|
pseudoCqt,
|
|
2545
2697
|
reassignedSpectrogram,
|
|
2546
|
-
remix,
|
|
2547
|
-
resample,
|
|
2548
2698
|
rmsEnergy,
|
|
2549
2699
|
samplesToFrames,
|
|
2550
2700
|
segmentAgglomerative,
|
|
@@ -2562,6 +2712,8 @@ export {
|
|
|
2562
2712
|
spectralFlux,
|
|
2563
2713
|
spectralRolloff,
|
|
2564
2714
|
splitSilence,
|
|
2715
|
+
splitSilenceCommon,
|
|
2716
|
+
splitSilenceCommonWithReport,
|
|
2565
2717
|
stft,
|
|
2566
2718
|
stftDb,
|
|
2567
2719
|
tempogram,
|
|
@@ -2569,7 +2721,6 @@ export {
|
|
|
2569
2721
|
timeToFrames,
|
|
2570
2722
|
tone,
|
|
2571
2723
|
tonnetz,
|
|
2572
|
-
trim,
|
|
2573
2724
|
trimSilence,
|
|
2574
2725
|
vectorNormalize,
|
|
2575
2726
|
version,
|