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