@kano/stem-daw 0.1.0
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/README.md +253 -0
- package/dist/chat-actions-54Z6URC4.js +7 -0
- package/dist/chat-actions-54Z6URC4.js.map +1 -0
- package/dist/chunk-56PWIP7O.js +1029 -0
- package/dist/chunk-56PWIP7O.js.map +1 -0
- package/dist/chunk-AAVC7KUW.js +145 -0
- package/dist/chunk-AAVC7KUW.js.map +1 -0
- package/dist/chunk-KCOOE2OP.js +1764 -0
- package/dist/chunk-KCOOE2OP.js.map +1 -0
- package/dist/chunk-LO74ZJ4H.js +23923 -0
- package/dist/chunk-LO74ZJ4H.js.map +1 -0
- package/dist/chunk-OFGZURP6.js +247 -0
- package/dist/chunk-OFGZURP6.js.map +1 -0
- package/dist/chunk-OYNES5W3.js +3085 -0
- package/dist/chunk-OYNES5W3.js.map +1 -0
- package/dist/chunk-QQ5NZTHT.js +336 -0
- package/dist/chunk-QQ5NZTHT.js.map +1 -0
- package/dist/chunk-TBXCZFAY.js +13713 -0
- package/dist/chunk-TBXCZFAY.js.map +1 -0
- package/dist/chunk-U44X6QP5.js +281 -0
- package/dist/chunk-U44X6QP5.js.map +1 -0
- package/dist/chunk-UKMELGZL.js +27 -0
- package/dist/chunk-UKMELGZL.js.map +1 -0
- package/dist/components/DAWView.d.ts +19 -0
- package/dist/components/DAWView.js +11 -0
- package/dist/components/DAWView.js.map +1 -0
- package/dist/daw-controller-BjRWcTol.d.ts +339 -0
- package/dist/engine/daw-controller.d.ts +3 -0
- package/dist/engine/daw-controller.js +5 -0
- package/dist/engine/daw-controller.js.map +1 -0
- package/dist/engine/daw-import-stem-fm-config.d.ts +224 -0
- package/dist/engine/daw-import-stem-fm-config.js +7 -0
- package/dist/engine/daw-import-stem-fm-config.js.map +1 -0
- package/dist/fetchStationTracks-SKFT4V3U.js +3 -0
- package/dist/fetchStationTracks-SKFT4V3U.js.map +1 -0
- package/dist/index.d.ts +308 -0
- package/dist/index.js +332 -0
- package/dist/index.js.map +1 -0
- package/dist/interface-DaRj7RkY.d.ts +66 -0
- package/dist/interfaces-5ZlG0Y4Y.d.ts +549 -0
- package/dist/media-session-XTP6PP7Q.js +3 -0
- package/dist/media-session-XTP6PP7Q.js.map +1 -0
- package/dist/note-detection-PPLM7R2H.js +148 -0
- package/dist/note-detection-PPLM7R2H.js.map +1 -0
- package/dist/sampler-audio-B7MBG3YN.js +3 -0
- package/dist/sampler-audio-B7MBG3YN.js.map +1 -0
- package/dist/sampler-store-QPHANXYP.js +3 -0
- package/dist/sampler-store-QPHANXYP.js.map +1 -0
- package/dist/services/track-search-api.d.ts +152 -0
- package/dist/services/track-search-api.js +4 -0
- package/dist/services/track-search-api.js.map +1 -0
- package/dist/store/daw-auth-store.d.ts +31 -0
- package/dist/store/daw-auth-store.js +3 -0
- package/dist/store/daw-auth-store.js.map +1 -0
- package/dist/store/daw-session-store.d.ts +255 -0
- package/dist/store/daw-session-store.js +3 -0
- package/dist/store/daw-session-store.js.map +1 -0
- package/dist/vite/index.d.ts +46 -0
- package/dist/vite/index.js +94 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/workers/analysis-worker.js +379 -0
- package/dist/workers/buffer-player-processor-202602.lavv8e32-ts.js +1 -0
- package/dist/workers/daw-stem-processor.js +228 -0
- package/dist/workers/manifest.json +10 -0
- package/dist/workers/phase-vocoder3.js +920 -0
- package/dist/workers/realtime-pitch-shift-processor.js +2 -0
- package/package.json +151 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/daw/engine/event-emitter.ts","../src/daw/engine/progressive-track-loader.ts","../src/daw/engine/daw-track-loader.ts","../src/daw/components/waveform-cache.ts","../src/daw/engine/stem-effect-chain.ts","../src/daw/engine/daw-controller.ts"],"names":["SAMPLE_RATE","TFRA_STEM_MAP","AAC_ENCODER_DELAY_SAMPLES","initial","handle","STEM_LABELS"],"mappings":"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","file":"chunk-OYNES5W3.js","sourcesContent":["/**\n * Minimal browser-compatible EventEmitter replacement.\n * Avoids importing Node.js \"events\" module which Vite externalises.\n */\n\ntype Listener = (...args: any[]) => void;\n\nexport class BrowserEventEmitter {\n private _listeners: Map<string, Set<Listener>> = new Map();\n\n on(event: string, listener: Listener): this {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n return this;\n }\n\n off(event: string, listener: Listener): this {\n this._listeners.get(event)?.delete(listener);\n return this;\n }\n\n once(event: string, listener: Listener): this {\n const wrapper: Listener = (...args) => {\n this.off(event, wrapper);\n listener(...args);\n };\n return this.on(event, wrapper);\n }\n\n emit(event: string, ...args: any[]): boolean {\n const listeners = this._listeners.get(event);\n if (!listeners || listeners.size === 0) return false;\n for (const listener of listeners) {\n try { listener(...args); } catch (e) { console.error(`EventEmitter error on \"${event}\":`, e); }\n }\n return true;\n }\n\n removeAllListeners(event?: string): this {\n if (event) {\n this._listeners.delete(event);\n } else {\n this._listeners.clear();\n }\n return this;\n }\n}\n","/**\n * Progressive Track Loader — streams fMP4 stems segment-by-segment so a\n * newly added track can appear on the timeline instantly (bars/sections/beats\n * come from trackData metadata) while the audio fills in in the background.\n *\n * Pipeline per stem:\n * TFRA index → batched HTTP Range fetch → MP4MoofExtractor (per segment)\n * → AACAdtsPackager (per segment) → WebCodecs AudioDecoder (one per stem,\n * fed in order so cross-batch alignment stays sample-accurate)\n * → StemPatch emitted to subscribers\n *\n * Encoder priming: FDK-AAC prepends 2112 priming samples. We skip those once\n * per stem decoder so sample positions match the original source (matching\n * the trimEncoderDelay behaviour in daw-track-loader.ts).\n *\n * If WebCodecs AudioDecoder is unavailable (Safari < 16.4), the caller is\n * expected to fall back to the legacy one-shot path.\n */\n\nimport { extractTfraData, type TfraExtractResult } from '@/stem-audio-engine-v3/utils/mp4';\nimport { MP4MoofExtractor } from '@/stem-audio-engine-v3/utils/mp4-parser/mp4-moof-extractor';\nimport { AACAdtsPackager } from '@/stem-audio-engine-v3/utils/mp4-parser/aac-adts-packager';\nimport { AEV3Config } from '@/stem-audio-engine-v3/aev3-env-config';\nimport { cacheAudioBuffer, getCachedAudioBuffer } from './daw-cache';\n\nconst SAMPLE_RATE = 48000;\n/** FDK-AAC encoder priming samples (2048 look-ahead + 64 SBR overlap) */\nconst AAC_ENCODER_DELAY_SAMPLES = 2112;\n/** Segments per batch — ~1-2s of audio per segment so 8 ≈ 8-16s per batch */\nconst BATCH_SEGMENTS = 8;\n/** Threshold for resolving the `playable` promise — first 8s decoded */\nconst PLAYABLE_THRESHOLD_SAMPLES = 8 * SAMPLE_RATE;\n/** One AAC frame = 1024 PCM samples at 48kHz */\nconst AAC_FRAME_SAMPLES = 1024;\n\nexport type StemLabel = 'bass' | 'drums' | 'other' | 'vocals';\nconst STEM_LABELS: readonly StemLabel[] = ['bass', 'drums', 'other', 'vocals'] as const;\n/** TFRA stream index → stem label (matches daw-track-loader TFRA_STEM_MAP) */\nconst TFRA_STEM_MAP: Record<number, StemLabel> = {\n 0: 'bass',\n 1: 'drums',\n 2: 'other',\n 3: 'vocals',\n};\n\nexport type LoadProgress = {\n phase: 'fetching' | 'parsing' | 'decoding';\n percent: number;\n detail?: string;\n};\n\nexport interface StemPatch {\n stem: StemLabel;\n /** First sample index of this patch in the pre-allocated stem buffer */\n sampleOffset: number;\n /** [L, R] PCM data for this slot */\n samples: Float32Array[];\n}\n\nexport interface ProgressiveLoadHandle {\n /** Per-stem total samples in the pre-allocated buffer */\n totalSamples: number;\n /** Resolves after every stem has decoded at least PLAYABLE_THRESHOLD_SAMPLES */\n playable: Promise<void>;\n /** Resolves when every batch has been decoded */\n complete: Promise<void>;\n /** Cancel pending fetches/decodes (called from removeTrack) */\n abort(): void;\n /** Subscribe to per-stem patches as they arrive. Returns unsubscribe fn. */\n onPatch(cb: (p: StemPatch) => void): () => void;\n /** Subscribe to overall progress (0-100 percent). Returns unsubscribe fn. */\n onProgress(cb: (p: LoadProgress) => void): () => void;\n}\n\n/**\n * Feature detect WebCodecs AudioDecoder. Callers should fall back to the\n * legacy non-progressive loader when this returns false.\n */\nexport function isProgressiveDecodeSupported(): boolean {\n return typeof (globalThis as { AudioDecoder?: unknown }).AudioDecoder !== 'undefined';\n}\n\n/**\n * Derive the total expected sample count per stem from TFRA.\n *\n * Each TFRA entry's `time` field is in MP4 timescale (which matches the\n * 48 kHz sample rate of these encodes — see SAMPLE_RATE_OF_TIME_PROP in\n * stem-audio-engine-v3/utils/mp4.ts). We decode segments 0..N-2 (the last\n * entry has no \"next\" entry to bound its moof+mdat), so the cumulative\n * sample length is the last decoded segment's end time, which equals\n * `entries[N-1].time`.\n *\n * After the FDK-AAC priming trim (AAC_ENCODER_DELAY_SAMPLES), the audible\n * length is approximately `entries[N-1].time - AAC_ENCODER_DELAY_SAMPLES`.\n * We size the buffer to the LARGER of TFRA-derived and duration-derived\n * (plus a small safety margin) so we never silently truncate the tail.\n */\nexport function deriveTotalSamplesFromTfra(\n tfraData: TfraExtractResult,\n expectedDurationSec: number,\n): number {\n const entries = tfraData[0]?.entries ?? [];\n const lastIdx = entries.length - 1;\n const tfraSamples = lastIdx >= 0 ? entries[lastIdx].time : 0;\n const durationSamples = Math.ceil(expectedDurationSec * SAMPLE_RATE);\n // 1s safety margin handles small rounding / priming-trim mismatches\n return Math.max(tfraSamples, durationSamples) + SAMPLE_RATE;\n}\n\ninterface BatchPlan {\n /** Inclusive segment index in tfraData.entries */\n startSeg: number;\n /** Exclusive segment index */\n endSeg: number;\n /** Byte range of the contiguous chunk that covers all 4 stems for these segments */\n byteStart: number;\n byteEnd: number;\n}\n\ninterface StemDecodeState {\n decoder: AudioDecoder;\n /** Where the next decoded chunk should be written in the output buffer */\n writeOffset: number;\n /** Remaining encoder-priming samples to skip (initially AAC_ENCODER_DELAY_SAMPLES) */\n samplesToSkip: number;\n /** Pending samples for the in-flight batch (filled by output callback) */\n pendingChunks: Float32Array[][];\n /** Sample offset where the current batch began writing */\n batchSampleStart: number;\n /** Total samples emitted via patches (decoded watermark) */\n decodedSamples: number;\n /** Monotonic timestamp counter for EncodedAudioChunk timestamps (microseconds) */\n timestampUs: number;\n}\n\n/**\n * Group segment indices into BATCH_SEGMENTS-sized batches and pre-compute\n * the byte range that covers all 4 stems' moof+mdat for those segments.\n *\n * fMP4 layout per segment (with separate_moof):\n * [bass moof+mdat][drums moof+mdat][other moof+mdat][vocals moof+mdat]\n *\n * The combined chunk for segments [s, s+N) spans:\n * tfraData[0].entries[s].moof_offset .. tfraData[0].entries[s+N].moof_offset\n */\nfunction planBatches(tfraData: TfraExtractResult, totalFileBytes: number | null): BatchPlan[] {\n const entryCount = tfraData[0].entries.length;\n if (entryCount < 2) return [];\n\n const usableEntries = entryCount - 1;\n const batches: BatchPlan[] = [];\n for (let s = 0; s < usableEntries; s += BATCH_SEGMENTS) {\n const startSeg = s;\n const endSeg = Math.min(s + BATCH_SEGMENTS, usableEntries);\n\n const byteStart = tfraData[0].entries[startSeg].moof_offset;\n const nextSegMoofOffset = endSeg < entryCount\n ? tfraData[0].entries[endSeg].moof_offset\n : totalFileBytes ?? tfraData[0].entries[endSeg - 1].moof_offset;\n const byteEnd = nextSegMoofOffset;\n\n batches.push({ startSeg, endSeg, byteStart, byteEnd });\n }\n return batches;\n}\n\n/**\n * Slice the per-stem moof+mdat range out of the batch chunk for a single\n * (segment, stem) pair. Mirrors the offset math in loadTrackStems().\n */\nfunction getStemSliceWithinSegment(\n tfraData: TfraExtractResult,\n segIndex: number,\n stemTfraIdx: number,\n): { moofOffsetInFile: number; moofEndInFile: number } {\n const moofOffset = tfraData[stemTfraIdx].entries[segIndex].moof_offset;\n let moofEnd: number;\n if (stemTfraIdx < 3) {\n // Not the last stream: ends where the next stem's moof starts in same segment\n moofEnd = tfraData[stemTfraIdx + 1].entries[segIndex].moof_offset;\n } else {\n // Last stream (vocals): ends where bass's moof starts in next segment\n moofEnd = tfraData[0].entries[segIndex + 1].moof_offset;\n }\n return { moofOffsetInFile: moofOffset, moofEndInFile: moofEnd };\n}\n\n/**\n * Issue an HTTP Range request for [byteStart, byteEnd). Returns the ArrayBuffer\n * with that range. Throws if the server doesn't honor the range header.\n */\nasync function fetchRange(\n url: string,\n byteStart: number,\n byteEnd: number,\n token: string,\n signal: AbortSignal,\n): Promise<ArrayBuffer> {\n const headers: Record<string, string> = {\n Range: `bytes=${byteStart}-${byteEnd - 1}`,\n };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n const res = await fetch(url, { headers, cache: 'no-cache', signal });\n if (!res.ok && res.status !== 206) {\n throw new Error(`Range fetch failed: ${res.status} for bytes=${byteStart}-${byteEnd - 1}`);\n }\n return res.arrayBuffer();\n}\n\nfunction createStemDecoder(\n onChunk: (left: Float32Array, right: Float32Array, frames: number) => void,\n onError: (e: Error) => void,\n): AudioDecoder {\n // Surface the global type. We've already feature-detected.\n const Ctor = (globalThis as unknown as { AudioDecoder: typeof AudioDecoder }).AudioDecoder;\n const decoder = new Ctor({\n output: (audioData: AudioData) => {\n const frames = audioData.numberOfFrames;\n const channels = audioData.numberOfChannels;\n const left = new Float32Array(frames);\n const right = new Float32Array(frames);\n try {\n audioData.copyTo(left, { planeIndex: 0, format: 'f32-planar' });\n if (channels > 1) {\n audioData.copyTo(right, { planeIndex: 1, format: 'f32-planar' });\n } else {\n right.set(left);\n }\n } catch (e) {\n onError(e as Error);\n audioData.close();\n return;\n }\n audioData.close();\n onChunk(left, right, frames);\n },\n error: (e) => onError(e as Error),\n });\n decoder.configure({\n codec: 'mp4a.40.2',\n sampleRate: SAMPLE_RATE,\n numberOfChannels: 2,\n });\n return decoder;\n}\n\ninterface BeginOptions {\n /** Pre-fetched TFRA data (avoids the extra HEAD/tail roundtrip on cache hits) */\n tfraData?: TfraExtractResult;\n /** When provided, batches are sourced from this ArrayBuffer instead of the network */\n sourceBuffer?: ArrayBuffer;\n /**\n * Explicit per-stem buffer length. When omitted we derive it from\n * `expectedDurationSec` — but that can under-estimate the real decoded\n * length and cause the tail of the track to be silently dropped (see\n * deriveTotalSamplesFromTfra). Prefer passing this explicitly.\n */\n totalSamples?: number;\n}\n\nexport function beginProgressiveLoad(\n mp4Url: string,\n expectedDurationSec: number,\n options: BeginOptions = {},\n): ProgressiveLoadHandle {\n // Use the explicit hint if provided; otherwise fall back to a duration-based\n // estimate plus a 1s margin so a small under-estimate doesn't cap the tail.\n const totalSamples = options.totalSamples\n ?? (Math.ceil(expectedDurationSec * SAMPLE_RATE) + SAMPLE_RATE);\n const abortController = new AbortController();\n const patchListeners = new Set<(p: StemPatch) => void>();\n const progressListeners = new Set<(p: LoadProgress) => void>();\n\n let playableResolve!: () => void;\n let playableReject!: (e: Error) => void;\n const playable = new Promise<void>((resolve, reject) => {\n playableResolve = resolve;\n playableReject = reject;\n });\n let completeResolve!: () => void;\n let completeReject!: (e: Error) => void;\n const complete = new Promise<void>((resolve, reject) => {\n completeResolve = resolve;\n completeReject = reject;\n });\n\n let playableResolved = false;\n let completeResolved = false;\n let aborted = false;\n\n const emitPatch = (p: StemPatch) => {\n if (aborted) return;\n for (const cb of patchListeners) {\n try { cb(p); } catch (e) { console.warn('[ProgressiveLoader] patch listener threw', e); }\n }\n };\n const emitProgress = (p: LoadProgress) => {\n if (aborted) return;\n for (const cb of progressListeners) {\n try { cb(p); } catch (e) { console.warn('[ProgressiveLoader] progress listener threw', e); }\n }\n };\n\n const run = async () => {\n try {\n const token = AEV3Config.getInstance()?.getAccessToken?.() ?? '';\n\n emitProgress({ phase: 'fetching', percent: 0, detail: 'Reading MP4 index…' });\n const tfraData = options.tfraData ?? await extractTfraData(mp4Url, token, false);\n if (aborted) return;\n if (!tfraData || tfraData.length < 4) {\n throw new Error('TFRA data missing or incomplete – expected 4 tracks');\n }\n\n // We don't know the total file size from TFRA alone. The byte range\n // for the LAST batch ends at the start of the trailing moov/mfra\n // boxes; for simplicity we drop the final (incomplete) segment from\n // the loop in loadTrackStems and we do the same here.\n const batches = planBatches(tfraData, null);\n if (batches.length === 0) {\n throw new Error('No decodable segments found in TFRA index');\n }\n\n const moofExtractor = new MP4MoofExtractor();\n const adtsPackager = new AACAdtsPackager();\n\n // Build one decoder per stem. Each decoder's output writes into\n // the running pending list for the current batch.\n const stemStates: Record<StemLabel, StemDecodeState> = {} as Record<StemLabel, StemDecodeState>;\n for (const label of STEM_LABELS) {\n const state: StemDecodeState = {\n decoder: null as unknown as AudioDecoder,\n writeOffset: 0,\n samplesToSkip: AAC_ENCODER_DELAY_SAMPLES,\n pendingChunks: [],\n batchSampleStart: 0,\n decodedSamples: 0,\n timestampUs: 0,\n };\n state.decoder = createStemDecoder(\n (left, right) => {\n // Skip encoder priming on the first frames\n let l = left;\n let r = right;\n if (state.samplesToSkip > 0) {\n const drop = Math.min(state.samplesToSkip, l.length);\n l = l.subarray(drop);\n r = r.subarray(drop);\n state.samplesToSkip -= drop;\n if (l.length === 0) return;\n }\n state.pendingChunks.push([l, r]);\n },\n (e) => {\n console.error(`[ProgressiveLoader] decoder error for ${label}:`, e);\n },\n );\n stemStates[label] = state;\n }\n\n const checkPlayable = () => {\n if (playableResolved) return;\n let minDecoded = Infinity;\n for (const label of STEM_LABELS) {\n if (stemStates[label].decodedSamples < minDecoded) {\n minDecoded = stemStates[label].decodedSamples;\n }\n }\n if (minDecoded >= PLAYABLE_THRESHOLD_SAMPLES) {\n playableResolved = true;\n playableResolve();\n }\n };\n\n for (let batchIdx = 0; batchIdx < batches.length; batchIdx++) {\n if (aborted) return;\n const batch = batches[batchIdx];\n\n emitProgress({\n phase: 'fetching',\n percent: Math.round((batchIdx / batches.length) * 100),\n detail: `Batch ${batchIdx + 1}/${batches.length}`,\n });\n\n let chunkBuf: ArrayBuffer;\n if (options.sourceBuffer) {\n // Source from a fully-cached ArrayBuffer (offline reopen)\n chunkBuf = options.sourceBuffer.slice(batch.byteStart, batch.byteEnd);\n } else {\n chunkBuf = await fetchRange(mp4Url, batch.byteStart, batch.byteEnd, token, abortController.signal);\n }\n if (aborted) return;\n\n // For each stem, slice out per-segment moof+mdat ranges from\n // the batch chunk and feed ADTS frames to that stem's decoder.\n for (let tfraIdx = 0; tfraIdx < 4; tfraIdx++) {\n const stemLabel = TFRA_STEM_MAP[tfraIdx];\n const state = stemStates[stemLabel];\n state.pendingChunks = [];\n state.batchSampleStart = state.writeOffset;\n const mp4TrackId = tfraIdx + 1;\n\n for (let segIdx = batch.startSeg; segIdx < batch.endSeg; segIdx++) {\n const { moofOffsetInFile, moofEndInFile } = getStemSliceWithinSegment(tfraData, segIdx, tfraIdx);\n const relStart = moofOffsetInFile - batch.byteStart;\n const relEnd = moofEndInFile - batch.byteStart;\n if (relStart < 0 || relEnd > chunkBuf.byteLength || relEnd <= relStart) {\n // Out-of-bounds within this chunk (shouldn't happen with a valid plan)\n continue;\n }\n const segBuf = chunkBuf.slice(relStart, relEnd);\n\n let adtsFrames: Uint8Array[];\n try {\n const { trunData, mdatData } = moofExtractor.extractMoofDataForAEV3(\n segBuf, mp4TrackId, segIdx, '', '', `stem-${stemLabel}`,\n );\n const { buffers } = adtsPackager.packageAacFramesForAEV3(\n mdatData, trunData, `stem-${stemLabel}`,\n );\n adtsFrames = buffers;\n } catch (e) {\n // Tail-end MOOF extraction failures are expected near EOF\n console.warn(`[ProgressiveLoader] failed to parse seg ${segIdx} stem ${stemLabel}:`, e);\n continue;\n }\n\n for (const frame of adtsFrames) {\n if (aborted) return;\n try {\n state.decoder.decode(new EncodedAudioChunk({\n type: 'key',\n timestamp: state.timestampUs,\n duration: Math.round(AAC_FRAME_SAMPLES * 1e6 / SAMPLE_RATE),\n data: frame,\n }));\n state.timestampUs += Math.round(AAC_FRAME_SAMPLES * 1e6 / SAMPLE_RATE);\n } catch (e) {\n console.warn(`[ProgressiveLoader] decode() threw for ${stemLabel}:`, e);\n }\n }\n }\n }\n\n // Wait for all 4 decoders to finish this batch's queued frames.\n // flush() does NOT reset state — it just drains the queue.\n await Promise.all(STEM_LABELS.map(async (label) => {\n const state = stemStates[label];\n try {\n await state.decoder.flush();\n } catch (e) {\n console.warn(`[ProgressiveLoader] flush failed for ${label}:`, e);\n }\n }));\n\n if (aborted) return;\n\n // Coalesce each stem's pending chunks into a single contiguous\n // patch and emit. Slices stay inside the pre-allocated total\n // buffer (cap at totalSamples to guard against duration drift).\n for (const label of STEM_LABELS) {\n const state = stemStates[label];\n if (state.pendingChunks.length === 0) continue;\n\n let total = 0;\n for (const [l] of state.pendingChunks) total += l.length;\n if (total === 0) continue;\n\n const writeStart = state.batchSampleStart;\n const maxWritable = Math.max(0, totalSamples - writeStart);\n const writeLen = Math.min(total, maxWritable);\n if (writeLen <= 0) {\n // Pre-allocated buffer is too small for the actual\n // decoded length — every subsequent batch will hit\n // this and be silently dropped. Surface it loudly\n // so we can adjust totalSamples derivation.\n console.warn(\n `[ProgressiveLoader] buffer cap hit for ${label}: ` +\n `writeStart=${writeStart} >= totalSamples=${totalSamples} ` +\n `(have ${total} decoded samples queued, batch ${batchIdx + 1}/${batches.length})`,\n );\n state.pendingChunks = [];\n continue;\n }\n if (writeLen < total) {\n console.warn(\n `[ProgressiveLoader] truncating ${label} batch ${batchIdx + 1}: ` +\n `wrote ${writeLen} of ${total} samples (buffer ends at ${totalSamples})`,\n );\n }\n\n const mergedL = new Float32Array(writeLen);\n const mergedR = new Float32Array(writeLen);\n let off = 0;\n for (const [l, r] of state.pendingChunks) {\n const remaining = writeLen - off;\n if (remaining <= 0) break;\n const take = Math.min(l.length, remaining);\n mergedL.set(l.subarray(0, take), off);\n mergedR.set(r.subarray(0, take), off);\n off += take;\n }\n state.pendingChunks = [];\n state.writeOffset = writeStart + writeLen;\n state.decodedSamples = state.writeOffset;\n\n emitPatch({\n stem: label,\n sampleOffset: writeStart,\n samples: [mergedL, mergedR],\n });\n }\n\n checkPlayable();\n\n emitProgress({\n phase: 'decoding',\n percent: Math.round(((batchIdx + 1) / batches.length) * 100),\n detail: `Decoded batch ${batchIdx + 1}/${batches.length}`,\n });\n }\n\n // Final flush + decoder cleanup\n for (const label of STEM_LABELS) {\n const state = stemStates[label];\n try {\n await state.decoder.flush();\n state.decoder.close();\n } catch { /* */ }\n }\n\n // In case we never crossed the 8s threshold (very short tracks)\n if (!playableResolved) {\n playableResolved = true;\n playableResolve();\n }\n if (!completeResolved) {\n completeResolved = true;\n completeResolve();\n }\n emitProgress({ phase: 'decoding', percent: 100, detail: 'Done' });\n } catch (e) {\n if (aborted) return;\n const err = e as Error;\n console.error('[ProgressiveLoader] run failed:', err);\n if (!playableResolved) {\n playableResolved = true;\n playableReject(err);\n }\n if (!completeResolved) {\n completeResolved = true;\n completeReject(err);\n }\n }\n };\n\n // Kick off — fire and forget; consumers track via promises/listeners.\n void run();\n\n return {\n totalSamples,\n playable,\n complete,\n abort: () => {\n aborted = true;\n abortController.abort();\n },\n onPatch: (cb) => {\n patchListeners.add(cb);\n return () => patchListeners.delete(cb);\n },\n onProgress: (cb) => {\n progressListeners.add(cb);\n return () => progressListeners.delete(cb);\n },\n };\n}\n\n/**\n * After the progressive load completes, opportunistically full-fetch the file\n * and stash it in IndexedDB so offline reopens stay fast. No-ops if cache hit.\n *\n * Doesn't block — invoke from a microtask off the `complete` promise.\n */\nexport async function cacheFullFileForOffline(url: string): Promise<void> {\n try {\n const existing = await getCachedAudioBuffer(url);\n if (existing) return;\n const token = AEV3Config.getInstance()?.getAccessToken?.() ?? '';\n const headers: Record<string, string> = {};\n if (token) headers['Authorization'] = `Bearer ${token}`;\n const res = await fetch(url, { headers, cache: 'force-cache' });\n if (!res.ok) return;\n const ab = await res.arrayBuffer();\n await cacheAudioBuffer(url, ab);\n } catch { /* offline cache is best-effort */ }\n}\n","/**\n * DAWTrackLoader – Downloads a full fMP4 file and decodes all 4 stems\n * into separate AudioBuffers for offline/DAW-style manipulation.\n *\n * This intentionally avoids the streaming AudioSourceSequence pipeline.\n * The trade-off is a longer initial load, but after that every stem is\n * instantly accessible at any sample position.\n */\n\nimport { extractTfraData } from '@/stem-audio-engine-v3/utils/mp4';\nimport { MP4MoofExtractor } from '@/stem-audio-engine-v3/utils/mp4-parser/mp4-moof-extractor';\nimport { AACAdtsPackager } from '@/stem-audio-engine-v3/utils/mp4-parser/aac-adts-packager';\nimport { AEV3Config } from '@/stem-audio-engine-v3/aev3-env-config';\nimport { cacheAudioBuffer, getCachedAudioBuffer } from './daw-cache';\nimport {\n beginProgressiveLoad,\n isProgressiveDecodeSupported,\n deriveTotalSamplesFromTfra,\n type ProgressiveLoadHandle,\n} from './progressive-track-loader';\n\nconst SAMPLE_RATE = 48000;\n\nlet _decodingCtx: AudioContext | null = null;\nfunction getDecodingContext(): AudioContext {\n if (!_decodingCtx || _decodingCtx.state === 'closed') {\n _decodingCtx = new AudioContext({ sampleRate: SAMPLE_RATE });\n }\n return _decodingCtx;\n}\n\nexport interface StemAudioBuffers {\n other: AudioBuffer;\n vocals: AudioBuffer;\n bass: AudioBuffer;\n drums: AudioBuffer;\n}\n\nexport type LoadProgress = {\n phase: 'fetching' | 'parsing' | 'decoding';\n percent: number;\n detail?: string;\n};\n\n// TFRA index → stem label\nconst TFRA_STEM_MAP: Record<number, keyof StemAudioBuffers> = {\n 0: 'bass',\n 1: 'drums',\n 2: 'other',\n 3: 'vocals',\n};\n\n/** Stem URLs from REST API (e.g. newly uploaded tracks before fMP4 is ready) */\nexport interface StemUrls {\n bass: string;\n drums: string;\n other: string;\n vocals: string;\n}\n\n/**\n * Load stems from 4 individual MP3 URLs (REST API format).\n * Used when fMP4 is not yet available for newly uploaded tracks.\n */\nexport async function loadTrackStemsFromMp3Urls(\n urls: StemUrls,\n onProgress?: (p: LoadProgress) => void,\n): Promise<StemAudioBuffers> {\n const ctx = getDecodingContext();\n const result: Partial<StemAudioBuffers> = {};\n const labels: (keyof StemAudioBuffers)[] = ['bass', 'drums', 'other', 'vocals'];\n\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n const url = urls[label];\n const pct = Math.round(((i + 1) / 4) * 100);\n onProgress?.({ phase: 'fetching', percent: pct, detail: `Loading ${label}…` });\n\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) throw new Error(`Failed to fetch ${label}: ${res.status}`);\n const ab = await res.arrayBuffer();\n const buf = await ctx.decodeAudioData(ab);\n\n // Ensure stereo (DAW expects 2 channels)\n if (buf.numberOfChannels === 1) {\n const stereo = ctx.createBuffer(2, buf.length, buf.sampleRate);\n const mono = buf.getChannelData(0);\n stereo.copyToChannel(mono, 0);\n stereo.copyToChannel(mono, 1);\n result[label] = stereo;\n } else {\n result[label] = buf;\n }\n }\n\n onProgress?.({ phase: 'decoding', percent: 100, detail: 'Done' });\n return result as StemAudioBuffers;\n}\n\n/**\n * Download an fMP4 track and decode each stem into a standalone AudioBuffer.\n */\nexport async function loadTrackStems(\n mp4Url: string,\n onProgress?: (p: LoadProgress) => void,\n): Promise<StemAudioBuffers> {\n const token = AEV3Config.getInstance()?.getAccessToken?.() ?? '';\n\n onProgress?.({ phase: 'fetching', percent: 0, detail: 'Reading MP4 index…' });\n const tfraData = await extractTfraData(mp4Url, token, false);\n if (!tfraData || tfraData.length < 4) {\n throw new Error('TFRA data missing or incomplete – expected 4 tracks');\n }\n\n let fullBuffer: ArrayBuffer;\n const cached = await getCachedAudioBuffer(mp4Url);\n if (cached) {\n onProgress?.({ phase: 'fetching', percent: 35, detail: 'Loaded from cache' });\n fullBuffer = cached;\n } else {\n onProgress?.({ phase: 'fetching', percent: 10, detail: 'Downloading audio…' });\n const headers: Record<string, string> = {};\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n const response = await fetch(mp4Url, { headers, cache: 'no-cache' });\n if (!response.ok) throw new Error(`MP4 fetch failed: ${response.status}`);\n fullBuffer = await response.arrayBuffer();\n\n cacheAudioBuffer(mp4Url, fullBuffer.slice(0));\n }\n onProgress?.({ phase: 'parsing', percent: 40, detail: 'Extracting stems…' });\n\n // ── 3. Extract per-stem AAC frames ────────────────────────────────\n const moofExtractor = new MP4MoofExtractor();\n const adtsPackager = new AACAdtsPackager();\n\n const stemFrames: Record<keyof StemAudioBuffers, Uint8Array[]> = {\n bass: [], drums: [], other: [], vocals: [],\n };\n\n const bufLen = fullBuffer.byteLength;\n\n // With separate_moof, the per-segment layout is:\n // [bass MOOF+MDAT] [drums MOOF+MDAT] [other MOOF+MDAT] [vocals MOOF+MDAT]\n // To get the byte-length of one track's MOOF+MDAT we use the offset of the\n // next track's MOOF in the same segment (or the next segment's first track).\n const entryCount = tfraData[0].entries.length;\n\n for (let tfraIdx = 0; tfraIdx < 4; tfraIdx++) {\n const stemLabel = TFRA_STEM_MAP[tfraIdx];\n const entries = tfraData[tfraIdx].entries;\n const mp4TrackId = tfraIdx + 1;\n\n for (let i = 0; i < entries.length - 1; i++) {\n const moofOffset = entries[i].moof_offset;\n\n // Calculate the end of this track's MOOF+MDAT using the next\n // track's MOOF offset in the same segment index\n let moofEnd: number;\n if (tfraIdx < 3) {\n // Not the last track: ends where the next track's MOOF starts\n moofEnd = tfraData[tfraIdx + 1].entries[i].moof_offset;\n } else {\n // Last track (vocals): ends where bass's MOOF starts in the NEXT segment\n moofEnd = tfraData[0].entries[i + 1].moof_offset;\n }\n\n const byteLength = moofEnd - moofOffset;\n if (moofOffset + byteLength > bufLen || byteLength <= 0) {\n continue; // skip out-of-bounds or nonsensical ranges\n }\n\n const trackBuffer = fullBuffer.slice(moofOffset, moofOffset + byteLength);\n\n try {\n const { trunData, mdatData } = moofExtractor.extractMoofDataForAEV3(\n trackBuffer, mp4TrackId, i, '', '', `stem-${stemLabel}`,\n );\n const { buffers: adtsFrames } = adtsPackager.packageAacFramesForAEV3(\n mdatData, trunData, `stem-${stemLabel}`,\n );\n stemFrames[stemLabel].push(...adtsFrames);\n } catch {\n // Tail-end MOOF extraction failures are expected near EOF\n }\n }\n\n const pct = 40 + Math.round(((tfraIdx + 1) / 4) * 30);\n onProgress?.({ phase: 'parsing', percent: pct, detail: `Extracted ${stemLabel}` });\n }\n\n // ── 4. Decode each stem ───────────────────────────────────────────\n onProgress?.({ phase: 'decoding', percent: 70, detail: 'Decoding audio…' });\n\n const ctx = getDecodingContext();\n const result: Partial<StemAudioBuffers> = {};\n\n const stemLabels = Object.keys(stemFrames) as (keyof StemAudioBuffers)[];\n for (let si = 0; si < stemLabels.length; si++) {\n const label = stemLabels[si];\n const frames = stemFrames[label];\n\n if (frames.length === 0) {\n // Create silent buffer as fallback\n result[label] = ctx.createBuffer(2, SAMPLE_RATE, SAMPLE_RATE);\n continue;\n }\n\n const merged = mergeFrames(frames);\n let decoded: AudioBuffer;\n try {\n decoded = await ctx.decodeAudioData(merged.buffer);\n } catch {\n // Fallback: go through Blob to get a fresh ArrayBuffer\n const blob = new Blob([merged], { type: 'audio/aac' });\n const ab = await blob.arrayBuffer();\n decoded = await ctx.decodeAudioData(ab);\n }\n\n result[label] = trimEncoderDelay(decoded, ctx);\n\n const pct = 70 + Math.round(((si + 1) / 4) * 28);\n onProgress?.({ phase: 'decoding', percent: pct, detail: `Decoded ${label}` });\n }\n\n onProgress?.({ phase: 'decoding', percent: 100, detail: 'Done' });\n\n return result as StemAudioBuffers;\n}\n\n// ── helpers ───────────────────────────────────────────────────────────\n\n/**\n * AAC encoder priming delay: the FDK-AAC encoder prepends 2048 samples of\n * look-ahead plus a 64-sample SBR overlap = 2112 samples at 48 kHz.\n * When decoding raw ADTS frames (no MP4 edit list), decodeAudioData returns\n * these priming samples at the start of the buffer. We strip them so that\n * sample positions match the original source used for beat detection.\n */\nconst AAC_ENCODER_DELAY_SAMPLES = 2112;\n\nfunction trimEncoderDelay(buf: AudioBuffer, ctx: AudioContext): AudioBuffer {\n if (buf.length <= AAC_ENCODER_DELAY_SAMPLES) return buf;\n const trimmedLength = buf.length - AAC_ENCODER_DELAY_SAMPLES;\n const trimmed = ctx.createBuffer(buf.numberOfChannels, trimmedLength, buf.sampleRate);\n for (let ch = 0; ch < buf.numberOfChannels; ch++) {\n const src = buf.getChannelData(ch);\n const dst = trimmed.getChannelData(ch);\n dst.set(src.subarray(AAC_ENCODER_DELAY_SAMPLES));\n }\n return trimmed;\n}\n\nfunction mergeFrames(frames: Uint8Array[]): Uint8Array {\n let totalLength = 0;\n for (const f of frames) totalLength += f.byteLength;\n const out = new Uint8Array(totalLength);\n let offset = 0;\n for (const f of frames) {\n out.set(f, offset);\n offset += f.byteLength;\n }\n return out;\n}\n\n/**\n * Allocate four zero-filled stereo AudioBuffers of the given length. Used as\n * the placeholder audio for a track that is still streaming in.\n */\nfunction allocateEmptyStemBuffers(totalSamples: number, ctx: AudioContext): StemAudioBuffers {\n const len = Math.max(1, totalSamples);\n return {\n bass: ctx.createBuffer(2, len, SAMPLE_RATE),\n drums: ctx.createBuffer(2, len, SAMPLE_RATE),\n other: ctx.createBuffer(2, len, SAMPLE_RATE),\n vocals: ctx.createBuffer(2, len, SAMPLE_RATE),\n };\n}\n\nexport interface ProgressiveLoadResult {\n /** Zero-filled stems ready to hand to the worklets immediately */\n initial: StemAudioBuffers;\n /** Stream handle — caller wires onPatch to update buffers + waveform cache */\n handle: ProgressiveLoadHandle;\n}\n\n/**\n * Progressive variant of loadTrackStems. Returns immediately with zero-filled\n * AudioBuffers (sized by expectedDurationSec) plus a handle whose onPatch\n * callback fires as each batch of samples is decoded.\n *\n * If WebCodecs AudioDecoder isn't available (Safari < 16.4), this falls back\n * to the legacy full-download loadTrackStems and emits a single full-length\n * patch once decoding completes — preserves correctness, loses progressivity.\n */\nexport async function loadTrackStemsProgressively(\n mp4Url: string,\n expectedDurationSec: number,\n onProgress?: (p: LoadProgress) => void,\n): Promise<ProgressiveLoadResult> {\n const ctx = getDecodingContext();\n\n if (!isProgressiveDecodeSupported()) {\n // Fallback path: decode the whole track up-front, then emit one patch\n // at offset 0 once it's done. The handle stays alive so the controller\n // wiring is identical. Use a duration-based estimate since we don't\n // have TFRA in this branch.\n const fallbackTotalSamples = Math.max(1, Math.ceil(expectedDurationSec * SAMPLE_RATE) + SAMPLE_RATE);\n const initial = allocateEmptyStemBuffers(fallbackTotalSamples, ctx);\n return fallbackToOneShotPatch(mp4Url, initial, fallbackTotalSamples, onProgress);\n }\n\n // Fetch TFRA first so we can size the stem buffers from the actual\n // sample count, not just `trackData.duration` which can under-estimate\n // (e.g. when duration represents musical length only). Without this\n // every batch past the cap is silently dropped — that's the \"doesn't\n // decode the whole song\" bug.\n const token = AEV3Config.getInstance()?.getAccessToken?.() ?? '';\n let tfraData;\n try {\n tfraData = await extractTfraData(mp4Url, token, false);\n } catch (err) {\n console.warn('[loadTrackStemsProgressively] TFRA fetch failed, falling back to duration-only sizing:', err);\n tfraData = null;\n }\n\n const totalSamples = (tfraData && tfraData.length >= 4)\n ? deriveTotalSamplesFromTfra(tfraData, expectedDurationSec)\n : Math.max(1, Math.ceil(expectedDurationSec * SAMPLE_RATE) + SAMPLE_RATE);\n\n const initial = allocateEmptyStemBuffers(totalSamples, ctx);\n\n // If the file is already in IndexedDB, drive the progressive decoder\n // from that cached ArrayBuffer instead of the network — same UX, no\n // network roundtrips.\n const cached = await getCachedAudioBuffer(mp4Url);\n if (cached && tfraData && tfraData.length >= 4) {\n const handle = beginProgressiveLoad(mp4Url, expectedDurationSec, {\n tfraData,\n sourceBuffer: cached,\n totalSamples,\n });\n if (onProgress) handle.onProgress(onProgress);\n return { initial, handle };\n }\n\n const handle = beginProgressiveLoad(mp4Url, expectedDurationSec, {\n tfraData: tfraData ?? undefined,\n totalSamples,\n });\n if (onProgress) handle.onProgress(onProgress);\n return { initial, handle };\n}\n\n/** Adapter that runs the legacy loader and replays the result as a single patch */\nasync function fallbackToOneShotPatch(\n mp4Url: string,\n initial: StemAudioBuffers,\n totalSamples: number,\n onProgress?: (p: LoadProgress) => void,\n): Promise<ProgressiveLoadResult> {\n const patchListeners = new Set<(p: import('./progressive-track-loader').StemPatch) => void>();\n const progressListeners = new Set<(p: LoadProgress) => void>();\n if (onProgress) progressListeners.add(onProgress);\n\n let completeResolve!: () => void;\n let completeReject!: (e: Error) => void;\n const complete = new Promise<void>((resolve, reject) => {\n completeResolve = resolve;\n completeReject = reject;\n });\n\n let aborted = false;\n\n (async () => {\n try {\n const stems = await loadTrackStems(mp4Url, (p) => {\n for (const cb of progressListeners) {\n try { cb(p); } catch { /* */ }\n }\n });\n if (aborted) return;\n\n const stemKeys: (keyof StemAudioBuffers)[] = ['bass', 'drums', 'other', 'vocals'];\n for (const k of stemKeys) {\n const buf = stems[k];\n const lenToCopy = Math.min(buf.length, totalSamples);\n const left = new Float32Array(lenToCopy);\n const right = new Float32Array(lenToCopy);\n left.set(buf.getChannelData(0).subarray(0, lenToCopy));\n if (buf.numberOfChannels > 1) {\n right.set(buf.getChannelData(1).subarray(0, lenToCopy));\n } else {\n right.set(left);\n }\n for (const cb of patchListeners) {\n try { cb({ stem: k, sampleOffset: 0, samples: [left, right] }); } catch { /* */ }\n }\n }\n completeResolve();\n } catch (e) {\n completeReject(e as Error);\n }\n })();\n\n const handle: ProgressiveLoadHandle = {\n totalSamples,\n playable: complete,\n complete,\n abort: () => { aborted = true; },\n onPatch: (cb) => { patchListeners.add(cb); return () => patchListeners.delete(cb); },\n onProgress: (cb) => { progressListeners.add(cb); return () => progressListeners.delete(cb); },\n };\n\n return { initial, handle };\n}\n","/**\n * Shared waveform mipmap cache store.\n * Separated from DAWTimeline to avoid breaking React Fast Refresh\n * when non-component functions are exported from component files.\n *\n * Progressive support: a track's audio may arrive in batches via the\n * progressive-track-loader. We pre-allocate the mipmap arrays from the\n * track's expected total samples and patch them in place as decoded slots\n * land. The `version` counter is bumped on every patch so the timeline\n * canvas can invalidate cleanly.\n */\n\n/**\n * Power-of-2 bin counts used for the per-track waveform mipmap. Kept here\n * as the single source of truth — DAWTimeline.tsx imports this constant.\n *\n * The finest level (`65536`) is what supports the high-zoom \"see individual\n * transients\" look in the filled-envelope renderer. Memory cost per stem:\n * 65536 × 4 bytes ≈ 256 KB. ×4 stems ×N tracks → ~1 MB per track.\n * For a 4-minute song at 48 kHz that's ~175 samples per bin (~3.6 ms),\n * which preserves every drum hit and sharp transient when zoomed in.\n */\nexport const MIPMAP_LEVELS = [64, 256, 1024, 4096, 16384, 65536] as const;\n\nexport type MipmapCache = Map<number, Float32Array>;\n\nexport interface MipmapState {\n /** Power-of-2 mipmap arrays, all sized from the track's total samples */\n levels: MipmapCache;\n /** Highest sample index that has been written to (decoded watermark) */\n decodedSampleHigh: number;\n /** Fixed total length of the underlying stem buffer (samples) */\n totalSamples: number;\n /** Bumped on every appendPeaks; canvases compare to detect changes */\n version: number;\n}\n\n/** key = `${trackId}:${stemKey}` */\nexport const mipmapStore = new Map<string, MipmapState>();\n\nconst STEM_KEYS = ['other', 'vocals', 'bass', 'drums'];\n\n// ── Change subscriptions ─────────────────────────────────────────────\n// The timeline canvas subscribes here so it can redraw as peaks fill in\n// (the canvas animation loop only ticks during playback; progressive\n// patches arrive while paused, hence the explicit notification).\n\nconst changeListeners = new Set<() => void>();\n\nexport function subscribeMipmapChanges(cb: () => void): () => void {\n changeListeners.add(cb);\n return () => changeListeners.delete(cb);\n}\n\nfunction notifyChange(): void {\n for (const cb of changeListeners) {\n try { cb(); } catch { /* */ }\n }\n}\n\nfunction makeKey(trackId: string, stemKey: string): string {\n return `${trackId}:${stemKey}`;\n}\n\n/**\n * Allocate zero-filled mipmap arrays for a track's stem. The base-level\n * peaks have one entry per sample, but to keep memory sane we size each\n * level relative to MIPMAP_LEVELS as a target bin count per stem. Sample\n * positions are mapped to bin indices via the standard fractional formula\n * (no accumulating drift — see waveform-utils.extractPeaks).\n */\nexport function initMipmapsForTrack(\n trackId: string,\n stemKey: string,\n totalSamples: number,\n): MipmapState {\n const key = makeKey(trackId, stemKey);\n const existing = mipmapStore.get(key);\n if (existing && existing.totalSamples === totalSamples) {\n // Reset to zeros so a re-init (e.g. re-add) starts fresh\n for (const arr of existing.levels.values()) arr.fill(0);\n existing.decodedSampleHigh = 0;\n existing.version++;\n return existing;\n }\n\n const levels: MipmapCache = new Map();\n for (const numBins of MIPMAP_LEVELS) {\n if (totalSamples < numBins) continue;\n levels.set(numBins, new Float32Array(numBins));\n }\n\n const state: MipmapState = {\n levels,\n decodedSampleHigh: 0,\n totalSamples,\n version: 1,\n };\n mipmapStore.set(key, state);\n return state;\n}\n\n/**\n * Patch peaks into the mipmap for samples [sampleOffset, sampleOffset+samplesL).\n * Recomputes the affected slice of each mipmap level from the raw stereo\n * patch (left + right channels, MAX'd to one mono peaks line). Bumps the\n * version counter so the timeline canvas can detect the change.\n *\n * If the track hasn't been init'd yet, this is a no-op (the controller\n * should call initMipmapsForTrack before wiring patches).\n */\nexport function appendPeaksToMipmapCache(\n trackId: string,\n stemKey: string,\n sampleOffset: number,\n leftChannel: Float32Array,\n rightChannel: Float32Array | null,\n): void {\n const state = mipmapStore.get(makeKey(trackId, stemKey));\n if (!state) return;\n\n const total = state.totalSamples;\n const startSample = Math.max(0, sampleOffset);\n const endSample = Math.min(total, sampleOffset + leftChannel.length);\n if (endSample <= startSample) return;\n\n for (const [numBins, peaks] of state.levels) {\n // Convert sample range to bin range using the same fractional binning\n // formula used in waveform-utils.extractPeaks — guarantees alignment\n // with downstream sample-to-time math.\n // sampleIndex in [floor(b * total/numBins), floor((b+1) * total/numBins))\n // → bin b covers samples in that range.\n // Find first and last bin touched by [startSample, endSample):\n const firstBin = Math.floor((startSample * numBins) / total);\n const lastBinExcl = Math.min(numBins, Math.ceil((endSample * numBins) / total));\n\n for (let b = firstBin; b < lastBinExcl; b++) {\n const binStart = Math.floor((b * total) / numBins);\n const binEnd = Math.floor(((b + 1) * total) / numBins);\n // Only sample the portion of this bin that lies inside our patch.\n const sFrom = Math.max(binStart, startSample);\n const sToExcl = Math.min(binEnd, endSample);\n if (sToExcl <= sFrom) continue;\n\n let max = peaks[b]; // preserve any previous patch's value in this bin\n for (let i = sFrom; i < sToExcl; i++) {\n const localI = i - sampleOffset;\n const l = leftChannel[localI];\n const r = rightChannel ? rightChannel[localI] : l;\n const al = l < 0 ? -l : l;\n const ar = r < 0 ? -r : r;\n const v = al > ar ? al : ar;\n if (v > max) max = v;\n }\n peaks[b] = max;\n }\n }\n\n if (endSample > state.decodedSampleHigh) state.decodedSampleHigh = endSample;\n state.version++;\n notifyChange();\n}\n\nexport function invalidateWaveformCache(trackId: string, stemIndex: number): void {\n const key = makeKey(trackId, STEM_KEYS[stemIndex]);\n const had = mipmapStore.has(key);\n mipmapStore.delete(key);\n console.log('[DAW Waveform] invalidateWaveformCache:', key, had ? '(cache cleared)' : '(was not cached)');\n}\n\n/** Remove every cached stem for a track (called on removeTrack). */\nexport function clearWaveformCacheForTrack(trackId: string): void {\n for (const k of STEM_KEYS) {\n mipmapStore.delete(makeKey(trackId, k));\n }\n}\n\n/** Read-only accessor for the timeline canvas. */\nexport function getMipmapState(trackId: string, stemKey: string): MipmapState | undefined {\n return mipmapStore.get(makeKey(trackId, stemKey));\n}\n","/**\n * StemEffectChain — Per-stem real-time effect chain using Web Audio API.\n *\n * Signal path: input → EQ → Compressor → Reverb → Delay → output\n *\n * Each effect can be bypassed independently. When bypassed, the signal\n * routes through a dry path. All nodes are pre-created so toggling\n * is glitch-free (just reconnect, no allocation).\n */\n\n// ── Effect parameter interfaces ──────────────────────────────────────\n\nexport interface EQParams {\n enabled: boolean;\n lowGain: number; // dB, -12 to +12\n midGain: number; // dB, -12 to +12\n highGain: number; // dB, -12 to +12\n lowFreq: number; // Hz, default 320\n highFreq: number; // Hz, default 3200\n}\n\nexport interface CompressorParams {\n enabled: boolean;\n threshold: number; // dB, -60 to 0\n ratio: number; // 1 to 20\n attack: number; // seconds, 0.001 to 1\n release: number; // seconds, 0.01 to 1\n knee: number; // dB, 0 to 40\n}\n\nexport interface ReverbParams {\n enabled: boolean;\n mix: number; // 0 to 1 (dry/wet)\n decay: number; // seconds, 0.1 to 10\n}\n\nexport interface DelayParams {\n enabled: boolean;\n time: number; // seconds, 0.01 to 2\n feedback: number; // 0 to 0.95\n mix: number; // 0 to 1 (dry/wet)\n}\n\nexport interface StemEffects {\n eq: EQParams;\n compressor: CompressorParams;\n reverb: ReverbParams;\n delay: DelayParams;\n}\n\nexport const DEFAULT_EFFECTS: StemEffects = {\n eq: { enabled: false, lowGain: 0, midGain: 0, highGain: 0, lowFreq: 320, highFreq: 3200 },\n compressor: { enabled: false, threshold: -24, ratio: 4, attack: 0.003, release: 0.25, knee: 30 },\n reverb: { enabled: false, mix: 0.3, decay: 2.0 },\n delay: { enabled: false, time: 0.375, feedback: 0.35, mix: 0.25 },\n};\n\nexport function hasActiveEffects(fx: StemEffects): boolean {\n return fx.eq.enabled || fx.compressor.enabled || fx.reverb.enabled || fx.delay.enabled;\n}\n\n// ── Effect chain ─────────────────────────────────────────────────────\n\nexport class StemEffectChain {\n private ctx: AudioContext;\n\n // Input/output anchors — these never change\n readonly input: GainNode;\n readonly output: GainNode;\n\n // EQ: 3-band (lowshelf + peaking + highshelf)\n private eqLow: BiquadFilterNode;\n private eqMid: BiquadFilterNode;\n private eqHigh: BiquadFilterNode;\n\n // Compressor\n private compressor: DynamicsCompressorNode;\n\n // Reverb (algorithmic via ConvolverNode with generated impulse)\n private reverbDry: GainNode;\n private reverbWet: GainNode;\n private convolver: ConvolverNode;\n\n // Delay\n private delayNode: DelayNode;\n private delayFeedback: GainNode;\n private delayDry: GainNode;\n private delayWet: GainNode;\n\n // Per-slot bypass routing\n private eqBypass: GainNode;\n private compBypass: GainNode;\n private reverbBypass: GainNode;\n private delayBypass: GainNode;\n\n // Junction nodes between stages\n private postEq: GainNode;\n private postComp: GainNode;\n private postReverb: GainNode;\n\n private _params: StemEffects;\n\n constructor(ctx: AudioContext) {\n this.ctx = ctx;\n this._params = structuredClone(DEFAULT_EFFECTS);\n\n this.input = ctx.createGain();\n this.output = ctx.createGain();\n\n // ── EQ ──\n this.eqLow = ctx.createBiquadFilter();\n this.eqLow.type = 'lowshelf';\n this.eqLow.frequency.value = 320;\n this.eqLow.gain.value = 0;\n\n this.eqMid = ctx.createBiquadFilter();\n this.eqMid.type = 'peaking';\n this.eqMid.frequency.value = 1000;\n this.eqMid.Q.value = 0.7;\n this.eqMid.gain.value = 0;\n\n this.eqHigh = ctx.createBiquadFilter();\n this.eqHigh.type = 'highshelf';\n this.eqHigh.frequency.value = 3200;\n this.eqHigh.gain.value = 0;\n\n this.eqBypass = ctx.createGain();\n\n // ── Compressor ──\n this.compressor = ctx.createDynamicsCompressor();\n this.compressor.threshold.value = -24;\n this.compressor.ratio.value = 4;\n this.compressor.attack.value = 0.003;\n this.compressor.release.value = 0.25;\n this.compressor.knee.value = 30;\n\n this.compBypass = ctx.createGain();\n\n // ── Reverb ──\n this.convolver = ctx.createConvolver();\n this.convolver.buffer = this.generateImpulse(2.0);\n this.reverbDry = ctx.createGain();\n this.reverbDry.gain.value = 1;\n this.reverbWet = ctx.createGain();\n this.reverbWet.gain.value = 0;\n this.reverbBypass = ctx.createGain();\n\n // ── Delay ──\n this.delayNode = ctx.createDelay(5);\n this.delayNode.delayTime.value = 0.375;\n this.delayFeedback = ctx.createGain();\n this.delayFeedback.gain.value = 0.35;\n this.delayDry = ctx.createGain();\n this.delayDry.gain.value = 1;\n this.delayWet = ctx.createGain();\n this.delayWet.gain.value = 0;\n this.delayBypass = ctx.createGain();\n\n // Delay feedback loop\n this.delayNode.connect(this.delayFeedback);\n this.delayFeedback.connect(this.delayNode);\n\n // ── Junction nodes ──\n this.postEq = ctx.createGain();\n this.postComp = ctx.createGain();\n this.postReverb = ctx.createGain();\n\n // Initial routing (all bypassed)\n this.rebuildRouting();\n }\n\n /**\n * Rebuild the full routing graph based on current bypass states.\n * Uses disconnect-all then reconnect to avoid orphaned connections.\n */\n private rebuildRouting(): void {\n const p = this._params;\n\n // Disconnect everything from the chain anchors\n this.input.disconnect();\n this.eqLow.disconnect();\n this.eqMid.disconnect();\n this.eqHigh.disconnect();\n this.eqBypass.disconnect();\n this.postEq.disconnect();\n this.compressor.disconnect();\n this.compBypass.disconnect();\n this.postComp.disconnect();\n this.reverbDry.disconnect();\n this.reverbWet.disconnect();\n this.convolver.disconnect();\n this.reverbBypass.disconnect();\n this.postReverb.disconnect();\n this.delayDry.disconnect();\n this.delayWet.disconnect();\n this.delayNode.disconnect();\n this.delayFeedback.disconnect();\n this.delayBypass.disconnect();\n\n // Re-establish delay feedback loop\n this.delayNode.connect(this.delayFeedback);\n this.delayFeedback.connect(this.delayNode);\n\n // Stage 1: EQ\n if (p.eq.enabled) {\n this.input.connect(this.eqLow);\n this.eqLow.connect(this.eqMid);\n this.eqMid.connect(this.eqHigh);\n this.eqHigh.connect(this.postEq);\n } else {\n this.input.connect(this.postEq);\n }\n\n // Stage 2: Compressor\n if (p.compressor.enabled) {\n this.postEq.connect(this.compressor);\n this.compressor.connect(this.postComp);\n } else {\n this.postEq.connect(this.postComp);\n }\n\n // Stage 3: Reverb (parallel dry/wet)\n if (p.reverb.enabled) {\n this.postComp.connect(this.reverbDry);\n this.postComp.connect(this.convolver);\n this.convolver.connect(this.reverbWet);\n this.reverbDry.connect(this.postReverb);\n this.reverbWet.connect(this.postReverb);\n } else {\n this.postComp.connect(this.postReverb);\n }\n\n // Stage 4: Delay (parallel dry/wet)\n if (p.delay.enabled) {\n this.postReverb.connect(this.delayDry);\n this.postReverb.connect(this.delayNode);\n this.delayNode.connect(this.delayWet);\n this.delayDry.connect(this.output);\n this.delayWet.connect(this.output);\n } else {\n this.postReverb.connect(this.output);\n }\n }\n\n /** Generate a synthetic impulse response for reverb */\n private generateImpulse(decay: number): AudioBuffer {\n const rate = this.ctx.sampleRate;\n const length = Math.floor(rate * Math.min(decay, 6));\n const buf = this.ctx.createBuffer(2, length, rate);\n for (let ch = 0; ch < 2; ch++) {\n const data = buf.getChannelData(ch);\n for (let i = 0; i < length; i++) {\n data[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / length, decay * 0.8);\n }\n }\n return buf;\n }\n\n // ── Public API ───────────────────────────────────────────────────\n\n get params(): StemEffects { return this._params; }\n\n updateEQ(p: Partial<EQParams>): void {\n Object.assign(this._params.eq, p);\n const eq = this._params.eq;\n this.eqLow.frequency.value = eq.lowFreq;\n this.eqLow.gain.value = eq.lowGain;\n this.eqMid.gain.value = eq.midGain;\n this.eqHigh.frequency.value = eq.highFreq;\n this.eqHigh.gain.value = eq.highGain;\n if ('enabled' in p) this.rebuildRouting();\n }\n\n updateCompressor(p: Partial<CompressorParams>): void {\n Object.assign(this._params.compressor, p);\n const c = this._params.compressor;\n const t = this.ctx.currentTime;\n this.compressor.threshold.setValueAtTime(c.threshold, t);\n this.compressor.ratio.setValueAtTime(c.ratio, t);\n this.compressor.attack.setValueAtTime(c.attack, t);\n this.compressor.release.setValueAtTime(c.release, t);\n this.compressor.knee.setValueAtTime(c.knee, t);\n if ('enabled' in p) this.rebuildRouting();\n }\n\n updateReverb(p: Partial<ReverbParams>): void {\n Object.assign(this._params.reverb, p);\n const r = this._params.reverb;\n const t = this.ctx.currentTime;\n this.reverbDry.gain.setValueAtTime(1 - r.mix, t);\n this.reverbWet.gain.setValueAtTime(r.mix, t);\n if ('decay' in p) {\n this.convolver.buffer = this.generateImpulse(r.decay);\n }\n if ('enabled' in p) this.rebuildRouting();\n }\n\n updateDelay(p: Partial<DelayParams>): void {\n Object.assign(this._params.delay, p);\n const d = this._params.delay;\n const t = this.ctx.currentTime;\n this.delayNode.delayTime.setValueAtTime(d.time, t);\n this.delayFeedback.gain.setValueAtTime(d.feedback, t);\n this.delayDry.gain.setValueAtTime(1 - d.mix, t);\n this.delayWet.gain.setValueAtTime(d.mix, t);\n if ('enabled' in p) this.rebuildRouting();\n }\n\n applyAll(fx: StemEffects): void {\n this.updateEQ(fx.eq);\n this.updateCompressor(fx.compressor);\n this.updateReverb(fx.reverb);\n this.updateDelay(fx.delay);\n }\n\n dispose(): void {\n try {\n this.input.disconnect();\n this.output.disconnect();\n } catch { /* already disconnected */ }\n }\n}\n","/**\n * DAWController – Per-bar quantized worklet playback with independent stem positioning.\n *\n * Each track's fMP4 is downloaded and decoded into 4 AudioBuffers (one per stem).\n * Playback uses persistent daw-stem-processor AudioWorklets that hold the full\n * buffer and use a per-bar speed map for sample-accurate tempo quantization.\n *\n * Each bar of each track is played at the exact speed needed to fit the master\n * bar grid, so bars align perfectly across tracks regardless of tempo drift in\n * the original recordings.\n */\n\nimport { BrowserEventEmitter } from './event-emitter';\nimport type { ITrackForSequence } from '@/stem-audio-engine-v3/interface';\nimport { DEFAULT_PITCH_SETTINGS } from '../interfaces';\nimport type { DAWTrack, DAWChannel, PitchEngineSettings } from '../interfaces';\nimport { barToSample, type IBarMapping } from '../primitives/bar-utils';\nimport { useDAWSessionStore } from '../store/daw-session-store';\nimport {\n loadTrackStemsFromMp3Urls,\n loadTrackStemsProgressively,\n type StemAudioBuffers,\n type LoadProgress,\n type StemUrls,\n} from './daw-track-loader';\nimport {\n cacheFullFileForOffline,\n type ProgressiveLoadHandle,\n type StemPatch,\n} from './progressive-track-loader';\nimport {\n initMipmapsForTrack,\n appendPeaksToMipmapCache,\n clearWaveformCacheForTrack,\n} from '../components/waveform-cache';\nimport { calculateTempoMatch, semitonesToPitchFactor } from '../primitives/tempo-utils';\nimport { StemEffectChain, type StemEffects } from './stem-effect-chain';\nimport isMobile from 'is-mobile';\nimport { getWorkletPath_RubberBand, getWorkletPath_Phaze } from '@/utils/platform-env';\n\nconst SAMPLE_RATE = 48000;\nconst STEM_LABELS: (keyof StemAudioBuffers)[] = ['other', 'vocals', 'bass', 'drums'];\nconst DAW_WORKLET_PATH = '/workers/daw-stem-processor.js';\nconst USE_PHAZE = isMobile();\nconst PITCH_WORKLET_NAME = USE_PHAZE ? 'phase-vocoder-processor' : 'realtime-pitch-shift-processor';\n\nconst METRO_LOOK_AHEAD_SEC = 0.1;\nconst METRO_SCHEDULE_INTERVAL_MS = 25;\n\n/**\n * Soft cap on how many tracks may hold their decoded PCM in memory at once.\n *\n * A fully decoded 4-min stereo track at 48 kHz costs ~4 stems × ~46M samples\n * × 4 bytes ≈ 180 MB before the worklet+mirror+mipmap triplication. Without\n * a cap, mass imports (stem.fm sessions) or long sessions on low-RAM\n * devices eventually exhaust browser memory and new `decodeAudioData` /\n * `AudioBuffer` allocations start failing silently — the symptom the user\n * sees is \"tracks won't load after the Nth one\".\n *\n * When the cap is reached we DUMP the LRU undumped tracks' PCM (worklet\n * channels + main-thread mirror + mipmap), keep their store metadata +\n * timeline placement intact, and re-decode from IndexedDB on demand when\n * the user plays them again. The encoded fMP4 (~3-5 MB / track) stays in\n * IndexedDB regardless, so re-hydration is local and fast.\n *\n * Mobile devices get a tighter cap by default. Override at runtime via\n * `DAWController.getInstance().setMaxDecodedTracks(n)`.\n */\nconst DEFAULT_MAX_DECODED_TRACKS = isMobile() ? 6 : 12;\n\n// ── Bar map entry (sent to worklet) ─────────────────────────────────\n\ninterface BarMapEntry {\n sampleStart: number;\n speed: number;\n}\n\n/** Per-bar pitch correction data (kept on main thread for Rubberband updates) */\ninterface BarPitchEntry {\n /** Pitch correction in semitones to compensate this bar's speed change */\n pitchCorrectionSemitones: number;\n /** The speed ratio for this bar (for logging) */\n speed: number;\n}\n\n/**\n * Build a per-bar speed map for a track.\n *\n * When subdivisions > 1, speed is linearly interpolated between parent bar\n * midpoints, then rescaled so the average speed across each parent bar's\n * sub-bars equals the original parent speed. This preserves total timing\n * while giving a smooth speed ramp at bar boundaries.\n */\nfunction buildBarMap(\n barMapping: IBarMapping[],\n masterBarLength: number,\n nativeBarLength: number,\n subdivisions: number = 1,\n): BarMapEntry[] {\n const tempoMatch = calculateTempoMatch(masterBarLength, nativeBarLength);\n const targetBarLength = tempoMatch.targetBarLength;\n const subs = Math.max(1, subdivisions);\n\n const parentSpeeds = barMapping.map((bar) => bar.duration / targetBarLength);\n\n if (subs <= 1) {\n return barMapping.map((bar, i) => ({\n sampleStart: bar.sampleStart,\n speed: parentSpeeds[i],\n }));\n }\n\n // Compute globally continuous interpolated speeds — no per-bar rescaling.\n // Each sub-bar's speed is linearly interpolated between parent bar midpoints,\n // giving a perfectly smooth ramp with zero boundary discontinuity.\n //\n // Timing is preserved by computing each sub-bar's sampleStart from the\n // cumulative native samples consumed at the interpolated speed, anchored to\n // each parent bar's known sampleStart.\n const totalSubs = barMapping.length * subs;\n const speeds: number[] = new Array(totalSubs);\n\n for (let i = 0; i < totalSubs; i++) {\n const parentPos = (i + 0.5) / subs;\n const lo = Math.floor(parentPos - 0.5);\n const hi = lo + 1;\n const t = parentPos - 0.5 - lo;\n const loSpeed = parentSpeeds[Math.max(0, Math.min(lo, parentSpeeds.length - 1))];\n const hiSpeed = parentSpeeds[Math.max(0, Math.min(hi, parentSpeeds.length - 1))];\n speeds[i] = loSpeed + (hiSpeed - loSpeed) * t;\n }\n\n // Build result with sampleStart positions derived from within each parent\n // bar. Sub-bar durations are proportional to their speed relative to the\n // bar's average speed, so the total duration stays correct.\n const result: BarMapEntry[] = [];\n for (let b = 0; b < barMapping.length; b++) {\n const bar = barMapping[b];\n const offset = b * subs;\n\n // Sum of speeds within this parent bar (for proportional distribution)\n let speedSum = 0;\n for (let s = 0; s < subs; s++) speedSum += speeds[offset + s];\n\n // Distribute the parent bar's native sample duration proportionally\n let cumSamples = 0;\n for (let s = 0; s < subs; s++) {\n result.push({\n sampleStart: Math.round(bar.sampleStart + cumSamples),\n speed: speeds[offset + s],\n });\n // Samples consumed by this sub-bar = (its share of the total speed) * total duration\n cumSamples += (speeds[offset + s] / speedSum) * bar.duration;\n }\n }\n return result;\n}\n\n/**\n * Build per-bar pitch correction values.\n * Each entry's pitch correction exactly cancels the speed artifact for that\n * entry's speed: -12 * log2(speed). Speed and pitch are always paired —\n * when speed is interpolated across sub-bars, the pitch correction follows.\n */\nfunction buildBarPitchMap(barMap: BarMapEntry[]): BarPitchEntry[] {\n return barMap.map((entry) => ({\n pitchCorrectionSemitones: -12 * Math.log2(entry.speed),\n speed: entry.speed,\n }));\n}\n\n// `barToSample` is the canonical bar→sample function, defined alongside\n// `IBarMapping` in primitives/bar-utils.ts and imported above. Keeping a\n// single implementation is critical: the timeline waveform renderer uses\n// the same function to slice the mipmap, which is the only way to keep\n// the drawn peaks visually aligned with the audio that's actually played\n// when bars have non-uniform durations (per-bar tempo variation).\n\n// ── Per-track runtime state ──────────────────────────────────────────\n\ninterface TrackRuntime {\n stems: StemAudioBuffers;\n worklets: AudioWorkletNode[]; // [other, vocals, bass, drums]\n stemGains: GainNode[];\n stemEffects: StemEffectChain[];\n trackGain: GainNode;\n pitchWorklet: AudioWorkletNode | null;\n barPitchMap: BarPitchEntry[];\n /** Track which bar's pitch correction is currently applied (-1 = none) */\n currentPitchBar: number;\n /** Current autotune correction in semitones (set by the autotune panel, summed into all pitch updates) */\n autotuneOffset: number;\n /** Last pitch string sent to the pitch worklet — used to skip redundant commands */\n lastPitchStr: string;\n /** Last correction in semitones — used for delta logging */\n lastCorrectionSt?: number;\n /** Progressive load handle (fMP4 streaming) — shared via `sourceCache`\n * when multiple track instances reference the same source URL. */\n loadHandle?: ProgressiveLoadHandle | null;\n /** Cache key (source URL) so `removeTrack` can decrement refcount on\n * the shared `sourceCache` entry. `null` for legacy MP3 / stem-URL\n * loads which aren't cached (always one-shot). */\n sourceCacheKey?: string | null;\n /** Unsubscribe handle for the shared `loadHandle.onPatch` listener\n * registered by this track instance. Called from `removeTrack` so\n * the cache stops fanning patches at a disposed worklet. */\n unsubscribePatch?: (() => void) | null;\n /** True once the playable threshold has been crossed (first ~8s decoded) */\n playable?: boolean;\n /** True once every byte has decoded */\n loaded?: boolean;\n /**\n * True when the audio PCM has been dumped to free memory. The worklets,\n * audio graph and store track stay intact — the track still exists on\n * the timeline, just silent — until `rehydrateTrackAudio` re-decodes\n * it from IndexedDB.\n */\n dumped?: boolean;\n /**\n * `performance.now()` of the last user-facing interaction with this\n * track (play, seek into its range, patch landing). Drives LRU eviction\n * when the decoded-tracks cap is exceeded.\n */\n lastAccessAt: number;\n /**\n * Snapshot of the original `ITrackForSequence` used to add this track.\n * Needed so `rehydrateTrackAudio` can re-run the progressive loader\n * without depending on the (mutated) store state.\n */\n trackData: ITrackForSequence;\n /**\n * True while a dump or rehydrate is in flight. Prevents reentrancy\n * (e.g. the eviction sweep racing with auto-rehydration on play).\n */\n transitioning?: boolean;\n}\n\n// ── Shared source cache (Phase 1: dedup decode work across clips) ────\n\n/**\n * One-per-unique-source-URL entry. Lets multiple `DAWTrack` instances\n * (e.g. the N clips a stem.fm session emits for the same source track)\n * share a single fMP4 fetch + WebCodecs decode pipeline.\n *\n * Each subscriber still owns its own worklets, mute regions and\n * timeline placement — only the expensive bits (network + decode) are\n * shared. Patches arrive from `loadHandle.onPatch` and are fanned out\n * to every subscriber's per-track listener via `loadHandle.onPatch`'s\n * native multi-subscribe (we just clone the patch arrays before each\n * worklet `postMessage` so the transfer-to-worklet on subscriber #1\n * doesn't detach the buffer for subscribers #2…N).\n */\ninterface SourceCacheEntry {\n /** Source URL — also the cache key. */\n url: string;\n /** How many `DAWTrack` instances currently reference this source. */\n refCount: number;\n /**\n * Initial stem buffers returned by `loadTrackStemsProgressively`.\n * Filled in by the patch listener as decoding progresses; kept for\n * the lifetime of the cache entry so newly-joining tracks can\n * snapshot the already-decoded portion when binding their worklets.\n */\n stems: StemAudioBuffers;\n /** Underlying fMP4 progressive decode handle (shared). */\n loadHandle: ProgressiveLoadHandle | null;\n}\n\n// ═════════════════════════════════════════════════════════════════════\n\nexport class DAWController extends BrowserEventEmitter {\n private ctx: AudioContext | null = null;\n private masterGain: GainNode | null = null;\n private tracks: Map<string, TrackRuntime> = new Map();\n /** URL → shared decode entry. See `SourceCacheEntry`. */\n private sourceCache: Map<string, SourceCacheEntry> = new Map();\n private isInitialised = false;\n private _pitchWorkletAvailable = false;\n\n private _playing = false;\n private _playStartCtxTime = 0;\n private _playStartOffset = 0;\n private playheadAnimationId: number | null = null;\n private _seekGen = 0;\n\n /**\n * Max number of tracks allowed to hold their decoded PCM concurrently.\n * Beyond this we evict LRU tracks via `dumpTrackAudio`. See\n * `DEFAULT_MAX_DECODED_TRACKS` for the rationale.\n */\n private _maxDecodedTracks = DEFAULT_MAX_DECODED_TRACKS;\n\n // Track which stems are currently playing so we can start/stop\n // them as the playhead crosses their timeline boundaries.\n private _stemActive = new Map<string, boolean>();\n\n // Metronome\n private _metronomeOn = false;\n private _metronomeDownbeatOnly = true;\n private _metronomeGain: GainNode | null = null;\n private _metronomeScheduleId: ReturnType<typeof setInterval> | null = null;\n private _metronomeNextBeat = 0;\n\n // CPU monitoring\n private _cpuPollId: ReturnType<typeof setInterval> | null = null;\n private _cpuUsage = 0;\n\n // Native playback mode — disables tempo quantization for a single track\n // so the beat lab can play audio at original speed (beat markers align 1:1).\n private _nativeModeTrackId: string | null = null;\n private _nativeModeOriginalBarMap: BarMapEntry[] | null = null;\n /** Native-time offset (samples) at the moment play/seek was last called in native mode */\n private _nativeStartSample = 0;\n\n private static instance: DAWController | null = null;\n static getInstance(): DAWController {\n if (!DAWController.instance) DAWController.instance = new DAWController();\n return DAWController.instance;\n }\n private constructor() { super(); }\n\n // ── Init ──────────────────────────────────────────────────────────\n\n async init(): Promise<void> {\n if (this.isInitialised) return;\n this.ctx = new AudioContext({ sampleRate: SAMPLE_RATE });\n console.log('[DAWController.init] AudioContext created, state:', this.ctx.state);\n this.ctx.addEventListener('statechange', () => {\n console.log('[DAWController] AudioContext statechange →', this.ctx!.state);\n if (this.ctx!.state === 'suspended' && this._playing) {\n console.warn('[DAWController] Context suspended while playing — auto-resuming');\n this.ctx!.resume().catch(() => {});\n }\n });\n await this.ctx.audioWorklet.addModule(DAW_WORKLET_PATH);\n const pitchWorkletPath = USE_PHAZE ? getWorkletPath_Phaze() : getWorkletPath_RubberBand();\n try {\n await this.ctx.audioWorklet.addModule(pitchWorkletPath);\n this._pitchWorkletAvailable = true;\n } catch (err) {\n console.warn('[DAWController] Pitch worklet failed to load, transpose unavailable:', err);\n this._pitchWorkletAvailable = false;\n }\n this.masterGain = this.ctx.createGain();\n this.masterGain.connect(this.ctx.destination);\n this.isInitialised = true;\n this.emit('initialised');\n }\n\n isReady() { return this.isInitialised; }\n\n /**\n * Resolve when the named track's audio has fully decoded. If the\n * decode is already complete (common with the source-cache when\n * multiple clips share one source), resolve immediately on the next\n * microtask. Rejects if the track is removed or no such track exists.\n *\n * Use this instead of `controller.on('trackLoaded', …)` from\n * importers / batch loaders — the event fires once and a late\n * subscriber would miss it. This helper closes that race.\n */\n whenTrackLoaded(trackId: string): Promise<void> {\n const rt = this.tracks.get(trackId);\n if (!rt) return Promise.reject(new Error(`Unknown track ${trackId}`));\n if (rt.loaded) return Promise.resolve();\n return new Promise<void>((resolve, reject) => {\n const onLoaded = (loadedId: string) => {\n if (loadedId !== trackId) return;\n cleanup();\n resolve();\n };\n const onRemoved = (removedId: string) => {\n if (removedId !== trackId) return;\n cleanup();\n reject(new Error(`Track ${trackId} removed before load completed`));\n };\n const cleanup = () => {\n this.off('trackLoaded', onLoaded);\n this.off('trackRemoved', onRemoved);\n };\n this.on('trackLoaded', onLoaded);\n this.on('trackRemoved', onRemoved);\n });\n }\n getAudioContext() { return this.ctx; }\n getMasterGainNode() { return this.masterGain; }\n\n // ── Track lifecycle ──────────────────────────────────────────────\n\n async addTrack(\n trackData: ITrackForSequence,\n onProgress?: (p: LoadProgress) => void,\n ): Promise<DAWTrack | null> {\n if (!this.isInitialised) await this.init();\n\n // Before kicking off a new decode, free PCM from the LRU tracks if\n // we're at or above the cap. We free down to `cap - 1` so the new\n // track has headroom. Dumped tracks keep their store entry and\n // timeline placement — they can be rehydrated on play/seek from\n // IndexedDB. Without this gate, mass imports eventually OOM the\n // browser and subsequent `addTrack`s fail silently inside the\n // progressive decoder.\n this.evictLRUDecodedTracks(this._maxDecodedTracks - 1);\n\n let stems: StemAudioBuffers;\n let loadHandle: ProgressiveLoadHandle | null = null;\n let sourceCacheKey: string | null = null;\n const stemUrls = (trackData as { stemUrls?: StemUrls }).stemUrls;\n try {\n if (stemUrls) {\n // MP3 stem-URL path stays as the legacy full-download flow.\n // Not source-cached — it's the legacy path used only by\n // user-uploaded stems, which are unique per upload anyway.\n // TODO: progressive variant requires a WebCodecs AudioDecoder\n // with mp3 codec + a custom MPEG frame splitter.\n stems = await loadTrackStemsFromMp3Urls(stemUrls, onProgress);\n } else {\n // Progressive fMP4 path with shared-source cache.\n //\n // If another `DAWTrack` is already streaming the same URL\n // (e.g. a previous clip from the same stem.fm session\n // import), reuse its in-flight decode pipeline — we get\n // back the same `stems` buffers (which fill in as decoding\n // progresses) and the same `loadHandle` (which fans patches\n // to every subscriber). On a fresh URL we kick off a new\n // progressive load and stash it for any future siblings.\n sourceCacheKey = trackData.url;\n const cached = this.sourceCache.get(sourceCacheKey);\n if (cached) {\n cached.refCount++;\n stems = cached.stems;\n loadHandle = cached.loadHandle;\n // No fresh `onProgress` events will fire for a cache\n // hit (the loadHandle was created earlier), so synth a\n // best-effort \"instant\" progress to the caller.\n onProgress?.({ phase: 'decoding', percent: 100, detail: 'Using shared source decode' });\n } else {\n const result = await loadTrackStemsProgressively(\n trackData.url,\n trackData.duration,\n onProgress,\n );\n stems = result.initial;\n loadHandle = result.handle;\n this.sourceCache.set(sourceCacheKey, {\n url: sourceCacheKey,\n refCount: 1,\n stems,\n loadHandle,\n });\n }\n }\n } catch (err) {\n console.error('[DAWController] Failed to load stems:', err);\n return null;\n }\n\n const store = useDAWSessionStore.getState();\n const dawTrack = store.addTrack(trackData);\n const trackId = dawTrack.id;\n\n const trackGain = this.ctx!.createGain();\n trackGain.connect(this.masterGain!);\n\n // Create pitch worklet (one per track, between stem gains and trackGain)\n let pitchWorklet: AudioWorkletNode | null = null;\n if (this._pitchWorkletAvailable) {\n try {\n const settings = dawTrack.pitchSettings;\n if (USE_PHAZE) {\n pitchWorklet = new AudioWorkletNode(this.ctx!, PITCH_WORKLET_NAME, {\n channelCount: 2,\n channelCountMode: 'explicit',\n outputChannelCount: [2],\n });\n } else {\n pitchWorklet = new AudioWorkletNode(this.ctx!, PITCH_WORKLET_NAME, {\n numberOfInputs: 1,\n numberOfOutputs: 1,\n channelCount: 2,\n channelCountMode: 'explicit',\n outputChannelCount: [2],\n processorOptions: {\n pitchTransitionStep: 1.0,\n formantOption: settings.formantOption,\n pitchOption: settings.pitchOption,\n engineOption: settings.engineOption,\n quality: true,\n },\n });\n }\n pitchWorklet.connect(trackGain);\n this.configurePitchWorklet(pitchWorklet, settings);\n } catch (err) {\n console.warn('[DAWController] Failed to create pitch worklet for track:', err);\n pitchWorklet = null;\n }\n }\n\n // Stem signals connect to pitchWorklet if available, otherwise directly to trackGain\n const stemTarget = pitchWorklet ?? trackGain;\n\n const worklets: AudioWorkletNode[] = [];\n const stemGains: GainNode[] = [];\n const stemEffects: StemEffectChain[] = [];\n\n // Build the per-bar speed map for this track (subdivided if configured)\n const freshStore = useDAWSessionStore.getState();\n const freshTrack = freshStore.getTrackById(trackId)!;\n const barMap = buildBarMap(\n freshTrack.barMapping,\n freshStore.masterBarLength48000,\n freshTrack.nativeBarLength,\n freshStore.barSubdivisions,\n );\n\n STEM_LABELS.forEach((label, stemIdx) => {\n const stemGain = this.ctx!.createGain();\n stemGain.connect(stemTarget);\n\n // Per-stem effect chain: worklet → effectChain → stemGain\n const fxChain = new StemEffectChain(this.ctx!);\n fxChain.output.connect(stemGain);\n\n const worklet = new AudioWorkletNode(this.ctx!, 'daw-stem-processor', {\n numberOfInputs: 0,\n numberOfOutputs: 1,\n outputChannelCount: [2],\n });\n worklet.connect(fxChain.input);\n\n const buf = stems[label];\n if (buf) {\n const channels: Float32Array[] = [];\n for (let ch = 0; ch < buf.numberOfChannels; ch++) {\n channels.push(new Float32Array(buf.getChannelData(ch)));\n }\n worklet.port.postMessage({ type: 'load-buffer', channels }, channels.map(c => c.buffer));\n }\n\n // Send bar map so the worklet can do per-bar speed adjustment\n worklet.port.postMessage({ type: 'load-bar-map', entries: barMap });\n worklet.port.postMessage({ type: 'set-global-rate', rate: freshStore.globalPlaybackRate });\n\n // Listen for bar-boundary crossings from the first stem worklet only\n if (stemIdx === 0) {\n worklet.port.onmessage = (msg: MessageEvent) => {\n const d = msg.data;\n if (d?.type === 'bar-changed') {\n this.handleWorkletBarChange(trackId, d.barIndex);\n }\n };\n }\n\n worklets.push(worklet);\n stemGains.push(stemGain);\n stemEffects.push(fxChain);\n });\n\n const barPitchMap = buildBarPitchMap(barMap);\n const rt: TrackRuntime = {\n stems,\n worklets,\n stemGains,\n stemEffects,\n trackGain,\n pitchWorklet,\n barPitchMap,\n currentPitchBar: -1,\n autotuneOffset: 0,\n lastPitchStr: '',\n loadHandle,\n sourceCacheKey,\n unsubscribePatch: null,\n playable: loadHandle ? false : true,\n loaded: loadHandle ? false : true,\n dumped: false,\n lastAccessAt: performance.now(),\n trackData,\n };\n this.tracks.set(trackId, rt);\n\n // Wire per-bar pitch data to the first stem worklet for sample-accurate\n // pitch changes synced with speed changes (no main-thread round-trip)\n this.syncWorkletPitchMap(trackId);\n\n // Apply initial pitch correction (compensate tempo-induced drift)\n this.syncPitchForTrack(trackId);\n this.syncGainsForTrack(trackId);\n\n // ── Progressive decode wiring ─────────────────────────────────\n // Init waveform mipmaps for all 4 stems at the track's total length.\n // Patches will fill in the mipmap incrementally; un-decoded regions\n // render as a flat centerline until they land.\n if (loadHandle) {\n const totalSamples = loadHandle.totalSamples;\n for (const stemKey of ['bass', 'drums', 'other', 'vocals'] as const) {\n initMipmapsForTrack(trackId, stemKey, totalSamples);\n }\n\n // Patch listener: route incoming PCM slots to (a) the worklet,\n // (b) the main-thread AudioBuffer mirror used by non-worklet\n // consumers (BarSampler, copy/paste), (c) the waveform mipmap.\n //\n // IMPORTANT: With shared-source caching, multiple `DAWTrack`\n // instances may register patch listeners on the same handle.\n // The `loadHandle` calls each listener synchronously with the\n // SAME `patch.samples` reference. If we transfer those buffers\n // to a worklet, subscribers further down the list see detached\n // (length-0) Float32Arrays. So we ALWAYS clone for the worklet\n // post — losing the zero-copy optimisation, but keeping the\n // patch arrays usable for sibling subscribers. Clone cost is\n // ~30ms per multi-stem batch, negligible vs. the decode work\n // it lets us avoid re-doing.\n const unsubscribe = loadHandle.onPatch((patch: StemPatch) => {\n const rtNow = this.tracks.get(trackId);\n if (!rtNow) return; // track removed while loading\n if (rtNow.dumped) return; // patches arriving for a dumped track are stale\n\n // Decoding patches are user-relevant activity — bump LRU so\n // a still-loading track isn't picked for eviction.\n rtNow.lastAccessAt = performance.now();\n\n // STEM_LABELS = ['other', 'vocals', 'bass', 'drums']\n const stemIdx = STEM_LABELS.indexOf(patch.stem as keyof StemAudioBuffers);\n if (stemIdx < 0) return;\n\n const w = rtNow.worklets[stemIdx];\n const [left, right] = patch.samples;\n\n // Clone three times (worklet, main-thread mirror, mipmap)\n // so this listener never observes a buffer that's been\n // transferred elsewhere by a sibling subscriber.\n const workletL = new Float32Array(left);\n const workletR = new Float32Array(right);\n const mirrorL = new Float32Array(left);\n const mirrorR = new Float32Array(right);\n\n // (a) Hand the patch to the worklet. The clones are local\n // to this subscriber so transferring is safe.\n w.port.postMessage(\n { type: 'patch-buffer', sampleOffset: patch.sampleOffset, channels: [workletL, workletR] },\n [workletL.buffer, workletR.buffer],\n );\n\n // (b) Main-thread AudioBuffer mirror — keeps getStemBuffers()\n // and bar-sampler/paste-audio operations in sync with\n // what the worklet hears. With shared sources every\n // subscriber writes the same data to the same buffer\n // (the cache entry's stems object IS rtNow.stems);\n // it's idempotent and cheap.\n const buf = rtNow.stems[patch.stem];\n if (buf) {\n const writeStart = patch.sampleOffset;\n const remaining = buf.length - writeStart;\n const writeLen = Math.max(0, Math.min(mirrorL.length, remaining));\n if (writeLen > 0) {\n const ch0 = buf.getChannelData(0);\n ch0.set(mirrorL.subarray(0, writeLen), writeStart);\n if (buf.numberOfChannels > 1) {\n const ch1 = buf.getChannelData(1);\n ch1.set(mirrorR.subarray(0, writeLen), writeStart);\n }\n }\n }\n\n // (c) Waveform mipmap update — bumps the version counter so\n // the timeline canvas will redraw on its next frame.\n // Per-track because mipmaps are keyed by trackId.\n appendPeaksToMipmapCache(\n trackId,\n patch.stem,\n patch.sampleOffset,\n mirrorL,\n mirrorR,\n );\n });\n rt.unsubscribePatch = unsubscribe;\n\n // Cache hit: the source has likely already received some\n // patches before this track joined. The fresh worklet only\n // got the load-buffer snapshot of `stems` AS IT WAS at that\n // moment, but the mipmap cache for this trackId is empty —\n // backfill it from the snapshot we already loaded into the\n // worklet so the timeline waveform renders without waiting\n // for the next patch.\n //\n // For the fresh-load case the snapshot is all zeros, so\n // backfilling is a no-op (mipmaps stay flat until patches\n // arrive). For cache-hit it produces an instant waveform.\n if (sourceCacheKey && this.sourceCache.get(sourceCacheKey)?.refCount && this.sourceCache.get(sourceCacheKey)!.refCount > 1) {\n for (const stemKey of ['bass', 'drums', 'other', 'vocals'] as const) {\n const buf = stems[stemKey];\n if (!buf) continue;\n const ch0 = new Float32Array(buf.getChannelData(0));\n const ch1 = buf.numberOfChannels > 1\n ? new Float32Array(buf.getChannelData(1))\n : ch0;\n appendPeaksToMipmapCache(trackId, stemKey, 0, ch0, ch1);\n }\n }\n\n loadHandle.playable\n .then(() => {\n const rtNow = this.tracks.get(trackId);\n if (!rtNow) return;\n rtNow.playable = true;\n this.emit('trackPlayable', trackId);\n })\n .catch((err) => {\n console.warn('[DAWController] progressive load failed before playable threshold:', err);\n });\n\n loadHandle.complete\n .then(() => {\n const rtNow = this.tracks.get(trackId);\n if (!rtNow) return;\n rtNow.loaded = true;\n this.emit('trackLoaded', trackId);\n // Best-effort cache full file for offline reopen\n void cacheFullFileForOffline(trackData.url);\n })\n .catch((err) => {\n console.warn('[DAWController] progressive load failed:', err);\n });\n }\n\n this.emit('trackAdded', trackId);\n return dawTrack;\n }\n\n // ── Decoded-tracks memory cap (dump / rehydrate) ─────────────────\n\n /**\n * Read the current cap. See `DEFAULT_MAX_DECODED_TRACKS` for context.\n */\n get maxDecodedTracks(): number { return this._maxDecodedTracks; }\n\n /**\n * Update the soft cap on simultaneously-decoded tracks. If the new cap\n * is lower than the current decoded count, the surplus LRU tracks are\n * dumped immediately.\n */\n setMaxDecodedTracks(n: number): void {\n const clamped = Math.max(1, Math.floor(n));\n if (clamped === this._maxDecodedTracks) return;\n this._maxDecodedTracks = clamped;\n this.evictLRUDecodedTracks(clamped);\n this.emit('maxDecodedTracksChanged', clamped);\n }\n\n /** Tracks currently holding their decoded PCM in memory. */\n private decodedTrackCount(): number {\n let n = 0;\n for (const rt of this.tracks.values()) if (!rt.dumped) n++;\n return n;\n }\n\n /** True if the named track is currently audible (playing into its range). */\n private isTrackAudible(trackId: string): boolean {\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!track) return false;\n const bar = store.playheadBar;\n for (const ch of track.channels) {\n const visStart = ch.timelineStartBar + ch.trimStartBar;\n const visEnd = ch.timelineStartBar + ch.trimEndBar;\n if (bar >= visStart && bar <= visEnd) return true;\n }\n return false;\n }\n\n /**\n * Free PCM from the least-recently-used undumped tracks until at most\n * `keep` tracks remain decoded. Audible tracks (containing the playhead)\n * and currently-transitioning tracks are excluded from eviction so\n * playback never goes silent unexpectedly.\n */\n private evictLRUDecodedTracks(keep: number): void {\n const max = Math.max(0, Math.floor(keep));\n let decoded = this.decodedTrackCount();\n if (decoded <= max) return;\n\n const candidates: Array<{ id: string; rt: TrackRuntime }> = [];\n for (const [id, rt] of this.tracks) {\n if (rt.dumped) continue;\n if (rt.transitioning) continue;\n if (this.isTrackAudible(id)) continue;\n candidates.push({ id, rt });\n }\n candidates.sort((a, b) => a.rt.lastAccessAt - b.rt.lastAccessAt);\n\n while (decoded > max && candidates.length > 0) {\n const victim = candidates.shift();\n if (!victim) break;\n this.dumpTrackAudio(victim.id);\n decoded--;\n }\n\n if (decoded > max) {\n // Every candidate was audible / transitioning — log and move on\n // rather than silencing the playhead. The cap will be respected\n // again on the next eviction sweep.\n console.warn(\n `[DAWController] decoded-tracks cap exceeded: have ${decoded}, ` +\n `want ${max}, but all extras are audible/transitioning.`,\n );\n }\n }\n\n /**\n * Release the decoded PCM held by a track to free memory without\n * removing the track from the timeline. The worklets, gains, and\n * effect chain stay wired so rehydration is a single message away.\n *\n * - Worklet stem buffers: `dump-buffer` clears the Float32Arrays.\n * - Main-thread mirror (`rt.stems`): replaced with 1-sample silent\n * AudioBuffers so legacy consumers (BarSampler, paste-audio) don't\n * null-deref. Re-allocated to full length on rehydrate.\n * - Waveform mipmaps: cleared so the timeline shows a flat\n * centerline until the track is rehydrated.\n * - In-flight decode: aborted (refcount on shared source decremented).\n */\n dumpTrackAudio(trackId: string): void {\n const rt = this.tracks.get(trackId);\n if (!rt || rt.dumped) return;\n\n rt.transitioning = true;\n try {\n try { rt.unsubscribePatch?.(); } catch { /* */ }\n rt.unsubscribePatch = null;\n\n if (rt.sourceCacheKey) {\n const entry = this.sourceCache.get(rt.sourceCacheKey);\n if (entry) {\n entry.refCount--;\n if (entry.refCount <= 0) {\n try { entry.loadHandle?.abort(); } catch { /* */ }\n this.sourceCache.delete(rt.sourceCacheKey);\n }\n }\n } else {\n try { rt.loadHandle?.abort(); } catch { /* */ }\n }\n rt.loadHandle = null;\n // Clear so a later `removeTrack` doesn't double-decrement the\n // shared refcount. `rehydrateTrackAudio` re-acquires the slot.\n rt.sourceCacheKey = null;\n\n for (const w of rt.worklets) {\n try { w.port.postMessage({ type: 'dump-buffer' }); } catch { /* */ }\n }\n for (let i = 0; i < rt.worklets.length; i++) {\n const key = `${trackId}:${i}`;\n this._stemActive.set(key, false);\n }\n\n // Replace the 4 AudioBuffers with silent stubs. We can't `null`\n // them because the type contract is non-nullable and several\n // call sites assume the keys exist (waveform renderer, paste\n // audio, native-mode seek). 1-sample stereo buffers are\n // ~triple-pointer overhead each — negligible vs. the multi-MB\n // they replace.\n if (this.ctx) {\n const ctx = this.ctx;\n const silent = (): AudioBuffer => ctx.createBuffer(2, 1, SAMPLE_RATE);\n rt.stems = {\n other: silent(),\n vocals: silent(),\n bass: silent(),\n drums: silent(),\n };\n }\n\n clearWaveformCacheForTrack(trackId);\n\n rt.dumped = true;\n rt.playable = false;\n rt.loaded = false;\n } finally {\n rt.transitioning = false;\n }\n\n this.emit('trackDumped', trackId);\n }\n\n /**\n * Re-decode a previously-dumped track from IndexedDB (the encoded fMP4\n * stays cached even after dump). Reuses the existing worklet/audio\n * graph — no node recreation — so rehydration is just a fresh\n * progressive decode that streams patches back into the same\n * worklets and mipmap cache.\n *\n * Returns true once `loadHandle.playable` resolves (enough audio for\n * playback to start). Background batches continue filling the buffer.\n */\n async rehydrateTrackAudio(trackId: string): Promise<boolean> {\n const rt = this.tracks.get(trackId);\n if (!rt) return false;\n if (!rt.dumped || rt.transitioning) return !rt.dumped;\n if (!this.isInitialised) await this.init();\n\n // Free a slot before allocating PCM for the rehydrate so we don't\n // exceed the cap and instantly evict somebody else.\n this.evictLRUDecodedTracks(this._maxDecodedTracks - 1);\n\n rt.transitioning = true;\n rt.lastAccessAt = performance.now();\n try {\n const stemUrls = (rt.trackData as { stemUrls?: StemUrls }).stemUrls;\n let stems: StemAudioBuffers;\n let loadHandle: ProgressiveLoadHandle | null = null;\n let sourceCacheKey: string | null = null;\n\n if (stemUrls) {\n stems = await loadTrackStemsFromMp3Urls(stemUrls);\n } else {\n sourceCacheKey = rt.trackData.url;\n const cached = this.sourceCache.get(sourceCacheKey);\n if (cached) {\n cached.refCount++;\n stems = cached.stems;\n loadHandle = cached.loadHandle;\n } else {\n const result = await loadTrackStemsProgressively(\n rt.trackData.url,\n rt.trackData.duration,\n );\n stems = result.initial;\n loadHandle = result.handle;\n this.sourceCache.set(sourceCacheKey, {\n url: sourceCacheKey,\n refCount: 1,\n stems,\n loadHandle,\n });\n }\n }\n\n rt.stems = stems;\n rt.loadHandle = loadHandle;\n rt.sourceCacheKey = sourceCacheKey;\n rt.dumped = false;\n rt.playable = loadHandle ? false : true;\n rt.loaded = loadHandle ? false : true;\n\n STEM_LABELS.forEach((label, stemIdx) => {\n const buf = stems[label];\n const w = rt.worklets[stemIdx];\n if (!buf || !w) return;\n const channels: Float32Array[] = [];\n for (let ch = 0; ch < buf.numberOfChannels; ch++) {\n channels.push(new Float32Array(buf.getChannelData(ch)));\n }\n w.port.postMessage({ type: 'load-buffer', channels }, channels.map((c) => c.buffer));\n });\n\n if (loadHandle) {\n const totalSamples = loadHandle.totalSamples;\n for (const stemKey of ['bass', 'drums', 'other', 'vocals'] as const) {\n initMipmapsForTrack(trackId, stemKey, totalSamples);\n }\n\n rt.unsubscribePatch = loadHandle.onPatch((patch: StemPatch) => {\n const rtNow = this.tracks.get(trackId);\n if (!rtNow || rtNow.dumped) return;\n rtNow.lastAccessAt = performance.now();\n\n const stemIdx = STEM_LABELS.indexOf(patch.stem as keyof StemAudioBuffers);\n if (stemIdx < 0) return;\n\n const w = rtNow.worklets[stemIdx];\n const [left, right] = patch.samples;\n const workletL = new Float32Array(left);\n const workletR = new Float32Array(right);\n const mirrorL = new Float32Array(left);\n const mirrorR = new Float32Array(right);\n\n w.port.postMessage(\n { type: 'patch-buffer', sampleOffset: patch.sampleOffset, channels: [workletL, workletR] },\n [workletL.buffer, workletR.buffer],\n );\n\n const buf = rtNow.stems[patch.stem];\n if (buf) {\n const writeStart = patch.sampleOffset;\n const remaining = buf.length - writeStart;\n const writeLen = Math.max(0, Math.min(mirrorL.length, remaining));\n if (writeLen > 0) {\n const ch0 = buf.getChannelData(0);\n ch0.set(mirrorL.subarray(0, writeLen), writeStart);\n if (buf.numberOfChannels > 1) {\n const ch1 = buf.getChannelData(1);\n ch1.set(mirrorR.subarray(0, writeLen), writeStart);\n }\n }\n }\n\n appendPeaksToMipmapCache(\n trackId,\n patch.stem,\n patch.sampleOffset,\n mirrorL,\n mirrorR,\n );\n });\n\n loadHandle.playable\n .then(() => {\n const rtNow = this.tracks.get(trackId);\n if (!rtNow || rtNow.dumped) return;\n rtNow.playable = true;\n this.emit('trackPlayable', trackId);\n })\n .catch(() => {});\n\n loadHandle.complete\n .then(() => {\n const rtNow = this.tracks.get(trackId);\n if (!rtNow || rtNow.dumped) return;\n rtNow.loaded = true;\n this.emit('trackLoaded', trackId);\n })\n .catch(() => {});\n }\n\n this.emit('trackRehydrated', trackId);\n return true;\n } catch (err) {\n console.error('[DAWController] Failed to rehydrate track:', trackId, err);\n return false;\n } finally {\n rt.transitioning = false;\n }\n }\n\n /** True if a track's decoded PCM has been freed. */\n isTrackDumped(trackId: string): boolean {\n return !!this.tracks.get(trackId)?.dumped;\n }\n\n removeTrack(trackId: string): void {\n const rt = this.tracks.get(trackId);\n if (rt) {\n // Stop fanning patches at this disposed worklet first — the\n // shared loadHandle may still be running for sibling tracks.\n try { rt.unsubscribePatch?.(); } catch { /* */ }\n\n // Source-cache refcount: only abort the underlying decode\n // when the LAST track referencing this source goes away.\n // Without this, removing one clip of a multi-clip source\n // would kill the in-flight decode for every other clip.\n if (rt.sourceCacheKey) {\n const entry = this.sourceCache.get(rt.sourceCacheKey);\n if (entry) {\n entry.refCount--;\n if (entry.refCount <= 0) {\n try { entry.loadHandle?.abort(); } catch { /* */ }\n this.sourceCache.delete(rt.sourceCacheKey);\n }\n }\n } else {\n // Legacy non-cached path (MP3 stem URLs) — abort directly.\n try { rt.loadHandle?.abort(); } catch { /* */ }\n }\n\n rt.worklets.forEach((w) => {\n w.port.postMessage({ type: 'stop' });\n w.disconnect();\n });\n rt.stemEffects.forEach((fx) => fx.dispose());\n rt.stemGains.forEach((g) => g.disconnect());\n try { rt.pitchWorklet?.disconnect(); } catch { /* */ }\n rt.trackGain.disconnect();\n }\n this.tracks.delete(trackId);\n clearWaveformCacheForTrack(trackId);\n useDAWSessionStore.getState().removeTrack(trackId);\n this.emit('trackRemoved', trackId);\n }\n\n getStemBuffers(trackId: string): StemAudioBuffers | undefined {\n return this.tracks.get(trackId)?.stems;\n }\n\n getStemEffectChain(trackId: string, stemIndex: number): StemEffectChain | null {\n return this.tracks.get(trackId)?.stemEffects[stemIndex] ?? null;\n }\n\n updateStemEffects(trackId: string, stemIndex: number, fx: StemEffects): void {\n const chain = this.getStemEffectChain(trackId, stemIndex);\n if (chain) chain.applyAll(fx);\n useDAWSessionStore.getState().setChannelEffects(trackId, stemIndex, fx);\n }\n\n // ── Per-bar precise seeking ──────────────────────────────────────\n\n /**\n * Compute the native buffer sample position for a stem at a given\n * global timeline bar, using the track's barMapping for precision.\n *\n * Returns null if the stem is outside its active region.\n */\n private computeStemSeekSamples(\n globalBar: number,\n channel: DAWChannel,\n track: DAWTrack,\n ): number | null {\n const visibleStart = channel.timelineStartBar + channel.trimStartBar;\n const visibleEnd = channel.timelineStartBar + channel.trimEndBar;\n\n if (globalBar < visibleStart || globalBar > visibleEnd) return null;\n\n const localBar = globalBar - channel.timelineStartBar;\n const barMapping = track.barMapping;\n if (!barMapping || barMapping.length === 0) return null;\n\n // Integer and fractional bar for sub-bar precision\n const barIdx = Math.min(Math.floor(localBar), barMapping.length - 1);\n const barFrac = localBar - Math.floor(localBar);\n\n const bar = barMapping[barIdx];\n // Position within this bar based on fractional part\n return Math.floor(bar.sampleStart + barFrac * bar.duration);\n }\n\n // ── Transport ────────────────────────────────────────────────────\n\n async play(): Promise<void> {\n if (!this.isInitialised) await this.init();\n\n if (this.ctx!.state !== 'running') {\n console.log('[DAWController.play] AudioContext state:', this.ctx!.state, '— resuming…');\n await this.ctx!.resume();\n // `state` is narrowed inside the outer branch; widened read for post-resume check.\n const stateAfterResume = (this.ctx as AudioContext).state;\n if (stateAfterResume !== 'running') {\n // Wait briefly for state change (Chrome can be async)\n await new Promise<void>((resolve) => {\n const check = () => {\n if (this.ctx!.state === 'running') return resolve();\n this.ctx!.addEventListener('statechange', check, { once: true });\n setTimeout(resolve, 500);\n };\n check();\n });\n console.log('[DAWController.play] AudioContext state after wait:', this.ctx!.state);\n }\n }\n\n const store = useDAWSessionStore.getState();\n const globalBar = store.playheadBar;\n\n // Auto-rehydrate any dumped tracks whose playable range contains the\n // playhead. Fire-and-forget — the worklets will start producing\n // audio as soon as their `playable` threshold resolves. Bumping\n // `lastAccessAt` here keeps these tracks off the eviction list\n // while they re-decode.\n for (const [trackId, rt] of this.tracks) {\n if (!rt.dumped) continue;\n if (!this.isTrackAudible(trackId)) continue;\n rt.lastAccessAt = performance.now();\n void this.rehydrateTrackAudio(trackId);\n }\n\n let stemsActivated = 0;\n let stemsPaused = 0;\n for (const [trackId, rt] of this.tracks) {\n const track = store.getTrackById(trackId);\n if (!track) continue;\n\n track.channels.forEach((ch, i) => {\n const key = `${trackId}:${i}`;\n const seekPos = this.computeStemSeekSamples(globalBar, ch, track);\n const w = rt.worklets[i];\n if (seekPos !== null) {\n w.port.postMessage({ type: 'seek', position: seekPos });\n w.port.postMessage({ type: 'play' });\n this._stemActive.set(key, true);\n stemsActivated++;\n rt.lastAccessAt = performance.now();\n } else {\n w.port.postMessage({ type: 'pause' });\n this._stemActive.set(key, false);\n stemsPaused++;\n }\n });\n }\n\n if (stemsActivated === 0 && this.tracks.size > 0) {\n const debugInfo: Record<string, unknown>[] = [];\n for (const [trackId] of this.tracks) {\n const t = store.getTrackById(trackId);\n debugInfo.push({\n trackId,\n found: !!t,\n barMappingLen: t?.barMapping?.length ?? -1,\n channels: t?.channels.map((ch) => ({\n timelineStart: ch.timelineStartBar,\n trimStart: ch.trimStartBar,\n trimEnd: ch.trimEndBar,\n visibleStart: ch.timelineStartBar + ch.trimStartBar,\n visibleEnd: ch.timelineStartBar + ch.trimEndBar,\n })),\n });\n }\n console.warn('[DAWController.play] No stems activated!', {\n globalBar,\n trackCount: this.tracks.size,\n stemsPaused,\n audioCtxState: this.ctx!.state,\n tracks: debugInfo,\n });\n }\n\n this._playStartCtxTime = this.ctx!.currentTime;\n this._playStartOffset = this.barToSeconds(globalBar);\n this._playing = true;\n store.setPlaying(true);\n\n // In native mode, record the native sample position we're starting from\n if (this._nativeModeTrackId) {\n const nTrack = store.getTrackById(this._nativeModeTrackId);\n if (nTrack) {\n const ch0 = nTrack.channels[0];\n const seekPos = ch0 ? this.computeStemSeekSamples(globalBar, ch0, nTrack) : null;\n this._nativeStartSample = seekPos ?? 0;\n }\n }\n\n // Apply per-bar pitch for the starting bar (one-shot, before worklet starts firing)\n for (const [trackId, rt] of this.tracks) {\n rt.currentPitchBar = -1;\n rt.lastPitchStr = '';\n this.sendInitialBarPitch(trackId, globalBar);\n }\n\n this.startPlayheadAnimation();\n if (this._metronomeOn) this.startMetronomeScheduler();\n this.emit('playing');\n }\n\n pause(): void {\n if (this._playing) {\n if (this._nativeModeTrackId) {\n this._nativeStartSample = this.getNativePositionSec() * SAMPLE_RATE;\n }\n const posSec = this.getCurrentPositionSec();\n useDAWSessionStore.getState().setPlayheadBar(this.secondsToBar(posSec));\n }\n\n for (const [, rt] of this.tracks) {\n rt.currentPitchBar = -1;\n rt.lastPitchStr = '';\n for (const w of rt.worklets) {\n w.port.postMessage({ type: 'pause' });\n }\n }\n\n this._playing = false;\n useDAWSessionStore.getState().setPlaying(false);\n this.stopPlayheadAnimation();\n this.stopMetronomeScheduler();\n\n // Reset pitch to static correction when not playing\n for (const trackId of this.tracks.keys()) {\n this.syncPitchForTrack(trackId);\n }\n\n this.emit('paused');\n }\n\n stop(): void {\n for (const [, rt] of this.tracks) {\n for (const w of rt.worklets) {\n w.port.postMessage({ type: 'stop' });\n }\n }\n\n this._playing = false;\n const store = useDAWSessionStore.getState();\n store.setPlaying(false);\n store.setPlayheadBar(0);\n this.stopPlayheadAnimation();\n this.stopMetronomeScheduler();\n this.emit('stopped');\n }\n\n async seekToBar(bar: number): Promise<void> {\n const gen = ++this._seekGen;\n const wasPlaying = this._playing;\n const store = useDAWSessionStore.getState();\n\n store.setPlayheadBar(bar);\n\n // Same auto-rehydrate sweep as `play()` — without this a dumped\n // track seeked into mid-playback would stay silent until the next\n // explicit play() call.\n if (wasPlaying) {\n for (const [trackId, rt] of this.tracks) {\n if (!rt.dumped) continue;\n if (!this.isTrackAudible(trackId)) continue;\n rt.lastAccessAt = performance.now();\n void this.rehydrateTrackAudio(trackId);\n }\n }\n\n for (const [trackId, rt] of this.tracks) {\n const track = store.getTrackById(trackId);\n if (!track) continue;\n\n track.channels.forEach((ch, i) => {\n const key = `${trackId}:${i}`;\n const seekPos = this.computeStemSeekSamples(bar, ch, track);\n const w = rt.worklets[i];\n if (seekPos !== null) {\n w.port.postMessage({ type: 'seek', position: seekPos });\n if (wasPlaying) w.port.postMessage({ type: 'play' });\n this._stemActive.set(key, wasPlaying);\n if (wasPlaying) rt.lastAccessAt = performance.now();\n } else if (wasPlaying) {\n w.port.postMessage({ type: 'pause' });\n this._stemActive.set(key, false);\n }\n });\n }\n\n if (wasPlaying && gen === this._seekGen) {\n this._playStartCtxTime = this.ctx!.currentTime;\n this._playStartOffset = this.barToSeconds(bar);\n const seekStep = this._metronomeDownbeatOnly ? 1 : 0.25;\n this._metronomeNextBeat = Math.ceil(bar / seekStep) * seekStep;\n }\n\n // Track native position for beat lab\n if (this._nativeModeTrackId) {\n const nTrack = store.getTrackById(this._nativeModeTrackId);\n if (nTrack) {\n const ch0 = nTrack.channels[0];\n const seekPos = ch0 ? this.computeStemSeekSamples(bar, ch0, nTrack) : null;\n this._nativeStartSample = seekPos ?? 0;\n }\n }\n\n // Immediately apply the correct per-bar pitch for the seek target\n for (const [trackId, rt] of this.tracks) {\n rt.currentPitchBar = -1;\n rt.lastPitchStr = '';\n this.sendInitialBarPitch(trackId, bar);\n }\n }\n\n // ── Master tempo / playback rate ────────────────────────────────\n\n setMasterTempo(bpm: number): void {\n const wasPlaying = this._playing;\n const store = useDAWSessionStore.getState();\n const currentBar = wasPlaying\n ? this.secondsToBar(this.getCurrentPositionSec())\n : store.playheadBar;\n\n store.setMasterTempo(bpm);\n\n const newStore = useDAWSessionStore.getState();\n\n // Recompute and send new bar maps + seek to correct positions\n for (const [trackId, rt] of this.tracks) {\n const track = newStore.getTrackById(trackId);\n if (!track) continue;\n\n const barMap = buildBarMap(\n track.barMapping,\n newStore.masterBarLength48000,\n track.nativeBarLength,\n newStore.barSubdivisions,\n );\n\n rt.barPitchMap = buildBarPitchMap(barMap);\n rt.currentPitchBar = -1;\n this.syncWorkletPitchMap(trackId);\n\n track.channels.forEach((ch, i) => {\n const w = rt.worklets[i];\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n\n const seekPos = this.computeStemSeekSamples(currentBar, ch, track);\n if (seekPos !== null) {\n w.port.postMessage({ type: 'seek', position: seekPos });\n }\n });\n }\n\n if (wasPlaying) {\n this._playStartOffset = this.barToSeconds(currentBar);\n this._playStartCtxTime = this.ctx!.currentTime;\n } else {\n newStore.setPlayheadBar(currentBar);\n }\n this.emit('tempoChanged', bpm);\n }\n\n /**\n * Reorder a track and, if it becomes the new first track, promote it as master.\n * Handles worklet bar map / pitch resync the same way setMasterTempo does.\n */\n reorderTrack(trackId: string, newIndex: number): void {\n const wasPlaying = this._playing;\n const store = useDAWSessionStore.getState();\n const currentBar = wasPlaying\n ? this.secondsToBar(this.getCurrentPositionSec())\n : store.playheadBar;\n\n const oldMasterId = store.tracks[0]?.id;\n store.reorderTrack(trackId, newIndex);\n const newStore = useDAWSessionStore.getState();\n const newMasterId = newStore.tracks[0]?.id;\n\n if (newMasterId !== oldMasterId) {\n for (const [tid, rt] of this.tracks) {\n const track = newStore.getTrackById(tid);\n if (!track) continue;\n\n const barMap = buildBarMap(\n track.barMapping,\n newStore.masterBarLength48000,\n track.nativeBarLength,\n newStore.barSubdivisions,\n );\n\n rt.barPitchMap = buildBarPitchMap(barMap);\n rt.currentPitchBar = -1;\n this.syncWorkletPitchMap(tid);\n this.syncPitchForTrack(tid);\n\n track.channels.forEach((ch, i) => {\n const w = rt.worklets[i];\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n\n const seekPos = this.computeStemSeekSamples(currentBar, ch, track);\n if (seekPos !== null) {\n w.port.postMessage({ type: 'seek', position: seekPos });\n }\n });\n }\n\n if (wasPlaying) {\n this._playStartOffset = this.barToSeconds(currentBar);\n this._playStartCtxTime = this.ctx!.currentTime;\n } else {\n newStore.setPlayheadBar(currentBar);\n }\n this.emit('tempoChanged', newStore.masterTempo);\n }\n }\n\n setGlobalPlaybackRate(rate: number): void {\n if (this._playing) {\n const posSec = this.getCurrentPositionSec();\n useDAWSessionStore.getState().setGlobalPlaybackRate(rate);\n this._playStartOffset = posSec;\n this._playStartCtxTime = this.ctx!.currentTime;\n } else {\n useDAWSessionStore.getState().setGlobalPlaybackRate(rate);\n }\n this.broadcastGlobalRate();\n this.emit('playbackRateChanged', rate);\n }\n\n private broadcastGlobalRate(): void {\n const rate = useDAWSessionStore.getState().globalPlaybackRate;\n for (const [, rt] of this.tracks) {\n for (const w of rt.worklets) {\n w.port.postMessage({ type: 'set-global-rate', rate });\n }\n }\n }\n\n // ── Gain / mute / solo sync ──────────────────────────────────────\n\n syncGainsForTrack(trackId: string): void {\n const state = useDAWSessionStore.getState();\n const track = state.getTrackById(trackId);\n const rt = this.tracks.get(trackId);\n if (!track || !rt) return;\n\n const hasSoloedTrack = state.tracks.some((t) => t.soloed);\n const trackAudible = hasSoloedTrack ? track.soloed : !track.muted;\n rt.trackGain.gain.setValueAtTime(trackAudible ? track.volume : 0, this.ctx!.currentTime);\n\n const globalSoloedStems = new Set<number>();\n for (const t of state.tracks) {\n for (const ch of t.channels) {\n if (ch.soloed && ch.visible) globalSoloedStems.add(ch.stemIndex);\n }\n }\n const hasAnySoloedStem = globalSoloedStems.size > 0;\n\n track.channels.forEach((ch, i) => {\n const audible = ch.visible && (hasAnySoloedStem ? ch.soloed : !ch.muted);\n rt.stemGains[i]?.gain.setValueAtTime(audible ? ch.volume : 0, this.ctx!.currentTime);\n });\n }\n\n syncAllGains(): void {\n for (const trackId of this.tracks.keys()) this.syncGainsForTrack(trackId);\n }\n\n /** Send mute regions for a specific stem to its worklet (bar-based → sample-based) */\n syncMuteRegions(trackId: string, stemIndex: number): void {\n const rt = this.tracks.get(trackId);\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!rt || !track) return;\n\n const ch = track.channels.find((c) => c.stemIndex === stemIndex);\n if (!ch) return;\n\n const barMapping = track.barMapping;\n const sampleRegions = ch.muteRegions.map((r) => {\n const sStart = barToSample(r.startBar, barMapping);\n const sEnd = barToSample(r.endBar, barMapping);\n return { sampleStart: sStart, sampleEnd: sEnd };\n });\n\n const w = rt.worklets[stemIndex];\n if (w) w.port.postMessage({ type: 'load-mute-regions', regions: sampleRegions });\n }\n\n /** Sync mute regions for all stems of a track */\n syncAllMuteRegionsForTrack(trackId: string): void {\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!track) return;\n for (const ch of track.channels) {\n this.syncMuteRegions(trackId, ch.stemIndex);\n }\n }\n\n /**\n * Rebuild and re-send the bar map for a track to all its stem worklets.\n * Call after the track's barMapping has been modified (e.g. beat grid nudge).\n */\n reloadTrackBarMap(trackId: string): void {\n const rt = this.tracks.get(trackId);\n if (!rt) return;\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!track) return;\n\n // In native mode, keep speed=1.0 for the active track (beat lab)\n const isNativeTrack = this._nativeModeTrackId === trackId;\n\n const barMap = isNativeTrack\n ? track.barMapping.map((bar) => ({ sampleStart: bar.sampleStart, speed: 1.0 }))\n : buildBarMap(\n track.barMapping,\n store.masterBarLength48000,\n track.nativeBarLength,\n store.barSubdivisions,\n );\n\n if (isNativeTrack) {\n rt.barPitchMap = barMap.map(() => ({ pitchCorrectionSemitones: 0, speed: 1.0 }));\n } else {\n rt.barPitchMap = buildBarPitchMap(barMap);\n }\n rt.currentPitchBar = -1;\n\n const wasPlaying = this._playing;\n const currentBar = store.playheadBar;\n track.channels.forEach((ch, i) => {\n const w = rt.worklets[i];\n if (!w) return;\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n\n const seekPos = this.computeStemSeekSamples(currentBar, ch, track);\n if (seekPos !== null) {\n w.port.postMessage({ type: 'seek', position: seekPos });\n if (wasPlaying) w.port.postMessage({ type: 'play' });\n }\n });\n\n if (!isNativeTrack) {\n this.syncWorkletPitchMap(trackId);\n this.syncPitchForTrack(trackId);\n }\n this.syncAllMuteRegionsForTrack(trackId);\n\n if (wasPlaying) {\n this._playStartOffset = this.barToSeconds(currentBar);\n this._playStartCtxTime = this.ctx!.currentTime;\n }\n }\n\n // ── Native playback mode (Beat Lab) ────────────────────────────────\n\n /**\n * Enable or disable native playback for a track. When enabled, the track\n * plays at its original recorded tempo (speed = 1.0 for every bar) with no\n * pitch compensation. This allows the Beat Lab to display beat markers at\n * their true sample positions and have them match the audible audio exactly.\n */\n setNativePlaybackMode(trackId: string, enabled: boolean): void {\n const rt = this.tracks.get(trackId);\n if (!rt) return;\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!track) return;\n\n const wasPlaying = this._playing;\n if (wasPlaying) this.pause();\n\n if (enabled) {\n // Save the current quantized bar map so we can restore it later\n const quantizedBarMap = buildBarMap(\n track.barMapping,\n store.masterBarLength48000,\n track.nativeBarLength,\n store.barSubdivisions,\n );\n this._nativeModeOriginalBarMap = quantizedBarMap;\n this._nativeModeTrackId = trackId;\n\n // Build a flat speed=1.0 bar map (native playback)\n const nativeBarMap: BarMapEntry[] = track.barMapping.map((bar) => ({\n sampleStart: bar.sampleStart,\n speed: 1.0,\n }));\n\n // Send flat map to all stem worklets\n for (const w of rt.worklets) {\n w.port.postMessage({ type: 'load-bar-map', entries: nativeBarMap });\n }\n\n // Clear pitch compensation — we want the original pitch too\n rt.barPitchMap = nativeBarMap.map(() => ({ pitchCorrectionSemitones: 0, speed: 1.0 }));\n rt.currentPitchBar = -1;\n\n // CRITICAL: Bypass the pitch (Rubber Band) worklet entirely.\n // Even with pitch factor = 1.0 it buffers audio and adds ~40-60ms\n // latency, which makes the audible audio lag the visual playhead.\n // In native mode we want sample-exact timing for beat analysis.\n if (rt.pitchWorklet) {\n try {\n for (const g of rt.stemGains) {\n g.disconnect();\n g.connect(rt.trackGain);\n }\n } catch (err) {\n console.warn('[DAWController] Failed to bypass pitch worklet for native mode:', err);\n }\n }\n } else {\n this._nativeModeTrackId = null;\n this._nativeModeOriginalBarMap = null;\n\n // Restore pitch worklet routing\n if (rt.pitchWorklet) {\n try {\n for (const g of rt.stemGains) {\n g.disconnect();\n g.connect(rt.pitchWorklet);\n }\n } catch (err) {\n console.warn('[DAWController] Failed to restore pitch worklet routing:', err);\n }\n }\n\n // Restore the quantized bar map\n const barMap = buildBarMap(\n track.barMapping,\n store.masterBarLength48000,\n track.nativeBarLength,\n store.barSubdivisions,\n );\n for (const w of rt.worklets) {\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n }\n\n rt.barPitchMap = buildBarPitchMap(barMap);\n rt.currentPitchBar = -1;\n this.syncWorkletPitchMap(trackId);\n this.syncPitchForTrack(trackId);\n }\n\n // Reset playhead to start\n store.setPlayheadBar(0);\n }\n\n isNativePlaybackMode(): boolean {\n return this._nativeModeTrackId !== null;\n }\n\n get nativeModeTrackId(): string | null {\n return this._nativeModeTrackId;\n }\n\n /**\n * Get the current playback position in native (unquantized) seconds.\n * Only meaningful when native playback mode is active.\n */\n getNativePositionSec(): number {\n if (!this.ctx || !this._nativeModeTrackId) return 0;\n if (!this._playing) return this._nativeStartSample / SAMPLE_RATE;\n const globalRate = useDAWSessionStore.getState().globalPlaybackRate;\n const elapsedSec = (this.ctx.currentTime - this._playStartCtxTime) * globalRate;\n return (this._nativeStartSample / SAMPLE_RATE) + elapsedSec;\n }\n\n /**\n * Seek to a native sample position (used by beat lab scrubbing).\n * Only works when native playback mode is active.\n */\n seekToNativeSample(sample: number): void {\n if (!this._nativeModeTrackId) return;\n const rt = this.tracks.get(this._nativeModeTrackId);\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(this._nativeModeTrackId);\n if (!rt || !track) return;\n\n this._nativeStartSample = sample;\n\n for (let i = 0; i < rt.worklets.length; i++) {\n const w = rt.worklets[i];\n w.port.postMessage({ type: 'seek', position: Math.floor(sample) });\n if (this._playing) w.port.postMessage({ type: 'play' });\n }\n\n if (this.ctx) {\n this._playStartCtxTime = this.ctx.currentTime;\n this._playStartOffset = sample / SAMPLE_RATE;\n }\n\n // Update the store playheadBar so play() can resume from the right spot.\n // Convert native sample → approximate bar position using barMapping.\n const bm = track.barMapping;\n if (bm.length > 0) {\n let barIdx = 0;\n for (let i = bm.length - 1; i >= 0; i--) {\n if (bm[i].sampleStart <= sample) { barIdx = i; break; }\n }\n const bar = bm[barIdx];\n const barFrac = bar.duration > 0\n ? Math.max(0, Math.min(1, (sample - bar.sampleStart) / bar.duration))\n : 0;\n const tlStart = track.channels[0]?.timelineStartBar ?? 0;\n store.setPlayheadBar(barIdx + barFrac + tlStart);\n }\n }\n\n // ── Pitch / transpose ─────────────────────────────────────────────\n\n /**\n * Send the combined pitch factor (correction + transpose) to a track's pitch worklet.\n * When perBarPitchCompensation is enabled, the per-bar correction is added on top\n * via updatePerBarPitch() during playback — this method sends the base correction.\n */\n syncPitchForTrack(trackId: string): void {\n const rt = this.tracks.get(trackId);\n if (!rt?.pitchWorklet) return;\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!track) return;\n\n if (track.perBarPitchCompensation && this._playing) {\n // During playback with per-bar compensation, updatePerBarPitch handles it\n return;\n }\n\n const totalSemitones = track.pitchCorrectionSemitones + track.transposeSemitones + rt.autotuneOffset;\n const factor = semitonesToPitchFactor(totalSemitones);\n this.sendPitchToWorklet(rt.pitchWorklet, factor);\n }\n\n /**\n * Check if we've crossed a bar boundary and send an updated pitch factor\n * that includes the per-bar pitch compensation for that specific bar.\n */\n /**\n * rAF-driven per-bar pitch update (fallback for seeks / playback start).\n * handleWorkletBarChange is the primary path — this catches missed bars.\n */\n private updatePerBarPitch(_trackId: string, _globalBar: number): void {\n // No-op during playback. All pitch updates are driven by the stem\n // worklet's bar-changed messages via handleWorkletBarChange, which is\n // sample-accurate. The rAF loop calls this but it intentionally does\n // nothing — initial pitch is set by sendInitialBarPitch on play/seek.\n }\n\n /** One-shot pitch send for play/seek — sends the bar's pitch and sets\n * lastPitchStr so the rAF path won't duplicate it. */\n private sendInitialBarPitch(trackId: string, globalBar: number): void {\n const rt = this.tracks.get(trackId);\n if (!rt?.pitchWorklet || !this.ctx) return;\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!track?.perBarPitchCompensation) return;\n\n const ch0 = track.channels[0];\n if (!ch0) return;\n\n const subs = store.barSubdivisions ?? 1;\n const localBarF = (globalBar - ch0.timelineStartBar) * subs;\n const localBar = Math.floor(localBarF);\n if (localBar < 0 || localBar >= rt.barPitchMap.length) return;\n\n rt.currentPitchBar = localBar;\n const barPitch = rt.barPitchMap[localBar];\n const totalSemitones = barPitch.pitchCorrectionSemitones + track.transposeSemitones + rt.autotuneOffset;\n const factor = semitonesToPitchFactor(totalSemitones);\n const pitchStr = factor.toFixed(2);\n rt.lastPitchStr = pitchStr;\n this.sendPitchToWorklet(rt.pitchWorklet, factor);\n }\n\n /** Set user transpose in semitones and update the worklet. */\n setTrackTranspose(trackId: string, semitones: number): void {\n useDAWSessionStore.getState().setTrackTranspose(trackId, semitones);\n this.syncWorkletPitchMap(trackId);\n this.syncPitchForTrack(trackId);\n this.emit('transposeChanged', trackId, semitones);\n }\n\n /** Toggle per-bar pitch compensation for a track. */\n setPerBarPitchCompensation(trackId: string, enabled: boolean): void {\n useDAWSessionStore.getState().setPerBarPitchCompensation(trackId, enabled);\n const rt = this.tracks.get(trackId);\n if (rt) {\n rt.currentPitchBar = -1;\n rt.lastPitchStr = '';\n }\n this.syncWorkletPitchMap(trackId);\n if (!enabled) {\n this.syncPitchForTrack(trackId);\n } else if (this._playing) {\n const bar = useDAWSessionStore.getState().playheadBar;\n this.sendInitialBarPitch(trackId, bar);\n }\n this.emit('perBarPitchChanged', trackId, enabled);\n }\n\n /**\n * Send the per-bar pitch map to the first stem worklet so it can apply a\n * short crossfade at bar boundaries to mask the ~3ms gap between the\n * speed change (instant, audio-thread) and the pitch change (next render quantum).\n * Also sends the pitch map so the worklet can forward pitch commands to\n * Rubberband via the main thread at the exact bar crossing moment.\n */\n private syncWorkletPitchMap(trackId: string): void {\n const rt = this.tracks.get(trackId);\n if (!rt || rt.worklets.length === 0) return;\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!track) return;\n\n const stemWorklet = rt.worklets[0];\n\n if (!track.perBarPitchCompensation || !rt.pitchWorklet) {\n stemWorklet.port.postMessage({ type: 'load-pitch-map', entries: [] });\n return;\n }\n\n const entries = rt.barPitchMap.map((bp) => ({\n pitchFactor: semitonesToPitchFactor(\n bp.pitchCorrectionSemitones + track.transposeSemitones + rt.autotuneOffset\n ),\n }));\n\n stemWorklet.port.postMessage({ type: 'load-pitch-map', entries });\n }\n\n /** Update rubberband settings for a track. Requires worklet recreation. */\n setTrackPitchSettings(trackId: string, settings: PitchEngineSettings): void {\n useDAWSessionStore.getState().setTrackPitchSettings(trackId, settings);\n const rt = this.tracks.get(trackId);\n if (!rt?.pitchWorklet || !this.ctx || USE_PHAZE) return;\n\n // Recreate the worklet with new settings — configure via messages since\n // the worklet ignores processorOptions.\n const oldWorklet = rt.pitchWorklet;\n\n try {\n const newWorklet = new AudioWorkletNode(this.ctx, PITCH_WORKLET_NAME, {\n numberOfInputs: 1,\n numberOfOutputs: 1,\n channelCount: 2,\n channelCountMode: 'explicit',\n outputChannelCount: [2],\n });\n\n this.configurePitchWorklet(newWorklet, settings);\n\n // Reconnect: stemGains -> newWorklet -> trackGain\n newWorklet.connect(rt.trackGain);\n for (const sg of rt.stemGains) {\n sg.disconnect();\n sg.connect(newWorklet);\n }\n oldWorklet.disconnect();\n rt.pitchWorklet = newWorklet;\n\n // Re-apply pitch\n this.syncPitchForTrack(trackId);\n } catch (err) {\n console.warn('[DAWController] Failed to recreate pitch worklet:', err);\n }\n }\n\n /**\n * Apply an autotune pitch offset on top of the current pitch chain.\n * Called from the autotune panel at ~60fps during playback.\n * Set autoSemitones=0 to clear the override.\n */\n applyAutotuneCorrection(trackId: string, autoSemitones: number): void {\n const rt = this.tracks.get(trackId);\n if (!rt?.pitchWorklet) return;\n\n // Store the autotune offset so other pitch paths (per-bar, bar-change) include it\n rt.autotuneOffset = autoSemitones;\n\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!track) return;\n\n let baseSemitones = track.transposeSemitones;\n\n if (track.perBarPitchCompensation && this._playing && rt.currentPitchBar >= 0 && rt.currentPitchBar < rt.barPitchMap.length) {\n baseSemitones += rt.barPitchMap[rt.currentPitchBar].pitchCorrectionSemitones;\n } else {\n baseSemitones += track.pitchCorrectionSemitones;\n }\n\n const factor = semitonesToPitchFactor(baseSemitones + autoSemitones);\n this.sendPitchToWorklet(rt.pitchWorklet, factor);\n }\n\n /** Send a pitch factor to the Rubberband pitch worklet. */\n private sendPitchToWorklet(worklet: AudioWorkletNode, pitchFactor: number): void {\n worklet.port.postMessage(JSON.stringify(['pitch', pitchFactor.toFixed(2)]));\n }\n\n /**\n * Configure a Rubberband pitch worklet via port messages.\n * The worklet ignores processorOptions — all config must be sent as messages.\n *\n * pitchDelayMs controls how many ms the worklet waits after receiving a pitch\n * command before applying it to Rubberband. This is the single control for\n * aligning speed changes (instant) with pitch changes (delayed by FFT pipeline).\n */\n private configurePitchWorklet(worklet: AudioWorkletNode, settings: PitchEngineSettings): void {\n const delaySamples = Math.round((settings.pitchDelayMs / 1000) * SAMPLE_RATE);\n worklet.port.postMessage(JSON.stringify(['set-pitch-delay', { delaySamples }]));\n worklet.port.postMessage(JSON.stringify(['pitchTransitionStep', 100.0]));\n worklet.port.postMessage(JSON.stringify(['pitchOption', settings.pitchOption]));\n worklet.port.postMessage(JSON.stringify(['formantOption', settings.formantOption]));\n worklet.port.postMessage(JSON.stringify(['engineOption', settings.engineOption]));\n\n if (!worklet.port.onmessage) {\n worklet.port.onmessage = (e) => {\n try {\n const msg = typeof e.data === 'string' ? JSON.parse(e.data) : e.data;\n if (!msg?.type) return;\n if (msg.type === 'pitch-delayed') {\n const d = msg.data ?? msg;\n console.log(\n `%c[RB Worklet] pitch-delayed target=${d.targetPitch} delay=${d.delaySamples}smp (${((d.delaySamples / SAMPLE_RATE) * 1000).toFixed(1)}ms)`,\n 'color: #4fc3f7'\n );\n } else if (msg.type === 'pitch-applied') {\n console.log(\n `%c[RB Worklet] pitch-applied value=${msg.data?.value ?? '?'} @audioTime=${msg.timestamp?.toFixed(3) ?? '?'}`,\n 'color: #4ade80; font-weight: bold'\n );\n } else if (msg.type === 'pitch-delay-updated' || msg.type === 'api-created') {\n console.log(`%c[RB Worklet] ${msg.type}`, 'color: #4fc3f7', msg.data ?? msg);\n }\n } catch { /* non-JSON message */ }\n };\n }\n\n console.log(\n `%c[DAW] Rubberband worklet configured`,\n 'color: #81c784; font-weight: bold',\n `pitchDelay=${delaySamples} samples (${settings.pitchDelayMs}ms)` +\n ` | ${settings.pitchOption} | ${settings.formantOption} | ${settings.engineOption}` +\n ` | step=100 (instant)`\n );\n }\n\n get pitchWorkletAvailable(): boolean { return this._pitchWorkletAvailable; }\n get audioContext(): AudioContext | null { return this.ctx; }\n\n /** Get the total semitones currently being applied to a track's pitch worklet. */\n getCurrentPitchSemitones(trackId: string): number {\n const rt = this.tracks.get(trackId);\n if (!rt) return 0;\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!track) return 0;\n\n if (track.perBarPitchCompensation && rt.currentPitchBar >= 0 && rt.currentPitchBar < rt.barPitchMap.length) {\n const barPitch = rt.barPitchMap[rt.currentPitchBar];\n return barPitch.pitchCorrectionSemitones + track.transposeSemitones + rt.autotuneOffset;\n }\n return track.pitchCorrectionSemitones + track.transposeSemitones + rt.autotuneOffset;\n }\n\n /**\n * Get the pitch artifact (semitones) that the current bar's speed change introduces.\n * This is the inverse of the compensation: if speed > 1, pitch goes up, etc.\n * Returns 0 if per-bar compensation isn't active or no bar is current.\n */\n getCurrentSpeedPitchArtifact(trackId: string): number {\n const rt = this.tracks.get(trackId);\n if (!rt || rt.currentPitchBar < 0 || rt.currentPitchBar >= rt.barPitchMap.length) return 0;\n // The artifact is -compensation: speed > 1 → compensation is negative → artifact is positive\n return -rt.barPitchMap[rt.currentPitchBar].pitchCorrectionSemitones;\n }\n\n /** Update pitchDelayMs for a track and push it to the Rubberband worklet immediately. */\n setTrackPitchDelay(trackId: string, ms: number): void {\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!track) return;\n const settings = { ...(track.pitchSettings ?? DEFAULT_PITCH_SETTINGS), pitchDelayMs: ms };\n store.setTrackPitchSettings(trackId, settings);\n\n const rt = this.tracks.get(trackId);\n if (rt?.pitchWorklet) {\n const delaySamples = Math.round((ms / 1000) * SAMPLE_RATE);\n rt.pitchWorklet.port.postMessage(JSON.stringify(['set-pitch-delay', { delaySamples }]));\n console.log(`%c[DAW] Pitch delay updated`, 'color: #81c784; font-weight: bold',\n `${ms}ms → ${delaySamples} samples`);\n }\n }\n\n /** Change bar subdivision and reload all bar maps + pitch maps. */\n setBarSubdivisions(n: number): void {\n const store = useDAWSessionStore.getState();\n store.setBarSubdivisions(n);\n const subs = store.barSubdivisions; // re-read after clamping\n\n for (const [trackId, rt] of this.tracks) {\n const track = store.getTrackById(trackId);\n if (!track) continue;\n\n const barMap = buildBarMap(\n track.barMapping,\n store.masterBarLength48000,\n track.nativeBarLength,\n n,\n );\n\n rt.barPitchMap = buildBarPitchMap(barMap);\n rt.currentPitchBar = -1;\n\n for (const w of rt.worklets) {\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n }\n }\n\n console.log(\n `%c[DAW] Bar subdivisions set to ${n}`,\n 'color: #81c784; font-weight: bold',\n `(${n === 1 ? 'bar-level' : n + ' sub-bars per bar'})`\n );\n }\n\n // ── CPU monitoring ──────────────────────────────────────────────\n\n /** Start polling AudioContext render capacity (if supported). */\n startCpuMonitor(intervalMs = 500): void {\n this.stopCpuMonitor();\n const ac = this.ctx as any;\n if (!ac?.renderCapacity) {\n // renderCapacity is behind a flag in some browsers — fall back to a rough estimate\n this._cpuPollId = setInterval(() => {\n // Rough heuristic: count active worklets\n const trackCount = this.tracks.size;\n const workletCount = trackCount * 4 + (this._pitchWorkletAvailable ? trackCount : 0);\n this._cpuUsage = Math.min(1, workletCount * 0.03);\n this.emit('cpuUsage', this._cpuUsage);\n }, intervalMs);\n return;\n }\n\n // Use AudioContext.renderCapacity if available (Chrome 130+)\n ac.renderCapacity.addEventListener('update', (e: any) => {\n this._cpuUsage = e.load ?? e.averageLoad ?? 0;\n this.emit('cpuUsage', this._cpuUsage);\n });\n ac.renderCapacity.start({ updateInterval: intervalMs / 1000 });\n }\n\n stopCpuMonitor(): void {\n if (this._cpuPollId) {\n clearInterval(this._cpuPollId);\n this._cpuPollId = null;\n }\n const ac = this.ctx as any;\n if (ac?.renderCapacity) {\n try { ac.renderCapacity.stop(); } catch { /* */ }\n }\n }\n\n get cpuUsage(): number { return this._cpuUsage; }\n\n // ── Playhead animation ───────────────────────────────────────────\n\n private startPlayheadAnimation(): void {\n this.stopPlayheadAnimation();\n const animate = () => {\n if (!this._playing) return;\n const posSec = this.getCurrentPositionSec();\n const store = useDAWSessionStore.getState();\n const currentBar = this.secondsToBar(posSec);\n store.setPlayheadBar(currentBar);\n\n this.updateStemPlayState(currentBar);\n this.updateAllPerBarPitch(currentBar);\n\n if (store.loopRegion && currentBar >= store.loopRegion.endBar) {\n this.seekToBar(store.loopRegion.startBar);\n }\n this.playheadAnimationId = requestAnimationFrame(animate);\n };\n this.playheadAnimationId = requestAnimationFrame(animate);\n }\n\n /**\n * Authoritative pitch update from the worklet's bar-changed message.\n * Fires at audio-thread timing. The worklet's internal pitchDelayMs\n * handles the alignment between speed (instant) and pitch (delayed).\n */\n private handleWorkletBarChange(trackId: string, localBarIndex: number): void {\n if (!this._playing) return;\n const rt = this.tracks.get(trackId);\n if (!rt?.pitchWorklet) return;\n const track = useDAWSessionStore.getState().getTrackById(trackId);\n if (!track?.perBarPitchCompensation) return;\n if (localBarIndex < 0 || localBarIndex >= rt.barPitchMap.length) return;\n if (localBarIndex === rt.currentPitchBar) return;\n\n rt.currentPitchBar = localBarIndex;\n const barPitch = rt.barPitchMap[localBarIndex];\n const totalSemitones = barPitch.pitchCorrectionSemitones + track.transposeSemitones + rt.autotuneOffset;\n const factor = semitonesToPitchFactor(totalSemitones);\n const pitchStr = factor.toFixed(2);\n\n // Skip if pitch value hasn't changed (e.g. subdivided sub-bars with same speed)\n if (pitchStr === rt.lastPitchStr) return;\n rt.lastPitchStr = pitchStr;\n\n this.sendPitchToWorklet(rt.pitchWorklet, factor);\n const subs = useDAWSessionStore.getState().barSubdivisions ?? 1;\n const parentBar = subs > 1 ? Math.floor(localBarIndex / subs) : localBarIndex;\n const subIdx = subs > 1 ? localBarIndex % subs : 0;\n const prevSt = rt.lastCorrectionSt ?? barPitch.pitchCorrectionSemitones;\n const deltaSt = barPitch.pitchCorrectionSemitones - prevSt;\n rt.lastCorrectionSt = barPitch.pitchCorrectionSemitones;\n const deltaColor = Math.abs(deltaSt) > 0.5 ? 'color: #ef4444; font-weight: bold' : 'color: #81c784';\n console.log(\n `%c[Bar Pitch] parentBar=${parentBar} sub=${subIdx}/${subs}` +\n ` | idx=${localBarIndex} pitch=${pitchStr} speed=${barPitch.speed.toFixed(4)}` +\n ` | correction=${barPitch.pitchCorrectionSemitones.toFixed(2)}st` +\n ` | Δ=${deltaSt >= 0 ? '+' : ''}${deltaSt.toFixed(2)}st`,\n deltaColor\n );\n }\n\n /** Update per-bar pitch compensation for all tracks that have it enabled. */\n private updateAllPerBarPitch(globalBar: number): void {\n for (const trackId of this.tracks.keys()) {\n this.updatePerBarPitch(trackId, globalBar);\n }\n }\n\n /** Start/stop individual stem worklets as the playhead crosses their timeline boundaries */\n private updateStemPlayState(globalBar: number): void {\n const store = useDAWSessionStore.getState();\n for (const [trackId, rt] of this.tracks) {\n const track = store.getTrackById(trackId);\n if (!track) continue;\n\n let anyShouldBeActive = false;\n track.channels.forEach((ch, i) => {\n const key = `${trackId}:${i}`;\n const seekPos = this.computeStemSeekSamples(globalBar, ch, track);\n const wasActive = this._stemActive.get(key) ?? false;\n const shouldBeActive = seekPos !== null;\n if (shouldBeActive) anyShouldBeActive = true;\n\n if (shouldBeActive && !wasActive) {\n const w = rt.worklets[i];\n w.port.postMessage({ type: 'seek', position: seekPos });\n w.port.postMessage({ type: 'play' });\n this._stemActive.set(key, true);\n } else if (!shouldBeActive && wasActive) {\n const w = rt.worklets[i];\n w.port.postMessage({ type: 'pause' });\n this._stemActive.set(key, false);\n }\n });\n\n if (anyShouldBeActive) {\n rt.lastAccessAt = performance.now();\n if (rt.dumped && !rt.transitioning) {\n // Playhead just entered this dumped track's range —\n // bring its audio back from IndexedDB. Fire-and-forget;\n // worklet will produce silence until patches arrive.\n void this.rehydrateTrackAudio(trackId);\n }\n }\n }\n }\n\n private stopPlayheadAnimation(): void {\n if (this.playheadAnimationId !== null) {\n cancelAnimationFrame(this.playheadAnimationId);\n this.playheadAnimationId = null;\n }\n }\n\n private getCurrentPositionSec(): number {\n if (!this.ctx) return 0;\n const globalRate = useDAWSessionStore.getState().globalPlaybackRate;\n return this._playStartOffset + (this.ctx.currentTime - this._playStartCtxTime) * globalRate;\n }\n\n // ── Time / bar conversion ────────────────────────────────────────\n\n barToSeconds(bar: number): number {\n const masterBar = useDAWSessionStore.getState().masterBarLength48000;\n if (!masterBar) return 0;\n return (bar * masterBar) / SAMPLE_RATE;\n }\n\n secondsToBar(sec: number): number {\n const masterBar = useDAWSessionStore.getState().masterBarLength48000;\n if (!masterBar) return 0;\n return (sec * SAMPLE_RATE) / masterBar;\n }\n\n // ── Metronome ─────────────────────────────────────────────────────\n\n get metronomeEnabled(): boolean { return this._metronomeOn; }\n get metronomeVolume(): number { return this._metronomeGain?.gain.value ?? 0.35; }\n get metronomeDownbeatOnly(): boolean { return this._metronomeDownbeatOnly; }\n\n setMetronomeDownbeatOnly(downbeatOnly: boolean): void {\n this._metronomeDownbeatOnly = downbeatOnly;\n if (this._metronomeOn && this._playing) {\n this.startMetronomeScheduler();\n }\n }\n\n toggleMetronome(on?: boolean): void {\n this._metronomeOn = on ?? !this._metronomeOn;\n if (this._metronomeOn && !this._metronomeGain && this.ctx) {\n this._metronomeGain = this.ctx.createGain();\n this._metronomeGain.gain.value = 0.35;\n this._metronomeGain.connect(this.ctx.destination);\n }\n if (this._metronomeOn && this._playing) {\n this.startMetronomeScheduler();\n } else {\n this.stopMetronomeScheduler();\n }\n this.emit('metronomeChanged', this._metronomeOn);\n }\n\n setMetronomeVolume(volume: number): void {\n if (this._metronomeGain) {\n this._metronomeGain.gain.value = Math.max(0, Math.min(1, volume));\n }\n this.emit('metronomeChanged', this._metronomeOn);\n }\n\n private startMetronomeScheduler(): void {\n this.stopMetronomeScheduler();\n if (!this.ctx || !this._metronomeGain) return;\n\n const store = useDAWSessionStore.getState();\n const currentBar = store.playheadBar;\n const step = this._metronomeDownbeatOnly ? 1 : 0.25;\n this._metronomeNextBeat = Math.ceil(currentBar / step) * step;\n\n this._metronomeScheduleId = setInterval(() => this.scheduleMetronomeClicks(), METRO_SCHEDULE_INTERVAL_MS);\n }\n\n private stopMetronomeScheduler(): void {\n if (this._metronomeScheduleId !== null) {\n clearInterval(this._metronomeScheduleId);\n this._metronomeScheduleId = null;\n }\n }\n\n private scheduleMetronomeClicks(): void {\n if (!this.ctx || !this._metronomeGain || !this._playing) return;\n\n const store = useDAWSessionStore.getState();\n const masterBar = store.masterBarLength48000;\n if (!masterBar) return;\n\n const globalRate = store.globalPlaybackRate;\n const lookAheadBar = METRO_LOOK_AHEAD_SEC / (masterBar / SAMPLE_RATE);\n const currentBar = this.secondsToBar(this.getCurrentPositionSec());\n const horizonBar = currentBar + lookAheadBar;\n\n const step = this._metronomeDownbeatOnly ? 1 : 0.25;\n while (this._metronomeNextBeat < horizonBar) {\n const beatBar = this._metronomeNextBeat;\n if (beatBar >= currentBar) {\n const deltaSec = (beatBar - currentBar) * masterBar / SAMPLE_RATE / globalRate;\n const when = this.ctx.currentTime + deltaSec;\n this.playClick(when, Math.abs(beatBar % 1) < 0.01);\n }\n this._metronomeNextBeat += step;\n }\n }\n\n private playClick(when: number, downbeat: boolean): void {\n if (!this.ctx || !this._metronomeGain) return;\n const osc = this.ctx.createOscillator();\n const env = this.ctx.createGain();\n osc.type = 'sine';\n osc.frequency.value = downbeat ? 1000 : 800;\n env.gain.setValueAtTime(downbeat ? 1.0 : 0.5, when);\n env.gain.exponentialRampToValueAtTime(0.001, when + 0.04);\n osc.connect(env);\n env.connect(this._metronomeGain);\n osc.start(when);\n osc.stop(when + 0.05);\n }\n\n // ── Copy/paste audio between bar ranges ─────────────────────────\n\n /**\n * Copy audio samples from one bar range and overwrite another bar range\n * inside a track's stem buffers. Source and destination stems may be the\n * same (default) or different stems on the same track. After writing, the\n * modified destination buffer is sent to the worklet so playback reflects\n * the change immediately.\n *\n * Both `sourceStart/End` and `targetStartBar` are in local bars (relative\n * to the track's barMapping, not the global timeline).\n *\n * `targetStemIndex` defaults to `stemIndex` (source) for backwards-compatible\n * same-stem behaviour.\n */\n pasteAudioRegion(\n trackId: string,\n stemIndex: number,\n sourceStartBar: number,\n sourceEndBar: number,\n targetStartBar: number,\n targetStemIndex: number = stemIndex,\n ): void {\n const rt = this.tracks.get(trackId);\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!rt || !track || !this.ctx) {\n console.warn('[DAW pasteAudio] Missing runtime/track/ctx', { hasRt: !!rt, hasTrack: !!track, hasCtx: !!this.ctx });\n return;\n }\n\n const stemKeys: (keyof StemAudioBuffers)[] = ['other', 'vocals', 'bass', 'drums'];\n const srcKey = stemKeys[stemIndex];\n const dstKey = stemKeys[targetStemIndex];\n const srcBuf = rt.stems[srcKey];\n const dstBuf = rt.stems[dstKey];\n if (!srcBuf || !dstBuf) {\n console.warn('[DAW pasteAudio] No buffer for stem', { srcKey, dstKey });\n return;\n }\n\n const barMapping = track.barMapping;\n const srcSampleStart = barToSample(sourceStartBar, barMapping);\n const srcSampleEnd = barToSample(sourceEndBar, barMapping);\n const srcLen = srcSampleEnd - srcSampleStart;\n\n const dstSampleStart = barToSample(targetStartBar, barMapping);\n const clipLen = sourceEndBar - sourceStartBar;\n const targetEndBar = Math.min(targetStartBar + clipLen, barMapping.length);\n const dstSampleEnd = barToSample(targetEndBar, barMapping);\n const dstLen = dstSampleEnd - dstSampleStart;\n\n if (srcLen <= 0) { console.warn('[DAW pasteAudio] srcLen <= 0, aborting'); return; }\n if (dstLen <= 0) { console.warn('[DAW pasteAudio] dstLen <= 0, aborting'); return; }\n\n const copyLen = Math.min(srcLen, dstLen);\n const channelCount = Math.min(srcBuf.numberOfChannels, dstBuf.numberOfChannels);\n\n for (let ch = 0; ch < channelCount; ch++) {\n const srcData = srcBuf.getChannelData(ch);\n const dstData = dstBuf.getChannelData(ch);\n // Snapshot the source samples first so cross-stem (or overlapping\n // same-stem) writes never clobber data they still need to read.\n const srcCopy = srcData.slice(srcSampleStart, srcSampleStart + copyLen);\n dstData.set(srcCopy, dstSampleStart);\n\n if (dstLen > copyLen) {\n for (let s = dstSampleStart + copyLen; s < dstSampleEnd; s++) {\n dstData[s] = 0;\n }\n }\n }\n\n // Re-send the modified DESTINATION buffer to its worklet\n const w = rt.worklets[targetStemIndex];\n const channels: Float32Array[] = [];\n for (let ch = 0; ch < dstBuf.numberOfChannels; ch++) {\n channels.push(new Float32Array(dstBuf.getChannelData(ch)));\n }\n w.port.postMessage({ type: 'load-buffer', channels }, channels.map(c => c.buffer));\n\n const freshStore = useDAWSessionStore.getState();\n const freshTrack = freshStore.getTrackById(trackId);\n if (freshTrack) {\n const barMap = buildBarMap(freshTrack.barMapping, freshStore.masterBarLength48000, freshTrack.nativeBarLength, freshStore.barSubdivisions);\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n rt.barPitchMap = buildBarPitchMap(barMap);\n rt.currentPitchBar = -1;\n }\n\n this.syncMuteRegions(trackId, targetStemIndex);\n }\n\n // ── Selection-based batch operations ────────────────────────────\n //\n // These wrap pasteAudioRegion / mute regions / clipboard with the right\n // undo/redo semantics so the keyboard handlers and the SelectionActionBar\n // popover share one implementation.\n\n /**\n * Copy each selection's bar range into the clipboard. No mutation of\n * the audio buffers — just snapshots the source bar ranges. No undo step\n * (copy is non-destructive).\n */\n copySelections(selections: import('../interfaces').StemSelectionRange[]): void {\n const store = useDAWSessionStore.getState();\n if (selections.length === 0) return;\n const entries: import('../interfaces').ClipboardEntry[] = selections\n .filter((s) => s.endBar > s.startBar)\n .map((s) => ({\n trackId: s.trackId,\n stemIndex: s.stemIndex,\n sourceStartBar: Math.round(s.startBar),\n sourceEndBar: Math.round(s.endBar),\n }));\n store.setClipboardEntries(entries);\n }\n\n /**\n * Mute (silence) each selection's bar range. Single undo step covers all\n * ranges. After muting, clears the selection set.\n */\n muteSelections(selections: import('../interfaces').StemSelectionRange[]): void {\n if (selections.length === 0) return;\n const store = useDAWSessionStore.getState();\n store.pushUndo();\n const touched = new Set<string>();\n for (const sel of selections) {\n store.addMuteRegion(sel.trackId, sel.stemIndex, {\n startBar: Math.round(sel.startBar),\n endBar: Math.round(sel.endBar),\n });\n touched.add(`${sel.trackId}:${sel.stemIndex}`);\n }\n for (const key of touched) {\n const [trackId, idx] = key.split(':');\n this.syncMuteRegions(trackId, parseInt(idx, 10));\n }\n store.clearSelections();\n }\n\n /**\n * Cut: copy each selection's bar range to clipboard AND mute it. Single\n * undo step. Clears the selection set after.\n */\n cutSelections(selections: import('../interfaces').StemSelectionRange[]): void {\n if (selections.length === 0) return;\n this.copySelections(selections);\n this.muteSelections(selections);\n }\n\n /**\n * Paste the current clipboard at a global timeline bar. Each clipboard\n * entry pastes into its own stemIndex on the focused track. Cross-track\n * paste is supported as same-stemIndex-different-track when the source\n * track no longer exists.\n *\n * For a SINGLE-entry clipboard, the optional `targetStemIndex` allows\n * cross-stem paste (e.g. paste bass clip into drums lane).\n */\n pasteClipboardAtBar(\n targetGlobalBar: number,\n targetTrackId: string,\n targetStemIndex?: number,\n ): void {\n const store = useDAWSessionStore.getState();\n const entries = store.clipboardEntries;\n if (entries.length === 0) return;\n\n const track = store.getTrackById(targetTrackId);\n if (!track) return;\n\n store.pushUndo();\n\n const isSingleEntryCrossStem =\n entries.length === 1 && targetStemIndex !== undefined && targetStemIndex !== entries[0].stemIndex;\n\n for (const cb of entries) {\n const dstStemIndex = isSingleEntryCrossStem ? (targetStemIndex as number) : cb.stemIndex;\n const ch = store.getChannel(targetTrackId, dstStemIndex);\n if (!ch) continue;\n\n const clipLen = cb.sourceEndBar - cb.sourceStartBar;\n const maxBar = track.barMapping.length;\n let localPasteBar = Math.round(targetGlobalBar) - ch.timelineStartBar;\n\n // Pasting before the buffer start: shift the stem earlier so it\n // falls inside the buffer (Logic-style \"make room\").\n if (localPasteBar < 0) {\n const shift = -localPasteBar;\n const newTimelineStart = Math.max(0, ch.timelineStartBar - shift);\n const actualShift = ch.timelineStartBar - newTimelineStart;\n store.setStemTimelineStart(targetTrackId, dstStemIndex, newTimelineStart);\n store.setStemTrim(\n targetTrackId,\n dstStemIndex,\n ch.trimStartBar + actualShift,\n ch.trimEndBar + actualShift,\n );\n localPasteBar = Math.round(targetGlobalBar) - newTimelineStart;\n }\n\n const pasteEnd = Math.min(localPasteBar + clipLen, maxBar);\n if (pasteEnd <= localPasteBar || localPasteBar < 0 || localPasteBar >= maxBar) {\n continue;\n }\n\n // Copy buffer audio. If the clipboard entry is from a different\n // track we can't cross-track paste yet (different barMappings /\n // sample lengths), so fall through to same-track only.\n const srcTrackId = cb.trackId === targetTrackId ? targetTrackId : targetTrackId;\n this.pasteAudioRegion(\n srcTrackId,\n cb.stemIndex,\n cb.sourceStartBar,\n cb.sourceEndBar,\n localPasteBar,\n dstStemIndex,\n );\n\n const freshCh = store.getChannel(targetTrackId, dstStemIndex);\n if (!freshCh) continue;\n\n const newTrimStart = Math.min(freshCh.trimStartBar, localPasteBar);\n const newTrimEnd = Math.max(freshCh.trimEndBar, pasteEnd);\n if (newTrimStart !== freshCh.trimStartBar || newTrimEnd !== freshCh.trimEndBar) {\n store.setStemTrim(targetTrackId, dstStemIndex, newTrimStart, newTrimEnd);\n }\n\n // Clear mute regions covering the paste target so the audio plays.\n const updatedCh = store.getChannel(targetTrackId, dstStemIndex);\n if (updatedCh) {\n const newMuteRegions = updatedCh.muteRegions.flatMap((r) => {\n if (r.endBar <= localPasteBar || r.startBar >= pasteEnd) return [r];\n const parts: { startBar: number; endBar: number }[] = [];\n if (r.startBar < localPasteBar) parts.push({ startBar: r.startBar, endBar: localPasteBar });\n if (r.endBar > pasteEnd) parts.push({ startBar: pasteEnd, endBar: r.endBar });\n return parts;\n });\n store.setMuteRegionsBatch(targetTrackId, dstStemIndex, newMuteRegions);\n this.syncMuteRegions(targetTrackId, dstStemIndex);\n }\n }\n\n // Advance playhead to immediately after the last pasted bar.\n const longestClipLen = entries.reduce((m, e) => Math.max(m, e.sourceEndBar - e.sourceStartBar), 0);\n store.setPlayheadBar(Math.round(targetGlobalBar) + longestClipLen);\n store.clearSelections();\n }\n\n /**\n * Duplicate each selection: copy its audio in-buffer to immediately after\n * the selection end on the same stem. Single undo step.\n */\n duplicateSelections(selections: import('../interfaces').StemSelectionRange[]): void {\n if (selections.length === 0) return;\n const store = useDAWSessionStore.getState();\n store.pushUndo();\n\n const newSelections: import('../interfaces').StemSelectionRange[] = [];\n for (const sel of selections) {\n const track = store.getTrackById(sel.trackId);\n const ch = store.getChannel(sel.trackId, sel.stemIndex);\n if (!track || !ch) continue;\n\n const start = Math.round(sel.startBar);\n const end = Math.round(sel.endBar);\n const len = end - start;\n if (len <= 0) continue;\n\n const maxBar = track.barMapping.length;\n const dstStart = end;\n const dstEnd = Math.min(dstStart + len, maxBar);\n if (dstEnd <= dstStart) continue;\n\n this.pasteAudioRegion(sel.trackId, sel.stemIndex, start, end, dstStart, sel.stemIndex);\n\n // Expand trim if the duplicate spills past the current visible end.\n const freshCh = store.getChannel(sel.trackId, sel.stemIndex);\n if (freshCh && dstEnd > freshCh.trimEndBar) {\n store.setStemTrim(sel.trackId, sel.stemIndex, freshCh.trimStartBar, dstEnd);\n }\n\n // Carve out any mute region covering the duplicate destination so\n // the new copy actually plays.\n const updatedCh = store.getChannel(sel.trackId, sel.stemIndex);\n if (updatedCh) {\n const newMuteRegions = updatedCh.muteRegions.flatMap((r) => {\n if (r.endBar <= dstStart || r.startBar >= dstEnd) return [r];\n const parts: { startBar: number; endBar: number }[] = [];\n if (r.startBar < dstStart) parts.push({ startBar: r.startBar, endBar: dstStart });\n if (r.endBar > dstEnd) parts.push({ startBar: dstEnd, endBar: r.endBar });\n return parts;\n });\n store.setMuteRegionsBatch(sel.trackId, sel.stemIndex, newMuteRegions);\n this.syncMuteRegions(sel.trackId, sel.stemIndex);\n }\n\n newSelections.push({\n trackId: sel.trackId,\n stemIndex: sel.stemIndex,\n startBar: dstStart,\n endBar: dstEnd,\n });\n }\n\n if (newSelections.length > 0) {\n store.setSelections(newSelections);\n }\n }\n\n // ── Resampled region insertion ──────────────────────────────────\n\n /**\n * Insert a resampled AudioBuffer into a stem, replacing the specified bar range.\n * Rebuilds the worklet buffer and bar map, and records the resampled region in the store.\n */\n insertResampledRegion(\n trackId: string,\n stemIndex: number,\n startBar: number,\n endBar: number,\n resampledBuffer: AudioBuffer,\n ): void {\n const rt = this.tracks.get(trackId);\n const store = useDAWSessionStore.getState();\n const track = store.getTrackById(trackId);\n if (!rt || !track || !this.ctx) return;\n\n const stemKeys: (keyof import('./daw-track-loader').StemAudioBuffers)[] = ['other', 'vocals', 'bass', 'drums'];\n const stemKey = stemKeys[stemIndex];\n const originalBuf = rt.stems[stemKey];\n if (!originalBuf) return;\n\n const barMapping = track.barMapping;\n const insertSample = barMapping[startBar]?.sampleStart ?? 0;\n const endSample = endBar < barMapping.length\n ? barMapping[endBar].sampleStart\n : (barMapping[barMapping.length - 1]?.sampleStart ?? 0) + (barMapping[barMapping.length - 1]?.duration ?? 0);\n const replaceLen = endSample - insertSample;\n\n // Build a new buffer with the resampled content spliced in\n const newLen = originalBuf.length - replaceLen + resampledBuffer.length;\n const newBuf = this.ctx.createBuffer(originalBuf.numberOfChannels, Math.max(newLen, 1), originalBuf.sampleRate);\n for (let ch = 0; ch < originalBuf.numberOfChannels; ch++) {\n const src = originalBuf.getChannelData(ch);\n const dst = newBuf.getChannelData(ch);\n const rep = resampledBuffer.numberOfChannels > ch\n ? resampledBuffer.getChannelData(ch)\n : resampledBuffer.getChannelData(0);\n dst.set(src.subarray(0, insertSample));\n dst.set(rep, insertSample);\n if (endSample < src.length) {\n dst.set(src.subarray(endSample), insertSample + resampledBuffer.length);\n }\n }\n\n // Update the runtime stems\n (rt.stems as unknown as Record<string, AudioBuffer>)[stemKey] = newBuf;\n\n // Send the new buffer to the worklet\n const w = rt.worklets[stemIndex];\n const channels: Float32Array[] = [];\n for (let ch = 0; ch < newBuf.numberOfChannels; ch++) {\n channels.push(new Float32Array(newBuf.getChannelData(ch)));\n }\n w.port.postMessage({ type: 'load-buffer', channels }, channels.map((c) => c.buffer));\n\n // Rebuild and send bar map\n const freshStore = useDAWSessionStore.getState();\n const freshTrack = freshStore.getTrackById(trackId);\n if (freshTrack) {\n const barMap = buildBarMap(freshTrack.barMapping, freshStore.masterBarLength48000, freshTrack.nativeBarLength, freshStore.barSubdivisions);\n w.port.postMessage({ type: 'load-bar-map', entries: barMap });\n rt.barPitchMap = buildBarPitchMap(barMap);\n rt.currentPitchBar = -1;\n }\n\n // Re-sync mute regions\n this.syncMuteRegions(trackId, stemIndex);\n\n // Record the resampled region in the store for visual indication\n store.addResampledRegion(trackId, stemIndex, {\n startBar,\n endBar,\n sliceCount: 0,\n });\n\n this.emit('resampledRegionInserted', trackId, stemIndex);\n }\n\n // ── Cleanup ──────────────────────────────────────────────────────\n\n destroy(): void {\n this.stopPlayheadAnimation();\n this.stopMetronomeScheduler();\n this.stopCpuMonitor();\n this._metronomeGain?.disconnect();\n this._metronomeGain = null;\n for (const [trackId, rt] of this.tracks) {\n try { rt.unsubscribePatch?.(); } catch { /* */ }\n rt.worklets.forEach((w) => {\n w.port.postMessage({ type: 'stop' });\n w.disconnect();\n });\n rt.stemGains.forEach((g) => g.disconnect());\n try { rt.pitchWorklet?.disconnect(); } catch { /* */ }\n rt.trackGain.disconnect();\n clearWaveformCacheForTrack(trackId);\n }\n // Abort every shared decode in one go now that no track refers\n // to them. Refcounts are no longer relevant — the controller is\n // being torn down.\n for (const entry of this.sourceCache.values()) {\n try { entry.loadHandle?.abort(); } catch { /* */ }\n }\n this.sourceCache.clear();\n this.tracks.clear();\n this.masterGain?.disconnect();\n this.ctx?.close();\n this.ctx = null;\n this.masterGain = null;\n this.isInitialised = false;\n this._pitchWorkletAvailable = false;\n this.removeAllListeners();\n DAWController.instance = null;\n }\n}\n"]}
|