import type { InterpolationStrategyParams, RateTransposerInterpolationStrategy, SampleBufferType, StretchParameters } from '@soundtouchjs/core'; export type { StretchParameters } from '@soundtouchjs/core'; /** * Snapshot of processor performance metrics received from the render thread. * * @remarks * Emitted every 100 render blocks via the `metrics` CustomEvent on `SoundTouchNode`. * Access the latest snapshot via `SoundTouchNode.metrics`. */ export interface ProcessorMetrics { /** Frames available in the output buffer at the last render block. */ framesBuffered: number; /** Cumulative render blocks where the output buffer had fewer frames than requested. */ underrunCount: number; /** Total render blocks processed since the processor was created. */ blockCount: number; /** RMS of output block (last 128 frames, both channels averaged) */ outputRms: number; /** Peak of output block (last 128 frames, both channels) */ outputPeak: number; /** `performance.now()` timestamp recorded on the main thread when the metrics arrived. */ timestamp: DOMHighResTimeStamp; } /** * Construction options for `SoundTouchNode`. * * @remarks * Used to configure the AudioWorkletNode and its processor, including buffer strategy and interpolation strategy. */ export interface SoundTouchNodeOptions { /** * Optional processor URL retained for caller-side convenience. * * @remarks * Module registration is still performed through `SoundTouchNode.register`. */ processorUrl?: string | URL; /** * Internal sample buffer strategy used inside the render-thread processor. */ sampleBufferType?: SampleBufferType; /** * Interpolation strategy used by the internal rate transposer. */ interpolationStrategy?: RateTransposerInterpolationStrategy; } /** * Construction options for SoundTouchNode constructor. * Extends SoundTouchNodeOptions with required context. */ export interface SoundTouchNodeConstructorOptions extends SoundTouchNodeOptions { /** * The AudioContext or OfflineAudioContext. * @remarks * Required for node construction; determines the audio graph context. */ context: BaseAudioContext; /** * Number of output channels. Defaults to `2` (stereo). * * @remarks * Set to `1` when connecting to a mono destination or a downstream * node that only accepts a single channel. The processor always * processes interleaved stereo internally; setting this to `1` tells * the Web Audio graph to mix down to mono on the output side. * * Note: mono input is always supported regardless of this setting — * the processor duplicates a single input channel to both sides of * the stereo pipeline automatically. */ outputChannelCount?: 1 | 2; } /** * Main-thread AudioWorkletNode wrapper for SoundTouch audio processing. * * @remarks * Provides AudioParam accessors for `pitch`, `pitchSemitones`, and * `playbackRate`. Communicates with the render-thread processor for real-time * audio transformation. * * @example * const source = audioCtx.createBufferSource(); * source.connect(stNode); * * const stNode = new SoundTouchNode({ context: audioCtx }); * stNode.pitch.value = 1.2; * source.playbackRate.value = 0.8; * stNode.playbackRate.value = 0.8; * stNode.pitchSemitones.value = -3; */ export declare class SoundTouchNode extends AudioWorkletNode { /** * The registered processor name for this node type. */ static readonly processorName = "soundtouch-processor"; /** * Registers the SoundTouch processor module with the given AudioContext. * * @remarks * Must be called before creating SoundTouchNode instances. Loads the processor script into the AudioWorklet. * * @param context - The AudioContext or OfflineAudioContext * @param processorUrl - URL or path to the processor script */ static register(context: BaseAudioContext, processorUrl: string | URL): Promise; /** * Registers an interpolation strategy installer module in AudioWorkletGlobalScope. * * @remarks * The module should call core registration APIs during evaluation. * Loads a strategy plugin for use in the render-thread processor. */ static registerStrategyModule(context: BaseAudioContext, strategyModuleUrl: string | URL): Promise; private _lastMetrics; /** * Creates a SoundTouchNode instance. * @param options - Node and processor configuration. */ constructor({ context, sampleBufferType, interpolationStrategy, outputChannelCount, }: SoundTouchNodeConstructorOptions); /** * Returns the most recent processor metrics snapshot, or `null` if no metrics have been received yet. * * @remarks * Updated every 100 render blocks by the processor. Also dispatched as a `metrics` CustomEvent. * * @example * stNode.addEventListener('metrics', (e) => { * console.log((e as CustomEvent).detail.underrunCount); * }); */ get metrics(): ProcessorMetrics | null; /** * Pitch multiplier AudioParam (1.0 = original pitch). * @returns The AudioParam controlling pitch. */ get pitch(): AudioParam; /** * Pitch shift in semitones AudioParam (integer steps for musical key changes). * @returns The AudioParam controlling pitch in semitones. */ get pitchSemitones(): AudioParam; /** * Playback rate AudioParam. Set this to the same value as the source node's * playbackRate so the processor can compensate pitch for tempo changes. * @returns The AudioParam controlling playback rate. */ get playbackRate(): AudioParam; /** * Switches interpolation strategy at runtime in the render-thread processor. * @param strategy The new interpolation strategy to use. */ setInterpolationStrategy(strategy: RateTransposerInterpolationStrategy): void; /** * Applies a partial params update to the active interpolation strategy. * @param params Partial set of parameters to update. */ setInterpolationStrategyParams(params: Partial): void; /** * Applies a partial set of WSOLA timing parameters to the render-thread processor. * * @remarks * The update is queued and applied at the next render-block boundary. Only the * provided fields are updated; omitted fields remain unchanged. Pass `sequenceMs: 0` * or `seekWindowMs: 0` to switch that dimension back to auto-calculation. * * @param params Partial WSOLA timing parameters to apply. * * @example * stNode.setStretchParameters({ overlapMs: 12, quickSeek: false }); */ setStretchParameters(params: StretchParameters): void; } //# sourceMappingURL=SoundTouchNode.d.ts.map