/** * Detect a loop via recurrence-matrix analysis. * * @param {AudioBuffer|Object} audioBuffer * @param {Object} [options] * @param {number} [options.hopLength=512] * @param {number} [options.maxFrames=1500] - frame cap (matrix cost is frames²) * @param {number} [options.minConfidence=0.1] - quality gate (audio-validated NCC) * @param {boolean} [options.rqa=false] - add an RQA-path-derived candidate * @param {boolean} [options.snapToZero=true] - trim boundaries to zero crossings * @returns {Promise} { loopStart, loopEnd, confidence, candidates, diagnostics } * @throws diagnostic errors naming the failed gate (never fabricates a result) */ export function recurrenceLoop(audioBuffer: AudioBuffer | any, options?: { hopLength?: number; maxFrames?: number; minConfidence?: number; rqa?: boolean; snapToZero?: boolean; }): Promise;