@octoseq/mir 0.1.0-main.994cb4e → 0.1.0-main.c336fba
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.
- package/dist/index.d.ts +4 -4
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/{runMir-CWsxri61.d.ts → runMir-8PX3FuZC.d.ts} +1 -1
- package/dist/runner/runMir.d.ts +2 -2
- package/dist/runner/workerProtocol.d.ts +1 -1
- package/dist/{types-D6eBRofe.d.ts → types-uMUczpax.d.ts} +2 -0
- package/package.json +1 -1
- package/src/dsp/bandProposal.ts +29 -2
- package/src/types.ts +2 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gpu/context.ts","../src/dsp/phaseAlignment.ts","../src/dsp/musicalTime.ts","../src/dsp/frequencyBand.ts","../src/dsp/bandMask.ts","../src/dsp/bandMir.ts","../src/dsp/bandProposal.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":["seg","generateBandId","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","/**\n * Phase alignment algorithm for beat grid generation.\n *\n * Given a BPM and beat candidates, this module computes optimal phase offsets\n * that align the beat grid with detected beat candidates.\n *\n * The algorithm is deterministic: same inputs always produce same outputs.\n */\n\nimport type { BeatCandidate, PhaseHypothesis, PhaseAlignmentConfig } from \"../types\";\n\nconst DEFAULT_CONFIG: Required<PhaseAlignmentConfig> = {\n phaseResolution: 16,\n matchTolerance: 0.05, // 50ms\n topK: 3,\n offsetPenaltyWeight: 0.2,\n};\n\n/**\n * Compute phase hypotheses for a given BPM against beat candidates.\n *\n * Algorithm:\n * 1. Compute beat period = 60 / bpm\n * 2. Generate N phase offsets spanning [0, period) at resolution = period/N\n * 3. For each phase offset:\n * a. For each beat candidate, find closest grid line\n * b. If within tolerance, add weighted score based on candidate strength\n * c. Track systematic offset error for penalty\n * 4. Normalize scores and apply offset penalty\n * 5. Return top K phases sorted by score\n *\n * @param bpm - Tempo in beats per minute\n * @param candidates - Beat candidate events with time and strength\n * @param audioDuration - Total audio duration in seconds\n * @param config - Optional configuration overrides\n * @returns Array of top K phase hypotheses, sorted by score descending\n */\nexport function computePhaseHypotheses(\n bpm: number,\n candidates: BeatCandidate[],\n audioDuration: number,\n config?: PhaseAlignmentConfig\n): PhaseHypothesis[] {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const period = 60 / bpm;\n\n if (candidates.length === 0 || audioDuration <= 0 || bpm <= 0) {\n return [];\n }\n\n const phases: PhaseHypothesis[] = [];\n\n // Generate and score phase candidates\n for (let i = 0; i < cfg.phaseResolution; i++) {\n const phaseOffset = (i / cfg.phaseResolution) * period;\n const result = scorePhase(phaseOffset, period, candidates, audioDuration, cfg.matchTolerance);\n phases.push({\n index: i,\n phaseOffset,\n score: result.score,\n matchCount: result.matchCount,\n avgOffsetError: result.avgOffsetError,\n });\n }\n\n // Normalize scores to [0, 1] and apply offset penalty\n const maxScore = Math.max(...phases.map((p) => p.score), 1e-9);\n for (const phase of phases) {\n // Penalty based on systematic offset (how far off-center matches are)\n const penalty = (phase.avgOffsetError / cfg.matchTolerance) * cfg.offsetPenaltyWeight;\n phase.score = (phase.score / maxScore) * (1 - Math.min(1, penalty));\n }\n\n // Sort by score descending and take top K\n phases.sort((a, b) => b.score - a.score);\n return phases.slice(0, cfg.topK);\n}\n\n/**\n * Score a single phase offset against beat candidates.\n */\nfunction scorePhase(\n phaseOffset: number,\n period: number,\n candidates: BeatCandidate[],\n audioDuration: number,\n tolerance: number\n): { score: number; matchCount: number; avgOffsetError: number } {\n let score = 0;\n let matchCount = 0;\n let totalOffsetError = 0;\n\n for (const candidate of candidates) {\n // Find the closest grid beat to this candidate\n const beatsFromStart = (candidate.time - phaseOffset) / period;\n const nearestBeatIndex = Math.round(beatsFromStart);\n const nearestBeatTime = phaseOffset + nearestBeatIndex * period;\n\n // Skip if the nearest beat is outside the audio range\n if (nearestBeatTime < 0 || nearestBeatTime > audioDuration) continue;\n\n const offset = Math.abs(candidate.time - nearestBeatTime);\n\n if (offset <= tolerance) {\n // Gaussian-like weighting: closer matches score higher\n const weight = Math.exp((-offset * offset) / (2 * tolerance * tolerance));\n score += candidate.strength * weight;\n matchCount++;\n totalOffsetError += offset;\n }\n }\n\n const avgOffsetError = matchCount > 0 ? totalOffsetError / matchCount : 0;\n\n return { score, matchCount, avgOffsetError };\n}\n\n/**\n * Generate beat times for a given grid within the audio duration.\n *\n * @param bpm - Tempo in beats per minute\n * @param phaseOffset - Base phase offset in seconds\n * @param userNudge - User adjustment in seconds (additive)\n * @param audioDuration - Total audio duration in seconds\n * @returns Array of beat times in seconds\n */\nexport function generateBeatTimes(\n bpm: number,\n phaseOffset: number,\n userNudge: number,\n audioDuration: number\n): number[] {\n if (bpm <= 0 || audioDuration <= 0) {\n return [];\n }\n\n const period = 60 / bpm;\n const effectivePhase = phaseOffset + userNudge;\n const beats: number[] = [];\n\n // Find the first beat at or after time 0\n const firstBeatIndex = Math.ceil(-effectivePhase / period);\n let time = effectivePhase + firstBeatIndex * period;\n\n while (time <= audioDuration) {\n if (time >= 0) {\n beats.push(time);\n }\n time += period;\n }\n\n return beats;\n}\n","/**\n * Musical Time utilities for B4.\n *\n * These functions compute derived values from musical time structures.\n * All computations are deterministic and pure.\n */\n\nimport type { BeatPosition, MusicalTimeSegment, MusicalTimeStructure, BeatGrid } from \"../types\";\n\n/**\n * Find the segment containing a given time.\n * Segments are non-overlapping, so at most one segment contains any time.\n *\n * @param time - Time in seconds from track start\n * @param segments - Ordered list of segments (by startTime ascending)\n * @returns The containing segment, or null if time is outside all segments\n */\nexport function findSegmentAtTime(\n time: number,\n segments: MusicalTimeSegment[]\n): MusicalTimeSegment | null {\n // Binary search would be more efficient for many segments,\n // but linear scan is fine for typical track segment counts (<10)\n for (const segment of segments) {\n if (time >= segment.startTime && time < segment.endTime) {\n return segment;\n }\n }\n return null;\n}\n\n/**\n * Compute the beat position at a given time.\n *\n * Beat position formula:\n * period = 60 / bpm\n * beatsFromStart = (time - phaseOffset) / period\n * beatIndex = floor(beatsFromStart)\n * beatPhase = beatsFromStart - beatIndex (fractional part, 0-1)\n * beatPosition = beatsFromStart (continuous)\n *\n * @param time - Time in seconds from track start\n * @param segments - Ordered list of segments (by startTime ascending)\n * @returns BeatPosition if time is within a segment, null otherwise\n */\nexport function computeBeatPosition(\n time: number,\n segments: MusicalTimeSegment[]\n): BeatPosition | null {\n const segment = findSegmentAtTime(time, segments);\n if (!segment) {\n return null;\n }\n\n const period = 60 / segment.bpm;\n const beatsFromStart = (time - segment.phaseOffset) / period;\n\n // Handle edge case: time before first beat in segment\n // beatIndex should never be negative within a properly defined segment\n const beatIndex = Math.floor(beatsFromStart);\n const beatPhase = beatsFromStart - beatIndex;\n\n return {\n segmentId: segment.id,\n beatIndex,\n beatPhase,\n beatPosition: beatsFromStart,\n bpm: segment.bpm,\n };\n}\n\n/**\n * Compute beat position from a MusicalTimeStructure.\n * Convenience wrapper for computeBeatPosition.\n */\nexport function computeBeatPositionFromStructure(\n time: number,\n structure: MusicalTimeStructure | null\n): BeatPosition | null {\n if (!structure || structure.segments.length === 0) {\n return null;\n }\n return computeBeatPosition(time, structure.segments);\n}\n\n/**\n * Generate a unique segment ID.\n */\nexport function generateSegmentId(): string {\n return `seg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Create a new MusicalTimeSegment from a BeatGrid.\n *\n * @param grid - The beat grid to promote\n * @param startTime - Segment start boundary in seconds\n * @param endTime - Segment end boundary in seconds\n * @returns A new MusicalTimeSegment\n */\nexport function createSegmentFromGrid(\n grid: BeatGrid,\n startTime: number,\n endTime: number\n): MusicalTimeSegment {\n const effectivePhaseOffset = grid.phaseOffset + grid.userNudge;\n\n return {\n id: generateSegmentId(),\n bpm: grid.bpm,\n phaseOffset: effectivePhaseOffset,\n startTime,\n endTime,\n confidence: grid.confidence,\n provenance: {\n source: \"promoted_from_hypothesis\",\n sourceHypothesisId: grid.sourceHypothesisId,\n promotedAt: new Date().toISOString(),\n userNudge: grid.userNudge,\n },\n };\n}\n\n/**\n * Create a new empty MusicalTimeStructure.\n */\nexport function createMusicalTimeStructure(): MusicalTimeStructure {\n const now = new Date().toISOString();\n return {\n version: 1,\n segments: [],\n createdAt: now,\n modifiedAt: now,\n };\n}\n\n/**\n * Validate that segments are non-overlapping and ordered.\n *\n * @param segments - List of segments to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateSegments(segments: MusicalTimeSegment[]): string[] {\n const errors: string[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!seg) continue;\n\n // Check segment bounds\n if (seg.startTime >= seg.endTime) {\n errors.push(`Segment ${seg.id}: startTime (${seg.startTime}) >= endTime (${seg.endTime})`);\n }\n\n if (seg.bpm <= 0) {\n errors.push(`Segment ${seg.id}: bpm (${seg.bpm}) must be positive`);\n }\n\n // Check ordering and non-overlap with next segment\n if (i < segments.length - 1) {\n const next = segments[i + 1];\n if (!next) continue;\n if (seg.startTime >= next.startTime) {\n errors.push(`Segment ${seg.id} not ordered before ${next.id}`);\n }\n if (seg.endTime > next.startTime) {\n errors.push(`Segment ${seg.id} overlaps with ${next.id}`);\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Sort segments by startTime ascending.\n * Returns a new array (does not mutate input).\n */\nexport function sortSegments(segments: MusicalTimeSegment[]): MusicalTimeSegment[] {\n return [...segments].sort((a, b) => a.startTime - b.startTime);\n}\n\n/**\n * Split a segment at a given time.\n *\n * @param segment - The segment to split\n * @param splitTime - Time in seconds where to split\n * @returns Tuple of [beforeSegment, afterSegment]\n * @throws If splitTime is outside segment bounds\n */\nexport function splitSegment(\n segment: MusicalTimeSegment,\n splitTime: number\n): [MusicalTimeSegment, MusicalTimeSegment] {\n if (splitTime <= segment.startTime || splitTime >= segment.endTime) {\n throw new Error(\n `Split time ${splitTime} must be within segment bounds [${segment.startTime}, ${segment.endTime})`\n );\n }\n\n const beforeSegment: MusicalTimeSegment = {\n ...segment,\n id: generateSegmentId(),\n endTime: splitTime,\n };\n\n const afterSegment: MusicalTimeSegment = {\n ...segment,\n id: generateSegmentId(),\n startTime: splitTime,\n // phaseOffset stays the same - beat grid continues seamlessly\n };\n\n return [beforeSegment, afterSegment];\n}\n\n/**\n * Generate beat times within a segment.\n * Used for rendering beat markers.\n *\n * @param segment - The segment to generate beats for\n * @returns Array of beat times in seconds\n */\nexport function generateSegmentBeatTimes(segment: MusicalTimeSegment): number[] {\n const period = 60 / segment.bpm;\n const times: number[] = [];\n\n // Find first beat at or after segment start\n const beatsBeforeStart = Math.ceil((segment.startTime - segment.phaseOffset) / period);\n let time = segment.phaseOffset + beatsBeforeStart * period;\n\n while (time < segment.endTime) {\n if (time >= segment.startTime) {\n times.push(time);\n }\n time += period;\n }\n\n return times;\n}\n","/**\n * Frequency Band utilities for F1.\n *\n * These functions provide validation, creation, and query operations\n * for frequency band structures. All computations are deterministic and pure.\n */\n\nimport type {\n FrequencyBand,\n FrequencyBandStructure,\n FrequencyBandTimeScope,\n FrequencyBandProvenance,\n FrequencyBoundsAtTime,\n FrequencySegment,\n FrequencyKeyframe,\n} from \"../types\";\n\n// ----------------------------\n// ID Generation\n// ----------------------------\n\n/**\n * Generate a unique band ID.\n */\nexport function generateBandId(): string {\n return `band-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ----------------------------\n// Validation\n// ----------------------------\n\n/**\n * Validate frequency segments for a band.\n *\n * Checks:\n * - lowHz < highHz at all segment boundaries\n * - All frequency values are non-negative\n * - startTime < endTime for each segment\n * - Segments don't overlap in time\n * - Segments are ordered by startTime\n *\n * @param segments - Frequency segments to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateFrequencySegments(segments: FrequencySegment[]): string[] {\n const errors: string[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!seg) continue;\n\n // Check frequency invariants at start\n if (seg.lowHzStart < 0 || seg.highHzStart < 0) {\n errors.push(`Segment ${i}: start frequencies must be non-negative`);\n }\n if (seg.lowHzStart >= seg.highHzStart) {\n errors.push(\n `Segment ${i}: lowHzStart (${seg.lowHzStart}) must be < highHzStart (${seg.highHzStart})`\n );\n }\n\n // Check frequency invariants at end\n if (seg.lowHzEnd < 0 || seg.highHzEnd < 0) {\n errors.push(`Segment ${i}: end frequencies must be non-negative`);\n }\n if (seg.lowHzEnd >= seg.highHzEnd) {\n errors.push(\n `Segment ${i}: lowHzEnd (${seg.lowHzEnd}) must be < highHzEnd (${seg.highHzEnd})`\n );\n }\n\n // Check time ordering\n if (seg.startTime >= seg.endTime) {\n errors.push(\n `Segment ${i}: startTime (${seg.startTime}) must be < endTime (${seg.endTime})`\n );\n }\n\n // Check non-overlap with next segment\n if (i < segments.length - 1) {\n const next = segments[i + 1];\n if (!next) continue;\n if (seg.endTime > next.startTime) {\n errors.push(`Segment ${i} overlaps with segment ${i + 1}`);\n }\n if (seg.startTime >= next.startTime) {\n errors.push(`Segment ${i} not ordered before segment ${i + 1}`);\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validate a frequency band.\n *\n * @param band - Frequency band to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateFrequencyBand(band: FrequencyBand): string[] {\n const errors: string[] = [];\n\n if (!band.id || band.id.trim() === \"\") {\n errors.push(\"Band must have a non-empty id\");\n }\n\n if (!band.label || band.label.trim() === \"\") {\n errors.push(\"Band must have a non-empty label\");\n }\n\n if (band.frequencyShape.length === 0) {\n errors.push(`Band \"${band.label}\": must have at least one frequency segment`);\n }\n\n // Validate segments\n const segmentErrors = validateFrequencySegments(band.frequencyShape);\n errors.push(...segmentErrors.map((e) => `Band \"${band.label}\": ${e}`));\n\n // For sectioned bands, validate segments cover the scope\n if (band.timeScope.kind === \"sectioned\" && band.frequencyShape.length > 0) {\n const { startTime, endTime } = band.timeScope;\n const first = band.frequencyShape[0];\n const last = band.frequencyShape[band.frequencyShape.length - 1];\n\n if (first && first.startTime > startTime) {\n errors.push(\n `Band \"${band.label}\": segments don't cover scope start (first segment starts at ${first.startTime}, scope starts at ${startTime})`\n );\n }\n if (last && last.endTime < endTime) {\n errors.push(\n `Band \"${band.label}\": segments don't cover scope end (last segment ends at ${last.endTime}, scope ends at ${endTime})`\n );\n }\n }\n // Note: Global bands skip coverage validation per design decision\n\n return errors;\n}\n\n/**\n * Validate a complete frequency band structure.\n *\n * @param structure - Structure to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateBandStructure(structure: FrequencyBandStructure): string[] {\n const errors: string[] = [];\n\n // Check for duplicate IDs\n const ids = new Set<string>();\n for (const band of structure.bands) {\n if (ids.has(band.id)) {\n errors.push(`Duplicate band ID: ${band.id}`);\n }\n ids.add(band.id);\n }\n\n // Validate each band\n for (const band of structure.bands) {\n errors.push(...validateFrequencyBand(band));\n }\n\n return errors;\n}\n\n// ----------------------------\n// Creation Helpers\n// ----------------------------\n\n/**\n * Create an empty FrequencyBandStructure.\n */\nexport function createBandStructure(): FrequencyBandStructure {\n const now = new Date().toISOString();\n return {\n version: 1,\n bands: [],\n createdAt: now,\n modifiedAt: now,\n };\n}\n\n/**\n * Create a simple constant-frequency band (no time variation).\n *\n * @param label - Human-readable band label\n * @param lowHz - Lower frequency bound in Hz\n * @param highHz - Upper frequency bound in Hz\n * @param duration - Duration in seconds (defines segment end time)\n * @param options - Optional configuration\n * @returns A new FrequencyBand\n */\nexport function createConstantBand(\n label: string,\n lowHz: number,\n highHz: number,\n duration: number,\n options?: {\n enabled?: boolean;\n sortOrder?: number;\n id?: string;\n }\n): FrequencyBand {\n const now = new Date().toISOString();\n return {\n id: options?.id ?? generateBandId(),\n label,\n enabled: options?.enabled ?? true,\n timeScope: { kind: \"global\" },\n frequencyShape: [\n {\n startTime: 0,\n endTime: duration,\n lowHzStart: lowHz,\n highHzStart: highHz,\n lowHzEnd: lowHz,\n highHzEnd: highHz,\n },\n ],\n sortOrder: options?.sortOrder ?? 0,\n provenance: {\n source: \"manual\",\n createdAt: now,\n },\n };\n}\n\n/**\n * Create a sectioned band (applies only to a time range).\n *\n * @param label - Human-readable band label\n * @param lowHz - Lower frequency bound in Hz\n * @param highHz - Upper frequency bound in Hz\n * @param startTime - Section start time in seconds\n * @param endTime - Section end time in seconds\n * @param options - Optional configuration\n * @returns A new FrequencyBand\n */\nexport function createSectionedBand(\n label: string,\n lowHz: number,\n highHz: number,\n startTime: number,\n endTime: number,\n options?: {\n enabled?: boolean;\n sortOrder?: number;\n id?: string;\n }\n): FrequencyBand {\n const now = new Date().toISOString();\n return {\n id: options?.id ?? generateBandId(),\n label,\n enabled: options?.enabled ?? true,\n timeScope: { kind: \"sectioned\", startTime, endTime },\n frequencyShape: [\n {\n startTime,\n endTime,\n lowHzStart: lowHz,\n highHzStart: highHz,\n lowHzEnd: lowHz,\n highHzEnd: highHz,\n },\n ],\n sortOrder: options?.sortOrder ?? 0,\n provenance: {\n source: \"manual\",\n createdAt: now,\n },\n };\n}\n\n/**\n * Create standard frequency bands for a track.\n *\n * Creates a standard 6-band frequency split:\n * - Sub Bass: 20-60 Hz\n * - Bass: 60-250 Hz\n * - Low Mids: 250-500 Hz\n * - Mids: 500-2000 Hz\n * - High Mids: 2000-4000 Hz\n * - Highs: 4000-20000 Hz\n *\n * @param duration - Track duration in seconds\n * @returns Array of FrequencyBand objects\n */\nexport function createStandardBands(duration: number): FrequencyBand[] {\n const now = new Date().toISOString();\n const bands: Array<{ label: string; lowHz: number; highHz: number }> = [\n { label: \"Sub Bass\", lowHz: 20, highHz: 60 },\n { label: \"Bass\", lowHz: 60, highHz: 250 },\n { label: \"Low Mids\", lowHz: 250, highHz: 500 },\n { label: \"Mids\", lowHz: 500, highHz: 2000 },\n { label: \"High Mids\", lowHz: 2000, highHz: 4000 },\n { label: \"Highs\", lowHz: 4000, highHz: 20000 },\n ];\n\n return bands.map((b, index) => ({\n id: generateBandId(),\n label: b.label,\n enabled: true,\n timeScope: { kind: \"global\" } as FrequencyBandTimeScope,\n frequencyShape: [\n {\n startTime: 0,\n endTime: duration,\n lowHzStart: b.lowHz,\n highHzStart: b.highHz,\n lowHzEnd: b.lowHz,\n highHzEnd: b.highHz,\n },\n ],\n sortOrder: index,\n provenance: {\n source: \"preset\" as const,\n createdAt: now,\n presetName: \"Standard 6-Band\",\n },\n }));\n}\n\n// ----------------------------\n// Query Helpers\n// ----------------------------\n\n/**\n * Get all bands active at a given time.\n *\n * A band is active if:\n * - It is enabled\n * - The time falls within its time scope\n *\n * @param structure - Frequency band structure (can be null)\n * @param time - Time in seconds\n * @returns Array of active bands\n */\nexport function bandsActiveAt(\n structure: FrequencyBandStructure | null,\n time: number\n): FrequencyBand[] {\n if (!structure) return [];\n\n return structure.bands.filter((band) => {\n if (!band.enabled) return false;\n if (band.timeScope.kind === \"global\") return true;\n return time >= band.timeScope.startTime && time < band.timeScope.endTime;\n });\n}\n\n/**\n * Get frequency bounds for a band at a given time.\n *\n * Uses linear interpolation within segments.\n *\n * @param band - The frequency band to query\n * @param time - Time in seconds\n * @returns Frequency bounds if band is active and has defined bounds, null otherwise\n */\nexport function frequencyBoundsAt(\n band: FrequencyBand,\n time: number\n): FrequencyBoundsAtTime | null {\n // Check if band is active at this time\n if (!band.enabled) return null;\n\n if (band.timeScope.kind === \"sectioned\") {\n if (time < band.timeScope.startTime || time >= band.timeScope.endTime) {\n return null;\n }\n }\n\n // Find the segment containing this time\n for (const seg of band.frequencyShape) {\n if (time >= seg.startTime && time < seg.endTime) {\n // Linear interpolation\n const t = (time - seg.startTime) / (seg.endTime - seg.startTime);\n return {\n bandId: band.id,\n lowHz: seg.lowHzStart + (seg.lowHzEnd - seg.lowHzStart) * t,\n highHz: seg.highHzStart + (seg.highHzEnd - seg.highHzStart) * t,\n enabled: band.enabled,\n };\n }\n }\n\n // Edge case: time exactly at end of last segment\n const last = band.frequencyShape[band.frequencyShape.length - 1];\n if (last && Math.abs(time - last.endTime) < 0.001) {\n return {\n bandId: band.id,\n lowHz: last.lowHzEnd,\n highHz: last.highHzEnd,\n enabled: band.enabled,\n };\n }\n\n return null;\n}\n\n/**\n * Get all frequency bounds at a given time.\n *\n * Returns bounds for all active bands that have defined frequency at the given time.\n *\n * @param structure - Frequency band structure (can be null)\n * @param time - Time in seconds\n * @returns Array of frequency bounds, sorted by sortOrder\n */\nexport function allFrequencyBoundsAt(\n structure: FrequencyBandStructure | null,\n time: number\n): FrequencyBoundsAtTime[] {\n if (!structure) return [];\n\n const bounds: FrequencyBoundsAtTime[] = [];\n\n for (const band of structure.bands) {\n const b = frequencyBoundsAt(band, time);\n if (b) bounds.push(b);\n }\n\n // Sort by sortOrder\n bounds.sort((a, b) => {\n const bandA = structure.bands.find((band) => band.id === a.bandId);\n const bandB = structure.bands.find((band) => band.id === b.bandId);\n return (bandA?.sortOrder ?? 0) - (bandB?.sortOrder ?? 0);\n });\n\n return bounds;\n}\n\n/**\n * Find a band by its ID.\n *\n * @param structure - Frequency band structure (can be null)\n * @param id - Band ID to find\n * @returns The band if found, null otherwise\n */\nexport function findBandById(\n structure: FrequencyBandStructure | null,\n id: string\n): FrequencyBand | null {\n if (!structure) return null;\n return structure.bands.find((b) => b.id === id) ?? null;\n}\n\n// ----------------------------\n// Sorting Helpers\n// ----------------------------\n\n/**\n * Sort bands by sortOrder.\n * Returns a new array (does not mutate input).\n *\n * @param bands - Bands to sort\n * @returns New array sorted by sortOrder ascending\n */\nexport function sortBands(bands: FrequencyBand[]): FrequencyBand[] {\n return [...bands].sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Sort frequency segments by startTime.\n * Returns a new array (does not mutate input).\n *\n * @param segments - Segments to sort\n * @returns New array sorted by startTime ascending\n */\nexport function sortFrequencySegments(segments: FrequencySegment[]): FrequencySegment[] {\n return [...segments].sort((a, b) => a.startTime - b.startTime);\n}\n\n// ----------------------------\n// Modification Helpers\n// ----------------------------\n\n/**\n * Update the modifiedAt timestamp of a structure.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure to update\n * @returns New structure with updated modifiedAt\n */\nexport function touchStructure(structure: FrequencyBandStructure): FrequencyBandStructure {\n return {\n ...structure,\n modifiedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Add a band to a structure.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure to add to\n * @param band - Band to add\n * @returns New structure with the band added\n */\nexport function addBandToStructure(\n structure: FrequencyBandStructure,\n band: FrequencyBand\n): FrequencyBandStructure {\n return {\n ...structure,\n bands: sortBands([...structure.bands, band]),\n modifiedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Remove a band from a structure by ID.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure to remove from\n * @param bandId - ID of band to remove\n * @returns New structure with the band removed\n */\nexport function removeBandFromStructure(\n structure: FrequencyBandStructure,\n bandId: string\n): FrequencyBandStructure {\n return {\n ...structure,\n bands: structure.bands.filter((b) => b.id !== bandId),\n modifiedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Update a band in a structure.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure containing the band\n * @param bandId - ID of band to update\n * @param updates - Partial band updates to apply\n * @returns New structure with the band updated\n */\nexport function updateBandInStructure(\n structure: FrequencyBandStructure,\n bandId: string,\n updates: Partial<Omit<FrequencyBand, \"id\">>\n): FrequencyBandStructure {\n return {\n ...structure,\n bands: sortBands(\n structure.bands.map((b) => (b.id === bandId ? { ...b, ...updates } : b))\n ),\n modifiedAt: new Date().toISOString(),\n };\n}\n\n// ----------------------------\n// Keyframe Helpers (F2)\n// ----------------------------\n\n/**\n * Extract keyframes from a band's frequency shape.\n *\n * Keyframes are a UI abstraction over the segment model.\n * Each segment has a start keyframe and an end keyframe.\n * Adjacent segments share keyframes at their boundaries.\n *\n * @param band - The frequency band to extract keyframes from\n * @returns Array of keyframes sorted by time\n */\nexport function keyframesFromBand(band: FrequencyBand): FrequencyKeyframe[] {\n const keyframes: FrequencyKeyframe[] = [];\n const segments = sortFrequencySegments(band.frequencyShape);\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!seg) continue;\n\n // Add start keyframe\n keyframes.push({\n time: seg.startTime,\n lowHz: seg.lowHzStart,\n highHz: seg.highHzStart,\n segmentIndex: i,\n edge: \"start\",\n });\n\n // Only add end keyframe if it's not shared with next segment\n const nextSeg = segments[i + 1];\n const isShared = nextSeg && Math.abs(nextSeg.startTime - seg.endTime) < 0.001;\n\n if (!isShared) {\n keyframes.push({\n time: seg.endTime,\n lowHz: seg.lowHzEnd,\n highHz: seg.highHzEnd,\n segmentIndex: i,\n edge: \"end\",\n });\n }\n }\n\n return keyframes;\n}\n\n/**\n * Convert keyframes back to frequency segments.\n *\n * Consecutive keyframes become segment boundaries.\n * This is the inverse of keyframesFromBand.\n *\n * @param keyframes - Array of keyframes (must be sorted by time)\n * @returns Array of frequency segments\n */\nexport function segmentsFromKeyframes(keyframes: FrequencyKeyframe[]): FrequencySegment[] {\n if (keyframes.length < 2) return [];\n\n const sorted = [...keyframes].sort((a, b) => a.time - b.time);\n const segments: FrequencySegment[] = [];\n\n for (let i = 0; i < sorted.length - 1; i++) {\n const curr = sorted[i];\n const next = sorted[i + 1];\n if (!curr || !next) continue;\n\n segments.push({\n startTime: curr.time,\n endTime: next.time,\n lowHzStart: curr.lowHz,\n highHzStart: curr.highHz,\n lowHzEnd: next.lowHz,\n highHzEnd: next.highHz,\n });\n }\n\n return segments;\n}\n\n/**\n * Split a band's segment at a given time, creating a new keyframe.\n *\n * The frequency values at the split point are interpolated from the\n * existing segment. Returns a new band with updated frequencyShape.\n *\n * @param band - The band to split\n * @param time - Time in seconds to split at\n * @returns New band with the split segment, or original band if time is invalid\n */\nexport function splitBandSegmentAt(band: FrequencyBand, time: number): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n // Find the segment containing this time\n const segmentIndex = segments.findIndex(\n (seg) => time > seg.startTime && time < seg.endTime\n );\n\n if (segmentIndex === -1) {\n // Time is not inside any segment\n return band;\n }\n\n const seg = segments[segmentIndex];\n if (!seg) return band;\n\n // Calculate interpolated values at split point\n const t = (time - seg.startTime) / (seg.endTime - seg.startTime);\n const lowHz = seg.lowHzStart + (seg.lowHzEnd - seg.lowHzStart) * t;\n const highHz = seg.highHzStart + (seg.highHzEnd - seg.highHzStart) * t;\n\n // Create two new segments\n const firstHalf: FrequencySegment = {\n startTime: seg.startTime,\n endTime: time,\n lowHzStart: seg.lowHzStart,\n highHzStart: seg.highHzStart,\n lowHzEnd: lowHz,\n highHzEnd: highHz,\n };\n\n const secondHalf: FrequencySegment = {\n startTime: time,\n endTime: seg.endTime,\n lowHzStart: lowHz,\n highHzStart: highHz,\n lowHzEnd: seg.lowHzEnd,\n highHzEnd: seg.highHzEnd,\n };\n\n // Replace the original segment with the two halves\n const newSegments = [\n ...segments.slice(0, segmentIndex),\n firstHalf,\n secondHalf,\n ...segments.slice(segmentIndex + 1),\n ];\n\n return {\n ...band,\n frequencyShape: newSegments,\n };\n}\n\n/**\n * Merge adjacent segments where frequencies match at the boundary.\n *\n * This is useful after deleting a keyframe to clean up redundant segments.\n *\n * @param band - The band to merge segments in\n * @param tolerance - Frequency tolerance for considering values equal (default 0.1 Hz)\n * @returns New band with merged segments\n */\nexport function mergeAdjacentSegments(\n band: FrequencyBand,\n tolerance: number = 0.1\n): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n if (segments.length < 2) return band;\n\n const merged: FrequencySegment[] = [];\n let current = segments[0];\n\n if (!current) return band;\n\n for (let i = 1; i < segments.length; i++) {\n const next = segments[i];\n if (!next) continue;\n\n // Check if segments can be merged\n const timeMatches = Math.abs(current.endTime - next.startTime) < 0.001;\n const lowMatches = Math.abs(current.lowHzEnd - next.lowHzStart) < tolerance;\n const highMatches = Math.abs(current.highHzEnd - next.highHzStart) < tolerance;\n\n if (timeMatches && lowMatches && highMatches) {\n // Merge: extend current to include next\n current = {\n startTime: current.startTime,\n endTime: next.endTime,\n lowHzStart: current.lowHzStart,\n highHzStart: current.highHzStart,\n lowHzEnd: next.lowHzEnd,\n highHzEnd: next.highHzEnd,\n };\n } else {\n // Can't merge: push current and move on\n merged.push(current);\n current = next;\n }\n }\n\n // Don't forget the last segment\n merged.push(current);\n\n return {\n ...band,\n frequencyShape: merged,\n };\n}\n\n/**\n * Remove a keyframe from a band.\n *\n * This merges the two adjacent segments into one.\n * Cannot remove first or last keyframe (would make band invalid).\n *\n * @param band - The band to modify\n * @param time - Time of the keyframe to remove\n * @returns New band with keyframe removed, or original if removal is invalid\n */\nexport function removeKeyframe(band: FrequencyBand, time: number): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n if (segments.length < 2) return band;\n\n // Find the segment that ends at this time and the one that starts at this time\n const endingIndex = segments.findIndex(\n (seg) => Math.abs(seg.endTime - time) < 0.001\n );\n const startingIndex = segments.findIndex(\n (seg) => Math.abs(seg.startTime - time) < 0.001\n );\n\n // Can only remove keyframes at segment boundaries (not first or last)\n if (endingIndex === -1 || startingIndex === -1) return band;\n if (endingIndex !== startingIndex - 1) return band;\n\n const endingSeg = segments[endingIndex];\n const startingSeg = segments[startingIndex];\n\n if (!endingSeg || !startingSeg) return band;\n\n // Merge the two segments\n const merged: FrequencySegment = {\n startTime: endingSeg.startTime,\n endTime: startingSeg.endTime,\n lowHzStart: endingSeg.lowHzStart,\n highHzStart: endingSeg.highHzStart,\n lowHzEnd: startingSeg.lowHzEnd,\n highHzEnd: startingSeg.highHzEnd,\n };\n\n const newSegments = [\n ...segments.slice(0, endingIndex),\n merged,\n ...segments.slice(startingIndex + 1),\n ];\n\n return {\n ...band,\n frequencyShape: newSegments,\n };\n}\n\n/**\n * Update a keyframe's frequency values.\n *\n * This updates the corresponding segment boundary.\n *\n * @param band - The band to modify\n * @param time - Time of the keyframe to update\n * @param lowHz - New lower frequency (or undefined to keep current)\n * @param highHz - New upper frequency (or undefined to keep current)\n * @returns New band with updated keyframe\n */\nexport function updateKeyframe(\n band: FrequencyBand,\n time: number,\n lowHz?: number,\n highHz?: number\n): FrequencyBand {\n const segments = band.frequencyShape.map((seg) => {\n const isStart = Math.abs(seg.startTime - time) < 0.001;\n const isEnd = Math.abs(seg.endTime - time) < 0.001;\n\n if (!isStart && !isEnd) return seg;\n\n const newSeg = { ...seg };\n\n if (isStart) {\n if (lowHz !== undefined) newSeg.lowHzStart = lowHz;\n if (highHz !== undefined) newSeg.highHzStart = highHz;\n }\n\n if (isEnd) {\n if (lowHz !== undefined) newSeg.lowHzEnd = lowHz;\n if (highHz !== undefined) newSeg.highHzEnd = highHz;\n }\n\n return newSeg;\n });\n\n return {\n ...band,\n frequencyShape: segments,\n };\n}\n\n/**\n * Move a keyframe in time.\n *\n * Updates the endTime of the segment before and startTime of the segment after.\n * Cannot move first or last keyframe.\n *\n * @param band - The band to modify\n * @param oldTime - Current time of the keyframe\n * @param newTime - New time for the keyframe\n * @returns New band with moved keyframe, or original if move is invalid\n */\nexport function moveKeyframeTime(\n band: FrequencyBand,\n oldTime: number,\n newTime: number\n): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n // Find the segments that share this boundary\n const endingIndex = segments.findIndex(\n (seg) => Math.abs(seg.endTime - oldTime) < 0.001\n );\n const startingIndex = segments.findIndex(\n (seg) => Math.abs(seg.startTime - oldTime) < 0.001\n );\n\n // Must be at a segment boundary\n if (endingIndex === -1 || startingIndex === -1) return band;\n if (endingIndex !== startingIndex - 1) return band;\n\n const endingSeg = segments[endingIndex];\n const startingSeg = segments[startingIndex];\n\n if (!endingSeg || !startingSeg) return band;\n\n // Check bounds: newTime must be within the span of both segments\n if (newTime <= endingSeg.startTime || newTime >= startingSeg.endTime) {\n return band;\n }\n\n // Update the boundary\n const newSegments = segments.map((seg, i) => {\n if (i === endingIndex) {\n return { ...seg, endTime: newTime };\n }\n if (i === startingIndex) {\n return { ...seg, startTime: newTime };\n }\n return seg;\n });\n\n return {\n ...band,\n frequencyShape: newSegments,\n };\n}\n","/**\n * Band Masking utilities for F3.\n *\n * These functions apply frequency band boundaries as spectral masks\n * to an existing spectrogram, enabling per-band MIR analysis.\n */\n\nimport type { Spectrogram } from \"./spectrogram\";\nimport type { FrequencyBand } from \"../types\";\nimport { frequencyBoundsAt } from \"./frequencyBand\";\n\n// ----------------------------\n// Types\n// ----------------------------\n\nexport type BandMaskOptions = {\n /** Soft edge width in Hz for smooth transitions (0 = hard edge). Default: 0 */\n edgeSmoothHz?: number;\n};\n\nexport type MaskedSpectrogram = Spectrogram & {\n /** ID of the band this mask was computed for */\n bandId: string;\n /** Fraction of energy retained per frame (0-1) for diagnostics */\n energyRetainedPerFrame: Float32Array;\n};\n\n// ----------------------------\n// Conversion Helpers\n// ----------------------------\n\n/**\n * Convert an FFT bin index to frequency in Hz.\n *\n * @param bin - FFT bin index (0 to fftSize/2)\n * @param sampleRate - Audio sample rate in Hz\n * @param fftSize - FFT size (number of samples)\n * @returns Frequency in Hz\n */\nexport function binToHz(bin: number, sampleRate: number, fftSize: number): number {\n return bin * (sampleRate / fftSize);\n}\n\n/**\n * Convert a frequency in Hz to an FFT bin index.\n *\n * @param hz - Frequency in Hz\n * @param sampleRate - Audio sample rate in Hz\n * @param fftSize - FFT size (number of samples)\n * @returns FFT bin index (may be fractional)\n */\nexport function hzToBin(hz: number, sampleRate: number, fftSize: number): number {\n return hz / (sampleRate / fftSize);\n}\n\n// ----------------------------\n// Mask Computation\n// ----------------------------\n\n/**\n * Compute a spectral mask for a band at a specific time.\n *\n * Returns a Float32Array of length (fftSize/2 + 1) containing\n * mask values between 0 and 1.\n *\n * @param band - The frequency band to mask\n * @param time - Time in seconds\n * @param sampleRate - Audio sample rate in Hz\n * @param fftSize - FFT size\n * @param options - Mask options\n * @returns Mask array, or null if band is inactive at this time\n */\nexport function computeBandMaskAtTime(\n band: FrequencyBand,\n time: number,\n sampleRate: number,\n fftSize: number,\n options?: BandMaskOptions\n): Float32Array | null {\n const bounds = frequencyBoundsAt(band, time);\n if (!bounds) return null;\n\n const nBins = (fftSize >>> 1) + 1;\n const mask = new Float32Array(nBins);\n const edgeSmoothHz = options?.edgeSmoothHz ?? 0;\n const binHz = sampleRate / fftSize;\n\n for (let k = 0; k < nBins; k++) {\n const hz = binToHz(k, sampleRate, fftSize);\n\n if (hz < bounds.lowHz || hz > bounds.highHz) {\n // Outside band\n mask[k] = 0;\n } else if (edgeSmoothHz <= 0) {\n // Inside band, hard edge\n mask[k] = 1;\n } else {\n // Inside band, with soft edges\n const distFromLow = hz - bounds.lowHz;\n const distFromHigh = bounds.highHz - hz;\n\n let gain = 1;\n\n // Apply raised-cosine taper at low edge\n if (distFromLow < edgeSmoothHz) {\n gain *= 0.5 * (1 - Math.cos(Math.PI * distFromLow / edgeSmoothHz));\n }\n\n // Apply raised-cosine taper at high edge\n if (distFromHigh < edgeSmoothHz) {\n gain *= 0.5 * (1 - Math.cos(Math.PI * distFromHigh / edgeSmoothHz));\n }\n\n mask[k] = gain;\n }\n }\n\n return mask;\n}\n\n/**\n * Apply a band mask to an entire spectrogram.\n *\n * Creates a new spectrogram with band-masked magnitudes.\n * Uses linear interpolation of band bounds for time-varying bands.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to apply\n * @param options - Mask options\n * @returns Masked spectrogram with energy retention diagnostics\n */\nexport function applyBandMaskToSpectrogram(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMaskOptions\n): MaskedSpectrogram {\n const nFrames = spec.times.length;\n const nBins = (spec.fftSize >>> 1) + 1;\n\n const maskedMagnitudes: Float32Array[] = new Array(nFrames);\n const energyRetained = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const time = spec.times[t] ?? 0;\n const srcMags = spec.magnitudes[t];\n\n if (!srcMags) {\n maskedMagnitudes[t] = new Float32Array(nBins);\n energyRetained[t] = 0;\n continue;\n }\n\n // Compute mask for this frame\n const mask = computeBandMaskAtTime(\n band,\n time,\n spec.sampleRate,\n spec.fftSize,\n options\n );\n\n if (!mask) {\n // Band is inactive at this time\n maskedMagnitudes[t] = new Float32Array(nBins);\n energyRetained[t] = 0;\n continue;\n }\n\n // Apply mask and compute energy\n const masked = new Float32Array(nBins);\n let originalEnergy = 0;\n let maskedEnergy = 0;\n\n for (let k = 0; k < nBins; k++) {\n const mag = srcMags[k] ?? 0;\n const maskedMag = mag * (mask[k] ?? 0);\n\n masked[k] = maskedMag;\n originalEnergy += mag * mag;\n maskedEnergy += maskedMag * maskedMag;\n }\n\n maskedMagnitudes[t] = masked;\n energyRetained[t] = originalEnergy > 0 ? maskedEnergy / originalEnergy : 0;\n }\n\n return {\n sampleRate: spec.sampleRate,\n fftSize: spec.fftSize,\n hopSize: spec.hopSize,\n times: spec.times,\n magnitudes: maskedMagnitudes,\n bandId: band.id,\n energyRetainedPerFrame: energyRetained,\n };\n}\n\n/**\n * Compute the energy of a magnitude spectrum.\n *\n * @param magnitudes - Magnitude spectrum (one frame)\n * @returns Sum of squared magnitudes\n */\nexport function computeFrameEnergy(magnitudes: Float32Array): number {\n let energy = 0;\n for (let k = 0; k < magnitudes.length; k++) {\n const mag = magnitudes[k] ?? 0;\n energy += mag * mag;\n }\n return energy;\n}\n\n/**\n * Compute the amplitude (sum of magnitudes) of a frame.\n *\n * @param magnitudes - Magnitude spectrum (one frame)\n * @returns Sum of magnitudes\n */\nexport function computeFrameAmplitude(magnitudes: Float32Array): number {\n let sum = 0;\n for (let k = 0; k < magnitudes.length; k++) {\n sum += magnitudes[k] ?? 0;\n }\n return sum;\n}\n","/**\n * Band-Scoped MIR utilities for F3.\n *\n * These functions compute MIR features (amplitude envelope, onset strength,\n * spectral flux) for frequency bands by applying spectral masks to an\n * existing spectrogram.\n */\n\nimport type { Spectrogram } from \"./spectrogram\";\nimport type {\n FrequencyBand,\n MirRunMeta,\n MirRunTimings,\n BandMirFunctionId,\n BandMirDiagnostics,\n BandMir1DResult,\n} from \"../types\";\nimport {\n applyBandMaskToSpectrogram,\n computeFrameAmplitude,\n type BandMaskOptions,\n} from \"./bandMask\";\n\n// Re-export types for convenience\nexport type { BandMirFunctionId, BandMirDiagnostics, BandMir1DResult };\n\nexport type BandMirOptions = {\n /** Soft edge width in Hz for mask transitions. Default: 0 */\n edgeSmoothHz?: number;\n /** Options for onset strength computation */\n onset?: {\n /** If true, log-compress magnitudes before differencing. */\n useLog?: boolean;\n /** Moving-average smoothing window length in milliseconds. 0 disables smoothing. */\n smoothMs?: number;\n /** How to convert temporal differences into novelty. */\n diffMethod?: \"rectified\" | \"abs\";\n };\n /** Optional cancellation hook */\n isCancelled?: () => boolean;\n};\n\n// ----------------------------\n// Internal Helpers\n// ----------------------------\n\nfunction computeDiagnostics(\n energyRetainedPerFrame: Float32Array\n): BandMirDiagnostics {\n const totalFrames = energyRetainedPerFrame.length;\n let sum = 0;\n let weakCount = 0;\n let emptyCount = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const e = energyRetainedPerFrame[i] ?? 0;\n sum += e;\n if (e < 0.01) weakCount++;\n if (e === 0) emptyCount++;\n }\n\n const meanEnergyRetained = totalFrames > 0 ? sum / totalFrames : 0;\n const warnings: string[] = [];\n\n if (meanEnergyRetained < 0.01) {\n warnings.push(\"Band contains very little energy - check frequency range\");\n }\n if (emptyCount > totalFrames * 0.5) {\n warnings.push(\"More than half of frames are empty - band may not be active for this audio\");\n }\n\n return {\n meanEnergyRetained,\n weakFrameCount: weakCount,\n emptyFrameCount: emptyCount,\n totalFrames,\n warnings,\n };\n}\n\nfunction createMeta(startMs: number): MirRunMeta {\n const endMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n const timings: MirRunTimings = {\n totalMs: endMs - startMs,\n cpuMs: endMs - startMs,\n gpuMs: 0,\n };\n return {\n backend: \"cpu\",\n usedGpu: false,\n timings,\n };\n}\n\nfunction movingAverage(values: Float32Array, windowFrames: number): Float32Array {\n if (windowFrames <= 1) return values;\n\n const n = values.length;\n const out = new Float32Array(n);\n\n // Centered window.\n const half = Math.floor(windowFrames / 2);\n\n // Prefix sums for stable, bug-free O(n) moving average.\n const prefix = new Float64Array(n + 1);\n prefix[0] = 0;\n for (let i = 0; i < n; i++) {\n prefix[i + 1] = (prefix[i] ?? 0) + (values[i] ?? 0);\n }\n\n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - half);\n const end = Math.min(n, i + half + 1);\n const sum = (prefix[end] ?? 0) - (prefix[start] ?? 0);\n const count = Math.max(1, end - start);\n out[i] = sum / count;\n }\n\n return out;\n}\n\nfunction logCompress(x: number): number {\n // Stable compression without -Inf.\n return Math.log1p(Math.max(0, x));\n}\n\n// ----------------------------\n// Band MIR Functions\n// ----------------------------\n\n/**\n * Compute amplitude envelope for a frequency band.\n *\n * Returns the sum of magnitudes per frame within the band's frequency range.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band MIR result with amplitude envelope\n */\nexport function bandAmplitudeEnvelope(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMirOptions\n): BandMir1DResult {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n // Apply band mask\n const masked = applyBandMaskToSpectrogram(spec, band, {\n edgeSmoothHz: options?.edgeSmoothHz,\n });\n\n const nFrames = masked.times.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const mags = masked.magnitudes[t];\n if (mags) {\n values[t] = computeFrameAmplitude(mags);\n }\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandAmplitudeEnvelope\",\n times: masked.times,\n values,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n/**\n * Compute onset strength for a frequency band.\n *\n * Uses temporal differences of band-masked magnitudes.\n * Adapted from onset.ts:onsetEnvelopeFromSpectrogram.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band MIR result with onset strength\n */\nexport function bandOnsetStrength(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMirOptions\n): BandMir1DResult {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n // Default onset options\n const useLog = options?.onset?.useLog ?? false;\n const smoothMs = options?.onset?.smoothMs ?? 30;\n const diffMethod = options?.onset?.diffMethod ?? \"rectified\";\n\n // Apply band mask\n const masked = applyBandMaskToSpectrogram(spec, band, {\n edgeSmoothHz: options?.edgeSmoothHz,\n });\n\n const nFrames = masked.times.length;\n const nBins = (masked.fftSize >>> 1) + 1;\n const out = new Float32Array(nFrames);\n\n // First frame has no previous frame\n out[0] = 0;\n\n for (let t = 1; t < nFrames; t++) {\n const cur = masked.magnitudes[t];\n const prev = masked.magnitudes[t - 1];\n\n if (!cur || !prev) {\n out[t] = 0;\n continue;\n }\n\n let sum = 0;\n let binsWithData = 0;\n\n for (let k = 0; k < nBins; k++) {\n let a = cur[k] ?? 0;\n let b = prev[k] ?? 0;\n\n // Only count bins that have some energy\n if (a > 0 || b > 0) {\n binsWithData++;\n\n if (useLog) {\n a = logCompress(a);\n b = logCompress(b);\n }\n\n const d = a - b;\n sum += diffMethod === \"abs\" ? Math.abs(d) : Math.max(0, d);\n }\n }\n\n // Normalize by number of active bins to avoid scale depending on band width\n out[t] = binsWithData > 0 ? sum / binsWithData : 0;\n }\n\n // Apply smoothing if requested\n const smoothMs_ = smoothMs;\n if (smoothMs_ > 0 && nFrames >= 2) {\n const dt = (masked.times[1] ?? 0) - (masked.times[0] ?? 0);\n const windowFrames = Math.max(1, Math.round((smoothMs_ / 1000) / Math.max(1e-9, dt)));\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandOnsetStrength\",\n times: masked.times,\n values: movingAverage(out, windowFrames | 1),\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandOnsetStrength\",\n times: masked.times,\n values: out,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n/**\n * Compute spectral flux for a frequency band.\n *\n * Uses L1 distance between consecutive normalized band-masked spectra.\n * Adapted from spectral.ts:spectralFlux.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band MIR result with spectral flux\n */\nexport function bandSpectralFlux(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMirOptions\n): BandMir1DResult {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n // Apply band mask\n const masked = applyBandMaskToSpectrogram(spec, band, {\n edgeSmoothHz: options?.edgeSmoothHz,\n });\n\n const nFrames = masked.times.length;\n const nBins = (masked.fftSize >>> 1) + 1;\n const out = new Float32Array(nFrames);\n\n let prev: Float32Array | null = null;\n\n for (let t = 0; t < nFrames; t++) {\n const mags = masked.magnitudes[t];\n\n if (!mags) {\n out[t] = 0;\n prev = null;\n continue;\n }\n\n // Normalize to reduce sensitivity to overall level\n let sum = 0;\n for (let k = 0; k < nBins; k++) sum += mags[k] ?? 0;\n\n if (sum <= 0) {\n out[t] = 0;\n prev = null;\n continue;\n }\n\n const cur = new Float32Array(nBins);\n const inv = 1 / sum;\n for (let k = 0; k < nBins; k++) cur[k] = (mags[k] ?? 0) * inv;\n\n if (!prev) {\n out[t] = 0;\n prev = cur;\n continue;\n }\n\n let flux = 0;\n for (let k = 0; k < nBins; k++) {\n const d = (cur[k] ?? 0) - (prev[k] ?? 0);\n flux += Math.abs(d);\n }\n\n out[t] = flux;\n prev = cur;\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandSpectralFlux\",\n times: masked.times,\n values: out,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n// ----------------------------\n// Batch Runner\n// ----------------------------\n\nexport type BandMirBatchRequest = {\n bands: FrequencyBand[];\n functions: BandMirFunctionId[];\n /** Maximum number of bands to process concurrently. Default: 4 */\n maxConcurrent?: number;\n};\n\nexport type BandMirBatchResult = {\n /** Results keyed by bandId, each containing results for requested functions */\n results: Map<string, BandMir1DResult[]>;\n /** Total computation time in ms */\n totalTimingMs: number;\n};\n\n/**\n * Run band MIR analysis for multiple bands.\n *\n * Processes bands sequentially (web workers don't have real parallelism\n * within a single thread). The maxConcurrent option is reserved for\n * future multi-worker support.\n *\n * @param spec - Source spectrogram\n * @param request - Batch request specifying bands and functions\n * @param options - Computation options\n * @returns Map of results by band ID\n */\nexport async function runBandMirBatch(\n spec: Spectrogram,\n request: BandMirBatchRequest,\n options?: BandMirOptions\n): Promise<BandMirBatchResult> {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n const results = new Map<string, BandMir1DResult[]>();\n\n for (const band of request.bands) {\n if (options?.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n if (!band.enabled) continue;\n\n const bandResults: BandMir1DResult[] = [];\n\n for (const fn of request.functions) {\n if (options?.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n let result: BandMir1DResult;\n\n switch (fn) {\n case \"bandAmplitudeEnvelope\":\n result = bandAmplitudeEnvelope(spec, band, options);\n break;\n case \"bandOnsetStrength\":\n result = bandOnsetStrength(spec, band, options);\n break;\n case \"bandSpectralFlux\":\n result = bandSpectralFlux(spec, band, options);\n break;\n default:\n // Exhaustive check\n const _exhaustive: never = fn;\n throw new Error(`Unknown band MIR function: ${_exhaustive}`);\n }\n\n bandResults.push(result);\n }\n\n results.set(band.id, bandResults);\n }\n\n const endMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n return {\n results,\n totalTimingMs: endMs - startMs,\n };\n}\n\n/**\n * Get a human-readable label for a band MIR function.\n *\n * @param fn - Band MIR function ID\n * @returns Human-readable label\n */\nexport function getBandMirFunctionLabel(fn: BandMirFunctionId): string {\n switch (fn) {\n case \"bandAmplitudeEnvelope\":\n return \"Amplitude Envelope\";\n case \"bandOnsetStrength\":\n return \"Onset Strength\";\n case \"bandSpectralFlux\":\n return \"Spectral Flux\";\n default:\n return fn;\n }\n}\n","/**\n * Band Proposal Generation for F5.\n *\n * Generates automated suggestions for \"interesting\" frequency bands.\n * Proposals are advisory only - they must be explicitly promoted by the user.\n *\n * Algorithm overview:\n * 1. Analyze spectral structure using CQT\n * 2. Identify regions with concentrated energy or distinct activity\n * 3. Score and rank candidates\n * 4. Generate proposal objects with explanations\n */\n\nimport type {\n BandProposal,\n BandProposalConfig,\n BandProposalResult,\n BandProposalSource,\n CqtSpectrogram,\n FrequencyBand,\n FrequencyBandProvenance,\n MirRunMeta,\n} from \"../types\";\nimport { type AudioBufferLike, type Spectrogram, spectrogram } from \"./spectrogram\";\nimport { cqtSpectrogram, cqtBinToHz, withCqtDefaults, getNumBins } from \"./cqt\";\nimport { harmonicEnergy, bassPitchMotion, tonalStability } from \"./cqtSignals\";\n\n// ----------------------------\n// Configuration Defaults\n// ----------------------------\n\nconst PROPOSAL_DEFAULTS: Required<BandProposalConfig> = {\n maxProposals: 8,\n minSalience: 0.3,\n minSeparationOctaves: 0.5,\n analysisWindow: 0, // 0 = full track\n};\n\n// ----------------------------\n// Types\n// ----------------------------\n\ntype SpectralPeak = {\n binIndex: number;\n centerHz: number;\n magnitude: number;\n bandwidth: number; // in octaves\n lowHz: number;\n highHz: number;\n};\n\ntype ProposalCandidate = {\n peak: SpectralPeak;\n salience: number;\n source: BandProposalSource;\n reason: string;\n};\n\n// ----------------------------\n// Utility Functions\n// ----------------------------\n\n/**\n * Generate a unique proposal ID.\n */\nfunction generateProposalId(): string {\n return `proposal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Generate a band ID for the proposed band.\n */\nfunction generateBandId(): string {\n return `band-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Compute time-averaged magnitude spectrum from CQT.\n */\nfunction computeAverageCqtSpectrum(cqt: CqtSpectrogram): Float32Array {\n const nBins = cqt.magnitudes[0]?.length ?? 0;\n const nFrames = cqt.magnitudes.length;\n const average = new Float32Array(nBins);\n\n for (let frame = 0; frame < nFrames; frame++) {\n const frameMags = cqt.magnitudes[frame];\n if (!frameMags) continue;\n\n for (let bin = 0; bin < nBins; bin++) {\n average[bin] = (average[bin] ?? 0) + (frameMags[bin] ?? 0);\n }\n }\n\n for (let bin = 0; bin < nBins; bin++) {\n average[bin] = (average[bin] ?? 0) / nFrames;\n }\n\n return average;\n}\n\n/**\n * Find local maxima in a 1D array.\n */\nfunction findLocalMaxima(\n values: Float32Array,\n minNeighborDistance: number = 3\n): number[] {\n const peaks: number[] = [];\n\n for (let i = minNeighborDistance; i < values.length - minNeighborDistance; i++) {\n let isPeak = true;\n const centerVal = values[i] ?? 0;\n\n for (let j = -minNeighborDistance; j <= minNeighborDistance; j++) {\n if (j === 0) continue;\n if ((values[i + j] ?? 0) >= centerVal) {\n isPeak = false;\n break;\n }\n }\n\n if (isPeak && centerVal > 0) {\n peaks.push(i);\n }\n }\n\n return peaks;\n}\n\n/**\n * Compute the bandwidth (in bins) at -3dB around a peak.\n */\nfunction computeBandwidth(\n values: Float32Array,\n peakBin: number,\n cqt: CqtSpectrogram\n): { lowBin: number; highBin: number; lowHz: number; highHz: number; bandwidthOctaves: number } {\n const peakMag = values[peakBin] ?? 0;\n const threshold = peakMag * 0.707; // -3dB\n\n // Find lower edge\n let lowBin = peakBin;\n while (lowBin > 0 && (values[lowBin - 1] ?? 0) >= threshold) {\n lowBin--;\n }\n\n // Find upper edge\n let highBin = peakBin;\n while (highBin < values.length - 1 && (values[highBin + 1] ?? 0) >= threshold) {\n highBin++;\n }\n\n const lowHz = cqtBinToHz(lowBin, cqt.config);\n const highHz = cqtBinToHz(highBin, cqt.config);\n const bandwidthOctaves = Math.log2(highHz / lowHz);\n\n return { lowBin, highBin, lowHz, highHz, bandwidthOctaves };\n}\n\n/**\n * Compute temporal variance of energy in a frequency band.\n * Low variance = consistent energy; high variance = transient or intermittent.\n */\nfunction computeTemporalVariance(\n cqt: CqtSpectrogram,\n lowBin: number,\n highBin: number\n): number {\n const nFrames = cqt.magnitudes.length;\n const bandEnergies = new Float32Array(nFrames);\n\n // Compute energy in band for each frame\n for (let frame = 0; frame < nFrames; frame++) {\n const frameMags = cqt.magnitudes[frame];\n if (!frameMags) continue;\n\n let energy = 0;\n for (let bin = lowBin; bin <= highBin; bin++) {\n const mag = frameMags[bin] ?? 0;\n energy += mag * mag;\n }\n bandEnergies[frame] = energy;\n }\n\n // Compute variance\n let sum = 0;\n for (let i = 0; i < nFrames; i++) {\n sum += bandEnergies[i] ?? 0;\n }\n const mean = sum / nFrames;\n\n let variance = 0;\n for (let i = 0; i < nFrames; i++) {\n const diff = (bandEnergies[i] ?? 0) - mean;\n variance += diff * diff;\n }\n variance /= nFrames;\n\n // Normalize by mean squared to get coefficient of variation squared\n return mean > 0 ? variance / (mean * mean) : 0;\n}\n\n// ----------------------------\n// Peak Detection and Scoring\n// ----------------------------\n\n/**\n * Detect spectral peaks from the average CQT spectrum.\n */\nfunction detectSpectralPeaks(\n cqt: CqtSpectrogram,\n config: Required<BandProposalConfig>\n): SpectralPeak[] {\n const avgSpectrum = computeAverageCqtSpectrum(cqt);\n\n // Minimum distance in bins based on separation requirement\n const minBinDistance = Math.ceil(config.minSeparationOctaves * cqt.binsPerOctave);\n\n const peakIndices = findLocalMaxima(avgSpectrum, Math.max(3, minBinDistance / 2));\n\n const peaks: SpectralPeak[] = [];\n\n for (const binIndex of peakIndices) {\n const bw = computeBandwidth(avgSpectrum, binIndex, cqt);\n\n peaks.push({\n binIndex,\n centerHz: cqtBinToHz(binIndex, cqt.config),\n magnitude: avgSpectrum[binIndex] ?? 0,\n bandwidth: bw.bandwidthOctaves,\n lowHz: bw.lowHz,\n highHz: bw.highHz,\n });\n }\n\n // Sort by magnitude (descending)\n peaks.sort((a, b) => b.magnitude - a.magnitude);\n\n return peaks;\n}\n\n/**\n * Score a spectral peak for proposal salience.\n */\nfunction scorePeak(\n peak: SpectralPeak,\n cqt: CqtSpectrogram,\n avgSpectrum: Float32Array,\n cqtSignals: {\n harmonicEnergy: Float32Array;\n bassPitchMotion: Float32Array;\n tonalStability: Float32Array;\n }\n): ProposalCandidate {\n // Find bin range for this peak\n const lowBin = Math.max(0, Math.floor(peak.lowHz / (cqt.config.fMin * Math.pow(2, 1 / cqt.binsPerOctave))));\n const highBin = Math.min(\n getNumBins(cqt.config) - 1,\n Math.ceil(peak.highHz / (cqt.config.fMin * Math.pow(2, 1 / cqt.binsPerOctave)))\n );\n\n // Compute various scores\n const temporalVariance = computeTemporalVariance(cqt, lowBin, highBin);\n\n // Energy concentration: how much energy is in this band vs total\n let bandEnergy = 0;\n let totalEnergy = 0;\n for (let bin = 0; bin < avgSpectrum.length; bin++) {\n const mag = avgSpectrum[bin] ?? 0;\n totalEnergy += mag * mag;\n if (bin >= lowBin && bin <= highBin) {\n bandEnergy += mag * mag;\n }\n }\n const energyConcentration = totalEnergy > 0 ? bandEnergy / totalEnergy : 0;\n\n // Get average CQT signal values for this frequency range\n // Map frequency to frame indices (not perfect, but approximate)\n const isBassRange = peak.centerHz < 300;\n const isLowMidRange = peak.centerHz >= 300 && peak.centerHz < 1000;\n\n // Compute average signal values\n let avgHarmonicEnergy = 0;\n let avgBassPitchMotion = 0;\n let avgTonalStability = 0;\n const nFrames = cqtSignals.harmonicEnergy.length;\n\n for (let i = 0; i < nFrames; i++) {\n avgHarmonicEnergy += cqtSignals.harmonicEnergy[i] ?? 0;\n avgBassPitchMotion += cqtSignals.bassPitchMotion[i] ?? 0;\n avgTonalStability += cqtSignals.tonalStability[i] ?? 0;\n }\n avgHarmonicEnergy /= nFrames;\n avgBassPitchMotion /= nFrames;\n avgTonalStability /= nFrames;\n\n // Determine source and compute salience based on characteristics\n let source: BandProposalSource;\n let reason: string;\n let salience: number;\n\n if (isBassRange && avgBassPitchMotion > 0.4) {\n source = \"cqt_bass_motion\";\n reason = \"Significant bass pitch motion detected\";\n salience = 0.3 + energyConcentration * 0.3 + avgBassPitchMotion * 0.4;\n } else if (avgHarmonicEnergy > 0.5 && avgTonalStability > 0.5) {\n source = \"cqt_harmonic\";\n reason = \"Strong harmonic structure with stable tonality\";\n salience = 0.3 + avgHarmonicEnergy * 0.35 + avgTonalStability * 0.35;\n } else if (temporalVariance > 0.5) {\n source = \"onset_band\";\n reason = \"Distinct transient activity pattern\";\n salience = 0.3 + energyConcentration * 0.3 + Math.min(1, temporalVariance) * 0.4;\n } else if (energyConcentration > 0.1) {\n source = \"energy_cluster\";\n reason = \"Concentrated spectral energy\";\n salience = 0.2 + energyConcentration * 0.5 + (1 - Math.min(1, peak.bandwidth)) * 0.3;\n } else {\n source = \"spectral_peak\";\n reason = \"Persistent spectral peak\";\n salience = 0.2 + energyConcentration * 0.4 + (1 - Math.min(1, peak.bandwidth * 2)) * 0.4;\n }\n\n // Add frequency-specific context to reason\n if (isBassRange) {\n reason += \" (bass region)\";\n } else if (isLowMidRange) {\n reason += \" (low-mid region)\";\n } else if (peak.centerHz > 4000) {\n reason += \" (high frequency region)\";\n }\n\n return {\n peak,\n salience: Math.min(1, Math.max(0, salience)),\n source,\n reason,\n };\n}\n\n// ----------------------------\n// Proposal Generation\n// ----------------------------\n\n/**\n * Create a FrequencyBand from a proposal candidate.\n */\nfunction createBandFromCandidate(\n candidate: ProposalCandidate,\n duration: number\n): FrequencyBand {\n const now = new Date().toISOString();\n const provenance: FrequencyBandProvenance = {\n source: \"manual\", // Will be treated as imported when promoted\n createdAt: now,\n };\n\n return {\n id: generateBandId(),\n label: `Region ${Math.round(candidate.peak.centerHz)} Hz`,\n enabled: true,\n timeScope: { kind: \"global\" },\n frequencyShape: [\n {\n startTime: 0,\n endTime: duration,\n lowHzStart: candidate.peak.lowHz,\n highHzStart: candidate.peak.highHz,\n lowHzEnd: candidate.peak.lowHz,\n highHzEnd: candidate.peak.highHz,\n },\n ],\n sortOrder: 0,\n provenance,\n };\n}\n\n/**\n * Filter candidates to remove overlapping proposals.\n * Keeps the highest-salience candidate when overlap exceeds threshold.\n */\nfunction filterOverlappingCandidates(\n candidates: ProposalCandidate[],\n minSeparationOctaves: number\n): ProposalCandidate[] {\n const filtered: ProposalCandidate[] = [];\n\n for (const candidate of candidates) {\n let hasOverlap = false;\n\n for (const existing of filtered) {\n const octaveDiff = Math.abs(\n Math.log2(candidate.peak.centerHz / existing.peak.centerHz)\n );\n\n if (octaveDiff < minSeparationOctaves) {\n hasOverlap = true;\n break;\n }\n }\n\n if (!hasOverlap) {\n filtered.push(candidate);\n }\n }\n\n return filtered;\n}\n\n// ----------------------------\n// Main Export\n// ----------------------------\n\nexport type BandProposalOptions = {\n config?: BandProposalConfig;\n isCancelled?: () => boolean;\n};\n\n/**\n * Generate band proposals from audio.\n *\n * @param audio - Audio buffer to analyze\n * @param duration - Track duration in seconds\n * @param options - Optional configuration\n * @returns Array of band proposals with salience scores and reasons\n */\nexport async function generateBandProposals(\n audio: AudioBufferLike,\n duration: number,\n options: BandProposalOptions = {}\n): Promise<BandProposalResult> {\n const startTime = performance.now();\n\n const config: Required<BandProposalConfig> = {\n ...PROPOSAL_DEFAULTS,\n ...options.config,\n };\n\n // Compute CQT\n const cqtConfig = withCqtDefaults({\n binsPerOctave: 24,\n fMin: 32.7,\n fMax: Math.min(8372, audio.sampleRate / 2), // Cap at Nyquist\n });\n\n const cqt = await cqtSpectrogram(audio, cqtConfig, {\n isCancelled: options.isCancelled,\n });\n\n if (options.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n // Compute CQT-derived signals\n const harmonicResult = harmonicEnergy(cqt);\n const bassMotionResult = bassPitchMotion(cqt);\n const tonalResult = tonalStability(cqt);\n\n const cqtSignals = {\n harmonicEnergy: harmonicResult.values,\n bassPitchMotion: bassMotionResult.values,\n tonalStability: tonalResult.values,\n };\n\n // Detect spectral peaks\n const peaks = detectSpectralPeaks(cqt, config);\n\n // Score each peak\n const avgSpectrum = computeAverageCqtSpectrum(cqt);\n const candidates: ProposalCandidate[] = [];\n\n for (const peak of peaks) {\n if (options.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n const candidate = scorePeak(peak, cqt, avgSpectrum, cqtSignals);\n\n if (candidate.salience >= config.minSalience) {\n candidates.push(candidate);\n }\n }\n\n // Sort by salience (descending)\n candidates.sort((a, b) => b.salience - a.salience);\n\n // Filter overlapping candidates\n const filtered = filterOverlappingCandidates(candidates, config.minSeparationOctaves);\n\n // Limit to maxProposals\n const finalCandidates = filtered.slice(0, config.maxProposals);\n\n // Create proposals\n const proposals: BandProposal[] = finalCandidates.map((candidate, index) => {\n const band = createBandFromCandidate(candidate, duration);\n band.sortOrder = index;\n\n return {\n id: generateProposalId(),\n band,\n salience: candidate.salience,\n reason: candidate.reason,\n source: candidate.source,\n generatedAt: new Date().toISOString(),\n };\n });\n\n const endTime = performance.now();\n\n const meta: MirRunMeta = {\n backend: \"cpu\",\n usedGpu: false,\n timings: {\n totalMs: endTime - startTime,\n cpuMs: endTime - startTime,\n },\n };\n\n return {\n kind: \"bandProposals\",\n proposals,\n meta,\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 BeatCandidate,\n BeatCandidateSource,\n BeatCandidatesResult,\n TempoHypothesis,\n TempoHypothesisEvidence,\n TempoHypothesesResult,\n BeatGrid,\n PhaseHypothesis,\n PhaseAlignmentConfig,\n // Musical Time (B4)\n MusicalTimeProvenance,\n MusicalTimeSegment,\n MusicalTimeStructure,\n BeatPosition,\n // Frequency Bands (F1)\n FrequencyBandTimeScope,\n FrequencySegment,\n FrequencyBandProvenance,\n FrequencyBand,\n FrequencyBandStructure,\n FrequencyBoundsAtTime,\n // Frequency Bands (F2)\n FrequencyKeyframe,\n // Band-Scoped MIR (F3)\n BandMirFunctionId,\n BandMirDiagnostics,\n BandMir1DResult,\n // CQT (F5)\n CqtConfig,\n CqtSpectrogram,\n CqtSignalId,\n CqtSignalResult,\n // Band Proposals (F5)\n BandProposalSource,\n BandProposal,\n BandProposalConfig,\n BandProposalResult,\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// Beat Candidates\n// ----------------------------\n\nexport type { BeatCandidatesOptions, BeatCandidatesOutput, BeatSalienceSignal } from \"./dsp/beatCandidates\";\nexport { detectBeatCandidates, beatSalienceFromMel } from \"./dsp/beatCandidates\";\n\n// ----------------------------\n// Tempo Hypotheses\n// ----------------------------\n\nexport type { TempoHypothesesOptions, TempoHypothesesOutput } from \"./dsp/tempoHypotheses\";\nexport { generateTempoHypotheses } from \"./dsp/tempoHypotheses\";\n\n// ----------------------------\n// Phase Alignment (Beat Grid)\n// ----------------------------\n\nexport { computePhaseHypotheses, generateBeatTimes } from \"./dsp/phaseAlignment\";\n\n// ----------------------------\n// Musical Time (B4)\n// ----------------------------\n\nexport {\n findSegmentAtTime,\n computeBeatPosition,\n computeBeatPositionFromStructure,\n generateSegmentId,\n createSegmentFromGrid,\n createMusicalTimeStructure,\n validateSegments,\n sortSegments,\n splitSegment,\n generateSegmentBeatTimes,\n} from \"./dsp/musicalTime\";\n\n// ----------------------------\n// Frequency Bands (F1)\n// ----------------------------\n\nexport {\n // ID generation\n generateBandId,\n // Validation\n validateFrequencySegments,\n validateFrequencyBand,\n validateBandStructure,\n // Creation\n createBandStructure,\n createConstantBand,\n createSectionedBand,\n createStandardBands,\n // Queries\n bandsActiveAt,\n frequencyBoundsAt,\n allFrequencyBoundsAt,\n findBandById,\n // Sorting\n sortBands,\n sortFrequencySegments,\n // Modification\n touchStructure,\n addBandToStructure,\n removeBandFromStructure,\n updateBandInStructure,\n // Keyframe Helpers (F2)\n keyframesFromBand,\n segmentsFromKeyframes,\n splitBandSegmentAt,\n mergeAdjacentSegments,\n removeKeyframe,\n updateKeyframe,\n moveKeyframeTime,\n} from \"./dsp/frequencyBand\";\n\n// ----------------------------\n// Band-Scoped MIR (F3)\n// ----------------------------\n\nexport type { BandMaskOptions, MaskedSpectrogram } from \"./dsp/bandMask\";\nexport {\n binToHz,\n hzToBin,\n computeBandMaskAtTime,\n applyBandMaskToSpectrogram,\n computeFrameEnergy,\n computeFrameAmplitude,\n} from \"./dsp/bandMask\";\n\nexport type { BandMirOptions, BandMirBatchRequest, BandMirBatchResult } from \"./dsp/bandMir\";\nexport {\n bandAmplitudeEnvelope,\n bandOnsetStrength,\n bandSpectralFlux,\n runBandMirBatch,\n getBandMirFunctionLabel,\n} from \"./dsp/bandMir\";\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, MelConversionConfig } from \"./dsp/mel\";\nexport { melSpectrogram, hzToMel, melToHz, hzToFeatureIndex, featureIndexToHz } from \"./dsp/mel\";\n\n// ----------------------------\n// CQT (F5)\n// ----------------------------\n\nexport type { CqtOptions } from \"./dsp/cqt\";\nexport {\n cqtSpectrogram,\n computeCqt,\n cqtBinToHz,\n hzToCqtBin,\n getNumOctaves,\n getNumBins,\n getCqtBinFrequencies,\n withCqtDefaults,\n CQT_DEFAULTS,\n} from \"./dsp/cqt\";\n\nexport {\n harmonicEnergy,\n bassPitchMotion,\n tonalStability,\n computeCqtSignal,\n computeAllCqtSignals,\n} from \"./dsp/cqtSignals\";\n\n// ----------------------------\n// Band Proposals (F5)\n// ----------------------------\n\nexport type { BandProposalOptions } from \"./dsp/bandProposal\";\nexport { generateBandProposals } from \"./dsp/bandProposal\";\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/gpu/context.ts","../src/dsp/phaseAlignment.ts","../src/dsp/musicalTime.ts","../src/dsp/frequencyBand.ts","../src/dsp/bandMask.ts","../src/dsp/bandMir.ts","../src/dsp/bandProposal.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":["seg","generateBandId","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","/**\n * Phase alignment algorithm for beat grid generation.\n *\n * Given a BPM and beat candidates, this module computes optimal phase offsets\n * that align the beat grid with detected beat candidates.\n *\n * The algorithm is deterministic: same inputs always produce same outputs.\n */\n\nimport type { BeatCandidate, PhaseHypothesis, PhaseAlignmentConfig } from \"../types\";\n\nconst DEFAULT_CONFIG: Required<PhaseAlignmentConfig> = {\n phaseResolution: 16,\n matchTolerance: 0.05, // 50ms\n topK: 3,\n offsetPenaltyWeight: 0.2,\n};\n\n/**\n * Compute phase hypotheses for a given BPM against beat candidates.\n *\n * Algorithm:\n * 1. Compute beat period = 60 / bpm\n * 2. Generate N phase offsets spanning [0, period) at resolution = period/N\n * 3. For each phase offset:\n * a. For each beat candidate, find closest grid line\n * b. If within tolerance, add weighted score based on candidate strength\n * c. Track systematic offset error for penalty\n * 4. Normalize scores and apply offset penalty\n * 5. Return top K phases sorted by score\n *\n * @param bpm - Tempo in beats per minute\n * @param candidates - Beat candidate events with time and strength\n * @param audioDuration - Total audio duration in seconds\n * @param config - Optional configuration overrides\n * @returns Array of top K phase hypotheses, sorted by score descending\n */\nexport function computePhaseHypotheses(\n bpm: number,\n candidates: BeatCandidate[],\n audioDuration: number,\n config?: PhaseAlignmentConfig\n): PhaseHypothesis[] {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const period = 60 / bpm;\n\n if (candidates.length === 0 || audioDuration <= 0 || bpm <= 0) {\n return [];\n }\n\n const phases: PhaseHypothesis[] = [];\n\n // Generate and score phase candidates\n for (let i = 0; i < cfg.phaseResolution; i++) {\n const phaseOffset = (i / cfg.phaseResolution) * period;\n const result = scorePhase(phaseOffset, period, candidates, audioDuration, cfg.matchTolerance);\n phases.push({\n index: i,\n phaseOffset,\n score: result.score,\n matchCount: result.matchCount,\n avgOffsetError: result.avgOffsetError,\n });\n }\n\n // Normalize scores to [0, 1] and apply offset penalty\n const maxScore = Math.max(...phases.map((p) => p.score), 1e-9);\n for (const phase of phases) {\n // Penalty based on systematic offset (how far off-center matches are)\n const penalty = (phase.avgOffsetError / cfg.matchTolerance) * cfg.offsetPenaltyWeight;\n phase.score = (phase.score / maxScore) * (1 - Math.min(1, penalty));\n }\n\n // Sort by score descending and take top K\n phases.sort((a, b) => b.score - a.score);\n return phases.slice(0, cfg.topK);\n}\n\n/**\n * Score a single phase offset against beat candidates.\n */\nfunction scorePhase(\n phaseOffset: number,\n period: number,\n candidates: BeatCandidate[],\n audioDuration: number,\n tolerance: number\n): { score: number; matchCount: number; avgOffsetError: number } {\n let score = 0;\n let matchCount = 0;\n let totalOffsetError = 0;\n\n for (const candidate of candidates) {\n // Find the closest grid beat to this candidate\n const beatsFromStart = (candidate.time - phaseOffset) / period;\n const nearestBeatIndex = Math.round(beatsFromStart);\n const nearestBeatTime = phaseOffset + nearestBeatIndex * period;\n\n // Skip if the nearest beat is outside the audio range\n if (nearestBeatTime < 0 || nearestBeatTime > audioDuration) continue;\n\n const offset = Math.abs(candidate.time - nearestBeatTime);\n\n if (offset <= tolerance) {\n // Gaussian-like weighting: closer matches score higher\n const weight = Math.exp((-offset * offset) / (2 * tolerance * tolerance));\n score += candidate.strength * weight;\n matchCount++;\n totalOffsetError += offset;\n }\n }\n\n const avgOffsetError = matchCount > 0 ? totalOffsetError / matchCount : 0;\n\n return { score, matchCount, avgOffsetError };\n}\n\n/**\n * Generate beat times for a given grid within the audio duration.\n *\n * @param bpm - Tempo in beats per minute\n * @param phaseOffset - Base phase offset in seconds\n * @param userNudge - User adjustment in seconds (additive)\n * @param audioDuration - Total audio duration in seconds\n * @returns Array of beat times in seconds\n */\nexport function generateBeatTimes(\n bpm: number,\n phaseOffset: number,\n userNudge: number,\n audioDuration: number\n): number[] {\n if (bpm <= 0 || audioDuration <= 0) {\n return [];\n }\n\n const period = 60 / bpm;\n const effectivePhase = phaseOffset + userNudge;\n const beats: number[] = [];\n\n // Find the first beat at or after time 0\n const firstBeatIndex = Math.ceil(-effectivePhase / period);\n let time = effectivePhase + firstBeatIndex * period;\n\n while (time <= audioDuration) {\n if (time >= 0) {\n beats.push(time);\n }\n time += period;\n }\n\n return beats;\n}\n","/**\n * Musical Time utilities for B4.\n *\n * These functions compute derived values from musical time structures.\n * All computations are deterministic and pure.\n */\n\nimport type { BeatPosition, MusicalTimeSegment, MusicalTimeStructure, BeatGrid } from \"../types\";\n\n/**\n * Find the segment containing a given time.\n * Segments are non-overlapping, so at most one segment contains any time.\n *\n * @param time - Time in seconds from track start\n * @param segments - Ordered list of segments (by startTime ascending)\n * @returns The containing segment, or null if time is outside all segments\n */\nexport function findSegmentAtTime(\n time: number,\n segments: MusicalTimeSegment[]\n): MusicalTimeSegment | null {\n // Binary search would be more efficient for many segments,\n // but linear scan is fine for typical track segment counts (<10)\n for (const segment of segments) {\n if (time >= segment.startTime && time < segment.endTime) {\n return segment;\n }\n }\n return null;\n}\n\n/**\n * Compute the beat position at a given time.\n *\n * Beat position formula:\n * period = 60 / bpm\n * beatsFromStart = (time - phaseOffset) / period\n * beatIndex = floor(beatsFromStart)\n * beatPhase = beatsFromStart - beatIndex (fractional part, 0-1)\n * beatPosition = beatsFromStart (continuous)\n *\n * @param time - Time in seconds from track start\n * @param segments - Ordered list of segments (by startTime ascending)\n * @returns BeatPosition if time is within a segment, null otherwise\n */\nexport function computeBeatPosition(\n time: number,\n segments: MusicalTimeSegment[]\n): BeatPosition | null {\n const segment = findSegmentAtTime(time, segments);\n if (!segment) {\n return null;\n }\n\n const period = 60 / segment.bpm;\n const beatsFromStart = (time - segment.phaseOffset) / period;\n\n // Handle edge case: time before first beat in segment\n // beatIndex should never be negative within a properly defined segment\n const beatIndex = Math.floor(beatsFromStart);\n const beatPhase = beatsFromStart - beatIndex;\n\n return {\n segmentId: segment.id,\n beatIndex,\n beatPhase,\n beatPosition: beatsFromStart,\n bpm: segment.bpm,\n };\n}\n\n/**\n * Compute beat position from a MusicalTimeStructure.\n * Convenience wrapper for computeBeatPosition.\n */\nexport function computeBeatPositionFromStructure(\n time: number,\n structure: MusicalTimeStructure | null\n): BeatPosition | null {\n if (!structure || structure.segments.length === 0) {\n return null;\n }\n return computeBeatPosition(time, structure.segments);\n}\n\n/**\n * Generate a unique segment ID.\n */\nexport function generateSegmentId(): string {\n return `seg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Create a new MusicalTimeSegment from a BeatGrid.\n *\n * @param grid - The beat grid to promote\n * @param startTime - Segment start boundary in seconds\n * @param endTime - Segment end boundary in seconds\n * @returns A new MusicalTimeSegment\n */\nexport function createSegmentFromGrid(\n grid: BeatGrid,\n startTime: number,\n endTime: number\n): MusicalTimeSegment {\n const effectivePhaseOffset = grid.phaseOffset + grid.userNudge;\n\n return {\n id: generateSegmentId(),\n bpm: grid.bpm,\n phaseOffset: effectivePhaseOffset,\n startTime,\n endTime,\n confidence: grid.confidence,\n provenance: {\n source: \"promoted_from_hypothesis\",\n sourceHypothesisId: grid.sourceHypothesisId,\n promotedAt: new Date().toISOString(),\n userNudge: grid.userNudge,\n },\n };\n}\n\n/**\n * Create a new empty MusicalTimeStructure.\n */\nexport function createMusicalTimeStructure(): MusicalTimeStructure {\n const now = new Date().toISOString();\n return {\n version: 1,\n segments: [],\n createdAt: now,\n modifiedAt: now,\n };\n}\n\n/**\n * Validate that segments are non-overlapping and ordered.\n *\n * @param segments - List of segments to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateSegments(segments: MusicalTimeSegment[]): string[] {\n const errors: string[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!seg) continue;\n\n // Check segment bounds\n if (seg.startTime >= seg.endTime) {\n errors.push(`Segment ${seg.id}: startTime (${seg.startTime}) >= endTime (${seg.endTime})`);\n }\n\n if (seg.bpm <= 0) {\n errors.push(`Segment ${seg.id}: bpm (${seg.bpm}) must be positive`);\n }\n\n // Check ordering and non-overlap with next segment\n if (i < segments.length - 1) {\n const next = segments[i + 1];\n if (!next) continue;\n if (seg.startTime >= next.startTime) {\n errors.push(`Segment ${seg.id} not ordered before ${next.id}`);\n }\n if (seg.endTime > next.startTime) {\n errors.push(`Segment ${seg.id} overlaps with ${next.id}`);\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Sort segments by startTime ascending.\n * Returns a new array (does not mutate input).\n */\nexport function sortSegments(segments: MusicalTimeSegment[]): MusicalTimeSegment[] {\n return [...segments].sort((a, b) => a.startTime - b.startTime);\n}\n\n/**\n * Split a segment at a given time.\n *\n * @param segment - The segment to split\n * @param splitTime - Time in seconds where to split\n * @returns Tuple of [beforeSegment, afterSegment]\n * @throws If splitTime is outside segment bounds\n */\nexport function splitSegment(\n segment: MusicalTimeSegment,\n splitTime: number\n): [MusicalTimeSegment, MusicalTimeSegment] {\n if (splitTime <= segment.startTime || splitTime >= segment.endTime) {\n throw new Error(\n `Split time ${splitTime} must be within segment bounds [${segment.startTime}, ${segment.endTime})`\n );\n }\n\n const beforeSegment: MusicalTimeSegment = {\n ...segment,\n id: generateSegmentId(),\n endTime: splitTime,\n };\n\n const afterSegment: MusicalTimeSegment = {\n ...segment,\n id: generateSegmentId(),\n startTime: splitTime,\n // phaseOffset stays the same - beat grid continues seamlessly\n };\n\n return [beforeSegment, afterSegment];\n}\n\n/**\n * Generate beat times within a segment.\n * Used for rendering beat markers.\n *\n * @param segment - The segment to generate beats for\n * @returns Array of beat times in seconds\n */\nexport function generateSegmentBeatTimes(segment: MusicalTimeSegment): number[] {\n const period = 60 / segment.bpm;\n const times: number[] = [];\n\n // Find first beat at or after segment start\n const beatsBeforeStart = Math.ceil((segment.startTime - segment.phaseOffset) / period);\n let time = segment.phaseOffset + beatsBeforeStart * period;\n\n while (time < segment.endTime) {\n if (time >= segment.startTime) {\n times.push(time);\n }\n time += period;\n }\n\n return times;\n}\n","/**\n * Frequency Band utilities for F1.\n *\n * These functions provide validation, creation, and query operations\n * for frequency band structures. All computations are deterministic and pure.\n */\n\nimport type {\n FrequencyBand,\n FrequencyBandStructure,\n FrequencyBandTimeScope,\n FrequencyBandProvenance,\n FrequencyBoundsAtTime,\n FrequencySegment,\n FrequencyKeyframe,\n} from \"../types\";\n\n// ----------------------------\n// ID Generation\n// ----------------------------\n\n/**\n * Generate a unique band ID.\n */\nexport function generateBandId(): string {\n return `band-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ----------------------------\n// Validation\n// ----------------------------\n\n/**\n * Validate frequency segments for a band.\n *\n * Checks:\n * - lowHz < highHz at all segment boundaries\n * - All frequency values are non-negative\n * - startTime < endTime for each segment\n * - Segments don't overlap in time\n * - Segments are ordered by startTime\n *\n * @param segments - Frequency segments to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateFrequencySegments(segments: FrequencySegment[]): string[] {\n const errors: string[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!seg) continue;\n\n // Check frequency invariants at start\n if (seg.lowHzStart < 0 || seg.highHzStart < 0) {\n errors.push(`Segment ${i}: start frequencies must be non-negative`);\n }\n if (seg.lowHzStart >= seg.highHzStart) {\n errors.push(\n `Segment ${i}: lowHzStart (${seg.lowHzStart}) must be < highHzStart (${seg.highHzStart})`\n );\n }\n\n // Check frequency invariants at end\n if (seg.lowHzEnd < 0 || seg.highHzEnd < 0) {\n errors.push(`Segment ${i}: end frequencies must be non-negative`);\n }\n if (seg.lowHzEnd >= seg.highHzEnd) {\n errors.push(\n `Segment ${i}: lowHzEnd (${seg.lowHzEnd}) must be < highHzEnd (${seg.highHzEnd})`\n );\n }\n\n // Check time ordering\n if (seg.startTime >= seg.endTime) {\n errors.push(\n `Segment ${i}: startTime (${seg.startTime}) must be < endTime (${seg.endTime})`\n );\n }\n\n // Check non-overlap with next segment\n if (i < segments.length - 1) {\n const next = segments[i + 1];\n if (!next) continue;\n if (seg.endTime > next.startTime) {\n errors.push(`Segment ${i} overlaps with segment ${i + 1}`);\n }\n if (seg.startTime >= next.startTime) {\n errors.push(`Segment ${i} not ordered before segment ${i + 1}`);\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validate a frequency band.\n *\n * @param band - Frequency band to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateFrequencyBand(band: FrequencyBand): string[] {\n const errors: string[] = [];\n\n if (!band.id || band.id.trim() === \"\") {\n errors.push(\"Band must have a non-empty id\");\n }\n\n if (!band.label || band.label.trim() === \"\") {\n errors.push(\"Band must have a non-empty label\");\n }\n\n if (band.frequencyShape.length === 0) {\n errors.push(`Band \"${band.label}\": must have at least one frequency segment`);\n }\n\n // Validate segments\n const segmentErrors = validateFrequencySegments(band.frequencyShape);\n errors.push(...segmentErrors.map((e) => `Band \"${band.label}\": ${e}`));\n\n // For sectioned bands, validate segments cover the scope\n if (band.timeScope.kind === \"sectioned\" && band.frequencyShape.length > 0) {\n const { startTime, endTime } = band.timeScope;\n const first = band.frequencyShape[0];\n const last = band.frequencyShape[band.frequencyShape.length - 1];\n\n if (first && first.startTime > startTime) {\n errors.push(\n `Band \"${band.label}\": segments don't cover scope start (first segment starts at ${first.startTime}, scope starts at ${startTime})`\n );\n }\n if (last && last.endTime < endTime) {\n errors.push(\n `Band \"${band.label}\": segments don't cover scope end (last segment ends at ${last.endTime}, scope ends at ${endTime})`\n );\n }\n }\n // Note: Global bands skip coverage validation per design decision\n\n return errors;\n}\n\n/**\n * Validate a complete frequency band structure.\n *\n * @param structure - Structure to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateBandStructure(structure: FrequencyBandStructure): string[] {\n const errors: string[] = [];\n\n // Check for duplicate IDs\n const ids = new Set<string>();\n for (const band of structure.bands) {\n if (ids.has(band.id)) {\n errors.push(`Duplicate band ID: ${band.id}`);\n }\n ids.add(band.id);\n }\n\n // Validate each band\n for (const band of structure.bands) {\n errors.push(...validateFrequencyBand(band));\n }\n\n return errors;\n}\n\n// ----------------------------\n// Creation Helpers\n// ----------------------------\n\n/**\n * Create an empty FrequencyBandStructure.\n */\nexport function createBandStructure(): FrequencyBandStructure {\n const now = new Date().toISOString();\n return {\n version: 1,\n bands: [],\n createdAt: now,\n modifiedAt: now,\n };\n}\n\n/**\n * Create a simple constant-frequency band (no time variation).\n *\n * @param label - Human-readable band label\n * @param lowHz - Lower frequency bound in Hz\n * @param highHz - Upper frequency bound in Hz\n * @param duration - Duration in seconds (defines segment end time)\n * @param options - Optional configuration\n * @returns A new FrequencyBand\n */\nexport function createConstantBand(\n label: string,\n lowHz: number,\n highHz: number,\n duration: number,\n options?: {\n enabled?: boolean;\n sortOrder?: number;\n id?: string;\n }\n): FrequencyBand {\n const now = new Date().toISOString();\n return {\n id: options?.id ?? generateBandId(),\n label,\n enabled: options?.enabled ?? true,\n timeScope: { kind: \"global\" },\n frequencyShape: [\n {\n startTime: 0,\n endTime: duration,\n lowHzStart: lowHz,\n highHzStart: highHz,\n lowHzEnd: lowHz,\n highHzEnd: highHz,\n },\n ],\n sortOrder: options?.sortOrder ?? 0,\n provenance: {\n source: \"manual\",\n createdAt: now,\n },\n };\n}\n\n/**\n * Create a sectioned band (applies only to a time range).\n *\n * @param label - Human-readable band label\n * @param lowHz - Lower frequency bound in Hz\n * @param highHz - Upper frequency bound in Hz\n * @param startTime - Section start time in seconds\n * @param endTime - Section end time in seconds\n * @param options - Optional configuration\n * @returns A new FrequencyBand\n */\nexport function createSectionedBand(\n label: string,\n lowHz: number,\n highHz: number,\n startTime: number,\n endTime: number,\n options?: {\n enabled?: boolean;\n sortOrder?: number;\n id?: string;\n }\n): FrequencyBand {\n const now = new Date().toISOString();\n return {\n id: options?.id ?? generateBandId(),\n label,\n enabled: options?.enabled ?? true,\n timeScope: { kind: \"sectioned\", startTime, endTime },\n frequencyShape: [\n {\n startTime,\n endTime,\n lowHzStart: lowHz,\n highHzStart: highHz,\n lowHzEnd: lowHz,\n highHzEnd: highHz,\n },\n ],\n sortOrder: options?.sortOrder ?? 0,\n provenance: {\n source: \"manual\",\n createdAt: now,\n },\n };\n}\n\n/**\n * Create standard frequency bands for a track.\n *\n * Creates a standard 6-band frequency split:\n * - Sub Bass: 20-60 Hz\n * - Bass: 60-250 Hz\n * - Low Mids: 250-500 Hz\n * - Mids: 500-2000 Hz\n * - High Mids: 2000-4000 Hz\n * - Highs: 4000-20000 Hz\n *\n * @param duration - Track duration in seconds\n * @returns Array of FrequencyBand objects\n */\nexport function createStandardBands(duration: number): FrequencyBand[] {\n const now = new Date().toISOString();\n const bands: Array<{ label: string; lowHz: number; highHz: number }> = [\n { label: \"Sub Bass\", lowHz: 20, highHz: 60 },\n { label: \"Bass\", lowHz: 60, highHz: 250 },\n { label: \"Low Mids\", lowHz: 250, highHz: 500 },\n { label: \"Mids\", lowHz: 500, highHz: 2000 },\n { label: \"High Mids\", lowHz: 2000, highHz: 4000 },\n { label: \"Highs\", lowHz: 4000, highHz: 20000 },\n ];\n\n return bands.map((b, index) => ({\n id: generateBandId(),\n label: b.label,\n enabled: true,\n timeScope: { kind: \"global\" } as FrequencyBandTimeScope,\n frequencyShape: [\n {\n startTime: 0,\n endTime: duration,\n lowHzStart: b.lowHz,\n highHzStart: b.highHz,\n lowHzEnd: b.lowHz,\n highHzEnd: b.highHz,\n },\n ],\n sortOrder: index,\n provenance: {\n source: \"preset\" as const,\n createdAt: now,\n presetName: \"Standard 6-Band\",\n },\n }));\n}\n\n// ----------------------------\n// Query Helpers\n// ----------------------------\n\n/**\n * Get all bands active at a given time.\n *\n * A band is active if:\n * - It is enabled\n * - The time falls within its time scope\n *\n * @param structure - Frequency band structure (can be null)\n * @param time - Time in seconds\n * @returns Array of active bands\n */\nexport function bandsActiveAt(\n structure: FrequencyBandStructure | null,\n time: number\n): FrequencyBand[] {\n if (!structure) return [];\n\n return structure.bands.filter((band) => {\n if (!band.enabled) return false;\n if (band.timeScope.kind === \"global\") return true;\n return time >= band.timeScope.startTime && time < band.timeScope.endTime;\n });\n}\n\n/**\n * Get frequency bounds for a band at a given time.\n *\n * Uses linear interpolation within segments.\n *\n * @param band - The frequency band to query\n * @param time - Time in seconds\n * @returns Frequency bounds if band is active and has defined bounds, null otherwise\n */\nexport function frequencyBoundsAt(\n band: FrequencyBand,\n time: number\n): FrequencyBoundsAtTime | null {\n // Check if band is active at this time\n if (!band.enabled) return null;\n\n if (band.timeScope.kind === \"sectioned\") {\n if (time < band.timeScope.startTime || time >= band.timeScope.endTime) {\n return null;\n }\n }\n\n // Find the segment containing this time\n for (const seg of band.frequencyShape) {\n if (time >= seg.startTime && time < seg.endTime) {\n // Linear interpolation\n const t = (time - seg.startTime) / (seg.endTime - seg.startTime);\n return {\n bandId: band.id,\n lowHz: seg.lowHzStart + (seg.lowHzEnd - seg.lowHzStart) * t,\n highHz: seg.highHzStart + (seg.highHzEnd - seg.highHzStart) * t,\n enabled: band.enabled,\n };\n }\n }\n\n // Edge case: time exactly at end of last segment\n const last = band.frequencyShape[band.frequencyShape.length - 1];\n if (last && Math.abs(time - last.endTime) < 0.001) {\n return {\n bandId: band.id,\n lowHz: last.lowHzEnd,\n highHz: last.highHzEnd,\n enabled: band.enabled,\n };\n }\n\n return null;\n}\n\n/**\n * Get all frequency bounds at a given time.\n *\n * Returns bounds for all active bands that have defined frequency at the given time.\n *\n * @param structure - Frequency band structure (can be null)\n * @param time - Time in seconds\n * @returns Array of frequency bounds, sorted by sortOrder\n */\nexport function allFrequencyBoundsAt(\n structure: FrequencyBandStructure | null,\n time: number\n): FrequencyBoundsAtTime[] {\n if (!structure) return [];\n\n const bounds: FrequencyBoundsAtTime[] = [];\n\n for (const band of structure.bands) {\n const b = frequencyBoundsAt(band, time);\n if (b) bounds.push(b);\n }\n\n // Sort by sortOrder\n bounds.sort((a, b) => {\n const bandA = structure.bands.find((band) => band.id === a.bandId);\n const bandB = structure.bands.find((band) => band.id === b.bandId);\n return (bandA?.sortOrder ?? 0) - (bandB?.sortOrder ?? 0);\n });\n\n return bounds;\n}\n\n/**\n * Find a band by its ID.\n *\n * @param structure - Frequency band structure (can be null)\n * @param id - Band ID to find\n * @returns The band if found, null otherwise\n */\nexport function findBandById(\n structure: FrequencyBandStructure | null,\n id: string\n): FrequencyBand | null {\n if (!structure) return null;\n return structure.bands.find((b) => b.id === id) ?? null;\n}\n\n// ----------------------------\n// Sorting Helpers\n// ----------------------------\n\n/**\n * Sort bands by sortOrder.\n * Returns a new array (does not mutate input).\n *\n * @param bands - Bands to sort\n * @returns New array sorted by sortOrder ascending\n */\nexport function sortBands(bands: FrequencyBand[]): FrequencyBand[] {\n return [...bands].sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Sort frequency segments by startTime.\n * Returns a new array (does not mutate input).\n *\n * @param segments - Segments to sort\n * @returns New array sorted by startTime ascending\n */\nexport function sortFrequencySegments(segments: FrequencySegment[]): FrequencySegment[] {\n return [...segments].sort((a, b) => a.startTime - b.startTime);\n}\n\n// ----------------------------\n// Modification Helpers\n// ----------------------------\n\n/**\n * Update the modifiedAt timestamp of a structure.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure to update\n * @returns New structure with updated modifiedAt\n */\nexport function touchStructure(structure: FrequencyBandStructure): FrequencyBandStructure {\n return {\n ...structure,\n modifiedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Add a band to a structure.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure to add to\n * @param band - Band to add\n * @returns New structure with the band added\n */\nexport function addBandToStructure(\n structure: FrequencyBandStructure,\n band: FrequencyBand\n): FrequencyBandStructure {\n return {\n ...structure,\n bands: sortBands([...structure.bands, band]),\n modifiedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Remove a band from a structure by ID.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure to remove from\n * @param bandId - ID of band to remove\n * @returns New structure with the band removed\n */\nexport function removeBandFromStructure(\n structure: FrequencyBandStructure,\n bandId: string\n): FrequencyBandStructure {\n return {\n ...structure,\n bands: structure.bands.filter((b) => b.id !== bandId),\n modifiedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Update a band in a structure.\n * Returns a new structure (does not mutate input).\n *\n * @param structure - Structure containing the band\n * @param bandId - ID of band to update\n * @param updates - Partial band updates to apply\n * @returns New structure with the band updated\n */\nexport function updateBandInStructure(\n structure: FrequencyBandStructure,\n bandId: string,\n updates: Partial<Omit<FrequencyBand, \"id\">>\n): FrequencyBandStructure {\n return {\n ...structure,\n bands: sortBands(\n structure.bands.map((b) => (b.id === bandId ? { ...b, ...updates } : b))\n ),\n modifiedAt: new Date().toISOString(),\n };\n}\n\n// ----------------------------\n// Keyframe Helpers (F2)\n// ----------------------------\n\n/**\n * Extract keyframes from a band's frequency shape.\n *\n * Keyframes are a UI abstraction over the segment model.\n * Each segment has a start keyframe and an end keyframe.\n * Adjacent segments share keyframes at their boundaries.\n *\n * @param band - The frequency band to extract keyframes from\n * @returns Array of keyframes sorted by time\n */\nexport function keyframesFromBand(band: FrequencyBand): FrequencyKeyframe[] {\n const keyframes: FrequencyKeyframe[] = [];\n const segments = sortFrequencySegments(band.frequencyShape);\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!seg) continue;\n\n // Add start keyframe\n keyframes.push({\n time: seg.startTime,\n lowHz: seg.lowHzStart,\n highHz: seg.highHzStart,\n segmentIndex: i,\n edge: \"start\",\n });\n\n // Only add end keyframe if it's not shared with next segment\n const nextSeg = segments[i + 1];\n const isShared = nextSeg && Math.abs(nextSeg.startTime - seg.endTime) < 0.001;\n\n if (!isShared) {\n keyframes.push({\n time: seg.endTime,\n lowHz: seg.lowHzEnd,\n highHz: seg.highHzEnd,\n segmentIndex: i,\n edge: \"end\",\n });\n }\n }\n\n return keyframes;\n}\n\n/**\n * Convert keyframes back to frequency segments.\n *\n * Consecutive keyframes become segment boundaries.\n * This is the inverse of keyframesFromBand.\n *\n * @param keyframes - Array of keyframes (must be sorted by time)\n * @returns Array of frequency segments\n */\nexport function segmentsFromKeyframes(keyframes: FrequencyKeyframe[]): FrequencySegment[] {\n if (keyframes.length < 2) return [];\n\n const sorted = [...keyframes].sort((a, b) => a.time - b.time);\n const segments: FrequencySegment[] = [];\n\n for (let i = 0; i < sorted.length - 1; i++) {\n const curr = sorted[i];\n const next = sorted[i + 1];\n if (!curr || !next) continue;\n\n segments.push({\n startTime: curr.time,\n endTime: next.time,\n lowHzStart: curr.lowHz,\n highHzStart: curr.highHz,\n lowHzEnd: next.lowHz,\n highHzEnd: next.highHz,\n });\n }\n\n return segments;\n}\n\n/**\n * Split a band's segment at a given time, creating a new keyframe.\n *\n * The frequency values at the split point are interpolated from the\n * existing segment. Returns a new band with updated frequencyShape.\n *\n * @param band - The band to split\n * @param time - Time in seconds to split at\n * @returns New band with the split segment, or original band if time is invalid\n */\nexport function splitBandSegmentAt(band: FrequencyBand, time: number): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n // Find the segment containing this time\n const segmentIndex = segments.findIndex(\n (seg) => time > seg.startTime && time < seg.endTime\n );\n\n if (segmentIndex === -1) {\n // Time is not inside any segment\n return band;\n }\n\n const seg = segments[segmentIndex];\n if (!seg) return band;\n\n // Calculate interpolated values at split point\n const t = (time - seg.startTime) / (seg.endTime - seg.startTime);\n const lowHz = seg.lowHzStart + (seg.lowHzEnd - seg.lowHzStart) * t;\n const highHz = seg.highHzStart + (seg.highHzEnd - seg.highHzStart) * t;\n\n // Create two new segments\n const firstHalf: FrequencySegment = {\n startTime: seg.startTime,\n endTime: time,\n lowHzStart: seg.lowHzStart,\n highHzStart: seg.highHzStart,\n lowHzEnd: lowHz,\n highHzEnd: highHz,\n };\n\n const secondHalf: FrequencySegment = {\n startTime: time,\n endTime: seg.endTime,\n lowHzStart: lowHz,\n highHzStart: highHz,\n lowHzEnd: seg.lowHzEnd,\n highHzEnd: seg.highHzEnd,\n };\n\n // Replace the original segment with the two halves\n const newSegments = [\n ...segments.slice(0, segmentIndex),\n firstHalf,\n secondHalf,\n ...segments.slice(segmentIndex + 1),\n ];\n\n return {\n ...band,\n frequencyShape: newSegments,\n };\n}\n\n/**\n * Merge adjacent segments where frequencies match at the boundary.\n *\n * This is useful after deleting a keyframe to clean up redundant segments.\n *\n * @param band - The band to merge segments in\n * @param tolerance - Frequency tolerance for considering values equal (default 0.1 Hz)\n * @returns New band with merged segments\n */\nexport function mergeAdjacentSegments(\n band: FrequencyBand,\n tolerance: number = 0.1\n): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n if (segments.length < 2) return band;\n\n const merged: FrequencySegment[] = [];\n let current = segments[0];\n\n if (!current) return band;\n\n for (let i = 1; i < segments.length; i++) {\n const next = segments[i];\n if (!next) continue;\n\n // Check if segments can be merged\n const timeMatches = Math.abs(current.endTime - next.startTime) < 0.001;\n const lowMatches = Math.abs(current.lowHzEnd - next.lowHzStart) < tolerance;\n const highMatches = Math.abs(current.highHzEnd - next.highHzStart) < tolerance;\n\n if (timeMatches && lowMatches && highMatches) {\n // Merge: extend current to include next\n current = {\n startTime: current.startTime,\n endTime: next.endTime,\n lowHzStart: current.lowHzStart,\n highHzStart: current.highHzStart,\n lowHzEnd: next.lowHzEnd,\n highHzEnd: next.highHzEnd,\n };\n } else {\n // Can't merge: push current and move on\n merged.push(current);\n current = next;\n }\n }\n\n // Don't forget the last segment\n merged.push(current);\n\n return {\n ...band,\n frequencyShape: merged,\n };\n}\n\n/**\n * Remove a keyframe from a band.\n *\n * This merges the two adjacent segments into one.\n * Cannot remove first or last keyframe (would make band invalid).\n *\n * @param band - The band to modify\n * @param time - Time of the keyframe to remove\n * @returns New band with keyframe removed, or original if removal is invalid\n */\nexport function removeKeyframe(band: FrequencyBand, time: number): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n if (segments.length < 2) return band;\n\n // Find the segment that ends at this time and the one that starts at this time\n const endingIndex = segments.findIndex(\n (seg) => Math.abs(seg.endTime - time) < 0.001\n );\n const startingIndex = segments.findIndex(\n (seg) => Math.abs(seg.startTime - time) < 0.001\n );\n\n // Can only remove keyframes at segment boundaries (not first or last)\n if (endingIndex === -1 || startingIndex === -1) return band;\n if (endingIndex !== startingIndex - 1) return band;\n\n const endingSeg = segments[endingIndex];\n const startingSeg = segments[startingIndex];\n\n if (!endingSeg || !startingSeg) return band;\n\n // Merge the two segments\n const merged: FrequencySegment = {\n startTime: endingSeg.startTime,\n endTime: startingSeg.endTime,\n lowHzStart: endingSeg.lowHzStart,\n highHzStart: endingSeg.highHzStart,\n lowHzEnd: startingSeg.lowHzEnd,\n highHzEnd: startingSeg.highHzEnd,\n };\n\n const newSegments = [\n ...segments.slice(0, endingIndex),\n merged,\n ...segments.slice(startingIndex + 1),\n ];\n\n return {\n ...band,\n frequencyShape: newSegments,\n };\n}\n\n/**\n * Update a keyframe's frequency values.\n *\n * This updates the corresponding segment boundary.\n *\n * @param band - The band to modify\n * @param time - Time of the keyframe to update\n * @param lowHz - New lower frequency (or undefined to keep current)\n * @param highHz - New upper frequency (or undefined to keep current)\n * @returns New band with updated keyframe\n */\nexport function updateKeyframe(\n band: FrequencyBand,\n time: number,\n lowHz?: number,\n highHz?: number\n): FrequencyBand {\n const segments = band.frequencyShape.map((seg) => {\n const isStart = Math.abs(seg.startTime - time) < 0.001;\n const isEnd = Math.abs(seg.endTime - time) < 0.001;\n\n if (!isStart && !isEnd) return seg;\n\n const newSeg = { ...seg };\n\n if (isStart) {\n if (lowHz !== undefined) newSeg.lowHzStart = lowHz;\n if (highHz !== undefined) newSeg.highHzStart = highHz;\n }\n\n if (isEnd) {\n if (lowHz !== undefined) newSeg.lowHzEnd = lowHz;\n if (highHz !== undefined) newSeg.highHzEnd = highHz;\n }\n\n return newSeg;\n });\n\n return {\n ...band,\n frequencyShape: segments,\n };\n}\n\n/**\n * Move a keyframe in time.\n *\n * Updates the endTime of the segment before and startTime of the segment after.\n * Cannot move first or last keyframe.\n *\n * @param band - The band to modify\n * @param oldTime - Current time of the keyframe\n * @param newTime - New time for the keyframe\n * @returns New band with moved keyframe, or original if move is invalid\n */\nexport function moveKeyframeTime(\n band: FrequencyBand,\n oldTime: number,\n newTime: number\n): FrequencyBand {\n const segments = sortFrequencySegments(band.frequencyShape);\n\n // Find the segments that share this boundary\n const endingIndex = segments.findIndex(\n (seg) => Math.abs(seg.endTime - oldTime) < 0.001\n );\n const startingIndex = segments.findIndex(\n (seg) => Math.abs(seg.startTime - oldTime) < 0.001\n );\n\n // Must be at a segment boundary\n if (endingIndex === -1 || startingIndex === -1) return band;\n if (endingIndex !== startingIndex - 1) return band;\n\n const endingSeg = segments[endingIndex];\n const startingSeg = segments[startingIndex];\n\n if (!endingSeg || !startingSeg) return band;\n\n // Check bounds: newTime must be within the span of both segments\n if (newTime <= endingSeg.startTime || newTime >= startingSeg.endTime) {\n return band;\n }\n\n // Update the boundary\n const newSegments = segments.map((seg, i) => {\n if (i === endingIndex) {\n return { ...seg, endTime: newTime };\n }\n if (i === startingIndex) {\n return { ...seg, startTime: newTime };\n }\n return seg;\n });\n\n return {\n ...band,\n frequencyShape: newSegments,\n };\n}\n","/**\n * Band Masking utilities for F3.\n *\n * These functions apply frequency band boundaries as spectral masks\n * to an existing spectrogram, enabling per-band MIR analysis.\n */\n\nimport type { Spectrogram } from \"./spectrogram\";\nimport type { FrequencyBand } from \"../types\";\nimport { frequencyBoundsAt } from \"./frequencyBand\";\n\n// ----------------------------\n// Types\n// ----------------------------\n\nexport type BandMaskOptions = {\n /** Soft edge width in Hz for smooth transitions (0 = hard edge). Default: 0 */\n edgeSmoothHz?: number;\n};\n\nexport type MaskedSpectrogram = Spectrogram & {\n /** ID of the band this mask was computed for */\n bandId: string;\n /** Fraction of energy retained per frame (0-1) for diagnostics */\n energyRetainedPerFrame: Float32Array;\n};\n\n// ----------------------------\n// Conversion Helpers\n// ----------------------------\n\n/**\n * Convert an FFT bin index to frequency in Hz.\n *\n * @param bin - FFT bin index (0 to fftSize/2)\n * @param sampleRate - Audio sample rate in Hz\n * @param fftSize - FFT size (number of samples)\n * @returns Frequency in Hz\n */\nexport function binToHz(bin: number, sampleRate: number, fftSize: number): number {\n return bin * (sampleRate / fftSize);\n}\n\n/**\n * Convert a frequency in Hz to an FFT bin index.\n *\n * @param hz - Frequency in Hz\n * @param sampleRate - Audio sample rate in Hz\n * @param fftSize - FFT size (number of samples)\n * @returns FFT bin index (may be fractional)\n */\nexport function hzToBin(hz: number, sampleRate: number, fftSize: number): number {\n return hz / (sampleRate / fftSize);\n}\n\n// ----------------------------\n// Mask Computation\n// ----------------------------\n\n/**\n * Compute a spectral mask for a band at a specific time.\n *\n * Returns a Float32Array of length (fftSize/2 + 1) containing\n * mask values between 0 and 1.\n *\n * @param band - The frequency band to mask\n * @param time - Time in seconds\n * @param sampleRate - Audio sample rate in Hz\n * @param fftSize - FFT size\n * @param options - Mask options\n * @returns Mask array, or null if band is inactive at this time\n */\nexport function computeBandMaskAtTime(\n band: FrequencyBand,\n time: number,\n sampleRate: number,\n fftSize: number,\n options?: BandMaskOptions\n): Float32Array | null {\n const bounds = frequencyBoundsAt(band, time);\n if (!bounds) return null;\n\n const nBins = (fftSize >>> 1) + 1;\n const mask = new Float32Array(nBins);\n const edgeSmoothHz = options?.edgeSmoothHz ?? 0;\n const binHz = sampleRate / fftSize;\n\n for (let k = 0; k < nBins; k++) {\n const hz = binToHz(k, sampleRate, fftSize);\n\n if (hz < bounds.lowHz || hz > bounds.highHz) {\n // Outside band\n mask[k] = 0;\n } else if (edgeSmoothHz <= 0) {\n // Inside band, hard edge\n mask[k] = 1;\n } else {\n // Inside band, with soft edges\n const distFromLow = hz - bounds.lowHz;\n const distFromHigh = bounds.highHz - hz;\n\n let gain = 1;\n\n // Apply raised-cosine taper at low edge\n if (distFromLow < edgeSmoothHz) {\n gain *= 0.5 * (1 - Math.cos(Math.PI * distFromLow / edgeSmoothHz));\n }\n\n // Apply raised-cosine taper at high edge\n if (distFromHigh < edgeSmoothHz) {\n gain *= 0.5 * (1 - Math.cos(Math.PI * distFromHigh / edgeSmoothHz));\n }\n\n mask[k] = gain;\n }\n }\n\n return mask;\n}\n\n/**\n * Apply a band mask to an entire spectrogram.\n *\n * Creates a new spectrogram with band-masked magnitudes.\n * Uses linear interpolation of band bounds for time-varying bands.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to apply\n * @param options - Mask options\n * @returns Masked spectrogram with energy retention diagnostics\n */\nexport function applyBandMaskToSpectrogram(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMaskOptions\n): MaskedSpectrogram {\n const nFrames = spec.times.length;\n const nBins = (spec.fftSize >>> 1) + 1;\n\n const maskedMagnitudes: Float32Array[] = new Array(nFrames);\n const energyRetained = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const time = spec.times[t] ?? 0;\n const srcMags = spec.magnitudes[t];\n\n if (!srcMags) {\n maskedMagnitudes[t] = new Float32Array(nBins);\n energyRetained[t] = 0;\n continue;\n }\n\n // Compute mask for this frame\n const mask = computeBandMaskAtTime(\n band,\n time,\n spec.sampleRate,\n spec.fftSize,\n options\n );\n\n if (!mask) {\n // Band is inactive at this time\n maskedMagnitudes[t] = new Float32Array(nBins);\n energyRetained[t] = 0;\n continue;\n }\n\n // Apply mask and compute energy\n const masked = new Float32Array(nBins);\n let originalEnergy = 0;\n let maskedEnergy = 0;\n\n for (let k = 0; k < nBins; k++) {\n const mag = srcMags[k] ?? 0;\n const maskedMag = mag * (mask[k] ?? 0);\n\n masked[k] = maskedMag;\n originalEnergy += mag * mag;\n maskedEnergy += maskedMag * maskedMag;\n }\n\n maskedMagnitudes[t] = masked;\n energyRetained[t] = originalEnergy > 0 ? maskedEnergy / originalEnergy : 0;\n }\n\n return {\n sampleRate: spec.sampleRate,\n fftSize: spec.fftSize,\n hopSize: spec.hopSize,\n times: spec.times,\n magnitudes: maskedMagnitudes,\n bandId: band.id,\n energyRetainedPerFrame: energyRetained,\n };\n}\n\n/**\n * Compute the energy of a magnitude spectrum.\n *\n * @param magnitudes - Magnitude spectrum (one frame)\n * @returns Sum of squared magnitudes\n */\nexport function computeFrameEnergy(magnitudes: Float32Array): number {\n let energy = 0;\n for (let k = 0; k < magnitudes.length; k++) {\n const mag = magnitudes[k] ?? 0;\n energy += mag * mag;\n }\n return energy;\n}\n\n/**\n * Compute the amplitude (sum of magnitudes) of a frame.\n *\n * @param magnitudes - Magnitude spectrum (one frame)\n * @returns Sum of magnitudes\n */\nexport function computeFrameAmplitude(magnitudes: Float32Array): number {\n let sum = 0;\n for (let k = 0; k < magnitudes.length; k++) {\n sum += magnitudes[k] ?? 0;\n }\n return sum;\n}\n","/**\n * Band-Scoped MIR utilities for F3.\n *\n * These functions compute MIR features (amplitude envelope, onset strength,\n * spectral flux) for frequency bands by applying spectral masks to an\n * existing spectrogram.\n */\n\nimport type { Spectrogram } from \"./spectrogram\";\nimport type {\n FrequencyBand,\n MirRunMeta,\n MirRunTimings,\n BandMirFunctionId,\n BandMirDiagnostics,\n BandMir1DResult,\n} from \"../types\";\nimport {\n applyBandMaskToSpectrogram,\n computeFrameAmplitude,\n type BandMaskOptions,\n} from \"./bandMask\";\n\n// Re-export types for convenience\nexport type { BandMirFunctionId, BandMirDiagnostics, BandMir1DResult };\n\nexport type BandMirOptions = {\n /** Soft edge width in Hz for mask transitions. Default: 0 */\n edgeSmoothHz?: number;\n /** Options for onset strength computation */\n onset?: {\n /** If true, log-compress magnitudes before differencing. */\n useLog?: boolean;\n /** Moving-average smoothing window length in milliseconds. 0 disables smoothing. */\n smoothMs?: number;\n /** How to convert temporal differences into novelty. */\n diffMethod?: \"rectified\" | \"abs\";\n };\n /** Optional cancellation hook */\n isCancelled?: () => boolean;\n};\n\n// ----------------------------\n// Internal Helpers\n// ----------------------------\n\nfunction computeDiagnostics(\n energyRetainedPerFrame: Float32Array\n): BandMirDiagnostics {\n const totalFrames = energyRetainedPerFrame.length;\n let sum = 0;\n let weakCount = 0;\n let emptyCount = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const e = energyRetainedPerFrame[i] ?? 0;\n sum += e;\n if (e < 0.01) weakCount++;\n if (e === 0) emptyCount++;\n }\n\n const meanEnergyRetained = totalFrames > 0 ? sum / totalFrames : 0;\n const warnings: string[] = [];\n\n if (meanEnergyRetained < 0.01) {\n warnings.push(\"Band contains very little energy - check frequency range\");\n }\n if (emptyCount > totalFrames * 0.5) {\n warnings.push(\"More than half of frames are empty - band may not be active for this audio\");\n }\n\n return {\n meanEnergyRetained,\n weakFrameCount: weakCount,\n emptyFrameCount: emptyCount,\n totalFrames,\n warnings,\n };\n}\n\nfunction createMeta(startMs: number): MirRunMeta {\n const endMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n const timings: MirRunTimings = {\n totalMs: endMs - startMs,\n cpuMs: endMs - startMs,\n gpuMs: 0,\n };\n return {\n backend: \"cpu\",\n usedGpu: false,\n timings,\n };\n}\n\nfunction movingAverage(values: Float32Array, windowFrames: number): Float32Array {\n if (windowFrames <= 1) return values;\n\n const n = values.length;\n const out = new Float32Array(n);\n\n // Centered window.\n const half = Math.floor(windowFrames / 2);\n\n // Prefix sums for stable, bug-free O(n) moving average.\n const prefix = new Float64Array(n + 1);\n prefix[0] = 0;\n for (let i = 0; i < n; i++) {\n prefix[i + 1] = (prefix[i] ?? 0) + (values[i] ?? 0);\n }\n\n for (let i = 0; i < n; i++) {\n const start = Math.max(0, i - half);\n const end = Math.min(n, i + half + 1);\n const sum = (prefix[end] ?? 0) - (prefix[start] ?? 0);\n const count = Math.max(1, end - start);\n out[i] = sum / count;\n }\n\n return out;\n}\n\nfunction logCompress(x: number): number {\n // Stable compression without -Inf.\n return Math.log1p(Math.max(0, x));\n}\n\n// ----------------------------\n// Band MIR Functions\n// ----------------------------\n\n/**\n * Compute amplitude envelope for a frequency band.\n *\n * Returns the sum of magnitudes per frame within the band's frequency range.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band MIR result with amplitude envelope\n */\nexport function bandAmplitudeEnvelope(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMirOptions\n): BandMir1DResult {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n // Apply band mask\n const masked = applyBandMaskToSpectrogram(spec, band, {\n edgeSmoothHz: options?.edgeSmoothHz,\n });\n\n const nFrames = masked.times.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const mags = masked.magnitudes[t];\n if (mags) {\n values[t] = computeFrameAmplitude(mags);\n }\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandAmplitudeEnvelope\",\n times: masked.times,\n values,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n/**\n * Compute onset strength for a frequency band.\n *\n * Uses temporal differences of band-masked magnitudes.\n * Adapted from onset.ts:onsetEnvelopeFromSpectrogram.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band MIR result with onset strength\n */\nexport function bandOnsetStrength(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMirOptions\n): BandMir1DResult {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n // Default onset options\n const useLog = options?.onset?.useLog ?? false;\n const smoothMs = options?.onset?.smoothMs ?? 30;\n const diffMethod = options?.onset?.diffMethod ?? \"rectified\";\n\n // Apply band mask\n const masked = applyBandMaskToSpectrogram(spec, band, {\n edgeSmoothHz: options?.edgeSmoothHz,\n });\n\n const nFrames = masked.times.length;\n const nBins = (masked.fftSize >>> 1) + 1;\n const out = new Float32Array(nFrames);\n\n // First frame has no previous frame\n out[0] = 0;\n\n for (let t = 1; t < nFrames; t++) {\n const cur = masked.magnitudes[t];\n const prev = masked.magnitudes[t - 1];\n\n if (!cur || !prev) {\n out[t] = 0;\n continue;\n }\n\n let sum = 0;\n let binsWithData = 0;\n\n for (let k = 0; k < nBins; k++) {\n let a = cur[k] ?? 0;\n let b = prev[k] ?? 0;\n\n // Only count bins that have some energy\n if (a > 0 || b > 0) {\n binsWithData++;\n\n if (useLog) {\n a = logCompress(a);\n b = logCompress(b);\n }\n\n const d = a - b;\n sum += diffMethod === \"abs\" ? Math.abs(d) : Math.max(0, d);\n }\n }\n\n // Normalize by number of active bins to avoid scale depending on band width\n out[t] = binsWithData > 0 ? sum / binsWithData : 0;\n }\n\n // Apply smoothing if requested\n const smoothMs_ = smoothMs;\n if (smoothMs_ > 0 && nFrames >= 2) {\n const dt = (masked.times[1] ?? 0) - (masked.times[0] ?? 0);\n const windowFrames = Math.max(1, Math.round((smoothMs_ / 1000) / Math.max(1e-9, dt)));\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandOnsetStrength\",\n times: masked.times,\n values: movingAverage(out, windowFrames | 1),\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandOnsetStrength\",\n times: masked.times,\n values: out,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n/**\n * Compute spectral flux for a frequency band.\n *\n * Uses L1 distance between consecutive normalized band-masked spectra.\n * Adapted from spectral.ts:spectralFlux.\n *\n * @param spec - Source spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band MIR result with spectral flux\n */\nexport function bandSpectralFlux(\n spec: Spectrogram,\n band: FrequencyBand,\n options?: BandMirOptions\n): BandMir1DResult {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n // Apply band mask\n const masked = applyBandMaskToSpectrogram(spec, band, {\n edgeSmoothHz: options?.edgeSmoothHz,\n });\n\n const nFrames = masked.times.length;\n const nBins = (masked.fftSize >>> 1) + 1;\n const out = new Float32Array(nFrames);\n\n let prev: Float32Array | null = null;\n\n for (let t = 0; t < nFrames; t++) {\n const mags = masked.magnitudes[t];\n\n if (!mags) {\n out[t] = 0;\n prev = null;\n continue;\n }\n\n // Normalize to reduce sensitivity to overall level\n let sum = 0;\n for (let k = 0; k < nBins; k++) sum += mags[k] ?? 0;\n\n if (sum <= 0) {\n out[t] = 0;\n prev = null;\n continue;\n }\n\n const cur = new Float32Array(nBins);\n const inv = 1 / sum;\n for (let k = 0; k < nBins; k++) cur[k] = (mags[k] ?? 0) * inv;\n\n if (!prev) {\n out[t] = 0;\n prev = cur;\n continue;\n }\n\n let flux = 0;\n for (let k = 0; k < nBins; k++) {\n const d = (cur[k] ?? 0) - (prev[k] ?? 0);\n flux += Math.abs(d);\n }\n\n out[t] = flux;\n prev = cur;\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandSpectralFlux\",\n times: masked.times,\n values: out,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n// ----------------------------\n// Batch Runner\n// ----------------------------\n\nexport type BandMirBatchRequest = {\n bands: FrequencyBand[];\n functions: BandMirFunctionId[];\n /** Maximum number of bands to process concurrently. Default: 4 */\n maxConcurrent?: number;\n};\n\nexport type BandMirBatchResult = {\n /** Results keyed by bandId, each containing results for requested functions */\n results: Map<string, BandMir1DResult[]>;\n /** Total computation time in ms */\n totalTimingMs: number;\n};\n\n/**\n * Run band MIR analysis for multiple bands.\n *\n * Processes bands sequentially (web workers don't have real parallelism\n * within a single thread). The maxConcurrent option is reserved for\n * future multi-worker support.\n *\n * @param spec - Source spectrogram\n * @param request - Batch request specifying bands and functions\n * @param options - Computation options\n * @returns Map of results by band ID\n */\nexport async function runBandMirBatch(\n spec: Spectrogram,\n request: BandMirBatchRequest,\n options?: BandMirOptions\n): Promise<BandMirBatchResult> {\n const startMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n const results = new Map<string, BandMir1DResult[]>();\n\n for (const band of request.bands) {\n if (options?.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n if (!band.enabled) continue;\n\n const bandResults: BandMir1DResult[] = [];\n\n for (const fn of request.functions) {\n if (options?.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n let result: BandMir1DResult;\n\n switch (fn) {\n case \"bandAmplitudeEnvelope\":\n result = bandAmplitudeEnvelope(spec, band, options);\n break;\n case \"bandOnsetStrength\":\n result = bandOnsetStrength(spec, band, options);\n break;\n case \"bandSpectralFlux\":\n result = bandSpectralFlux(spec, band, options);\n break;\n default:\n // Exhaustive check\n const _exhaustive: never = fn;\n throw new Error(`Unknown band MIR function: ${_exhaustive}`);\n }\n\n bandResults.push(result);\n }\n\n results.set(band.id, bandResults);\n }\n\n const endMs = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n\n return {\n results,\n totalTimingMs: endMs - startMs,\n };\n}\n\n/**\n * Get a human-readable label for a band MIR function.\n *\n * @param fn - Band MIR function ID\n * @returns Human-readable label\n */\nexport function getBandMirFunctionLabel(fn: BandMirFunctionId): string {\n switch (fn) {\n case \"bandAmplitudeEnvelope\":\n return \"Amplitude Envelope\";\n case \"bandOnsetStrength\":\n return \"Onset Strength\";\n case \"bandSpectralFlux\":\n return \"Spectral Flux\";\n default:\n return fn;\n }\n}\n","/**\n * Band Proposal Generation for F5.\n *\n * Generates automated suggestions for \"interesting\" frequency bands.\n * Proposals are advisory only - they must be explicitly promoted by the user.\n *\n * Algorithm overview:\n * 1. Analyze spectral structure using CQT\n * 2. Identify regions with concentrated energy or distinct activity\n * 3. Score and rank candidates\n * 4. Generate proposal objects with explanations\n */\n\nimport type {\n BandProposal,\n BandProposalConfig,\n BandProposalResult,\n BandProposalSource,\n CqtSpectrogram,\n FrequencyBand,\n FrequencyBandProvenance,\n MirRunMeta,\n} from \"../types\";\nimport { type AudioBufferLike, type Spectrogram, spectrogram } from \"./spectrogram\";\nimport { cqtSpectrogram, cqtBinToHz, withCqtDefaults, getNumBins } from \"./cqt\";\nimport { harmonicEnergy, bassPitchMotion, tonalStability } from \"./cqtSignals\";\n\n// ----------------------------\n// Configuration Defaults\n// ----------------------------\n\nconst PROPOSAL_DEFAULTS: Required<BandProposalConfig> = {\n maxProposals: 8,\n minSalience: 0.3,\n minSeparationOctaves: 0.5,\n minBandwidthHz: 20,\n analysisWindow: 0, // 0 = full track\n};\n\n// ----------------------------\n// Types\n// ----------------------------\n\ntype SpectralPeak = {\n binIndex: number;\n centerHz: number;\n magnitude: number;\n bandwidth: number; // in octaves\n lowHz: number;\n highHz: number;\n};\n\ntype ProposalCandidate = {\n peak: SpectralPeak;\n salience: number;\n source: BandProposalSource;\n reason: string;\n};\n\n// ----------------------------\n// Utility Functions\n// ----------------------------\n\n/**\n * Generate a unique proposal ID.\n */\nfunction generateProposalId(): string {\n return `proposal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Generate a band ID for the proposed band.\n */\nfunction generateBandId(): string {\n return `band-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Compute time-averaged magnitude spectrum from CQT.\n */\nfunction computeAverageCqtSpectrum(cqt: CqtSpectrogram): Float32Array {\n const nBins = cqt.magnitudes[0]?.length ?? 0;\n const nFrames = cqt.magnitudes.length;\n const average = new Float32Array(nBins);\n\n for (let frame = 0; frame < nFrames; frame++) {\n const frameMags = cqt.magnitudes[frame];\n if (!frameMags) continue;\n\n for (let bin = 0; bin < nBins; bin++) {\n average[bin] = (average[bin] ?? 0) + (frameMags[bin] ?? 0);\n }\n }\n\n for (let bin = 0; bin < nBins; bin++) {\n average[bin] = (average[bin] ?? 0) / nFrames;\n }\n\n return average;\n}\n\n/**\n * Find local maxima in a 1D array.\n */\nfunction findLocalMaxima(\n values: Float32Array,\n minNeighborDistance: number = 3\n): number[] {\n const peaks: number[] = [];\n\n for (let i = minNeighborDistance; i < values.length - minNeighborDistance; i++) {\n let isPeak = true;\n const centerVal = values[i] ?? 0;\n\n for (let j = -minNeighborDistance; j <= minNeighborDistance; j++) {\n if (j === 0) continue;\n if ((values[i + j] ?? 0) >= centerVal) {\n isPeak = false;\n break;\n }\n }\n\n if (isPeak && centerVal > 0) {\n peaks.push(i);\n }\n }\n\n return peaks;\n}\n\n/**\n * Compute the bandwidth (in bins) at -3dB around a peak.\n */\nfunction computeBandwidth(\n values: Float32Array,\n peakBin: number,\n cqt: CqtSpectrogram,\n minBandwidthHz: number\n): { lowBin: number; highBin: number; lowHz: number; highHz: number; bandwidthOctaves: number } {\n const peakMag = values[peakBin] ?? 0;\n const threshold = peakMag * 0.707; // -3dB\n\n // Find lower edge\n let lowBin = peakBin;\n while (lowBin > 0 && (values[lowBin - 1] ?? 0) >= threshold) {\n lowBin--;\n }\n\n // Find upper edge\n let highBin = peakBin;\n while (highBin < values.length - 1 && (values[highBin + 1] ?? 0) >= threshold) {\n highBin++;\n }\n\n // Enforce a minimum bandwidth in Hz to avoid implausibly narrow bands (e.g. ~1 Hz at low freqs).\n // Expand symmetrically around the peak when possible, otherwise expand toward the available side.\n if (minBandwidthHz > 0) {\n // Avoid infinite loops if something goes wrong\n const maxExpansions = values.length;\n for (let i = 0; i < maxExpansions; i++) {\n const lowHzTmp = cqtBinToHz(lowBin, cqt.config);\n const highHzTmp = cqtBinToHz(highBin, cqt.config);\n if (highHzTmp - lowHzTmp >= minBandwidthHz) break;\n\n const canExpandLow = lowBin > 0;\n const canExpandHigh = highBin < values.length - 1;\n if (!canExpandLow && !canExpandHigh) break;\n\n if (canExpandLow && canExpandHigh) {\n lowBin--;\n highBin++;\n } else if (canExpandLow) {\n lowBin--;\n } else {\n highBin++;\n }\n }\n }\n\n const lowHz = cqtBinToHz(lowBin, cqt.config);\n const highHz = cqtBinToHz(highBin, cqt.config);\n const bandwidthOctaves = Math.log2(highHz / lowHz);\n\n return { lowBin, highBin, lowHz, highHz, bandwidthOctaves };\n}\n\n/**\n * Compute temporal variance of energy in a frequency band.\n * Low variance = consistent energy; high variance = transient or intermittent.\n */\nfunction computeTemporalVariance(\n cqt: CqtSpectrogram,\n lowBin: number,\n highBin: number\n): number {\n const nFrames = cqt.magnitudes.length;\n const bandEnergies = new Float32Array(nFrames);\n\n // Compute energy in band for each frame\n for (let frame = 0; frame < nFrames; frame++) {\n const frameMags = cqt.magnitudes[frame];\n if (!frameMags) continue;\n\n let energy = 0;\n for (let bin = lowBin; bin <= highBin; bin++) {\n const mag = frameMags[bin] ?? 0;\n energy += mag * mag;\n }\n bandEnergies[frame] = energy;\n }\n\n // Compute variance\n let sum = 0;\n for (let i = 0; i < nFrames; i++) {\n sum += bandEnergies[i] ?? 0;\n }\n const mean = sum / nFrames;\n\n let variance = 0;\n for (let i = 0; i < nFrames; i++) {\n const diff = (bandEnergies[i] ?? 0) - mean;\n variance += diff * diff;\n }\n variance /= nFrames;\n\n // Normalize by mean squared to get coefficient of variation squared\n return mean > 0 ? variance / (mean * mean) : 0;\n}\n\n// ----------------------------\n// Peak Detection and Scoring\n// ----------------------------\n\n/**\n * Detect spectral peaks from the average CQT spectrum.\n */\nfunction detectSpectralPeaks(\n cqt: CqtSpectrogram,\n config: Required<BandProposalConfig>\n): SpectralPeak[] {\n const avgSpectrum = computeAverageCqtSpectrum(cqt);\n\n // Minimum distance in bins based on separation requirement\n const minBinDistance = Math.ceil(config.minSeparationOctaves * cqt.binsPerOctave);\n\n const peakIndices = findLocalMaxima(avgSpectrum, Math.max(3, minBinDistance / 2));\n\n const peaks: SpectralPeak[] = [];\n\n for (const binIndex of peakIndices) {\n const bw = computeBandwidth(avgSpectrum, binIndex, cqt, config.minBandwidthHz);\n\n peaks.push({\n binIndex,\n centerHz: cqtBinToHz(binIndex, cqt.config),\n magnitude: avgSpectrum[binIndex] ?? 0,\n bandwidth: bw.bandwidthOctaves,\n lowHz: bw.lowHz,\n highHz: bw.highHz,\n });\n }\n\n // Sort by magnitude (descending)\n peaks.sort((a, b) => b.magnitude - a.magnitude);\n\n return peaks;\n}\n\n/**\n * Score a spectral peak for proposal salience.\n */\nfunction scorePeak(\n peak: SpectralPeak,\n cqt: CqtSpectrogram,\n avgSpectrum: Float32Array,\n cqtSignals: {\n harmonicEnergy: Float32Array;\n bassPitchMotion: Float32Array;\n tonalStability: Float32Array;\n }\n): ProposalCandidate {\n // Find bin range for this peak\n const lowBin = Math.max(0, Math.floor(peak.lowHz / (cqt.config.fMin * Math.pow(2, 1 / cqt.binsPerOctave))));\n const highBin = Math.min(\n getNumBins(cqt.config) - 1,\n Math.ceil(peak.highHz / (cqt.config.fMin * Math.pow(2, 1 / cqt.binsPerOctave)))\n );\n\n // Compute various scores\n const temporalVariance = computeTemporalVariance(cqt, lowBin, highBin);\n\n // Energy concentration: how much energy is in this band vs total\n let bandEnergy = 0;\n let totalEnergy = 0;\n for (let bin = 0; bin < avgSpectrum.length; bin++) {\n const mag = avgSpectrum[bin] ?? 0;\n totalEnergy += mag * mag;\n if (bin >= lowBin && bin <= highBin) {\n bandEnergy += mag * mag;\n }\n }\n const energyConcentration = totalEnergy > 0 ? bandEnergy / totalEnergy : 0;\n\n // Get average CQT signal values for this frequency range\n // Map frequency to frame indices (not perfect, but approximate)\n const isBassRange = peak.centerHz < 300;\n const isLowMidRange = peak.centerHz >= 300 && peak.centerHz < 1000;\n\n // Compute average signal values\n let avgHarmonicEnergy = 0;\n let avgBassPitchMotion = 0;\n let avgTonalStability = 0;\n const nFrames = cqtSignals.harmonicEnergy.length;\n\n for (let i = 0; i < nFrames; i++) {\n avgHarmonicEnergy += cqtSignals.harmonicEnergy[i] ?? 0;\n avgBassPitchMotion += cqtSignals.bassPitchMotion[i] ?? 0;\n avgTonalStability += cqtSignals.tonalStability[i] ?? 0;\n }\n avgHarmonicEnergy /= nFrames;\n avgBassPitchMotion /= nFrames;\n avgTonalStability /= nFrames;\n\n // Determine source and compute salience based on characteristics\n let source: BandProposalSource;\n let reason: string;\n let salience: number;\n\n if (isBassRange && avgBassPitchMotion > 0.4) {\n source = \"cqt_bass_motion\";\n reason = \"Significant bass pitch motion detected\";\n salience = 0.3 + energyConcentration * 0.3 + avgBassPitchMotion * 0.4;\n } else if (avgHarmonicEnergy > 0.5 && avgTonalStability > 0.5) {\n source = \"cqt_harmonic\";\n reason = \"Strong harmonic structure with stable tonality\";\n salience = 0.3 + avgHarmonicEnergy * 0.35 + avgTonalStability * 0.35;\n } else if (temporalVariance > 0.5) {\n source = \"onset_band\";\n reason = \"Distinct transient activity pattern\";\n salience = 0.3 + energyConcentration * 0.3 + Math.min(1, temporalVariance) * 0.4;\n } else if (energyConcentration > 0.1) {\n source = \"energy_cluster\";\n reason = \"Concentrated spectral energy\";\n salience = 0.2 + energyConcentration * 0.5 + (1 - Math.min(1, peak.bandwidth)) * 0.3;\n } else {\n source = \"spectral_peak\";\n reason = \"Persistent spectral peak\";\n salience = 0.2 + energyConcentration * 0.4 + (1 - Math.min(1, peak.bandwidth * 2)) * 0.4;\n }\n\n // Add frequency-specific context to reason\n if (isBassRange) {\n reason += \" (bass region)\";\n } else if (isLowMidRange) {\n reason += \" (low-mid region)\";\n } else if (peak.centerHz > 4000) {\n reason += \" (high frequency region)\";\n }\n\n return {\n peak,\n salience: Math.min(1, Math.max(0, salience)),\n source,\n reason,\n };\n}\n\n// ----------------------------\n// Proposal Generation\n// ----------------------------\n\n/**\n * Create a FrequencyBand from a proposal candidate.\n */\nfunction createBandFromCandidate(\n candidate: ProposalCandidate,\n duration: number\n): FrequencyBand {\n const now = new Date().toISOString();\n const provenance: FrequencyBandProvenance = {\n source: \"manual\", // Will be treated as imported when promoted\n createdAt: now,\n };\n\n return {\n id: generateBandId(),\n label: `Region ${Math.round(candidate.peak.centerHz)} Hz`,\n enabled: true,\n timeScope: { kind: \"global\" },\n frequencyShape: [\n {\n startTime: 0,\n endTime: duration,\n lowHzStart: candidate.peak.lowHz,\n highHzStart: candidate.peak.highHz,\n lowHzEnd: candidate.peak.lowHz,\n highHzEnd: candidate.peak.highHz,\n },\n ],\n sortOrder: 0,\n provenance,\n };\n}\n\n/**\n * Filter candidates to remove overlapping proposals.\n * Keeps the highest-salience candidate when overlap exceeds threshold.\n */\nfunction filterOverlappingCandidates(\n candidates: ProposalCandidate[],\n minSeparationOctaves: number\n): ProposalCandidate[] {\n const filtered: ProposalCandidate[] = [];\n\n for (const candidate of candidates) {\n let hasOverlap = false;\n\n for (const existing of filtered) {\n const octaveDiff = Math.abs(\n Math.log2(candidate.peak.centerHz / existing.peak.centerHz)\n );\n\n if (octaveDiff < minSeparationOctaves) {\n hasOverlap = true;\n break;\n }\n }\n\n if (!hasOverlap) {\n filtered.push(candidate);\n }\n }\n\n return filtered;\n}\n\n// ----------------------------\n// Main Export\n// ----------------------------\n\nexport type BandProposalOptions = {\n config?: BandProposalConfig;\n isCancelled?: () => boolean;\n};\n\n/**\n * Generate band proposals from audio.\n *\n * @param audio - Audio buffer to analyze\n * @param duration - Track duration in seconds\n * @param options - Optional configuration\n * @returns Array of band proposals with salience scores and reasons\n */\nexport async function generateBandProposals(\n audio: AudioBufferLike,\n duration: number,\n options: BandProposalOptions = {}\n): Promise<BandProposalResult> {\n const startTime = performance.now();\n\n const config: Required<BandProposalConfig> = {\n ...PROPOSAL_DEFAULTS,\n ...options.config,\n };\n\n // Compute CQT\n const cqtConfig = withCqtDefaults({\n binsPerOctave: 24,\n fMin: 32.7,\n fMax: Math.min(8372, audio.sampleRate / 2), // Cap at Nyquist\n });\n\n const cqt = await cqtSpectrogram(audio, cqtConfig, {\n isCancelled: options.isCancelled,\n });\n\n if (options.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n // Compute CQT-derived signals\n const harmonicResult = harmonicEnergy(cqt);\n const bassMotionResult = bassPitchMotion(cqt);\n const tonalResult = tonalStability(cqt);\n\n const cqtSignals = {\n harmonicEnergy: harmonicResult.values,\n bassPitchMotion: bassMotionResult.values,\n tonalStability: tonalResult.values,\n };\n\n // Detect spectral peaks\n const peaks = detectSpectralPeaks(cqt, config);\n\n // Score each peak\n const avgSpectrum = computeAverageCqtSpectrum(cqt);\n const candidates: ProposalCandidate[] = [];\n\n for (const peak of peaks) {\n if (options.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n const candidate = scorePeak(peak, cqt, avgSpectrum, cqtSignals);\n\n if (candidate.salience >= config.minSalience) {\n candidates.push(candidate);\n }\n }\n\n // Sort by salience (descending)\n candidates.sort((a, b) => b.salience - a.salience);\n\n // Filter overlapping candidates\n const filtered = filterOverlappingCandidates(candidates, config.minSeparationOctaves);\n\n // Limit to maxProposals\n const finalCandidates = filtered.slice(0, config.maxProposals);\n\n // Create proposals\n const proposals: BandProposal[] = finalCandidates.map((candidate, index) => {\n const band = createBandFromCandidate(candidate, duration);\n band.sortOrder = index;\n\n return {\n id: generateProposalId(),\n band,\n salience: candidate.salience,\n reason: candidate.reason,\n source: candidate.source,\n generatedAt: new Date().toISOString(),\n };\n });\n\n const endTime = performance.now();\n\n const meta: MirRunMeta = {\n backend: \"cpu\",\n usedGpu: false,\n timings: {\n totalMs: endTime - startTime,\n cpuMs: endTime - startTime,\n },\n };\n\n return {\n kind: \"bandProposals\",\n proposals,\n meta,\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 BeatCandidate,\n BeatCandidateSource,\n BeatCandidatesResult,\n TempoHypothesis,\n TempoHypothesisEvidence,\n TempoHypothesesResult,\n BeatGrid,\n PhaseHypothesis,\n PhaseAlignmentConfig,\n // Musical Time (B4)\n MusicalTimeProvenance,\n MusicalTimeSegment,\n MusicalTimeStructure,\n BeatPosition,\n // Frequency Bands (F1)\n FrequencyBandTimeScope,\n FrequencySegment,\n FrequencyBandProvenance,\n FrequencyBand,\n FrequencyBandStructure,\n FrequencyBoundsAtTime,\n // Frequency Bands (F2)\n FrequencyKeyframe,\n // Band-Scoped MIR (F3)\n BandMirFunctionId,\n BandMirDiagnostics,\n BandMir1DResult,\n // CQT (F5)\n CqtConfig,\n CqtSpectrogram,\n CqtSignalId,\n CqtSignalResult,\n // Band Proposals (F5)\n BandProposalSource,\n BandProposal,\n BandProposalConfig,\n BandProposalResult,\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// Beat Candidates\n// ----------------------------\n\nexport type { BeatCandidatesOptions, BeatCandidatesOutput, BeatSalienceSignal } from \"./dsp/beatCandidates\";\nexport { detectBeatCandidates, beatSalienceFromMel } from \"./dsp/beatCandidates\";\n\n// ----------------------------\n// Tempo Hypotheses\n// ----------------------------\n\nexport type { TempoHypothesesOptions, TempoHypothesesOutput } from \"./dsp/tempoHypotheses\";\nexport { generateTempoHypotheses } from \"./dsp/tempoHypotheses\";\n\n// ----------------------------\n// Phase Alignment (Beat Grid)\n// ----------------------------\n\nexport { computePhaseHypotheses, generateBeatTimes } from \"./dsp/phaseAlignment\";\n\n// ----------------------------\n// Musical Time (B4)\n// ----------------------------\n\nexport {\n findSegmentAtTime,\n computeBeatPosition,\n computeBeatPositionFromStructure,\n generateSegmentId,\n createSegmentFromGrid,\n createMusicalTimeStructure,\n validateSegments,\n sortSegments,\n splitSegment,\n generateSegmentBeatTimes,\n} from \"./dsp/musicalTime\";\n\n// ----------------------------\n// Frequency Bands (F1)\n// ----------------------------\n\nexport {\n // ID generation\n generateBandId,\n // Validation\n validateFrequencySegments,\n validateFrequencyBand,\n validateBandStructure,\n // Creation\n createBandStructure,\n createConstantBand,\n createSectionedBand,\n createStandardBands,\n // Queries\n bandsActiveAt,\n frequencyBoundsAt,\n allFrequencyBoundsAt,\n findBandById,\n // Sorting\n sortBands,\n sortFrequencySegments,\n // Modification\n touchStructure,\n addBandToStructure,\n removeBandFromStructure,\n updateBandInStructure,\n // Keyframe Helpers (F2)\n keyframesFromBand,\n segmentsFromKeyframes,\n splitBandSegmentAt,\n mergeAdjacentSegments,\n removeKeyframe,\n updateKeyframe,\n moveKeyframeTime,\n} from \"./dsp/frequencyBand\";\n\n// ----------------------------\n// Band-Scoped MIR (F3)\n// ----------------------------\n\nexport type { BandMaskOptions, MaskedSpectrogram } from \"./dsp/bandMask\";\nexport {\n binToHz,\n hzToBin,\n computeBandMaskAtTime,\n applyBandMaskToSpectrogram,\n computeFrameEnergy,\n computeFrameAmplitude,\n} from \"./dsp/bandMask\";\n\nexport type { BandMirOptions, BandMirBatchRequest, BandMirBatchResult } from \"./dsp/bandMir\";\nexport {\n bandAmplitudeEnvelope,\n bandOnsetStrength,\n bandSpectralFlux,\n runBandMirBatch,\n getBandMirFunctionLabel,\n} from \"./dsp/bandMir\";\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, MelConversionConfig } from \"./dsp/mel\";\nexport { melSpectrogram, hzToMel, melToHz, hzToFeatureIndex, featureIndexToHz } from \"./dsp/mel\";\n\n// ----------------------------\n// CQT (F5)\n// ----------------------------\n\nexport type { CqtOptions } from \"./dsp/cqt\";\nexport {\n cqtSpectrogram,\n computeCqt,\n cqtBinToHz,\n hzToCqtBin,\n getNumOctaves,\n getNumBins,\n getCqtBinFrequencies,\n withCqtDefaults,\n CQT_DEFAULTS,\n} from \"./dsp/cqt\";\n\nexport {\n harmonicEnergy,\n bassPitchMotion,\n tonalStability,\n computeCqtSignal,\n computeAllCqtSignals,\n} from \"./dsp/cqtSignals\";\n\n// ----------------------------\n// Band Proposals (F5)\n// ----------------------------\n\nexport type { BandProposalOptions } from \"./dsp/bandProposal\";\nexport { generateBandProposals } from \"./dsp/bandProposal\";\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"]}
|