import type { PhaseMapSpec } from './phasemap' /** A mono clip at a given sample rate. */ export type Source = { name: string fs: number samples: Float32Array } export type RenderRequest = { id: number samples: Float32Array fs: number sigmaMs: number map: PhaseMapSpec /** upper frequency for all plots */ fmax: number maxCols: number maxRows: number /** number of points in the response curves */ curvePoints: number } export type Curve = { f: Float32Array; y: Float32Array } /** A rows x cols image over time (columns) and frequency (rows, row 0 at 0 Hz). */ export type ImageData2D = { data: Float32Array rows: number cols: number durationSec: number fmax: number } export type RenderResult = { id: number /** the phase-rotated sound, unscaled */ y: Float32Array /** shared playback gain for A and B */ gain: number /** ||y - x|| / ||x|| */ relDiff: number bands: number sigmaF: number /** whether the map changed over the clip */ timeVarying: boolean /** the phase map over time and frequency, in radians wrapped to (-pi, pi] */ phaseField: ImageData2D /** magnitude in dB of the filter equivalent to the map (at the middle of the clip if it varies) */ magDb: Curve /** group delay in ms of that filter */ groupDelayMs: Curve maxGroupDelayMs: number /** largest |magnitude response| in dB over the plotted range; large values mean the map is too rough for the window */ maxMagDeviationDb: number /** spectrograms in dB relative to a shared maximum */ specA: ImageData2D specB: ImageData2D elapsedMs: number }