/** * Chroma features from a log-frequency spectrum (formerly "CQT chroma"). * Delegates to logFrequencySpectrum + foldLogSpectrumToChroma. * @param {Float32Array} y - Audio time series * @param {number} sr - Sample rate * @param {number} hop_length - Hop between frames * @param {number|null} fmin - Minimum frequency (C1 = 32.7 Hz if null) * @param {number} n_chroma - Number of chroma bins * @param {number} tuning - Tuning deviation in cents * @param {number} n_octaves - Number of octaves to analyze * @param {number} bins_per_octave - Must equal n_chroma (fold constraint) * @returns {Array} [n_chroma][n_frames] */ export function chroma_cqt(y: Float32Array, sr?: number, hop_length?: number, fmin?: number | null, n_chroma?: number, tuning?: number, n_octaves?: number, bins_per_octave?: number): Array; /** * Chromagram from STFT — now via feature/chroma.js * (Gaussian filterbank matmul + per-frame inf-norm; the old version used * hard nearest-semitone binning and no frame centering). * @param {Float32Array} y - Audio time series * @param {number} sr - Sample rate * @param {number} hop_length - Hop length * @param {number} n_fft - FFT window size * @param {number} n_chroma - Number of chroma bins * @param {number|null} tuning - Tuning in fractional chroma bins * (0.0 default preserves this shim's historical signature; pass null to * estimate from the signal) * @returns {Array} [n_chroma][n_frames] */ export function chroma_stft(y: Float32Array, sr?: number, hop_length?: number, n_fft?: number, n_chroma?: number, tuning?: number | null): Array; /** * DEPRECATED NAME — this is NOT a constant-Q transform. Delegates to * feature/chroma.js logFrequencySpectrum (nearest-FFT-bin sampling at * log-spaced frequencies). * @returns {Array} time-major [n_frames][n_bins] */ export function constant_q_transform(y: any, sr: any, hop_length: any, fmin?: any, n_bins?: number, tuning?: number): Array; /** * Map an interleaved FFT spectrum ([re0, im0, re1, im1, ...]) to * log-frequency bins by nearest-bin sampling (legacy helper for the * xa-onset.fft output format). * @param {Float32Array} spectrum - Interleaved complex FFT output * @param {number} sr - Sample rate * @param {number} fmin - Minimum frequency * @param {number} n_bins - Number of log-frequency bins * @param {number} n_fft - FFT size * @returns {Float32Array} log-frequency magnitude bins */ export function mapToCQTBins(spectrum: Float32Array, sr: number, fmin: number, n_bins: number, n_fft: number): Float32Array; /** * Fold a time-major log-frequency spectrum into chroma classes. * Delegates to feature/chroma.js foldLogSpectrumToChroma, which (unlike the * old silent version) throws when bins_per_octave !== n_chroma. * @returns {Array} [n_chroma][n_frames] */ export function cqt_to_chroma(cqt: any, n_chroma?: number, bins_per_octave?: number): Array; /** * FAST VARIANT (not the reference path): fold magnitude spectra into chroma by * hard nearest-semitone binning with sqrt-energy-share normalization. * Kept as an explicitly-named approximation; feature/chroma.js chroma_stft * is the reference path. * @param {Array} magnitude_spectra - time-major magnitude spectra * @param {number} sr - Sample rate * @param {number} n_fft - FFT size * @param {number} n_chroma - Number of chroma bins * @param {number} tuning - Tuning deviation in cents * @returns {Array} [n_chroma][n_frames] */ export function stft_to_chroma(magnitude_spectra: any[], sr: number, n_fft: number, n_chroma?: number, tuning?: number): Array; /** * Convert frequency to chroma class (0-11) * @param {number} freq - Frequency in Hz * @returns {number} Chroma class (0=C, 1=C#, 2=D, etc.) */ export function freq_to_chroma(freq: number): number; /** * Compute chroma vector from a single spectrum (fast variant, not reference) * @param {Float32Array} spectrum - Magnitude spectrum * @param {number} sr - Sample rate * @param {number} tuning - Tuning deviation * @returns {Float32Array} Chroma vector (12 elements) */ export function spectrum_to_chroma(spectrum: Float32Array, sr: number, tuning?: number): Float32Array; /** * Enhance chroma features for better key detection * @param {Array} chroma - Input chroma matrix * @param {number} norm - Normalization order (1, 2, or Infinity) * @returns {Array} Enhanced chroma matrix */ export function enhance_chroma(chroma: any[], norm?: number): any[]; /** * Compute chroma energy (sum of all chroma values per frame) * @param {Array} chroma - Chroma matrix * @returns {Float32Array} Energy per frame */ export function chroma_energy(chroma: any[]): Float32Array; /** * Convert chroma index to note name * @param {number} chroma_idx - Chroma index (0-11) * @returns {string} Note name */ export function chroma_to_note(chroma_idx: number): string; /** * Compute a Variable-Q chromagram * @param {Float32Array|null} y - Audio time series * @param {number} sr - Sample rate * @param {Array|null} V - Pre-computed VQT spectrogram * @param {number} hop_length - Hop length * @param {number|null} fmin - Minimum frequency (default: C1) * @param {string|Array} intervals - Interval specification (default: 'equal') * @param {number|null} norm - Normalization (default: np.inf) * @param {number} threshold - Threshold for chroma calculation * @param {number} n_octaves - Number of octaves * @param {number} bins_per_octave - Bins per octave * @param {number} gamma - Bandwidth offset for VQT (0 for CQT) * @returns {Array} Chroma features [12 x n_frames] */ export function chroma_vqt(y?: Float32Array | null, sr?: number, V?: any[] | null, hop_length?: number, fmin?: number | null, intervals?: string | any[], norm?: number | null, threshold?: number, n_octaves?: number, bins_per_octave?: number, gamma?: number): any[]; export const NOTE_NAMES: string[];