@octoseq/mir 0.1.0-main.994cb4e → 0.1.0-main.9ea6d2e
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/{chunk-OLIDGECY.js → chunk-CI7QGWP7.js} +44 -3
- package/dist/chunk-CI7QGWP7.js.map +1 -0
- package/dist/index.d.ts +475 -7
- package/dist/index.js +1495 -90
- package/dist/index.js.map +1 -1
- package/dist/{runMir-CWsxri61.d.ts → runMir-D4t7WsN0.d.ts} +1 -1
- package/dist/runner/runMir.d.ts +2 -2
- package/dist/runner/runMir.js +1 -1
- package/dist/runner/workerProtocol.d.ts +1 -1
- package/dist/{types-D6eBRofe.d.ts → types-ifqndzu7.d.ts} +86 -6
- package/package.json +1 -1
- package/src/dsp/bandCqt.ts +662 -0
- package/src/dsp/bandEvents.ts +351 -0
- package/src/dsp/bandMir.ts +69 -0
- package/src/dsp/bandProposal.ts +30 -2
- package/src/dsp/customSignalReduction.ts +841 -0
- package/src/dsp/frequencyBand.ts +46 -3
- package/src/dsp/peakPicking.ts +519 -0
- package/src/dsp/spectral.ts +54 -0
- package/src/index.ts +93 -1
- package/src/runner/runMir.ts +24 -1
- package/src/types.ts +97 -4
- package/dist/chunk-OLIDGECY.js.map +0 -1
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/peakPicking.ts","../src/dsp/musicalTime.ts","../src/dsp/frequencyBand.ts","../src/dsp/bandMask.ts","../src/dsp/bandMir.ts","../src/dsp/bandEvents.ts","../src/dsp/bandCqt.ts","../src/dsp/bandProposal.ts","../src/dsp/customSignalReduction.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","createMeta","nowMs","computeDiagnostics","harmonicEnergy","generateBandId","logCompress","movingAverage","out","mfcc","l2Norm","dot","clamp01","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 * Peak Picking Algorithm\n *\n * Detects local maxima in a 1D signal that exceed a threshold.\n * Used to create event streams from continuous signals.\n */\n\nexport interface PeakPickingParams {\n /** Minimum normalized value (0-1) for a peak to be considered. Default: 0.3 */\n threshold: number;\n /** Minimum time between peaks in seconds. Default: 0.1 */\n minDistance: number;\n /** Number of samples to look back for local max comparison. Default: 2 */\n preMax?: number;\n /** Number of samples to look forward for local max comparison. Default: 2 */\n postMax?: number;\n}\n\nexport interface PeakPickingResult {\n /** Times of detected peaks (seconds) */\n times: Float32Array;\n /** Normalized strength of each peak (0-1, based on normalized value) */\n strengths: Float32Array;\n}\n\n/**\n * Default peak picking parameters\n */\nexport const DEFAULT_PEAK_PICKING_PARAMS: Required<PeakPickingParams> = {\n threshold: 0.3,\n minDistance: 0.1,\n preMax: 2,\n postMax: 2,\n};\n\n/**\n * Pick peaks from a continuous signal.\n *\n * @param times - Time values in seconds (Float32Array)\n * @param values - Signal values (Float32Array)\n * @param params - Peak picking parameters\n * @returns Detected peaks with times and strengths\n */\nexport function pickPeaks(\n times: Float32Array,\n values: Float32Array,\n params: Partial<PeakPickingParams> = {}\n): PeakPickingResult {\n const {\n threshold,\n minDistance,\n preMax,\n postMax,\n } = { ...DEFAULT_PEAK_PICKING_PARAMS, ...params };\n\n if (times.length === 0 || values.length === 0) {\n return {\n times: new Float32Array(0),\n strengths: new Float32Array(0),\n };\n }\n\n // Find min/max for normalization\n let minVal = values[0]!;\n let maxVal = values[0]!;\n for (let i = 1; i < values.length; i++) {\n const v = values[i]!;\n if (v < minVal) minVal = v;\n if (v > maxVal) maxVal = v;\n }\n\n const range = maxVal - minVal;\n if (range <= 0) {\n // Constant signal - no peaks\n return {\n times: new Float32Array(0),\n strengths: new Float32Array(0),\n };\n }\n\n // Normalize function\n const normalize = (v: number) => (v - minVal) / range;\n\n // Find peaks\n const peakIndices: number[] = [];\n const peakStrengths: number[] = [];\n\n for (let i = preMax; i < values.length - postMax; i++) {\n const currentVal = values[i]!;\n const normalizedVal = normalize(currentVal);\n\n // Skip if below threshold\n if (normalizedVal < threshold) continue;\n\n // Check if local maximum\n let isMax = true;\n\n // Check pre-samples\n for (let j = 1; j <= preMax; j++) {\n if (values[i - j]! >= currentVal) {\n isMax = false;\n break;\n }\n }\n\n // Check post-samples\n if (isMax) {\n for (let j = 1; j <= postMax; j++) {\n if (values[i + j]! > currentVal) {\n isMax = false;\n break;\n }\n }\n }\n\n if (isMax) {\n peakIndices.push(i);\n peakStrengths.push(normalizedVal);\n }\n }\n\n // Apply minimum distance constraint (keep higher peaks)\n const filteredIndices: number[] = [];\n const filteredStrengths: number[] = [];\n\n for (let i = 0; i < peakIndices.length; i++) {\n const idx = peakIndices[i]!;\n const time = times[idx]!;\n const strength = peakStrengths[i]!;\n\n // Check if there's a higher peak within minDistance\n let shouldKeep = true;\n\n for (let j = 0; j < filteredIndices.length; j++) {\n const prevIdx = filteredIndices[j]!;\n const prevTime = times[prevIdx]!;\n const prevStrength = filteredStrengths[j]!;\n\n if (Math.abs(time - prevTime) < minDistance) {\n if (strength > prevStrength) {\n // Replace previous peak\n filteredIndices[j] = idx;\n filteredStrengths[j] = strength;\n }\n shouldKeep = false;\n break;\n }\n }\n\n if (shouldKeep) {\n filteredIndices.push(idx);\n filteredStrengths.push(strength);\n }\n }\n\n // Convert to output format\n const resultTimes = new Float32Array(filteredIndices.length);\n const resultStrengths = new Float32Array(filteredStrengths.length);\n\n for (let i = 0; i < filteredIndices.length; i++) {\n resultTimes[i] = times[filteredIndices[i]!]!;\n resultStrengths[i] = filteredStrengths[i]!;\n }\n\n return {\n times: resultTimes,\n strengths: resultStrengths,\n };\n}\n\n/**\n * Result from adaptive peak picking, including the threshold curve for visualization.\n */\nexport interface AdaptivePeakPickingResult extends PeakPickingResult {\n /** The adaptive threshold curve (normalized 0-1) for visualization */\n thresholdCurve: Float32Array;\n /** Time values corresponding to threshold curve samples */\n thresholdTimes: Float32Array;\n}\n\n/**\n * Compute the adaptive threshold curve for visualization.\n * This is the normalized threshold that would be used by pickPeaksAdaptive.\n *\n * @param values - Signal values (Float32Array)\n * @param windowSize - Window size for local statistics (in samples)\n * @param thresholdMultiplier - Multiplier for local std (default 1.5)\n * @returns Normalized threshold curve (0-1 range)\n */\nexport function computeAdaptiveThreshold(\n values: Float32Array,\n windowSize: number = 20,\n thresholdMultiplier: number = 1.5\n): Float32Array {\n if (values.length === 0) {\n return new Float32Array(0);\n }\n\n // Find min/max for normalization\n let minVal = values[0]!;\n let maxVal = values[0]!;\n for (let i = 1; i < values.length; i++) {\n const v = values[i]!;\n if (v < minVal) minVal = v;\n if (v > maxVal) maxVal = v;\n }\n const range = maxVal - minVal;\n if (range <= 0) {\n return new Float32Array(values.length).fill(0.5);\n }\n\n // Compute adaptive threshold\n const halfWindow = Math.floor(windowSize / 2);\n const thresholdCurve = new Float32Array(values.length);\n\n for (let i = 0; i < values.length; i++) {\n const start = Math.max(0, i - halfWindow);\n const end = Math.min(values.length, i + halfWindow + 1);\n const windowLen = end - start;\n\n // Compute local mean\n let sum = 0;\n for (let j = start; j < end; j++) {\n sum += values[j]!;\n }\n const mean = sum / windowLen;\n\n // Compute local std\n let sumSq = 0;\n for (let j = start; j < end; j++) {\n const diff = values[j]! - mean;\n sumSq += diff * diff;\n }\n const std = Math.sqrt(sumSq / windowLen);\n\n // Adaptive threshold in original scale\n const adaptiveThresh = mean + thresholdMultiplier * std;\n\n // Normalize to 0-1 range\n thresholdCurve[i] = Math.max(0, Math.min(1, (adaptiveThresh - minVal) / range));\n }\n\n return thresholdCurve;\n}\n\n/**\n * Pick peaks with adaptive threshold based on local statistics.\n *\n * @param times - Time values in seconds\n * @param values - Signal values\n * @param windowSize - Window size for local statistics (in samples)\n * @param params - Base peak picking parameters (threshold used as multiplier of local std)\n * @param includeThresholdCurve - If true, returns the threshold curve for visualization\n */\nexport function pickPeaksAdaptive(\n times: Float32Array,\n values: Float32Array,\n windowSize: number = 20,\n params: Partial<PeakPickingParams> = {},\n includeThresholdCurve: boolean = false\n): PeakPickingResult | AdaptivePeakPickingResult {\n const {\n threshold,\n minDistance,\n preMax,\n postMax,\n } = { ...DEFAULT_PEAK_PICKING_PARAMS, threshold: 1.5, ...params };\n\n if (times.length === 0 || values.length === 0) {\n return {\n times: new Float32Array(0),\n strengths: new Float32Array(0),\n };\n }\n\n // Compute adaptive threshold using local mean + threshold * local std\n const adaptiveThreshold = new Float32Array(values.length);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < values.length; i++) {\n const start = Math.max(0, i - halfWindow);\n const end = Math.min(values.length, i + halfWindow + 1);\n const windowLen = end - start;\n\n // Compute local mean\n let sum = 0;\n for (let j = start; j < end; j++) {\n sum += values[j]!;\n }\n const mean = sum / windowLen;\n\n // Compute local std\n let sumSq = 0;\n for (let j = start; j < end; j++) {\n const diff = values[j]! - mean;\n sumSq += diff * diff;\n }\n const std = Math.sqrt(sumSq / windowLen);\n\n adaptiveThreshold[i] = mean + threshold * std;\n }\n\n // Find min/max for strength normalization\n let minVal = values[0]!;\n let maxVal = values[0]!;\n for (let i = 1; i < values.length; i++) {\n const v = values[i]!;\n if (v < minVal) minVal = v;\n if (v > maxVal) maxVal = v;\n }\n const range = maxVal - minVal;\n const normalize = range > 0 ? (v: number) => (v - minVal) / range : () => 0.5;\n\n // Find peaks\n const peakIndices: number[] = [];\n const peakStrengths: number[] = [];\n\n for (let i = preMax; i < values.length - postMax; i++) {\n const currentVal = values[i]!;\n\n // Skip if below adaptive threshold\n if (currentVal < adaptiveThreshold[i]!) continue;\n\n // Check if local maximum\n let isMax = true;\n\n for (let j = 1; j <= preMax; j++) {\n if (values[i - j]! >= currentVal) {\n isMax = false;\n break;\n }\n }\n\n if (isMax) {\n for (let j = 1; j <= postMax; j++) {\n if (values[i + j]! > currentVal) {\n isMax = false;\n break;\n }\n }\n }\n\n if (isMax) {\n peakIndices.push(i);\n peakStrengths.push(normalize(currentVal));\n }\n }\n\n // Apply minimum distance constraint\n const filteredIndices: number[] = [];\n const filteredStrengths: number[] = [];\n\n for (let i = 0; i < peakIndices.length; i++) {\n const idx = peakIndices[i]!;\n const time = times[idx]!;\n const strength = peakStrengths[i]!;\n\n let shouldKeep = true;\n\n for (let j = 0; j < filteredIndices.length; j++) {\n const prevIdx = filteredIndices[j]!;\n const prevTime = times[prevIdx]!;\n const prevStrength = filteredStrengths[j]!;\n\n if (Math.abs(time - prevTime) < minDistance) {\n if (strength > prevStrength) {\n filteredIndices[j] = idx;\n filteredStrengths[j] = strength;\n }\n shouldKeep = false;\n break;\n }\n }\n\n if (shouldKeep) {\n filteredIndices.push(idx);\n filteredStrengths.push(strength);\n }\n }\n\n // Convert to output format\n const resultTimes = new Float32Array(filteredIndices.length);\n const resultStrengths = new Float32Array(filteredStrengths.length);\n\n for (let i = 0; i < filteredIndices.length; i++) {\n resultTimes[i] = times[filteredIndices[i]!]!;\n resultStrengths[i] = filteredStrengths[i]!;\n }\n\n const baseResult: PeakPickingResult = {\n times: resultTimes,\n strengths: resultStrengths,\n };\n\n if (!includeThresholdCurve) {\n return baseResult;\n }\n\n // Compute normalized threshold curve for visualization\n const normalizedThreshold = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) {\n normalizedThreshold[i] = range > 0\n ? Math.max(0, Math.min(1, (adaptiveThreshold[i]! - minVal) / range))\n : 0.5;\n }\n\n return {\n ...baseResult,\n thresholdCurve: normalizedThreshold,\n thresholdTimes: times,\n } as AdaptivePeakPickingResult;\n}\n\n/**\n * Hysteresis gate parameters for peak filtering.\n */\nexport interface HysteresisGateParams {\n /** Upper threshold (0-1) - signal must exceed this to trigger \"on\" state */\n onThreshold: number;\n /** Lower threshold (0-1) - signal must fall below this to trigger \"off\" state */\n offThreshold: number;\n /** Minimum time between peaks in seconds */\n minDistance: number;\n}\n\n/**\n * Apply hysteresis gating to peaks.\n * Peaks are only kept if the signal has dropped below offThreshold since the last peak.\n * This prevents multiple triggers during sustained high-value regions.\n *\n * @param times - Time values of the original signal\n * @param values - Values of the original signal (for checking hysteresis)\n * @param peakTimes - Times of detected peaks\n * @param peakStrengths - Strengths of detected peaks\n * @param params - Hysteresis gate parameters\n * @returns Filtered peaks after hysteresis gating\n */\nexport function applyHysteresisGate(\n times: Float32Array,\n values: Float32Array,\n peakTimes: Float32Array,\n peakStrengths: Float32Array,\n params: HysteresisGateParams\n): PeakPickingResult {\n const { onThreshold, offThreshold, minDistance } = params;\n\n if (peakTimes.length === 0) {\n return { times: new Float32Array(0), strengths: new Float32Array(0) };\n }\n\n // Normalize values to 0-1 range\n let minVal = values[0]!;\n let maxVal = values[0]!;\n for (let i = 1; i < values.length; i++) {\n const v = values[i]!;\n if (v < minVal) minVal = v;\n if (v > maxVal) maxVal = v;\n }\n const range = maxVal - minVal;\n const normalize = range > 0 ? (v: number) => (v - minVal) / range : () => 0.5;\n\n // Build time-to-index lookup (approximate)\n const getIndexForTime = (t: number): number => {\n // Binary search for closest time\n let lo = 0;\n let hi = times.length - 1;\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (times[mid]! < t) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return lo;\n };\n\n const filteredTimes: number[] = [];\n const filteredStrengths: number[] = [];\n let lastPeakTime = -Infinity;\n let gateOpen = true; // Start with gate open\n\n for (let i = 0; i < peakTimes.length; i++) {\n const peakTime = peakTimes[i]!;\n const peakStrength = peakStrengths[i]!;\n\n // Check if we've met the minimum distance requirement\n if (peakTime - lastPeakTime < minDistance) {\n continue;\n }\n\n // If gate is closed, check if signal has dropped below offThreshold since last peak\n if (!gateOpen) {\n const startIdx = getIndexForTime(lastPeakTime);\n const endIdx = getIndexForTime(peakTime);\n\n // Check if signal dropped below offThreshold at any point\n for (let j = startIdx; j < endIdx && j < values.length; j++) {\n if (normalize(values[j]!) < offThreshold) {\n gateOpen = true;\n break;\n }\n }\n }\n\n // If gate is open and peak exceeds onThreshold, keep it\n if (gateOpen && peakStrength >= onThreshold) {\n filteredTimes.push(peakTime);\n filteredStrengths.push(peakStrength);\n lastPeakTime = peakTime;\n gateOpen = false; // Close gate after peak\n }\n }\n\n return {\n times: new Float32Array(filteredTimes),\n strengths: new Float32Array(filteredStrengths),\n };\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: 2,\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 /** The audio source this band belongs to. Defaults to \"mixdown\". */\n sourceId?: string;\n }\n): FrequencyBand {\n const now = new Date().toISOString();\n return {\n id: options?.id ?? generateBandId(),\n label,\n sourceId: options?.sourceId ?? \"mixdown\",\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 /** The audio source this band belongs to. Defaults to \"mixdown\". */\n sourceId?: string;\n }\n): FrequencyBand {\n const now = new Date().toISOString();\n return {\n id: options?.id ?? generateBandId(),\n label,\n sourceId: options?.sourceId ?? \"mixdown\",\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 * @param sourceId - The audio source these bands belong to. Defaults to \"mixdown\".\n * @returns Array of FrequencyBand objects\n */\nexport function createStandardBands(duration: number, sourceId: string = \"mixdown\"): 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 sourceId,\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 belonging to a specific audio source.\n *\n * @param structure - Frequency band structure (can be null)\n * @param sourceId - The audio source ID (\"mixdown\" or stem ID)\n * @returns Array of bands for that source, sorted by sortOrder\n */\nexport function bandsForSource(\n structure: FrequencyBandStructure | null,\n sourceId: string\n): FrequencyBand[] {\n if (!structure) return [];\n return sortBands(structure.bands.filter((band) => band.sourceId === sourceId));\n}\n\n/**\n * Get all enabled bands belonging to a specific audio source.\n *\n * @param structure - Frequency band structure (can be null)\n * @param sourceId - The audio source ID (\"mixdown\" or stem ID)\n * @returns Array of enabled bands for that source, sorted by sortOrder\n */\nexport function enabledBandsForSource(\n structure: FrequencyBandStructure | null,\n sourceId: string\n): FrequencyBand[] {\n if (!structure) return [];\n return sortBands(\n structure.bands.filter((band) => band.sourceId === sourceId && band.enabled)\n );\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 * @param sourceId - Optional: filter to a specific audio source\n * @returns Array of active bands\n */\nexport function bandsActiveAt(\n structure: FrequencyBandStructure | null,\n time: number,\n sourceId?: string\n): FrequencyBand[] {\n if (!structure) return [];\n\n return structure.bands.filter((band) => {\n if (!band.enabled) return false;\n if (sourceId !== undefined && band.sourceId !== sourceId) 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 * Compute spectral centroid for a frequency band.\n *\n * Returns the weighted average of frequency bins within the band (center of mass).\n * Output is in Hz per frame.\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 centroid in Hz\n */\nexport function bandSpectralCentroid(\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 binHz = masked.sampleRate / masked.fftSize;\n const out = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const mags = masked.magnitudes[t];\n\n if (!mags) {\n out[t] = 0;\n continue;\n }\n\n let num = 0;\n let den = 0;\n\n // Weighted average: centroid = Σ(f * m) / Σ(m)\n for (let k = 0; k < nBins; k++) {\n const m = mags[k] ?? 0;\n if (m > 0) {\n const f = k * binHz;\n num += f * m;\n den += m;\n }\n }\n\n out[t] = den > 0 ? num / den : 0;\n }\n\n return {\n kind: \"bandMir1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandSpectralCentroid\",\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 case \"bandSpectralCentroid\":\n result = bandSpectralCentroid(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 case \"bandSpectralCentroid\":\n return \"Spectral Centroid\";\n default:\n return fn;\n }\n}\n","/**\n * Band Event Extraction for F3.\n *\n * These functions extract discrete events (onset peaks, beat candidates)\n * from band-scoped 1D signals.\n */\n\nimport type {\n BandMir1DResult,\n BandEventFunctionId,\n BandEventsResult,\n BandMirEvent,\n BandEventDiagnostics,\n MirRunMeta,\n MirRunTimings,\n} from \"../types\";\nimport { peakPick, type PeakPickOptions } from \"./peakPick\";\n\n// Re-export types for convenience\nexport type { BandEventFunctionId, BandEventsResult, BandMirEvent, BandEventDiagnostics };\n\n// ----------------------------\n// Options\n// ----------------------------\n\nexport type BandOnsetPeaksOptions = {\n /** Minimum inter-peak interval in seconds. Default: 0.0625 (~0.125 beats at 120 BPM). */\n minIntervalSec?: number;\n /** Adaptive threshold factor. Default: 0.8 (conservative for bands). */\n adaptiveFactor?: number;\n /** Use strict peak detection (> neighbors). Default: true. */\n strict?: boolean;\n};\n\nexport type BandBeatCandidatesOptions = {\n /** Minimum inter-candidate interval in seconds. Default: 0.1. */\n minIntervalSec?: number;\n /** Threshold factor for adaptive detection. Lower = more candidates. Default: 0.5. */\n thresholdFactor?: number;\n};\n\n// ----------------------------\n// Internal Helpers\n// ----------------------------\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nfunction createMeta(startMs: number): MirRunMeta {\n const endMs = nowMs();\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 computeEventDiagnostics(\n events: BandMirEvent[],\n durationSec: number\n): BandEventDiagnostics {\n const eventCount = events.length;\n const eventsPerSecond = durationSec > 0 ? eventCount / durationSec : 0;\n const warnings: string[] = [];\n\n // Check for sparse or dense event streams\n if (durationSec > 1 && eventCount === 0) {\n warnings.push(\"No events detected - signal may be too quiet or noisy\");\n } else if (eventsPerSecond > 20) {\n warnings.push(\"Very high event density (>20/sec) - consider adjusting threshold\");\n } else if (durationSec > 10 && eventsPerSecond < 0.1) {\n warnings.push(\"Very sparse events (<0.1/sec) - signal may not be active\");\n }\n\n return {\n eventCount,\n eventsPerSecond,\n warnings,\n };\n}\n\n// ----------------------------\n// Band Event Functions\n// ----------------------------\n\n/**\n * Extract onset peaks from a band MIR 1D signal.\n *\n * Uses peak picking with conservative defaults optimized for band-scoped\n * extraction. Typically applied to bandOnsetStrength or bandAmplitudeEnvelope.\n *\n * @param signal - The band MIR 1D result to extract peaks from\n * @param options - Peak picking options\n * @returns Band events result with onset peaks\n */\nexport function bandOnsetPeaks(\n signal: BandMir1DResult,\n options?: BandOnsetPeaksOptions\n): BandEventsResult {\n const startMs = nowMs();\n\n const minIntervalSec = options?.minIntervalSec ?? 0.0625;\n const adaptiveFactor = options?.adaptiveFactor ?? 0.8;\n const strict = options?.strict ?? true;\n\n const { times, values } = signal;\n\n // Peak pick the signal\n const pickOptions: PeakPickOptions = {\n minIntervalSec,\n adaptive: {\n method: \"meanStd\",\n factor: adaptiveFactor,\n },\n strict,\n };\n\n const peaks = peakPick(times, values, pickOptions);\n\n // Normalize weights to 0-1 range\n const maxStrength = peaks.reduce((max, p) => Math.max(max, p.strength), 0);\n\n const events: BandMirEvent[] = peaks.map((p) => ({\n time: p.time,\n weight: maxStrength > 0 ? p.strength / maxStrength : 1,\n }));\n\n // Compute duration for diagnostics\n const duration = times.length >= 2\n ? (times[times.length - 1] ?? 0) - (times[0] ?? 0)\n : 0;\n\n return {\n kind: \"bandEvents\",\n bandId: signal.bandId,\n bandLabel: signal.bandLabel,\n fn: \"bandOnsetPeaks\",\n events,\n sourceSignal: {\n fn: signal.fn,\n times: signal.times,\n values: signal.values,\n },\n meta: createMeta(startMs),\n diagnostics: computeEventDiagnostics(events, duration),\n };\n}\n\n/**\n * Extract beat candidates from a band's onset peaks.\n *\n * Similar to full-track beat candidate detection but simplified for\n * single-band input. Uses the onset peaks to identify beat-like events.\n *\n * @param onsetPeaks - Band onset peaks result\n * @param options - Beat candidate options\n * @returns Band events result with beat candidates\n */\nexport function bandBeatCandidates(\n onsetPeaks: BandEventsResult,\n options?: BandBeatCandidatesOptions\n): BandEventsResult {\n const startMs = nowMs();\n\n const minIntervalSec = options?.minIntervalSec ?? 0.1;\n const thresholdFactor = options?.thresholdFactor ?? 0.5;\n\n // Filter onset peaks by strength threshold\n // Use adaptive threshold similar to full-track beat candidates\n const weights = onsetPeaks.events.map((e) => e.weight);\n const meanWeight = weights.length > 0\n ? weights.reduce((sum, w) => sum + w, 0) / weights.length\n : 0;\n\n // Simple std calculation\n const variance = weights.length > 0\n ? weights.reduce((sum, w) => sum + (w - meanWeight) ** 2, 0) / weights.length\n : 0;\n const stdWeight = Math.sqrt(variance);\n\n const threshold = meanWeight + thresholdFactor * stdWeight;\n\n // Filter by threshold and minimum interval\n const candidates: BandMirEvent[] = [];\n let lastTime = -Infinity;\n\n for (const event of onsetPeaks.events) {\n if (event.weight < threshold) continue;\n if (event.time - lastTime < minIntervalSec) {\n // Keep stronger event within interval\n const last = candidates[candidates.length - 1];\n if (last && event.weight > last.weight) {\n last.time = event.time;\n last.weight = event.weight;\n lastTime = event.time;\n }\n continue;\n }\n\n candidates.push({\n time: event.time,\n weight: event.weight,\n beatPosition: event.beatPosition,\n beatPhase: event.beatPhase,\n });\n lastTime = event.time;\n }\n\n // Compute duration from source signal if available\n const duration = onsetPeaks.sourceSignal?.times\n ? (onsetPeaks.sourceSignal.times.length >= 2\n ? (onsetPeaks.sourceSignal.times[onsetPeaks.sourceSignal.times.length - 1] ?? 0)\n - (onsetPeaks.sourceSignal.times[0] ?? 0)\n : 0)\n : 0;\n\n return {\n kind: \"bandEvents\",\n bandId: onsetPeaks.bandId,\n bandLabel: onsetPeaks.bandLabel,\n fn: \"bandBeatCandidates\",\n events: candidates,\n // Don't include source signal to save memory\n meta: createMeta(startMs),\n diagnostics: computeEventDiagnostics(candidates, duration),\n };\n}\n\n// ----------------------------\n// Batch Runner\n// ----------------------------\n\nexport type BandEventsBatchRequest = {\n /** Band MIR results to extract events from (keyed by bandId) */\n bandMirResults: Map<string, BandMir1DResult[]>;\n /** Event functions to run */\n functions: BandEventFunctionId[];\n /** Source signal function to use for onset peaks. Default: bandOnsetStrength */\n sourceFunction?: \"bandOnsetStrength\" | \"bandAmplitudeEnvelope\";\n /** Options for onset peaks extraction */\n onsetPeaksOptions?: BandOnsetPeaksOptions;\n /** Options for beat candidates extraction */\n beatCandidatesOptions?: BandBeatCandidatesOptions;\n};\n\nexport type BandEventsBatchResult = {\n /** Results keyed by bandId, each containing results for requested functions */\n results: Map<string, BandEventsResult[]>;\n /** Total computation time in ms */\n totalTimingMs: number;\n};\n\n/**\n * Run band event extraction for multiple bands.\n *\n * @param request - Batch request specifying bands, functions, and options\n * @returns Map of results by band ID\n */\nexport async function runBandEventsBatch(\n request: BandEventsBatchRequest\n): Promise<BandEventsBatchResult> {\n const startMs = nowMs();\n\n const results = new Map<string, BandEventsResult[]>();\n const sourceFunction = request.sourceFunction ?? \"bandOnsetStrength\";\n\n for (const [bandId, mirResults] of request.bandMirResults.entries()) {\n const bandEventResults: BandEventsResult[] = [];\n\n // Find the source signal for onset peaks\n const sourceSignal = mirResults.find((r) => r.fn === sourceFunction);\n if (!sourceSignal) {\n // Skip if source signal not available\n continue;\n }\n\n for (const fn of request.functions) {\n switch (fn) {\n case \"bandOnsetPeaks\": {\n const result = bandOnsetPeaks(sourceSignal, request.onsetPeaksOptions);\n bandEventResults.push(result);\n break;\n }\n case \"bandBeatCandidates\": {\n // Beat candidates require onset peaks first\n let onsetPeaksResult = bandEventResults.find(\n (r) => r.fn === \"bandOnsetPeaks\"\n );\n if (!onsetPeaksResult) {\n // Compute onset peaks if not already done\n onsetPeaksResult = bandOnsetPeaks(\n sourceSignal,\n request.onsetPeaksOptions\n );\n // Only add to results if explicitly requested\n if (!request.functions.includes(\"bandOnsetPeaks\")) {\n // Don't add to results, just use for beat candidates\n } else {\n bandEventResults.push(onsetPeaksResult);\n }\n }\n const result = bandBeatCandidates(\n onsetPeaksResult,\n request.beatCandidatesOptions\n );\n bandEventResults.push(result);\n break;\n }\n default: {\n // Exhaustive check\n const _exhaustive: never = fn;\n throw new Error(`Unknown band event function: ${_exhaustive}`);\n }\n }\n }\n\n if (bandEventResults.length > 0) {\n results.set(bandId, bandEventResults);\n }\n }\n\n const endMs = nowMs();\n\n return {\n results,\n totalTimingMs: endMs - startMs,\n };\n}\n\n/**\n * Get a human-readable label for a band event function.\n *\n * @param fn - Band event function ID\n * @returns Human-readable label\n */\nexport function getBandEventFunctionLabel(fn: BandEventFunctionId): string {\n switch (fn) {\n case \"bandOnsetPeaks\":\n return \"Onset Peaks\";\n case \"bandBeatCandidates\":\n return \"Beat Candidates\";\n default:\n return fn;\n }\n}\n","/**\n * Band-Scoped CQT utilities for F3.\n *\n * These functions compute CQT-derived features (harmonic energy, bass pitch motion,\n * tonal stability) for frequency bands by applying spectral masks to a CQT\n * spectrogram.\n *\n * CQT uses log-frequency bins, so band masking requires mapping Hz ranges\n * to CQT bin indices using hzToCqtBin().\n */\n\nimport type {\n FrequencyBand,\n CqtSpectrogram,\n CqtConfig,\n MirRunMeta,\n MirRunTimings,\n BandCqtFunctionId,\n BandMirDiagnostics,\n BandCqt1DResult,\n} from \"../types\";\nimport { hzToCqtBin, cqtBinToHz } from \"./cqt\";\n\n// Re-export types for convenience\nexport type { BandCqtFunctionId, BandCqt1DResult };\n\n// ----------------------------\n// Options\n// ----------------------------\n\nexport type BandCqtOptions = {\n /** Soft edge width in bins for mask transitions. Default: 0 */\n edgeSmoothBins?: number;\n /** Optional cancellation hook */\n isCancelled?: () => boolean;\n};\n\n// ----------------------------\n// Internal Helpers\n// ----------------------------\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nfunction createMeta(startMs: number): MirRunMeta {\n const endMs = nowMs();\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 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 CQT energy - check frequency range\");\n }\n if (emptyCount > totalFrames * 0.5) {\n warnings.push(\"More than half of frames are empty in CQT - band may not be active\");\n }\n\n return {\n meanEnergyRetained,\n weakFrameCount: weakCount,\n emptyFrameCount: emptyCount,\n totalFrames,\n warnings,\n };\n}\n\n/**\n * Get the frequency bounds at a specific time for a band.\n * Returns the bounds from the first matching segment, or the band's overall bounds.\n */\nfunction getBandBoundsAtTime(\n band: FrequencyBand,\n timeSec: number\n): { lowHz: number; highHz: number } {\n // Find the segment containing this time\n for (const seg of band.frequencyShape) {\n if (timeSec >= seg.startTime && timeSec < seg.endTime) {\n // Linear interpolation within segment\n const ratio = (timeSec - seg.startTime) / (seg.endTime - seg.startTime);\n const lowHz = seg.lowHzStart + ratio * (seg.lowHzEnd - seg.lowHzStart);\n const highHz = seg.highHzStart + ratio * (seg.highHzEnd - seg.highHzStart);\n return { lowHz, highHz };\n }\n }\n\n // Fallback to first segment bounds\n const first = band.frequencyShape[0];\n if (first) {\n return { lowHz: first.lowHzStart, highHz: first.highHzStart };\n }\n\n // Ultimate fallback\n return { lowHz: 20, highHz: 20000 };\n}\n\n// ----------------------------\n// CQT Band Masking\n// ----------------------------\n\nexport type MaskedCqtSpectrogram = {\n /** Original CQT times */\n times: Float32Array;\n /** Masked CQT magnitudes */\n magnitudes: Float32Array[];\n /** CQT config */\n config: CqtConfig;\n /** Energy retained per frame (0-1) */\n energyRetainedPerFrame: Float32Array;\n /** CQT bin frequencies */\n binFrequencies: Float32Array;\n};\n\n/**\n * Apply a frequency band mask to a CQT spectrogram.\n *\n * Maps the band's Hz range to CQT bin indices and masks accordingly.\n *\n * @param cqt - Source CQT spectrogram\n * @param band - Frequency band to apply\n * @param options - Masking options\n * @returns Masked CQT spectrogram with energy retention diagnostics\n */\nexport function applyBandMaskToCqt(\n cqt: CqtSpectrogram,\n band: FrequencyBand,\n options?: BandCqtOptions\n): MaskedCqtSpectrogram {\n const edgeSmoothBins = options?.edgeSmoothBins ?? 0;\n\n const nFrames = cqt.times.length;\n const nBins = cqt.binFrequencies.length;\n\n const maskedMagnitudes: Float32Array[] = new Array(nFrames);\n const energyRetainedPerFrame = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = cqt.magnitudes[t];\n if (!frame) {\n maskedMagnitudes[t] = new Float32Array(nBins);\n energyRetainedPerFrame[t] = 0;\n continue;\n }\n\n const timeSec = cqt.times[t] ?? 0;\n const { lowHz, highHz } = getBandBoundsAtTime(band, timeSec);\n\n // Map Hz to CQT bin indices\n const lowBin = Math.max(0, Math.floor(hzToCqtBin(lowHz, cqt.config)));\n const highBin = Math.min(nBins, Math.ceil(hzToCqtBin(highHz, cqt.config)));\n\n const maskedFrame = new Float32Array(nBins);\n let originalEnergy = 0;\n let retainedEnergy = 0;\n\n for (let k = 0; k < nBins; k++) {\n const mag = frame[k] ?? 0;\n originalEnergy += mag * mag;\n\n if (k >= lowBin && k < highBin) {\n // Apply soft edges if requested\n let weight = 1;\n if (edgeSmoothBins > 0) {\n const distFromLow = k - lowBin;\n const distFromHigh = highBin - 1 - k;\n const minDist = Math.min(distFromLow, distFromHigh);\n if (minDist < edgeSmoothBins) {\n weight = (minDist + 1) / (edgeSmoothBins + 1);\n }\n }\n maskedFrame[k] = mag * weight;\n retainedEnergy += (mag * weight) ** 2;\n }\n }\n\n maskedMagnitudes[t] = maskedFrame;\n energyRetainedPerFrame[t] = originalEnergy > 0\n ? Math.sqrt(retainedEnergy / originalEnergy)\n : 0;\n }\n\n return {\n times: cqt.times,\n magnitudes: maskedMagnitudes,\n config: cqt.config,\n energyRetainedPerFrame,\n binFrequencies: cqt.binFrequencies,\n };\n}\n\n// ----------------------------\n// CQT Band Signal Functions\n// ----------------------------\n\n/**\n * Compute harmonic energy for a frequency band using CQT.\n *\n * Measures the ratio of energy at harmonic intervals within the band.\n * Adapted from cqtSignals.ts:harmonicEnergy.\n *\n * @param cqt - Source CQT spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band CQT result with harmonic energy\n */\nexport function bandCqtHarmonicEnergy(\n cqt: CqtSpectrogram,\n band: FrequencyBand,\n options?: BandCqtOptions\n): BandCqt1DResult {\n const startMs = nowMs();\n\n // Apply band mask to CQT\n const masked = applyBandMaskToCqt(cqt, band, options);\n\n const nFrames = masked.times.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n if (options?.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n const frame = masked.magnitudes[t];\n if (!frame) {\n values[t] = 0;\n continue;\n }\n\n // Find total energy\n let totalEnergy = 0;\n for (let k = 0; k < frame.length; k++) {\n const mag = frame[k] ?? 0;\n totalEnergy += mag * mag;\n }\n\n if (totalEnergy === 0) {\n values[t] = 0;\n continue;\n }\n\n // Find strongest bin as fundamental candidate\n let maxMag = 0;\n let fundamentalBin = 0;\n for (let k = 0; k < frame.length; k++) {\n const mag = frame[k] ?? 0;\n if (mag > maxMag) {\n maxMag = mag;\n fundamentalBin = k;\n }\n }\n\n const fundamentalFreq = cqtBinToHz(fundamentalBin, cqt.config);\n\n // Sum energy at harmonic positions\n let harmonicEnergy = 0;\n const numHarmonics = 6;\n\n for (let h = 1; h <= numHarmonics; h++) {\n const harmonicFreq = fundamentalFreq * h;\n const harmonicBin = Math.round(hzToCqtBin(harmonicFreq, cqt.config));\n\n if (harmonicBin >= 0 && harmonicBin < frame.length) {\n const mag = frame[harmonicBin] ?? 0;\n const weight = 1 / h;\n harmonicEnergy += mag * mag * weight;\n }\n }\n\n // Normalize by expected harmonic weight sum\n let weightSum = 0;\n for (let h = 1; h <= numHarmonics; h++) {\n weightSum += 1 / h;\n }\n harmonicEnergy /= weightSum;\n\n values[t] = Math.min(1, harmonicEnergy / totalEnergy);\n }\n\n // Normalize to [0, 1] using min-max\n const normalized = normalizeMinMax(values);\n\n return {\n kind: \"bandCqt1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandCqtHarmonicEnergy\",\n times: masked.times,\n values: normalized,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n/**\n * Compute bass pitch motion for a frequency band using CQT.\n *\n * Measures pitch movement in bass-range CQT bins within the band.\n * Most meaningful for bands overlapping the bass range (20-300 Hz).\n *\n * @param cqt - Source CQT spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band CQT result with bass pitch motion\n */\nexport function bandCqtBassPitchMotion(\n cqt: CqtSpectrogram,\n band: FrequencyBand,\n options?: BandCqtOptions\n): BandCqt1DResult {\n const startMs = nowMs();\n\n // Apply band mask to CQT\n const masked = applyBandMaskToCqt(cqt, band, options);\n\n const nFrames = masked.times.length;\n\n // Bass range constants\n const BASS_MIN_HZ = 20;\n const BASS_MAX_HZ = 300;\n\n // Find bass bin range within band\n const bassStartBin = Math.max(0, Math.floor(hzToCqtBin(BASS_MIN_HZ, cqt.config)));\n const bassEndBin = Math.min(\n masked.binFrequencies.length,\n Math.ceil(hzToCqtBin(BASS_MAX_HZ, cqt.config))\n );\n const bassNumBins = bassEndBin - bassStartBin;\n\n if (bassNumBins <= 0) {\n // Band doesn't overlap bass range\n return {\n kind: \"bandCqt1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandCqtBassPitchMotion\",\n times: masked.times,\n values: new Float32Array(nFrames),\n meta: createMeta(startMs),\n diagnostics: {\n ...computeDiagnostics(masked.energyRetainedPerFrame),\n warnings: [\"Band does not overlap bass frequency range (20-300 Hz)\"],\n },\n };\n }\n\n // Compute bass centroid for each frame\n const centroids = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = masked.magnitudes[t];\n if (!frame) continue;\n\n // Compute weighted centroid in bass range\n let num = 0;\n let den = 0;\n\n for (let k = bassStartBin; k < bassEndBin; k++) {\n const mag = frame[k] ?? 0;\n if (mag > 0) {\n num += k * mag;\n den += mag;\n }\n }\n\n centroids[t] = den > 0 ? num / den : bassStartBin + bassNumBins / 2;\n }\n\n // Compute motion as absolute difference between consecutive frames\n const motion = new Float32Array(nFrames);\n for (let t = 1; t < nFrames; t++) {\n motion[t] = Math.abs((centroids[t] ?? 0) - (centroids[t - 1] ?? 0));\n }\n if (nFrames > 1) {\n motion[0] = motion[1] ?? 0;\n }\n\n // Normalize to [0, 1]\n const normalized = normalizeMinMax(motion);\n\n return {\n kind: \"bandCqt1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandCqtBassPitchMotion\",\n times: masked.times,\n values: normalized,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n/**\n * Compute tonal stability for a frequency band using CQT.\n *\n * Measures consistency of chroma distribution over time within the band.\n * Adapted from cqtSignals.ts:tonalStability.\n *\n * @param cqt - Source CQT spectrogram\n * @param band - Frequency band to analyze\n * @param options - Computation options\n * @returns Band CQT result with tonal stability\n */\nexport function bandCqtTonalStability(\n cqt: CqtSpectrogram,\n band: FrequencyBand,\n options?: BandCqtOptions\n): BandCqt1DResult {\n const startMs = nowMs();\n\n // Apply band mask to CQT\n const masked = applyBandMaskToCqt(cqt, band, options);\n\n const nFrames = masked.times.length;\n const CHROMA_BINS = 12;\n const WINDOW_FRAMES = 20; // ~500ms at typical hop sizes\n\n // Compute chroma for each frame\n const chromas: Float32Array[] = new Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = masked.magnitudes[t];\n const chroma = new Float32Array(CHROMA_BINS);\n\n if (frame) {\n const binsPerSemitone = cqt.binsPerOctave / CHROMA_BINS;\n\n for (let k = 0; k < frame.length; k++) {\n const chromaBin = Math.floor((k % cqt.binsPerOctave) / binsPerSemitone) % CHROMA_BINS;\n const mag = frame[k] ?? 0;\n chroma[chromaBin] = (chroma[chromaBin] ?? 0) + mag * mag;\n }\n\n // Normalize\n let sum = 0;\n for (let c = 0; c < CHROMA_BINS; c++) {\n sum += chroma[c] ?? 0;\n }\n if (sum > 0) {\n for (let c = 0; c < CHROMA_BINS; c++) {\n chroma[c] = (chroma[c] ?? 0) / sum;\n }\n }\n }\n\n chromas[t] = chroma;\n }\n\n // Compute stability over sliding window\n const halfWindow = Math.floor(WINDOW_FRAMES / 2);\n const instability = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const windowStart = Math.max(0, t - halfWindow);\n const windowEnd = Math.min(nFrames, t + halfWindow + 1);\n const windowSize = windowEnd - windowStart;\n\n // Average chroma over window\n const avgChroma = new Float32Array(CHROMA_BINS);\n for (let w = windowStart; w < windowEnd; w++) {\n const chroma = chromas[w];\n if (chroma) {\n for (let c = 0; c < CHROMA_BINS; c++) {\n avgChroma[c] = (avgChroma[c] ?? 0) + (chroma[c] ?? 0);\n }\n }\n }\n for (let c = 0; c < CHROMA_BINS; c++) {\n avgChroma[c] = (avgChroma[c] ?? 0) / windowSize;\n }\n\n // Compute variance\n let totalVariance = 0;\n for (let w = windowStart; w < windowEnd; w++) {\n const chroma = chromas[w];\n if (chroma) {\n for (let c = 0; c < CHROMA_BINS; c++) {\n const diff = (chroma[c] ?? 0) - (avgChroma[c] ?? 0);\n totalVariance += diff * diff;\n }\n }\n }\n totalVariance /= windowSize * CHROMA_BINS;\n\n instability[t] = totalVariance;\n }\n\n // Normalize instability and invert to get stability\n const normalizedInstability = normalizeMinMax(instability);\n const stability = new Float32Array(nFrames);\n for (let t = 0; t < nFrames; t++) {\n stability[t] = 1 - (normalizedInstability[t] ?? 0);\n }\n\n return {\n kind: \"bandCqt1d\",\n bandId: band.id,\n bandLabel: band.label,\n fn: \"bandCqtTonalStability\",\n times: masked.times,\n values: stability,\n meta: createMeta(startMs),\n diagnostics: computeDiagnostics(masked.energyRetainedPerFrame),\n };\n}\n\n// ----------------------------\n// Utility Functions\n// ----------------------------\n\nfunction normalizeMinMax(values: Float32Array): Float32Array {\n const n = values.length;\n if (n === 0) return new Float32Array(0);\n\n let min = Infinity;\n let max = -Infinity;\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 const out = new Float32Array(n);\n const range = max - min;\n\n if (range === 0 || !Number.isFinite(range)) {\n out.fill(0.5);\n return out;\n }\n\n for (let i = 0; i < n; i++) {\n out[i] = ((values[i] ?? 0) - min) / range;\n }\n\n return out;\n}\n\n// ----------------------------\n// Batch Runner\n// ----------------------------\n\nexport type BandCqtBatchRequest = {\n bands: FrequencyBand[];\n functions: BandCqtFunctionId[];\n /** Maximum number of bands to process concurrently. Default: 4 */\n maxConcurrent?: number;\n};\n\nexport type BandCqtBatchResult = {\n /** Results keyed by bandId */\n results: Map<string, BandCqt1DResult[]>;\n /** Total computation time in ms */\n totalTimingMs: number;\n};\n\n/**\n * Run band CQT analysis for multiple bands.\n *\n * @param cqt - Source CQT 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 runBandCqtBatch(\n cqt: CqtSpectrogram,\n request: BandCqtBatchRequest,\n options?: BandCqtOptions\n): Promise<BandCqtBatchResult> {\n const startMs = nowMs();\n\n const results = new Map<string, BandCqt1DResult[]>();\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: BandCqt1DResult[] = [];\n\n for (const fn of request.functions) {\n if (options?.isCancelled?.()) {\n throw new Error(\"@octoseq/mir: cancelled\");\n }\n\n let result: BandCqt1DResult;\n\n switch (fn) {\n case \"bandCqtHarmonicEnergy\":\n result = bandCqtHarmonicEnergy(cqt, band, options);\n break;\n case \"bandCqtBassPitchMotion\":\n result = bandCqtBassPitchMotion(cqt, band, options);\n break;\n case \"bandCqtTonalStability\":\n result = bandCqtTonalStability(cqt, band, options);\n break;\n default:\n // Exhaustive check\n const _exhaustive: never = fn;\n throw new Error(`Unknown band CQT function: ${_exhaustive}`);\n }\n\n bandResults.push(result);\n }\n\n results.set(band.id, bandResults);\n }\n\n const endMs = nowMs();\n\n return {\n results,\n totalTimingMs: endMs - startMs,\n };\n}\n\n/**\n * Get a human-readable label for a band CQT function.\n *\n * @param fn - Band CQT function ID\n * @returns Human-readable label\n */\nexport function getBandCqtFunctionLabel(fn: BandCqtFunctionId): string {\n switch (fn) {\n case \"bandCqtHarmonicEnergy\":\n return \"Harmonic Energy (CQT)\";\n case \"bandCqtBassPitchMotion\":\n return \"Bass Pitch Motion (CQT)\";\n case \"bandCqtTonalStability\":\n return \"Tonal Stability (CQT)\";\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 sourceId: \"mixdown\", // Proposals default to mixdown; user assigns sourceId on promotion\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","/**\n * Custom Signal Reduction\n *\n * Provides algorithms for reducing 2D spectral data (mel spectrogram, HPSS,\n * MFCC, etc.) to 1D signals with configurable bin ranges and reduction methods.\n */\n\n// ----------------------------\n// Types\n// ----------------------------\n\n/**\n * Input format for 2D time-aligned data.\n * Shape: data[timeIndex][featureIndex]\n */\nexport interface ReductionInput {\n /** 2D data: data[timeIndex][featureIndex] */\n data: Float32Array[];\n /** Time in seconds for each frame */\n times: Float32Array;\n}\n\n/**\n * Reduction algorithm identifiers.\n */\nexport type ReductionAlgorithmId =\n | \"mean\"\n | \"max\"\n | \"sum\"\n | \"variance\"\n | \"amplitude\"\n | \"spectralFlux\"\n | \"spectralCentroid\"\n | \"onsetStrength\";\n\n/**\n * Options for bin range selection.\n */\nexport interface BinRangeOptions {\n /** Low bin index (inclusive). Default: 0 */\n lowBin?: number;\n /** High bin index (exclusive). Default: all bins */\n highBin?: number;\n}\n\n/**\n * Options for onset strength algorithm.\n */\nexport interface OnsetStrengthOptions {\n /** Smoothing window in milliseconds. Default: 10 */\n smoothMs?: number;\n /** Whether to log-compress before differencing. Default: true */\n useLog?: boolean;\n /** Difference method. Default: \"rectified\" */\n diffMethod?: \"rectified\" | \"abs\";\n}\n\n/**\n * Options for spectral flux algorithm.\n */\nexport interface SpectralFluxOptions {\n /** Whether to normalize frames before computing flux. Default: true */\n normalized?: boolean;\n}\n\n/**\n * Combined options for reduction.\n */\nexport interface ReductionOptions {\n /** Bin range selection */\n binRange?: BinRangeOptions;\n /** Onset strength parameters */\n onsetStrength?: OnsetStrengthOptions;\n /** Spectral flux parameters */\n spectralFlux?: SpectralFluxOptions;\n}\n\n/**\n * Result of a reduction operation.\n */\nexport interface ReductionResult {\n /** Frame times in seconds */\n times: Float32Array;\n /** Reduced values per frame */\n values: Float32Array;\n /** Value range for normalization */\n valueRange: { min: number; max: number };\n}\n\n// ----------------------------\n// Internal Helpers\n// ----------------------------\n\nfunction logCompress(x: number): number {\n return Math.log1p(Math.max(0, x));\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 const half = Math.floor(windowFrames / 2);\n\n // Prefix sums for 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 computeValueRange(values: Float32Array): { min: number; max: number } {\n if (values.length === 0) {\n return { min: 0, max: 0 };\n }\n\n let min = values[0] ?? 0;\n let max = values[0] ?? 0;\n\n for (let i = 1; i < values.length; 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\nfunction getBinRange(numBins: number, options?: BinRangeOptions): { low: number; high: number } {\n const low = Math.max(0, options?.lowBin ?? 0);\n const high = Math.min(numBins, options?.highBin ?? numBins);\n return { low, high };\n}\n\n// ----------------------------\n// Reduction Algorithms\n// ----------------------------\n\n/**\n * Mean: Average value across bins per frame.\n */\nfunction reduceMean(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = input.data[t];\n if (!frame || frame.length === 0) {\n values[t] = 0;\n continue;\n }\n\n const { low, high } = getBinRange(frame.length, options?.binRange);\n let sum = 0;\n const count = high - low;\n\n for (let k = low; k < high; k++) {\n sum += frame[k] ?? 0;\n }\n\n values[t] = count > 0 ? sum / count : 0;\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n/**\n * Max: Maximum value across bins per frame.\n */\nfunction reduceMax(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = input.data[t];\n if (!frame || frame.length === 0) {\n values[t] = 0;\n continue;\n }\n\n const { low, high } = getBinRange(frame.length, options?.binRange);\n let max = -Infinity;\n\n for (let k = low; k < high; k++) {\n const v = frame[k] ?? 0;\n if (v > max) max = v;\n }\n\n values[t] = max === -Infinity ? 0 : max;\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n/**\n * Sum: Sum of bin values per frame.\n */\nfunction reduceSum(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = input.data[t];\n if (!frame || frame.length === 0) {\n values[t] = 0;\n continue;\n }\n\n const { low, high } = getBinRange(frame.length, options?.binRange);\n let sum = 0;\n\n for (let k = low; k < high; k++) {\n sum += frame[k] ?? 0;\n }\n\n values[t] = sum;\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n/**\n * Variance: Variance of bin values per frame.\n */\nfunction reduceVariance(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = input.data[t];\n if (!frame || frame.length === 0) {\n values[t] = 0;\n continue;\n }\n\n const { low, high } = getBinRange(frame.length, options?.binRange);\n const count = high - low;\n\n if (count <= 1) {\n values[t] = 0;\n continue;\n }\n\n // Compute mean\n let sum = 0;\n for (let k = low; k < high; k++) {\n sum += frame[k] ?? 0;\n }\n const mean = sum / count;\n\n // Compute variance\n let variance = 0;\n for (let k = low; k < high; k++) {\n const d = (frame[k] ?? 0) - mean;\n variance += d * d;\n }\n\n values[t] = variance / count;\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n/**\n * Amplitude: Sum of magnitudes (energy envelope).\n * Same as sum but semantically represents amplitude envelope.\n */\nfunction reduceAmplitude(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n // Amplitude is conceptually the same as sum for magnitude data\n return reduceSum(input, options);\n}\n\n/**\n * Spectral Flux: L1 distance between consecutive (optionally normalized) frames.\n */\nfunction reduceSpectralFlux(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n const normalized = options?.spectralFlux?.normalized ?? true;\n\n if (nFrames === 0) {\n return {\n times: input.times,\n values,\n valueRange: { min: 0, max: 0 },\n };\n }\n\n // First frame has no previous\n values[0] = 0;\n let prevNorm: Float32Array | null = null;\n\n for (let t = 0; t < nFrames; t++) {\n const frame = input.data[t];\n if (!frame || frame.length === 0) {\n values[t] = 0;\n prevNorm = null;\n continue;\n }\n\n const { low, high } = getBinRange(frame.length, options?.binRange);\n\n // Extract and optionally normalize\n let curNorm: Float32Array;\n\n if (normalized) {\n let sum = 0;\n for (let k = low; k < high; k++) {\n sum += frame[k] ?? 0;\n }\n\n if (sum <= 0) {\n values[t] = 0;\n prevNorm = null;\n continue;\n }\n\n const inv = 1 / sum;\n curNorm = new Float32Array(high - low);\n for (let k = low; k < high; k++) {\n curNorm[k - low] = (frame[k] ?? 0) * inv;\n }\n } else {\n curNorm = new Float32Array(high - low);\n for (let k = low; k < high; k++) {\n curNorm[k - low] = frame[k] ?? 0;\n }\n }\n\n if (!prevNorm || prevNorm.length !== curNorm.length) {\n values[t] = 0;\n prevNorm = curNorm;\n continue;\n }\n\n // L1 distance\n let flux = 0;\n for (let k = 0; k < curNorm.length; k++) {\n flux += Math.abs((curNorm[k] ?? 0) - (prevNorm[k] ?? 0));\n }\n\n values[t] = flux;\n prevNorm = curNorm;\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n/**\n * Spectral Centroid: Weighted center of mass in bin space.\n * Returns bin index (not Hz - caller can convert if needed).\n */\nfunction reduceSpectralCentroid(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n\n for (let t = 0; t < nFrames; t++) {\n const frame = input.data[t];\n if (!frame || frame.length === 0) {\n values[t] = 0;\n continue;\n }\n\n const { low, high } = getBinRange(frame.length, options?.binRange);\n\n let num = 0;\n let den = 0;\n\n for (let k = low; k < high; k++) {\n const m = frame[k] ?? 0;\n if (m > 0) {\n num += k * m;\n den += m;\n }\n }\n\n values[t] = den > 0 ? num / den : 0;\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n/**\n * Onset Strength: Temporal derivative with optional log compression and smoothing.\n */\nfunction reduceOnsetStrength(input: ReductionInput, options?: ReductionOptions): ReductionResult {\n const nFrames = input.data.length;\n const values = new Float32Array(nFrames);\n\n const useLog = options?.onsetStrength?.useLog ?? true;\n const smoothMs = options?.onsetStrength?.smoothMs ?? 10;\n const diffMethod = options?.onsetStrength?.diffMethod ?? \"rectified\";\n\n if (nFrames === 0) {\n return {\n times: input.times,\n values,\n valueRange: { min: 0, max: 0 },\n };\n }\n\n // First frame has no previous\n values[0] = 0;\n\n for (let t = 1; t < nFrames; t++) {\n const cur = input.data[t];\n const prev = input.data[t - 1];\n\n if (!cur || !prev || cur.length === 0 || prev.length === 0) {\n values[t] = 0;\n continue;\n }\n\n const { low, high } = getBinRange(cur.length, options?.binRange);\n let sum = 0;\n let binsWithData = 0;\n\n for (let k = low; k < high; k++) {\n let a = cur[k] ?? 0;\n let b = prev[k] ?? 0;\n\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 values[t] = binsWithData > 0 ? sum / binsWithData : 0;\n }\n\n // Apply smoothing\n if (smoothMs > 0 && nFrames >= 2) {\n const dt = (input.times[1] ?? 0) - (input.times[0] ?? 0);\n if (dt > 0) {\n const windowFrames = Math.max(1, Math.round((smoothMs / 1000) / dt));\n const smoothed = movingAverage(values, windowFrames | 1);\n return {\n times: input.times,\n values: smoothed,\n valueRange: computeValueRange(smoothed),\n };\n }\n }\n\n return {\n times: input.times,\n values,\n valueRange: computeValueRange(values),\n };\n}\n\n// ----------------------------\n// Main API\n// ----------------------------\n\n/**\n * Reduce 2D time-aligned data to a 1D signal using the specified algorithm.\n *\n * @param input - 2D input data (frames x bins)\n * @param algorithm - Reduction algorithm to use\n * @param options - Algorithm options including bin range selection\n * @returns Reduction result with times, values, and value range\n */\nexport function reduce2DToSignal(\n input: ReductionInput,\n algorithm: ReductionAlgorithmId,\n options?: ReductionOptions\n): ReductionResult {\n switch (algorithm) {\n case \"mean\":\n return reduceMean(input, options);\n case \"max\":\n return reduceMax(input, options);\n case \"sum\":\n return reduceSum(input, options);\n case \"variance\":\n return reduceVariance(input, options);\n case \"amplitude\":\n return reduceAmplitude(input, options);\n case \"spectralFlux\":\n return reduceSpectralFlux(input, options);\n case \"spectralCentroid\":\n return reduceSpectralCentroid(input, options);\n case \"onsetStrength\":\n return reduceOnsetStrength(input, options);\n default:\n // Exhaustive check\n const _exhaustive: never = algorithm;\n throw new Error(`Unknown reduction algorithm: ${_exhaustive}`);\n }\n}\n\n/**\n * Get human-readable label for a reduction algorithm.\n */\nexport function getReductionAlgorithmLabel(algorithm: ReductionAlgorithmId): string {\n switch (algorithm) {\n case \"mean\":\n return \"Mean\";\n case \"max\":\n return \"Maximum\";\n case \"sum\":\n return \"Sum\";\n case \"variance\":\n return \"Variance\";\n case \"amplitude\":\n return \"Amplitude Envelope\";\n case \"spectralFlux\":\n return \"Spectral Flux\";\n case \"spectralCentroid\":\n return \"Spectral Centroid\";\n case \"onsetStrength\":\n return \"Onset Strength\";\n default:\n return String(algorithm);\n }\n}\n\n/**\n * Get description for a reduction algorithm.\n */\nexport function getReductionAlgorithmDescription(algorithm: ReductionAlgorithmId): string {\n switch (algorithm) {\n case \"mean\":\n return \"Average value across all bins per frame\";\n case \"max\":\n return \"Maximum value across all bins per frame\";\n case \"sum\":\n return \"Sum of all bin values per frame\";\n case \"variance\":\n return \"Variance of bin values per frame\";\n case \"amplitude\":\n return \"Sum of magnitudes (energy envelope)\";\n case \"spectralFlux\":\n return \"Change between consecutive frames\";\n case \"spectralCentroid\":\n return \"Weighted center frequency\";\n case \"onsetStrength\":\n return \"Temporal derivative for onset detection\";\n default:\n return \"\";\n }\n}\n\n// ----------------------------\n// Polarity Types\n// ----------------------------\n\n/**\n * Polarity interpretation mode.\n * - \"signed\": Preserve direction (signal can be positive or negative)\n * - \"magnitude\": Activity level only (always positive, uses absolute value)\n */\nexport type PolarityMode = \"signed\" | \"magnitude\";\n\n/**\n * Apply polarity interpretation to a signal.\n * Called after reduction, before stabilization.\n *\n * @param values - Input signal values\n * @param mode - Polarity mode to apply\n * @returns Transformed signal values\n */\nexport function applyPolarity(values: Float32Array, mode: PolarityMode): Float32Array {\n if (mode === \"signed\") {\n // No transformation needed\n return values;\n }\n\n // Magnitude mode: apply absolute value\n const result = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) {\n result[i] = Math.abs(values[i] ?? 0);\n }\n return result;\n}\n\n// ----------------------------\n// Stabilization Types\n// ----------------------------\n\n/**\n * Stabilization mode presets.\n */\nexport type StabilizationMode = \"none\" | \"light\" | \"medium\" | \"heavy\";\n\n/**\n * Envelope mode for signal shaping.\n */\nexport type EnvelopeMode = \"raw\" | \"attackRelease\";\n\n/**\n * Options for signal stabilization.\n */\nexport interface StabilizationOptions {\n /** Smoothing intensity preset. */\n mode: StabilizationMode;\n /** Envelope shaping mode. */\n envelopeMode: EnvelopeMode;\n /** Attack time in seconds (only for attackRelease mode). */\n attackTimeSec?: number;\n /** Release time in seconds (only for attackRelease mode). */\n releaseTimeSec?: number;\n}\n\n// ----------------------------\n// Stabilization Implementation\n// ----------------------------\n\n/**\n * Get smoothing window size for a stabilization mode.\n * Returns window size in number of frames.\n */\nfunction getStabilizationWindowFrames(mode: StabilizationMode, frameTime: number): number {\n // Map mode to smoothing time in seconds\n const smoothingTimes: Record<StabilizationMode, number> = {\n none: 0,\n light: 0.01, // 10ms\n medium: 0.03, // 30ms\n heavy: 0.1, // 100ms\n };\n\n const smoothMs = smoothingTimes[mode] * 1000;\n if (smoothMs <= 0 || frameTime <= 0) return 1;\n\n return Math.max(1, Math.round((smoothMs / 1000) / frameTime)) | 1; // Ensure odd\n}\n\n/**\n * Apply attack/release envelope following.\n * Attack: how fast the signal can rise\n * Release: how fast the signal can fall\n */\nfunction applyAttackRelease(\n values: Float32Array,\n times: Float32Array,\n attackTimeSec: number,\n releaseTimeSec: number\n): Float32Array {\n const n = values.length;\n if (n === 0) return values;\n\n const out = new Float32Array(n);\n out[0] = values[0] ?? 0;\n\n for (let i = 1; i < n; i++) {\n const dt = (times[i] ?? 0) - (times[i - 1] ?? 0);\n if (dt <= 0) {\n out[i] = values[i] ?? 0;\n continue;\n }\n\n const current = values[i] ?? 0;\n const prev = out[i - 1] ?? 0;\n\n if (current > prev) {\n // Rising - apply attack time constant\n if (attackTimeSec > 0) {\n const alpha = 1 - Math.exp(-dt / attackTimeSec);\n out[i] = prev + alpha * (current - prev);\n } else {\n out[i] = current;\n }\n } else {\n // Falling - apply release time constant\n if (releaseTimeSec > 0) {\n const alpha = 1 - Math.exp(-dt / releaseTimeSec);\n out[i] = prev + alpha * (current - prev);\n } else {\n out[i] = current;\n }\n }\n }\n\n return out;\n}\n\n/**\n * Apply stabilization to a signal.\n *\n * @param values - Input signal values\n * @param times - Frame times in seconds\n * @param options - Stabilization options\n * @returns Stabilized signal values\n */\nexport function stabilizeSignal(\n values: Float32Array,\n times: Float32Array,\n options: StabilizationOptions\n): Float32Array {\n if (values.length === 0) return values;\n\n let result = values;\n\n // Step 1: Apply smoothing based on mode\n if (options.mode !== \"none\" && times.length >= 2) {\n const dt = (times[1] ?? 0) - (times[0] ?? 0);\n if (dt > 0) {\n const windowFrames = getStabilizationWindowFrames(options.mode, dt);\n if (windowFrames > 1) {\n result = movingAverage(result, windowFrames);\n }\n }\n }\n\n // Step 2: Apply envelope shaping\n if (options.envelopeMode === \"attackRelease\") {\n const attackSec = options.attackTimeSec ?? 0.01;\n const releaseSec = options.releaseTimeSec ?? 0.1;\n result = applyAttackRelease(result, times, attackSec, releaseSec);\n }\n\n return result;\n}\n\n// ----------------------------\n// Statistics Helpers\n// ----------------------------\n\n/**\n * Compute percentile values from a signal.\n *\n * @param values - Signal values\n * @param percentiles - Array of percentiles to compute (0-100)\n * @returns Object mapping percentile to value\n */\nexport function computePercentiles(\n values: Float32Array,\n percentiles: number[]\n): Record<number, number> {\n if (values.length === 0) {\n return Object.fromEntries(percentiles.map((p) => [p, 0]));\n }\n\n // Sort a copy\n const sorted = Float32Array.from(values).sort((a, b) => a - b);\n const n = sorted.length;\n\n const result: Record<number, number> = {};\n\n for (const p of percentiles) {\n const clamped = Math.max(0, Math.min(100, p));\n const index = (clamped / 100) * (n - 1);\n const lower = Math.floor(index);\n const upper = Math.min(lower + 1, n - 1);\n const frac = index - lower;\n\n // Linear interpolation\n result[p] = (sorted[lower] ?? 0) * (1 - frac) + (sorted[upper] ?? 0) * frac;\n }\n\n return result;\n}\n\n/**\n * Compute local (viewport) statistics for a signal.\n *\n * @param values - Signal values\n * @param times - Frame times in seconds\n * @param startTime - Viewport start time\n * @param endTime - Viewport end time\n * @returns Statistics within the viewport\n */\nexport function computeLocalStats(\n values: Float32Array,\n times: Float32Array,\n startTime: number,\n endTime: number\n): { min: number; max: number; p5: number; p95: number } {\n // Find frames within viewport\n const indices: number[] = [];\n for (let i = 0; i < times.length; i++) {\n const t = times[i] ?? 0;\n if (t >= startTime && t <= endTime) {\n indices.push(i);\n }\n }\n\n if (indices.length === 0) {\n return { min: 0, max: 0, p5: 0, p95: 0 };\n }\n\n // Extract values in viewport\n const viewportValues = new Float32Array(indices.length);\n for (let i = 0; i < indices.length; i++) {\n viewportValues[i] = values[indices[i] ?? 0] ?? 0;\n }\n\n // Compute stats\n const range = computeValueRange(viewportValues);\n const percentiles = computePercentiles(viewportValues, [5, 95]);\n\n return {\n min: range.min,\n max: range.max,\n p5: percentiles[5] ?? 0,\n p95: percentiles[95] ?? 0,\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 BandCqtFunctionId,\n BandEventFunctionId,\n BandMirDiagnostics,\n BandMir1DResult,\n BandCqt1DResult,\n BandMirEvent,\n BandEventDiagnostics,\n BandEventsResult,\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 type { AmplitudeEnvelopeConfig, AmplitudeEnvelopeResult } from \"./dsp/spectral\";\nexport { amplitudeEnvelope, 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// Peak Picking\n// ----------------------------\n\nexport {\n pickPeaks,\n pickPeaksAdaptive,\n computeAdaptiveThreshold,\n applyHysteresisGate,\n DEFAULT_PEAK_PICKING_PARAMS,\n type PeakPickingParams,\n type PeakPickingResult,\n type AdaptivePeakPickingResult,\n type HysteresisGateParams,\n} from \"./dsp/peakPicking\";\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 bandSpectralCentroid,\n runBandMirBatch,\n getBandMirFunctionLabel,\n} from \"./dsp/bandMir\";\n\n// ----------------------------\n// Band Events (F3)\n// ----------------------------\n\nexport type {\n BandOnsetPeaksOptions,\n BandBeatCandidatesOptions,\n BandEventsBatchRequest,\n BandEventsBatchResult,\n} from \"./dsp/bandEvents\";\nexport {\n bandOnsetPeaks,\n bandBeatCandidates,\n runBandEventsBatch,\n getBandEventFunctionLabel,\n} from \"./dsp/bandEvents\";\n\n// ----------------------------\n// Band CQT (F3)\n// ----------------------------\n\nexport type {\n BandCqtOptions,\n MaskedCqtSpectrogram,\n BandCqtBatchRequest,\n BandCqtBatchResult,\n} from \"./dsp/bandCqt\";\nexport {\n applyBandMaskToCqt,\n bandCqtHarmonicEnergy,\n bandCqtBassPitchMotion,\n bandCqtTonalStability,\n runBandCqtBatch,\n getBandCqtFunctionLabel,\n} from \"./dsp/bandCqt\";\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// Custom Signal Reduction\n// ----------------------------\n\nexport type {\n ReductionInput,\n ReductionAlgorithmId,\n BinRangeOptions,\n OnsetStrengthOptions,\n SpectralFluxOptions,\n ReductionOptions,\n ReductionResult,\n // Polarity\n PolarityMode,\n // Stabilization\n StabilizationMode,\n EnvelopeMode,\n StabilizationOptions,\n} from \"./dsp/customSignalReduction\";\nexport {\n reduce2DToSignal,\n getReductionAlgorithmLabel,\n getReductionAlgorithmDescription,\n // Polarity\n applyPolarity,\n // Stabilization\n stabilizeSignal,\n // Statistics\n computePercentiles,\n computeLocalStats,\n} from \"./dsp/customSignalReduction\";\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"]}
|