/** * Find precise loop boundaries by testing actual audio repetition. * Much more accurate than bar-aligned approaches. * * @param {Float32Array} audioData * @param {number} sampleRate * @param {number} tempo - BPM used for the musical-length bonus * @param {Object} [options] * @param {number} [options.minLoopDuration=2.0] - Minimum loop length in seconds * @param {number} [options.maxLoopDuration=8.0] - Maximum loop length in seconds * @param {number} [options.searchStart=1.0] - Start searching after this many seconds * @param {number} [options.searchEnd=0.8] - Search up to this fraction of the track * @returns {Object|null} best loop { start, end, duration, score, musicalBonus, totalScore } * or null when no candidate could be scored (callers must handle null — * never invent a result) */ export function findPreciseLoop(audioData: Float32Array, sampleRate: number, tempo: number, { minLoopDuration, maxLoopDuration, searchStart, searchEnd, }?: { minLoopDuration?: number; maxLoopDuration?: number; searchStart?: number; searchEnd?: number; }): any | null;