@octoseq/mir 0.1.0-main.2e286ce

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/chunk-DUWYCAVG.js +1525 -0
  2. package/dist/chunk-DUWYCAVG.js.map +1 -0
  3. package/dist/index.d.ts +450 -0
  4. package/dist/index.js +1234 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/runMir-CSIBwNZ3.d.ts +84 -0
  7. package/dist/runner/runMir.d.ts +2 -0
  8. package/dist/runner/runMir.js +3 -0
  9. package/dist/runner/runMir.js.map +1 -0
  10. package/dist/runner/workerProtocol.d.ts +169 -0
  11. package/dist/runner/workerProtocol.js +11 -0
  12. package/dist/runner/workerProtocol.js.map +1 -0
  13. package/dist/types-BE3py4fZ.d.ts +83 -0
  14. package/package.json +55 -0
  15. package/src/dsp/fft.ts +22 -0
  16. package/src/dsp/fftBackend.ts +53 -0
  17. package/src/dsp/fftBackendFftjs.ts +60 -0
  18. package/src/dsp/hpss.ts +152 -0
  19. package/src/dsp/hpssGpu.ts +101 -0
  20. package/src/dsp/mel.ts +219 -0
  21. package/src/dsp/mfcc.ts +119 -0
  22. package/src/dsp/onset.ts +205 -0
  23. package/src/dsp/peakPick.ts +112 -0
  24. package/src/dsp/spectral.ts +95 -0
  25. package/src/dsp/spectrogram.ts +176 -0
  26. package/src/gpu/README.md +34 -0
  27. package/src/gpu/context.ts +44 -0
  28. package/src/gpu/helpers.ts +87 -0
  29. package/src/gpu/hpssMasks.ts +116 -0
  30. package/src/gpu/kernels/hpssMasks.wgsl.ts +137 -0
  31. package/src/gpu/kernels/melProject.wgsl.ts +48 -0
  32. package/src/gpu/kernels/onsetEnvelope.wgsl.ts +56 -0
  33. package/src/gpu/melProject.ts +98 -0
  34. package/src/gpu/onsetEnvelope.ts +81 -0
  35. package/src/gpu/webgpu.d.ts +176 -0
  36. package/src/index.ts +121 -0
  37. package/src/runner/runMir.ts +431 -0
  38. package/src/runner/workerProtocol.ts +189 -0
  39. package/src/search/featureVectorV1.ts +123 -0
  40. package/src/search/fingerprintV1.ts +230 -0
  41. package/src/search/refinedModelV1.ts +321 -0
  42. package/src/search/searchTrackV1.ts +206 -0
  43. package/src/search/searchTrackV1Guided.ts +863 -0
  44. package/src/search/similarity.ts +98 -0
  45. package/src/types.ts +105 -0
  46. package/src/util/display.ts +80 -0
  47. package/src/util/normalise.ts +58 -0
  48. package/src/util/stats.ts +25 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gpu/context.ts","../src/util/normalise.ts","../src/util/display.ts","../src/util/stats.ts","../src/search/fingerprintV1.ts","../src/search/similarity.ts","../src/search/searchTrackV1.ts","../src/search/featureVectorV1.ts","../src/search/refinedModelV1.ts","../src/search/searchTrackV1Guided.ts","../src/index.ts"],"names":["out","mfcc","l2Norm","dot","clamp01","nowMs","acc","totalMs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * WebGPU context wrapper for MIR computations.\n *\n * v0.1 scope:\n * - Provide a safe, explicit way for callers to opt into GPU usage.\n * - Throw a clear error when called outside the browser or when WebGPU is unavailable.\n */\nexport class MirGPU {\n public readonly device: GPUDevice;\n public readonly queue: GPUQueue;\n\n private constructor(device: GPUDevice) {\n this.device = device;\n this.queue = device.queue;\n }\n\n static async create(): Promise<MirGPU> {\n // Next.js note: callers must create MirGPU from a client component.\n if (typeof navigator === \"undefined\") {\n throw new Error(\n \"@octoseq/mir: WebGPU is only available in the browser (navigator is undefined).\"\n );\n }\n\n const nav = navigator as Navigator & { gpu?: GPU };\n if (!nav.gpu) {\n throw new Error(\n \"@octoseq/mir: WebGPU is unavailable (navigator.gpu is missing). Use CPU mode or a WebGPU-capable browser.\"\n );\n }\n\n const adapter = await nav.gpu.requestAdapter();\n if (!adapter) {\n throw new Error(\n \"@octoseq/mir: Failed to acquire a WebGPU adapter. WebGPU may be disabled or unsupported.\"\n );\n }\n\n // We keep this minimal: no required features for v0.1.\n const device = await adapter.requestDevice();\n\n return new MirGPU(device);\n }\n}\n","export type NormaliseForWaveformOptions = {\n min?: number;\n max?: number;\n center?: boolean;\n};\n\n/**\n * Normalise a time-aligned feature array into a waveform-friendly range.\n *\n * Typical uses:\n * - Map spectralFlux or centroid to [-1, 1] to re-use a waveform renderer.\n *\n * Defaults:\n * - If `center` is true: range [-1, 1] (zero-centered)\n * - Else: range [0, 1]\n */\nexport function normaliseForWaveform(\n data: Float32Array,\n options: NormaliseForWaveformOptions = {}\n): Float32Array {\n const center = options.center ?? false;\n\n const targetMin = options.min ?? (center ? -1 : 0);\n const targetMax = options.max ?? 1;\n\n if (!Number.isFinite(targetMin) || !Number.isFinite(targetMax)) {\n throw new Error(\"@octoseq/mir: normaliseForWaveform min/max must be finite\");\n }\n if (targetMax === targetMin) {\n throw new Error(\"@octoseq/mir: normaliseForWaveform max must differ from min\");\n }\n\n let srcMin = Infinity;\n let srcMax = -Infinity;\n for (let i = 0; i < data.length; i++) {\n const v = data[i] ?? 0;\n if (v < srcMin) srcMin = v;\n if (v > srcMax) srcMax = v;\n }\n\n // Degenerate or empty: return a constant line at the middle of the target range.\n if (!Number.isFinite(srcMin) || !Number.isFinite(srcMax) || srcMax === srcMin) {\n const out = new Float32Array(data.length);\n const mid = (targetMin + targetMax) / 2;\n out.fill(mid);\n return out;\n }\n\n const out = new Float32Array(data.length);\n const scale = (targetMax - targetMin) / (srcMax - srcMin);\n\n for (let i = 0; i < data.length; i++) {\n const v = data[i] ?? 0;\n out[i] = targetMin + (v - srcMin) * scale;\n }\n\n return out;\n}\n","/**\n * Display-only transforms for spectrogram-like (magnitude) data.\n *\n * These helpers are intentionally *not* used inside core MIR algorithms.\n * They exist so applications can apply established visualisation practices\n * (e.g. dB conversion, clamping) without mutating or rescaling the analysis\n * outputs.\n *\n * Shape conventions:\n * - 2D arrays are `[frame][bin]`.\n */\n\nexport type Spectrogram2D = Float32Array[]; // [frame][bin]\n\nexport type SpectrogramToDbOptions = {\n /**\n * Optional floor (minimum) dB value applied during conversion.\n * This is a display convenience only.\n */\n floorDb?: number;\n\n /** Epsilon used to avoid log(0). Defaults to 1e-12. */\n epsilon?: number;\n};\n\n/**\n * Convert linear magnitudes to dB.\n *\n * Formula: `db = 20 * log10(max(eps, magnitude))`\n *\n * Notes:\n * - This does *not* normalise or re-reference the values.\n * - The input is not mutated.\n * - Intended for visualisation only.\n */\nexport function spectrogramToDb(magnitudes2d: Spectrogram2D, options: SpectrogramToDbOptions = {}): Spectrogram2D {\n const eps = options.epsilon ?? 1e-12;\n const floorDb = options.floorDb;\n\n const out: Float32Array[] = new Array(magnitudes2d.length);\n\n for (let t = 0; t < magnitudes2d.length; t++) {\n const row = magnitudes2d[t] ?? new Float32Array(0);\n const dbRow = new Float32Array(row.length);\n\n for (let k = 0; k < row.length; k++) {\n const mag = row[k] ?? 0;\n const db = 20 * Math.log10(Math.max(eps, mag));\n dbRow[k] = floorDb !== undefined ? Math.max(floorDb, db) : db;\n }\n\n out[t] = dbRow;\n }\n\n return out;\n}\n\n/**\n * Clamp a dB-scaled 2D array to a fixed range.\n *\n * The input is not mutated.\n * Intended for visualisation only.\n */\nexport function clampDb(db2d: Spectrogram2D, minDb: number, maxDb: number): Spectrogram2D {\n const out: Float32Array[] = new Array(db2d.length);\n\n for (let t = 0; t < db2d.length; t++) {\n const row = db2d[t] ?? new Float32Array(0);\n const clamped = new Float32Array(row.length);\n\n for (let k = 0; k < row.length; k++) {\n const v = row[k] ?? 0;\n clamped[k] = v < minDb ? minDb : v > maxDb ? maxDb : v;\n }\n\n out[t] = clamped;\n }\n\n return out;\n}\n","export type MinMax = {\n min: number;\n max: number;\n};\n\n/**\n * Compute min/max in a single pass without using spread / Math.min(...arr).\n *\n * Safe for very large arrays (millions of samples).\n */\nexport function minMax(values: ArrayLike<number>): MinMax {\n const n = values.length >>> 0;\n if (n === 0) return { min: Infinity, max: -Infinity };\n\n let min = Infinity;\n let max = -Infinity;\n\n for (let i = 0; i < n; i++) {\n const v = values[i] ?? 0;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n\n return { min, max };\n}\n","import type { MelSpectrogram } from \"../dsp/mel\";\nimport type { Features2D } from \"../dsp/mfcc\";\nimport { peakPick } from \"../dsp/peakPick\";\n\nexport type MirFingerprintV1 = {\n version: \"v1\";\n\n /** Query window time bounds (seconds) – informational/debug only. */\n t0: number;\n t1: number;\n\n // A) Mel-spectrogram statistics\n mel: {\n /** Mean mel vector across frames (weighted by frame energy, then unit-normalised). */\n mean: Float32Array;\n /** Variance mel vector across frames (weighted by frame energy). */\n variance: Float32Array;\n };\n\n // B) Transient/activity statistics\n onset: {\n mean: number;\n max: number;\n /** Peaks per second, computed using peakPick() on the onset envelope. */\n peakDensityHz: number;\n };\n\n // Optional: MFCC statistics (coeffs 1–12, exclude C0)\n mfcc?: {\n mean: Float32Array;\n variance: Float32Array;\n };\n};\n\nexport type FingerprintFrameWindow = {\n startFrame: number;\n endFrameExclusive: number;\n};\n\nfunction l2Norm(v: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < v.length; i++) {\n const x = v[i] ?? 0;\n sum += x * x;\n }\n return Math.sqrt(sum);\n}\n\nfunction weightedStats(\n frames: Float32Array[], // raw frames\n start: number,\n endExclusive: number,\n dimHint = 0\n): { mean: Float32Array; variance: Float32Array } {\n const nFrames = Math.max(0, endExclusive - start);\n\n // Handle empty window deterministically.\n const first = frames[start];\n const dim = first ? first.length : dimHint;\n\n const mean = new Float32Array(dim);\n const variance = new Float32Array(dim);\n\n if (nFrames <= 0 || dim <= 0) return { mean, variance };\n\n // 1. Calculate weights (L2 norms) and total weight\n const weights = new Float32Array(nFrames);\n const normFrames: Float32Array[] = new Array(nFrames);\n let totalWeight = 0;\n\n for (let i = 0; i < nFrames; i++) {\n const f = frames[start + i];\n if (!f) {\n normFrames[i] = new Float32Array(dim);\n continue;\n }\n const w = l2Norm(f);\n weights[i] = w;\n totalWeight += w;\n\n // Normalize frame for shape statistics\n const nf = new Float32Array(dim);\n const d = w > 1e-12 ? w : 1;\n for (let j = 0; j < dim; j++) nf[j] = f[j]! / d;\n normFrames[i] = nf;\n }\n\n // fallback if all silence\n if (totalWeight <= 1e-12) totalWeight = 1;\n\n // 2. Weighted Mean\n // Mean = sum(w_i * x_i) / sum(w_i)\n for (let i = 0; i < nFrames; i++) {\n const w = weights[i];\n const nf = normFrames[i];\n if (!w || w <= 0) continue;\n const scale = w / totalWeight;\n for (let j = 0; j < dim; j++) {\n mean[j]! += nf![j]! * scale;\n }\n }\n\n // 3. Weighted Variance\n // Var = sum(w_i * (x_i - mean)^2) / sum(w_i)\n for (let i = 0; i < nFrames; i++) {\n const w = weights[i];\n const nf = normFrames[i];\n if (!w || w <= 0) continue;\n const scale = w / totalWeight;\n for (let j = 0; j < dim; j++) {\n const diff = nf![j]! - mean[j]!;\n variance[j]! += diff * diff * scale;\n }\n }\n\n return { mean, variance };\n}\n\nfunction findFrameWindow(times: Float32Array, t0: number, t1: number): FingerprintFrameWindow {\n // times are frame-center times; we include frames where t is within [t0,t1].\n let start = 0;\n while (start < times.length && (times[start] ?? 0) < t0) start++;\n\n let end = start;\n while (end < times.length && (times[end] ?? 0) <= t1) end++;\n\n return { startFrame: start, endFrameExclusive: Math.max(start, end) };\n}\n\n/**\n * Compute a deterministic v1 fingerprint for a time region [t0, t1].\n *\n * Loudness independence:\n * - Uses energy-weighted statistics. Loud frames contribute more to the shape.\n * - Resulting mean vector is effectively the average energy distribution direction.\n */\nexport function fingerprintV1(params: {\n t0: number;\n t1: number;\n mel: MelSpectrogram;\n onsetEnvelope: { times: Float32Array; values: Float32Array };\n mfcc?: Features2D; // { times, values: Float32Array[] }\n peakPick?: {\n minIntervalSec?: number;\n threshold?: number;\n adaptiveFactor?: number;\n };\n}): MirFingerprintV1 {\n const { t0, t1, mel, onsetEnvelope, mfcc } = params;\n\n const tt0 = Math.min(t0, t1);\n const tt1 = Math.max(t0, t1);\n const dur = Math.max(1e-6, tt1 - tt0);\n\n const melDimHint = mel.melBands.find((f) => f?.length)?.length ?? 0;\n\n // --- Mel stats\n const melWindow = findFrameWindow(mel.times, tt0, tt1);\n // Be careful not to slice/copy excessively, but here we need array of arrays for helper\n // melBands is Array<Float32Array>\n const melStats = weightedStats(mel.melBands, melWindow.startFrame, melWindow.endFrameExclusive, melDimHint);\n\n // --- Onset stats (1D)\n // NOTE: onsetEnvelope times should align with mel.times (as computed today), but\n // we don't assume perfect equality; we window by time.\n let onsetSum = 0;\n let onsetMax = -Infinity;\n let onsetN = 0;\n for (let i = 0; i < onsetEnvelope.times.length; i++) {\n const t = onsetEnvelope.times[i] ?? 0;\n if (t < tt0 || t > tt1) continue;\n const v = onsetEnvelope.values[i] ?? 0;\n onsetSum += v;\n onsetN++;\n if (v > onsetMax) onsetMax = v;\n }\n const onsetMean = onsetN > 0 ? onsetSum / onsetN : 0;\n const onsetMaxSafe = Number.isFinite(onsetMax) ? onsetMax : 0;\n\n // Peaks per second\n const peaks = peakPick(onsetEnvelope.times, onsetEnvelope.values, {\n minIntervalSec: params.peakPick?.minIntervalSec,\n threshold: params.peakPick?.threshold,\n adaptive: params.peakPick?.adaptiveFactor\n ? { method: \"meanStd\", factor: params.peakPick.adaptiveFactor }\n : undefined,\n strict: true,\n });\n const peaksInWindow = peaks.filter((p) => p.time >= tt0 && p.time <= tt1);\n const peakDensityHz = peaksInWindow.length / dur;\n\n // --- Optional MFCC (coeffs 1..12)\n let mfccStats: MirFingerprintV1[\"mfcc\"] | undefined;\n const mfccDimHint = mfcc?.values.find((f) => f?.length)?.length ?? 0;\n\n if (mfcc) {\n const mfccWindow = findFrameWindow(mfcc.times, tt0, tt1);\n\n // Exclude C0 and clamp to 1..12 inclusive.\n // We must pre-process standard frames to slices for weightedStats to consume.\n // Or we just consume them and slice inside?\n // weightedStats takes Float32Array[].\n const mfccFramesSliced: Float32Array[] = [];\n for (let i = mfccWindow.startFrame; i < mfccWindow.endFrameExclusive; i++) {\n const full = mfcc.values[i] ?? new Float32Array(0);\n const start = Math.min(1, full.length);\n const end = Math.min(13, full.length);\n mfccFramesSliced.push(full.subarray(start, end));\n }\n\n const s = weightedStats(mfccFramesSliced, 0, mfccFramesSliced.length, mfccDimHint ? Math.max(0, mfccDimHint - 1) : 0);\n mfccStats = { mean: s.mean, variance: s.variance };\n }\n\n return {\n version: \"v1\",\n t0: tt0,\n t1: tt1,\n mel: {\n mean: melStats.mean,\n variance: melStats.variance,\n },\n onset: {\n mean: onsetMean,\n max: onsetMaxSafe,\n peakDensityHz,\n },\n ...(mfccStats ? { mfcc: mfccStats } : {}),\n };\n}\n","import type { MirFingerprintV1 } from \"./fingerprintV1\";\n\nexport type MirFingerprintVectorWeights = {\n /** Weight for mel(mean+variance) block. */\n mel?: number;\n /** Weight for transient/onset scalars block. */\n transient?: number;\n /** Weight for MFCC(mean+variance) block (if present). */\n mfcc?: number;\n};\n\nfunction l2Norm(v: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < v.length; i++) {\n const x = v[i] ?? 0;\n sum += x * x;\n }\n return Math.sqrt(sum);\n}\n\nfunction normaliseL2InPlace(v: Float32Array, eps = 1e-12): void {\n const n = l2Norm(v);\n const d = n > eps ? n : 1;\n for (let i = 0; i < v.length; i++) v[i] = (v[i] ?? 0) / d;\n}\n\nfunction cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (a.length !== b.length) throw new Error(\"@octoseq/mir: cosineSimilarity length mismatch\");\n let dot = 0;\n let aa = 0;\n let bb = 0;\n for (let i = 0; i < a.length; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n dot += x * y;\n aa += x * x;\n bb += y * y;\n }\n const denom = Math.sqrt(aa) * Math.sqrt(bb);\n if (denom <= 0) return 0;\n\n // Map cosine [-1,1] -> [0,1]. With our features it tends to be >= 0 anyway,\n // but we keep the mapping deterministic and bounded.\n const cos = dot / denom;\n // Map cosine: clear negatives (penalize mismatch strongly), keep positives 0..1.\n // Previous (cos+1)/2 was too lenient for \"orthogonal\" features.\n return Math.max(0, cos);\n}\n\nfunction pushScaled(dst: number[], src: Float32Array, scale: number) {\n for (let i = 0; i < src.length; i++) dst.push((src[i] ?? 0) * scale);\n}\n\n/**\n * Convert a v1 fingerprint into a concatenated feature vector suitable for cosine similarity.\n *\n * Rules:\n * - mel and mfcc blocks are L2-normalised separately (mean+var concatenated per-block)\n * - transient scalars are treated as a small vector and L2-normalised too\n * - blocks are then concatenated with optional weights applied per-block\n */\nexport function fingerprintToVectorV1(fp: MirFingerprintV1, weights: MirFingerprintVectorWeights = {}): Float32Array {\n const wMel = weights.mel ?? 1;\n const wTrans = weights.transient ?? 1;\n const wMfcc = weights.mfcc ?? 1;\n\n // --- mel block\n const melBlock = new Float32Array(fp.mel.mean.length + fp.mel.variance.length);\n melBlock.set(fp.mel.mean, 0);\n melBlock.set(fp.mel.variance, fp.mel.mean.length);\n normaliseL2InPlace(melBlock);\n\n // --- transient block\n const transBlock = new Float32Array([fp.onset.mean, fp.onset.max, fp.onset.peakDensityHz]);\n normaliseL2InPlace(transBlock);\n\n // --- optional mfcc block\n let mfccBlock: Float32Array | null = null;\n if (fp.mfcc) {\n mfccBlock = new Float32Array(fp.mfcc.mean.length + fp.mfcc.variance.length);\n mfccBlock.set(fp.mfcc.mean, 0);\n mfccBlock.set(fp.mfcc.variance, fp.mfcc.mean.length);\n normaliseL2InPlace(mfccBlock);\n }\n\n const out: number[] = [];\n pushScaled(out, melBlock, wMel);\n pushScaled(out, transBlock, wTrans);\n if (mfccBlock) pushScaled(out, mfccBlock, wMfcc);\n\n return new Float32Array(out);\n}\n\nexport function similarityFingerprintV1(a: MirFingerprintV1, b: MirFingerprintV1, weights: MirFingerprintVectorWeights = {}): number {\n const va = fingerprintToVectorV1(a, weights);\n const vb = fingerprintToVectorV1(b, weights);\n return cosineSimilarity(va, vb);\n}\n","import type { MelSpectrogram } from \"../dsp/mel\";\nimport type { Features2D } from \"../dsp/mfcc\";\nimport { peakPick } from \"../dsp/peakPick\";\n\nimport { fingerprintV1 } from \"./fingerprintV1\";\nimport type { MirFingerprintVectorWeights } from \"./similarity\";\nimport { similarityFingerprintV1 } from \"./similarity\";\n\nexport type MirSearchCandidate = {\n timeSec: number;\n score: number;\n windowStartSec: number;\n windowEndSec: number;\n};\n\nexport type MirSearchResultV1 = {\n times: Float32Array; // window start times\n similarity: Float32Array; // [0,1]\n candidates: MirSearchCandidate[];\n meta: {\n fingerprintMs: number;\n scanMs: number;\n totalMs: number;\n windowSec: number;\n hopSec: number;\n skippedWindows: number;\n scannedWindows: number;\n };\n};\n\nexport type MirSearchOptionsV1 = {\n /** Sliding window hop size in seconds. Default ~0.03s. */\n hopSec?: number;\n\n /** Similarity threshold for candidate detection. Default 0.75. */\n threshold?: number;\n\n /**\n * Min spacing between candidates (seconds). Default is selectionDuration*0.8.\n * Implemented via peakPick(minIntervalSec).\n */\n minCandidateSpacingSec?: number;\n\n /** If provided, windows overlapping [skipT0, skipT1] are skipped. */\n skipWindowOverlap?: { t0: number; t1: number };\n\n /** Optional weights for similarity vector blocks. */\n weights?: MirFingerprintVectorWeights;\n\n /** Peak-pick settings for query fingerprint peak density. */\n queryPeakPick?: {\n minIntervalSec?: number;\n threshold?: number;\n adaptiveFactor?: number;\n };\n\n /** Peak-pick settings for candidate detection on the similarity curve. */\n candidatePeakPick?: {\n strict?: boolean;\n };\n\n /** Cooperative cancellation hook (called frequently in scan loop). */\n isCancelled?: () => boolean;\n};\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nfunction clamp01(x: number): number {\n if (x <= 0) return 0;\n if (x >= 1) return 1;\n return x;\n}\n\n// (no local helpers; keep this module minimal and lint-clean)\n\nexport async function searchTrackV1(params: {\n queryRegion: { t0: number; t1: number };\n\n mel: MelSpectrogram;\n onsetEnvelope: { times: Float32Array; values: Float32Array };\n mfcc?: Features2D;\n\n options?: MirSearchOptionsV1;\n}): Promise<MirSearchResultV1> {\n const tStart = nowMs();\n\n const options = params.options ?? {};\n const hopSec = Math.max(0.005, options.hopSec ?? 0.03);\n const threshold = clamp01(options.threshold ?? 0.75);\n\n const qt0 = Math.min(params.queryRegion.t0, params.queryRegion.t1);\n const qt1 = Math.max(params.queryRegion.t0, params.queryRegion.t1);\n const windowSec = Math.max(1e-3, qt1 - qt0);\n\n const minSpacingSec = Math.max(0, options.minCandidateSpacingSec ?? windowSec * 0.8);\n\n // --- query fingerprint\n const tFp0 = nowMs();\n const queryFp = fingerprintV1({\n t0: qt0,\n t1: qt1,\n mel: params.mel,\n onsetEnvelope: params.onsetEnvelope,\n mfcc: params.mfcc,\n peakPick: options.queryPeakPick,\n });\n const fingerprintMs = nowMs() - tFp0;\n\n // --- sliding scan\n const scanStartMs = nowMs();\n\n const trackDuration = Math.max(\n params.mel.times.length ? (params.mel.times[params.mel.times.length - 1] ?? 0) : 0,\n params.onsetEnvelope.times.length\n ? (params.onsetEnvelope.times[params.onsetEnvelope.times.length - 1] ?? 0)\n : 0\n );\n\n const nWindows = Math.max(0, Math.floor((trackDuration - windowSec) / hopSec) + 1);\n const times = new Float32Array(nWindows);\n const sim = new Float32Array(nWindows);\n\n let skippedWindows = 0;\n let scannedWindows = 0;\n\n for (let w = 0; w < nWindows; w++) {\n if (options.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n const t0 = w * hopSec;\n const t1 = t0 + windowSec;\n\n // Optionally skip windows overlapping the query itself.\n if (options.skipWindowOverlap) {\n const s0 = options.skipWindowOverlap.t0;\n const s1 = options.skipWindowOverlap.t1;\n const overlaps = t0 < s1 && t1 > s0;\n if (overlaps) {\n times[w] = t0;\n sim[w] = 0;\n skippedWindows++;\n continue;\n }\n }\n\n times[w] = t0;\n\n // Compute window fingerprint using the same feature extraction logic.\n // We avoid re-running spectrogram/mel computation; we only aggregate\n // from existing mel/onset/mfcc time-aligned arrays.\n const fp = fingerprintV1({\n t0,\n t1,\n mel: params.mel,\n onsetEnvelope: params.onsetEnvelope,\n mfcc: params.mfcc,\n peakPick: options.queryPeakPick,\n });\n\n const score = similarityFingerprintV1(queryFp, fp, options.weights);\n sim[w] = clamp01(score);\n scannedWindows++;\n }\n\n const scanMs = nowMs() - scanStartMs;\n\n // --- candidate detection on similarity curve\n // We use peakPick on (times, sim), with minIntervalSec enforcing spacing.\n // We apply threshold as an absolute minimum peak height.\n const events = peakPick(times, sim, {\n threshold,\n minIntervalSec: minSpacingSec,\n strict: options.candidatePeakPick?.strict ?? true,\n });\n\n const candidates: MirSearchCandidate[] = events.map((e) => {\n const windowStartSec = e.time;\n const windowEndSec = windowStartSec + windowSec;\n return {\n timeSec: e.time,\n score: e.strength,\n windowStartSec,\n windowEndSec,\n };\n });\n\n const totalMs = nowMs() - tStart;\n\n return {\n times,\n similarity: sim,\n candidates,\n meta: {\n fingerprintMs,\n scanMs,\n totalMs,\n windowSec,\n hopSec,\n skippedWindows,\n scannedWindows,\n },\n };\n}\n","import type { MirFingerprintV1 } from \"./fingerprintV1\";\n\nexport type MirFeatureVectorSlice = {\n offset: number;\n length: number;\n};\n\nexport type MirFeatureVectorLayoutV1 = {\n dim: number;\n\n // Foreground (query-length) window features\n melMeanFg: MirFeatureVectorSlice;\n melVarianceFg: MirFeatureVectorSlice;\n onsetFg: MirFeatureVectorSlice;\n mfccMeanFg?: MirFeatureVectorSlice;\n mfccVarianceFg?: MirFeatureVectorSlice;\n\n // Local contrast features (foreground - background-without-foreground)\n melContrast?: MirFeatureVectorSlice;\n onsetContrast?: MirFeatureVectorSlice;\n mfccMeanContrast?: MirFeatureVectorSlice;\n mfccVarianceContrast?: MirFeatureVectorSlice;\n};\n\nexport function makeFeatureVectorLayoutV1(params: {\n melDim: number;\n mfccDim?: number;\n includeContrast?: boolean;\n}): MirFeatureVectorLayoutV1 {\n const melDim = Math.max(0, params.melDim);\n const mfccDim = Math.max(0, params.mfccDim ?? 0);\n const includeContrast = params.includeContrast ?? true;\n\n let offset = 0;\n const melMeanFg: MirFeatureVectorSlice = { offset, length: melDim };\n offset += melDim;\n\n const melVarianceFg: MirFeatureVectorSlice = { offset, length: melDim };\n offset += melDim;\n\n const onsetFg: MirFeatureVectorSlice = { offset, length: 3 };\n offset += 3;\n\n const layout: MirFeatureVectorLayoutV1 = { dim: 0, melMeanFg, melVarianceFg, onsetFg };\n\n if (mfccDim > 0) {\n layout.mfccMeanFg = { offset, length: mfccDim };\n layout.mfccVarianceFg = { offset: offset + mfccDim, length: mfccDim };\n offset += mfccDim * 2;\n }\n\n if (includeContrast) {\n layout.melContrast = { offset, length: melDim };\n offset += melDim;\n\n layout.onsetContrast = { offset, length: 3 };\n offset += 3;\n\n if (mfccDim > 0) {\n layout.mfccMeanContrast = { offset, length: mfccDim };\n layout.mfccVarianceContrast = { offset: offset + mfccDim, length: mfccDim };\n offset += mfccDim * 2;\n }\n }\n\n layout.dim = offset;\n\n return layout;\n}\n\nexport function writeFingerprintToFeatureVectorRawV1(\n fp: MirFingerprintV1,\n out: Float32Array,\n offset: number,\n layout: MirFeatureVectorLayoutV1\n): void {\n // Mel mean\n for (let i = 0; i < layout.melMeanFg.length; i++) {\n out[offset + layout.melMeanFg.offset + i] = fp.mel.mean[i] ?? 0;\n }\n // Mel variance\n for (let i = 0; i < layout.melVarianceFg.length; i++) {\n out[offset + layout.melVarianceFg.offset + i] = fp.mel.variance[i] ?? 0;\n }\n // Onset stats\n out[offset + layout.onsetFg.offset + 0] = fp.onset.mean;\n out[offset + layout.onsetFg.offset + 1] = fp.onset.max;\n out[offset + layout.onsetFg.offset + 2] = fp.onset.peakDensityHz;\n\n // Optional MFCC stats\n if (layout.mfccMeanFg && layout.mfccVarianceFg) {\n const mean = fp.mfcc?.mean;\n const variance = fp.mfcc?.variance;\n for (let i = 0; i < layout.mfccMeanFg.length; i++) {\n out[offset + layout.mfccMeanFg.offset + i] = mean?.[i] ?? 0;\n }\n for (let i = 0; i < layout.mfccVarianceFg.length; i++) {\n out[offset + layout.mfccVarianceFg.offset + i] = variance?.[i] ?? 0;\n }\n }\n\n // Fingerprints do not include local contrast; ensure contrast blocks are deterministic zeros.\n if (layout.melContrast) {\n out.fill(0, offset + layout.melContrast.offset, offset + layout.melContrast.offset + layout.melContrast.length);\n }\n if (layout.onsetContrast) {\n out.fill(0, offset + layout.onsetContrast.offset, offset + layout.onsetContrast.offset + layout.onsetContrast.length);\n }\n if (layout.mfccMeanContrast) {\n out.fill(\n 0,\n offset + layout.mfccMeanContrast.offset,\n offset + layout.mfccMeanContrast.offset + layout.mfccMeanContrast.length\n );\n }\n if (layout.mfccVarianceContrast) {\n out.fill(\n 0,\n offset + layout.mfccVarianceContrast.offset,\n offset + layout.mfccVarianceContrast.offset + layout.mfccVarianceContrast.length\n );\n }\n}\n","import type { MirFeatureVectorLayoutV1 } from \"./featureVectorV1\";\n\nexport type MirRefinedModelKindV1 = \"baseline\" | \"prototype\" | \"logistic\";\n\nexport type MirRefinedModelExplainV1 = {\n kind: MirRefinedModelKindV1;\n positives: number;\n negatives: number;\n\n /** L2 norms per feature group (useful as a cheap, stable explainability hook). */\n weightL2?: {\n mel: number;\n melForeground: number;\n melContrast?: number;\n onset: number;\n onsetForeground: number;\n onsetContrast?: number;\n mfcc?: number;\n mfccForeground?: number;\n mfccContrast?: number;\n };\n\n /** Training diagnostics (only for logistic). */\n training?: {\n iterations: number;\n finalLoss: number;\n };\n};\n\nexport type MirLogisticModelV1 = {\n kind: \"logistic\";\n w: Float32Array;\n b: number;\n explain: MirRefinedModelExplainV1;\n};\n\nexport type MirPrototypeModelV1 = {\n kind: \"prototype\";\n prototype: Float32Array;\n explain: MirRefinedModelExplainV1;\n};\n\nexport type MirBaselineModelV1 = {\n kind: \"baseline\";\n explain: MirRefinedModelExplainV1;\n};\n\nexport type MirRefinedModelV1 = MirBaselineModelV1 | MirPrototypeModelV1 | MirLogisticModelV1;\n\nexport type MirLogitContributionsByGroupV1 = {\n logit: number;\n bias: number;\n mel: number;\n melForeground: number;\n melContrast?: number;\n onset: number;\n onsetForeground: number;\n onsetContrast?: number;\n mfcc?: number;\n mfccForeground?: number;\n mfccContrast?: number;\n};\n\nfunction clamp01(x: number): number {\n return x <= 0 ? 0 : x >= 1 ? 1 : x;\n}\n\nfunction sigmoid(x: number): number {\n // Prevent overflow in exp(); ±20 already saturates for our purposes.\n const z = x > 20 ? 20 : x < -20 ? -20 : x;\n return 1 / (1 + Math.exp(-z));\n}\n\nfunction dot(a: Float32Array, b: Float32Array): number {\n const n = Math.min(a.length, b.length);\n let s = 0;\n for (let i = 0; i < n; i++) s += (a[i] ?? 0) * (b[i] ?? 0);\n return s;\n}\n\nfunction sliceDot(w: Float32Array, x: Float32Array, offset: number, length: number): number {\n const end = Math.min(w.length, x.length, offset + length);\n let sum = 0;\n for (let i = offset; i < end; i++) sum += (w[i] ?? 0) * (x[i] ?? 0);\n return sum;\n}\n\nexport function logitContributionsByGroupV1(\n w: Float32Array,\n b: number,\n x: Float32Array,\n layout: MirFeatureVectorLayoutV1\n): MirLogitContributionsByGroupV1 {\n const melForeground =\n sliceDot(w, x, layout.melMeanFg.offset, layout.melMeanFg.length) +\n sliceDot(w, x, layout.melVarianceFg.offset, layout.melVarianceFg.length);\n const melContrast = layout.melContrast ? sliceDot(w, x, layout.melContrast.offset, layout.melContrast.length) : 0;\n const onsetForeground = sliceDot(w, x, layout.onsetFg.offset, layout.onsetFg.length);\n const onsetContrast = layout.onsetContrast ? sliceDot(w, x, layout.onsetContrast.offset, layout.onsetContrast.length) : 0;\n\n const mfccForeground =\n layout.mfccMeanFg && layout.mfccVarianceFg\n ? sliceDot(w, x, layout.mfccMeanFg.offset, layout.mfccMeanFg.length) +\n sliceDot(w, x, layout.mfccVarianceFg.offset, layout.mfccVarianceFg.length)\n : 0;\n const mfccContrast =\n layout.mfccMeanContrast && layout.mfccVarianceContrast\n ? sliceDot(w, x, layout.mfccMeanContrast.offset, layout.mfccMeanContrast.length) +\n sliceDot(w, x, layout.mfccVarianceContrast.offset, layout.mfccVarianceContrast.length)\n : 0;\n\n const mel = melForeground + melContrast;\n const onset = onsetForeground + onsetContrast;\n const mfcc = mfccForeground + mfccContrast;\n\n const logit = mel + onset + mfcc + b;\n\n return {\n logit,\n bias: b,\n mel,\n melForeground,\n ...(layout.melContrast ? { melContrast } : {}),\n onset,\n onsetForeground,\n ...(layout.onsetContrast ? { onsetContrast } : {}),\n ...(layout.mfccMeanFg || layout.mfccMeanContrast\n ? {\n mfcc,\n mfccForeground,\n ...(layout.mfccMeanContrast ? { mfccContrast } : {}),\n }\n : {}),\n };\n}\n\nfunction l2Norm(v: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < v.length; i++) {\n const x = v[i] ?? 0;\n sum += x * x;\n }\n return Math.sqrt(sum);\n}\n\nfunction cosineSimilarity01(a: Float32Array, b: Float32Array): number {\n const n = Math.min(a.length, b.length);\n let ab = 0;\n let aa = 0;\n let bb = 0;\n for (let i = 0; i < n; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n ab += x * y;\n aa += x * x;\n bb += y * y;\n }\n const denom = Math.sqrt(aa) * Math.sqrt(bb);\n if (denom <= 0) return 0;\n const cos = ab / denom;\n const clamped = Math.max(-1, Math.min(1, cos));\n return (clamped + 1) / 2;\n}\n\nfunction sliceSumSquares(w: Float32Array, offset: number, length: number): number {\n let sum = 0;\n const end = Math.min(w.length, offset + length);\n for (let i = offset; i < end; i++) {\n const x = w[i] ?? 0;\n sum += x * x;\n }\n return sum;\n}\n\nexport function summariseWeightL2ByGroup(w: Float32Array, layout: MirFeatureVectorLayoutV1): MirRefinedModelExplainV1[\"weightL2\"] {\n const melForegroundSq =\n sliceSumSquares(w, layout.melMeanFg.offset, layout.melMeanFg.length) +\n sliceSumSquares(w, layout.melVarianceFg.offset, layout.melVarianceFg.length);\n const melContrastSq = layout.melContrast ? sliceSumSquares(w, layout.melContrast.offset, layout.melContrast.length) : 0;\n const onsetForegroundSq = sliceSumSquares(w, layout.onsetFg.offset, layout.onsetFg.length);\n const onsetContrastSq = layout.onsetContrast ? sliceSumSquares(w, layout.onsetContrast.offset, layout.onsetContrast.length) : 0;\n\n const mfccForegroundSq =\n layout.mfccMeanFg && layout.mfccVarianceFg\n ? sliceSumSquares(w, layout.mfccMeanFg.offset, layout.mfccMeanFg.length) +\n sliceSumSquares(w, layout.mfccVarianceFg.offset, layout.mfccVarianceFg.length)\n : 0;\n const mfccContrastSq =\n layout.mfccMeanContrast && layout.mfccVarianceContrast\n ? sliceSumSquares(w, layout.mfccMeanContrast.offset, layout.mfccMeanContrast.length) +\n sliceSumSquares(w, layout.mfccVarianceContrast.offset, layout.mfccVarianceContrast.length)\n : 0;\n\n const mel = Math.sqrt(melForegroundSq + melContrastSq);\n const onset = Math.sqrt(onsetForegroundSq + onsetContrastSq);\n const mfcc = mfccForegroundSq + mfccContrastSq > 0 ? Math.sqrt(mfccForegroundSq + mfccContrastSq) : undefined;\n\n return {\n mel,\n melForeground: Math.sqrt(melForegroundSq),\n ...(melContrastSq > 0 ? { melContrast: Math.sqrt(melContrastSq) } : {}),\n onset,\n onsetForeground: Math.sqrt(onsetForegroundSq),\n ...(onsetContrastSq > 0 ? { onsetContrast: Math.sqrt(onsetContrastSq) } : {}),\n ...(mfcc != null\n ? {\n mfcc,\n mfccForeground: Math.sqrt(mfccForegroundSq),\n ...(mfccContrastSq > 0 ? { mfccContrast: Math.sqrt(mfccContrastSq) } : {}),\n }\n : {}),\n };\n}\n\nexport function trainLogisticModelV1(params: {\n positives: Float32Array[];\n negatives: Float32Array[];\n layout: MirFeatureVectorLayoutV1;\n options?: { iterations?: number; learningRate?: number; l2?: number };\n}): MirLogisticModelV1 {\n const pos = params.positives;\n const neg = params.negatives;\n const dim = params.layout.dim;\n\n // Small, deterministic batch GD: fast enough for < 50 samples and a few hundred dims.\n const iterations = Math.max(1, params.options?.iterations ?? 80);\n const learningRate = Math.max(1e-4, params.options?.learningRate ?? 0.15);\n const l2 = Math.max(0, params.options?.l2 ?? 0.01);\n\n const w = new Float32Array(dim);\n let b = 0;\n\n const posW = pos.length > 0 ? 0.5 / pos.length : 0;\n const negW = neg.length > 0 ? 0.5 / neg.length : 0;\n\n let lastLoss = Infinity;\n let itersUsed = 0;\n\n for (let iter = 0; iter < iterations; iter++) {\n itersUsed = iter + 1;\n\n const gradW = new Float32Array(dim);\n let gradB = 0;\n let loss = 0;\n\n const accumulate = (x: Float32Array, y: 0 | 1, weight: number) => {\n const s = dot(w, x) + b;\n const p = sigmoid(s);\n const err = p - y; // dL/ds for logistic loss\n\n gradB += weight * err;\n for (let j = 0; j < dim; j++) gradW[j] = (gradW[j] ?? 0) + weight * err * (x[j] ?? 0);\n\n // Weighted cross-entropy loss\n const pSafe = Math.min(1 - 1e-9, Math.max(1e-9, p));\n loss += weight * (y ? -Math.log(pSafe) : -Math.log(1 - pSafe));\n };\n\n for (const x of pos) accumulate(x, 1, posW);\n for (const x of neg) accumulate(x, 0, negW);\n\n // L2 regularisation (do not regularise bias).\n if (l2 > 0) {\n for (let j = 0; j < dim; j++) {\n gradW[j] = (gradW[j] ?? 0) + l2 * (w[j] ?? 0);\n }\n loss += (l2 * (l2Norm(w) ** 2)) / 2;\n }\n\n // Basic learning-rate decay helps stability on small datasets.\n const lr = learningRate / (1 + iter * 0.01);\n for (let j = 0; j < dim; j++) w[j] = (w[j] ?? 0) - lr * (gradW[j] ?? 0);\n b -= lr * gradB;\n\n if (Math.abs(lastLoss - loss) < 1e-6) break;\n lastLoss = loss;\n }\n\n return {\n kind: \"logistic\",\n w,\n b,\n explain: {\n kind: \"logistic\",\n positives: pos.length,\n negatives: neg.length,\n weightL2: summariseWeightL2ByGroup(w, params.layout),\n training: { iterations: itersUsed, finalLoss: Number.isFinite(lastLoss) ? lastLoss : 0 },\n },\n };\n}\n\nexport function buildPrototypeModelV1(params: {\n positives: Float32Array[];\n layout: MirFeatureVectorLayoutV1;\n}): MirPrototypeModelV1 {\n const dim = params.layout.dim;\n const proto = new Float32Array(dim);\n\n const n = Math.max(1, params.positives.length);\n for (const x of params.positives) {\n for (let j = 0; j < dim; j++) proto[j] = (proto[j] ?? 0) + (x[j] ?? 0) / n;\n }\n\n return {\n kind: \"prototype\",\n prototype: proto,\n explain: {\n kind: \"prototype\",\n positives: params.positives.length,\n negatives: 0,\n },\n };\n}\n\nexport function scoreWithModelV1(model: MirRefinedModelV1, x: Float32Array): number {\n if (model.kind === \"baseline\") return 0;\n if (model.kind === \"prototype\") return clamp01(cosineSimilarity01(model.prototype, x));\n // logistic\n return clamp01(sigmoid(dot(model.w, x) + model.b));\n}\n","import type { MelSpectrogram } from \"../dsp/mel\";\nimport type { Features2D } from \"../dsp/mfcc\";\nimport { peakPick } from \"../dsp/peakPick\";\n\nimport type { MirSearchCandidate, MirSearchOptionsV1 } from \"./searchTrackV1\";\nimport { makeFeatureVectorLayoutV1 } from \"./featureVectorV1\";\nimport {\n buildPrototypeModelV1,\n logitContributionsByGroupV1,\n scoreWithModelV1,\n trainLogisticModelV1,\n type MirLogitContributionsByGroupV1,\n type MirRefinedModelExplainV1,\n type MirRefinedModelKindV1,\n} from \"./refinedModelV1\";\n\nexport type MirRefinementCandidateLabelV1 = {\n t0: number;\n t1: number;\n status: \"accepted\" | \"rejected\";\n source: \"auto\" | \"manual\";\n};\n\nexport type MirSearchGuidedOptionsV1 = MirSearchOptionsV1 & {\n /**\n * Local contrast features: foreground (query-length) vs surrounding background.\n * Enabled by default because it improves discrimination in dense mixes.\n */\n localContrast?: {\n enabled?: boolean;\n /** Background duration multiplier relative to the foreground. Default 3. */\n backgroundScale?: number;\n };\n refinement?: {\n enabled?: boolean;\n /**\n * Human labels (accepted/rejected). Unreviewed candidates should not be sent.\n */\n labels?: MirRefinementCandidateLabelV1[];\n /** Optional: include the query as an extra positive exemplar once enough positives exist. */\n includeQueryAsPositive?: boolean;\n };\n};\n\nexport type MirSearchCurveKindV1 = \"similarity\" | \"confidence\";\n\nexport type MirGuidedCandidateExplainV1 = {\n /** Only present for logistic models; values are in logit space (sum + bias = total logit). */\n groupLogit?: MirLogitContributionsByGroupV1;\n};\n\nexport type MirSearchCandidateV1Guided = MirSearchCandidate & {\n explain?: MirGuidedCandidateExplainV1;\n};\n\nexport type MirSearchResultV1Guided = {\n times: Float32Array; // window start times\n scores: Float32Array; // [0,1] similarity or confidence\n candidates: MirSearchCandidateV1Guided[];\n curveKind: MirSearchCurveKindV1;\n model: MirRefinedModelExplainV1;\n meta: {\n /** Feature prep time (legacy name retained for UI compatibility). */\n fingerprintMs: number;\n scanMs: number;\n modelMs: number;\n totalMs: number;\n windowSec: number;\n hopSec: number;\n skippedWindows: number;\n scannedWindows: number;\n };\n};\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nfunction clamp01(x: number): number {\n if (x <= 0) return 0;\n if (x >= 1) return 1;\n return x;\n}\n\nfunction zScoreInPlace(out: Float32Array, mean: Float32Array, invStd: Float32Array): void {\n const n = Math.min(out.length, mean.length, invStd.length);\n for (let j = 0; j < n; j++) out[j] = ((out[j] ?? 0) - (mean[j] ?? 0)) * (invStd[j] ?? 1);\n}\n\nfunction decideModelKind(params: {\n enabled: boolean;\n labels: MirRefinementCandidateLabelV1[];\n}): { kind: MirRefinedModelKindV1; positives: MirRefinementCandidateLabelV1[]; negatives: MirRefinementCandidateLabelV1[] } {\n if (!params.enabled) return { kind: \"baseline\", positives: [], negatives: [] };\n\n const positives = params.labels.filter((l) => l.status === \"accepted\");\n const negatives = params.labels.filter((l) => l.status === \"rejected\");\n\n // Training rule: fewer than 2 positive examples => skip training.\n if (positives.length < 2) return { kind: \"baseline\", positives, negatives };\n if (negatives.length === 0) return { kind: \"prototype\", positives, negatives };\n return { kind: \"logistic\", positives, negatives };\n}\n\nfunction advanceStartIndex(times: Float32Array, start: number, t0: number): number {\n let i = start;\n while (i < times.length && (times[i] ?? 0) < t0) i++;\n return i;\n}\n\nfunction advanceEndIndex(times: Float32Array, endExclusive: number, t1: number): number {\n let i = endExclusive;\n while (i < times.length && (times[i] ?? 0) <= t1) i++;\n return i;\n}\n\nfunction cosineSimilarity01ByBlocks(\n query: Float32Array,\n window: Float32Array,\n layout: ReturnType<typeof makeFeatureVectorLayoutV1>,\n weights: { mel?: number; transient?: number; mfcc?: number } | undefined\n): number {\n const wMel = weights?.mel ?? 1;\n const wTrans = weights?.transient ?? 1;\n const wMfcc = weights?.mfcc ?? 1;\n\n const addBlock = (offset: number, length: number, weight: number, acc: { dot: number; aa: number; bb: number }) => {\n if (length <= 0 || weight === 0) return;\n\n const ww = weight * weight;\n const eps = 1e-12;\n\n // Compute dot + norms for this block in one pass; then normalise to match\n // fingerprintToVectorV1(): L2-normalise each block independently, then weight.\n let dotRaw = 0;\n let qSumSq = 0;\n let xSumSq = 0;\n const end = Math.min(query.length, window.length, offset + length);\n for (let i = offset; i < end; i++) {\n const q = query[i] ?? 0;\n const x = window[i] ?? 0;\n dotRaw += q * x;\n qSumSq += q * q;\n xSumSq += x * x;\n }\n\n const qNorm = Math.sqrt(qSumSq);\n const xNorm = Math.sqrt(xSumSq);\n\n if (qNorm > eps) acc.aa += ww;\n if (xNorm > eps) acc.bb += ww;\n if (!(qNorm > eps && xNorm > eps)) return;\n\n acc.dot += ww * (dotRaw / (qNorm * xNorm));\n };\n\n const acc = { dot: 0, aa: 0, bb: 0 };\n\n // Foreground blocks\n addBlock(layout.melMeanFg.offset, layout.melMeanFg.length + layout.melVarianceFg.length, wMel, acc);\n addBlock(layout.onsetFg.offset, layout.onsetFg.length, wTrans, acc);\n if (layout.mfccMeanFg && layout.mfccVarianceFg) {\n addBlock(layout.mfccMeanFg.offset, layout.mfccMeanFg.length + layout.mfccVarianceFg.length, wMfcc, acc);\n }\n\n // Contrast blocks (if present)\n if (layout.melContrast) addBlock(layout.melContrast.offset, layout.melContrast.length, wMel, acc);\n if (layout.onsetContrast) addBlock(layout.onsetContrast.offset, layout.onsetContrast.length, wTrans, acc);\n if (layout.mfccMeanContrast && layout.mfccVarianceContrast) {\n addBlock(layout.mfccMeanContrast.offset, layout.mfccMeanContrast.length + layout.mfccVarianceContrast.length, wMfcc, acc);\n }\n\n const denom = Math.sqrt(acc.aa) * Math.sqrt(acc.bb);\n if (denom <= 0) return 0;\n\n const cos = acc.dot / denom;\n const clamped = Math.max(-1, Math.min(1, cos));\n return (clamped + 1) / 2;\n}\n\ntype SparseMaxQuery = {\n query: (start: number, endExclusive: number) => number;\n};\n\nfunction buildSparseTableMax(values: Float32Array, isCancelled?: () => boolean): SparseMaxQuery {\n const n = values.length;\n const log = new Uint8Array(n + 1);\n for (let i = 2; i <= n; i++) log[i] = ((log[i >>> 1] ?? 0) + 1) as number;\n const maxK = log[n] ?? 0;\n\n const table: Float32Array[] = [];\n table[0] = values;\n\n for (let k = 1; k <= maxK; k++) {\n const span = 1 << k;\n const half = span >>> 1;\n const prev = table[k - 1]!;\n const len = Math.max(0, n - span + 1);\n const cur = new Float32Array(len);\n for (let i = 0; i < len; i++) {\n if ((i & 2047) === 0 && isCancelled?.()) throw new Error(\"@octoseq/mir: cancelled\");\n const a = prev[i] ?? 0;\n const b = prev[i + half] ?? 0;\n cur[i] = a > b ? a : b;\n }\n table[k] = cur;\n }\n\n return {\n query: (start: number, endExclusive: number) => {\n const l = Math.max(0, start | 0);\n const r = Math.min(n, endExclusive | 0);\n const len = r - l;\n if (len <= 0) return -Infinity;\n const k = log[len] ?? 0;\n const span = 1 << k;\n const row = table[k]!;\n const a = row[l] ?? -Infinity;\n const b = row[r - span] ?? -Infinity;\n return a > b ? a : b;\n },\n };\n}\n\nfunction computeBackgroundWindow(params: {\n fgStartSec: number;\n fgEndSec: number;\n trackDurationSec: number;\n backgroundScale: number;\n}): { bgStartSec: number; bgEndSec: number } {\n const fgStartSec = Math.min(params.fgStartSec, params.fgEndSec);\n const fgEndSec = Math.max(params.fgStartSec, params.fgEndSec);\n const fgDur = Math.max(1e-6, fgEndSec - fgStartSec);\n\n const desired = Math.max(fgDur, fgDur * Math.max(1, params.backgroundScale));\n const maxDur = Math.max(fgDur, params.trackDurationSec);\n const dur = Math.min(desired, maxDur);\n\n const center = (fgStartSec + fgEndSec) / 2;\n let bgStart = center - dur / 2;\n let bgEnd = bgStart + dur;\n\n // Preserve duration when possible by shifting the window instead of shrinking it.\n if (bgStart < 0) {\n bgStart = 0;\n bgEnd = Math.min(params.trackDurationSec, dur);\n }\n if (bgEnd > params.trackDurationSec) {\n bgEnd = params.trackDurationSec;\n bgStart = Math.max(0, bgEnd - dur);\n }\n\n // Defensive: ensure the window contains the foreground.\n bgStart = Math.min(bgStart, fgStartSec);\n bgEnd = Math.max(bgEnd, fgEndSec);\n\n return { bgStartSec: bgStart, bgEndSec: bgEnd };\n}\n\nclass SlidingMoments {\n private start = 0;\n private end = 0;\n readonly sum: Float64Array;\n readonly sumSq: Float64Array;\n\n constructor(\n private readonly dim: number,\n private readonly addFrame: (frame: number, sum: Float64Array, sumSq: Float64Array) => void,\n private readonly removeFrame: (frame: number, sum: Float64Array, sumSq: Float64Array) => void\n ) {\n this.sum = new Float64Array(dim);\n this.sumSq = new Float64Array(dim);\n }\n\n update(newStart: number, newEnd: number) {\n const s = Math.max(0, newStart | 0);\n const e = Math.max(s, newEnd | 0);\n\n while (this.end < e) {\n this.addFrame(this.end, this.sum, this.sumSq);\n this.end++;\n }\n while (this.start < s) {\n this.removeFrame(this.start, this.sum, this.sumSq);\n this.start++;\n }\n\n // This class assumes monotonic windows (start/end only move forward).\n // If that assumption is violated, reset deterministically.\n if (this.start > s || this.end > e) {\n this.sum.fill(0);\n this.sumSq.fill(0);\n this.start = s;\n this.end = s;\n while (this.end < e) {\n this.addFrame(this.end, this.sum, this.sumSq);\n this.end++;\n }\n }\n }\n}\n\nexport async function searchTrackV1Guided(params: {\n queryRegion: { t0: number; t1: number };\n\n mel: MelSpectrogram;\n onsetEnvelope: { times: Float32Array; values: Float32Array };\n mfcc?: Features2D;\n\n options?: MirSearchGuidedOptionsV1;\n}): Promise<MirSearchResultV1Guided> {\n const tStart = nowMs();\n\n const options = params.options ?? {};\n const hopSec = Math.max(0.005, options.hopSec ?? 0.03);\n const threshold = clamp01(options.threshold ?? 0.75);\n const localContrastEnabled = options.localContrast?.enabled ?? true;\n const backgroundScale = Math.max(1, options.localContrast?.backgroundScale ?? 3);\n\n const qt0 = Math.min(params.queryRegion.t0, params.queryRegion.t1);\n const qt1 = Math.max(params.queryRegion.t0, params.queryRegion.t1);\n const windowSec = Math.max(1e-3, qt1 - qt0);\n\n const minSpacingSec = Math.max(0, options.minCandidateSpacingSec ?? windowSec * 0.8);\n\n const refinementEnabled = !!options.refinement?.enabled;\n const refinementLabels = options.refinement?.labels ?? [];\n const includeQueryAsPositive = options.refinement?.includeQueryAsPositive ?? true;\n\n const modelDecision = decideModelKind({ enabled: refinementEnabled, labels: refinementLabels });\n const baselineExplain: MirRefinedModelExplainV1 = refinementEnabled\n ? {\n kind: \"baseline\",\n positives: modelDecision.positives.length,\n negatives: modelDecision.negatives.length,\n }\n : { kind: \"baseline\", positives: 0, negatives: 0 };\n\n const tPrep0 = nowMs();\n\n const timesFrames = params.mel.times;\n const nFrames = timesFrames.length;\n\n const trackDuration = Math.max(\n nFrames ? (timesFrames[nFrames - 1] ?? 0) : 0,\n params.onsetEnvelope.times.length ? (params.onsetEnvelope.times[params.onsetEnvelope.times.length - 1] ?? 0) : 0\n );\n\n const nWindows = Math.max(0, Math.floor((trackDuration - windowSec) / hopSec) + 1);\n const times = new Float32Array(nWindows);\n const scores = new Float32Array(nWindows);\n\n if (nWindows === 0) {\n const totalMs = nowMs() - tStart;\n return {\n times,\n scores,\n candidates: [],\n curveKind: \"similarity\",\n model: baselineExplain,\n meta: {\n fingerprintMs: 0,\n scanMs: 0,\n modelMs: 0,\n totalMs,\n windowSec,\n hopSec,\n skippedWindows: 0,\n scannedWindows: 0,\n },\n };\n }\n\n const skipOverlap = options.skipWindowOverlap;\n const shouldSkip = (t0: number, t1: number) => {\n if (!skipOverlap) return false;\n const s0 = skipOverlap.t0;\n const s1 = skipOverlap.t1;\n return t0 < s1 && t1 > s0;\n };\n\n const melDim = params.mel.melBands[0]?.length ?? 0;\n const mfccFullDim = params.mfcc?.values[0]?.length ?? 0;\n const mfccDim = Math.max(0, Math.min(12, mfccFullDim - 1)); // coeffs 1..12\n\n const layout = makeFeatureVectorLayoutV1({ melDim, mfccDim, includeContrast: localContrastEnabled });\n\n // --- precompute per-frame normalisation scales (L2) for mel/mfcc blocks\n const melScale = new Float32Array(nFrames);\n const melBands = params.mel.melBands;\n for (let t = 0; t < nFrames; t++) {\n if ((t & 2047) === 0 && options.isCancelled?.()) throw new Error(\"@octoseq/mir: cancelled\");\n const row = melBands[t];\n if (!row) {\n melScale[t] = 1;\n continue;\n }\n let sumSq = 0;\n for (let i = 0; i < melDim; i++) {\n const x = row[i] ?? 0;\n sumSq += x * x;\n }\n const n = Math.sqrt(sumSq);\n melScale[t] = n > 1e-12 ? (1 / n) : 1;\n }\n\n const mfccScale = mfccDim > 0 ? new Float32Array(nFrames) : null;\n const mfccFrames = params.mfcc?.values ?? null;\n if (mfccScale && mfccFrames) {\n for (let t = 0; t < nFrames; t++) {\n if ((t & 2047) === 0 && options.isCancelled?.()) throw new Error(\"@octoseq/mir: cancelled\");\n const row = mfccFrames[t];\n if (!row) {\n mfccScale[t] = 1;\n continue;\n }\n let sumSq = 0;\n for (let i = 0; i < mfccDim; i++) {\n const x = row[i + 1] ?? 0;\n sumSq += x * x;\n }\n const n = Math.sqrt(sumSq);\n mfccScale[t] = n > 1e-12 ? (1 / n) : 1;\n }\n }\n\n // --- onset helpers (prefix sums + range max + peak counts)\n const onsetValues = new Float32Array(nFrames);\n const onsetSrc = params.onsetEnvelope.values;\n for (let i = 0; i < nFrames; i++) onsetValues[i] = onsetSrc[i] ?? 0;\n\n const onsetPrefix = new Float64Array(nFrames + 1);\n onsetPrefix[0] = 0;\n for (let i = 0; i < nFrames; i++) {\n if ((i & 4095) === 0 && options.isCancelled?.()) throw new Error(\"@octoseq/mir: cancelled\");\n onsetPrefix[i + 1] = (onsetPrefix[i] ?? 0) + (onsetValues[i] ?? 0);\n }\n\n const onsetMax = buildSparseTableMax(onsetValues, options.isCancelled);\n\n const onsetPeaks = peakPick(timesFrames, onsetValues, {\n minIntervalSec: options.queryPeakPick?.minIntervalSec,\n threshold: options.queryPeakPick?.threshold,\n adaptive: options.queryPeakPick?.adaptiveFactor\n ? { method: \"meanStd\", factor: options.queryPeakPick.adaptiveFactor }\n : undefined,\n strict: true,\n });\n\n const isPeak = new Uint8Array(nFrames);\n for (const p of onsetPeaks) {\n const idx = p.index | 0;\n if (idx >= 0 && idx < nFrames) isPeak[idx] = 1;\n }\n const peakPrefix = new Uint32Array(nFrames + 1);\n for (let i = 0; i < nFrames; i++) peakPrefix[i + 1] = (peakPrefix[i] ?? 0) + (isPeak[i] ?? 0);\n\n const fingerprintMs = nowMs() - tPrep0;\n\n const addMelFrame = (frame: number, sum: Float64Array, sumSq: Float64Array) => {\n const row = melBands[frame];\n const s = melScale[frame] ?? 1;\n for (let i = 0; i < melDim; i++) {\n const x = (row?.[i] ?? 0) * s;\n sum[i] = (sum[i] ?? 0) + x;\n sumSq[i] = (sumSq[i] ?? 0) + x * x;\n }\n };\n const removeMelFrame = (frame: number, sum: Float64Array, sumSq: Float64Array) => {\n const row = melBands[frame];\n const s = melScale[frame] ?? 1;\n for (let i = 0; i < melDim; i++) {\n const x = (row?.[i] ?? 0) * s;\n sum[i] = (sum[i] ?? 0) - x;\n sumSq[i] = (sumSq[i] ?? 0) - x * x;\n }\n };\n\n const addMfccFrame = (frame: number, sum: Float64Array, sumSq: Float64Array) => {\n const row = mfccFrames?.[frame];\n const s = mfccScale?.[frame] ?? 1;\n for (let i = 0; i < mfccDim; i++) {\n const x = (row?.[i + 1] ?? 0) * s;\n sum[i] = (sum[i] ?? 0) + x;\n sumSq[i] = (sumSq[i] ?? 0) + x * x;\n }\n };\n const removeMfccFrame = (frame: number, sum: Float64Array, sumSq: Float64Array) => {\n const row = mfccFrames?.[frame];\n const s = mfccScale?.[frame] ?? 1;\n for (let i = 0; i < mfccDim; i++) {\n const x = (row?.[i + 1] ?? 0) * s;\n sum[i] = (sum[i] ?? 0) - x;\n sumSq[i] = (sumSq[i] ?? 0) - x * x;\n }\n };\n\n const melFg = new SlidingMoments(melDim, addMelFrame, removeMelFrame);\n const melBg = new SlidingMoments(melDim, addMelFrame, removeMelFrame);\n const mfccFg = mfccDim > 0 ? new SlidingMoments(mfccDim, addMfccFrame, removeMfccFrame) : null;\n const mfccBg = mfccDim > 0 ? new SlidingMoments(mfccDim, addMfccFrame, removeMfccFrame) : null;\n\n const writeVectorFromState = (opts: {\n fgStartIdx: number;\n fgEndIdx: number;\n bgStartIdx: number;\n bgEndIdx: number;\n fgStartSec: number;\n fgEndSec: number;\n bgStartSec: number;\n bgEndSec: number;\n out: Float32Array;\n }) => {\n const out = opts.out;\n out.fill(0);\n\n const fgCount = Math.max(0, opts.fgEndIdx - opts.fgStartIdx);\n const bgCount = Math.max(0, opts.bgEndIdx - opts.bgStartIdx);\n const bgExCount = Math.max(0, bgCount - fgCount);\n\n // --- mel foreground\n for (let i = 0; i < melDim; i++) {\n const sum = melFg.sum[i] ?? 0;\n const sumSq = melFg.sumSq[i] ?? 0;\n const mean = fgCount > 0 ? sum / fgCount : 0;\n const variance = fgCount > 0 ? Math.max(0, sumSq / fgCount - mean * mean) : 0;\n out[layout.melMeanFg.offset + i] = mean;\n out[layout.melVarianceFg.offset + i] = variance;\n\n if (layout.melContrast) {\n const bgSum = melBg.sum[i] ?? 0;\n const bgMeanEx = bgExCount > 0 ? (bgSum - sum) / bgExCount : mean;\n out[layout.melContrast.offset + i] = mean - bgMeanEx;\n }\n }\n\n // --- onset foreground\n const fgOnsetSum = (onsetPrefix[opts.fgEndIdx] ?? 0) - (onsetPrefix[opts.fgStartIdx] ?? 0);\n const fgOnsetMean = fgCount > 0 ? fgOnsetSum / fgCount : 0;\n const fgOnsetMaxRaw = onsetMax.query(opts.fgStartIdx, opts.fgEndIdx);\n const fgOnsetMax = Number.isFinite(fgOnsetMaxRaw) && fgOnsetMaxRaw !== -Infinity ? fgOnsetMaxRaw : 0;\n const fgPeaks = (peakPrefix[opts.fgEndIdx] ?? 0) - (peakPrefix[opts.fgStartIdx] ?? 0);\n const fgDur = Math.max(1e-6, opts.fgEndSec - opts.fgStartSec);\n const fgPeakDensity = fgPeaks / fgDur;\n\n out[layout.onsetFg.offset + 0] = fgOnsetMean;\n out[layout.onsetFg.offset + 1] = fgOnsetMax;\n out[layout.onsetFg.offset + 2] = fgPeakDensity;\n\n if (layout.onsetContrast) {\n const bgOnsetSum = (onsetPrefix[opts.bgEndIdx] ?? 0) - (onsetPrefix[opts.bgStartIdx] ?? 0);\n const bgOnsetMeanEx = bgExCount > 0 ? (bgOnsetSum - fgOnsetSum) / bgExCount : fgOnsetMean;\n\n const leftMax = onsetMax.query(opts.bgStartIdx, opts.fgStartIdx);\n const rightMax = onsetMax.query(opts.fgEndIdx, opts.bgEndIdx);\n const bgOnsetMaxEx = Math.max(\n Number.isFinite(leftMax) && leftMax !== -Infinity ? leftMax : -Infinity,\n Number.isFinite(rightMax) && rightMax !== -Infinity ? rightMax : -Infinity\n );\n const bgOnsetMaxExSafe = bgOnsetMaxEx === -Infinity ? fgOnsetMax : bgOnsetMaxEx;\n\n const bgPeaks = (peakPrefix[opts.bgEndIdx] ?? 0) - (peakPrefix[opts.bgStartIdx] ?? 0);\n const bgPeaksEx = Math.max(0, bgPeaks - fgPeaks);\n const bgExDur = Math.max(1e-6, (opts.bgEndSec - opts.bgStartSec) - fgDur);\n const bgPeakDensityEx = bgPeaksEx / bgExDur;\n\n out[layout.onsetContrast.offset + 0] = fgOnsetMean - bgOnsetMeanEx;\n out[layout.onsetContrast.offset + 1] = fgOnsetMax - bgOnsetMaxExSafe;\n out[layout.onsetContrast.offset + 2] = fgPeakDensity - bgPeakDensityEx;\n }\n\n // --- mfcc (optional)\n if (mfccDim > 0 && mfccFg && mfccBg && layout.mfccMeanFg && layout.mfccVarianceFg) {\n for (let i = 0; i < mfccDim; i++) {\n const sum = mfccFg.sum[i] ?? 0;\n const sumSq = mfccFg.sumSq[i] ?? 0;\n const mean = fgCount > 0 ? sum / fgCount : 0;\n const variance = fgCount > 0 ? Math.max(0, sumSq / fgCount - mean * mean) : 0;\n out[layout.mfccMeanFg.offset + i] = mean;\n out[layout.mfccVarianceFg.offset + i] = variance;\n\n if (layout.mfccMeanContrast && layout.mfccVarianceContrast) {\n const bgSum = mfccBg.sum[i] ?? 0;\n const bgSumSq = mfccBg.sumSq[i] ?? 0;\n const bgMeanEx = bgExCount > 0 ? (bgSum - sum) / bgExCount : mean;\n const bgVarEx = bgExCount > 0 ? Math.max(0, (bgSumSq - sumSq) / bgExCount - bgMeanEx * bgMeanEx) : variance;\n out[layout.mfccMeanContrast.offset + i] = mean - bgMeanEx;\n out[layout.mfccVarianceContrast.offset + i] = variance - bgVarEx;\n }\n }\n }\n };\n\n const computeVectorForInterval = (t0: number, t1: number, out: Float32Array) => {\n const fgStartSec = Math.min(t0, t1);\n const fgEndSec = Math.max(t0, t1);\n const { bgStartSec, bgEndSec } = computeBackgroundWindow({\n fgStartSec,\n fgEndSec,\n trackDurationSec: trackDuration,\n backgroundScale,\n });\n\n const fgStartIdx = advanceStartIndex(timesFrames, 0, fgStartSec);\n const fgEndIdx = advanceEndIndex(timesFrames, fgStartIdx, fgEndSec);\n const bgStartIdx = advanceStartIndex(timesFrames, 0, bgStartSec);\n const bgEndIdx = advanceEndIndex(timesFrames, bgStartIdx, bgEndSec);\n\n // Populate SlidingMoments deterministically for this one-off interval.\n melFg.update(fgStartIdx, fgEndIdx);\n melBg.update(bgStartIdx, bgEndIdx);\n mfccFg?.update(fgStartIdx, fgEndIdx);\n mfccBg?.update(bgStartIdx, bgEndIdx);\n\n writeVectorFromState({\n fgStartIdx,\n fgEndIdx,\n bgStartIdx,\n bgEndIdx,\n fgStartSec,\n fgEndSec,\n bgStartSec,\n bgEndSec,\n out,\n });\n };\n\n // Query vector for baseline similarity + as optional positive anchor for refinement.\n const queryVec = new Float32Array(layout.dim);\n computeVectorForInterval(qt0, qt1, queryVec);\n\n // --- scanning helpers (sliding window indices)\n const resetSlidingState = () => {\n melFg.update(0, 0);\n melBg.update(0, 0);\n mfccFg?.update(0, 0);\n mfccBg?.update(0, 0);\n };\n\n const buildWindowVectorsPass = (onWindow: (w: number, t0: number, t1: number, bg: { start: number; end: number }, vec: Float32Array) => void) => {\n resetSlidingState();\n\n let fgStartIdx = 0;\n let fgEndIdx = 0;\n let bgStartIdx = 0;\n let bgEndIdx = 0;\n\n const vec = new Float32Array(layout.dim);\n\n for (let w = 0; w < nWindows; w++) {\n if ((w & 255) === 0 && options.isCancelled?.()) throw new Error(\"@octoseq/mir: cancelled\");\n\n const t0 = w * hopSec;\n const t1 = t0 + windowSec;\n times[w] = t0;\n\n fgStartIdx = advanceStartIndex(timesFrames, fgStartIdx, t0);\n fgEndIdx = advanceEndIndex(timesFrames, fgEndIdx, t1);\n\n const { bgStartSec, bgEndSec } = computeBackgroundWindow({\n fgStartSec: t0,\n fgEndSec: t1,\n trackDurationSec: trackDuration,\n backgroundScale,\n });\n bgStartIdx = advanceStartIndex(timesFrames, bgStartIdx, bgStartSec);\n bgEndIdx = advanceEndIndex(timesFrames, bgEndIdx, bgEndSec);\n\n melFg.update(fgStartIdx, fgEndIdx);\n melBg.update(bgStartIdx, bgEndIdx);\n mfccFg?.update(fgStartIdx, fgEndIdx);\n mfccBg?.update(bgStartIdx, bgEndIdx);\n\n writeVectorFromState({\n fgStartIdx,\n fgEndIdx,\n bgStartIdx,\n bgEndIdx,\n fgStartSec: t0,\n fgEndSec: t1,\n bgStartSec,\n bgEndSec,\n out: vec,\n });\n\n onWindow(w, t0, t1, { start: bgStartSec, end: bgEndSec }, vec);\n }\n };\n\n let skippedWindows = 0;\n let scannedWindows = 0;\n\n const scanStartMs = nowMs();\n\n let curveKind: MirSearchCurveKindV1 = \"similarity\";\n let modelExplain: MirRefinedModelExplainV1 = baselineExplain;\n let modelMs = 0;\n let trainedModel: ReturnType<typeof trainLogisticModelV1> | ReturnType<typeof buildPrototypeModelV1> | null = null;\n let zMean: Float32Array | null = null;\n let zInvStd: Float32Array | null = null;\n\n const runBaselineSimilarityScan = () => {\n // We write into scores[w] directly; use the same index `w` inside the callback to avoid rounding.\n skippedWindows = 0;\n scannedWindows = 0;\n buildWindowVectorsPass((w, t0, t1, _bg, vec) => {\n if (shouldSkip(t0, t1)) {\n scores[w] = 0;\n skippedWindows++;\n return;\n }\n scannedWindows++;\n scores[w] = cosineSimilarity01ByBlocks(queryVec, vec, layout, options.weights);\n });\n };\n\n if (modelDecision.kind === \"baseline\") {\n runBaselineSimilarityScan();\n } else {\n const tModel0 = nowMs();\n curveKind = \"confidence\";\n\n try {\n // Pass 1: accumulate z-score params across all windows (per-track, per-search, ephemeral).\n const dim = layout.dim;\n const sum = new Float64Array(dim);\n const sumSq = new Float64Array(dim);\n\n buildWindowVectorsPass((_w, _t0, _t1, _bg, vec) => {\n for (let j = 0; j < dim; j++) {\n const x = vec[j] ?? 0;\n sum[j] = (sum[j] ?? 0) + x;\n sumSq[j] = (sumSq[j] ?? 0) + x * x;\n }\n });\n\n const mean = new Float32Array(dim);\n const invStd = new Float32Array(dim);\n const n = Math.max(1, nWindows);\n for (let j = 0; j < dim; j++) {\n const mu = (sum[j] ?? 0) / n;\n const ex2 = (sumSq[j] ?? 0) / n;\n const v = Math.max(0, ex2 - mu * mu);\n const std = Math.sqrt(v);\n mean[j] = mu;\n invStd[j] = std > 1e-6 ? 1 / std : 1;\n }\n\n zMean = mean;\n zInvStd = invStd;\n\n // Build exemplar vectors.\n const positives: Float32Array[] = [];\n const negatives: Float32Array[] = [];\n\n const makeExample = (t0: number, t1: number): Float32Array => {\n const v = new Float32Array(dim);\n computeVectorForInterval(t0, t1, v);\n zScoreInPlace(v, mean, invStd);\n return v;\n };\n\n for (const l of modelDecision.positives) positives.push(makeExample(l.t0, l.t1));\n for (const l of modelDecision.negatives) negatives.push(makeExample(l.t0, l.t1));\n\n // Optional anchor: only include query once we already meet the \">=2 positives\" rule.\n if (includeQueryAsPositive) {\n const q = new Float32Array(dim);\n q.set(queryVec);\n zScoreInPlace(q, mean, invStd);\n positives.push(q);\n }\n\n // Train model (deterministic, tiny).\n trainedModel =\n modelDecision.kind === \"logistic\"\n ? trainLogisticModelV1({ positives, negatives, layout })\n : buildPrototypeModelV1({ positives, layout });\n modelExplain = trainedModel.explain;\n\n // Pass 2: score windows using the classifier.\n skippedWindows = 0;\n scannedWindows = 0;\n buildWindowVectorsPass((w, t0, t1, _bg, vec) => {\n if (shouldSkip(t0, t1)) {\n scores[w] = 0;\n skippedWindows++;\n return;\n }\n scannedWindows++;\n zScoreInPlace(vec, mean, invStd);\n scores[w] = scoreWithModelV1(trainedModel!, vec);\n });\n } catch (e) {\n // Respect cooperative cancellation semantics.\n if (e instanceof Error && e.message === \"@octoseq/mir: cancelled\") throw e;\n\n // Robustness rule: never crash search due to refinement; degrade gracefully.\n // If refinement fails, fall back to baseline similarity (with contrast features if enabled).\n curveKind = \"similarity\";\n modelExplain = baselineExplain;\n trainedModel = null;\n zMean = null;\n zInvStd = null;\n runBaselineSimilarityScan();\n } finally {\n modelMs = nowMs() - tModel0;\n }\n }\n\n const scanMs = nowMs() - scanStartMs;\n\n // --- candidate detection on curve\n const events = peakPick(times, scores, {\n threshold,\n minIntervalSec: minSpacingSec,\n strict: options.candidatePeakPick?.strict ?? true,\n });\n\n const candidates: MirSearchCandidateV1Guided[] = events.map((e) => {\n const windowStartSec = e.time;\n const windowEndSec = windowStartSec + windowSec;\n return {\n timeSec: e.time,\n score: e.strength,\n windowStartSec,\n windowEndSec,\n };\n });\n\n // Explainability: per-candidate group contributions (logistic only).\n if (trainedModel?.kind === \"logistic\" && zMean && zInvStd) {\n const tmp = new Float32Array(layout.dim);\n for (const c of candidates) {\n tmp.fill(0);\n computeVectorForInterval(c.windowStartSec, c.windowEndSec, tmp);\n zScoreInPlace(tmp, zMean, zInvStd);\n c.explain = {\n groupLogit: logitContributionsByGroupV1(trainedModel.w, trainedModel.b, tmp, layout),\n };\n }\n }\n\n const totalMs = nowMs() - tStart;\n\n return {\n times,\n scores,\n candidates,\n curveKind,\n model: modelExplain,\n meta: {\n fingerprintMs,\n scanMs,\n modelMs,\n totalMs,\n windowSec,\n hopSec,\n skippedWindows,\n scannedWindows,\n },\n };\n}\n","export type MirVersion = \"0.1.0\";\n\nexport type {\n MirBackend,\n MirRunTimings,\n MirRunMeta,\n Mir1DResult,\n Mir2DResult,\n MirResult,\n MirFunctionId,\n MirRunRequest,\n MirAudioPayload\n} from \"./types\";\n\nexport const MIR_VERSION: MirVersion = \"0.1.0\";\n\n// ----------------------------\n// Core Types\n// ----------------------------\n\nexport type AudioBufferLike = {\n sampleRate: number;\n getChannelData(channel: number): Float32Array;\n numberOfChannels: number;\n};\n\n// ----------------------------\n// GPU\n// ----------------------------\n\nexport { MirGPU } from \"./gpu/context\";\n\n// ----------------------------\n// Shared runner (main thread / worker)\n// ----------------------------\n\nexport { runMir } from \"./runner/runMir\";\n\n// ----------------------------\n// Spectrogram (shared primitive)\n// ----------------------------\n\nexport type { SpectrogramConfig, Spectrogram } from \"./dsp/spectrogram\";\nexport { spectrogram } from \"./dsp/spectrogram\";\n\n// ----------------------------\n// Derived spectral features (CPU, reuse spectrogram)\n// ----------------------------\n\nexport { spectralCentroid, spectralFlux } from \"./dsp/spectral\";\n\n// ----------------------------\n// Onsets / Peaks\n// ----------------------------\n\nexport type { OnsetEnvelope, OnsetEnvelopeOptions, OnsetEnvelopeGpuResult } from \"./dsp/onset\";\nexport { onsetEnvelopeFromSpectrogram, onsetEnvelopeFromMel, onsetEnvelopeFromMelGpu } from \"./dsp/onset\";\n\nexport type { PeakPickEvent, PeakPickOptions } from \"./dsp/peakPick\";\nexport { peakPick } from \"./dsp/peakPick\";\n\n// ----------------------------\n// HPSS\n// ----------------------------\n\nexport type { SpectrogramLike2D, HpssOptions } from \"./dsp/hpss\";\nexport { hpss } from \"./dsp/hpss\";\n\n// ----------------------------\n// MFCC + Deltas\n// ----------------------------\n\nexport type { MfccOptions, MfccResult, DeltaOptions, Features2D } from \"./dsp/mfcc\";\nexport { mfcc, delta, deltaDelta } from \"./dsp/mfcc\";\n\n// ----------------------------\n// Mel spectrogram\n// ----------------------------\n\nexport type { MelConfig, MelSpectrogram } from \"./dsp/mel\";\nexport { melSpectrogram } from \"./dsp/mel\";\n\n// ----------------------------\n// Visualisation utilities\n// ----------------------------\n\nexport { normaliseForWaveform } from \"./util/normalise\";\nexport type { Spectrogram2D, SpectrogramToDbOptions } from \"./util/display\";\nexport { spectrogramToDb, clampDb } from \"./util/display\";\n\n// ----------------------------\n// Utility helpers\n// ----------------------------\n\nexport type { MinMax } from \"./util/stats\";\nexport { minMax } from \"./util/stats\";\n\n// ----------------------------\n// Search (deterministic within-track similarity)\n// ----------------------------\n\nexport type { MirFingerprintV1 } from \"./search/fingerprintV1\";\nexport { fingerprintV1 } from \"./search/fingerprintV1\";\n\nexport type { MirFingerprintVectorWeights } from \"./search/similarity\";\nexport { fingerprintToVectorV1, similarityFingerprintV1 } from \"./search/similarity\";\n\nexport type { MirSearchCandidate, MirSearchOptionsV1, MirSearchResultV1 } from \"./search/searchTrackV1\";\nexport { searchTrackV1 } from \"./search/searchTrackV1\";\n\nexport type { MirRefinementCandidateLabelV1, MirSearchCurveKindV1, MirSearchGuidedOptionsV1, MirSearchResultV1Guided } from \"./search/searchTrackV1Guided\";\nexport { searchTrackV1Guided } from \"./search/searchTrackV1Guided\";\n\n/**\n * Backwards-compat placeholder from the initial skeleton.\n *\n * Note: kept so existing internal references/tests don't break.\n */\nexport function helloMir(name = \"world\") {\n return `Hello, ${name} from @octoseq/mir v${MIR_VERSION}`;\n}\n"]}
@@ -0,0 +1,84 @@
1
+ import { h as MirAudioPayload, g as MirRunRequest, e as MirResult } from './types-BE3py4fZ.js';
2
+
3
+ /**
4
+ * WebGPU context wrapper for MIR computations.
5
+ *
6
+ * v0.1 scope:
7
+ * - Provide a safe, explicit way for callers to opt into GPU usage.
8
+ * - Throw a clear error when called outside the browser or when WebGPU is unavailable.
9
+ */
10
+ declare class MirGPU {
11
+ readonly device: GPUDevice;
12
+ readonly queue: GPUQueue;
13
+ private constructor();
14
+ static create(): Promise<MirGPU>;
15
+ }
16
+
17
+ type AudioBufferLike = {
18
+ sampleRate: number;
19
+ getChannelData(channel: number): Float32Array;
20
+ numberOfChannels: number;
21
+ };
22
+ type SpectrogramConfig = {
23
+ fftSize: number;
24
+ hopSize: number;
25
+ window: "hann";
26
+ };
27
+ type SpectrogramOptions = {
28
+ /** Optional cancellation hook; checked once per frame. */
29
+ isCancelled?: () => boolean;
30
+ };
31
+ type Spectrogram = {
32
+ sampleRate: number;
33
+ fftSize: number;
34
+ hopSize: number;
35
+ times: Float32Array;
36
+ magnitudes: Float32Array[];
37
+ };
38
+ /**
39
+ * Compute a magnitude spectrogram.
40
+ *
41
+ * v0.1 implementation:
42
+ * - CPU STFT + FFT for correctness.
43
+ * - The function accepts an optional MirGPU to match the future API.
44
+ * (STFT/FFT is the largest dense math block and can be ported to WebGPU later.)
45
+ */
46
+ declare function spectrogram(audio: AudioBufferLike, config: SpectrogramConfig, gpu?: MirGPU, options?: SpectrogramOptions): Promise<Spectrogram>;
47
+
48
+ type RunMirOptions = {
49
+ gpu?: MirGPU;
50
+ /** If provided, long loops should periodically call this and abort if true. */
51
+ isCancelled?: () => boolean;
52
+ /** If true and backend==='gpu', do not silently fall back to CPU on GPU errors. */
53
+ strictGpu?: boolean;
54
+ onset?: {
55
+ smoothMs?: number;
56
+ diffMethod?: "rectified" | "abs";
57
+ useLog?: boolean;
58
+ };
59
+ peakPick?: {
60
+ minIntervalSec?: number;
61
+ threshold?: number;
62
+ adaptiveFactor?: number;
63
+ };
64
+ hpss?: {
65
+ timeMedian?: number;
66
+ freqMedian?: number;
67
+ spectrogram?: SpectrogramConfig;
68
+ };
69
+ mfcc?: {
70
+ nCoeffs?: number;
71
+ spectrogram?: SpectrogramConfig;
72
+ };
73
+ };
74
+ type RunMirBackendOptions = RunMirOptions;
75
+ /**
76
+ * Shared MIR execution entrypoint used by the main thread and by the worker.
77
+ *
78
+ * Notes:
79
+ * - We keep FFT/STFT on CPU for now (spectrogram()), but allow one downstream stage
80
+ * (mel projection) to run on real WebGPU via `melSpectrogram(spec, config, gpu)`.
81
+ */
82
+ declare function runMir(audio: MirAudioPayload, request: MirRunRequest, options?: RunMirOptions): Promise<MirResult>;
83
+
84
+ export { MirGPU as M, type RunMirOptions as R, type Spectrogram as S, type SpectrogramConfig as a, type RunMirBackendOptions as b, runMir as r, spectrogram as s };
@@ -0,0 +1,2 @@
1
+ export { b as RunMirBackendOptions, R as RunMirOptions, r as runMir } from '../runMir-CSIBwNZ3.js';
2
+ import '../types-BE3py4fZ.js';
@@ -0,0 +1,3 @@
1
+ export { runMir } from '../chunk-DUWYCAVG.js';
2
+ //# sourceMappingURL=runMir.js.map
3
+ //# sourceMappingURL=runMir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"runMir.js"}
@@ -0,0 +1,169 @@
1
+ import { g as MirRunRequest, e as MirResult, h as MirAudioPayload } from '../types-BE3py4fZ.js';
2
+
3
+ type MirWorkerInitMessage = {
4
+ type: "INIT";
5
+ enableGpu: boolean;
6
+ };
7
+ type MirWorkerRunMessage = {
8
+ type: "RUN";
9
+ jobId: string;
10
+ request: MirRunRequest;
11
+ audio: {
12
+ sampleRate: number;
13
+ mono: ArrayBufferLike;
14
+ };
15
+ enableGpu: boolean;
16
+ strictGpu?: boolean;
17
+ };
18
+ type MirWorkerCancelMessage = {
19
+ type: "CANCEL";
20
+ jobId: string;
21
+ };
22
+ type MirWorkerSearchMessage = {
23
+ type: "SEARCH";
24
+ jobId: string;
25
+ audio: {
26
+ sampleRate: number;
27
+ mono: ArrayBufferLike;
28
+ };
29
+ query: {
30
+ t0: number;
31
+ t1: number;
32
+ };
33
+ /** Search tuning (kept small and explicit, like MirRunRequest). */
34
+ search?: {
35
+ hopSec?: number;
36
+ threshold?: number;
37
+ /** 0..1; if true, skip windows overlapping the query itself. */
38
+ skipOverlap?: boolean;
39
+ weights?: {
40
+ mel?: number;
41
+ transient?: number;
42
+ mfcc?: number;
43
+ };
44
+ /** Optional: apply softmax to similarity curve before returning. */
45
+ applySoftmax?: boolean;
46
+ };
47
+ /** Feature extraction config (re-uses existing MIR request knobs). */
48
+ features?: {
49
+ spectrogram?: MirRunRequest["spectrogram"];
50
+ mel?: MirRunRequest["mel"];
51
+ onset?: MirRunRequest["onset"];
52
+ mfcc?: MirRunRequest["mfcc"];
53
+ };
54
+ /**
55
+ * Optional human-in-the-loop refinement data.
56
+ * When enabled, the worker can use accepted/rejected exemplars to produce a
57
+ * per-track confidence curve and a re-ranked candidate list.
58
+ */
59
+ refinement?: {
60
+ enabled?: boolean;
61
+ includeQueryAsPositive?: boolean;
62
+ labels?: Array<{
63
+ t0: number;
64
+ t1: number;
65
+ status: "accepted" | "rejected";
66
+ source: "auto" | "manual";
67
+ }>;
68
+ };
69
+ enableGpu: boolean;
70
+ strictGpu?: boolean;
71
+ };
72
+ type MirWorkerInMessage = MirWorkerInitMessage | MirWorkerRunMessage | MirWorkerSearchMessage | MirWorkerCancelMessage;
73
+ type MirWorkerResultMessage = {
74
+ type: "RESULT";
75
+ jobId: string;
76
+ /** Total time spent in the worker handling this RUN, including (optional) GPU readback. */
77
+ workerTotalMs: number;
78
+ result: {
79
+ kind: MirResult["kind"];
80
+ times: ArrayBufferLike;
81
+ values?: ArrayBufferLike;
82
+ data2d?: ArrayBufferLike[];
83
+ events?: Array<{
84
+ time: number;
85
+ strength: number;
86
+ index: number;
87
+ }>;
88
+ meta: MirResult["meta"];
89
+ };
90
+ };
91
+ type MirWorkerErrorMessage = {
92
+ type: "ERROR";
93
+ jobId: string;
94
+ message: string;
95
+ stack?: string;
96
+ };
97
+ type MirWorkerLogMessage = {
98
+ type: "LOG";
99
+ jobId?: string;
100
+ level: "debug" | "info" | "warn" | "error";
101
+ message: string;
102
+ data?: unknown;
103
+ };
104
+ type MirWorkerSearchResultMessage = {
105
+ type: "SEARCH_RESULT";
106
+ jobId: string;
107
+ timings: {
108
+ fingerprintMs: number;
109
+ scanMs: number;
110
+ modelMs?: number;
111
+ totalMs: number;
112
+ };
113
+ result: {
114
+ times: ArrayBufferLike;
115
+ scores: ArrayBufferLike;
116
+ curveKind: "similarity" | "confidence";
117
+ model: {
118
+ kind: "baseline" | "prototype" | "logistic";
119
+ positives: number;
120
+ negatives: number;
121
+ weightL2?: {
122
+ mel: number;
123
+ melForeground: number;
124
+ melContrast?: number;
125
+ onset: number;
126
+ onsetForeground: number;
127
+ onsetContrast?: number;
128
+ mfcc?: number;
129
+ mfccForeground?: number;
130
+ mfccContrast?: number;
131
+ };
132
+ training?: {
133
+ iterations: number;
134
+ finalLoss: number;
135
+ };
136
+ };
137
+ candidates: Array<{
138
+ timeSec: number;
139
+ score: number;
140
+ windowStartSec: number;
141
+ windowEndSec: number;
142
+ explain?: {
143
+ groupLogit?: {
144
+ logit: number;
145
+ bias: number;
146
+ mel: number;
147
+ melForeground: number;
148
+ melContrast?: number;
149
+ onset: number;
150
+ onsetForeground: number;
151
+ onsetContrast?: number;
152
+ mfcc?: number;
153
+ mfccForeground?: number;
154
+ mfccContrast?: number;
155
+ };
156
+ };
157
+ }>;
158
+ meta: {
159
+ windowSec: number;
160
+ hopSec: number;
161
+ skippedWindows: number;
162
+ scannedWindows: number;
163
+ };
164
+ };
165
+ };
166
+ type MirWorkerOutMessage = MirWorkerResultMessage | MirWorkerSearchResultMessage | MirWorkerErrorMessage | MirWorkerLogMessage;
167
+ declare function rebuildAudioPayload(a: MirWorkerRunMessage["audio"]): MirAudioPayload;
168
+
169
+ export { type MirWorkerCancelMessage, type MirWorkerErrorMessage, type MirWorkerInMessage, type MirWorkerInitMessage, type MirWorkerLogMessage, type MirWorkerOutMessage, type MirWorkerResultMessage, type MirWorkerRunMessage, type MirWorkerSearchMessage, type MirWorkerSearchResultMessage, rebuildAudioPayload };
@@ -0,0 +1,11 @@
1
+ // src/runner/workerProtocol.ts
2
+ function rebuildAudioPayload(a) {
3
+ return {
4
+ sampleRate: a.sampleRate,
5
+ mono: new Float32Array(a.mono)
6
+ };
7
+ }
8
+
9
+ export { rebuildAudioPayload };
10
+ //# sourceMappingURL=workerProtocol.js.map
11
+ //# sourceMappingURL=workerProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runner/workerProtocol.ts"],"names":[],"mappings":";AAuLO,SAAS,oBAAoB,CAAA,EAAkD;AAClF,EAAA,OAAO;AAAA,IACH,YAAY,CAAA,CAAE,UAAA;AAAA,IACd,IAAA,EAAM,IAAI,YAAA,CAAa,CAAA,CAAE,IAAmB;AAAA,GAChD;AACJ","file":"workerProtocol.js","sourcesContent":["import type { MirAudioPayload, MirResult, MirRunRequest } from \"../types\";\n\nexport type MirWorkerInitMessage = {\n type: \"INIT\";\n enableGpu: boolean;\n};\n\nexport type MirWorkerRunMessage = {\n type: \"RUN\";\n jobId: string;\n request: MirRunRequest;\n audio: {\n sampleRate: number;\n mono: ArrayBufferLike; // transferred\n };\n enableGpu: boolean;\n strictGpu?: boolean;\n};\n\nexport type MirWorkerCancelMessage = {\n type: \"CANCEL\";\n jobId: string;\n};\n\nexport type MirWorkerSearchMessage = {\n type: \"SEARCH\";\n jobId: string;\n\n audio: {\n sampleRate: number;\n mono: ArrayBufferLike; // transferred\n };\n\n query: {\n t0: number;\n t1: number;\n };\n\n /** Search tuning (kept small and explicit, like MirRunRequest). */\n search?: {\n hopSec?: number;\n threshold?: number;\n /** 0..1; if true, skip windows overlapping the query itself. */\n skipOverlap?: boolean;\n weights?: {\n mel?: number;\n transient?: number;\n mfcc?: number;\n };\n /** Optional: apply softmax to similarity curve before returning. */\n applySoftmax?: boolean;\n };\n\n /** Feature extraction config (re-uses existing MIR request knobs). */\n features?: {\n spectrogram?: MirRunRequest[\"spectrogram\"];\n mel?: MirRunRequest[\"mel\"];\n onset?: MirRunRequest[\"onset\"];\n mfcc?: MirRunRequest[\"mfcc\"];\n };\n\n /**\n * Optional human-in-the-loop refinement data.\n * When enabled, the worker can use accepted/rejected exemplars to produce a\n * per-track confidence curve and a re-ranked candidate list.\n */\n refinement?: {\n enabled?: boolean;\n includeQueryAsPositive?: boolean;\n labels?: Array<{\n t0: number;\n t1: number;\n status: \"accepted\" | \"rejected\";\n source: \"auto\" | \"manual\";\n }>;\n };\n\n enableGpu: boolean;\n strictGpu?: boolean;\n};\n\nexport type MirWorkerInMessage = MirWorkerInitMessage | MirWorkerRunMessage | MirWorkerSearchMessage | MirWorkerCancelMessage;\n\nexport type MirWorkerResultMessage = {\n type: \"RESULT\";\n jobId: string;\n /** Total time spent in the worker handling this RUN, including (optional) GPU readback. */\n workerTotalMs: number;\n result: {\n // Mirror MirResult but transfer underlying buffers.\n kind: MirResult[\"kind\"];\n times: ArrayBufferLike;\n values?: ArrayBufferLike;\n data2d?: ArrayBufferLike[];\n events?: Array<{ time: number; strength: number; index: number }>;\n meta: MirResult[\"meta\"];\n };\n};\n\nexport type MirWorkerErrorMessage = {\n type: \"ERROR\";\n jobId: string;\n message: string;\n stack?: string;\n};\n\nexport type MirWorkerLogMessage = {\n type: \"LOG\";\n jobId?: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n};\n\nexport type MirWorkerSearchResultMessage = {\n type: \"SEARCH_RESULT\";\n jobId: string;\n timings: {\n fingerprintMs: number;\n scanMs: number;\n modelMs?: number;\n totalMs: number;\n };\n result: {\n times: ArrayBufferLike;\n scores: ArrayBufferLike;\n curveKind: \"similarity\" | \"confidence\";\n model: {\n kind: \"baseline\" | \"prototype\" | \"logistic\";\n positives: number;\n negatives: number;\n weightL2?: {\n mel: number;\n melForeground: number;\n melContrast?: number;\n onset: number;\n onsetForeground: number;\n onsetContrast?: number;\n mfcc?: number;\n mfccForeground?: number;\n mfccContrast?: number;\n };\n training?: {\n iterations: number;\n finalLoss: number;\n };\n };\n candidates: Array<{\n timeSec: number;\n score: number;\n windowStartSec: number;\n windowEndSec: number;\n explain?: {\n groupLogit?: {\n logit: number;\n bias: number;\n mel: number;\n melForeground: number;\n melContrast?: number;\n onset: number;\n onsetForeground: number;\n onsetContrast?: number;\n mfcc?: number;\n mfccForeground?: number;\n mfccContrast?: number;\n };\n };\n }>;\n meta: {\n windowSec: number;\n hopSec: number;\n skippedWindows: number;\n scannedWindows: number;\n };\n };\n};\n\nexport type MirWorkerOutMessage =\n | MirWorkerResultMessage\n | MirWorkerSearchResultMessage\n | MirWorkerErrorMessage\n | MirWorkerLogMessage;\n\nexport function rebuildAudioPayload(a: MirWorkerRunMessage[\"audio\"]): MirAudioPayload {\n return {\n sampleRate: a.sampleRate,\n mono: new Float32Array(a.mono as ArrayBuffer),\n };\n}\n"]}