@libraz/libsonare 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/public_types.ts","../src/index.ts"],"sourcesContent":["/**\n * Pitch class enum (C=0, C#=1, ..., B=11)\n */\nexport const PitchClass = {\n C: 0,\n Cs: 1,\n D: 2,\n Ds: 3,\n E: 4,\n F: 5,\n Fs: 6,\n G: 7,\n Gs: 8,\n A: 9,\n As: 10,\n B: 11,\n} as const;\n\nexport type PitchClass = (typeof PitchClass)[keyof typeof PitchClass];\n\n/**\n * Musical mode\n */\nexport const Mode = {\n Major: 0,\n Minor: 1,\n} as const;\n\nexport type Mode = (typeof Mode)[keyof typeof Mode];\n\n/**\n * Chord quality\n */\nexport const ChordQuality = {\n Major: 0,\n Minor: 1,\n Diminished: 2,\n Augmented: 3,\n Dominant7: 4,\n Major7: 5,\n Minor7: 6,\n Sus2: 7,\n Sus4: 8,\n} as const;\n\nexport type ChordQuality = (typeof ChordQuality)[keyof typeof ChordQuality];\n\n/**\n * Section type\n */\nexport const SectionType = {\n Intro: 0,\n Verse: 1,\n PreChorus: 2,\n Chorus: 3,\n Bridge: 4,\n Instrumental: 5,\n Outro: 6,\n} as const;\n\nexport type SectionType = (typeof SectionType)[keyof typeof SectionType];\n\n/**\n * Detected musical key\n */\nexport interface Key {\n root: PitchClass;\n mode: Mode;\n confidence: number;\n name: string;\n shortName: string;\n}\n\n/**\n * Detected beat\n */\nexport interface Beat {\n time: number;\n strength: number;\n}\n\n/**\n * Detected chord\n */\nexport interface Chord {\n root: PitchClass;\n quality: ChordQuality;\n start: number;\n end: number;\n confidence: number;\n name: string;\n}\n\n/**\n * Detected section\n */\nexport interface Section {\n type: SectionType;\n start: number;\n end: number;\n energyLevel: number;\n confidence: number;\n name: string;\n}\n\n/**\n * Timbre characteristics\n */\nexport interface Timbre {\n brightness: number;\n warmth: number;\n density: number;\n roughness: number;\n complexity: number;\n}\n\n/**\n * Dynamics characteristics\n */\nexport interface Dynamics {\n dynamicRangeDb: number;\n loudnessRangeDb: number;\n crestFactor: number;\n isCompressed: boolean;\n}\n\n/**\n * Time signature\n */\nexport interface TimeSignature {\n numerator: number;\n denominator: number;\n confidence: number;\n}\n\n/**\n * Rhythm features\n */\nexport interface RhythmFeatures {\n syncopation: number;\n grooveType: string;\n patternRegularity: number;\n}\n\n/**\n * Complete analysis result\n */\nexport interface AnalysisResult {\n bpm: number;\n bpmConfidence: number;\n key: Key;\n timeSignature: TimeSignature;\n beatTimes: Float32Array;\n beats: Beat[];\n chords: Chord[];\n sections: Section[];\n timbre: Timbre;\n dynamics: Dynamics;\n rhythm: RhythmFeatures;\n form: string;\n}\n\n/**\n * HPSS (Harmonic-Percussive Source Separation) result\n */\nexport interface HpssResult {\n harmonic: Float32Array;\n percussive: Float32Array;\n sampleRate: number;\n}\n\n/**\n * Mastering loudness/true-peak processing result\n */\nexport interface MasteringResult {\n samples: Float32Array;\n sampleRate: number;\n inputLufs: number;\n outputLufs: number;\n appliedGainDb: number;\n latencySamples?: number;\n}\n\nexport type MasteringProcessorParams = Record<string, number | boolean>;\n\nexport interface MasteringChainConfig {\n repair?: {\n denoise?: boolean;\n nFft?: number;\n hopLength?: number;\n ddAlpha?: number;\n gainFloor?: number;\n declick?: {\n threshold?: number;\n neighborRatio?: number;\n maxClickSamples?: number;\n lpcOrder?: number;\n residualRatio?: number;\n };\n dereverb?: {\n threshold?: number;\n attenuation?: number;\n nFft?: number;\n hopLength?: number;\n t60Sec?: number;\n lateDelayMs?: number;\n overSubtraction?: number;\n spectralFloor?: number;\n wpeEnabled?: boolean;\n wpeIterations?: number;\n wpeTaps?: number;\n wpeStrength?: number;\n };\n };\n eq?: {\n tiltDb?: number;\n pivotHz?: number;\n };\n dynamics?: {\n compressor?: {\n thresholdDb?: number;\n ratio?: number;\n attackMs?: number;\n releaseMs?: number;\n kneeDb?: number;\n makeupGainDb?: number;\n autoMakeup?: boolean;\n };\n deesser?: {\n frequencyHz?: number;\n thresholdDb?: number;\n ratio?: number;\n attackMs?: number;\n releaseMs?: number;\n rangeDb?: number;\n };\n transientShaper?: {\n attackGainDb?: number;\n sustainGainDb?: number;\n fastAttackMs?: number;\n fastReleaseMs?: number;\n slowAttackMs?: number;\n slowReleaseMs?: number;\n sensitivity?: number;\n maxGainDb?: number;\n gainSmoothingMs?: number;\n lookaheadMs?: number;\n };\n multibandComp?: {\n lowCutoffHz?: number;\n highCutoffHz?: number;\n lowThresholdDb?: number;\n lowRatio?: number;\n lowAttackMs?: number;\n lowReleaseMs?: number;\n midThresholdDb?: number;\n midRatio?: number;\n midAttackMs?: number;\n midReleaseMs?: number;\n highThresholdDb?: number;\n highRatio?: number;\n highAttackMs?: number;\n highReleaseMs?: number;\n };\n };\n saturation?: {\n tape?: {\n driveDb?: number;\n saturation?: number;\n hysteresis?: number;\n outputGainDb?: number;\n speedIps?: number;\n headBumpDb?: number;\n bias?: number;\n gapLoss?: number;\n };\n exciter?: {\n frequencyHz?: number;\n driveDb?: number;\n amount?: number;\n q?: number;\n evenOddMix?: number;\n };\n };\n spectral?: {\n airBand?: {\n amount?: number;\n shelfFrequencyHz?: number;\n dynamicThresholdDb?: number;\n dynamicRangeDb?: number;\n };\n };\n stereo?: {\n imager?: {\n width?: number;\n outputGainDb?: number;\n decorrelationAmount?: number;\n preserveEnergy?: boolean;\n };\n monoMaker?: {\n amount?: number;\n };\n };\n maximizer?: {\n truePeakLimiter?: {\n ceilingDb?: number;\n lookaheadMs?: number;\n releaseMs?: number;\n oversampleFactor?: number;\n applyGainAtInputRate?: boolean;\n };\n };\n loudness?: {\n targetLufs?: number;\n ceilingDb?: number;\n truePeakOversample?: number;\n };\n}\n\nexport interface MasteringChainResult extends MasteringResult {\n stages: string[];\n}\n\nexport interface MasteringStereoChainResult {\n left: Float32Array;\n right: Float32Array;\n sampleRate: number;\n inputLufs: number;\n outputLufs: number;\n appliedGainDb: number;\n stages: string[];\n latencySamples?: number;\n}\n\nexport interface MasteringStereoResult {\n left: Float32Array;\n right: Float32Array;\n sampleRate: number;\n inputLufs: number;\n outputLufs: number;\n appliedGainDb: number;\n latencySamples: number;\n}\n\n/**\n * STFT (Short-Time Fourier Transform) result\n */\nexport interface StftResult {\n nBins: number;\n nFrames: number;\n nFft: number;\n hopLength: number;\n sampleRate: number;\n magnitude: Float32Array;\n power: Float32Array;\n}\n\n/**\n * Mel spectrogram result\n */\nexport interface MelSpectrogramResult {\n nMels: number;\n nFrames: number;\n sampleRate: number;\n hopLength: number;\n power: Float32Array;\n db: Float32Array;\n}\n\n/**\n * MFCC result\n */\nexport interface MfccResult {\n nMfcc: number;\n nFrames: number;\n coefficients: Float32Array;\n}\n\n/**\n * Chroma features result\n */\nexport interface ChromaResult {\n nChroma: number;\n nFrames: number;\n sampleRate: number;\n hopLength: number;\n features: Float32Array;\n meanEnergy: number[];\n}\n\n/**\n * Pitch detection result\n */\nexport interface PitchResult {\n f0: Float32Array;\n voicedProb: Float32Array;\n voicedFlag: boolean[];\n nFrames: number;\n medianF0: number;\n meanF0: number;\n}\n","/**\n * sonare - Audio Analysis Library\n *\n * @example\n * ```typescript\n * import { init, detectBpm, detectKey, analyze } from '@libraz/sonare';\n *\n * await init();\n *\n * // Detect BPM from audio samples\n * const bpm = detectBpm(samples, sampleRate);\n *\n * // Detect musical key\n * const key = detectKey(samples, sampleRate);\n *\n * // Full analysis\n * const result = analyze(samples, sampleRate);\n * ```\n */\n\nimport type {\n AnalysisResult,\n ChordQuality,\n ChromaResult,\n HpssResult,\n Key,\n MasteringChainConfig,\n MasteringChainResult,\n MasteringProcessorParams,\n MasteringResult,\n MasteringStereoChainResult,\n MasteringStereoResult,\n MelSpectrogramResult,\n MfccResult,\n Mode,\n PitchClass,\n PitchResult,\n SectionType,\n StftResult,\n} from './public_types';\nimport type { AnalyzerStats, FrameBuffer, StreamConfig } from './stream_types';\nimport type {\n ProgressCallback,\n SonareModule,\n WasmAnalysisResult,\n WasmFrameResult,\n WasmStreamAnalyzer,\n WasmTempogramResult,\n WasmTrimResult,\n} from './wasm_types';\n\nexport type {\n AnalysisResult,\n Beat,\n Chord,\n ChromaResult,\n Dynamics,\n HpssResult,\n Key,\n MasteringChainConfig,\n MasteringChainResult,\n MasteringProcessorParams,\n MasteringResult,\n MasteringStereoChainResult,\n MasteringStereoResult,\n MelSpectrogramResult,\n MfccResult,\n PitchResult,\n RhythmFeatures,\n Section,\n StftResult,\n Timbre,\n TimeSignature,\n} from './public_types';\nexport {\n ChordQuality,\n Mode,\n PitchClass,\n SectionType,\n} from './public_types';\nexport type {\n AnalyzerStats,\n BarChord,\n ChordChange,\n FrameBuffer,\n PatternScore,\n ProgressiveEstimate,\n StreamConfig,\n} from './stream_types';\nexport type { ProgressCallback } from './wasm_types';\n\n// ============================================================================\n// Module State\n// ============================================================================\n\nlet module: SonareModule | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize the WASM module.\n * Must be called before using any analysis functions.\n *\n * @param options - Optional module configuration\n * @returns Promise that resolves when initialization is complete\n */\nexport async function init(options?: {\n locateFile?: (path: string, prefix: string) => string;\n}): Promise<void> {\n if (module) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async () => {\n try {\n const createModule = (await import('./sonare.js')).default;\n module = await createModule(options);\n } catch (error) {\n initPromise = null;\n throw error;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if the module is initialized.\n */\nexport function isInitialized(): boolean {\n return module !== null;\n}\n\n/**\n * Get the library version.\n */\nexport function version(): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.version();\n}\n\n// ============================================================================\n// Quick API (High-level Analysis)\n// ============================================================================\n\n/**\n * Detect BPM from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Detected BPM\n */\nexport function detectBpm(samples: Float32Array, sampleRate: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectBpm(samples, sampleRate);\n}\n\n/**\n * Detect musical key from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Detected key\n */\nexport function detectKey(samples: Float32Array, sampleRate: number): Key {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module.detectKey(samples, sampleRate);\n return {\n root: result.root as PitchClass,\n mode: result.mode as Mode,\n confidence: result.confidence,\n name: result.name,\n shortName: result.shortName,\n };\n}\n\n/**\n * Detect onset times from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Array of onset times in seconds\n */\nexport function detectOnsets(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectOnsets(samples, sampleRate);\n}\n\n/**\n * Detect beat times from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Array of beat times in seconds\n */\nexport function detectBeats(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectBeats(samples, sampleRate);\n}\n\n// Helper to convert WASM result to typed result\nfunction convertAnalysisResult(wasm: WasmAnalysisResult): AnalysisResult {\n const beatTimes = new Float32Array(wasm.beats.length);\n for (let i = 0; i < wasm.beats.length; i++) {\n beatTimes[i] = wasm.beats[i].time;\n }\n return {\n bpm: wasm.bpm,\n bpmConfidence: wasm.bpmConfidence,\n key: {\n root: wasm.key.root as PitchClass,\n mode: wasm.key.mode as Mode,\n confidence: wasm.key.confidence,\n name: wasm.key.name,\n shortName: wasm.key.shortName,\n },\n timeSignature: wasm.timeSignature,\n beatTimes,\n beats: wasm.beats,\n chords: wasm.chords.map((c) => ({\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n start: c.start,\n end: c.end,\n confidence: c.confidence,\n name: c.name,\n })),\n sections: wasm.sections.map((s) => ({\n type: s.type as SectionType,\n start: s.start,\n end: s.end,\n energyLevel: s.energyLevel,\n confidence: s.confidence,\n name: s.name,\n })),\n timbre: wasm.timbre,\n dynamics: wasm.dynamics,\n rhythm: wasm.rhythm,\n form: wasm.form,\n };\n}\n\n/**\n * Perform complete music analysis.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Complete analysis result\n */\nexport function analyze(samples: Float32Array, sampleRate: number): AnalysisResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module.analyze(samples, sampleRate);\n return convertAnalysisResult(result);\n}\n\n/**\n * Perform complete music analysis with progress reporting.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param onProgress - Progress callback (progress: 0-1, stage: string)\n * @returns Complete analysis result\n */\nexport function analyzeWithProgress(\n samples: Float32Array,\n sampleRate: number,\n onProgress: ProgressCallback,\n): AnalysisResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module.analyzeWithProgress(samples, sampleRate, onProgress);\n return convertAnalysisResult(result);\n}\n\n// ============================================================================\n// Effects\n// ============================================================================\n\n/**\n * Perform Harmonic-Percussive Source Separation (HPSS).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param kernelHarmonic - Horizontal median filter size for harmonic (default: 31)\n * @param kernelPercussive - Vertical median filter size for percussive (default: 31)\n * @returns Separated harmonic and percussive components\n */\nexport function hpss(\n samples: Float32Array,\n sampleRate: number,\n kernelHarmonic = 31,\n kernelPercussive = 31,\n): HpssResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hpss(samples, sampleRate, kernelHarmonic, kernelPercussive);\n}\n\n/**\n * Extract harmonic component from audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Harmonic component\n */\nexport function harmonic(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.harmonic(samples, sampleRate);\n}\n\n/**\n * Extract percussive component from audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Percussive component\n */\nexport function percussive(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.percussive(samples, sampleRate);\n}\n\n/**\n * Time-stretch audio without changing pitch.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param rate - Time stretch rate (0.5 = double duration, 2.0 = half duration)\n * @returns Time-stretched audio\n */\nexport function timeStretch(samples: Float32Array, sampleRate: number, rate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.timeStretch(samples, sampleRate, rate);\n}\n\n/**\n * Pitch-shift audio without changing duration.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param semitones - Pitch shift in semitones (+12 = one octave up, -12 = one octave down)\n * @returns Pitch-shifted audio\n */\nexport function pitchShift(\n samples: Float32Array,\n sampleRate: number,\n semitones: number,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchShift(samples, sampleRate, semitones);\n}\n\n/**\n * Normalize audio to target peak level.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param targetDb - Target peak level in dB (default: 0 dB = full scale)\n * @returns Normalized audio\n */\nexport function normalize(samples: Float32Array, sampleRate: number, targetDb = 0.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.normalize(samples, sampleRate, targetDb);\n}\n\n/**\n * Apply mastering loudness normalization with a true-peak ceiling.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param targetLufs - Target integrated LUFS (default: -14)\n * @param ceilingDb - True/sample peak ceiling in dBFS (default: -1)\n * @param truePeakOversample - Oversampling factor used for peak estimation\n * @returns Processed audio and loudness metadata\n */\nexport function mastering(\n samples: Float32Array,\n sampleRate: number,\n targetLufs = -14.0,\n ceilingDb = -1.0,\n truePeakOversample = 4,\n): MasteringResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mastering(samples, sampleRate, targetLufs, ceilingDb, truePeakOversample);\n}\n\nexport function masteringProcessorNames(): string[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringProcessorNames();\n}\n\nexport function masteringPairProcessorNames(): string[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairProcessorNames();\n}\n\nexport function masteringPairAnalysisNames(): string[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairAnalysisNames();\n}\n\nexport function masteringStereoAnalysisNames(): string[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringStereoAnalysisNames();\n}\n\nexport function masteringProcess(\n processorName: string,\n samples: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): MasteringResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringProcess(processorName, samples, sampleRate, params);\n}\n\nexport function masteringProcessStereo(\n processorName: string,\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): MasteringStereoResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masteringProcessStereo(processorName, left, right, sampleRate, params);\n}\n\nexport function masteringPairProcess(\n processorName: string,\n source: Float32Array,\n reference: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): MasteringResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairProcess(processorName, source, reference, sampleRate, params);\n}\n\nexport function masteringPairAnalyze(\n analysisName: string,\n source: Float32Array,\n reference: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairAnalyze(analysisName, source, reference, sampleRate, params);\n}\n\nexport function masteringStereoAnalyze(\n analysisName: string,\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringStereoAnalyze(analysisName, left, right, sampleRate, params);\n}\n\n/**\n * Apply a configurable mastering chain in WASM.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @returns Processed audio, loudness metadata, and applied stage names\n */\nexport function masteringChain(\n samples: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n): MasteringChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringChain(samples, sampleRate, config as Record<string, unknown>);\n}\n\n/**\n * Apply a configurable stereo mastering chain in WASM.\n *\n * @param left - Left channel samples\n * @param right - Right channel samples\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @returns Processed stereo audio, loudness metadata, and applied stage names\n */\nexport function masteringChainStereo(\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n): MasteringStereoChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masteringChainStereo(left, right, sampleRate, config as Record<string, unknown>);\n}\n\n/**\n * Apply a configurable mastering chain in WASM with progress reporting.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @param onProgress - Progress callback (progress: 0-1, stage: string)\n * @returns Processed audio, loudness metadata, and applied stage names\n */\nexport function masteringChainWithProgress(\n samples: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n onProgress: ProgressCallback,\n): MasteringChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringChainWithProgress(\n samples,\n sampleRate,\n config as Record<string, unknown>,\n onProgress,\n );\n}\n\n/**\n * Apply a configurable stereo mastering chain in WASM with progress reporting.\n *\n * @param left - Left channel samples\n * @param right - Right channel samples\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @param onProgress - Progress callback (progress: 0-1, stage: string)\n * @returns Processed stereo audio, loudness metadata, and applied stage names\n */\nexport function masteringChainStereoWithProgress(\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n onProgress: ProgressCallback,\n): MasteringStereoChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masteringChainStereoWithProgress(\n left,\n right,\n sampleRate,\n config as Record<string, unknown>,\n onProgress,\n );\n}\n\n/**\n * List built-in mastering preset identifiers.\n *\n * @returns Preset names in display order (e.g. \"pop\", \"edm\", \"aiMusic\")\n */\nexport function masteringPresetNames(): string[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPresetNames();\n}\n\n/**\n * Apply a named mastering preset chain to mono audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param presetName - Preset identifier from {@link masteringPresetNames}\n * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.\n * @returns Processed audio, loudness metadata, and applied stage names\n */\nexport function masterAudio(\n samples: Float32Array,\n sampleRate: number,\n presetName: string,\n overrides: Record<string, number | boolean> | null = null,\n): MasteringChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masterAudio(presetName, samples, sampleRate, overrides);\n}\n\n/**\n * Apply a named mastering preset chain to stereo audio.\n *\n * @param left - Left channel samples\n * @param right - Right channel samples\n * @param sampleRate - Sample rate in Hz\n * @param presetName - Preset identifier from {@link masteringPresetNames}\n * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.\n * @returns Processed stereo audio, loudness metadata, and applied stage names\n */\nexport function masterAudioStereo(\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n presetName: string,\n overrides: Record<string, number | boolean> | null = null,\n): MasteringStereoChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masterAudioStereo(presetName, left, right, sampleRate, overrides);\n}\n\n// ============================================================================\n// StreamingMasteringChain Class\n// ============================================================================\n\n/**\n * Block-by-block streaming variant of {@link masteringChain}.\n *\n * Maintains processor state across {@link processMono}/{@link processStereo}\n * calls. Only ProcessorBase-backed stages are supported. Configurations that\n * enable `repair.denoise` or `loudness` throw at construction.\n *\n * Call {@link delete} (or use a `try/finally`) to release the underlying WASM\n * object — the embind handle is not garbage-collected automatically.\n *\n * @example\n * ```typescript\n * const chain = new StreamingMasteringChain({ eq: { tiltDb: 1.0 } });\n * try {\n * chain.prepare(44100, 512, 1);\n * const out = chain.processMono(blockSamples);\n * } finally {\n * chain.delete();\n * }\n * ```\n */\nexport class StreamingMasteringChain {\n private chain: import('./wasm_types').WasmStreamingMasteringChain;\n\n constructor(config: MasteringChainConfig) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n this.chain = module.createStreamingMasteringChain(config as Record<string, unknown>);\n }\n\n /**\n * Initialize processors for the given sample rate and block layout.\n *\n * @param sampleRate - Sample rate in Hz\n * @param maxBlockSize - Maximum block size per process call\n * @param numChannels - 1 (mono) or 2 (stereo)\n */\n prepare(sampleRate: number, maxBlockSize: number, numChannels: number): void {\n this.chain.prepare(sampleRate, maxBlockSize, numChannels);\n }\n\n /**\n * Process one mono block, returning the processed samples (same length).\n */\n processMono(samples: Float32Array): Float32Array {\n return this.chain.processMono(samples);\n }\n\n /**\n * Process one stereo block, returning the processed channels.\n */\n processStereo(\n left: Float32Array,\n right: Float32Array,\n ): { left: Float32Array; right: Float32Array } {\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return this.chain.processStereo(left, right);\n }\n\n /** Reset all processor state without rebuilding. */\n reset(): void {\n this.chain.reset();\n }\n\n /** Total reported latency in samples across all active processors. */\n latencySamples(): number {\n return this.chain.latencySamples();\n }\n\n /** Ordered stage names that will run (e.g. `\"eq.tilt\"`). */\n stageNames(): string[] {\n return this.chain.stageNames();\n }\n\n /** Release the underlying WASM object. Safe to call only once. */\n delete(): void {\n this.chain.delete();\n }\n}\n\n/**\n * Trim silence from beginning and end of audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param thresholdDb - Silence threshold in dB (default: -60 dB)\n * @returns Trimmed audio\n */\nexport function trim(samples: Float32Array, sampleRate: number, thresholdDb = -60.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.trim(samples, sampleRate, thresholdDb);\n}\n\n// ============================================================================\n// Features - Spectrogram\n// ============================================================================\n\n/**\n * Compute Short-Time Fourier Transform (STFT).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns STFT result with magnitude and power spectrograms\n */\nexport function stft(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): StftResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.stft(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute STFT and return magnitude in decibels.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns STFT result with dB values\n */\nexport function stftDb(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): { nBins: number; nFrames: number; db: Float32Array } {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.stftDb(samples, sampleRate, nFft, hopLength);\n}\n\n// ============================================================================\n// Features - Mel Spectrogram\n// ============================================================================\n\n/**\n * Compute Mel spectrogram.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nMels - Number of Mel bands (default: 128)\n * @returns Mel spectrogram result\n */\nexport function melSpectrogram(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n nMels = 128,\n): MelSpectrogramResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.melSpectrogram(samples, sampleRate, nFft, hopLength, nMels);\n}\n\n/**\n * Compute MFCC (Mel-Frequency Cepstral Coefficients).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nMels - Number of Mel bands (default: 128)\n * @param nMfcc - Number of MFCC coefficients (default: 13)\n * @returns MFCC result\n */\nexport function mfcc(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n nMels = 128,\n nMfcc = 13,\n): MfccResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mfcc(samples, sampleRate, nFft, hopLength, nMels, nMfcc);\n}\n\n// ============================================================================\n// Features - Chroma\n// ============================================================================\n\n/**\n * Compute chromagram (pitch class distribution).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Chroma features result\n */\nexport function chroma(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): ChromaResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.chroma(samples, sampleRate, nFft, hopLength);\n}\n\n// ============================================================================\n// Features - Spectral\n// ============================================================================\n\n/**\n * Compute spectral centroid (center of mass of spectrum).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Spectral centroid in Hz for each frame\n */\nexport function spectralCentroid(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralCentroid(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute spectral bandwidth.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Spectral bandwidth in Hz for each frame\n */\nexport function spectralBandwidth(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralBandwidth(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute spectral rolloff frequency.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param rollPercent - Percentage threshold (default: 0.85)\n * @returns Rolloff frequency in Hz for each frame\n */\nexport function spectralRolloff(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n rollPercent = 0.85,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralRolloff(samples, sampleRate, nFft, hopLength, rollPercent);\n}\n\n/**\n * Compute spectral flatness.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Spectral flatness for each frame (0 = tonal, 1 = noise-like)\n */\nexport function spectralFlatness(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralFlatness(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute zero crossing rate.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Zero crossing rate for each frame\n */\nexport function zeroCrossingRate(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.zeroCrossingRate(samples, sampleRate, frameLength, hopLength);\n}\n\n/**\n * Compute RMS energy.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns RMS energy for each frame\n */\nexport function rmsEnergy(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.rmsEnergy(samples, sampleRate, frameLength, hopLength);\n}\n\n// ============================================================================\n// Features - Pitch\n// ============================================================================\n\n/**\n * Detect pitch using YIN algorithm.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param fmin - Minimum frequency in Hz (default: 65)\n * @param fmax - Maximum frequency in Hz (default: 2093)\n * @param threshold - YIN threshold (default: 0.3)\n * @returns Pitch detection result\n */\nexport function pitchYin(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n): PitchResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchYin(samples, sampleRate, frameLength, hopLength, fmin, fmax, threshold);\n}\n\n/**\n * Detect pitch using pYIN algorithm (probabilistic YIN with HMM smoothing).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param fmin - Minimum frequency in Hz (default: 65)\n * @param fmax - Maximum frequency in Hz (default: 2093)\n * @param threshold - YIN threshold (default: 0.3)\n * @returns Pitch detection result\n */\nexport function pitchPyin(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n): PitchResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchPyin(samples, sampleRate, frameLength, hopLength, fmin, fmax, threshold);\n}\n\n// ============================================================================\n// Core - Unit Conversion\n// ============================================================================\n\n/**\n * Convert frequency in Hz to Mel scale.\n *\n * @param hz - Frequency in Hz\n * @returns Mel frequency\n */\nexport function hzToMel(hz: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hzToMel(hz);\n}\n\n/**\n * Convert Mel scale to frequency in Hz.\n *\n * @param mel - Mel frequency\n * @returns Frequency in Hz\n */\nexport function melToHz(mel: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.melToHz(mel);\n}\n\n/**\n * Convert frequency in Hz to MIDI note number.\n *\n * @param hz - Frequency in Hz\n * @returns MIDI note number (A4 = 440 Hz = 69)\n */\nexport function hzToMidi(hz: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hzToMidi(hz);\n}\n\n/**\n * Convert MIDI note number to frequency in Hz.\n *\n * @param midi - MIDI note number\n * @returns Frequency in Hz\n */\nexport function midiToHz(midi: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.midiToHz(midi);\n}\n\n/**\n * Convert frequency in Hz to note name.\n *\n * @param hz - Frequency in Hz\n * @returns Note name (e.g., \"A4\", \"C#5\")\n */\nexport function hzToNote(hz: number): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hzToNote(hz);\n}\n\n/**\n * Convert note name to frequency in Hz.\n *\n * @param note - Note name (e.g., \"A4\", \"C#5\")\n * @returns Frequency in Hz\n */\nexport function noteToHz(note: string): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.noteToHz(note);\n}\n\n/**\n * Convert frame index to time in seconds.\n *\n * @param frames - Frame index\n * @param sr - Sample rate in Hz\n * @param hopLength - Hop length in samples\n * @returns Time in seconds\n */\nexport function framesToTime(frames: number, sr: number, hopLength: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.framesToTime(frames, sr, hopLength);\n}\n\n/**\n * Convert time in seconds to frame index.\n *\n * @param time - Time in seconds\n * @param sr - Sample rate in Hz\n * @param hopLength - Hop length in samples\n * @returns Frame index\n */\nexport function timeToFrames(time: number, sr: number, hopLength: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.timeToFrames(time, sr, hopLength);\n}\n\nexport function framesToSamples(frames: number, hopLength = 512, nFft = 0): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.framesToSamples(frames, hopLength, nFft);\n}\n\nexport function samplesToFrames(samples: number, hopLength = 512, nFft = 0): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.samplesToFrames(samples, hopLength, nFft);\n}\n\nexport function powerToDb(\n values: Float32Array,\n ref = 1.0,\n amin = 1e-10,\n topDb = 80.0,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.powerToDb(values, ref, amin, topDb);\n}\n\nexport function amplitudeToDb(\n values: Float32Array,\n ref = 1.0,\n amin = 1e-5,\n topDb = 80.0,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.amplitudeToDb(values, ref, amin, topDb);\n}\n\nexport function dbToPower(values: Float32Array, ref = 1.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.dbToPower(values, ref);\n}\n\nexport function dbToAmplitude(values: Float32Array, ref = 1.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.dbToAmplitude(values, ref);\n}\n\nexport function preemphasis(samples: Float32Array, coef = 0.97, zi?: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.preemphasis(samples, coef, zi ?? null);\n}\n\nexport function deemphasis(samples: Float32Array, coef = 0.97, zi?: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.deemphasis(samples, coef, zi ?? null);\n}\n\nexport function trimSilence(\n samples: Float32Array,\n topDb = 60.0,\n frameLength = 2048,\n hopLength = 512,\n): WasmTrimResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.trimSilence(samples, topDb, frameLength, hopLength);\n}\n\nexport function splitSilence(\n samples: Float32Array,\n topDb = 60.0,\n frameLength = 2048,\n hopLength = 512,\n): Int32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.splitSilence(samples, topDb, frameLength, hopLength);\n}\n\nexport function frameSignal(\n samples: Float32Array,\n frameLength: number,\n hopLength: number,\n): WasmFrameResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.frameSignal(samples, frameLength, hopLength);\n}\n\nexport function padCenter(values: Float32Array, size: number, padValue = 0.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.padCenter(values, size, padValue);\n}\n\nexport function fixLength(values: Float32Array, size: number, padValue = 0.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.fixLength(values, size, padValue);\n}\n\nexport function fixFrames(frames: Int32Array, xMin = 0, xMax = -1, pad = true): Int32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.fixFrames(frames, xMin, xMax, pad);\n}\n\nexport function peakPick(\n values: Float32Array,\n preMax: number,\n postMax: number,\n preAvg: number,\n postAvg: number,\n delta: number,\n wait: number,\n): Int32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.peakPick(values, preMax, postMax, preAvg, postAvg, delta, wait);\n}\n\nexport function vectorNormalize(\n values: Float32Array,\n normType = 0,\n threshold = 1e-12,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.vectorNormalize(values, normType, threshold);\n}\n\nexport function pcen(\n values: Float32Array,\n nBins: number,\n nFrames: number,\n options: Record<string, number> = {},\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pcen(values, nBins, nFrames, options);\n}\n\nexport function tonnetz(chromagram: Float32Array, nChroma: number, nFrames: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.tonnetz(chromagram, nChroma, nFrames);\n}\n\nexport function tempogram(\n onsetEnvelope: Float32Array,\n sampleRate: number,\n hopLength = 512,\n winLength = 384,\n): WasmTempogramResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.tempogram(onsetEnvelope, sampleRate, hopLength, winLength);\n}\n\nexport function plp(\n onsetEnvelope: Float32Array,\n sampleRate: number,\n hopLength = 512,\n tempoMin = 30.0,\n tempoMax = 300.0,\n winLength = 384,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.plp(onsetEnvelope, sampleRate, hopLength, tempoMin, tempoMax, winLength);\n}\n\n// ============================================================================\n// Core - Resample\n// ============================================================================\n\n/**\n * Resample audio to a different sample rate.\n *\n * @param samples - Audio samples (mono, float32)\n * @param srcSr - Source sample rate in Hz\n * @param targetSr - Target sample rate in Hz\n * @returns Resampled audio\n */\nexport function resample(samples: Float32Array, srcSr: number, targetSr: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.resample(samples, srcSr, targetSr);\n}\n\n// ============================================================================\n// Audio Class\n// ============================================================================\n\n/**\n * Wrapper around audio data that exposes all analysis and feature functions as instance methods.\n *\n * @example\n * ```typescript\n * import { init, Audio } from '@libraz/sonare';\n *\n * await init();\n *\n * const audio = Audio.fromBuffer(samples, 44100);\n * console.log('BPM:', audio.detectBpm());\n * console.log('Key:', audio.detectKey().name);\n *\n * const mel = audio.melSpectrogram();\n * ```\n */\nexport class Audio {\n private _samples: Float32Array;\n private _sampleRate: number;\n\n private constructor(samples: Float32Array, sampleRate: number) {\n this._samples = samples;\n this._sampleRate = sampleRate;\n }\n\n /** Create an Audio instance from raw sample data. */\n static fromBuffer(samples: Float32Array, sampleRate: number): Audio {\n return new Audio(samples, sampleRate);\n }\n\n /** The raw audio samples. */\n get data(): Float32Array {\n return this._samples;\n }\n\n /** Number of samples. */\n get length(): number {\n return this._samples.length;\n }\n\n /** Sample rate in Hz. */\n get sampleRate(): number {\n return this._sampleRate;\n }\n\n /** Duration in seconds. */\n get duration(): number {\n return this._samples.length / this._sampleRate;\n }\n\n // -- Analysis --\n\n detectBpm(): number {\n return detectBpm(this._samples, this._sampleRate);\n }\n\n detectKey(): Key {\n return detectKey(this._samples, this._sampleRate);\n }\n\n detectOnsets(): Float32Array {\n return detectOnsets(this._samples, this._sampleRate);\n }\n\n detectBeats(): Float32Array {\n return detectBeats(this._samples, this._sampleRate);\n }\n\n analyze(): AnalysisResult {\n return analyze(this._samples, this._sampleRate);\n }\n\n analyzeWithProgress(onProgress: ProgressCallback): AnalysisResult {\n return analyzeWithProgress(this._samples, this._sampleRate, onProgress);\n }\n\n // -- Effects --\n\n hpss(kernelHarmonic = 31, kernelPercussive = 31): HpssResult {\n return hpss(this._samples, this._sampleRate, kernelHarmonic, kernelPercussive);\n }\n\n harmonic(): Float32Array {\n return harmonic(this._samples, this._sampleRate);\n }\n\n percussive(): Float32Array {\n return percussive(this._samples, this._sampleRate);\n }\n\n timeStretch(rate: number): Float32Array {\n return timeStretch(this._samples, this._sampleRate, rate);\n }\n\n pitchShift(semitones: number): Float32Array {\n return pitchShift(this._samples, this._sampleRate, semitones);\n }\n\n normalize(targetDb = 0.0): Float32Array {\n return normalize(this._samples, this._sampleRate, targetDb);\n }\n\n mastering(targetLufs = -14.0, ceilingDb = -1.0, truePeakOversample = 4): MasteringResult {\n return mastering(this._samples, this._sampleRate, targetLufs, ceilingDb, truePeakOversample);\n }\n\n masteringChain(config: MasteringChainConfig): MasteringChainResult {\n return masteringChain(this._samples, this._sampleRate, config);\n }\n\n masterAudio(\n presetName: string,\n overrides: Record<string, number | boolean> | null = null,\n ): MasteringChainResult {\n return masterAudio(this._samples, this._sampleRate, presetName, overrides);\n }\n\n masteringProcess(processorName: string, params: MasteringProcessorParams = {}): MasteringResult {\n return masteringProcess(processorName, this._samples, this._sampleRate, params);\n }\n\n trim(thresholdDb = -60.0): Float32Array {\n return trim(this._samples, this._sampleRate, thresholdDb);\n }\n\n // -- Features --\n\n stft(nFft = 2048, hopLength = 512): StftResult {\n return stft(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n stftDb(nFft = 2048, hopLength = 512): { nBins: number; nFrames: number; db: Float32Array } {\n return stftDb(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n melSpectrogram(nFft = 2048, hopLength = 512, nMels = 128): MelSpectrogramResult {\n return melSpectrogram(this._samples, this._sampleRate, nFft, hopLength, nMels);\n }\n\n mfcc(nFft = 2048, hopLength = 512, nMels = 128, nMfcc = 13): MfccResult {\n return mfcc(this._samples, this._sampleRate, nFft, hopLength, nMels, nMfcc);\n }\n\n chroma(nFft = 2048, hopLength = 512): ChromaResult {\n return chroma(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n spectralCentroid(nFft = 2048, hopLength = 512): Float32Array {\n return spectralCentroid(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n spectralBandwidth(nFft = 2048, hopLength = 512): Float32Array {\n return spectralBandwidth(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n spectralRolloff(nFft = 2048, hopLength = 512, rollPercent = 0.85): Float32Array {\n return spectralRolloff(this._samples, this._sampleRate, nFft, hopLength, rollPercent);\n }\n\n spectralFlatness(nFft = 2048, hopLength = 512): Float32Array {\n return spectralFlatness(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n zeroCrossingRate(frameLength = 2048, hopLength = 512): Float32Array {\n return zeroCrossingRate(this._samples, this._sampleRate, frameLength, hopLength);\n }\n\n rmsEnergy(frameLength = 2048, hopLength = 512): Float32Array {\n return rmsEnergy(this._samples, this._sampleRate, frameLength, hopLength);\n }\n\n pitchYin(\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n ): PitchResult {\n return pitchYin(this._samples, this._sampleRate, frameLength, hopLength, fmin, fmax, threshold);\n }\n\n pitchPyin(\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n ): PitchResult {\n return pitchPyin(\n this._samples,\n this._sampleRate,\n frameLength,\n hopLength,\n fmin,\n fmax,\n threshold,\n );\n }\n\n resample(targetSr: number): Float32Array {\n return resample(this._samples, this._sampleRate, targetSr);\n }\n}\n\n// ============================================================================\n// StreamAnalyzer Class\n// ============================================================================\n\n/**\n * Real-time streaming audio analyzer.\n *\n * @example\n * ```typescript\n * import { init, StreamAnalyzer } from '@libraz/sonare';\n *\n * await init();\n *\n * const analyzer = new StreamAnalyzer({ sampleRate: 44100 });\n *\n * // In audio processing callback\n * analyzer.process(samples);\n *\n * // Get current analysis state\n * const stats = analyzer.stats();\n * console.log('BPM:', stats.estimate.bpm);\n * console.log('Key:', stats.estimate.key);\n * console.log('Chord progression:', stats.estimate.chordProgression);\n * ```\n */\nexport class StreamAnalyzer {\n private analyzer: WasmStreamAnalyzer;\n\n /**\n * Create a new StreamAnalyzer.\n *\n * @param config - Configuration options\n */\n constructor(config: StreamConfig) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n this.analyzer = new module.StreamAnalyzer(\n config.sampleRate,\n config.nFft ?? 2048,\n config.hopLength ?? 512,\n config.nMels ?? 128,\n config.computeMel ?? true,\n config.computeChroma ?? true,\n config.computeOnset ?? true,\n config.emitEveryNFrames ?? 1,\n );\n }\n\n /**\n * Process audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n */\n process(samples: Float32Array): void {\n this.analyzer.process(samples);\n }\n\n /**\n * Process audio samples with explicit sample offset.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleOffset - Cumulative sample count at start of this chunk\n */\n processWithOffset(samples: Float32Array, sampleOffset: number): void {\n this.analyzer.processWithOffset(samples, sampleOffset);\n }\n\n /**\n * Get the number of frames available to read.\n */\n availableFrames(): number {\n return this.analyzer.availableFrames();\n }\n\n /**\n * Read processed frames as Structure of Arrays.\n *\n * @param maxFrames - Maximum number of frames to read\n * @returns Frame buffer with analysis results\n */\n readFrames(maxFrames: number): FrameBuffer {\n return this.analyzer.readFramesSoa(maxFrames);\n }\n\n /**\n * Reset the analyzer state.\n *\n * @param baseSampleOffset - Starting sample offset (default 0)\n */\n reset(baseSampleOffset = 0): void {\n this.analyzer.reset(baseSampleOffset);\n }\n\n /**\n * Get current statistics and progressive estimates.\n *\n * @returns Analyzer statistics including BPM, key, and chord progression\n */\n stats(): AnalyzerStats {\n const s = this.analyzer.stats();\n return {\n totalFrames: s.totalFrames,\n totalSamples: s.totalSamples,\n durationSeconds: s.durationSeconds,\n estimate: {\n bpm: s.estimate.bpm,\n bpmConfidence: s.estimate.bpmConfidence,\n bpmCandidateCount: s.estimate.bpmCandidateCount,\n key: s.estimate.key as PitchClass,\n keyMinor: s.estimate.keyMinor,\n keyConfidence: s.estimate.keyConfidence,\n chordRoot: s.estimate.chordRoot as PitchClass,\n chordQuality: s.estimate.chordQuality as ChordQuality,\n chordConfidence: s.estimate.chordConfidence,\n chordProgression: s.estimate.chordProgression.map((c) => ({\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n startTime: c.startTime,\n confidence: c.confidence,\n })),\n barChordProgression: s.estimate.barChordProgression.map((c) => ({\n barIndex: c.barIndex,\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n startTime: c.startTime,\n confidence: c.confidence,\n })),\n currentBar: s.estimate.currentBar,\n barDuration: s.estimate.barDuration,\n votedPattern: (s.estimate.votedPattern || []).map((c) => ({\n barIndex: c.barIndex,\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n startTime: c.startTime,\n confidence: c.confidence,\n })),\n patternLength: s.estimate.patternLength,\n detectedPatternName: s.estimate.detectedPatternName || '',\n detectedPatternScore: s.estimate.detectedPatternScore || 0,\n allPatternScores: (s.estimate.allPatternScores || []).map((p) => ({\n name: p.name,\n score: p.score,\n })),\n accumulatedSeconds: s.estimate.accumulatedSeconds,\n usedFrames: s.estimate.usedFrames,\n updated: s.estimate.updated,\n },\n };\n }\n\n /**\n * Get total frames processed.\n */\n frameCount(): number {\n return this.analyzer.frameCount();\n }\n\n /**\n * Get current time position in seconds.\n */\n currentTime(): number {\n return this.analyzer.currentTime();\n }\n\n /**\n * Get the sample rate.\n */\n sampleRate(): number {\n return this.analyzer.sampleRate();\n }\n\n /**\n * Set the expected total duration for pattern lock timing.\n *\n * @param durationSeconds - Total duration in seconds\n */\n setExpectedDuration(durationSeconds: number): void {\n this.analyzer.setExpectedDuration(durationSeconds);\n }\n\n /**\n * Set normalization gain for loud/compressed audio.\n *\n * @param gain - Gain factor to apply (e.g., 0.5 for -6dB reduction)\n */\n setNormalizationGain(gain: number): void {\n this.analyzer.setNormalizationGain(gain);\n }\n\n /**\n * Set tuning reference frequency for non-standard tuning.\n *\n * @param refHz - Reference frequency for A4 (default 440 Hz)\n * @example\n * // If audio is 1 semitone sharp (A4 = 466.16 Hz)\n * analyzer.setTuningRefHz(466.16);\n * // If audio is 1 semitone flat (A4 = 415.30 Hz)\n * analyzer.setTuningRefHz(415.30);\n */\n setTuningRefHz(refHz: number): void {\n this.analyzer.setTuningRefHz(refHz);\n }\n\n /**\n * Release resources. Call when done using the analyzer.\n */\n dispose(): void {\n this.analyzer.delete();\n }\n}\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport { PitchClass as Pitch } from './public_types';\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/public_types.ts","../src/index.ts"],"sourcesContent":["/**\n * Pitch class enum (C=0, C#=1, ..., B=11)\n */\nexport const PitchClass = {\n C: 0,\n Cs: 1,\n D: 2,\n Ds: 3,\n E: 4,\n F: 5,\n Fs: 6,\n G: 7,\n Gs: 8,\n A: 9,\n As: 10,\n B: 11,\n} as const;\n\nexport type PitchClass = (typeof PitchClass)[keyof typeof PitchClass];\n\n/**\n * Musical mode\n */\nexport const Mode = {\n Major: 0,\n Minor: 1,\n Dorian: 2,\n Phrygian: 3,\n Lydian: 4,\n Mixolydian: 5,\n Locrian: 6,\n} as const;\n\nexport type Mode = (typeof Mode)[keyof typeof Mode];\n\nexport type TempogramMode = 'autocorrelation' | 'auto' | 'ac' | 'cosine' | 0 | 1;\n\nexport const KeyProfile = {\n KrumhanslSchmuckler: 0,\n Temperley: 1,\n Shaath: 2,\n FaraldoEDMT: 3,\n FaraldoEDMA: 4,\n FaraldoEDMM: 5,\n BellmanBudge: 6,\n} as const;\n\nexport type KeyProfile = (typeof KeyProfile)[keyof typeof KeyProfile];\n\nexport type KeyProfileName =\n | 'ks'\n | 'krumhansl'\n | 'temperley'\n | 'shaath'\n | 'keyfinder'\n | 'faraldo-edmt'\n | 'edmt'\n | 'faraldo-edma'\n | 'edma'\n | 'faraldo-edmm'\n | 'edmm'\n | 'bellman-budge'\n | 'bellman';\n\n/**\n * Chord quality\n */\nexport const ChordQuality = {\n Major: 0,\n Minor: 1,\n Diminished: 2,\n Augmented: 3,\n Dominant7: 4,\n Major7: 5,\n Minor7: 6,\n Sus2: 7,\n Sus4: 8,\n Unknown: 9,\n Add9: 10,\n MinorAdd9: 11,\n Dim7: 12,\n HalfDim7: 13,\n Major9: 14,\n Dominant9: 15,\n Sus2Add4: 16,\n} as const;\n\nexport type ChordQuality = (typeof ChordQuality)[keyof typeof ChordQuality];\n\nexport type MasteringPreset =\n | 'pop'\n | 'edm'\n | 'acoustic'\n | 'hipHop'\n | 'aiMusic'\n | 'speech'\n | 'streaming'\n | 'youtube'\n | 'broadcast'\n | 'podcast'\n | 'audiobook'\n | 'cinema'\n | 'jpop'\n | 'ambient'\n | 'lofi'\n | 'classical'\n | 'drumAndBass'\n | 'techno'\n | 'metal'\n | 'trap'\n | 'rnb'\n | 'jazz'\n | 'kpop'\n | 'trance'\n | 'gameOst';\n\nexport interface StreamingPlatform {\n name: string;\n targetLufs: number;\n ceilingDb: number;\n}\n\nexport type SoloProcessor =\n | 'dynamics.brickwallLimiter'\n | 'dynamics.compressor'\n | 'dynamics.deesser'\n | 'dynamics.expander'\n | 'dynamics.gate'\n | 'dynamics.limiter'\n | 'dynamics.parallelComp'\n | 'dynamics.sidechainRouter'\n | 'dynamics.duckingProcessor'\n | 'dynamics.transientShaper'\n | 'dynamics.upwardCompressor'\n | 'dynamics.upwardExpander'\n | 'dynamics.vocalRider'\n | 'eq.apiStyle'\n | 'eq.bandPass'\n | 'eq.cutFilter'\n | 'eq.dynamic'\n | 'eq.equalizer'\n | 'eq.graphic'\n | 'eq.linearPhase'\n | 'eq.midSide'\n | 'eq.minimumPhase'\n | 'eq.parametric'\n | 'eq.pultec'\n | 'eq.shelving'\n | 'eq.tilt'\n | 'final.bitDepth'\n | 'final.dither'\n | 'final.outputChain'\n | 'maximizer.adaptiveRelease'\n | 'maximizer.loudnessOptimize'\n | 'maximizer.maximizer'\n | 'maximizer.softKneeMax'\n | 'maximizer.truePeakLimiter'\n | 'multiband.compressor'\n | 'multiband.dynamicEq'\n | 'multiband.expander'\n | 'multiband.imager'\n | 'multiband.limiter'\n | 'multiband.saturation'\n | 'repair.declick'\n | 'repair.declip'\n | 'repair.decrackle'\n | 'repair.dehum'\n | 'repair.denoiseClassical'\n | 'repair.dereverbClassical'\n | 'repair.trimSilence'\n | 'saturation.bitcrusher'\n | 'saturation.exciter'\n | 'saturation.hardClipper'\n | 'saturation.multibandExciter'\n | 'saturation.softClipper'\n | 'saturation.tape'\n | 'saturation.transformer'\n | 'saturation.tube'\n | 'saturation.waveshaper'\n | 'spectral.airBand'\n | 'spectral.lowEndFocus'\n | 'spectral.presenceEnhancer'\n | 'spectral.spectralShaper'\n | 'stereo.autoPan'\n | 'stereo.haasEnhancer'\n | 'stereo.imager'\n | 'stereo.monoMaker'\n | 'stereo.phaseAlign'\n | 'stereo.stereoBalance';\n\nexport type PairProcessor =\n | 'match.applyMatchEq'\n | 'match.alignReferenceToSource'\n | 'match.abSwitch'\n | 'match.abCrossfade';\n\nexport type PairAnalysis =\n | 'match.referenceLoudness'\n | 'match.tonalBalance'\n | 'match.tonalBalanceLogBands'\n | 'match.matchEqCurve'\n | 'match.estimateReferenceDelaySamples';\n\nexport type StereoAnalysis = 'stereo.monoCompatCheck' | 'stereo.monoCompatCheckLogBands';\n\n/**\n * Section type\n */\nexport const SectionType = {\n Intro: 0,\n Verse: 1,\n PreChorus: 2,\n Chorus: 3,\n Bridge: 4,\n Instrumental: 5,\n Outro: 6,\n Unknown: 7,\n} as const;\n\nexport type SectionType = (typeof SectionType)[keyof typeof SectionType];\n\n/**\n * Detected musical key\n */\nexport interface Key {\n root: PitchClass;\n mode: Mode;\n confidence: number;\n name: string;\n shortName: string;\n}\n\nexport interface KeyDetectionOptions {\n nFft?: number;\n hopLength?: number;\n useHpss?: boolean;\n loudnessWeighted?: boolean;\n highPassHz?: number;\n modes?:\n | Mode[]\n | ('major' | 'minor' | 'dorian' | 'phrygian' | 'lydian' | 'mixolydian' | 'locrian')[]\n | 'major-minor'\n | 'all'\n | 'modal';\n profile?: KeyProfile | KeyProfileName;\n genreHint?: 'auto' | 'edm' | 'electronic' | 'dance' | 'pop' | 'classical' | 'jazz' | string;\n}\n\nexport interface KeyCandidate {\n key: Key;\n correlation: number;\n}\n\nexport interface ChordDetectionOptions {\n minDuration?: number;\n smoothingWindow?: number;\n threshold?: number;\n useTriadsOnly?: boolean;\n nFft?: number;\n hopLength?: number;\n useBeatSync?: boolean;\n useHmm?: boolean;\n hmmBeamWidth?: number;\n useKeyContext?: boolean;\n keyRoot?: PitchClass;\n keyMode?: Mode;\n detectInversions?: boolean;\n chromaMethod?: 'stft' | 'nnls';\n}\n\n/**\n * Detected beat\n */\nexport interface Beat {\n time: number;\n strength: number;\n}\n\n/**\n * Detected chord\n */\nexport interface Chord {\n root: PitchClass;\n bass: PitchClass;\n quality: ChordQuality;\n start: number;\n end: number;\n confidence: number;\n name: string;\n}\n\nexport interface ChordAnalysisResult {\n chords: Chord[];\n}\n\n/**\n * Detected section\n */\nexport interface Section {\n type: SectionType;\n start: number;\n end: number;\n energyLevel: number;\n confidence: number;\n name: string;\n}\n\n/**\n * A single melody contour point (mirrors the C `SonareMelodyPoint`).\n */\nexport interface MelodyPoint {\n /** Frame time in seconds. */\n time: number;\n /** Estimated fundamental frequency in Hz (0 when unvoiced). */\n frequency: number;\n /** Voicing confidence in `[0, 1]`. */\n confidence: number;\n}\n\n/**\n * Melody analysis result (mirrors the C `SonareMelodyResult`).\n */\nexport interface MelodyResult {\n points: MelodyPoint[];\n pitchRangeOctaves: number;\n pitchStability: number;\n meanFrequency: number;\n vibratoRate: number;\n}\n\n/**\n * Constant-Q / Variable-Q transform magnitude result (mirrors the C\n * `SonareCqtResult`).\n */\nexport interface CqtResult {\n /** Number of frequency bins. */\n nBins: number;\n /** Number of time frames. */\n nFrames: number;\n /** Hop length in samples. */\n hopLength: number;\n /** Sample rate in Hz. */\n sampleRate: number;\n /** Row-major `[nBins x nFrames]` magnitude matrix. */\n magnitude: Float32Array;\n /** Center frequency (Hz) of each of the `nBins` bins. */\n frequencies: Float32Array;\n}\n\n/**\n * Timbre characteristics\n */\nexport interface Timbre {\n brightness: number;\n warmth: number;\n density: number;\n roughness: number;\n complexity: number;\n}\n\n/**\n * Dynamics characteristics\n */\nexport interface Dynamics {\n dynamicRangeDb: number;\n loudnessRangeDb: number;\n crestFactor: number;\n isCompressed: boolean;\n}\n\n/**\n * Time signature\n */\nexport interface TimeSignature {\n numerator: number;\n denominator: number;\n confidence: number;\n}\n\n/**\n * Rhythm features\n */\nexport interface RhythmFeatures {\n syncopation: number;\n grooveType: string;\n patternRegularity: number;\n}\n\n/**\n * Complete analysis result\n */\nexport interface AnalysisResult {\n bpm: number;\n bpmConfidence: number;\n key: Key;\n timeSignature: TimeSignature;\n beatTimes: Float32Array;\n beats: Beat[];\n chords: Chord[];\n sections: Section[];\n timbre: Timbre;\n dynamics: Dynamics;\n rhythm: RhythmFeatures;\n form: string;\n}\n\n/**\n * Room acoustic parameters from an impulse response\n */\nexport interface AcousticResult {\n rt60: number;\n edt: number;\n c50: number;\n c80: number;\n d50: number;\n rt60Bands: Float32Array;\n edtBands: Float32Array;\n c50Bands: Float32Array;\n c80Bands: Float32Array;\n confidence: number;\n isBlind: boolean;\n}\n\n/**\n * HPSS (Harmonic-Percussive Source Separation) result\n */\nexport interface HpssResult {\n harmonic: Float32Array;\n percussive: Float32Array;\n sampleRate: number;\n}\n\n/**\n * Mastering loudness/true-peak processing result\n */\nexport interface MasteringResult {\n samples: Float32Array;\n sampleRate: number;\n inputLufs: number;\n outputLufs: number;\n appliedGainDb: number;\n latencySamples?: number;\n}\n\nexport type MasteringProcessorParams = Record<string, number | boolean>;\n\nexport type PanMode = 'balance' | 'stereoPan' | 'stereo-pan' | 'dualPan' | 'dual-pan' | number;\n\nexport interface MixOptions {\n inputTrimDb?: number | number[];\n faderDb?: number | number[];\n pan?: number | number[];\n panMode?: PanMode | PanMode[];\n width?: number | number[];\n muted?: boolean | boolean[];\n}\n\nexport interface MixMeterSnapshot {\n peakDbL: number;\n peakDbR: number;\n rmsDbL: number;\n rmsDbR: number;\n correlation: number;\n monoCompatWidth: number;\n monoCompatPeak: number;\n monoCompatSideRms: number;\n likelyMonoCompatible: boolean;\n momentaryLufs: number;\n shortTermLufs: number;\n integratedLufs: number;\n gainReductionDb: number;\n truePeakDbL: number;\n truePeakDbR: number;\n maxTruePeakDb: number;\n seq: number;\n}\n\nexport interface MixResult {\n left: Float32Array;\n right: Float32Array;\n sampleRate: number;\n meters: MixMeterSnapshot[];\n}\n\n/** Mixed stereo master returned by {@link Mixer.processStereo}. */\nexport interface MixerProcessResult {\n left: Float32Array;\n right: Float32Array;\n sampleRate: number;\n}\n\n/**\n * Interpolation curve for scheduled automation events\n * (see {@link Mixer.scheduleInsertAutomation}).\n */\nexport type AutomationCurve = 'linear' | 'exponential' | 'hold' | 's-curve';\n\n/**\n * Pan law applied when computing left/right gains from a pan position\n * (see {@link Mixer.setPanLaw}). Maps to the underlying integer code.\n */\nexport type PanLaw = 'const3dB' | 'const4.5dB' | 'const6dB' | 'linear0dB';\n\n/**\n * Meter tap point for reading a strip's meter snapshot\n * (see {@link Mixer.meterTap} and {@link Mixer.stripMeter}).\n */\nexport type MeterTap = 'preFader' | 'postFader';\n\n/** Pre/post-fader send timing (see {@link Mixer.addSend}). */\nexport type SendTiming = 'preFader' | 'postFader';\n\n/** A single goniometer (left/right) sample returned by {@link Mixer.readGoniometerLatest}. */\nexport interface GoniometerPoint {\n left: number;\n right: number;\n}\n\nexport interface MasteringChainConfig {\n repair?: {\n denoise?: boolean;\n nFft?: number;\n hopLength?: number;\n ddAlpha?: number;\n gainFloor?: number;\n declick?: {\n threshold?: number;\n neighborRatio?: number;\n maxClickSamples?: number;\n lpcOrder?: number;\n residualRatio?: number;\n };\n dereverb?: {\n threshold?: number;\n attenuation?: number;\n nFft?: number;\n hopLength?: number;\n t60Sec?: number;\n lateDelayMs?: number;\n overSubtraction?: number;\n spectralFloor?: number;\n wpeEnabled?: boolean;\n wpeIterations?: number;\n wpeTaps?: number;\n wpeStrength?: number;\n };\n };\n eq?: {\n tiltDb?: number;\n pivotHz?: number;\n };\n dynamics?: {\n compressor?: {\n thresholdDb?: number;\n ratio?: number;\n attackMs?: number;\n releaseMs?: number;\n kneeDb?: number;\n makeupGainDb?: number;\n autoMakeup?: boolean;\n };\n deesser?: {\n frequencyHz?: number;\n thresholdDb?: number;\n ratio?: number;\n attackMs?: number;\n releaseMs?: number;\n rangeDb?: number;\n bandpassQ?: number;\n };\n transientShaper?: {\n attackGainDb?: number;\n sustainGainDb?: number;\n fastAttackMs?: number;\n fastReleaseMs?: number;\n slowAttackMs?: number;\n slowReleaseMs?: number;\n sensitivity?: number;\n maxGainDb?: number;\n gainSmoothingMs?: number;\n lookaheadMs?: number;\n };\n multibandComp?: {\n lowCutoffHz?: number;\n highCutoffHz?: number;\n lowThresholdDb?: number;\n lowRatio?: number;\n lowAttackMs?: number;\n lowReleaseMs?: number;\n midThresholdDb?: number;\n midRatio?: number;\n midAttackMs?: number;\n midReleaseMs?: number;\n highThresholdDb?: number;\n highRatio?: number;\n highAttackMs?: number;\n highReleaseMs?: number;\n };\n };\n saturation?: {\n tape?: {\n driveDb?: number;\n saturation?: number;\n hysteresis?: number;\n outputGainDb?: number;\n speedIps?: number;\n headBumpDb?: number;\n bias?: number;\n gapLoss?: number;\n };\n exciter?: {\n frequencyHz?: number;\n driveDb?: number;\n amount?: number;\n q?: number;\n evenOddMix?: number;\n };\n };\n spectral?: {\n airBand?: {\n amount?: number;\n shelfFrequencyHz?: number;\n dynamicThresholdDb?: number;\n dynamicRangeDb?: number;\n };\n };\n stereo?: {\n imager?: {\n width?: number;\n outputGainDb?: number;\n decorrelationAmount?: number;\n preserveEnergy?: boolean;\n };\n monoMaker?: {\n amount?: number;\n };\n };\n maximizer?: {\n truePeakLimiter?: {\n ceilingDb?: number;\n lookaheadMs?: number;\n releaseMs?: number;\n oversampleFactor?: number;\n applyGainAtInputRate?: boolean;\n };\n };\n loudness?: {\n targetLufs?: number;\n ceilingDb?: number;\n truePeakOversample?: number;\n };\n}\n\nexport interface MasteringChainResult extends MasteringResult {\n stages: string[];\n}\n\nexport interface MasteringStereoChainResult {\n left: Float32Array;\n right: Float32Array;\n sampleRate: number;\n inputLufs: number;\n outputLufs: number;\n appliedGainDb: number;\n stages: string[];\n latencySamples?: number;\n}\n\nexport interface MasteringStereoResult {\n left: Float32Array;\n right: Float32Array;\n sampleRate: number;\n inputLufs: number;\n outputLufs: number;\n appliedGainDb: number;\n latencySamples: number;\n}\n\n/**\n * STFT (Short-Time Fourier Transform) result\n */\nexport interface StftResult {\n nBins: number;\n nFrames: number;\n nFft: number;\n hopLength: number;\n sampleRate: number;\n magnitude: Float32Array;\n power: Float32Array;\n}\n\n/**\n * Mel spectrogram result\n */\nexport interface MelSpectrogramResult {\n nMels: number;\n nFrames: number;\n sampleRate: number;\n hopLength: number;\n power: Float32Array;\n db: Float32Array;\n}\n\n/**\n * MFCC result\n */\nexport interface MfccResult {\n nMfcc: number;\n nFrames: number;\n coefficients: Float32Array;\n}\n\n/**\n * STFT power spectrogram result (from inverse Mel reconstruction)\n */\nexport interface StftPowerResult {\n nBins: number;\n nFrames: number;\n power: Float32Array;\n}\n\n/**\n * Mel power spectrogram result (from inverse MFCC reconstruction)\n */\nexport interface MelPowerResult {\n nMels: number;\n nFrames: number;\n power: Float32Array;\n}\n\n/**\n * Chroma features result\n */\nexport interface ChromaResult {\n nChroma: number;\n nFrames: number;\n sampleRate: number;\n hopLength: number;\n features: Float32Array;\n meanEnergy: number[];\n}\n\n/**\n * Pitch detection result\n */\nexport interface PitchResult {\n f0: Float32Array;\n voicedProb: Float32Array;\n voicedFlag: boolean[];\n nFrames: number;\n medianF0: number;\n meanF0: number;\n}\n\n/**\n * Loudness measurement result (EBU R128 / ITU-R BS.1770)\n */\nexport interface LufsResult {\n integratedLufs: number;\n momentaryLufs: number;\n shortTermLufs: number;\n loudnessRange: number;\n}\n\n/**\n * Realtime equalizer spectrum snapshot.\n *\n * Mirrors the C++ `EqualizerSpectrumSnapshot`: `preLeft`/`preRight` and\n * `postLeft`/`postRight` are the pre- and post-EQ spectrum streams (trimmed to\n * their valid count). `bandGainDb` holds per-band applied gain (24 entries),\n * `profileDb` the smoothed magnitude profile (16 entries), `lastAutoGainDb`\n * the latest auto-gain compensation, and `seq` increments each time a new\n * snapshot is published.\n */\nexport interface EqSpectrumSnapshot {\n preLeft: Float32Array;\n preRight: Float32Array;\n postLeft: Float32Array;\n postRight: Float32Array;\n bandGainDb: Float32Array;\n profileDb: Float32Array;\n lastAutoGainDb: number;\n seq: number;\n}\n\n/**\n * Equalizer band type (string union mirroring `sonare::mastering::eq::EqBandType`).\n */\nexport type EqBandType =\n | 'Peak'\n | 'LowShelf'\n | 'HighShelf'\n | 'LowPass'\n | 'HighPass'\n | 'BandPass'\n | 'Notch'\n | 'TiltShelf'\n | 'FlatTilt';\n\n/** Biquad coefficient design mode. */\nexport type EqCoeffMode = 'Rbj' | 'Vicanek';\n\n/** Stereo placement for an EQ band. */\nexport type EqStereoPlacement = 'Stereo' | 'Left' | 'Right' | 'Mid' | 'Side';\n\n/** Per-band phase behaviour. */\nexport type EqBandPhase = 'Inherit' | 'ZeroLatency' | 'NaturalPhase' | 'LinearPhase';\n\n/**\n * Equalizer band configuration accepted by {@link StreamingEqualizer.setBand}.\n *\n * All fields are optional; omitted values fall back to the C++ band defaults\n * (Peak, 1000 Hz, 0 dB gain, Butterworth Q, disabled).\n */\nexport interface EqBand {\n type?: EqBandType;\n frequencyHz?: number;\n gainDb?: number;\n q?: number;\n enabled?: boolean;\n coeffMode?: EqCoeffMode;\n slopeDbOct?: number;\n placement?: EqStereoPlacement;\n phase?: EqBandPhase;\n soloed?: boolean;\n bypassed?: boolean;\n proportionalQ?: boolean;\n proportionalQStrength?: number;\n dynamic?: boolean;\n thresholdDb?: number;\n autoThreshold?: boolean;\n ratio?: number;\n rangeDb?: number;\n attackMs?: number;\n releaseMs?: number;\n lookaheadMs?: number;\n externalSidechain?: boolean;\n sidechainFreqHz?: number;\n sidechainQ?: number;\n}\n\n/** Construction options for {@link StreamingEqualizer}. */\nexport interface StreamingEqualizerConfig {\n sampleRate?: number;\n maxBlockSize?: number;\n}\n\n/** Configuration for {@link StreamingRetune}. */\nexport interface StreamingRetuneConfig {\n /** Pitch shift in semitones, clamped by the native processor to +/-24. */\n semitones?: number;\n /** Wet/dry mix, clamped by the native processor to 0..1. */\n mix?: number;\n /** Grain size in samples. Use 0/omit to derive it from the sample rate. */\n grainSize?: number;\n}\n\n/** Options for {@link StreamingEqualizer.match}. */\nexport interface EqMatchOptions {\n sampleRate?: number;\n maxBands?: number;\n}\n","/**\n * sonare - Audio Analysis Library\n *\n * @example\n * ```typescript\n * import { init, detectBpm, detectKey, analyze } from '@libraz/sonare';\n *\n * await init();\n *\n * // Detect BPM from audio samples\n * const bpm = detectBpm(samples, sampleRate);\n *\n * // Detect musical key\n * const key = detectKey(samples, sampleRate);\n *\n * // Full analysis\n * const result = analyze(samples, sampleRate);\n * ```\n */\n\nimport type {\n AcousticResult,\n AnalysisResult,\n AutomationCurve,\n ChordAnalysisResult,\n ChordDetectionOptions,\n ChordQuality,\n ChromaResult,\n CqtResult,\n EqBand,\n EqMatchOptions,\n EqSpectrumSnapshot,\n GoniometerPoint,\n HpssResult,\n Key,\n KeyCandidate,\n KeyDetectionOptions,\n KeyProfileName,\n LufsResult,\n MasteringChainConfig,\n MasteringChainResult,\n MasteringPreset,\n MasteringProcessorParams,\n MasteringResult,\n MasteringStereoChainResult,\n MasteringStereoResult,\n MelodyResult,\n MelPowerResult,\n MelSpectrogramResult,\n MeterTap,\n MfccResult,\n MixerProcessResult,\n MixMeterSnapshot,\n MixOptions,\n MixResult,\n PairAnalysis,\n PairProcessor,\n PanLaw,\n PitchResult,\n Section,\n SectionType,\n SendTiming,\n SoloProcessor,\n StereoAnalysis,\n StftPowerResult,\n StftResult,\n StreamingEqualizerConfig,\n StreamingPlatform,\n StreamingRetuneConfig,\n TempogramMode,\n} from './public_types';\nimport { KeyProfile as KeyProfileValues, Mode, PitchClass } from './public_types';\nimport type {\n AnalyzerStats,\n FrameBuffer,\n StreamConfig,\n StreamFramesI16,\n StreamFramesU8,\n} from './stream_types';\nimport type {\n ProgressCallback,\n SonareModule,\n WasmAcousticResult,\n WasmAnalysisResult,\n WasmChordAnalysisResult,\n WasmCyclicTempogramResult,\n WasmEngineAutomationPoint,\n WasmEngineBounceOptions,\n WasmEngineBounceResult,\n WasmEngineCaptureStatus,\n WasmEngineClip,\n WasmEngineFreezeOptions,\n WasmEngineFreezeResult,\n WasmEngineGraphSpec,\n WasmEngineMarker,\n WasmEngineMeterTelemetry,\n WasmEngineMetronomeConfig,\n WasmEngineParameterInfo,\n WasmEngineProcessWithMonitorResult,\n WasmEngineTelemetry,\n WasmEngineTransportState,\n WasmFourierTempogramResult,\n WasmFrameResult,\n WasmKeyCandidateResult,\n WasmNnlsChromaResult,\n WasmRealtimeEngine,\n WasmStreamAnalyzer,\n WasmTempogramResult,\n WasmTrimResult,\n} from './wasm_types';\n\nexport type {\n AcousticResult,\n AnalysisResult,\n AutomationCurve,\n Beat,\n Chord,\n ChordAnalysisResult,\n ChordDetectionOptions,\n ChromaResult,\n CqtResult,\n Dynamics,\n EqBand,\n EqBandPhase,\n EqBandType,\n EqCoeffMode,\n EqMatchOptions,\n EqSpectrumSnapshot,\n EqStereoPlacement,\n GoniometerPoint,\n HpssResult,\n Key,\n KeyCandidate,\n KeyDetectionOptions,\n KeyProfileName,\n LufsResult,\n MasteringChainConfig,\n MasteringChainResult,\n MasteringPreset,\n MasteringProcessorParams,\n MasteringResult,\n MasteringStereoChainResult,\n MasteringStereoResult,\n MelodyPoint,\n MelodyResult,\n MelSpectrogramResult,\n MeterTap,\n MfccResult,\n MixerProcessResult,\n MixMeterSnapshot,\n MixOptions,\n MixResult,\n PairAnalysis,\n PairProcessor,\n PanLaw,\n PanMode,\n PitchResult,\n RhythmFeatures,\n Section,\n SendTiming,\n SoloProcessor,\n StereoAnalysis,\n StftResult,\n StreamingEqualizerConfig,\n StreamingPlatform,\n StreamingRetuneConfig,\n Timbre,\n TimeSignature,\n} from './public_types';\nexport {\n ChordQuality,\n KeyProfile,\n Mode,\n PitchClass,\n SectionType,\n} from './public_types';\nexport type {\n AnalyzerStats,\n BarChord,\n ChordChange,\n FrameBuffer,\n PatternScore,\n ProgressiveEstimate,\n StreamConfig,\n StreamFramesI16,\n StreamFramesU8,\n} from './stream_types';\nexport type { ProgressCallback } from './wasm_types';\n\nexport type EngineClip = WasmEngineClip;\nexport type EngineParameterInfo = WasmEngineParameterInfo;\nexport type EngineAutomationPoint = WasmEngineAutomationPoint;\nexport type EngineMarker = WasmEngineMarker;\nexport type EngineMetronomeConfig = WasmEngineMetronomeConfig;\nexport type EngineGraphSpec = WasmEngineGraphSpec;\nexport type EngineCaptureStatus = WasmEngineCaptureStatus;\nexport type EngineBounceOptions = WasmEngineBounceOptions;\nexport type EngineBounceResult = WasmEngineBounceResult;\nexport type EngineFreezeOptions = WasmEngineFreezeOptions;\nexport type EngineFreezeResult = WasmEngineFreezeResult;\nexport type EngineTelemetry = WasmEngineTelemetry;\nexport type EngineMeterTelemetry = WasmEngineMeterTelemetry;\nexport type EngineTransportState = WasmEngineTransportState;\n\nexport const EXPECTED_ENGINE_ABI_VERSION = 2;\n\nexport interface EngineCapabilities {\n engineAbiVersion: number;\n expectedEngineAbiVersion: number;\n abiCompatible: boolean;\n sharedArrayBuffer: boolean;\n atomics: boolean;\n audioWorklet: boolean;\n mode: 'sab' | 'postMessage';\n}\n\nexport interface MixerRealtimeBuffer {\n leftInputs: Float32Array[];\n rightInputs: Float32Array[];\n outLeft: Float32Array;\n outRight: Float32Array;\n process: (numSamples?: number) => void;\n}\n\nfunction automationCurveCode(curve: AutomationCurve): number {\n switch (curve) {\n case 'linear':\n return 0;\n case 'exponential':\n return 1;\n case 'hold':\n return 2;\n case 's-curve':\n return 3;\n default:\n throw new Error(`Invalid automation curve: ${curve}`);\n }\n}\n\nfunction panLawCode(panLaw: PanLaw | number): number {\n if (typeof panLaw === 'number') {\n return panLaw;\n }\n switch (panLaw) {\n case 'const4.5dB':\n return 1;\n case 'const6dB':\n return 2;\n case 'linear0dB':\n return 3;\n default:\n return 0;\n }\n}\n\nfunction meterTapCode(tap: MeterTap | number): number {\n return tap === 'preFader' || tap === 0 ? 0 : 1;\n}\n\nfunction sendTimingCode(timing: SendTiming | number): number {\n return timing === 'preFader' || timing === 0 ? 0 : 1;\n}\n\n// ============================================================================\n// Module State\n// ============================================================================\n\nlet module: SonareModule | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize the WASM module.\n * Must be called before using any analysis functions.\n *\n * @param options - Optional module configuration\n * @returns Promise that resolves when initialization is complete\n */\nexport async function init(options?: {\n locateFile?: (path: string, prefix: string) => string;\n}): Promise<void> {\n if (module) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async () => {\n try {\n const createModule = (await import('./sonare.js')).default;\n module = await createModule(options);\n } catch (error) {\n initPromise = null;\n throw error;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if the module is initialized.\n */\nexport function isInitialized(): boolean {\n return module !== null;\n}\n\n/**\n * Get the library version.\n */\nexport function version(): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.version();\n}\n\nexport function engineAbiVersion(): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.engineAbiVersion();\n}\n\nexport function engineCapabilities(): EngineCapabilities {\n const abiVersion = engineAbiVersion();\n const sharedArrayBuffer = typeof globalThis.SharedArrayBuffer === 'function';\n const atomics = typeof globalThis.Atomics === 'object';\n const audioWorklet =\n typeof AudioWorkletNode !== 'undefined' ||\n typeof (globalThis as typeof globalThis & { AudioWorkletProcessor?: unknown })\n .AudioWorkletProcessor !== 'undefined';\n return {\n engineAbiVersion: abiVersion,\n expectedEngineAbiVersion: EXPECTED_ENGINE_ABI_VERSION,\n abiCompatible: abiVersion === EXPECTED_ENGINE_ABI_VERSION,\n sharedArrayBuffer,\n atomics,\n audioWorklet,\n mode: sharedArrayBuffer && atomics ? 'sab' : 'postMessage',\n };\n}\n\nexport class RealtimeEngine {\n private native: WasmRealtimeEngine;\n\n constructor(\n sampleRate = 48000,\n maxBlockSize = 128,\n commandCapacity = 1024,\n telemetryCapacity = 1024,\n ) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const capabilities = engineCapabilities();\n if (!capabilities.abiCompatible) {\n throw new Error(\n `Engine ABI mismatch: wasm=${capabilities.engineAbiVersion}, expected=${capabilities.expectedEngineAbiVersion}`,\n );\n }\n this.native = new module.RealtimeEngine(\n sampleRate,\n maxBlockSize,\n commandCapacity,\n telemetryCapacity,\n );\n }\n\n prepare(\n sampleRate: number,\n maxBlockSize: number,\n commandCapacity = 1024,\n telemetryCapacity = 1024,\n ): void {\n this.native.prepare(sampleRate, maxBlockSize, commandCapacity, telemetryCapacity);\n }\n\n /** Queue a sample-accurate parameter change (engine kSetParam). */\n setParameter(paramId: number, value: number, renderFrame = -1): void {\n this.native.setParameter(paramId, value, renderFrame);\n }\n\n /** Queue a smoothed parameter change (engine kSetParamSmoothed). */\n setParameterSmoothed(paramId: number, value: number, renderFrame = -1): void {\n this.native.setParameterSmoothed(paramId, value, renderFrame);\n }\n\n /** Read back the current transport state snapshot. */\n getTransportState(): EngineTransportState {\n return this.native.getTransportState();\n }\n\n play(renderFrame = -1): void {\n this.native.play(renderFrame);\n }\n\n stop(renderFrame = -1): void {\n this.native.stop(renderFrame);\n }\n\n seekSample(timelineSample: number, renderFrame = -1): void {\n this.native.seekSample(timelineSample, renderFrame);\n }\n\n seekPpq(ppq: number, renderFrame = -1): void {\n this.native.seekPpq(ppq, renderFrame);\n }\n\n setTempo(bpm: number): void {\n this.native.setTempo(bpm);\n }\n\n setTimeSignature(numerator: number, denominator: number): void {\n this.native.setTimeSignature(numerator, denominator);\n }\n\n setLoop(startPpq: number, endPpq: number, enabled = true): void {\n this.native.setLoop(startPpq, endPpq, enabled);\n }\n\n addParameter(info: EngineParameterInfo): void {\n this.native.addParameter(info);\n }\n\n parameterCount(): number {\n return this.native.parameterCount();\n }\n\n parameterInfoByIndex(index: number): EngineParameterInfo {\n return this.native.parameterInfoByIndex(index);\n }\n\n parameterInfo(id: number): EngineParameterInfo {\n return this.native.parameterInfo(id);\n }\n\n setAutomationLane(paramId: number, points: EngineAutomationPoint[]): void {\n this.native.setAutomationLane(paramId, points);\n }\n\n automationLaneCount(): number {\n return this.native.automationLaneCount();\n }\n\n setMarkers(markers: EngineMarker[]): void {\n this.native.setMarkers(markers);\n }\n\n markerCount(): number {\n return this.native.markerCount();\n }\n\n markerByIndex(index: number): EngineMarker {\n return this.native.markerByIndex(index);\n }\n\n marker(id: number): EngineMarker {\n return this.native.marker(id);\n }\n\n seekMarker(markerId: number, renderFrame = -1): void {\n this.native.seekMarker(markerId, renderFrame);\n }\n\n setLoopFromMarkers(startMarkerId: number, endMarkerId: number): void {\n this.native.setLoopFromMarkers(startMarkerId, endMarkerId);\n }\n\n setMetronome(config: EngineMetronomeConfig): void {\n this.native.setMetronome(config);\n }\n\n metronome(): Required<EngineMetronomeConfig> {\n return this.native.metronome();\n }\n\n countInEndSample(startSample: number, bars: number): number {\n return Number(this.native.countInEndSample(startSample, bars));\n }\n\n setGraph(spec: EngineGraphSpec): void {\n this.native.setGraph(spec);\n }\n\n graphNodeCount(): number {\n return this.native.graphNodeCount();\n }\n\n graphConnectionCount(): number {\n return this.native.graphConnectionCount();\n }\n\n setClips(clips: EngineClip[]): void {\n this.native.setClips(clips);\n }\n\n clipCount(): number {\n return this.native.clipCount();\n }\n\n setCaptureBuffer(numChannels: number, capacityFrames: number): void {\n this.native.setCaptureBuffer(numChannels, capacityFrames);\n }\n\n armCapture(armed = true): void {\n this.native.armCapture(armed);\n }\n\n setCapturePunch(startSample: number, endSample: number, enabled = true): void {\n this.native.setCapturePunch(startSample, endSample, enabled);\n }\n\n resetCapture(): void {\n this.native.resetCapture();\n }\n\n captureStatus(): EngineCaptureStatus {\n return this.native.captureStatus();\n }\n\n capturedAudio(): Float32Array[] {\n return this.native.capturedAudio();\n }\n\n process(channels: Float32Array[]): Float32Array[] {\n return this.native.process(channels);\n }\n\n processWithMonitor(channels: Float32Array[]): WasmEngineProcessWithMonitorResult {\n return this.native.processWithMonitor(channels);\n }\n\n renderOffline(channels: Float32Array[], blockSize = 128): Float32Array[] {\n return this.native.renderOffline(channels, blockSize);\n }\n\n bounceOffline(options: EngineBounceOptions): EngineBounceResult {\n return this.native.bounceOffline(options);\n }\n\n freezeOffline(options: EngineFreezeOptions): EngineFreezeResult {\n return this.native.freezeOffline(options);\n }\n\n drainTelemetry(maxRecords = 1024): EngineTelemetry[] {\n return this.native.drainTelemetry(maxRecords);\n }\n\n drainMeterTelemetry(maxRecords = 1024): EngineMeterTelemetry[] {\n return this.native.drainMeterTelemetry(maxRecords);\n }\n\n destroy(): void {\n this.native.delete();\n }\n}\n\n// ============================================================================\n// Quick API (High-level Analysis)\n// ============================================================================\n\n/**\n * Detect BPM from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Detected BPM\n */\nexport function detectBpm(samples: Float32Array, sampleRate: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectBpm(samples, sampleRate);\n}\n\n/**\n * Detect musical key from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Detected key\n */\nexport function detectKey(\n samples: Float32Array,\n sampleRate: number,\n options: KeyDetectionOptions = {},\n): Key {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module._detectKeyWithOptions(\n samples,\n sampleRate,\n options.nFft ?? 4096,\n options.hopLength ?? 512,\n options.useHpss ?? false,\n options.loudnessWeighted ?? false,\n options.highPassHz ?? 0,\n keyModeValues(options.modes),\n keyProfileValue(options.profile),\n options.genreHint ?? '',\n );\n return {\n root: result.root as PitchClass,\n mode: result.mode as Mode,\n confidence: result.confidence,\n name: result.name,\n shortName: result.shortName,\n };\n}\n\nfunction convertKeyCandidate(wasm: WasmKeyCandidateResult): KeyCandidate {\n return {\n key: {\n root: wasm.key.root as PitchClass,\n mode: wasm.key.mode as Mode,\n confidence: wasm.key.confidence,\n name: wasm.key.name,\n shortName: wasm.key.shortName,\n },\n correlation: wasm.correlation,\n };\n}\n\nfunction keyModeValues(modes: KeyDetectionOptions['modes'] | undefined): number[] {\n if (!modes) {\n return [];\n }\n if (modes === 'major-minor') {\n return [Mode.Major, Mode.Minor];\n }\n if (modes === 'all' || modes === 'modal') {\n return [\n Mode.Major,\n Mode.Minor,\n Mode.Dorian,\n Mode.Phrygian,\n Mode.Lydian,\n Mode.Mixolydian,\n Mode.Locrian,\n ];\n }\n const names = {\n major: Mode.Major,\n minor: Mode.Minor,\n dorian: Mode.Dorian,\n phrygian: Mode.Phrygian,\n lydian: Mode.Lydian,\n mixolydian: Mode.Mixolydian,\n locrian: Mode.Locrian,\n } as const;\n return modes.map((mode) => (typeof mode === 'number' ? mode : names[mode]));\n}\n\nfunction keyProfileValue(profile: KeyDetectionOptions['profile'] | undefined): number {\n if (profile === undefined) {\n return -1;\n }\n if (typeof profile === 'number') {\n return profile;\n }\n const names: Record<KeyProfileName, number> = {\n ks: KeyProfileValues.KrumhanslSchmuckler,\n krumhansl: KeyProfileValues.KrumhanslSchmuckler,\n temperley: KeyProfileValues.Temperley,\n shaath: KeyProfileValues.Shaath,\n keyfinder: KeyProfileValues.Shaath,\n 'faraldo-edmt': KeyProfileValues.FaraldoEDMT,\n edmt: KeyProfileValues.FaraldoEDMT,\n 'faraldo-edma': KeyProfileValues.FaraldoEDMA,\n edma: KeyProfileValues.FaraldoEDMA,\n 'faraldo-edmm': KeyProfileValues.FaraldoEDMM,\n edmm: KeyProfileValues.FaraldoEDMM,\n 'bellman-budge': KeyProfileValues.BellmanBudge,\n bellman: KeyProfileValues.BellmanBudge,\n };\n return names[profile];\n}\n\nexport function detectKeyCandidates(\n samples: Float32Array,\n sampleRate: number,\n options: KeyDetectionOptions = {},\n): KeyCandidate[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module\n ._detectKeyCandidates(\n samples,\n sampleRate,\n options.nFft ?? 4096,\n options.hopLength ?? 512,\n options.useHpss ?? false,\n options.loudnessWeighted ?? false,\n options.highPassHz ?? 0,\n keyModeValues(options.modes),\n keyProfileValue(options.profile),\n options.genreHint ?? '',\n )\n .map(convertKeyCandidate);\n}\n\n/**\n * Detect onset times from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Array of onset times in seconds\n */\nexport function detectOnsets(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectOnsets(samples, sampleRate);\n}\n\n/**\n * Detect beat times from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Array of beat times in seconds\n */\nexport function detectBeats(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectBeats(samples, sampleRate);\n}\n\n/**\n * Detect downbeat times from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Array of downbeat times in seconds\n */\nexport function detectDownbeats(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.detectDownbeats(samples, sampleRate);\n}\n\nfunction convertChordAnalysisResult(wasm: WasmChordAnalysisResult): ChordAnalysisResult {\n return {\n chords: wasm.chords.map((c) => ({\n root: c.root as PitchClass,\n bass: c.bass as PitchClass,\n quality: c.quality as ChordQuality,\n start: c.start,\n end: c.end,\n confidence: c.confidence,\n name: c.name,\n })),\n };\n}\n\n/**\n * Detect chords from audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param options - Optional chord detection settings\n * @returns Detected chord segments\n */\nexport function detectChords(\n samples: Float32Array,\n sampleRate: number,\n options: ChordDetectionOptions = {},\n): ChordAnalysisResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module.detectChords(\n samples,\n sampleRate,\n options.minDuration ?? 0.3,\n options.smoothingWindow ?? 2.0,\n options.threshold ?? 0.5,\n options.useTriadsOnly ?? false,\n options.nFft ?? 2048,\n options.hopLength ?? 512,\n options.useBeatSync ?? true,\n options.useHmm ?? false,\n options.hmmBeamWidth ?? 24,\n options.useKeyContext ?? false,\n options.keyRoot ?? PitchClass.C,\n options.keyMode ?? Mode.Major,\n options.detectInversions ?? false,\n chordChromaMethodValue(options.chromaMethod ?? 'stft'),\n );\n return convertChordAnalysisResult(result);\n}\n\nfunction chordChromaMethodValue(method: 'stft' | 'nnls'): number {\n if (method === 'stft') {\n return 0;\n }\n if (method === 'nnls') {\n return 1;\n }\n throw new Error(`Invalid chord chroma method: ${method}`);\n}\n\n// Helper to convert WASM result to typed result\nfunction convertAnalysisResult(wasm: WasmAnalysisResult): AnalysisResult {\n const beatTimes = new Float32Array(wasm.beats.length);\n for (let i = 0; i < wasm.beats.length; i++) {\n beatTimes[i] = wasm.beats[i].time;\n }\n return {\n bpm: wasm.bpm,\n bpmConfidence: wasm.bpmConfidence,\n key: {\n root: wasm.key.root as PitchClass,\n mode: wasm.key.mode as Mode,\n confidence: wasm.key.confidence,\n name: wasm.key.name,\n shortName: wasm.key.shortName,\n },\n timeSignature: wasm.timeSignature,\n beatTimes,\n beats: wasm.beats,\n chords: wasm.chords.map((c) => ({\n root: c.root as PitchClass,\n bass: c.bass as PitchClass,\n quality: c.quality as ChordQuality,\n start: c.start,\n end: c.end,\n confidence: c.confidence,\n name: c.name,\n })),\n sections: wasm.sections.map((s) => ({\n type: s.type as SectionType,\n start: s.start,\n end: s.end,\n energyLevel: s.energyLevel,\n confidence: s.confidence,\n name: s.name,\n })),\n timbre: wasm.timbre,\n dynamics: wasm.dynamics,\n rhythm: wasm.rhythm,\n form: wasm.form,\n };\n}\n\n/**\n * Perform complete music analysis.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Complete analysis result\n */\nexport function analyze(samples: Float32Array, sampleRate: number): AnalysisResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module.analyze(samples, sampleRate);\n return convertAnalysisResult(result);\n}\n\nexport function analyzeImpulseResponse(\n samples: Float32Array,\n sampleRate: number,\n nOctaveBands = 6,\n): AcousticResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result: WasmAcousticResult = module.analyzeImpulseResponse(\n samples,\n sampleRate,\n nOctaveBands,\n );\n return result;\n}\n\nexport function detectAcoustic(\n samples: Float32Array,\n sampleRate: number,\n nOctaveBands = 6,\n nThirdOctaveSubbands = 24,\n minDecayDb = 30.0,\n noiseFloorMarginDb = 10.0,\n): AcousticResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result: WasmAcousticResult = module.detectAcoustic(\n samples,\n sampleRate,\n nOctaveBands,\n nThirdOctaveSubbands,\n minDecayDb,\n noiseFloorMarginDb,\n );\n return result;\n}\n\n/**\n * Perform complete music analysis with progress reporting.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param onProgress - Progress callback (progress: 0-1, stage: string)\n * @returns Complete analysis result\n */\nexport function analyzeWithProgress(\n samples: Float32Array,\n sampleRate: number,\n onProgress: ProgressCallback,\n): AnalysisResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const result = module.analyzeWithProgress(samples, sampleRate, onProgress);\n return convertAnalysisResult(result);\n}\n\n// ============================================================================\n// Effects\n// ============================================================================\n\n/**\n * Perform Harmonic-Percussive Source Separation (HPSS).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param kernelHarmonic - Horizontal median filter size for harmonic (default: 31)\n * @param kernelPercussive - Vertical median filter size for percussive (default: 31)\n * @returns Separated harmonic and percussive components\n */\nexport function hpss(\n samples: Float32Array,\n sampleRate: number,\n kernelHarmonic = 31,\n kernelPercussive = 31,\n): HpssResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hpss(samples, sampleRate, kernelHarmonic, kernelPercussive);\n}\n\n/**\n * Extract harmonic component from audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Harmonic component\n */\nexport function harmonic(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.harmonic(samples, sampleRate);\n}\n\n/**\n * Extract percussive component from audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @returns Percussive component\n */\nexport function percussive(samples: Float32Array, sampleRate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.percussive(samples, sampleRate);\n}\n\n/**\n * Time-stretch audio without changing pitch.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param rate - Time stretch rate (0.5 = double duration, 2.0 = half duration)\n * @returns Time-stretched audio\n */\nexport function timeStretch(samples: Float32Array, sampleRate: number, rate: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.timeStretch(samples, sampleRate, rate);\n}\n\n/**\n * Pitch-shift audio without changing duration.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param semitones - Pitch shift in semitones (+12 = one octave up, -12 = one octave down)\n * @returns Pitch-shifted audio\n */\nexport function pitchShift(\n samples: Float32Array,\n sampleRate: number,\n semitones: number,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchShift(samples, sampleRate, semitones);\n}\n\n/**\n * Pitch-correct audio from a current MIDI note to a target MIDI note.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param currentMidi - Detected/current MIDI note number\n * @param targetMidi - Desired MIDI note number\n * @returns Pitch-corrected audio\n */\nexport function pitchCorrectToMidi(\n samples: Float32Array,\n sampleRate: number,\n currentMidi: number,\n targetMidi: number,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchCorrectToMidi(samples, sampleRate, currentMidi, targetMidi);\n}\n\n/**\n * Time-stretch a note region between two sample offsets without changing pitch.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param onsetSample - Note onset position in samples\n * @param offsetSample - Note offset position in samples\n * @param stretchRatio - Stretch ratio (0.5 = double duration, 2.0 = half duration)\n * @returns Audio with the note region stretched\n */\nexport function noteStretch(\n samples: Float32Array,\n sampleRate: number,\n onsetSample: number,\n offsetSample: number,\n stretchRatio: number,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.noteStretch(samples, sampleRate, onsetSample, offsetSample, stretchRatio);\n}\n\n/**\n * Apply a voice change by shifting pitch and formants independently.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param pitchSemitones - Pitch shift in semitones\n * @param formantFactor - Formant scaling factor (1.0 = unchanged)\n * @returns Voice-changed audio\n */\nexport function voiceChange(\n samples: Float32Array,\n sampleRate: number,\n pitchSemitones: number,\n formantFactor: number,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.voiceChange(samples, sampleRate, pitchSemitones, formantFactor);\n}\n\n/**\n * Normalize audio to target peak level.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param targetDb - Target peak level in dB (default: 0 dB = full scale)\n * @returns Normalized audio\n */\nexport function normalize(samples: Float32Array, sampleRate: number, targetDb = 0.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.normalize(samples, sampleRate, targetDb);\n}\n\n/**\n * Apply mastering loudness normalization with a true-peak ceiling.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param targetLufs - Target integrated LUFS (default: -14)\n * @param ceilingDb - True/sample peak ceiling in dBFS (default: -1)\n * @param truePeakOversample - Oversampling factor used for peak estimation\n * @returns Processed audio and loudness metadata\n */\nexport function mastering(\n samples: Float32Array,\n sampleRate: number,\n targetLufs = -14.0,\n ceilingDb = -1.0,\n truePeakOversample = 4,\n): MasteringResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mastering(samples, sampleRate, targetLufs, ceilingDb, truePeakOversample);\n}\n\nexport function masteringProcessorNames(): SoloProcessor[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringProcessorNames() as SoloProcessor[];\n}\n\nexport function masteringPairProcessorNames(): PairProcessor[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairProcessorNames() as PairProcessor[];\n}\n\nexport function masteringPairAnalysisNames(): PairAnalysis[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairAnalysisNames() as PairAnalysis[];\n}\n\nexport function masteringStereoAnalysisNames(): StereoAnalysis[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringStereoAnalysisNames() as StereoAnalysis[];\n}\n\nexport function masteringProcess(\n processorName: SoloProcessor,\n samples: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): MasteringResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringProcess(processorName, samples, sampleRate, params);\n}\n\nexport function masteringProcessStereo(\n processorName: SoloProcessor,\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): MasteringStereoResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masteringProcessStereo(processorName, left, right, sampleRate, params);\n}\n\nexport function masteringPairProcess(\n processorName: PairProcessor,\n source: Float32Array,\n reference: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): MasteringResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairProcess(processorName, source, reference, sampleRate, params);\n}\n\nexport function masteringPairAnalyze(\n analysisName: PairAnalysis,\n source: Float32Array,\n reference: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPairAnalyze(analysisName, source, reference, sampleRate, params);\n}\n\nexport function masteringStereoAnalyze(\n analysisName: StereoAnalysis,\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringStereoAnalyze(analysisName, left, right, sampleRate, params);\n}\n\nexport function masteringAssistantSuggest(\n samples: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringAssistantSuggest(samples, sampleRate, params);\n}\n\nexport function masteringAudioProfile(\n samples: Float32Array,\n sampleRate: number,\n params: MasteringProcessorParams = {},\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringAudioProfile(samples, sampleRate, params);\n}\n\nexport function masteringStreamingPreview(\n samples: Float32Array,\n sampleRate: number,\n platforms: StreamingPlatform[] = [],\n): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringStreamingPreview(samples, sampleRate, platforms);\n}\n\n/**\n * Apply a configurable mastering chain in WASM.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @returns Processed audio, loudness metadata, and applied stage names\n */\nexport function masteringChain(\n samples: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n): MasteringChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringChain(samples, sampleRate, config as Record<string, unknown>);\n}\n\n/**\n * Apply a configurable stereo mastering chain in WASM.\n *\n * @param left - Left channel samples\n * @param right - Right channel samples\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @returns Processed stereo audio, loudness metadata, and applied stage names\n */\nexport function masteringChainStereo(\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n): MasteringStereoChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masteringChainStereo(left, right, sampleRate, config as Record<string, unknown>);\n}\n\n/**\n * Apply a configurable mastering chain in WASM with progress reporting.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @param onProgress - Progress callback (progress: 0-1, stage: string)\n * @returns Processed audio, loudness metadata, and applied stage names\n */\nexport function masteringChainWithProgress(\n samples: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n onProgress: ProgressCallback,\n): MasteringChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringChainWithProgress(\n samples,\n sampleRate,\n config as Record<string, unknown>,\n onProgress,\n );\n}\n\n/**\n * Apply a configurable stereo mastering chain in WASM with progress reporting.\n *\n * @param left - Left channel samples\n * @param right - Right channel samples\n * @param sampleRate - Sample rate in Hz\n * @param config - Chain stage configuration\n * @param onProgress - Progress callback (progress: 0-1, stage: string)\n * @returns Processed stereo audio, loudness metadata, and applied stage names\n */\nexport function masteringChainStereoWithProgress(\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n config: MasteringChainConfig,\n onProgress: ProgressCallback,\n): MasteringStereoChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masteringChainStereoWithProgress(\n left,\n right,\n sampleRate,\n config as Record<string, unknown>,\n onProgress,\n );\n}\n\n/**\n * List built-in mastering preset identifiers.\n *\n * @returns Preset names in display order (e.g. \"pop\", \"edm\", \"aiMusic\")\n */\nexport function masteringPresetNames(): MasteringPreset[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masteringPresetNames() as MasteringPreset[];\n}\n\n/**\n * Apply a named mastering preset chain to mono audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param presetName - Preset identifier from {@link masteringPresetNames}\n * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.\n * @returns Processed audio, loudness metadata, and applied stage names\n */\nexport function masterAudio(\n samples: Float32Array,\n sampleRate: number,\n presetName: MasteringPreset,\n overrides: Record<string, number | boolean> | null = null,\n): MasteringChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.masterAudio(presetName, samples, sampleRate, overrides);\n}\n\n/**\n * Apply a named mastering preset chain to stereo audio.\n *\n * @param left - Left channel samples\n * @param right - Right channel samples\n * @param sampleRate - Sample rate in Hz\n * @param presetName - Preset identifier from {@link masteringPresetNames}\n * @param overrides - Optional flat overrides (dot-notation, e.g. `'loudness.targetLufs'`) applied on top of the preset. Pass `null` for preset defaults.\n * @returns Processed stereo audio, loudness metadata, and applied stage names\n */\nexport function masterAudioStereo(\n left: Float32Array,\n right: Float32Array,\n sampleRate: number,\n presetName: MasteringPreset,\n overrides: Record<string, number | boolean> | null = null,\n): MasteringStereoChainResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return module.masterAudioStereo(presetName, left, right, sampleRate, overrides);\n}\n\nexport function mixingScenePresetNames(): string[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mixingScenePresetNames();\n}\n\n/**\n * Get a built-in mixing scene preset serialized as JSON. This is the canonical\n * name shared with the Node and Python bindings; the returned JSON loads\n * directly into a {@link Mixer} via {@link Mixer.fromSceneJson}.\n *\n * @param preset - Preset name (see {@link mixingScenePresetNames})\n * @returns Scene JSON string\n */\nexport function mixingScenePresetJson(preset: string): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mixingScenePresetJson(preset);\n}\n\nexport function mixStereo(\n leftChannels: Float32Array[],\n rightChannels: Float32Array[],\n sampleRate = 48000,\n options: MixOptions = {},\n): MixResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (leftChannels.length === 0 || leftChannels.length !== rightChannels.length) {\n throw new Error('leftChannels and rightChannels must have the same non-zero length.');\n }\n return module.mixStereo(\n leftChannels,\n rightChannels,\n sampleRate,\n options as Record<string, unknown>,\n );\n}\n\n// ============================================================================\n// StreamingMasteringChain Class\n// ============================================================================\n\n/**\n * Block-by-block streaming variant of {@link masteringChain}.\n *\n * Maintains processor state across {@link processMono}/{@link processStereo}\n * calls. Only ProcessorBase-backed stages are supported. Configurations that\n * enable `repair.denoise` or `loudness` throw at construction.\n *\n * Call {@link delete} (or use a `try/finally`) to release the underlying WASM\n * object — the embind handle is not garbage-collected automatically.\n *\n * @example\n * ```typescript\n * const chain = new StreamingMasteringChain({ eq: { tiltDb: 1.0 } });\n * try {\n * chain.prepare(44100, 512, 1);\n * const out = chain.processMono(blockSamples);\n * } finally {\n * chain.delete();\n * }\n * ```\n */\nexport class StreamingMasteringChain {\n private chain: import('./wasm_types').WasmStreamingMasteringChain;\n\n constructor(config: MasteringChainConfig) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n this.chain = module.createStreamingMasteringChain(config as Record<string, unknown>);\n }\n\n /**\n * Initialize processors for the given sample rate and block layout.\n *\n * @param sampleRate - Sample rate in Hz\n * @param maxBlockSize - Maximum block size per process call\n * @param numChannels - 1 (mono) or 2 (stereo)\n */\n prepare(sampleRate: number, maxBlockSize: number, numChannels: number): void {\n this.chain.prepare(sampleRate, maxBlockSize, numChannels);\n }\n\n /**\n * Process one mono block, returning the processed samples (same length).\n */\n processMono(samples: Float32Array): Float32Array {\n return this.chain.processMono(samples);\n }\n\n /**\n * Process one stereo block, returning the processed channels.\n */\n processStereo(\n left: Float32Array,\n right: Float32Array,\n ): { left: Float32Array; right: Float32Array } {\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return this.chain.processStereo(left, right);\n }\n\n /** Reset all processor state without rebuilding. */\n reset(): void {\n this.chain.reset();\n }\n\n /** Total reported latency in samples across all active processors. */\n latencySamples(): number {\n return this.chain.latencySamples();\n }\n\n /** Ordered stage names that will run (e.g. `\"eq.tilt\"`). */\n stageNames(): string[] {\n return this.chain.stageNames();\n }\n\n /** Release the underlying WASM object. Safe to call only once. */\n delete(): void {\n this.chain.delete();\n }\n}\n\n// ============================================================================\n// StreamingEqualizer Class\n// ============================================================================\n\n/**\n * Block-by-block streaming equalizer wrapping the unified C++\n * `EqualizerProcessor` (up to 24 bands, RBJ/Vicanek biquads, dynamic EQ,\n * linear-phase FIR, mid/side processing, and auto-gain).\n *\n * State is maintained across {@link processMono}/{@link processStereo} calls.\n * Call {@link delete} (or use `try/finally`) to release the underlying WASM\n * object — the embind handle is not garbage-collected automatically.\n *\n * @example\n * ```typescript\n * const eq = new StreamingEqualizer({ sampleRate: 48000, maxBlockSize: 512 });\n * try {\n * eq.setBand(0, { type: 'HighShelf', frequencyHz: 8000, gainDb: 6, enabled: true });\n * const out = eq.processStereo(left, right);\n * const snapshot = eq.spectrum();\n * } finally {\n * eq.delete();\n * }\n * ```\n */\nexport class StreamingEqualizer {\n private eq: import('./wasm_types').WasmStreamingEqualizer;\n\n constructor(config: StreamingEqualizerConfig = {}) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n this.eq = module.createEqualizer(config as Record<string, unknown>);\n }\n\n /**\n * Configure the band at `index` (0..23). Omitted fields use C++ defaults.\n */\n setBand(index: number, band: EqBand): void {\n this.eq.setBand(index, band as Record<string, unknown>);\n }\n\n /** Disable and reset every band. */\n clear(): void {\n this.eq.clear();\n }\n\n /**\n * Set the global phase mode: 1=ZeroLatency, 2=NaturalPhase, 3=LinearPhase.\n */\n setPhaseMode(mode: number): void {\n this.eq.setPhaseMode(mode);\n }\n\n /** Enable or disable output auto-gain compensation. */\n setAutoGain(enabled: boolean): void {\n this.eq.setAutoGain(enabled);\n }\n\n /** Set all-band EQ gain scale as a 0.0..2.0 multiplier. */\n setGainScale(scale: number): void {\n this.eq.setGainScale(scale);\n }\n\n /** Set post-EQ output gain in dB. */\n setOutputGainDb(gainDb: number): void {\n this.eq.setOutputGainDb(gainDb);\n }\n\n /** Set post-EQ stereo balance in -1.0..1.0; mono input ignores pan. */\n setOutputPan(pan: number): void {\n this.eq.setOutputPan(pan);\n }\n\n /**\n * Provide a mono external sidechain key for dynamic bands that opt into\n * `external_sidechain`. The samples are copied into an owned buffer.\n */\n setSidechainMono(samples: Float32Array): void {\n this.eq.setSidechainMono(samples);\n }\n\n /**\n * Provide a stereo external sidechain key. Both channels must match length.\n */\n setSidechainStereo(left: Float32Array, right: Float32Array): void {\n if (left.length !== right.length) {\n throw new Error('Sidechain channel lengths must match.');\n }\n this.eq.setSidechainStereo(left, right);\n }\n\n /** Release any borrowed external sidechain buffers. */\n clearSidechain(): void {\n this.eq.clearSidechain();\n }\n\n /** Auto-gain applied on the most recent block, in dB. */\n lastAutoGainDb(): number {\n return this.eq.lastAutoGainDb();\n }\n\n /** Reported processing latency in samples (non-zero for linear-phase bands). */\n latencySamples(): number {\n return this.eq.latencySamples();\n }\n\n /**\n * Process one mono block, returning the equalized samples (same length).\n */\n processMono(samples: Float32Array): Float32Array {\n return this.eq.processMono(samples);\n }\n\n /**\n * Process one stereo block, returning the equalized channels.\n */\n processStereo(\n left: Float32Array,\n right: Float32Array,\n ): { left: Float32Array; right: Float32Array } {\n if (left.length !== right.length) {\n throw new Error('Stereo channel lengths must match.');\n }\n return this.eq.processStereo(left, right);\n }\n\n /**\n * Read the latest pre/post spectrum snapshot for metering. `seq` increments\n * each time a new snapshot is published.\n */\n spectrum(): EqSpectrumSnapshot {\n return this.eq.spectrum();\n }\n\n /**\n * Configure bands so the source spectrum matches the reference spectrum.\n *\n * @param source - Source audio (mono samples)\n * @param reference - Reference audio (mono samples)\n * @param options - `sampleRate` (default 48000) and `maxBands` (default 8)\n */\n match(source: Float32Array, reference: Float32Array, options: EqMatchOptions = {}): void {\n this.eq.match(source, reference, options as Record<string, unknown>);\n }\n\n /** Release the underlying WASM object. Safe to call only once. */\n delete(): void {\n this.eq.delete();\n }\n}\n\n// ============================================================================\n// StreamingRetune Class\n// ============================================================================\n\n/**\n * Block-by-block mono voice retune / pitch shifter.\n *\n * State is maintained across {@link processMono} calls. Call {@link prepare}\n * before processing, and call {@link delete} (or use `try/finally`) to release\n * the underlying WASM object.\n */\nexport class StreamingRetune {\n private retune: import('./wasm_types').WasmStreamingRetune;\n\n constructor(config: StreamingRetuneConfig = {}) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n this.retune = module.createStreamingRetune(config as Record<string, unknown>);\n }\n\n /**\n * Allocate and initialize native state for the given sample rate and maximum\n * process block size.\n */\n prepare(sampleRate: number, maxBlockSize: number): void {\n this.retune.prepare(sampleRate, maxBlockSize);\n }\n\n /** Reset delay, grain, and overlap-add state without changing config. */\n reset(): void {\n this.retune.reset();\n }\n\n /**\n * Update retune settings. Changing `grainSize` takes effect after the next\n * {@link prepare} call.\n */\n setConfig(config: StreamingRetuneConfig): void {\n this.retune.setConfig(config as Record<string, unknown>);\n }\n\n /** Current native config. */\n config(): Required<StreamingRetuneConfig> {\n return this.retune.config();\n }\n\n /** Resolved grain size in samples after {@link prepare}. */\n grainSize(): number {\n return this.retune.grainSize();\n }\n\n /** Process one mono block, returning the shifted samples (same length). */\n processMono(samples: Float32Array): Float32Array {\n return this.retune.processMono(samples);\n }\n\n /** Release the underlying WASM object. Safe to call only once. */\n delete(): void {\n this.retune.delete();\n }\n}\n\n// ============================================================================\n// Mixer Class (scene-based persistent mixer)\n// ============================================================================\n\n/**\n * Get a built-in mixing scene preset serialized as JSON, normalized through the\n * C mixer API (the same path {@link Mixer.fromSceneJson} uses to load it).\n *\n * @deprecated Use {@link mixingScenePresetJson}, the canonical name shared with\n * the Node and Python bindings. This alias is retained for backwards\n * compatibility and may be removed in a future release. Both functions return a\n * scene JSON string that loads cleanly into a {@link Mixer}.\n *\n * @param preset - Preset name (see {@link mixingScenePresetNames})\n * @returns Scene JSON string\n */\nexport function mixerScenePresetJson(preset: string): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mixerPresetJson(preset);\n}\n\n/**\n * Persistent, scene-based stereo mixer.\n *\n * Build one from a scene JSON string (e.g. {@link mixerScenePresetJson} or a\n * hand-authored scene), then feed per-strip stereo blocks through\n * {@link processStereo} to get the routed stereo master. Strips, sends, buses,\n * and inserts are described entirely by the scene; the routing graph is\n * compiled lazily on the first {@link processStereo} call (or eagerly via\n * {@link compile}).\n *\n * Call {@link delete} (or use a `try/finally`) to release the underlying WASM\n * object — the embind handle is not garbage-collected automatically.\n *\n * @example\n * ```typescript\n * const mixer = Mixer.fromSceneJson(mixerScenePresetJson('basicStereo'), 48000, 512);\n * try {\n * const out = mixer.processStereo([stripL], [stripR]);\n * } finally {\n * mixer.delete();\n * }\n * ```\n */\nexport class Mixer {\n private mixer: import('./wasm_types').WasmMixer;\n\n private constructor(mixer: import('./wasm_types').WasmMixer) {\n this.mixer = mixer;\n }\n\n /**\n * Build a mixer from a scene JSON string.\n *\n * @param json - Scene JSON (strips, buses, sends, connections, inserts)\n * @param sampleRate - Sample rate in Hz (default: 48000)\n * @param blockSize - Maximum block size per {@link processStereo} call (default: 512)\n */\n static fromSceneJson(json: string, sampleRate = 48000, blockSize = 512): Mixer {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return new Mixer(module.createMixerFromSceneJson(json, sampleRate, blockSize));\n }\n\n /** Rebuild and compile the routing graph from the current scene topology. */\n compile(): void {\n this.mixer.compile();\n }\n\n /**\n * Mix one block of per-strip stereo audio into the stereo master.\n *\n * @param leftChannels - `leftChannels[i]` is the left channel of strip `i`\n * @param rightChannels - `rightChannels[i]` is the right channel of strip `i`\n * @returns Mixed stereo master (`left`, `right`, `sampleRate`)\n */\n processStereo(leftChannels: Float32Array[], rightChannels: Float32Array[]): MixerProcessResult {\n if (leftChannels.length !== rightChannels.length) {\n throw new Error('leftChannels and rightChannels must have the same length.');\n }\n return this.mixer.processStereo(leftChannels, rightChannels);\n }\n\n /**\n * Mix one block into caller-owned output arrays.\n *\n * This avoids allocating the result object and result `Float32Array`s. It is\n * intended for realtime bridges such as AudioWorklet; the input channel count\n * must match the scene strip count and all arrays must have the same length.\n */\n processStereoInto(\n leftChannels: Float32Array[],\n rightChannels: Float32Array[],\n outLeft: Float32Array,\n outRight: Float32Array,\n ): void {\n if (leftChannels.length !== rightChannels.length) {\n throw new Error('leftChannels and rightChannels must have the same length.');\n }\n if (outLeft.length !== outRight.length) {\n throw new Error('outLeft and outRight must have the same length.');\n }\n this.mixer.processStereoInto(leftChannels, rightChannels, outLeft, outRight);\n }\n\n /**\n * Create reusable WASM-heap input/output views for realtime-style processing.\n *\n * Fill `leftInputs[i]` / `rightInputs[i]`, call `process()`, then read\n * `outLeft` / `outRight`. The views are owned by this mixer and become invalid\n * after {@link delete}.\n */\n createRealtimeBuffer(): MixerRealtimeBuffer {\n const stripCount = this.stripCount();\n const leftInputs: Float32Array[] = [];\n const rightInputs: Float32Array[] = [];\n for (let index = 0; index < stripCount; index++) {\n leftInputs.push(this.mixer.inputLeftView(index));\n rightInputs.push(this.mixer.inputRightView(index));\n }\n const outLeft = this.mixer.outputLeftView();\n const outRight = this.mixer.outputRightView();\n return {\n leftInputs,\n rightInputs,\n outLeft,\n outRight,\n process: (numSamples = outLeft.length) => this.mixer.processPreparedStereo(numSamples),\n };\n }\n\n /** Number of strips in the mixer (e.g. strips loaded from the scene). */\n stripCount(): number {\n return this.mixer.stripCount();\n }\n\n /**\n * Schedule sample-accurate insert-parameter automation on a strip's insert.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param insertIndex - Index into the strip's combined insert sequence\n * (`[pre-inserts... post-inserts...]`)\n * @param paramId - Processor-specific parameter id\n * @param samplePos - Absolute samples from the start of processing (the mixer\n * advances an internal position from 0 on the first {@link processStereo}\n * call; recompiling resets it to 0)\n * @param value - Target parameter value\n * @param curve - Interpolation curve (default: `'linear'`)\n * @throws If the strip index is out of range or the schedule call fails\n * (unknown curve, out-of-range insert index, or full event lane)\n */\n scheduleInsertAutomation(\n stripIndex: number,\n insertIndex: number,\n paramId: number,\n samplePos: number,\n value: number,\n curve: AutomationCurve = 'linear',\n ): void {\n this.mixer.scheduleInsertAutomation(\n stripIndex,\n insertIndex,\n paramId,\n samplePos,\n value,\n automationCurveCode(curve),\n );\n }\n\n /**\n * Resolve a strip's index in `[0, stripCount())` from its scene id, or `null`\n * when no strip with that id exists (matches the Node binding's `number | null`).\n */\n stripById(id: string): number | null {\n const index = this.mixer.stripById(id);\n return index < 0 ? null : index;\n }\n\n /**\n * Add a bus to the mixer topology. `role` is one of `'master'`, `'aux'`, or\n * `'submix'` (defaults to `'aux'`). Marks the routing graph dirty; call\n * {@link compile} (or {@link processStereo}) to rebuild.\n */\n addBus(id: string, role = 'aux'): void {\n this.mixer.addBus(id, role);\n }\n\n /** Remove a bus by id. Marks the routing graph dirty. */\n removeBus(id: string): void {\n this.mixer.removeBus(id);\n }\n\n /** Number of buses in the mixer topology. */\n busCount(): number {\n return this.mixer.busCount();\n }\n\n /**\n * Add a VCA group with the given gain offset (dB). `members` is a list of\n * strip ids governed by the group (may be empty).\n */\n addVcaGroup(id: string, gainDb = 0.0, members: string[] = []): void {\n this.mixer.addVcaGroup(id, gainDb, members);\n }\n\n /** Remove a VCA group by id. */\n removeVcaGroup(id: string): void {\n this.mixer.removeVcaGroup(id);\n }\n\n /** Number of VCA groups in the mixer topology. */\n vcaGroupCount(): number {\n return this.mixer.vcaGroupCount();\n }\n\n /**\n * Set a strip's solo state. Takes effect on the next process without a\n * graph recompile.\n */\n setSoloed(stripIndex: number, soloed: boolean): void {\n this.mixer.setSoloed(stripIndex, soloed);\n }\n\n /**\n * Mark a strip solo-safe so it is never implied-muted by another strip's\n * solo. Takes effect on the next process without a graph recompile.\n */\n setSoloSafe(stripIndex: number, soloSafe: boolean): void {\n this.mixer.setSoloSafe(stripIndex, soloSafe);\n }\n\n /** Invert the polarity of the left and/or right channel of a strip. */\n setPolarityInvert(stripIndex: number, invertLeft: boolean, invertRight: boolean): void {\n this.mixer.setPolarityInvert(stripIndex, invertLeft, invertRight);\n }\n\n /** Set the strip's pan law. */\n setPanLaw(stripIndex: number, panLaw: PanLaw | number): void {\n this.mixer.setPanLaw(stripIndex, panLawCode(panLaw));\n }\n\n /**\n * Set a per-strip channel delay in samples. This changes the strip's reported\n * latency; recompile to re-run latency compensation.\n */\n setChannelDelaySamples(stripIndex: number, delaySamples: number): void {\n this.mixer.setChannelDelaySamples(stripIndex, delaySamples);\n }\n\n /** Set the strip's live VCA gain offset in dB (not persisted to the scene). */\n setVcaOffsetDb(stripIndex: number, offsetDb: number): void {\n this.mixer.setVcaOffsetDb(stripIndex, offsetDb);\n }\n\n /** Set independent left/right pan positions (dual-pan mode). */\n setDualPan(stripIndex: number, leftPan: number, rightPan: number): void {\n this.mixer.setDualPan(stripIndex, leftPan, rightPan);\n }\n\n /**\n * Add a send to a strip after construction.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param id - Send id\n * @param destinationBusId - Destination bus id\n * @param sendDb - Initial send level in dB\n * @param timing - `'preFader'` or `'postFader'` (default: `'postFader'`)\n * @returns The new send's index\n */\n addSend(\n stripIndex: number,\n id: string,\n destinationBusId: string,\n sendDb: number,\n timing: SendTiming | number = 'postFader',\n ): number {\n return this.mixer.addSend(stripIndex, id, destinationBusId, sendDb, sendTimingCode(timing));\n }\n\n /** Set the send level (in dB) for an existing send by index. */\n setSendDb(stripIndex: number, sendIndex: number, sendDb: number): void {\n this.mixer.setSendDb(stripIndex, sendIndex, sendDb);\n }\n\n /**\n * Read a strip's meter snapshot at the given tap point.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param tap - `'preFader'` or `'postFader'` (default: `'postFader'`)\n */\n meterTap(stripIndex: number, tap: MeterTap = 'postFader'): MixMeterSnapshot {\n return this.mixer.meterTap(stripIndex, meterTapCode(tap));\n }\n\n /**\n * Read a strip's meter snapshot. Alias of {@link meterTap}, provided for\n * cross-binding (Node/Python) parity.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param tap - `'preFader'` or `'postFader'` (default: `'postFader'`)\n */\n stripMeter(stripIndex: number, tap: MeterTap = 'postFader'): MixMeterSnapshot {\n return this.mixer.stripMeter(stripIndex, meterTapCode(tap));\n }\n\n /**\n * Schedule sample-accurate fader automation on a strip.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param samplePos - Absolute samples from the start of processing\n * @param faderDb - Target fader level in dB\n * @param curve - Interpolation curve (default: `'linear'`)\n */\n scheduleFaderAutomation(\n stripIndex: number,\n samplePos: number,\n faderDb: number,\n curve: AutomationCurve = 'linear',\n ): void {\n this.mixer.scheduleFaderAutomation(stripIndex, samplePos, faderDb, automationCurveCode(curve));\n }\n\n /**\n * Schedule sample-accurate pan automation on a strip.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param samplePos - Absolute samples from the start of processing\n * @param pan - Target pan position\n * @param curve - Interpolation curve (default: `'linear'`)\n */\n schedulePanAutomation(\n stripIndex: number,\n samplePos: number,\n pan: number,\n curve: AutomationCurve = 'linear',\n ): void {\n this.mixer.schedulePanAutomation(stripIndex, samplePos, pan, automationCurveCode(curve));\n }\n\n /**\n * Schedule sample-accurate width automation on a strip.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param samplePos - Absolute samples from the start of processing\n * @param width - Target stereo width\n * @param curve - Interpolation curve (default: `'linear'`)\n */\n scheduleWidthAutomation(\n stripIndex: number,\n samplePos: number,\n width: number,\n curve: AutomationCurve = 'linear',\n ): void {\n this.mixer.scheduleWidthAutomation(stripIndex, samplePos, width, automationCurveCode(curve));\n }\n\n /**\n * Schedule sample-accurate send-level automation on a strip's send.\n *\n * @param stripIndex - Strip index in `[0, stripCount())`\n * @param sendIndex - Send index in the strip's add order\n * @param samplePos - Absolute samples from the start of processing\n * @param db - Target send level in dB\n * @param curve - Interpolation curve (default: `'linear'`)\n */\n scheduleSendAutomation(\n stripIndex: number,\n sendIndex: number,\n samplePos: number,\n db: number,\n curve: AutomationCurve = 'linear',\n ): void {\n this.mixer.scheduleSendAutomation(\n stripIndex,\n sendIndex,\n samplePos,\n db,\n automationCurveCode(curve),\n );\n }\n\n /**\n * Read up to `maxPoints` of a strip's most recent goniometer samples\n * (oldest to newest).\n */\n readGoniometerLatest(stripIndex: number, maxPoints: number): GoniometerPoint[] {\n return this.mixer.readGoniometerLatest(stripIndex, maxPoints);\n }\n\n /** Serialize the current scene (strips, buses, sends, connections) to JSON. */\n toSceneJson(): string {\n return this.mixer.toSceneJson();\n }\n\n /** Release the underlying WASM object. Safe to call only once. */\n delete(): void {\n this.mixer.delete();\n }\n\n /** Alias for {@link delete}, provided for cross-binding (Node) compatibility. */\n destroy(): void {\n this.delete();\n }\n}\n\n/**\n * Trim silence from beginning and end of audio.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param thresholdDb - Silence threshold in dB (default: -60 dB)\n * @returns Trimmed audio\n */\nexport function trim(samples: Float32Array, sampleRate: number, thresholdDb = -60.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.trim(samples, sampleRate, thresholdDb);\n}\n\n// ============================================================================\n// Features - Spectrogram\n// ============================================================================\n\n/**\n * Compute Short-Time Fourier Transform (STFT).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns STFT result with magnitude and power spectrograms\n */\nexport function stft(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): StftResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.stft(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute STFT and return magnitude in decibels.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns STFT result with dB values\n */\nexport function stftDb(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): { nBins: number; nFrames: number; db: Float32Array } {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.stftDb(samples, sampleRate, nFft, hopLength);\n}\n\n// ============================================================================\n// Features - Mel Spectrogram\n// ============================================================================\n\n/**\n * Compute Mel spectrogram.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nMels - Number of Mel bands (default: 128)\n * @returns Mel spectrogram result\n */\nexport function melSpectrogram(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n nMels = 128,\n): MelSpectrogramResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.melSpectrogram(samples, sampleRate, nFft, hopLength, nMels);\n}\n\n/**\n * Compute MFCC (Mel-Frequency Cepstral Coefficients).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nMels - Number of Mel bands (default: 128)\n * @param nMfcc - Number of MFCC coefficients (default: 13)\n * @returns MFCC result\n */\nexport function mfcc(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n nMels = 128,\n nMfcc = 13,\n): MfccResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mfcc(samples, sampleRate, nFft, hopLength, nMels, nMfcc);\n}\n\n// ============================================================================\n// Features - Inverse reconstruction\n// ============================================================================\n\n/**\n * Approximate inverse of a Mel filterbank: Mel power spectrogram -> STFT power\n * spectrogram. Mirrors `feature::mel_to_stft`.\n *\n * @param melPower - Mel power spectrogram [nMels x nFrames] row-major\n * @param nMels - Number of Mel bands\n * @param nFrames - Number of time frames\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns STFT power spectrogram result\n */\nexport function melToStft(\n melPower: Float32Array,\n nMels: number,\n nFrames: number,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n fmin = 0,\n fmax = 0,\n): StftPowerResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.melToStft(melPower, nMels, nFrames, sampleRate, nFft, hopLength, fmin, fmax);\n}\n\n/**\n * Reconstruct audio from a Mel power spectrogram via Griffin-Lim. Mirrors\n * `feature::mel_to_audio`.\n *\n * @param melPower - Mel power spectrogram [nMels x nFrames] row-major\n * @param nMels - Number of Mel bands\n * @param nFrames - Number of time frames\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nIter - Griffin-Lim iterations (default: 32)\n * @returns Reconstructed audio samples (mono, float32)\n */\nexport function melToAudio(\n melPower: Float32Array,\n nMels: number,\n nFrames: number,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n nIter = 32,\n fmin = 0,\n fmax = 0,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.melToAudio(\n melPower,\n nMels,\n nFrames,\n sampleRate,\n nFft,\n hopLength,\n nIter,\n fmin,\n fmax,\n );\n}\n\n/**\n * Invert MFCC coefficients back to a Mel power spectrogram. Mirrors\n * `feature::mfcc_to_mel`.\n *\n * @param mfccCoefficients - MFCC matrix [nMfcc x nFrames] row-major\n * @param nMfcc - Number of MFCC coefficients\n * @param nFrames - Number of time frames\n * @param nMels - Number of Mel bins to reconstruct (default: 128)\n * @returns Mel power spectrogram result\n */\nexport function mfccToMel(\n mfccCoefficients: Float32Array,\n nMfcc: number,\n nFrames: number,\n nMels = 128,\n): MelPowerResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mfccToMel(mfccCoefficients, nMfcc, nFrames, nMels);\n}\n\n/**\n * Reconstruct audio directly from MFCC coefficients via Griffin-Lim. Mirrors\n * `feature::mfcc_to_audio`.\n *\n * @param mfccCoefficients - MFCC matrix [nMfcc x nFrames] row-major\n * @param nMfcc - Number of MFCC coefficients\n * @param nFrames - Number of time frames\n * @param nMels - Number of Mel bins (default: 128)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nIter - Griffin-Lim iterations (default: 32)\n * @returns Reconstructed audio samples (mono, float32)\n */\nexport function mfccToAudio(\n mfccCoefficients: Float32Array,\n nMfcc: number,\n nFrames: number,\n nMels: number,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n nIter = 32,\n fmin = 0,\n fmax = 0,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.mfccToAudio(\n mfccCoefficients,\n nMfcc,\n nFrames,\n nMels,\n sampleRate,\n nFft,\n hopLength,\n nIter,\n fmin,\n fmax,\n );\n}\n\n// ============================================================================\n// Features - Chroma\n// ============================================================================\n\n/**\n * Compute chromagram (pitch class distribution).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Chroma features result\n */\nexport function chroma(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): ChromaResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.chroma(samples, sampleRate, nFft, hopLength);\n}\n\n// ============================================================================\n// Features - Spectral\n// ============================================================================\n\n/**\n * Compute spectral centroid (center of mass of spectrum).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Spectral centroid in Hz for each frame\n */\nexport function spectralCentroid(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralCentroid(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute spectral bandwidth.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Spectral bandwidth in Hz for each frame\n */\nexport function spectralBandwidth(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralBandwidth(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute spectral rolloff frequency.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param rollPercent - Percentage threshold (default: 0.85)\n * @returns Rolloff frequency in Hz for each frame\n */\nexport function spectralRolloff(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n rollPercent = 0.85,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralRolloff(samples, sampleRate, nFft, hopLength, rollPercent);\n}\n\n/**\n * Compute spectral flatness.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Spectral flatness for each frame (0 = tonal, 1 = noise-like)\n */\nexport function spectralFlatness(\n samples: Float32Array,\n sampleRate: number,\n nFft = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.spectralFlatness(samples, sampleRate, nFft, hopLength);\n}\n\n/**\n * Compute zero crossing rate.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns Zero crossing rate for each frame\n */\nexport function zeroCrossingRate(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.zeroCrossingRate(samples, sampleRate, frameLength, hopLength);\n}\n\n/**\n * Compute RMS energy.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @returns RMS energy for each frame\n */\nexport function rmsEnergy(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.rmsEnergy(samples, sampleRate, frameLength, hopLength);\n}\n\n// ============================================================================\n// Features - Pitch\n// ============================================================================\n\n/**\n * Detect pitch using YIN algorithm.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param fmin - Minimum frequency in Hz (default: 65)\n * @param fmax - Maximum frequency in Hz (default: 2093)\n * @param threshold - YIN threshold (default: 0.3)\n * @returns Pitch detection result\n */\nexport function pitchYin(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n): PitchResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchYin(samples, sampleRate, frameLength, hopLength, fmin, fmax, threshold);\n}\n\n/**\n * Detect pitch using pYIN algorithm (probabilistic YIN with HMM smoothing).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz\n * @param frameLength - Frame length (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param fmin - Minimum frequency in Hz (default: 65)\n * @param fmax - Maximum frequency in Hz (default: 2093)\n * @param threshold - YIN threshold (default: 0.3)\n * @returns Pitch detection result\n */\nexport function pitchPyin(\n samples: Float32Array,\n sampleRate: number,\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n): PitchResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pitchPyin(samples, sampleRate, frameLength, hopLength, fmin, fmax, threshold);\n}\n\n// ============================================================================\n// Core - Unit Conversion\n// ============================================================================\n\n/**\n * Convert frequency in Hz to Mel scale.\n *\n * @param hz - Frequency in Hz\n * @returns Mel frequency\n */\nexport function hzToMel(hz: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hzToMel(hz);\n}\n\n/**\n * Convert Mel scale to frequency in Hz.\n *\n * @param mel - Mel frequency\n * @returns Frequency in Hz\n */\nexport function melToHz(mel: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.melToHz(mel);\n}\n\n/**\n * Convert frequency in Hz to MIDI note number.\n *\n * @param hz - Frequency in Hz\n * @returns MIDI note number (A4 = 440 Hz = 69)\n */\nexport function hzToMidi(hz: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hzToMidi(hz);\n}\n\n/**\n * Convert MIDI note number to frequency in Hz.\n *\n * @param midi - MIDI note number\n * @returns Frequency in Hz\n */\nexport function midiToHz(midi: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.midiToHz(midi);\n}\n\n/**\n * Convert frequency in Hz to note name.\n *\n * @param hz - Frequency in Hz\n * @returns Note name (e.g., \"A4\", \"C#5\")\n */\nexport function hzToNote(hz: number): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.hzToNote(hz);\n}\n\n/**\n * Convert note name to frequency in Hz.\n *\n * @param note - Note name (e.g., \"A4\", \"C#5\")\n * @returns Frequency in Hz\n */\nexport function noteToHz(note: string): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.noteToHz(note);\n}\n\n/**\n * Convert frame index to time in seconds.\n *\n * @param frames - Frame index\n * @param sr - Sample rate in Hz\n * @param hopLength - Hop length in samples\n * @returns Time in seconds\n */\nexport function framesToTime(frames: number, sr: number, hopLength: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.framesToTime(frames, sr, hopLength);\n}\n\n/**\n * Convert time in seconds to frame index.\n *\n * @param time - Time in seconds\n * @param sr - Sample rate in Hz\n * @param hopLength - Hop length in samples\n * @returns Frame index\n */\nexport function timeToFrames(time: number, sr: number, hopLength: number): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.timeToFrames(time, sr, hopLength);\n}\n\nexport function framesToSamples(frames: number, hopLength = 512, nFft = 0): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.framesToSamples(frames, hopLength, nFft);\n}\n\nexport function samplesToFrames(samples: number, hopLength = 512, nFft = 0): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.samplesToFrames(samples, hopLength, nFft);\n}\n\nexport function powerToDb(\n values: Float32Array,\n ref = 1.0,\n amin = 1e-10,\n topDb = 80.0,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.powerToDb(values, ref, amin, topDb);\n}\n\nexport function amplitudeToDb(\n values: Float32Array,\n ref = 1.0,\n amin = 1e-5,\n topDb = 80.0,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.amplitudeToDb(values, ref, amin, topDb);\n}\n\nexport function dbToPower(values: Float32Array, ref = 1.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.dbToPower(values, ref);\n}\n\nexport function dbToAmplitude(values: Float32Array, ref = 1.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.dbToAmplitude(values, ref);\n}\n\nexport function preemphasis(samples: Float32Array, coef = 0.97, zi?: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.preemphasis(samples, coef, zi ?? null);\n}\n\nexport function deemphasis(samples: Float32Array, coef = 0.97, zi?: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.deemphasis(samples, coef, zi ?? null);\n}\n\nexport function trimSilence(\n samples: Float32Array,\n topDb = 60.0,\n frameLength = 2048,\n hopLength = 512,\n): WasmTrimResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.trimSilence(samples, topDb, frameLength, hopLength);\n}\n\nexport function splitSilence(\n samples: Float32Array,\n topDb = 60.0,\n frameLength = 2048,\n hopLength = 512,\n): Int32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.splitSilence(samples, topDb, frameLength, hopLength);\n}\n\nexport function frameSignal(\n samples: Float32Array,\n frameLength: number,\n hopLength: number,\n): WasmFrameResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.frameSignal(samples, frameLength, hopLength);\n}\n\nexport function padCenter(values: Float32Array, size: number, padValue = 0.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.padCenter(values, size, padValue);\n}\n\nexport function fixLength(values: Float32Array, size: number, padValue = 0.0): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.fixLength(values, size, padValue);\n}\n\nexport function fixFrames(frames: Int32Array, xMin = 0, xMax = -1, pad = true): Int32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.fixFrames(frames, xMin, xMax, pad);\n}\n\nexport function peakPick(\n values: Float32Array,\n preMax: number,\n postMax: number,\n preAvg: number,\n postAvg: number,\n delta: number,\n wait: number,\n): Int32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.peakPick(values, preMax, postMax, preAvg, postAvg, delta, wait);\n}\n\nexport function vectorNormalize(\n values: Float32Array,\n normType = 0,\n threshold = 1e-12,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.vectorNormalize(values, normType, threshold);\n}\n\nexport function pcen(\n values: Float32Array,\n nBins: number,\n nFrames: number,\n options: Record<string, number> = {},\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.pcen(values, nBins, nFrames, options);\n}\n\nexport function tonnetz(chromagram: Float32Array, nChroma: number, nFrames: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.tonnetz(chromagram, nChroma, nFrames);\n}\n\nexport function tempogram(\n onsetEnvelope: Float32Array,\n sampleRate: number,\n hopLength = 512,\n winLength = 384,\n mode: TempogramMode = 'autocorrelation',\n): WasmTempogramResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.tempogram(onsetEnvelope, sampleRate, hopLength, winLength, mode);\n}\n\nexport function cyclicTempogram(\n onsetEnvelope: Float32Array,\n sampleRate: number,\n hopLength = 512,\n winLength = 384,\n bpmMin = 60.0,\n nBins = 60,\n): WasmCyclicTempogramResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.cyclicTempogram(onsetEnvelope, sampleRate, hopLength, winLength, bpmMin, nBins);\n}\n\nexport function plp(\n onsetEnvelope: Float32Array,\n sampleRate: number,\n hopLength = 512,\n tempoMin = 30.0,\n tempoMax = 300.0,\n winLength = 384,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.plp(onsetEnvelope, sampleRate, hopLength, tempoMin, tempoMax, winLength);\n}\n\n/**\n * Compute NNLS (non-negative least squares) chromagram.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @returns NNLS chroma result\n */\nexport function nnlsChroma(samples: Float32Array, sampleRate = 22050): WasmNnlsChromaResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.nnlsChroma(samples, sampleRate);\n}\n\n/**\n * Compute the Constant-Q Transform magnitude.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param hopLength - Hop length (default: 512)\n * @param fmin - Minimum frequency in Hz (default: 32.70319566257483, C1)\n * @param nBins - Number of frequency bins (default: 84)\n * @param binsPerOctave - Bins per octave (default: 12)\n * @returns CQT magnitude result\n */\nexport function cqt(\n samples: Float32Array,\n sampleRate = 22050,\n hopLength = 512,\n fmin = 32.70319566257483,\n nBins = 84,\n binsPerOctave = 12,\n): CqtResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.cqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave);\n}\n\n/**\n * Compute the Variable-Q Transform magnitude (gamma controls Q).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param hopLength - Hop length (default: 512)\n * @param fmin - Minimum frequency in Hz (default: 32.70319566257483, C1)\n * @param nBins - Number of frequency bins (default: 84)\n * @param binsPerOctave - Bins per octave (default: 12)\n * @param gamma - Bandwidth offset; 0 is equivalent to CQT (default: 0)\n * @returns VQT magnitude result (same shape as CQT)\n */\nexport function vqt(\n samples: Float32Array,\n sampleRate = 22050,\n hopLength = 512,\n fmin = 32.70319566257483,\n nBins = 84,\n binsPerOctave = 12,\n gamma = 0,\n): CqtResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.vqt(samples, sampleRate, hopLength, fmin, nBins, binsPerOctave, gamma);\n}\n\n/**\n * Detect song-structure sections (intro/verse/chorus/...).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param minSectionSec - Minimum section duration in seconds (default: 8.0)\n * @returns Array of detected sections\n */\nexport function analyzeSections(\n samples: Float32Array,\n sampleRate = 22050,\n nFft = 2048,\n hopLength = 512,\n minSectionSec = 8.0,\n): Section[] {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module\n .analyzeSections(samples, sampleRate, nFft, hopLength, minSectionSec)\n .map((s) => ({ ...s, type: s.type as SectionType }));\n}\n\n/**\n * Extract the melody contour from monophonic audio via YIN.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param fmin - Minimum frequency in Hz (default: 65.0)\n * @param fmax - Maximum frequency in Hz (default: 2093.0)\n * @param frameLength - Frame length in samples (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param threshold - YIN threshold; lower is stricter (default: 0.1)\n * @returns Melody contour with per-frame pitch points and summary stats\n */\nexport function analyzeMelody(\n samples: Float32Array,\n sampleRate = 22050,\n fmin = 65.0,\n fmax = 2093.0,\n frameLength = 2048,\n hopLength = 512,\n threshold = 0.1,\n): MelodyResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.analyzeMelody(samples, sampleRate, fmin, fmax, frameLength, hopLength, threshold);\n}\n\n/**\n * Compute the onset strength envelope.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param nFft - FFT size (default: 2048)\n * @param hopLength - Hop length (default: 512)\n * @param nMels - Number of Mel bands (default: 128)\n * @returns Onset envelope for each frame\n */\nexport function onsetEnvelope(\n samples: Float32Array,\n sampleRate = 22050,\n nFft = 2048,\n hopLength = 512,\n nMels = 128,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.onsetEnvelope(samples, sampleRate, nFft, hopLength, nMels);\n}\n\n/**\n * Compute the Fourier tempogram from an onset envelope.\n *\n * @param onsetEnvelope - Onset strength envelope (float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param hopLength - Hop length (default: 512)\n * @param winLength - Window length in frames (default: 384)\n * @returns Fourier tempogram result\n */\nexport function fourierTempogram(\n onsetEnvelope: Float32Array,\n sampleRate = 22050,\n hopLength = 512,\n winLength = 384,\n): WasmFourierTempogramResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.fourierTempogram(onsetEnvelope, sampleRate, hopLength, winLength);\n}\n\n/**\n * Compute tempogram ratio features.\n *\n * @param tempogramData - Tempogram data (float32)\n * @param winLength - Window length in frames (default: 384)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @param hopLength - Hop length (default: 512)\n * @returns Tempogram ratio features\n */\nexport function tempogramRatio(\n tempogramData: Float32Array,\n winLength = 384,\n sampleRate = 22050,\n hopLength = 512,\n): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.tempogramRatio(tempogramData, winLength, sampleRate, hopLength);\n}\n\n/**\n * Measure loudness (EBU R128 / ITU-R BS.1770).\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @returns Loudness measurement result\n */\nexport function lufs(samples: Float32Array, sampleRate = 22050): LufsResult {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.lufs(samples, sampleRate);\n}\n\n/**\n * Compute the momentary loudness (LUFS) over time.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @returns Momentary LUFS values over time\n */\nexport function momentaryLufs(samples: Float32Array, sampleRate = 22050): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.momentaryLufs(samples, sampleRate);\n}\n\n/**\n * Compute the short-term loudness (LUFS) over time.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleRate - Sample rate in Hz (default: 22050)\n * @returns Short-term LUFS values over time\n */\nexport function shortTermLufs(samples: Float32Array, sampleRate = 22050): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.shortTermLufs(samples, sampleRate);\n}\n\n// ============================================================================\n// Core - Resample\n// ============================================================================\n\n/**\n * Resample audio to a different sample rate.\n *\n * @param samples - Audio samples (mono, float32)\n * @param srcSr - Source sample rate in Hz\n * @param targetSr - Target sample rate in Hz\n * @returns Resampled audio\n */\nexport function resample(samples: Float32Array, srcSr: number, targetSr: number): Float32Array {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.resample(samples, srcSr, targetSr);\n}\n\n// ============================================================================\n// Audio Class\n// ============================================================================\n\n/**\n * Wrapper around audio data that exposes all analysis and feature functions as instance methods.\n *\n * @example\n * ```typescript\n * import { init, Audio } from '@libraz/sonare';\n *\n * await init();\n *\n * const audio = Audio.fromBuffer(samples, 44100);\n * console.log('BPM:', audio.detectBpm());\n * console.log('Key:', audio.detectKey().name);\n *\n * const mel = audio.melSpectrogram();\n * ```\n */\nexport class Audio {\n private _samples: Float32Array;\n private _sampleRate: number;\n\n private constructor(samples: Float32Array, sampleRate: number) {\n this._samples = samples;\n this._sampleRate = sampleRate;\n }\n\n /** Create an Audio instance from raw sample data. */\n static fromBuffer(samples: Float32Array, sampleRate: number): Audio {\n return new Audio(samples, sampleRate);\n }\n\n /** The raw audio samples. */\n get data(): Float32Array {\n return this._samples;\n }\n\n /** Number of samples. */\n get length(): number {\n return this._samples.length;\n }\n\n /** Sample rate in Hz. */\n get sampleRate(): number {\n return this._sampleRate;\n }\n\n /** Duration in seconds. */\n get duration(): number {\n return this._samples.length / this._sampleRate;\n }\n\n // -- Analysis --\n\n detectBpm(): number {\n return detectBpm(this._samples, this._sampleRate);\n }\n\n detectKey(options: KeyDetectionOptions = {}): Key {\n return detectKey(this._samples, this._sampleRate, options);\n }\n\n detectKeyCandidates(options: KeyDetectionOptions = {}): KeyCandidate[] {\n return detectKeyCandidates(this._samples, this._sampleRate, options);\n }\n\n detectOnsets(): Float32Array {\n return detectOnsets(this._samples, this._sampleRate);\n }\n\n detectBeats(): Float32Array {\n return detectBeats(this._samples, this._sampleRate);\n }\n\n detectDownbeats(): Float32Array {\n return detectDownbeats(this._samples, this._sampleRate);\n }\n\n detectChords(options: ChordDetectionOptions = {}): ChordAnalysisResult {\n return detectChords(this._samples, this._sampleRate, options);\n }\n\n analyze(): AnalysisResult {\n return analyze(this._samples, this._sampleRate);\n }\n\n analyzeWithProgress(onProgress: ProgressCallback): AnalysisResult {\n return analyzeWithProgress(this._samples, this._sampleRate, onProgress);\n }\n\n // -- Effects --\n\n hpss(kernelHarmonic = 31, kernelPercussive = 31): HpssResult {\n return hpss(this._samples, this._sampleRate, kernelHarmonic, kernelPercussive);\n }\n\n harmonic(): Float32Array {\n return harmonic(this._samples, this._sampleRate);\n }\n\n percussive(): Float32Array {\n return percussive(this._samples, this._sampleRate);\n }\n\n timeStretch(rate: number): Float32Array {\n return timeStretch(this._samples, this._sampleRate, rate);\n }\n\n pitchShift(semitones: number): Float32Array {\n return pitchShift(this._samples, this._sampleRate, semitones);\n }\n\n pitchCorrectToMidi(currentMidi: number, targetMidi: number): Float32Array {\n return pitchCorrectToMidi(this._samples, this._sampleRate, currentMidi, targetMidi);\n }\n\n noteStretch(onsetSample: number, offsetSample: number, stretchRatio: number): Float32Array {\n return noteStretch(this._samples, this._sampleRate, onsetSample, offsetSample, stretchRatio);\n }\n\n voiceChange(pitchSemitones: number, formantFactor: number): Float32Array {\n return voiceChange(this._samples, this._sampleRate, pitchSemitones, formantFactor);\n }\n\n normalize(targetDb = 0.0): Float32Array {\n return normalize(this._samples, this._sampleRate, targetDb);\n }\n\n mastering(targetLufs = -14.0, ceilingDb = -1.0, truePeakOversample = 4): MasteringResult {\n return mastering(this._samples, this._sampleRate, targetLufs, ceilingDb, truePeakOversample);\n }\n\n masteringChain(config: MasteringChainConfig): MasteringChainResult {\n return masteringChain(this._samples, this._sampleRate, config);\n }\n\n masterAudio(\n presetName: MasteringPreset,\n overrides: Record<string, number | boolean> | null = null,\n ): MasteringChainResult {\n return masterAudio(this._samples, this._sampleRate, presetName, overrides);\n }\n\n masteringProcess(\n processorName: SoloProcessor,\n params: MasteringProcessorParams = {},\n ): MasteringResult {\n return masteringProcess(processorName, this._samples, this._sampleRate, params);\n }\n\n trim(thresholdDb = -60.0): Float32Array {\n return trim(this._samples, this._sampleRate, thresholdDb);\n }\n\n // -- Features --\n\n stft(nFft = 2048, hopLength = 512): StftResult {\n return stft(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n stftDb(nFft = 2048, hopLength = 512): { nBins: number; nFrames: number; db: Float32Array } {\n return stftDb(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n melSpectrogram(nFft = 2048, hopLength = 512, nMels = 128): MelSpectrogramResult {\n return melSpectrogram(this._samples, this._sampleRate, nFft, hopLength, nMels);\n }\n\n mfcc(nFft = 2048, hopLength = 512, nMels = 128, nMfcc = 13): MfccResult {\n return mfcc(this._samples, this._sampleRate, nFft, hopLength, nMels, nMfcc);\n }\n\n chroma(nFft = 2048, hopLength = 512): ChromaResult {\n return chroma(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n nnlsChroma(): WasmNnlsChromaResult {\n return nnlsChroma(this._samples, this._sampleRate);\n }\n\n onsetEnvelope(nFft = 2048, hopLength = 512, nMels = 128): Float32Array {\n return onsetEnvelope(this._samples, this._sampleRate, nFft, hopLength, nMels);\n }\n\n lufs(): LufsResult {\n return lufs(this._samples, this._sampleRate);\n }\n\n momentaryLufs(): Float32Array {\n return momentaryLufs(this._samples, this._sampleRate);\n }\n\n shortTermLufs(): Float32Array {\n return shortTermLufs(this._samples, this._sampleRate);\n }\n\n spectralCentroid(nFft = 2048, hopLength = 512): Float32Array {\n return spectralCentroid(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n spectralBandwidth(nFft = 2048, hopLength = 512): Float32Array {\n return spectralBandwidth(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n spectralRolloff(nFft = 2048, hopLength = 512, rollPercent = 0.85): Float32Array {\n return spectralRolloff(this._samples, this._sampleRate, nFft, hopLength, rollPercent);\n }\n\n spectralFlatness(nFft = 2048, hopLength = 512): Float32Array {\n return spectralFlatness(this._samples, this._sampleRate, nFft, hopLength);\n }\n\n zeroCrossingRate(frameLength = 2048, hopLength = 512): Float32Array {\n return zeroCrossingRate(this._samples, this._sampleRate, frameLength, hopLength);\n }\n\n rmsEnergy(frameLength = 2048, hopLength = 512): Float32Array {\n return rmsEnergy(this._samples, this._sampleRate, frameLength, hopLength);\n }\n\n pitchYin(\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n ): PitchResult {\n return pitchYin(this._samples, this._sampleRate, frameLength, hopLength, fmin, fmax, threshold);\n }\n\n pitchPyin(\n frameLength = 2048,\n hopLength = 512,\n fmin = 65.0,\n fmax = 2093.0,\n threshold = 0.3,\n ): PitchResult {\n return pitchPyin(\n this._samples,\n this._sampleRate,\n frameLength,\n hopLength,\n fmin,\n fmax,\n threshold,\n );\n }\n\n resample(targetSr: number): Float32Array {\n return resample(this._samples, this._sampleRate, targetSr);\n }\n}\n\n// ============================================================================\n// StreamAnalyzer Class\n// ============================================================================\n\n/**\n * Real-time streaming audio analyzer.\n *\n * @example\n * ```typescript\n * import { init, StreamAnalyzer } from '@libraz/sonare';\n *\n * await init();\n *\n * const analyzer = new StreamAnalyzer({ sampleRate: 44100 });\n *\n * // In audio processing callback\n * analyzer.process(samples);\n *\n * // Get current analysis state\n * const stats = analyzer.stats();\n * console.log('BPM:', stats.estimate.bpm);\n * console.log('Key:', stats.estimate.key);\n * console.log('Chord progression:', stats.estimate.chordProgression);\n * ```\n */\nexport class StreamAnalyzer {\n private analyzer: WasmStreamAnalyzer;\n\n /**\n * Create a new StreamAnalyzer.\n *\n * @param config - Configuration options\n */\n constructor(config: StreamConfig) {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n const wasmModule = module;\n const args = [\n config.sampleRate,\n config.nFft ?? 2048,\n config.hopLength ?? 512,\n config.nMels ?? 128,\n config.fmin ?? 0,\n config.fmax ?? 0,\n config.tuningRefHz ?? 440,\n config.computeMagnitude ?? true,\n config.computeMel ?? true,\n config.computeChroma ?? true,\n config.computeOnset ?? true,\n config.computeSpectral ?? true,\n config.emitEveryNFrames ?? 1,\n config.magnitudeDownsample ?? 1,\n config.keyUpdateIntervalSec ?? 5,\n config.bpmUpdateIntervalSec ?? 10,\n config.window ?? 0,\n config.outputFormat ?? 0,\n ] as const;\n const isArityError = (error: unknown): boolean => {\n const message = String((error as { message?: unknown } | null)?.message ?? error);\n return message.includes('invalid number of parameters');\n };\n const createLegacy = (): WasmStreamAnalyzer => {\n const LegacyStreamAnalyzer = wasmModule.StreamAnalyzer as unknown as new (\n sampleRate: number,\n nFft: number,\n hopLength: number,\n nMels: number,\n computeMel: boolean,\n computeChroma: boolean,\n computeOnset: boolean,\n emitEveryNFrames: number,\n ) => WasmStreamAnalyzer;\n return new LegacyStreamAnalyzer(\n args[0],\n args[1],\n args[2],\n args[3],\n args[8],\n args[9],\n args[10],\n args[12],\n );\n };\n const hasExtendedConfig =\n config.fmin !== undefined ||\n config.fmax !== undefined ||\n config.tuningRefHz !== undefined ||\n config.computeMagnitude !== undefined ||\n config.computeSpectral !== undefined ||\n config.magnitudeDownsample !== undefined ||\n config.keyUpdateIntervalSec !== undefined ||\n config.bpmUpdateIntervalSec !== undefined ||\n config.window !== undefined ||\n config.outputFormat !== undefined;\n if (hasExtendedConfig) {\n try {\n this.analyzer = new wasmModule.StreamAnalyzer(...args);\n } catch (error) {\n if (!isArityError(error)) {\n throw error;\n }\n this.analyzer = createLegacy();\n }\n } else {\n try {\n this.analyzer = createLegacy();\n } catch (error) {\n if (!isArityError(error)) {\n throw error;\n }\n this.analyzer = new wasmModule.StreamAnalyzer(...args);\n }\n }\n }\n\n /**\n * Process audio samples.\n *\n * @param samples - Audio samples (mono, float32)\n */\n process(samples: Float32Array): void {\n this.analyzer.process(samples);\n }\n\n /**\n * Process audio samples with explicit sample offset.\n *\n * @param samples - Audio samples (mono, float32)\n * @param sampleOffset - Cumulative sample count at start of this chunk\n */\n processWithOffset(samples: Float32Array, sampleOffset: number): void {\n this.analyzer.processWithOffset(samples, sampleOffset);\n }\n\n /**\n * Get the number of frames available to read.\n */\n availableFrames(): number {\n return this.analyzer.availableFrames();\n }\n\n /**\n * Read processed frames as Structure of Arrays.\n *\n * @param maxFrames - Maximum number of frames to read\n * @returns Frame buffer with analysis results\n */\n readFrames(maxFrames: number): FrameBuffer {\n return this.analyzer.readFramesSoa(maxFrames);\n }\n\n readFramesU8(maxFrames: number): StreamFramesU8 {\n return this.analyzer.readFramesU8(maxFrames) as StreamFramesU8;\n }\n\n readFramesI16(maxFrames: number): StreamFramesI16 {\n return this.analyzer.readFramesI16(maxFrames) as StreamFramesI16;\n }\n\n /**\n * Reset the analyzer state.\n *\n * @param baseSampleOffset - Starting sample offset (default 0)\n */\n reset(baseSampleOffset = 0): void {\n this.analyzer.reset(baseSampleOffset);\n }\n\n /**\n * Get current statistics and progressive estimates.\n *\n * @returns Analyzer statistics including BPM, key, and chord progression\n */\n stats(): AnalyzerStats {\n const s = this.analyzer.stats();\n return {\n totalFrames: s.totalFrames,\n totalSamples: s.totalSamples,\n durationSeconds: s.durationSeconds,\n estimate: {\n bpm: s.estimate.bpm,\n bpmConfidence: s.estimate.bpmConfidence,\n bpmCandidateCount: s.estimate.bpmCandidateCount,\n key: s.estimate.key as PitchClass,\n keyMinor: s.estimate.keyMinor,\n keyConfidence: s.estimate.keyConfidence,\n chordRoot: s.estimate.chordRoot as PitchClass,\n chordQuality: s.estimate.chordQuality as ChordQuality,\n chordConfidence: s.estimate.chordConfidence,\n chordStartTime: s.estimate.chordStartTime,\n chordProgression: s.estimate.chordProgression.map((c) => ({\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n startTime: c.startTime,\n confidence: c.confidence,\n })),\n barChordProgression: s.estimate.barChordProgression.map((c) => ({\n barIndex: c.barIndex,\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n startTime: c.startTime,\n confidence: c.confidence,\n })),\n currentBar: s.estimate.currentBar,\n barDuration: s.estimate.barDuration,\n votedPattern: (s.estimate.votedPattern || []).map((c) => ({\n barIndex: c.barIndex,\n root: c.root as PitchClass,\n quality: c.quality as ChordQuality,\n startTime: c.startTime,\n confidence: c.confidence,\n })),\n patternLength: s.estimate.patternLength,\n detectedPatternName: s.estimate.detectedPatternName || '',\n detectedPatternScore: s.estimate.detectedPatternScore || 0,\n allPatternScores: (s.estimate.allPatternScores || []).map((p) => ({\n name: p.name,\n score: p.score,\n })),\n accumulatedSeconds: s.estimate.accumulatedSeconds,\n usedFrames: s.estimate.usedFrames,\n updated: s.estimate.updated,\n },\n };\n }\n\n /**\n * Get total frames processed.\n */\n frameCount(): number {\n return this.analyzer.frameCount();\n }\n\n /**\n * Get current time position in seconds.\n */\n currentTime(): number {\n return this.analyzer.currentTime();\n }\n\n /**\n * Get the sample rate.\n */\n sampleRate(): number {\n return this.analyzer.sampleRate();\n }\n\n /**\n * Set the expected total duration for pattern lock timing.\n *\n * @param durationSeconds - Total duration in seconds\n */\n setExpectedDuration(durationSeconds: number): void {\n this.analyzer.setExpectedDuration(durationSeconds);\n }\n\n /**\n * Set normalization gain for loud/compressed audio.\n *\n * @param gain - Gain factor to apply (e.g., 0.5 for -6dB reduction)\n */\n setNormalizationGain(gain: number): void {\n this.analyzer.setNormalizationGain(gain);\n }\n\n /**\n * Set tuning reference frequency for non-standard tuning.\n *\n * @param refHz - Reference frequency for A4 (default 440 Hz)\n * @example\n * // If audio is 1 semitone sharp (A4 = 466.16 Hz)\n * analyzer.setTuningRefHz(466.16);\n * // If audio is 1 semitone flat (A4 = 415.30 Hz)\n * analyzer.setTuningRefHz(415.30);\n */\n setTuningRefHz(refHz: number): void {\n this.analyzer.setTuningRefHz(refHz);\n }\n\n /**\n * Release resources. Call when done using the analyzer.\n */\n dispose(): void {\n this.analyzer.delete();\n }\n}\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport { PitchClass as Pitch } from './public_types';\n"],"mappings":"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","names":["onsetEnvelope"]}