@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/stem-audio-engine-v3/audio-context/util.ts","../src/stem-audio-engine-v3/store/seed-track-volume-store.ts","../src/stem-audio-engine-v3/store/stems-selection-store.ts","../src/stem-audio-engine-v3/utils/browser-check.ts","../src/utils/platform-env.ts","../src/stem-audio-engine-v3/audio-context/index.ts","../src/stem-audio-engine-v3/utils/colorConsole.ts","../src/utils/unknown-caught-error.ts","../src/stem-audio-engine-v3/utils/bars.ts","../src/utils/segmentSelectionSimplifiedEnhanced.ts","../src/utils/mathUtils.ts","../src/utils/basicSmoothing.ts","../src/services/fetchFeature.ts","../src/services/track-resolvers.ts","../src/stem-audio-engine-v3/store/use-current-station-track-json-store.ts","../src/stem-audio-engine-v3/utils/mp4-local-utils.ts","../src/utils/sessionRouteStationId.ts","../src/services/fetchStationTracks.tsx","../src/stem-audio-engine-v3/utils/preload.ts","../src/stem-audio-engine-v3/cache/validate-mp4-tail.ts","../src/stem-audio-engine-v3/playmode-matrix.ts","../src/stem-audio-engine-v3/store/use-next-mix-transition-prototype-explicit.ts","../src/utils/segmentSelectionSlider.ts","../src/stem-audio-engine-v3/store/segment-slider-store.ts","../src/services/get-next-mix-util.ts","../src/stem-audio-engine-v3/aev3-env-config.ts","../src/stem-audio-engine-v3/utils/cache.ts","../src/stem-audio-engine-v3/event-emitter.ts","../src/stem-audio-engine-v3/utils/mp4-parser/mp4-tfra-extractor.js","../src/stem-audio-engine-v3/utils/mp4.ts","../src/stem-audio-engine-v3/utils/buffer-ops.ts","../src/stem-audio-engine-v3/decode/3-parallel-queue/mp4-decoding-class-v2-audio-context.ts","../src/stem-audio-engine-v3/utils/mp4-parser/mp4-moof-extractor.js","../src/stem-audio-engine-v3/utils/mp4-parser/aac-adts-packager.js","../src/stem-audio-engine-v3/cache/mp4-sequence.ts","../src/stem-audio-engine-v3/utils/seed-mix-utils.ts","../src/stem-audio-engine-v3/utils/audio.ts","../src/stem-audio-engine-v3/decode/parser.ts","../src/stem-audio-engine-v3/cache/get-audio-buffer.ts","../src/stem-audio-engine-v3/decode/bar-seqeunce/bar-sequence-swap-channel.ts","../src/stem-audio-engine-v3/decode/bar-sequence.ts","../src/stem-audio-engine-v3/store/stems-isolate-state-store.ts","../src/stem-audio-engine-v3/store/stems-muted-state-store.ts","../src/stem-audio-engine-v3/store/seed-stems-volume-store.ts","../src/stem-audio-engine-v3/store/mix-stems-volume-store.ts","../src/stem-audio-engine-v3/store/stems-master-state-store-init.ts","../src/stem-audio-engine-v3/store/stems-master-state-store.ts","../src/stem-audio-engine-v3/features/stem-volume-on-playback.ts","../src/stem-audio-engine-v3/store/use-bar-sequence-store.ts","../src/stem-audio-engine-v3/store/use-next-mix-store.ts","../src/stem-audio-engine-v3/utils/stem-download.ts","../src/components/prototype-panel-v2/index.tsx","../src/stem-audio-engine-v3/utils/event-resolvers.ts","../src/stem-audio-engine-v3/features/swap-at-locus-actions/bar-sequence-swap-at-locus-action-skipping-refactored.ts","../src/stem-audio-engine-v3/features/assign-next-mix-v2(no-transition).ts","../src/stem-audio-engine-v3/features/bar-sequence-stem-switching.ts","../src/stem-audio-engine-v3/features/swap-at-locus-actions/utils.ts","../src/stem-audio-engine-v3/features/swap-at-locus-actions/bar-sequence-swap-at-locus-action-intelliskip-used-as-assign-next-mix-refactored.ts","../src/stem-audio-engine-v3/features/assign-next-mix-v2.ts","../src/stem-audio-engine-v3/store/use-transitional-info-store.ts","../src/stem-audio-engine-v3/features/seek-to-utils.ts","../src/stem-audio-engine-v3/global-aev3-controller.ts","../src/stem-audio-engine-v3/audio-context/media-session.ts"],"names":["create","audioContext","SAMPLE_RATE","segments","quickModePoints","startTime","endTime","window","median","uuid","TRACK_CREATOR_ENDPOINT","w","sorted","ENABLE_LOGGING_OF_FETCH_SEGMENT_HEADERS","getETag","getHeaderField","getResponseHeaders","getMp4PrintUrl","size","startSegment","endSegment","moofStartIndex","segment","USE_PHAZE_ENGINE","isMobile","originalChunkId","formerID_IF_ANY","currentChunk","internalSpeedFromBufferPlayerProcessor","chunkIdx","isActionAllowed","durationIn","durationOut","subscribeWithSelector","offset","moofExtractor","adtsPackager","swapSeedMixAtRuntime","calculateSeed2TransitBarCountsFeasible","setupMediaSessionModeAware","trackIndex","getNextMixUtils","trackId","trackLabel","sequenceLabel","sampleStart","sampleEnd"],"mappings":"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","file":"chunk-TBXCZFAY.js","sourcesContent":["import Hls from 'hls.js';\nimport { BarSequence } from '@/stem-audio-engine-v3/decode/bar-sequence';\n\nconst updateAudiodecoyMediaSession = (duration: number, currentTime: number) => {\n if ('mediaSession' in navigator) {\n try {\n const obj = { duration, playbackRate: 1, position: Math.min(currentTime, duration) };\n navigator.mediaSession.setPositionState(obj);\n } catch (err) {\n console.error(err);\n }\n }\n}\n\n/*\nexport const fetchSilentTS = () => {\n let tsFile: string;\n \n // tsFile = 'https://test-audio-convert-bucket.s3.us-west-2.amazonaws.com/silent_1s.ts';\n tsFile = 'https://d3mw8a32zvj7nn.cloudfront.net/silent_1s.ts';\n \n fetch(tsFile);\n}\n*/\n\nlet _blobUrl: string;\n\nconst getSilentTSURL = () => {\n /*\n let tsFile: string;\n // tsFile = 'https://test-audio-convert-bucket.s3.us-west-2.amazonaws.com/silent_1s.ts';\n tsFile = 'https://d3mw8a32zvj7nn.cloudfront.net/silent_1s.ts';\n // tsFile = 'https://test-audio-convert-bucket.s3.us-west-2.amazonaws.com/silent_1s_beep.ts';\n return tsFile;\n */\n\n if (_blobUrl) return _blobUrl;\n\n // Base64 encoded M3U8 content\n const base64M3U8 = 'R0AREABC8CUAAcEAAP8B/wAB/IAUSBIBBkZGbXBlZwlTZXJ2aWNlMDF3fEPK//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9HQAAQAACwDQABwQAAAAHwACqxBLL//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0dQABAAArASAAHBAADhAPAAD+EA8AC2m8DZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////R0EAMAdQAAB7DH4AAAABwADpgIAFIQAH2GH/8VCAA9/83gIATGF2YzYxLjE5LjEwMABCIAjBGDj/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FHAQAxeAD//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1CAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHEdAABEAALANAAHBAAAAAfAAKrEEsv//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////R1AAEQACsBIAAcEAAOEA8AAP4QDwALabwNn///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9HQQAyB1AAALxa/gAAAAHAANiAgAUhAAndm//xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv0cBADOJAP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwcR0AREQBC8CUAAcEAAP8B/wAB/IAUSBIBBkZGbXBlZwlTZXJ2aWNlMDF3fEPK//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9HQAASAACwDQABwQAAAAHwACqxBLL//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0dQABIAArASAAHBAADhAPAAD+EA8AC2m8DZ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////R0EANAdQAAD9qX4AAAABwACxgIAFIQAL4tX/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb/8IRAEYIwc//FQgAG//CEQBGCMHP/xUIABv/whEARgjBz/8VCAAb9HAQA1sAD//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CEQBGCMHA==';\n\n // Decode Base64 to binary string\n const binaryString = atob(base64M3U8);\n\n // Convert binary string to array of bytes\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n // Create a Blob from the byte array\n const blob = new Blob([bytes], { type: 'application/vnd.apple.mpegurl' });\n\n // Generate a Blob URL\n const blobUrl = URL.createObjectURL(blob);\n _blobUrl = blobUrl;\n return blobUrl;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n/*\nasync function convertRemoteFileToBase64(url) {\n try {\n // Fetch the remote file\n const response = await fetch(url);\n \n // Check if the fetch was successful\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.statusText}`);\n }\n\n // Read the response as a Blob\n const blob = await response.blob();\n\n // Create a FileReader to read the Blob\n const reader = new FileReader();\n\n // Return a promise that resolves with the Base64 string\n return new Promise((resolve, reject) => {\n reader.onloadend = () => {\n // The result is a data URL, we need to extract the Base64 part\n const base64String = reader.result.split(',')[1];\n resolve(base64String);\n };\n reader.onerror = reject;\n\n // Read the Blob as a data URL\n reader.readAsDataURL(blob);\n });\n } catch (error) {\n console.error('Error converting file to Base64:', error);\n }\n}\n*/\n// Example usage\n// convertRemoteFileToBase64(getSilentTSURL())\n// .then(base64String => {\n// console.log('Base64 String:', base64String);\n// });\n\n// resolve when metadata is loaded\nexport const generateAndLoadSilentTrackM3U8 = async (audioElement: HTMLAudioElement, duration: number) => {\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return new Promise((resolve, reject)=>{\n // Define the TS file URL (your 1-second.ts hosted on a domain)\n const tsFile: string = getSilentTSURL();\n\n // M3U8 Playlist Content - using dynamic chunk data\n let m3u8Content = '#EXTM3U\\n';\n m3u8Content += '#EXT-X-VERSION:7\\n';\n m3u8Content += '#EXT-X-ALLOW-CACHE:YES\\n';\n m3u8Content += '#EXT-X-TARGETDURATION:1\\n';\n m3u8Content += '#EXT-X-MEDIA-SEQUENCE:0\\n';\n\n // First chunk (with 1 second duration)\n m3u8Content += '#EXTINF:1.000000,\\n';\n m3u8Content += `${tsFile}\\n`;\n\n // Additional chunks (repeating the same TS file for demonstration purposes)\n for (let i = 1; i<duration; i++){\n m3u8Content += '#EXTINF:1.000000,\\n';\n m3u8Content += `${tsFile}\\n`;\n }\n\n // Mark the end of the playlist\n m3u8Content += '#EXT-X-ENDLIST\\n';\n // ^Update at 2025 Jul: if we want to keep it going, I think we can keep this as open\n\n // Convert the M3U8 content to a Blob\n const blob = new Blob([m3u8Content], { type: 'application/vnd.apple.mpegurl' });\n const url = URL.createObjectURL(blob);\n\n // HLS.js is required for browsers other than Safari (like Chrome)\n if (Hls.isSupported()) {\n const hls = new Hls();\n hls.loadSource(url); // Load the Blob URL\n hls.attachMedia(audioElement); // Attach HLS.js to the video element\n hls.on(Hls.Events.MANIFEST_PARSED, function () {\n resolve(true);\n // audioElement.play() // Auto-play once the manifest is loaded\n // .then(()=>{\n // // triggeredPlay();\n // console.log('hls starts play')\n // resolve(true);\n // // updateAudiodecoyPlaybackState('playing');\n // });\n });\n } else if (audioElement.canPlayType('application/vnd.apple.mpegurl')) {\n // Safari: Native support for HLS\n audioElement.src = url;\n audioElement.addEventListener('loadedmetadata', function () {\n // audioElement.play()\n // .then(()=>{\n // // triggeredPlay();\n // console.log('native audio starts play')\n // resolve(true);\n // // updateAudiodecoyPlaybackState('playing');\n // });\n resolve(true);\n });\n }\n // Add timeupdate listener for HLS.js playback\n audioElement.addEventListener('timeupdate', function () {\n // console.log('HLS Time Update: ', audioElement.currentTime);\n // You can trigger additional logic here based on the current time of the video\n updateAudiodecoyMediaSession((audioElement && audioElement.duration) || 0, (audioElement && audioElement.currentTime) || 0);\n });\n audioElement.addEventListener('play', () => {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.playbackState = 'playing'; // Explicitly set playback state to 'playing'\n }\n });\n // When the media is paused\n audioElement.addEventListener('pause', () => {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.playbackState = 'paused'; // Explicitly set playback state to 'paused'\n }\n });\n\n });\n}\n\n\n\n// based on previous finished bar + current bar duration\n// given no global speed changed in between\nexport const getCurrentBarExpectedFinishedTime = (barTrack: BarSequence, sequenceIdx: number) => {\n const barJustPlayedRef = barTrack.sourceJustPlayed[sequenceIdx];\n if (!barJustPlayedRef) {\n throw Error('not ready to use this');\n }\n\n const currentBarOfTrack = barTrack.getPlayingChunksInfo();\n const playingChunk = currentBarOfTrack.find((v)=>v.sequenceIdx===sequenceIdx);\n if (!playingChunk) {\n throw Error('not ready to use this');\n }\n const currentBarIdxOfTrack = playingChunk.chunkIdx;\n\n const currentBarDuration = barTrack.getChunkAudibleDuration(sequenceIdx, currentBarIdxOfTrack);\n const previousBarFinishedTime: number = (barJustPlayedRef && barJustPlayedRef.contextTime) || 0;\n return previousBarFinishedTime + currentBarDuration;\n}\n\n/**\n * Note this one already taken all the playback speed into account\n * and return expected duration from sourceJustPlayed to destination bar\n */\nexport const getTargetBarExpectedFinishedTime = (barTrack: BarSequence, sequenceIdx: number, targetChunkIdx: number) => {\n const barJustPlayedRef = barTrack.sourceJustPlayed[sequenceIdx];\n // console.log(barTrack.sourceJustPlayed);\n if (!barJustPlayedRef) {\n throw Error('not ready to use this');\n }\n\n const currentBarOfTrack = barTrack.getPlayingChunksInfo();\n const playingChunk = currentBarOfTrack.find((v)=>v.sequenceIdx===sequenceIdx);\n if (!playingChunk) {\n throw Error('not ready to use this');\n }\n const currentBarIdxOfTrack = playingChunk.chunkIdx;\n\n const currentBarDuration = barTrack.getChunkAudibleDuration(sequenceIdx, currentBarIdxOfTrack);\n const previousBarFinishedTime: number = (barJustPlayedRef && barJustPlayedRef.contextTime) || 0;\n\n let timeToGoTillTargetChunkStart = 0;\n for (let i=currentBarIdxOfTrack + 1; i <= targetChunkIdx; i++) {\n timeToGoTillTargetChunkStart += barTrack.getChunkAudibleDuration(sequenceIdx, i);\n }\n // debugger;\n return previousBarFinishedTime + currentBarDuration + timeToGoTillTargetChunkStart;\n}\n","/**\n * Direct control by the sliders\n * It won't notify Master Store for stem toggle\n * \n * But the value will be used at the toggles of Master Store\n */\n\nimport { AEV3Controller } from '../global-aev3-controller';\nimport {create} from 'zustand';\n\ntype AEV3TrackOpsTrackType = 'seed1' | 'mix1';\n\nexport const MAX_SEED_TRACK_GAIN_NODE_VOLUME = 1;\n\n// Define the structure of the Zustand store\ntype AEV3TrackVolumeStoreState = {\n id: AEV3TrackOpsTrackType;\n seedTrackVolume: number;\n updateSeedTrackVolume: (vol: number) => void;\n};\n\nconst aev3SeedTrackVolumeStore = create<AEV3TrackVolumeStoreState>((set) => {\n return {\n id: 'seed1',\n seedTrackVolume: 0.8,\n updateSeedTrackVolume: (vol: number)=>{\n set((state) => {\n state.seedTrackVolume = vol;\n const gainNode = AEV3Controller.getInstance().getTrackGainNodeWithTrackType('seed1');\n if (gainNode) {\n // console.log(`seed track volume change`, vol)\n gainNode.gain.value = vol;\n }\n return {...state};\n });\n },\n }\n});\n\nexport default aev3SeedTrackVolumeStore;","import { AEV3Controller } from '../global-aev3-controller';\nimport { create } from 'zustand';\nimport { MAX_SEED_TRACK_GAIN_NODE_VOLUME } from './seed-track-volume-store';\nimport { StemProfileString } from '../interface';\n\nexport type AEV3StemOpsTrackType = 'seed1' | 'mix1';\nconst ENABLE_LOCAL_DEBUG = false;\n\n// Or let it toggle and when initialise the AEV3Context pass the profile to it\nconst isActionAllowed = () => {\n if (!AEV3Controller.getInstance().aev3Context) {\n if (ENABLE_LOCAL_DEBUG) console.log('stemProfile audio context not initialised yet');\n return false;\n }\n return true;\n}\n\n// Define the structure of the Zustand store\nexport interface AEV3StemsSelectedStateStore {\n stem0Selected: AEV3StemOpsTrackType;\n stem1Selected: AEV3StemOpsTrackType;\n stem2Selected: AEV3StemOpsTrackType;\n stem3Selected: AEV3StemOpsTrackType;\n updateStem0Selected: (trackType: AEV3StemOpsTrackType) => void;\n updateStem1Selected: (trackType: AEV3StemOpsTrackType) => void;\n updateStem2Selected: (trackType: AEV3StemOpsTrackType) => void;\n updateStem3Selected: (trackType: AEV3StemOpsTrackType) => void;\n toggleStem0Selected: () => void;\n toggleStem1Selected: () => void;\n toggleStem2Selected: () => void;\n toggleStem3Selected: () => void;\n};\n\nexport const getQueryParam = (param: string) => {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n}\n\n// Get dynamic value from URL (e.g., query string or pathname)\n// No longer resolve this from URL because the URL flashing while Audio Context is initialising\n// Platform will decide a value, and the profile are now resolved with \n// seedStemsToEnableWhenPlaybackStarts\n// seedStemsVolumeToEnableWhenPlaybackStarts\n// mixStemsVolumeToEnableWhenPlaybackStarts\n// and all above function only triggered after Audio Context initialised\n\nconst getDefaultValue = (stem_letter: string) => {\n if (ENABLE_LOCAL_DEBUG) console.log('stemProfile', `defaultValue ${stem_letter}`);\n // const stems_param = getQueryParam('stems');\n // console.log(`stemProfile getDefaultValue`, stems_param);\n // if (stems_param==='' || stems_param === null) {\n return stem_letter.toLowerCase()==='v' ? 'seed1' : 'mix1';\n // } else {\n // return stems_param.toLowerCase().indexOf(stem_letter.toLowerCase()) > -1 ? 'seed1' : 'mix1';\n // }\n};\n\nconst stemIndexToStemLetter = (stemIndex: number): string => {\n switch (stemIndex) {\n case 0:\n return 'o';\n case 1:\n return 'v';\n case 2:\n return 'b';\n case 3:\n return 'd';\n default:\n return 'o';\n }\n};\n\n// how about audio context\nexport const getDefaultGainValueByTrackIndex = (trackIndex: 0 | 1, stemIndex: number) => {\n if (trackIndex===0) {\n return (getDefaultValue(stemIndexToStemLetter(stemIndex))==='seed1') ? MAX_SEED_TRACK_GAIN_NODE_VOLUME : 0;\n } else {\n return (getDefaultValue(stemIndexToStemLetter(stemIndex))==='mix1') ? 1 : 0;\n }\n}\n\nconst aev3StemsSelectedStateStore = create<AEV3StemsSelectedStateStore>((set) => {\n return {\n stem0Selected: getDefaultValue('o'),\n stem1Selected: getDefaultValue('v'),\n stem2Selected: getDefaultValue('b'),\n stem3Selected: getDefaultValue('d'),\n updateStem0Selected: (trackType: AEV3StemOpsTrackType)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem0Selected = trackType;\n return {...state};\n });\n },\n updateStem1Selected: (trackType: AEV3StemOpsTrackType)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem1Selected = trackType;\n return {...state};\n });\n },\n updateStem2Selected: (trackType: AEV3StemOpsTrackType)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem2Selected = trackType;\n return {...state};\n });\n },\n updateStem3Selected: (trackType: AEV3StemOpsTrackType)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem3Selected = trackType;\n return {...state};\n });\n },\n toggleStem0Selected: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem0Selected = state.stem0Selected === 'mix1' ? 'seed1' : 'mix1';\n return {...state};\n });\n },\n toggleStem1Selected: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem1Selected = state.stem1Selected === 'mix1' ? 'seed1' : 'mix1';\n return {...state};\n });\n },\n toggleStem2Selected: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem2Selected = state.stem2Selected === 'mix1' ? 'seed1' : 'mix1';\n return {...state};\n });\n },\n toggleStem3Selected: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n\t\t\t\tstate.stem3Selected = state.stem3Selected === 'mix1' ? 'seed1' : 'mix1';\n return {...state};\n });\n },\n }\n});\n\nexport default aev3StemsSelectedStateStore;\n\n// this function is triggered before a playback started\n// when the gainNode is initialised, the default value is resolved within `getDefaultValue()`\n// of this file, and query string is taken into account as well\nexport const seedStemsToEnableWhenPlaybackStarts = (stemProfile: StemProfileString) => {\n const {\n updateStem0Selected,\n updateStem1Selected,\n updateStem2Selected,\n updateStem3Selected,\n } = aev3StemsSelectedStateStore.getState();\n\n // console.log(`%cseedStemToEnableWhenPlaybackStarts ${stemProfile}`, 'color: red;')\n const stem0 = stemProfile.indexOf('o')>-1 ? 'seed1': 'mix1';\n const stem1 = stemProfile.indexOf('v')>-1 ? 'seed1': 'mix1';\n const stem2 = stemProfile.indexOf('b')>-1 ? 'seed1': 'mix1';\n const stem3 = stemProfile.indexOf('d')>-1 ? 'seed1': 'mix1';\n updateStem0Selected(stem0);\n updateStem1Selected(stem1);\n updateStem2Selected(stem2);\n updateStem3Selected(stem3);\n // console.log('volume profile', stemProfile);\n // trigger the resolver even it is ...\n}\n\nexport const getCurrentStemProfileBasedOnStore = (): StemProfileString => {\n const {\n stem0Selected,\n stem1Selected,\n stem2Selected,\n stem3Selected,\n } = aev3StemsSelectedStateStore.getState();\n return getStemProfileFromAEV3StemOpsTrackType(stem0Selected, stem1Selected, stem2Selected, stem3Selected);\n}\n\nexport const getStemProfileFromAEV3StemOpsTrackType = (stem0Selected: AEV3StemOpsTrackType, stem1Selected: AEV3StemOpsTrackType, stem2Selected: AEV3StemOpsTrackType, stem3Selected: AEV3StemOpsTrackType, ): StemProfileString => {\n let stemProfile: StemProfileString = '';\n if (stem0Selected === 'seed1') stemProfile += 'o';\n if (stem1Selected === 'seed1') stemProfile += 'v';\n if (stem2Selected === 'seed1') stemProfile += 'b';\n if (stem3Selected === 'seed1') stemProfile += 'd';\n return stemProfile as StemProfileString;\n}\n\nexport const getStemProfileFromBoolean = (stem0: boolean, stem1: boolean, stem2: boolean, stem3: boolean, ): StemProfileString => {\n let stemProfile: StemProfileString = '';\n if (stem0) stemProfile += 'o';\n if (stem1) stemProfile += 'v';\n if (stem2) stemProfile += 'b';\n if (stem3) stemProfile += 'd';\n return stemProfile as StemProfileString;\n}\n\n\n/**\n * Generates all possible combinations of stem profile letters ('o', 'v', 'b', 'd')\n * in the order 'ovbd'. This generates all 16 combinations (2^4), including the empty string.\n * \n * The combinations are generated in lexicographic order based on the bitmask:\n * '', 'o', 'v', 'ov', 'b', 'ob', 'vb', 'ovb', 'd', 'od', 'vd', 'ovd', 'bd', 'obd', 'vbd', 'ovbd'\n * \n * @returns Array of stem profile strings in 'ovbd' order\n */\nexport const generateStemProfiles = (exclude_profile_with_all_seed_or_all_mix: boolean = false): string[] => {\n const letters = ['o', 'v', 'b', 'd'];\n const combinations: string[] = [];\n \n // Generate all combinations using bitmask approach\n // For 4 letters, we have 2^4 = 16 combinations (0-15)\n // Including 0 (empty string) to get all 16 combinations\n for (let i = 0; i < 16; i++) {\n let combination = '';\n for (let j = 0; j < 4; j++) {\n // Check if bit j is set in i\n if (i & (1 << j)) {\n combination += letters[j];\n }\n }\n if (exclude_profile_with_all_seed_or_all_mix) {\n if (!['', 'ovbd'].includes(combination)) {\n combinations.push(combination);\n }\n } else {\n combinations.push(combination);\n }\n }\n\n return combinations;\n};\n\nexport const getRandomisedStemProfile = (currentStemProfile: StemProfileString, allowed_stem_profiles: string[]): StemProfileString => {\n const maxAttempt = 20;\n let proposedStemProfile: StemProfileString = currentStemProfile;\n let currentAttempt = 0;\n let randomIndex: number;\n const stemProfiles = allowed_stem_profiles;\n while(currentStemProfile === proposedStemProfile && currentAttempt < maxAttempt) {\n randomIndex = Math.floor(Math.random() * stemProfiles.length); // seed between 0 - 15 (16 combinations)\n if (stemProfiles[randomIndex]===currentStemProfile) {\n currentAttempt++;\n } else {\n // Type assertion: allowed_stem_profiles should contain valid StemProfileString values\n proposedStemProfile = stemProfiles[randomIndex] as StemProfileString;\n }\n }\n return proposedStemProfile;\n}","export const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const iOS = () => {\n return [\n 'iPad Simulator',\n 'iPhone Simulator',\n 'iPod Simulator',\n 'iPad',\n 'iPhone',\n 'iPod'\n ].includes(navigator.platform)\n // iPad on iOS 13 detection\n || (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document);\n}\n\nexport const iOS_Morden = () => {\n // Modern iOS detection using user agent and touch support\n const userAgent = navigator.userAgent;\n const isIOSDevice = /iPad|iPhone|iPod/.test(userAgent);\n const isIOSSafari = /Safari/.test(userAgent) && !/Chrome|CriOS|FxiOS/.test(userAgent);\n const isIOSTouch = 'ontouchend' in document && /Mac/.test(userAgent);\n \n return isIOSDevice || isIOSSafari || isIOSTouch;\n}\n\nexport const isSafariOriOS = isSafari || iOS();\nexport const isSafariDesktop = isSafari && !iOS();","// DO NOT edit below, please edit .env (prototype), or .env.[development|staging|production]\n// at stem-player repo if you have other path\nconst DEFAULT_PATH_RUBBERBAND = '/workers/realtime-pitch-shift-processor.js';\nconst DEFAULT_PATH_PHAZE = '/workers/phase-vocoder3.js';\n\nexport interface IConfig {\n TARGET_ENV: string | undefined;\n PATH_PITCH_SHIFT_WORKLET_RUBBERBAND: string | undefined;\n PATH_PITCH_SHIFT_WORKLET_PHAZE: string | undefined;\n}\n\nexport const getPlatformConfig = (): IConfig => ({\n TARGET_ENV: import.meta.env?.VITE_USER_NODE_ENV,\n PATH_PITCH_SHIFT_WORKLET_RUBBERBAND: import.meta.env?.VITE_PITCH_SHIFT_WORKLET_RUBBERBAND,\n PATH_PITCH_SHIFT_WORKLET_PHAZE: import.meta.env?.VITE_PITCH_SHIFT_WORKLET_PHAZE,\n});\n\nexport const isPlatformEnvNonProd = (): boolean => {\n return getPlatformConfig().TARGET_ENV !== 'production';\n}\n\nexport const getWorkletPath_RubberBand = (): string => {\n return getPlatformConfig().PATH_PITCH_SHIFT_WORKLET_RUBBERBAND || DEFAULT_PATH_RUBBERBAND;\n}\n\nexport const getWorkletPath_Phaze = (): string => {\n return getPlatformConfig().PATH_PITCH_SHIFT_WORKLET_PHAZE || DEFAULT_PATH_PHAZE;\n}","import isMobile from 'is-mobile';\nimport { generateAndLoadSilentTrackM3U8 } from './util';\nimport { setupMediaSession } from './media-session';\nimport { AEV3Controller, TrackIndexType, TrackLabelType } from '../global-aev3-controller';\nimport { getDefaultGainValueByTrackIndex } from '../store/stems-selection-store';\nimport { iOS, isSafari } from '../utils/browser-check';\nimport { getWorkletPath_Phaze, getWorkletPath_RubberBand } from '@/utils/platform-env';\n\n/**\n * CONFIGURABLE PARAMS\n */\n\n// Simple flag to switch between pitch engines\n\nconst USE_PHAZE_ENGINE = isMobile(); // Set to true to use Phaze, false for Rubberband\n\n// NEW: Natural tempo mixing configuration\n// Set to true for natural seed tempo with adaptive mix, false for quantized mixing\n// \n// NATURAL TEMPO (true): π± Seed track maintains natural tempo variations\n// π΅ Mix track adapts per bar to match seed tempo\n// β More musical, organic feel\n//\n// QUANTIZED (false): π Both tracks normalized to common average tempo\n// β Current system, consistent tempo throughout\nconst USE_NATURAL_TEMPO_MIXING = true;\n\n// NEW: Bar-wise pitch correction configuration\n// ENABLED: With optimal rubberband settings (Preserved + Balance + Faster R2 + Quality + Instant 1.0)\n// we can now apply pitch corrections per bar without pops! π\n// \n// BAR-WISE PITCH (true): π΅ Each bar gets pitch correction based on its speed ratio\n// π Compensates for pitch artifacts from speed changes\n// β¨ NOW ENABLED: Works perfectly with instant pitch changes!\n// β Smoother, more musical mixing with natural tempo\n//\n// STANDARD PITCH (false): π§ Only applies pitch corrections in transitional zones\n// β Basic pitch correction (old system)\nconst USE_BAR_WISE_PITCH_CORRECTION = true;\n\n// Rubberband worklet configuration\n// These settings are optimized for smooth pitch transitions and minimal artifacts\n// Based on testing: Preserved + Balance + Faster (R2) + Quality Enabled + INSTANT (1.0)\nconst RUBBERBAND_CONFIG: {\n readonly pitchTransitionStep: number;\n readonly formantOption: 'preserved' | 'shifted';\n readonly pitchOption: 'highSpeed' | 'highQuality' | 'highConsistency';\n readonly engineOption: 'faster' | 'finer';\n readonly quality: boolean;\n} = {\n pitchTransitionStep: 1.0, // 0.01-1.0: Instant pitch changes (no pops with optimal settings!)\n formantOption: 'shifted', // 'preserved' | 'shifted': Maintains vocal character\n pitchOption: 'highConsistency', // 'highSpeed' | 'highQuality' | 'highConsistency': Balanced approach\n \n // CAUTION: with finer option, can hear obvious static noise, please DO NOT toggle to finer until this is resolved\n engineOption: 'faster', // 'faster' (R2) | 'finer' (R3): Faster for real-time performance\n quality: true, // High-quality processing enabled\n} as const;\n\nexport const WORKLETS_COUNTS: number = (isMobile() || isSafari) ? 0 : 2;\nconst DELAY_SAMPLE_USED_ON_TRACK_0 = 4096;\nconst PITCH_DELAY_SAMPLES = 3552; // 74ms at 48kHz β aligns pitch changes with instant speed changes\n// const ENABLE_ANALYSER_NODES_ON_DESKTOP = true;\nexport const USE_AUDIO_STREAM_DESTINATION = iOS(); // prevent audio delay corresponding to UI, seems now it works perfectly on Android device so only apply this on iOS\n\n\n// Worklet configuration based on engine selection\nconst PITCH_WORKLET_REGISTERED_NAME = USE_PHAZE_ENGINE ? 'phase-vocoder-processor' : 'realtime-pitch-shift-processor';\n// Lazy getter to avoid initialization order issues during bundling\nconst getPitchWorkletFileName = (): string => {\n return USE_PHAZE_ENGINE ? getWorkletPath_Phaze() : getWorkletPath_RubberBand();\n};\n\n// Legacy constants for compatibility\nconst RUBBERBAND_WORKLET_REGISTERED_NAME = PITCH_WORKLET_REGISTERED_NAME;\nconst getRubberbandWorkletFileName = (): string => getPitchWorkletFileName();\n\n// CAUTION: \n// Since rubberband worklet comes with internal buffer\n// If we enable it only on one audio pipeline, it will caused out-of-sync behaviours between seed & mix\nlet AVOID_RUBBERBAND_WORKLET_AT_SEED: boolean;\nlet AVOID_RUBBERBAND_WORKLET_AT_MIX1: boolean;\nlet USE_DELAY_NODE_ON_TRACK_0: boolean;\nlet DELAY_TIME_USED_ON_TRACK_0: number;\n\nconst SAMPLE_RATE = 48000; // OR following check returned NaN\nswitch(WORKLETS_COUNTS) {\n case 0:\n AVOID_RUBBERBAND_WORKLET_AT_SEED = true;\n AVOID_RUBBERBAND_WORKLET_AT_MIX1 = true;\n USE_DELAY_NODE_ON_TRACK_0 = false;\n DELAY_TIME_USED_ON_TRACK_0 = 0;\n break;\n case 1:\n default:\n AVOID_RUBBERBAND_WORKLET_AT_SEED = true;\n AVOID_RUBBERBAND_WORKLET_AT_MIX1 = false;\n USE_DELAY_NODE_ON_TRACK_0 = true;\n DELAY_TIME_USED_ON_TRACK_0 = DELAY_SAMPLE_USED_ON_TRACK_0 / SAMPLE_RATE;\n break;\n case 2:\n AVOID_RUBBERBAND_WORKLET_AT_SEED = false;\n AVOID_RUBBERBAND_WORKLET_AT_MIX1 = false;\n USE_DELAY_NODE_ON_TRACK_0 = false;\n DELAY_TIME_USED_ON_TRACK_0 = 0;\n break;\n}\n\nexport {AVOID_RUBBERBAND_WORKLET_AT_SEED, AVOID_RUBBERBAND_WORKLET_AT_MIX1, USE_DELAY_NODE_ON_TRACK_0};\n\nexport const SILENT_BUFFER_SAMPLE_SIZE = ((AVOID_RUBBERBAND_WORKLET_AT_SEED && AVOID_RUBBERBAND_WORKLET_AT_MIX1) || !isMobile()) ? 4096 * 2 : 4096 * 4;\nexport const AVOID_ANALYSER_NODES = false;\n\nconst _AC_log: typeof console.log = (...data) => {\n return;\n console.log(...data);\n}\n\nconst _AC_table: typeof console.log = (...data) => {\n return;\n console.table(...data);\n}\n\nconst _AC_time: typeof console.time = (...data) => {\n return;\n console.time(...data);\n};\nconst _AC_timeLog: typeof console.timeLog = (...data) => {\n return;\n console.timeLog(...data);\n};\n\nconst _AC_timeEnd: typeof console.timeEnd = (...data) => {\n return;\n console.timeEnd(...data);\n};\n\n_AC_table({\n 'AUDIO ENGINE (V3) CONFIG': '',\n RUBBERBAND_WORKLET_AT_SEED: !AVOID_RUBBERBAND_WORKLET_AT_SEED,\n RUBBERBAND_WORKLET_AT_MIX1: !AVOID_RUBBERBAND_WORKLET_AT_MIX1,\n USE_DELAY_NODE_ON_TRACK_0: !USE_DELAY_NODE_ON_TRACK_0 ? 'Not applicable' : `Yes, with delayTime: ${DELAY_SAMPLE_USED_ON_TRACK_0} samples or ~${(DELAY_TIME_USED_ON_TRACK_0*1000).toFixed(2)}ms`,\n '--- RUBBERBAND WORKLET SETTINGS ---': '',\n 'RB Pitch Transition': `${RUBBERBAND_CONFIG.pitchTransitionStep} (${RUBBERBAND_CONFIG.pitchTransitionStep === 1.0 ? 'instant' : 'smooth'})`,\n 'RB Formant': RUBBERBAND_CONFIG.formantOption,\n 'RB Pitch Quality': RUBBERBAND_CONFIG.pitchOption,\n 'RB Engine': `${RUBBERBAND_CONFIG.engineOption} ${RUBBERBAND_CONFIG.engineOption === 'faster' ? '(R2)' : '(R3)'}`,\n 'RB High Quality': RUBBERBAND_CONFIG.quality,\n // USE_NATURAL_TEMPO_MIXING: USE_NATURAL_TEMPO_MIXING ? 'Natural (seed=natural, mix=adaptive)' : 'Quantized (both tracks normalized)',\n // USE_BAR_WISE_PITCH_CORRECTION: USE_BAR_WISE_PITCH_CORRECTION ? 'Per-bar pitch correction enabled' : 'Standard (transitional only)',\n PASSCODE: 'fo',\n})\n\nexport enum TIMER_LOG_AUDIO_CONTEXT {\n SIMULATE_CLICK_AND_PLAY_A_MIX = '%c[AEV3Content::init] Simiulation Platform Play a Mix with GraphQL data',\n SIMULATE_CLICK_AND_PLAY_A_MIX_WITH_PRELOADED = '%c[AEV3Content::init] Simiulation Platform Play a Mix with GraphQL data (with preloaded chunks)',\n \n ADD_AUDIO_WORKLET_MODULES = '%c[AEV3Content::init] Add worklet modules',\n SETUP_AUDIO_GRAPHS = '%c[AEV3Content::init] Setup audio graphs',\n \n HACK_1_GENERATE_AND_LOAD_HLS_SILENT_TRACK = '%c[AEV3Content::init] (Connect Music Control) generate and load HLS silent track',\n HACK_1_PLAY_HLS_SILENT_TRACK = '%c[AEV3Content::init] (Connect Music Control) starting HLS silent track',\n HACK_1_SETUP_MEDIA_SESSION_SILENT_TRACK = '%c[AEV3Content::init] (Connect Music Control) Setup Media Session',\n\n HACK_2_PAUSING_FOR_MEDIA_DESTINATION_CONNECTING_WITH_WORKLET = '%c[AEV3Content::init] Pause to eliminate sound distortion @ RB Worklet',\n PLAY_MEDIA_STREAM_DESTIONATION_AUDIO = '%c[AEV3Content::init] Trigger playback of live stream',\n\n INITIALISED_AUDIO_CONTEXT = '%c[AEV3Content::init] Finished setup of initAudioContext()',\n INITIALISED_AUDIO_CONTEXT_SUSPENDED = '%c[AEV3Content::init] Finished setup of initAudioContext(), suspended: true',\n PRELOADING_ENOUGH_CHUNKS_BEFORE_START = '%c[AEV3Content::init] Enough decoded chunks',\n STARTS_PLAYBACK_IN = '%c[AEV3Content::init] Playback starts in',\n\n PRINT_BASIC_LATENCY = '%c[AEV3Content::init] AUDIO CONTEXT BASE LATENCY',\n PRINT_BASIC_LATENCY_OF_DECODER = '%c[AEV3Content::init] DECODER AUDIO CONTEXT BASE LATENCY',\n\n LEVEL_ALERT = 'color: yellowgreen; background: black',\n LEVEL_0 = 'color: orange',\n LEVEL_1 = 'color: purple',\n LEVEL_2 = 'color: yellow; background: black;',\n}\n\nexport interface AEV3Context {\n audioContext: AudioContext;\n //\n stemBufferNodeTrack1: AudioWorkletNode[]; // x 4 seed1\n stemBufferNodeTrack2: AudioWorkletNode[]; // x 4 mix1\n // \n stemGainNodesTrack1: GainNode[] // x 4\n stemGainNodesTrack2: GainNode[] // x 4\n \n stemAnalyserNodesTrack1: AnalyserNode[] // x 4\n stemAnalyserNodesTrack2: AnalyserNode[] // x 4\n \n // \n trackWorkletNodesCurrent: AudioWorkletNode[]; // x 2\n trackGainNodes: GainNode[]; // x 2\n masterGainNode: GainNode; // x 1\n //\n silentTrackBuffers: AudioBuffer[]; // x 4\n silentTrackSourceNodes: (AudioBufferSourceNode | undefined)[]; // x 2; undefined when rubberband bypassed for that track\n //\n destination: AudioDestinationNode | MediaStreamAudioDestinationNode;\n // util funtion refactored\n recreateAndConnectSilentBufferToWorklet: (\n audioContext: AudioContext,\n trackIndex: TrackIndexType,\n silentTrackBuffers: AudioBuffer[],\n trackWorkletNodesCurrent: AudioWorkletNode[],\n ) => AudioBufferSourceNode;\n}\n\n// const SAMPLE_RATE = 48000;\n\n/**\n * Apply Rubberband worklet configuration via port messages (fallback method)\n * Only needed if the worklet doesn't support processorOptions initialization\n */\n/*\nconst applyRubberbandConfigViaMessages = (workletNode: AudioWorkletNode, trackIndex: number) => {\n workletNode.port.postMessage(JSON.stringify(['pitchTransitionStep', RUBBERBAND_CONFIG.pitchTransitionStep]));\n workletNode.port.postMessage(JSON.stringify(['formantOption', RUBBERBAND_CONFIG.formantOption]));\n workletNode.port.postMessage(JSON.stringify(['pitchOption', RUBBERBAND_CONFIG.pitchOption]));\n workletNode.port.postMessage(JSON.stringify(['engineOption', RUBBERBAND_CONFIG.engineOption]));\n workletNode.port.postMessage(JSON.stringify(['quality', RUBBERBAND_CONFIG.quality]));\n \n _AC_log(`%cπ΅ Configured Rubberband worklet for track ${trackIndex} (via messages):`, 'color: orange', RUBBERBAND_CONFIG);\n};\n*/\n\n\nexport const initAudioContext = async (audioContext: AudioContext, suspendPlayback: boolean): Promise<AEV3Context> => {\n\n _AC_time(TIMER_LOG_AUDIO_CONTEXT.INITIALISED_AUDIO_CONTEXT);\n\n // _AC_log(audioContext.audioWorklet);\n // WARNING: only allow on secure origin on iOS, hence local ip is not allowed\n \n _AC_time(TIMER_LOG_AUDIO_CONTEXT.ADD_AUDIO_WORKLET_MODULES);\n\n await audioContext.audioWorklet.addModule('/workers/buffer-player-processor-202603.tlM3up1e-ts.js?v=' + Date.now());\n await audioContext.audioWorklet.addModule(getRubberbandWorkletFileName());\n\n // await audioContext.audioWorklet.addModule(RUBBERBAND_WORKLET_FILE_NAME);\n\n // await audioContext.audioWorklet.addModule('/workers/interceptor-processor.js');\n\n\n // await audioContext.audioWorklet.addModule('/workers/crossfade-controller-processor.js');\n\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.ADD_AUDIO_WORKLET_MODULES, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.ADD_AUDIO_WORKLET_MODULES);\n\n const audioContextDebugEl = document.getElementById('audio-context-debug');\n if (audioContextDebugEl) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n AEV3Controller.getInstance().setAudioContextStateChanged(audioContext.state as any);\n audioContextDebugEl.textContent = `| ctx state: ${audioContext.state} ${Date.now().toFixed(0)}`;\n }\n\n _AC_log('%c[AEV3Content::init] useAudioStreamOutput', 'color: blue', USE_AUDIO_STREAM_DESTINATION);\n\n let destination: AudioDestinationNode | MediaStreamAudioDestinationNode;\n \n _AC_time(TIMER_LOG_AUDIO_CONTEXT.SETUP_AUDIO_GRAPHS);\n \n // stutter on both iOS and desktop [resolved]\n // although able to play in background mode\n const mediaStreamNode: MediaStreamAudioDestinationNode = audioContext.createMediaStreamDestination();\n \n const liveStream: HTMLAudioElement = document.getElementById('stream-output') as HTMLAudioElement;\n \n liveStream.addEventListener('ended', () => {\n const el = document.getElementById('stream-output-debug');\n if (el) {\n el.textContent = `stream-output is ended ${Date.now().toFixed(0)}`;\n }\n });\n liveStream.addEventListener('pause', () => {\n const el = document.getElementById('stream-output-debug');\n if (el) {\n el.textContent = `stream-output is paused ${Date.now().toFixed(0)}`;\n }\n });\n liveStream.addEventListener('play', () => {\n const el = document.getElementById('stream-output-debug');\n if (el) {\n el.textContent = `${el.textContent}| stream-output resumed ${Date.now().toFixed(0)}`;\n }\n });\n\n if (USE_AUDIO_STREAM_DESTINATION) {\n liveStream.srcObject = mediaStreamNode.stream;\n }\n\n // audioElement.src = 'https://d3aj9yujg8n59a.cloudfront.net/station/stems/00000003-8e2b-1392-95bb-c7bbfd3c6118/drums.wav';\n // Optional: Provide a silent fallback to ensure iOS media controls remain active\n // audioElement.src = 'data:audio/wav;base64,UklGRiIAAABXQVZFZm10IBAAAAABAAEAESsAAAB3AgAEABAAZGF0YQAAAAA=';\n // audioElement.src = 'https://geo-samples.beatport.com/track/2f5d3964-4d10-4bbb-ba2f-3ab258b21894.LOFI.mp3';\n // audioElement.src = 'https://staging-stemplatform.netlify.app/audio/silent-track.mp3';\n // audioElement.loop = true;\n\n const audioControl: HTMLAudioElement = document.getElementById('audio-control') as HTMLAudioElement;\n audioControl.addEventListener('ended', () => {\n const debug = document.getElementById('audio-context-debug');\n const acDebug = document.getElementById('audio-control-debug');\n if (debug && acDebug) {\n acDebug.textContent = `audio-control is ended ${Date.now()}`;\n }\n });\n audioControl.addEventListener('pause', () => {\n const debug = document.getElementById('audio-context-debug');\n const acDebug = document.getElementById('audio-control-debug');\n if (debug && acDebug) {\n acDebug.textContent = `audio-control is paused ${Date.now()}`;\n }\n });\n audioControl.addEventListener('play', () => {\n const debug = document.getElementById('audio-context-debug');\n const acDebug = document.getElementById('audio-control-debug');\n if (debug && acDebug) {\n acDebug.textContent = `${acDebug.textContent}| audio-control resumed ${Date.now().toFixed(0)}`;\n }\n });\n\n audioContext.addEventListener('statechange', (e) => {\n _AC_log(e);\n const audioContext: AudioContext = e.currentTarget as AudioContext;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n AEV3Controller.getInstance().setAudioContextStateChanged(audioContext.state as any);\n \n const dbg = document.getElementById('audio-context-debug');\n if (dbg) {\n dbg.textContent = `ctx state: ${audioContext.state} ${Date.now()}`;\n }\n // trackSources.forEach((t, index)=>{\n // t.forEach((s)=>s.stop())\n // });\n \n // @ts-expect-error: looks like this is known the linter does not catch it - we rely it to know if browser playback is interrupted by other music app\n if (audioContext.state === 'interrupted') {\n _AC_log('clean mediaSession');\n // AEV3Controller.getInstance().pauseOnIOS();\n if ('mediaSession' in navigator){\n\n // especailly on iOS\n //@ts-expect-error: i know it is read-only but yet let me do it\n navigator.mediaSession = null;\n }\n }\n });\n // audioControl.src = 'https://geo-samples.beatport.com/track/2f5d3964-4d10-4bbb-ba2f-3ab258b21894.LOFI.mp3';\n // audioControl.src = '/silent-track.mp3';\n \n liveStream.preservesPitch = true;\n if (USE_AUDIO_STREAM_DESTINATION) {\n destination = mediaStreamNode;\n } else {\n destination = audioContext.destination;\n }\n\n const sampleRate = 48000;\n\n const stemBufferNodeTrack1: AudioWorkletNode[] = [] ; // x 4\n const stemBufferNodeTrack2: AudioWorkletNode[] = [] ; // x 4\n\n const stemGainNodesTrack1: GainNode[] = []; // x 4\n const stemGainNodesTrack2: GainNode[] = []; // x 4\n \n\n const stemAnalyserNodesTrack1: AnalyserNode[] = []; // x 4\n const stemAnalyserNodesTrack2: AnalyserNode[] = []; // x 4\n \n const trackWorkletNodesCurrent: AudioWorkletNode[] = []; // x 3\n // const trackWorkletNodesStandBy: AudioWorkletNode[] = []; // x 3\n \n // const crossfadeControllers: AudioWorkletNode[] = []; // x 3\n const trackGainNodes: GainNode[] = []; // x 3\n\n const masterGainNode: GainNode = audioContext.createGain(); // GainNode; // x 1\n masterGainNode.connect(destination);\n\n const silentTrackBuffers: AudioBuffer[] = [];\n const silentTrackSourceNodes: (AudioBufferSourceNode | undefined)[] = [];\n\n let workletNode: AudioWorkletNode;\n const optionsForWorklet: {\n numberOfInputs: number;\n numberOfOutputs: number;\n channelCount: number;\n channelCountMode: ChannelCountMode,\n } = {\n numberOfInputs: 1,\n numberOfOutputs: 1,\n channelCount: 2, // Stereo\n channelCountMode: 'explicit',\n // channelInterpretation: 'speakers',\n };\n\n let delayNode: DelayNode | undefined;\n \n for (let i: number = 0; i < 2; i ++) {\n const trackIndex = i as 0 | 1;\n const trackGainNode = audioContext.createGain();\n trackGainNode.connect(masterGainNode);\n trackGainNodes.push(trackGainNode);\n \n // crossfadeController.connect(trackGainNode);\n // crossfadeControllers.push(crossfadeController);\n\n \n if (AVOID_RUBBERBAND_WORKLET_AT_SEED && trackIndex===0\n || AVOID_RUBBERBAND_WORKLET_AT_MIX1 && trackIndex===1\n ) {\n if (USE_DELAY_NODE_ON_TRACK_0 && trackIndex === 0) {\n delayNode = audioContext.createDelay();\n delayNode.delayTime.value = DELAY_TIME_USED_ON_TRACK_0;\n delayNode.connect(trackGainNode); // Connect to input 0\n trackWorkletNodesCurrent.push(delayNode as unknown as AudioWorkletNode); // Store reference for debugging\n } else {\n trackWorkletNodesCurrent.push(undefined as unknown as AudioWorkletNode);\n } \n } else {\n _AC_log(`Making ${USE_PHAZE_ENGINE ? 'Phaze' : 'Rubberband'} processor`, trackIndex);\n \n if (USE_PHAZE_ENGINE) {\n // Create Phaze worklet with optimized stereo configuration\n workletNode = new AudioWorkletNode(audioContext, RUBBERBAND_WORKLET_REGISTERED_NAME, {\n channelCount: 2,\n channelCountMode: 'explicit',\n outputChannelCount: [2],\n });\n _AC_log(`%cπ΅ Created optimized Phaze worklet for track ${trackIndex}`, 'color: blue');\n } else {\n workletNode = new AudioWorkletNode(audioContext, RUBBERBAND_WORKLET_REGISTERED_NAME, {\n channelCount: 2,\n channelCountMode: 'explicit',\n outputChannelCount: [2],\n processorOptions: {\n pitchTransitionStep: RUBBERBAND_CONFIG.pitchTransitionStep,\n formantOption: RUBBERBAND_CONFIG.formantOption,\n pitchOption: RUBBERBAND_CONFIG.pitchOption,\n engineOption: RUBBERBAND_CONFIG.engineOption,\n quality: RUBBERBAND_CONFIG.quality,\n }\n });\n \n workletNode.port.postMessage(JSON.stringify(['set-pitch-delay', { delaySamples: PITCH_DELAY_SAMPLES }]));\n _AC_log(`%cπ΅ [Pitch Delay] track ${trackIndex}: set-pitch-delay sent β ${PITCH_DELAY_SAMPLES} samples (${((PITCH_DELAY_SAMPLES / 48000) * 1000).toFixed(0)}ms)`, 'color: #fbbf24');\n\n \n _AC_log(`%cπ΅ Created Rubberband worklet for track ${trackIndex} with config:`, 'color: green',\n { ...RUBBERBAND_CONFIG, pitchDelaySamples: PITCH_DELAY_SAMPLES });\n }\n \n workletNode.connect(trackGainNode); // Connect to input 0\n trackWorkletNodesCurrent.push(workletNode); // Store reference for debugging\n }\n \n \n // const workletNode = new AudioWorkletNode(audioContext, RUBBERBAND_WORKLET_REGISTERED_NAME);\n\n // _AC_log(workletNode)\n // const workletNode2 = new AudioWorkletNode(audioContext, RUBBERBAND_WORKLET_REGISTERED_NAME);\n // const workletNode = new AudioWorkletNode(audioContext, RUBBERBAND_WORKLET_REGISTERED_NAME);\n\n // _AC_log(workletNode)\n // workletNode2.connect(crossfadeController, 0, 1); // Connect to input 1\n // trackWorkletNodesStandBy.push(workletNode2); // Store reference for debugging\n\n // trick to avoid sound distortion with using MediaStreamDestination\n const silentBuffer = createSilentAudioBuffer(audioContext, sampleRate, SILENT_BUFFER_SAMPLE_SIZE, 2);\n silentTrackBuffers.push(silentBuffer);\n\n for (let stemIndex = 0; stemIndex < 4; stemIndex ++) {\n const bufferSize = 1024; // You may adjust this value\n \n const stemGainNode: GainNode = audioContext.createGain();\n if (AVOID_RUBBERBAND_WORKLET_AT_SEED && trackIndex===0\n || AVOID_RUBBERBAND_WORKLET_AT_MIX1 && trackIndex===1\n ) {\n if (USE_DELAY_NODE_ON_TRACK_0 && trackIndex === 0) {\n stemGainNode.connect(delayNode!);\n } else {\n stemGainNode.connect(trackGainNode);\n }\n } else {\n stemGainNode.connect(trackWorkletNodesCurrent[trackIndex]!);\n }\n\n /*\n if (!AVOID_ANALYSER_NODES) {\n const analyserNode = audioContext.createAnalyser();\n analyserNode.fftSize = bufferSize;\n\n const analyserGainNodesTarget = (trackIndex === 0) ? stemAnalyserNodesTrack1 : stemAnalyserNodesTrack2;\n analyserGainNodesTarget.push(analyserNode);\n\n stemGainNode.connect(analyserNode);\n }\n */\n\n stemGainNode.gain.value = getDefaultGainValueByTrackIndex(trackIndex as 0|1, stemIndex);\n const stemGainNodesTarget = (trackIndex === 0) ? stemGainNodesTrack1 : stemGainNodesTrack2;\n stemGainNodesTarget.push(stemGainNode);\n\n const stemBufferNodesTarget = (trackIndex === 0) ? stemBufferNodeTrack1 : stemBufferNodeTrack2;\n const stemBufferNodeTrack = new AudioWorkletNode(audioContext, 'buffer-player-processor', optionsForWorklet);\n // const stemBufferNodeTrack = new AudioWorkletNode(audioContext, 'buffer-player-processor', {...optionsForWorklet, processorOptions: { bufferSize: 192 }});\n stemBufferNodeTrack.connect(stemGainNode);\n\n if (!AVOID_ANALYSER_NODES) {\n const analyserNode = audioContext.createAnalyser();\n analyserNode.fftSize = bufferSize;\n\n const analyserGainNodesTarget = (trackIndex === 0) ? stemAnalyserNodesTrack1 : stemAnalyserNodesTrack2;\n analyserGainNodesTarget.push(analyserNode);\n\n stemBufferNodeTrack.connect(analyserNode);\n }\n \n stemBufferNodesTarget.push(stemBufferNodeTrack);\n }\n }\n\n // DISABLED STANDBY WORKLETS: for (let trackIndex = 2; trackIndex < 4; trackIndex ++) {\n // DISABLED STANDBY WORKLETS: const silentBuffer = createSilentAudioBuffer(audioContext, sampleRate, SILENT_BUFFER_SAMPLE_SIZE, 2);\n // DISABLED STANDBY WORKLETS: silentTrackBuffers.push(silentBuffer);\n // DISABLED STANDBY WORKLETS: \n // DISABLED STANDBY WORKLETS: const stemBufferNodesTarget = (trackIndex === 2) ? stemBufferNodeTrack3 : stemBufferNodeTrack4;\n // DISABLED STANDBY WORKLETS: const stemGainNodesTarget = (trackIndex === 2) ? stemGainNodesTrack1 : stemGainNodesTrack2;\n // DISABLED STANDBY WORKLETS: \n // DISABLED STANDBY WORKLETS: for (let stemIndex = 0; stemIndex < 4; stemIndex ++) {\n // DISABLED STANDBY WORKLETS: const stemBufferNodeTrack = new AudioWorkletNode(audioContext, 'buffer-player-processor', optionsForWorklet);\n // DISABLED STANDBY WORKLETS: // const stemBufferNodeTrack = new AudioWorkletNode(audioContext, 'buffer-player-processor', {...optionsForWorklet, processorOptions: { bufferSize: 192 }});\n // DISABLED STANDBY WORKLETS: stemBufferNodeTrack.connect(stemGainNodesTarget[stemIndex]);\n // DISABLED STANDBY WORKLETS: stemBufferNodesTarget.push(stemBufferNodeTrack);\n // DISABLED STANDBY WORKLETS: }\n // DISABLED STANDBY WORKLETS: }\n\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.SETUP_AUDIO_GRAPHS, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.SETUP_AUDIO_GRAPHS);\n\n for (let trackIndex = 0; trackIndex < 2; trackIndex ++) {\n if (AVOID_RUBBERBAND_WORKLET_AT_SEED && [0].includes(trackIndex)) {\n silentTrackSourceNodes.push(undefined);\n } else if (AVOID_RUBBERBAND_WORKLET_AT_MIX1 && [1].includes(trackIndex)) {\n silentTrackSourceNodes.push(undefined);\n } else {\n const silentSource = recreateAndConnectSilentBufferToWorklet(audioContext, trackIndex as 0|1, silentTrackBuffers, trackWorkletNodesCurrent);\n silentTrackSourceNodes.push(silentSource);\n }\n }\n\n if (!suspendPlayback) {\n try {\n _AC_time(TIMER_LOG_AUDIO_CONTEXT.HACK_1_GENERATE_AND_LOAD_HLS_SILENT_TRACK);\n await generateAndLoadSilentTrackM3U8(audioControl, 1800);\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.HACK_1_GENERATE_AND_LOAD_HLS_SILENT_TRACK, TIMER_LOG_AUDIO_CONTEXT.LEVEL_1);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.HACK_1_GENERATE_AND_LOAD_HLS_SILENT_TRACK);\n\n _AC_time(TIMER_LOG_AUDIO_CONTEXT.HACK_1_PLAY_HLS_SILENT_TRACK);\n await audioControl.play();\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.HACK_1_PLAY_HLS_SILENT_TRACK, TIMER_LOG_AUDIO_CONTEXT.LEVEL_1);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.HACK_1_PLAY_HLS_SILENT_TRACK);\n } catch (err) {\n console.error(err);\n }\n \n _AC_time(TIMER_LOG_AUDIO_CONTEXT.HACK_1_SETUP_MEDIA_SESSION_SILENT_TRACK);\n setupMediaSession();\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.HACK_1_SETUP_MEDIA_SESSION_SILENT_TRACK, TIMER_LOG_AUDIO_CONTEXT.LEVEL_1);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.HACK_1_SETUP_MEDIA_SESSION_SILENT_TRACK);\n \n // for decoy control\n // await pause((1)*1000); // let decoy music control loaded up for pause icon\n\n _AC_time(TIMER_LOG_AUDIO_CONTEXT.HACK_2_PAUSING_FOR_MEDIA_DESTINATION_CONNECTING_WITH_WORKLET);\n await pause((SILENT_BUFFER_SAMPLE_SIZE/sampleRate)*1000); // required\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.HACK_2_PAUSING_FOR_MEDIA_DESTINATION_CONNECTING_WITH_WORKLET, TIMER_LOG_AUDIO_CONTEXT.LEVEL_1);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.HACK_2_PAUSING_FOR_MEDIA_DESTINATION_CONNECTING_WITH_WORKLET);\n\n if (USE_AUDIO_STREAM_DESTINATION){\n _AC_time(TIMER_LOG_AUDIO_CONTEXT.PLAY_MEDIA_STREAM_DESTIONATION_AUDIO);\n await liveStream.play();\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.PLAY_MEDIA_STREAM_DESTIONATION_AUDIO, TIMER_LOG_AUDIO_CONTEXT.LEVEL_ALERT);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.PLAY_MEDIA_STREAM_DESTIONATION_AUDIO);\n }\n\n _AC_timeLog(TIMER_LOG_AUDIO_CONTEXT.INITIALISED_AUDIO_CONTEXT, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n _AC_timeEnd(TIMER_LOG_AUDIO_CONTEXT.INITIALISED_AUDIO_CONTEXT);\n\n // updateAudiodecoyPlaybackState('playing');\n // updateAudiodecoyPlaybackState('playing');\n } else {\n _AC_log(TIMER_LOG_AUDIO_CONTEXT.INITIALISED_AUDIO_CONTEXT_SUSPENDED, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n }\n\n return {\n audioContext: audioContext,\n //\n stemBufferNodeTrack1,\n stemBufferNodeTrack2,\n\n //\n stemGainNodesTrack1, // GainNode[] // x 4\n stemGainNodesTrack2, // GainNode[] // x 4\n\n stemAnalyserNodesTrack1, // AnalyserNode[] // x 4\n stemAnalyserNodesTrack2, // AnalyserNode[] // x 4\n // \n trackWorkletNodesCurrent, // AudioWorkletNode[]; // x 3\n trackGainNodes, // GainNode[]; // x 3\n masterGainNode, // GainNode; // x 1\n //\n silentTrackBuffers, // AudioBuffer[];\n silentTrackSourceNodes, // AudioBufferSourceNode[];\n //\n destination,\n recreateAndConnectSilentBufferToWorklet,\n };\n \n}\n\nexport function pause(duration: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, duration);\n });\n}\n\nfunction createSilentAudioBuffer(\n audioContext: AudioContext,\n sampleRate: number,\n sampleLength: number,\n numberOfChannels: number,\n): AudioBuffer {\n const silentBuffer = audioContext.createBuffer(numberOfChannels, sampleLength, sampleRate);\n return silentBuffer;\n}\n\nfunction recreateAndConnectSilentBufferToWorklet(\n audioContext: AudioContext,\n trackIndex: TrackIndexType,\n silentTrackBuffers: AudioBuffer[], // x 2\n trackWorkletNodesCurrent: AudioWorkletNode[], // x 2\n ): AudioBufferSourceNode {\n if (trackIndex !== 0 && trackIndex !== 1) {\n throw new Error(`recreateAndConnectSilentBufferToWorklet: invalid track index ${trackIndex}`);\n }\n const slot: 0 | 1 = trackIndex;\n const silentBuffer = silentTrackBuffers[slot];\n \n const silentSource = audioContext.createBufferSource();\n silentSource.buffer = silentBuffer; \n \n const trackWorkletNode = trackWorkletNodesCurrent[slot];\n if (!trackWorkletNode) {\n throw new Error(`recreateAndConnectSilentBufferToWorklet: no worklet for track ${trackIndex}`);\n }\n // required, make sure enough buffer is feed into AudioWorklet before actual music data comes in\n silentSource.connect(trackWorkletNode);\n return silentSource;\n}\n\nexport const getDefaultGainValue = (trackType: TrackLabelType, stemIndex: number) => {\n return 1;\n if(trackType==='seed1') {\n switch(stemIndex){\n case 0:\n case 2:\n case 3:\n return 0;\n }\n } else if (trackType==='mix1') {\n if(stemIndex===1) {\n return 0;\n }\n } else {\n if(stemIndex===1) {\n return 0;\n }\n }\n return 1;\n}\n\n// Exported configurations for use by other modules\nexport const USE_PHAZE_ENGINE_EXPORTED = USE_PHAZE_ENGINE;\nexport const USE_NATURAL_TEMPO_MIXING_EXPORTED = USE_NATURAL_TEMPO_MIXING;\nexport const USE_BAR_WISE_PITCH_CORRECTION_EXPORTED = USE_BAR_WISE_PITCH_CORRECTION;\n","import { AEV3Controller } from \"../global-aev3-controller\";\n\n// Convert hex to RGB\nconst hexToRgb = (hex: string) => ({\n r: parseInt(hex.slice(1, 3), 16),\n g: parseInt(hex.slice(3, 5), 16),\n b: parseInt(hex.slice(5, 7), 16),\n});\n\n// Convert RGB to hex\nconst rgbToHex = ({ r, g, b }: { r: number; g: number; b: number }) =>\n '#' + [r, g, b].map((x) => Math.max(0, Math.min(255, Math.round(x))).toString(16).padStart(2, '0')).join('');\n\n/**\n * Generate gradient colors mapped to string segments.\n *\n * @param {string} startColor - Starting hex color (e.g., '#000000')\n * @param {string} endColor - Ending hex color (e.g., '#ff0000')\n * @param {string} inputStr - Input string (e.g., 'degenerating')\n * @param {number} maxSegmentLength - Max length of each string segment\n * @returns {Array<{color: string, l: string}>} Gradient-colored segments\n */\nfunction generateGradientSegments(startColor: string, endColor: string, inputStr: string, maxSegmentLength: number) {\n const start = hexToRgb(startColor);\n const end = hexToRgb(endColor);\n\n const steps = inputStr.length;\n const results = [];\n\n // Calculate gradient colors per character\n for (let i = 0; i < steps; i++) {\n const ratio = steps <= 1 ? 0 : i / (steps - 1);\n const r = start.r + (end.r - start.r) * ratio;\n const g = start.g + (end.g - start.g) * ratio;\n const b = start.b + (end.b - start.b) * ratio;\n\n results.push({\n color: rgbToHex({ r, g, b }),\n l: inputStr[i]\n });\n }\n\n // Group by max segment length\n const grouped = [];\n for (let i = 0; i < results.length; i += maxSegmentLength) {\n const segment = results.slice(i, i + maxSegmentLength);\n grouped.push({\n color: segment[0].color,\n l: segment.map(s => s.l).join('')\n });\n }\n\n return grouped;\n}\n\n// Example usage:\n// console.log(generateGradientSegments('#000000', '#ff0000', 'degenerating', 3));\n\n\n/**\n * Print gradient segments to console with colored output.\n *\n * @param {Array<{color: string, l: string}>} segments - Array of color-segment objects\n */\nfunction printGradientSegments(segments: Array<{ color: string; l: string }>, icon = 'π§¬'): void {\n \n let output = '';\n const prefix = icon+' [202512] '\n for (const { color, l } of segments) {\n const { r, g, b } = hexToRgb(color);\n // ANSI escape sequence for 24-bit color text\n output += `\\x1b[38;2;${r};${g};${b}m${l}\\x1b[0m`;\n }\n\n console.log(prefix+output);\n}\n\n// Example usage:\n// const segments = [\n// { color: '#000000', l: 'deg' },\n// { color: '#4c0000', l: 'ene' },\n// { color: '#990000', l: 'rat' },\n// { color: '#e60000', l: 'ing' }\n// ];\n\n// printGradientSegments(segments);\n\nexport const consoleColorfulMessage = (message: string, gradientStart: string = '#6f6060', gradientEnd: string = '#827ac4', max_length: number = 20, icon = 'π§¬'): void => {\n // return;\n if (!AEV3Controller.getInstance()?.colorful_debugging) return;\n \n if (max_length <= 0) {\n throw new Error('max_length must be positive');\n }\n const hexRegex = /^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/;\n if (!hexRegex.test(gradientStart) || !hexRegex.test(gradientEnd)) {\n throw new Error('Invalid hex color format');\n }\n const _gradientStart = gradientStart.length === 9 ? gradientStart.substring(0, 7): gradientStart;\n const _gradientEnd = gradientEnd.length === 9 ? gradientEnd.substring(0, 7): gradientEnd;\n printGradientSegments(\n generateGradientSegments(_gradientStart, _gradientEnd, message, max_length), icon\n );\n}\n\nexport const consoleColorfulMessage4Lawful = (message: string, gradientStart: string = '#6f6060', gradientEnd: string = '#827ac4', max_length: number = 20, icon = 'π§¬'): void => {\n if (!AEV3Controller.getInstance()?.colorful_debugging) return;\n if (max_length <= 0) {\n throw new Error('max_length must be positive');\n }\n const hexRegex = /^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/;\n if (!hexRegex.test(gradientStart) || !hexRegex.test(gradientEnd)) {\n throw new Error('Invalid hex color format');\n }\n const _gradientStart = gradientStart.length === 9 ? gradientStart.substring(0, 7): gradientStart;\n const _gradientEnd = gradientEnd.length === 9 ? gradientEnd.substring(0, 7): gradientEnd;\n printGradientSegments(\n generateGradientSegments(_gradientStart, _gradientEnd, message, max_length), icon\n );\n}","/**\n * Narrowing helpers for `catch (thrown)` when `useUnknownInCatchVariables` is on (`thrown` is `unknown`).\n */\n\nexport function unknownThrownToString(thrown: unknown): string {\n if (thrown instanceof Error) {\n return thrown.toString();\n }\n return String(thrown);\n}\n\nexport function getUnknownThrownMessage(thrown: unknown): string {\n if (thrown instanceof Error) {\n return thrown.message;\n }\n return String(thrown);\n}\n\nexport function getUnknownThrownCauseString(thrown: unknown): string {\n if (thrown instanceof Error && thrown.cause !== undefined && thrown.cause !== null) {\n return String(thrown.cause);\n }\n return '';\n}\n\n/** Same idea as legacy `` `${error.toString()} - ${error.cause?.toString()}` `` for styled console lines. */\nexport function formatUnknownCaughtForLog(thrown: unknown): string {\n return `${unknownThrownToString(thrown)} - ${getUnknownThrownCauseString(thrown)}`;\n}\n","import { GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR } from \"../cache/mp4-sequence\";\nimport { BarSequence } from \"../decode/bar-sequence\";\nimport { AEV3Controller, SAMPLE_RATE } from \"../global-aev3-controller\";\nimport { UUID } from \"../interface\";\nimport { consoleColorfulMessage } from \"./colorConsole\";\nimport { unknownThrownToString } from '@/utils/unknown-caught-error';\n\nexport interface IBeat {\n frame: number;\n number: number;\n timestamp: number;\n}\n\nconst _BARS_log: typeof console.log = (...data) => {\n if (!AEV3Controller.getInstance()?.colorful_debugging) return;\n if (data.length > 1) {\n if (typeof data[0] === 'string') {\n data[0] = 'βΎοΈ [202510] ' + data[0];\n }\n console.log(...data);\n } else {\n const [message] = data;\n if (typeof message === 'string') {\n consoleColorfulMessage(message, '#ec31f6ff', '#ff0000', 3,'βΎοΈ');\n } else {\n console.log(message);\n }\n }\n};\n\n// think this one will need to simplify\nexport const triggerDecodeBothBarSequencesBeforeStart = async (\n seedBar: BarSequence,\n mixBar: BarSequence,\n chunkIndexStart: number,\n chunkIndexEnd: number,\n timeoutForGiveUpForEachSegment: number,\n): Promise<boolean> => {\n // seedBar.startDecodeIndex = chunkIndexStart;\n // mixBar.startDecodeIndex = chunkIndexStart;\n\n Array(4).fill(0).forEach((v, sequenceIdx)=>{\n seedBar.updatePlayedHead(\n sequenceIdx,\n chunkIndexStart,\n );\n mixBar.updatePlayedHead(\n sequenceIdx,\n chunkIndexStart,\n );\n });\n\n // Clear any previous cancellation flags\n seedBar.clearDecodeCancellations();\n mixBar.clearDecodeCancellations();\n\n const decodePromises: Promise<boolean>[] = [];\n _BARS_log(`%ctriggerDecodeBothBarSequencesBeforeStart(${chunkIndexStart}-${chunkIndexEnd}) - starts`, 'color: red;');\n \n // Create a promise for each segment in the range\n let error_detected = false;\n for (let i = chunkIndexStart; i <= chunkIndexEnd; i++) {\n const decodePromise = seedBar.decode(i, timeoutForGiveUpForEachSegment)\n .catch((err) => {\n console.error(`Failed to decode chunk ${i}:`, err);\n error_detected = true;\n // Cancel all other decode operations when one fails\n seedBar.cancelAllDecodeOperations();\n mixBar.cancelAllDecodeOperations();\n throw err; // Re-throw to ensure Promise.all fails\n });\n const decodePromise2 = mixBar.decode(i, timeoutForGiveUpForEachSegment)\n .catch((err) => {\n console.error(`Failed to decode chunk ${i}:`, err);\n error_detected = true;\n // Cancel all other decode operations when one fails\n seedBar.cancelAllDecodeOperations();\n mixBar.cancelAllDecodeOperations();\n throw err; // Re-throw to ensure Promise.all fails\n });\n decodePromises.push(decodePromise);\n decodePromises.push(decodePromise2);\n }\n \n try {\n // Wait for all segments to decode\n // note the fatal error now rejected as early as it could so following will always be all true\n await Promise.all(decodePromises);\n // console.log('interested', a);\n \n _BARS_log('error_detected', error_detected);\n _BARS_log(`%ctriggerDecodeBothBarSequencesBeforeStart(${chunkIndexStart}-${chunkIndexEnd}) OK!`, 'color: red;');\n return true; // All segments decoded successfully\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n // Cancel all decode operations when Promise.all fails\n seedBar.cancelAllDecodeOperations();\n mixBar.cancelAllDecodeOperations();\n // console.error(`One or more segments (out of ${chunkIndexEnd - chunkIndexStart + 1}) failed to decode within timeout:`, err);\n if (unknownThrownToString(err).includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n // re-throw it directly to the loadAndPlay and resume procedures\n throw err;\n } else {\n throw new Error(`Failed: ${chunkIndexEnd - chunkIndexStart + 1} segments requested, some failed within ${timeoutForGiveUpForEachSegment}s timeout`, {cause: unknownThrownToString(err)});\n }\n }\n}\n\nexport interface IBarMapping {sampleStart: number, sampleEnd: number, duration: number};\n\nexport const composeBarsFromBeats = (beats: IBeat[]) => {\n\n const downbeats = beats.filter((b)=>b.number===1);\n const bars:IBarMapping[] = [];\n for(let i=0; i<downbeats.length-1; i++){\n const current = downbeats[i];\n const next = downbeats[i+1];\n\n bars.push({\n sampleStart: current.frame,\n sampleEnd: next.frame - 1,\n duration: next.frame - current.frame,\n })\n }\n return bars;\n \n // Optional: Handle the first and last bars differently if needed\n // Uncomment the following code if you want to include the first and last bars\n \n /*\n const firstBarRemoved: IBarMapping = {\n sampleStart: 0,\n sampleEnd: bars[0].sampleStart - 1,\n duration: bars[0].sampleStart,\n };\n const lastBarRemoved: IBarMapping = {\n sampleStart: startsFrom1[startsFrom1.length - 1].frame,\n sampleEnd: beats[beats.length - 1].frame,\n duration: beats[beats.length - 1].frame - startsFrom1[startsFrom1.length - 1].frame,\n };\n return [firstBarRemoved, ...bars, lastBarRemoved];\n */\n};\n\nexport const resolveSampleLocOfDownbeatFromBarIndex = (trackData: { beats: {\n frame: number,\n number: number,\n timestamp: number,\n}[]}, startBar: number) => {\n try {\n const beat = trackData.beats.find((v, index) => index === startBar);\n if (!beat) return -1;\n return Math.floor(beat.timestamp * SAMPLE_RATE);\n } catch (err) {\n return -1;\n }\n}\n\n/**\n * loop back find first item with same trackId on this segment\n * \n * @param arr \n * @param n (which must not be a transition chunk) \n * @param ignoreTransitionZoneChange: if set as false, it will search previous index with same trackId while it must not be tranistion zone\n * @returns \n */\nexport const startIndexOfThisSegment = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n: number, ignoreTransitionZoneChange: boolean): number => {\n try {\n const targetId = arr[n].originalBar.trackId;\n const isCurrentBarTransitionZone = arr[n].isTransitionalBar;\n\n // if current region is transition bar\n if (isCurrentBarTransitionZone) {\n ignoreTransitionZoneChange = true;\n }\n const stopWhenIsTranstionBarValue = !isCurrentBarTransitionZone;\n\n const { idx } = arr\n .slice(0, n + 1)\n .reduceRight(\n (state, item, i) => {\n if (state.stopped) return state;\n if (item.originalBar.trackId === targetId && (\n ignoreTransitionZoneChange\n || (!ignoreTransitionZoneChange && item.isTransitionalBar !== stopWhenIsTranstionBarValue)\n )) return { idx: i, stopped: false };\n return { idx: i + 1, stopped: true };\n },\n { idx: n, stopped: false }\n );\n\n return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * loop back find first item with same trackId on this segment\n * @param arr \n * @param n\n * @returns \n */\nexport const startIndexOfThisSegmentIgnoreTransition = (arr: { \n originalBar: { trackId: UUID\n }}[], n: number): number => {\n try {\n const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n===0) return 0;\n for (let i=n-1; i>=0; i--) {\n // loop until trackId is diff\n if (arr[i].originalBar.trackId!==targetId) {\n return i+1\n }\n }\n // if other trackId not found, return first index\n return 0;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * loop back and find starting index cover up to 1 transition\n * @param arr \n * @param n_non_transition\n * @returns \n */\nexport const startIndexOfThisSegmentCover1Transtion = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n_non_transition: number): number => {\n try {\n const n = n_non_transition;\n let foundTransition = false;\n // const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n===0) return 0;\n for (let i=n-1; i>=0; i--) {\n if (arr[i].isTransitionalBar && !foundTransition) {\n foundTransition = true;\n } else if (!arr[i].isTransitionalBar && foundTransition) {\n return i+1;\n }\n }\n // if other trackId not found, return first index\n return 0;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * loop forward find first item with same trackId on this segment\n * @param arr \n * @param n\n * @returns \n * /\nconst endIndexOfThisSegmentIgnoreTransition = (arr: { \n originalBar: { trackId: UUID\n }}[], n: number): number => {\n try {\n const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n>=arr.length) return -1;\n if (n===arr.length-1) return arr.length -1;\n for (let i=n+1; i<arr.length; i++) {\n // loop until trackId is diff\n if (arr[i].originalBar.trackId!==targetId) {\n return i-1\n }\n }\n // if other trackId not found, return last index\n return arr.length - 1;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n*/\n\n/**\n * loop forward and find starting index cover up to 1 transition\n * @param arr \n * @param n_non_transition\n * @returns \n */\nexport const endIndexOfThisSegmentCover1Transtion = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n_non_transition: number): number => {\n try {\n const n = n_non_transition;\n let foundTransition = false;\n // const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n>=arr.length) return -1;\n if (n===arr.length-1) return arr.length -1;\n for (let i=n+1; i<arr.length; i++) {\n // loop until trackId is diff\n if (arr[i].isTransitionalBar && !foundTransition) {\n foundTransition = true;\n } else if (!arr[i].isTransitionalBar && foundTransition) {\n return i-1;\n }\n }\n // if other trackId not found, return last index\n return arr.length - 1;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * loop forward find first item with transitionBar changed to true\n * @param arr \n * @param n_non_transition\n * @returns \n */\nexport const endIndexOfThisSegmentBeforeTransitionStarts = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n_non_transition: number): number => {\n try {\n const n = n_non_transition;\n // const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n>=arr.length) return -1;\n if (n===arr.length-1) return arr.length -1;\n for (let i=n+1; i<arr.length; i++) {\n // loop until trackId is diff\n if (arr[i].isTransitionalBar===true) {\n return i-1\n }\n }\n // if other trackId not found, return last index\n return arr.length-1;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * loop forward find first item with transitionBar changed to false\n * @param arr \n * @param n\n * @returns \n */\nexport const endIndexOfThisSegmentBeforeTransitionEnds = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n_is_transition: number): number => {\n try {\n const n = n_is_transition;\n // const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n>=arr.length) return -1;\n if (n===arr.length-1) return arr.length -1;\n for (let i=n+1; i<arr.length; i++) {\n // loop until trackId is diff\n if (arr[i].isTransitionalBar===false) {\n return i-1\n }\n }\n // if other trackId not found, return last index\n return arr.length-1;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * loop forward find first item with asked beatIndex\n * @param arr \n * @param n\n * @returns \n */\nexport const searchSegmentIdxBackwards = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID, beatIndex: number, beatIndexIsReal: boolean\n }}[], n: number, targetBarIdx: number, targetTrackId: UUID): number => {\n try {\n // const targetId = arr[n].originalBar.trackId;\n if (arr.length === 0) { return -1;}\n if (n===0) return 0;\n for (let i=n; i>=0; i--) {\n if (arr[i].originalBar.beatIndex === targetBarIdx && arr[i].originalBar.trackId === targetTrackId) {\n // found at i\n return i;\n }\n }\n // if other trackId not found, return first index\n return 0;\n // return idx;\n } catch (err) {\n console.error(err);\n return -1;\n }\n}\n\n/**\n * find last chunkIdx of this segment, and before transition zone\n * @param arr \n * @param n (which must not be a transition chunk) \n * @returns \n */\nexport const lastIndexOfThisSegmentBeforeTransitionZone = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n: number): number => {\n\n const targetId = arr[n].originalBar.trackId;\n \n for (let i=n; i<arr.length; i++) {\n if (arr[i].isTransitionalBar || arr[i].originalBar.trackId !== targetId) {\n return i-1;\n }\n }\n \n return arr.length -1;\n}\n\n/**\n * find last chunkIdx of this segment, and before transition zone\n * @param arr \n * @param n \n * @returns \n */\nexport const lastIndexOfThisSegmentIncludeTransition = (arr: { \n isTransitionalBar: boolean,\n originalBar: { trackId: UUID\n }}[], n: number): number => {\n\n const targetId = arr[n].originalBar.trackId;\n \n for (let i=n; i<arr.length -1; i++) {\n if (arr[i].originalBar.trackId !== targetId) {\n return i-1;\n }\n }\n \n return arr.length -1;\n}\n\nexport const deepClone = (clonableObject: object): object => {\n return JSON.parse(JSON.stringify(clonableObject))\n}\n\n","/**\n * Enhanced Segment Selection Utilities\n * \n * A streamlined approach to segment selection with:\n * - Configurable transition offset\n * - Larger segment sizes: 16/24/32 beats\n * - Smart fallback: Large β Medium β Small β Emergency\n * - No forced 4-beat alignment on start selection\n * - Optimal start can be any value within boundary range\n * - ENHANCED: DJ mode (large) uses dynamic segment spans with mix-in/mix-out logic\n */\n\n// Mode dependency removed; we will return all infinite sizes\n\n// Configuration\nconst DEFAULT_TRANSITION_OFFSET = 8; // Configurable transition offset\nconst ENABLE_VERBOSE_LOGS = false; // Disable all verbose intermediate logs\n\n// Export for compatibility with fetchFeature.ts\nexport const TRANSITION_ZONE_OFFSET_BARS = DEFAULT_TRANSITION_OFFSET;\n\nconst _SSSE_log: typeof console.log = (...data) => {\n return;\n console.log(...data);\n};\n\n\nconst SEGMENT_SIZES = {\n quick: { min: 16, max: 24, preferred: 16 }, // Minimum 16 bars, max 20 bars for smaller tracks\n large: 32 // Removed medium - just quick and large (DJ mode)\n} as const;\n\n/**\n * Clamp beat indices to valid range while ensuring end >= start\n * Prevents inverted segments that can cause negative bar durations\n * @param start - Starting beat index\n * @param end - Ending beat index \n * @param maxIndex - Maximum valid beat index (beats.length - 1)\n * @param minSegmentSize - Minimum segment size in bars (default 8)\n * @returns Clamped indices that form a valid segment\n */\nfunction clampSegmentIndices(\n start: number, \n end: number, \n maxIndex: number,\n minSegmentSize: number = 8\n): { start: number; end: number } {\n // Clamp to valid array bounds\n let clampedStart = Math.max(0, Math.min(start, maxIndex));\n let clampedEnd = Math.max(0, Math.min(end, maxIndex));\n \n // Ensure end >= start with minimum segment size\n if (clampedEnd <= clampedStart) {\n const effectiveMinSize = Math.min(minSegmentSize, maxIndex);\n \n // Try to preserve start position if there's room\n if (clampedStart + effectiveMinSize <= maxIndex) {\n clampedEnd = clampedStart + effectiveMinSize;\n } else {\n // Not enough room after start - anchor to end of track\n clampedEnd = maxIndex;\n clampedStart = Math.max(0, maxIndex - effectiveMinSize);\n }\n }\n \n return { start: clampedStart, end: clampedEnd };\n}\n\n/**\n * Find the closest beat index for a given timestamp\n */\nfunction findClosestBeatIndex(time: number, beats: { timestamp: number }[]): number {\n let closestIndex = 0;\n let minDiff = Number.MAX_VALUE;\n \n beats.forEach((beat, index) => {\n const diff = Math.abs(beat.timestamp - time);\n if (diff < minDiff) {\n minDiff = diff;\n closestIndex = index;\n }\n });\n \n return closestIndex;\n}\n\n/**\n * Calculate recommended transition length based on available bars\n */\nfunction calculateRecommendedTransitionLength(totalBars: number): number {\n if (totalBars <= 16) return Math.max(2, Math.floor(totalBars / 8));\n if (totalBars <= 24) return 4;\n return DEFAULT_TRANSITION_OFFSET;\n}\n\n// Type definitions matching the original interface\nexport type SegmentInfo = [number, number, number][];\n\nexport interface PlaybackWindow {\n startIndex: number;\n startTime: number;\n endIndex: number;\n endTime: number;\n duration: number;\n durationBars: number;\n startBeatIndex: number;\n endBeatIndex: number;\n}\n\nexport interface ModeWindow extends PlaybackWindow { transitionLength: number }\n\nexport interface PlaybackPoints {\n normal: ModeWindow & { beatIndex: number };\n infiniteQuick: ModeWindow; // Renamed from infiniteSmall\n infiniteLarge: ModeWindow; // Removed infiniteMedium\n}\n\n// Segment type definitions for scoring\nexport const SEGMENT_TYPES = {\n START: 0,\n END: 1,\n INTRO: 2,\n OUTRO: 3,\n BREAK: 4,\n BRIDGE: 5,\n INST: 6,\n SOLO: 7,\n VERSE: 8,\n CHORUS: 9\n};\n\n/**\n * Get segment size in beats based on mode\n */\nfunction getSegmentSizeInBeats(mode: 'quick' | 'large'): number {\n if (mode === 'quick') {\n return SEGMENT_SIZES.quick.max; // Use max for range calculations\n }\n return SEGMENT_SIZES.large;\n}\n\n/**\n * Calculate available range for segment selection\n */\nfunction calculateAvailableRange(\n totalBars: number, \n segmentSize: number, \n transitionOffset: number = DEFAULT_TRANSITION_OFFSET\n): { start: number; end: number; isValid: boolean } {\n const startBoundary = transitionOffset;\n const endBoundary = totalBars - segmentSize;\n \n const result = {\n start: startBoundary,\n end: endBoundary,\n isValid: endBoundary >= startBoundary\n };\n \n // Removed verbose logging\n \n return result;\n}\n\n/**\n * Try modes in fallback order until one fits\n */\nfunction findValidRange(\n totalBars: number,\n transitionOffset: number = DEFAULT_TRANSITION_OFFSET\n): { segmentSize: number; range: { start: number; end: number } } {\n const tryOrder: Array<'large' | 'quick'> = ['large', 'quick'];\n for (const mode of tryOrder) {\n const segmentSize = getSegmentSizeInBeats(mode);\n const range = calculateAvailableRange(totalBars, segmentSize, transitionOffset);\n if (range.isValid) {\n return { segmentSize, range };\n }\n }\n // Emergency fallback\n const availableSpace = totalBars - transitionOffset;\n const emergencySize = Math.max(8, Math.min(16, availableSpace));\n const emergencyRange = calculateAvailableRange(totalBars, emergencySize, transitionOffset);\n return { segmentSize: emergencySize, range: emergencyRange.isValid ? emergencyRange : { start: transitionOffset, end: transitionOffset } };\n}\n\n/**\n * Score segments based on type for optimal selection (base scores)\n */\nfunction scoreSegmentType(segmentType: number): number {\n const scores = {\n [SEGMENT_TYPES.CHORUS]: 100,\n [SEGMENT_TYPES.VERSE]: 85,\n [SEGMENT_TYPES.BRIDGE]: 70,\n [SEGMENT_TYPES.BREAK]: 55,\n [SEGMENT_TYPES.SOLO]: 45,\n [SEGMENT_TYPES.INST]: 35,\n [SEGMENT_TYPES.INTRO]: 15,\n [SEGMENT_TYPES.OUTRO]: 10,\n [SEGMENT_TYPES.START]: 5,\n [SEGMENT_TYPES.END]: 5\n };\n \n return scores[segmentType] || 20;\n}\n\n/**\n * Score boundary transitions for mix-in/mix-out suitability\n */\nfunction scoreBoundaryTransition(fromType: number, toType: number, mode: 'mix-in' | 'mix-out'): number {\n const getTypeName = (type: number): string => {\n const names: Record<number, string> = {\n 0: 'START',\n 1: 'END',\n 2: 'INTRO',\n 3: 'OUTRO',\n 4: 'BREAK',\n 5: 'BRIDGE',\n 6: 'INST',\n 7: 'SOLO',\n 8: 'VERSE',\n 9: 'CHORUS',\n };\n return names[type] || 'UNKNOWN';\n };\n\n if (mode === 'mix-in') {\n // Mix-in: Score transitions that build energy or provide good entry points\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.CHORUS) return 150; // Perfect energy build\n if (fromType === SEGMENT_TYPES.INTRO && toType === SEGMENT_TYPES.VERSE) return 140; // Natural progression\n if (fromType === SEGMENT_TYPES.BRIDGE && toType === SEGMENT_TYPES.CHORUS) return 135; // Good energy transition\n if (fromType === SEGMENT_TYPES.BRIDGE && toType === SEGMENT_TYPES.VERSE) return 132; // Good energy pickup from bridge\n if (fromType === SEGMENT_TYPES.BREAK && toType === SEGMENT_TYPES.VERSE) return 130; // Energy pickup\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.BRIDGE) return 125; // Smooth transition\n if (fromType === SEGMENT_TYPES.INTRO && toType === SEGMENT_TYPES.CHORUS) return 120; // Skip to energy\n if (fromType === SEGMENT_TYPES.CHORUS && toType === SEGMENT_TYPES.VERSE) return 80; // Energy drop (bad for mix-in)\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.VERSE) return 90; // Same energy (neutral)\n if (fromType === SEGMENT_TYPES.CHORUS && toType === SEGMENT_TYPES.CHORUS) return 85; // High energy but no change\n } else {\n // Mix-out: Score transitions that provide good exit points or energy drops\n if (fromType === SEGMENT_TYPES.CHORUS && toType === SEGMENT_TYPES.VERSE) return 150; // Perfect energy drop\n if (fromType === SEGMENT_TYPES.CHORUS && toType === SEGMENT_TYPES.BRIDGE) return 145; // Smooth exit\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.OUTRO) return 140; // Natural ending\n if (fromType === SEGMENT_TYPES.CHORUS && toType === SEGMENT_TYPES.BREAK) return 135; // Energy break\n if (fromType === SEGMENT_TYPES.BRIDGE && toType === SEGMENT_TYPES.VERSE) return 130; // Gentle transition\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.BRIDGE) return 125; // Smooth exit prep\n if (fromType === SEGMENT_TYPES.CHORUS && toType === SEGMENT_TYPES.CHORUS) return 95; // High energy continuation\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.VERSE) return 90; // Same energy (neutral)\n if (fromType === SEGMENT_TYPES.VERSE && toType === SEGMENT_TYPES.CHORUS) return 70; // Energy build (bad for mix-out)\n }\n \n // Fallback to base segment type score\n return scoreSegmentType(mode === 'mix-in' ? toType : fromType);\n}\n\n/**\n * Enhanced version of findOptimalStartIndex that can optimize for mix-in or mix-out\n */\nfunction findOptimalStartOrEndIndex(\n segments: SegmentInfo,\n beats: { timestamp: number }[],\n availableRange: { start: number; end: number },\n trackDuration: number,\n mode: 'mix-in' | 'mix-out' = 'mix-in',\n selectionMode: 'quick' | 'large' = 'quick'\n): number {\n \n if (!segments || segments.length === 0) {\n // No segments available - pick middle of available range\n return Math.floor((availableRange.start + availableRange.end) / 2);\n }\n \n // Convert segments to usable format\n const segmentData = segments.map(([startTime, endTime, type]) => ({\n startTime,\n endTime,\n type,\n duration: endTime - startTime\n }));\n \n // Enhanced scoring that considers mix-in vs mix-out context\n const scoreSegmentForContext = (segment: any): number => {\n // Start with existing segment type scoring\n let score = scoreSegmentType(segment.type);\n \n // Add context-specific bonuses with mode diversity\n if (mode === 'mix-in') {\n // Mode-specific preferences for diversity\n if (selectionMode === 'quick') {\n // Quick mode: Prioritize VERSEβCHORUS transitions (main energy moments)\n switch (segment.type) {\n case SEGMENT_TYPES.VERSE:\n score += 25; // Strong preference for verse starts in quick mode\n break;\n case SEGMENT_TYPES.BREAK:\n score += 15; // Good for quick energy changes\n break;\n case SEGMENT_TYPES.INTRO:\n score += 5; // Less preferred for quick mode\n break;\n case SEGMENT_TYPES.CHORUS:\n score -= 10; // Avoid chorus starts for quick mode variety\n break;\n }\n } else {\n // Large mode: Prioritize INTROβVERSE or smoother transitions\n switch (segment.type) {\n case SEGMENT_TYPES.INTRO:\n score += 25; // Strong preference for intro starts in large mode\n break;\n case SEGMENT_TYPES.BRIDGE:\n score += 20; // Good for smooth, longer transitions\n break;\n case SEGMENT_TYPES.VERSE:\n score -= 5; // Slightly less preferred to create diversity from quick mode\n break;\n case SEGMENT_TYPES.BREAK:\n score += 10; // Decent for large mode\n break;\n }\n }\n } else {\n // Mix-out bonuses (same for both modes)\n switch (segment.type) {\n case SEGMENT_TYPES.OUTRO:\n case SEGMENT_TYPES.CHORUS:\n case SEGMENT_TYPES.BREAK:\n score += 20; // Good for ending\n break;\n case SEGMENT_TYPES.BRIDGE:\n score += 15; // Decent transition point\n break;\n }\n }\n \n // Add randomness for variety\n // score += Math.random() * 15;\n \n return score;\n };\n \n // Score segments that fall within our available range\n const candidateSegments = segmentData\n .map(segment => ({\n ...segment,\n beatIndex: findClosestBeatIndex(segment.startTime, beats),\n score: scoreSegmentForContext(segment)\n }))\n .filter(segment => \n segment.beatIndex >= availableRange.start && \n segment.beatIndex <= availableRange.end\n );\n \n if (candidateSegments.length === 0) {\n // No segments in range - pick middle of available range\n return Math.floor((availableRange.start + availableRange.end) / 2);\n }\n \n // Add position bonus (modified from existing logic)\n const scoredCandidates = candidateSegments.map(segment => {\n const segmentMiddle = segment.startTime + (segment.duration / 2);\n const distanceFromTrackMiddle = Math.abs(segmentMiddle - (trackDuration / 2)) / (trackDuration / 2);\n \n let positionBonus;\n if (mode === 'mix-in') {\n // Prefer earlier-to-middle sections for mix-in (existing logic)\n positionBonus = (1 - distanceFromTrackMiddle) * 30;\n } else {\n // Prefer middle-to-later sections for mix-out\n const relativePosition = segmentMiddle / trackDuration;\n if (relativePosition >= 0.4 && relativePosition <= 0.8) {\n positionBonus = 30; // Sweet spot for mix-out\n } else if (relativePosition >= 0.3 && relativePosition <= 0.9) {\n positionBonus = 15; // Still good\n } else {\n positionBonus = 0;\n }\n }\n \n return {\n ...segment,\n finalScore: segment.score + positionBonus\n };\n });\n \n // Sort by score and pick the best\n scoredCandidates.sort((a, b) => b.finalScore - a.finalScore);\n const bestSegment = scoredCandidates[0];\n \n const segmentTypeNames = {\n 0: 'START', 1: 'END', 2: 'INTRO', 3: 'OUTRO', 4: 'BREAK', \n 5: 'BRIDGE', 6: 'INST', 7: 'SOLO', 8: 'VERSE', 9: 'CHORUS'\n };\n \n // Snap to nearest segment boundary for better mixing\n const snapToBoundary = (beatIndex: number, segments: SegmentInfo): number => {\n if (!segments || segments.length === 0) return beatIndex;\n \n const beatTime = beats[beatIndex]?.timestamp || 0;\n let closestBoundaryIndex = beatIndex;\n let minDistance = Number.MAX_VALUE;\n \n // Check all segment start and end times\n segments.forEach(([startTime, endTime]) => {\n const startIndex = findClosestBeatIndex(startTime, beats);\n const endIndex = findClosestBeatIndex(endTime, beats);\n \n const startDistance = Math.abs(startIndex - beatIndex);\n const endDistance = Math.abs(endIndex - beatIndex);\n \n if (startDistance < minDistance && startDistance <= 2) { // Within 2 beats\n minDistance = startDistance;\n closestBoundaryIndex = startIndex;\n }\n if (endDistance < minDistance && endDistance <= 2) { // Within 2 beats\n minDistance = endDistance;\n closestBoundaryIndex = endIndex;\n }\n });\n \n return closestBoundaryIndex;\n };\n \n return snapToBoundary(bestSegment.beatIndex, segments);\n}\n\n/**\n * Find optimal start index within the available range using segment scoring (original function)\n */\nfunction findOptimalStartIndex(\n segments: SegmentInfo,\n beats: { timestamp: number }[],\n availableRange: { start: number; end: number },\n trackDuration: number\n): number {\n return findOptimalStartOrEndIndex(segments, beats, availableRange, trackDuration, 'mix-in');\n}\n\n/**\n * Find DJ segment span using existing scoring but with mix-in/mix-out logic\n */\nfunction findDJSegmentSpanWithExistingScoring(\n segments: SegmentInfo,\n beats: { timestamp: number }[],\n availableRange: { start: number; end: number },\n trackDuration: number,\n quickSegmentSizes: { min: number; max: number } = { min: 8, max: 24 },\n quickModePoints?: { start: number; end: number }\n): { start: number; end: number } {\n \n // Check song repetitiveness - count unique segment types (silent analysis)\n \n // Find optimal start point, avoiding Quick mode start if possible\n let startBeat = findOptimalStartOrEndIndex(segments, beats, availableRange, trackDuration, 'mix-in', 'large');\n \n // If we picked the same start as Quick mode, try to find an alternative (silent)\n if (quickModePoints && Math.abs(startBeat - quickModePoints.start) <= 2) {\n // Create a modified range that avoids the Quick mode start area\n const avoidRange = {\n start: Math.max(availableRange.start, quickModePoints.start - 8),\n end: Math.min(availableRange.end, quickModePoints.start + 8)\n };\n \n // Try earlier in the track first\n const earlierRange = {\n start: availableRange.start,\n end: Math.min(avoidRange.start - 1, availableRange.end)\n };\n \n if (earlierRange.end > earlierRange.start) {\n startBeat = findOptimalStartOrEndIndex(segments, beats, earlierRange, trackDuration, 'mix-in', 'large');\n } else {\n // Try later in the track\n const laterRange = {\n start: Math.max(avoidRange.end + 1, availableRange.start),\n end: availableRange.end\n };\n \n if (laterRange.end > laterRange.start) {\n startBeat = findOptimalStartOrEndIndex(segments, beats, laterRange, trackDuration, 'mix-in', 'large');\n }\n }\n }\n \n // DJ mode: ensure it's meaningfully larger than quick mode (at least +12 bars for more variety)\n const quickMaxSize = quickSegmentSizes.max; // Max quick size (24)\n const minSpan = Math.max(24, quickMaxSize + 4); // At least 24 bars minimum, 4+ bigger than quick max (20)\n \n // For long tracks, allow much larger segments - up to 60 bars or 30% of track length\n const trackLengthBasedMax = Math.floor(beats.length * 0.3); // 30% of track\n const maxSpan = Math.min(Math.max(40, trackLengthBasedMax), beats.length - availableRange.start - 4);\n \n // Silent span calculation\n \n // Create range for end point selection - allow searching much further for optimal boundaries\n const endRange = {\n start: Math.max(startBeat + minSpan, availableRange.start),\n end: Math.min(beats.length - 4, Math.max(startBeat + maxSpan, availableRange.end)) // Search as far as possible for best boundaries\n };\n \n // Find optimal end boundary, avoiding Quick mode end if possible\n let endBoundary = findOptimalStartOrEndIndex(segments, beats, endRange, trackDuration, 'mix-out', 'large');\n \n // If we picked the same end as Quick mode, try to find an alternative (silent)\n if (quickModePoints && Math.abs(endBoundary - quickModePoints.end - 1) <= 2) {\n // Try a different end point within our range\n const alternativeEndRange = {\n start: endRange.start,\n end: Math.min(endRange.end, endBoundary - 4) // Try earlier end points\n };\n \n if (alternativeEndRange.end > alternativeEndRange.start) {\n endBoundary = findOptimalStartOrEndIndex(segments, beats, alternativeEndRange, trackDuration, 'mix-out', 'large');\n } else {\n // Try later end points\n const laterEndRange = {\n start: Math.max(endRange.start, endBoundary + 4),\n end: endRange.end\n };\n \n if (laterEndRange.end > laterEndRange.start) {\n endBoundary = findOptimalStartOrEndIndex(segments, beats, laterEndRange, trackDuration, 'mix-out', 'large');\n }\n }\n }\n \n // Use boundary-1 for correct bar count, ensure minimum span\n let actualEnd = Math.max(endBoundary - 1, startBeat + minSpan - 1);\n \n // Silent calculation complete\n \n return { start: startBeat, end: actualEnd };\n}\n\n/**\n * Main function to find playback points - enhanced version\n */\nexport function findPlaybackPoints(\n segmentInfo: SegmentInfo,\n _beats: { timestamp: number }[],\n trackId?: string,\n transitionOffset: number = DEFAULT_TRANSITION_OFFSET\n): PlaybackPoints {\n \n // The beats provided is the smoothen beats based on BE returns, which the last downbeat [1] \n // marked begining of the sample and it will always be incomplete bar\n // so we have to remove it\n let beats;\n \n // avoid modifiy the original array:\n const beats_aka_bar_start_position = [..._beats];\n if (beats_aka_bar_start_position.length - 2 > 0){\n beats_aka_bar_start_position.splice(-1); // remove last item\n beats = beats_aka_bar_start_position;\n } else {\n beats = beats_aka_bar_start_position;\n }\n \n const totalBars = beats.length;\n const trackDuration = beats.length > 0 ? beats[beats.length - 1].timestamp - beats[0].timestamp : 0;\n \n // Calculate recommended transition length for this track\n const recommendedTransitionLength = calculateRecommendedTransitionLength(totalBars);\n \n // Helper to compute effective transition length with fallback list\n // Ensures the offset leaves enough room for the minimum segment size\n const computeEffectiveOffset = (preferred: number[], minSegmentSize: number): number => {\n // Calculate maximum offset that leaves room for minimum segment\n // Formula: totalBars >= minSegmentSize + 2*offset\n const maxAllowedOffset = Math.floor((totalBars - minSegmentSize) / 2);\n \n // Try preferred offsets in order, pick first that fits\n for (const off of preferred) {\n if (off <= maxAllowedOffset) return off;\n }\n \n // No preferred offset fits - use maximum possible, but at least 2 bars\n return Math.max(2, maxAllowedOffset);\n };\n\n // Enhanced buildWindowWithOffset that supports DJ mode\n const buildWindowWithOffset = (size: number, preferredOffsets: number[], isDJMode: boolean = false, quickModePoints?: { start: number; end: number }): { window: PlaybackWindow; offset: number } => {\n // For very small tracks, we may need to use a smaller effective segment size\n let effectiveSize = size;\n \n // DJ mode on small tracks: maximize segment length by using minimal transitions\n if (isDJMode && totalBars < 32) {\n // Use as much of the track as possible, leaving room for minimal transitions\n const minTransition = 2;\n const maxDJSize = totalBars - (2 * minTransition); // Reserve 2 bars on each side\n effectiveSize = Math.max(8, maxDJSize);\n _SSSE_log(`[SEGMENT-ENHANCED] ${trackId} DJ mode on small track (${totalBars}bars) - maximizing to ${effectiveSize} bars`);\n } else {\n // Check if we can fit the requested size with reasonable transitions\n const maxPossibleSize = totalBars - 4; // Reserve at least 2 bars on each side\n if (size > maxPossibleSize && maxPossibleSize >= 8) {\n effectiveSize = maxPossibleSize;\n _SSSE_log(`[SEGMENT-ENHANCED] ${trackId} Small track (${totalBars}bars) - reducing Quick mode size from ${size} to ${effectiveSize} bars`);\n } else if (size > maxPossibleSize && maxPossibleSize < 8) {\n // Very small track - use what we have, minimum 4 bars\n effectiveSize = Math.max(4, maxPossibleSize);\n _SSSE_log(`[SEGMENT-ENHANCED] ${trackId} Very small track (${totalBars}bars) - using ${effectiveSize} bars for Quick mode`);\n }\n }\n \n const offset = computeEffectiveOffset(preferredOffsets, effectiveSize);\n const range = calculateAvailableRange(totalBars, effectiveSize, offset);\n \n let start: number, end: number;\n \n if (isDJMode && range.isValid) {\n // Use DJ segment span logic for large mode - ensure it's bigger than medium\n const djSpan = findDJSegmentSpanWithExistingScoring(segmentInfo, beats, range, trackDuration, SEGMENT_SIZES.quick, quickModePoints);\n start = djSpan.start;\n end = djSpan.end;\n \n // Clamp DJ mode indices to valid beat array bounds\n const maxValidIndex = beats.length - 1;\n start = Math.max(0, Math.min(start, maxValidIndex));\n end = Math.max(0, Math.min(end, maxValidIndex));\n } else {\n // Quick mode: find optimal boundaries within the 8-24 bar range\n const startIdx = range.isValid ? findOptimalStartOrEndIndex(segmentInfo, beats, range, trackDuration, 'mix-in', 'quick') : Math.max(offset, 0);\n start = startIdx;\n \n // Find optimal end boundary within the quick mode range (8-24 bars)\n const minQuickSize = SEGMENT_SIZES.quick.min;\n const maxQuickSize = SEGMENT_SIZES.quick.max;\n \n // Expand search range to find better boundaries\n const endRange = {\n start: Math.max(start + minQuickSize, range.start), \n end: Math.min(start + maxQuickSize + 8, range.end, totalBars - 1) // Allow searching 8 bars beyond for better boundaries\n };\n \n const endBoundary = findOptimalStartOrEndIndex(segmentInfo, beats, endRange, trackDuration, 'mix-out', 'quick');\n end = endBoundary - 1; // Subtract 1 so we get correct bar count\n \n // BOUNDARY-FIRST: Always prioritize boundaries over exact lengths\n let finalLength = end - start + 1;\n \n // If we're outside the acceptable range, try to find better boundary within range\n if (finalLength < minQuickSize || finalLength > maxQuickSize) {\n // Try to find the best boundary within acceptable range\n const acceptableEndRange = {\n start: Math.max(start + minQuickSize - 1, range.start), \n end: Math.min(start + maxQuickSize + 1, range.end, totalBars - 1)\n };\n \n const betterEndBoundary = findOptimalStartOrEndIndex(segmentInfo, beats, acceptableEndRange, trackDuration, 'mix-out', 'quick');\n const betterEnd = betterEndBoundary - 1;\n const betterLength = betterEnd - start + 1;\n \n // Use better boundary if it's within acceptable range\n if (betterLength >= minQuickSize && betterLength <= maxQuickSize) {\n end = betterEnd;\n finalLength = betterLength;\n } else if (finalLength < minQuickSize) {\n // No good boundary found - force minimum length\n end = Math.min(start + minQuickSize - 1, totalBars - 1);\n finalLength = end - start + 1;\n } else if (finalLength > maxQuickSize) {\n // Too long - look for ANY boundary between start+minQuickSize and start+maxQuickSize\n const boundaries: number[] = [];\n if (segmentInfo && segmentInfo.length > 0) {\n segmentInfo.forEach(([startTime, endTime]) => {\n const segStart = beats.findIndex(b => Math.abs(b.timestamp - startTime) < 0.1);\n const segEnd = beats.findIndex(b => Math.abs(b.timestamp - endTime) < 0.1);\n\n if (segStart !== -1 && segStart >= start + minQuickSize && segStart <= start + maxQuickSize) {\n boundaries.push(segStart);\n }\n if (segEnd !== -1 && segEnd >= start + minQuickSize && segEnd <= start + maxQuickSize) {\n boundaries.push(segEnd);\n }\n });\n }\n \n if (boundaries.length > 0) {\n\n boundaries.sort((a, b) => a - b);\n \n end = boundaries[0] - 1;\n finalLength = end - start + 1;\n \n\n if (finalLength > maxQuickSize) {\n end = start + maxQuickSize - 1;\n finalLength = maxQuickSize;\n }\n } else {\n // No boundaries found - enforce maximum length at non-boundary\n end = start + maxQuickSize - 1;\n finalLength = maxQuickSize;\n }\n }\n }\n \n // Final clamps - ensure we never exceed beat array bounds\n const maxValidIndex = beats.length - 1;\n if (end >= beats.length || end >= totalBars) {\n end = Math.min(totalBars - 1, maxValidIndex);\n start = Math.max(offset, end - (maxQuickSize - 1));\n }\n if (start < offset) {\n start = offset;\n end = Math.min(totalBars - 1, maxValidIndex, start + maxQuickSize - 1);\n }\n \n // Final safety check - use helper to ensure valid segment\n const clamped = clampSegmentIndices(start, end, maxValidIndex, 8);\n start = clamped.start;\n end = clamped.end;\n \n // Silent Quick mode calculation complete\n }\n \n const startTime = beats[start]?.timestamp || 0;\n const endTime = beats[end]?.timestamp || beats[beats.length - 1]?.timestamp || 0;\n const window: PlaybackWindow = {\n startIndex: 0,\n startTime,\n endIndex: 0,\n endTime,\n duration: endTime - startTime,\n durationBars: (end - start + 1),\n startBeatIndex: start,\n endBeatIndex: end\n };\n return { window, offset };\n };\n\n // Adjust preferences for small tracks - use smaller transitions when needed\n const quickPref = totalBars < 32 ? [4, 2] : [8, 4];\n const largePref = totalBars < 32 ? [2] : [12, 8, 4, 2]; // DJ mode uses minimal transitions on small tracks\n \n if (totalBars < 32) {\n _SSSE_log(`[SEGMENT-ENHANCED] ${trackId} Small track detected (${totalBars}bars) - using reduced transition preferences: Quick=[4,2], DJ=[2]`);\n }\n\n // Build windows - DJ mode enabled for large segments\n const { window: winQuick, offset: transitionLengthQuick } = buildWindowWithOffset(SEGMENT_SIZES.quick.min, quickPref, false);\n \n // Pass Quick mode points to Large mode to encourage variety\n const quickModePoints = { start: winQuick.startBeatIndex, end: winQuick.endBeatIndex };\n const { window: winLarge, offset: transitionLengthLarge } = buildWindowWithOffset(SEGMENT_SIZES.large, largePref, true, quickModePoints); // DJ mode!\n\n // Fallback equalization - ensure Quick mode has at least 16 bars when DJ mode is viable\n const quickBarCount = winQuick.endBeatIndex - winQuick.startBeatIndex + 1;\n const djBarCount = winLarge.endBeatIndex - winLarge.startBeatIndex + 1;\n \n if (quickBarCount < SEGMENT_SIZES.quick.min && djBarCount >= SEGMENT_SIZES.quick.min) {\n const segmentCount = segmentInfo?.length || 0;\n _SSSE_log(`[SEGMENT-ENHANCED] ${trackId} Quick compromised (${quickBarCount}bars < ${SEGMENT_SIZES.quick.min}) | Track: ${totalBars}bars, ${segmentCount} segments | Using DJ indices for consistency`);\n // Use DJ mode's start, but cap length at Quick max (24 bars) and beat array bounds\n const maxValidIndex = beats.length - 1;\n const proposedStart = winLarge.startBeatIndex;\n const proposedEnd = Math.min(winLarge.startBeatIndex + SEGMENT_SIZES.quick.max - 1, winLarge.endBeatIndex);\n \n // Use helper to ensure valid segment\n const clamped = clampSegmentIndices(proposedStart, proposedEnd, maxValidIndex, SEGMENT_SIZES.quick.min);\n winQuick.startBeatIndex = clamped.start;\n winQuick.endBeatIndex = clamped.end;\n winQuick.startTime = beats[winQuick.startBeatIndex]?.timestamp || 0;\n winQuick.endTime = beats[winQuick.endBeatIndex]?.timestamp || 0;\n winQuick.duration = winQuick.endTime - winQuick.startTime;\n winQuick.durationBars = winQuick.endBeatIndex - winQuick.startBeatIndex + 1;\n }\n\n // Normal window spans the full playable track (for indices.normal): 0 .. beats.length - 2\n // On Normal Mode, last beat should be exlcuded since it only marked the starting of last bar but it won't be a complete bar with four beats\n const normalStart = 0;\n const normalEnd = Math.max(0, beats.length - 2);\n const normalStartTime = beats[normalStart]?.timestamp || 0;\n const normalEndTime = beats[normalEnd]?.timestamp || beats[beats.length - 1]?.timestamp || 0;\n\n // FIXED: Ensure ALL boundaries are detected\n // CRITICAL: Validate all boundaries before returning\n // Maximum valid beat index is beats.length - 1 (0-indexed array)\n const maxBeatIndex = beats.length - 1;\n \n // Clamp Quick mode indices\n if (winQuick.startBeatIndex < 0 || winQuick.endBeatIndex > maxBeatIndex) {\n console.error(`π¨ [SEGMENT-ENHANCED] ${trackId} Quick mode out of bounds BEFORE fix! start:${winQuick.startBeatIndex}, end:${winQuick.endBeatIndex}, maxIndex:${maxBeatIndex}, beatsLength:${beats.length}, totalBars:${totalBars}`);\n const originalStart = winQuick.startBeatIndex;\n const originalEnd = winQuick.endBeatIndex;\n \n // Use helper to ensure valid segment (prevents inverted indices)\n const clamped = clampSegmentIndices(winQuick.startBeatIndex, winQuick.endBeatIndex, maxBeatIndex, SEGMENT_SIZES.quick.min);\n winQuick.startBeatIndex = clamped.start;\n winQuick.endBeatIndex = clamped.end;\n winQuick.startTime = beats[winQuick.startBeatIndex]?.timestamp || 0;\n winQuick.endTime = beats[winQuick.endBeatIndex]?.timestamp || 0;\n winQuick.duration = winQuick.endTime - winQuick.startTime;\n winQuick.durationBars = winQuick.endBeatIndex - winQuick.startBeatIndex + 1;\n _SSSE_log(` β
Quick mode corrected from ${originalStart}β${originalEnd} to ${winQuick.startBeatIndex}β${winQuick.endBeatIndex} (${winQuick.durationBars}bars)`);\n }\n \n // Clamp DJ mode indices\n if (winLarge.startBeatIndex < 0 || winLarge.endBeatIndex > maxBeatIndex) {\n console.error(`π¨ [SEGMENT-ENHANCED] ${trackId} DJ mode out of bounds BEFORE fix! start:${winLarge.startBeatIndex}, end:${winLarge.endBeatIndex}, maxIndex:${maxBeatIndex}, beatsLength:${beats.length}, totalBars:${totalBars}`);\n const originalStart = winLarge.startBeatIndex;\n const originalEnd = winLarge.endBeatIndex;\n \n // Use helper to ensure valid segment (prevents inverted indices)\n const clamped = clampSegmentIndices(winLarge.startBeatIndex, winLarge.endBeatIndex, maxBeatIndex, Math.min(SEGMENT_SIZES.large, maxBeatIndex));\n winLarge.startBeatIndex = clamped.start;\n winLarge.endBeatIndex = clamped.end;\n winLarge.startTime = beats[winLarge.startBeatIndex]?.timestamp || 0;\n winLarge.endTime = beats[winLarge.endBeatIndex]?.timestamp || 0;\n winLarge.duration = winLarge.endTime - winLarge.startTime;\n winLarge.durationBars = winLarge.endBeatIndex - winLarge.startBeatIndex + 1;\n _SSSE_log(` β
DJ mode corrected from ${originalStart}β${originalEnd} to ${winLarge.startBeatIndex}β${winLarge.endBeatIndex} (${winLarge.durationBars}bars)`);\n }\n \n // Log final results\n const quickBars = winQuick.endBeatIndex - winQuick.startBeatIndex + 1;\n const largeBars = winLarge.endBeatIndex - winLarge.startBeatIndex + 1;\n _SSSE_log(`[SEGMENT-ENHANCED] ${trackId} Quick: ${quickBars}bars [${winQuick.startBeatIndex}β${winQuick.endBeatIndex}] | DJ: ${largeBars}bars [${winLarge.startBeatIndex}β${winLarge.endBeatIndex}]`);\n\n // Note both index number will be included, e.g. start = 0, end = 7, which means 0,1,2,3,4,5,6,7 bars will be played\n return {\n normal: {\n startIndex: 0,\n startTime: normalStartTime,\n endIndex: 0,\n endTime: normalEndTime,\n duration: normalEndTime - normalStartTime,\n durationBars: (normalEnd - normalStart + 1),\n startBeatIndex: normalStart,\n endBeatIndex: normalEnd,\n beatIndex: winQuick.startBeatIndex,\n transitionLength: transitionLengthQuick\n },\n infiniteQuick: { ...winQuick, transitionLength: transitionLengthQuick },\n infiniteLarge: { ...winLarge, transitionLength: transitionLengthLarge }\n };\n}\n","/**\n * Math utility functions for beat grid analysis and smoothing\n */\n\n/**\n * Calculates the median value of an array of numbers\n */\nexport function median(values: number[]): number {\n if (!values.length) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const middle = Math.floor(sorted.length / 2);\n \n if (sorted.length % 2 === 0) {\n return (sorted[middle - 1] + sorted[middle]) / 2;\n }\n return sorted[middle];\n}\n\n/**\n * Calculates intervals between consecutive numbers in an array\n */\nexport function calculateIntervals(values: number[]): number[] {\n if (values.length < 2) return [];\n return values.slice(1).map((n, i) => n - values[i]);\n}\n\n/**\n * Calculates the standard deviation of an array of numbers\n */\nexport function calculateStandardDeviation(values: number[]): number {\n if (values.length < 2) return 0;\n \n const avg = mean(values);\n const squareDiffs = values.map(value => Math.pow(value - avg, 2));\n return Math.sqrt(mean(squareDiffs));\n}\n\n/**\n * Calculates the mean (average) of an array of numbers\n */\nexport function mean(values: number[]): number {\n if (!values.length) return 0;\n return values.reduce((sum, val) => sum + val, 0) / values.length;\n}\n\n/**\n * Calculates the mode (most frequent value) of an array of numbers\n * For continuous values, rounds to 4 decimal places for comparison\n */\nexport function mode(numbers: number[]): number {\n if (!numbers.length) return 0;\n \n const rounded = numbers.map(n => Math.round(n * 10000) / 10000);\n const counts = new Map<number, number>();\n let maxCount = 0;\n let modeValue = rounded[0];\n \n for (const num of rounded) {\n const count = (counts.get(num) || 0) + 1;\n counts.set(num, count);\n if (count > maxCount) {\n maxCount = count;\n modeValue = num;\n }\n }\n \n return modeValue;\n}\n\n/**\n * Linear interpolation between two values\n */\nexport function lerp(start: number, end: number, t: number): number {\n return start + (end - start) * t;\n}\n\n/**\n * Clamps a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n} ","/**\n * Basic Beat Grid Smoothing\n * \n * A simple ratio-based smoothing algorithm that:\n * - Uses median intervals to identify irregularities\n * - Splits large intervals (>1.6x median)\n * - Merges small intervals (<0.625x median)\n * - Does NOT use precision techniques like RANSAC\n */\n\nimport { median } from '@/utils/mathUtils';\n\nexport function basicSmoothing(\n beats: number[], \n maxRatio: number = 1.6, \n verbose: boolean = false\n): number[] {\n if (beats.length < 3) {\n return [...beats];\n }\n \n // Create a working copy\n const result: number[] = [...beats];\n let modified = true;\n let iteration = 0;\n const maxIterations = 5;\n \n // Set thresholds\n const minRatio = 1.0 / maxRatio; // Exact reciprocal\n \n \n \n // Continue until no more changes are needed or max iterations reached\n while (modified && iteration < maxIterations) {\n iteration++;\n modified = false;\n \n // Recalculate intervals\n if (result.length < 2) {\n break;\n }\n \n // Calculate intervals and their ratios compared to median\n const intervals: number[] = [];\n for (let i = 1; i < result.length; i++) {\n intervals.push(result[i] - result[i-1]);\n }\n \n const medianInterval = median(intervals);\n const ratios = intervals.map(interval => interval / medianInterval);\n \n \n \n // Process large intervals first (> maxRatio)\n const largeIntervals: number[] = [];\n ratios.forEach((ratio, i) => {\n if (ratio > maxRatio) {\n largeIntervals.push(i);\n }\n });\n \n if (largeIntervals.length > 0) {\n \n // Sort in reverse to avoid index shifting issues\n largeIntervals.sort((a, b) => b - a);\n \n for (const idx of largeIntervals) {\n const startBeat = result[idx];\n const endBeat = result[idx + 1];\n const interval = endBeat - startBeat;\n \n // Add a beat exactly in the middle\n const middleBeat = startBeat + (interval / 2);\n result.splice(idx + 1, 0, middleBeat);\n modified = true;\n }\n }\n \n if (modified) {\n continue;\n }\n \n // Process small intervals (< minRatio)\n const newIntervals: number[] = [];\n for (let i = 1; i < result.length; i++) {\n newIntervals.push(result[i] - result[i-1]);\n }\n \n const newMedianInterval = median(newIntervals);\n const newRatios = newIntervals.map(interval => interval / newMedianInterval);\n \n const smallIntervals: number[] = [];\n newRatios.forEach((ratio, i) => {\n if (ratio < minRatio) {\n smallIntervals.push(i);\n }\n });\n \n if (smallIntervals.length > 0) {\n // Sort in reverse to avoid index shifting issues\n smallIntervals.sort((a, b) => b - a);\n \n // Process each small interval\n for (const idx of smallIntervals) {\n if (idx + 2 < result.length) {\n // Check if removing would create a too-large interval\n const current = result[idx];\n const nextBeat = result[idx + 1];\n const nextNext = result[idx + 2];\n \n const newInterval = nextNext - current;\n const newRatio = newInterval / newMedianInterval;\n \n if (newRatio <= maxRatio) {\n // Safe to remove the next beat\n result.splice(idx + 1, 1);\n modified = true;\n }\n }\n }\n }\n }\n \n // Final verification\n if (result.length > 1) {\n const finalIntervals: number[] = [];\n for (let i = 1; i < result.length; i++) {\n finalIntervals.push(result[i] - result[i-1]);\n }\n \n const finalMedian = median(finalIntervals);\n const finalRatios = finalIntervals.map(interval => interval / finalMedian);\n \n \n }\n \n return result;\n} \n\n// Convert smoothed timestamps (seconds) to standard beat grid with frames\nexport function convertToStandardBeatGrid(\n smoothedBeats: number[],\n sampleRate: number = 48000\n): { frame: number; number: number; timestamp: number }[] {\n return smoothedBeats.map((ts) => ({\n frame: Math.round(ts * sampleRate),\n number: 1,\n timestamp: ts,\n }));\n}","// Resolve Keys and Tonality\n\nimport { IMusicKey, IMusicTonality } from \"@/stem-audio-engine-v3/interface\";\nimport { composeBarsFromBeats } from \"@/stem-audio-engine-v3/utils/bars\";\nconst SAMPLE_RATE = 48000;\n\nconst ENABLE_DEBUG_FOR_BEAT_SMOOTHING = false;\nimport { findPlaybackPoints } from \"@/utils/segmentSelectionSimplifiedEnhanced\";\nimport { ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR } from \"./engine_dev_flags\";\nimport { basicSmoothing } from \"@/utils/basicSmoothing\";\nimport { replaceMp4ForLocalUse } from \"@/stem-audio-engine-v3/utils/mp4-local-utils\";\n\n// Add at top with other constants\n// const BEAT_VERSION_FALLBACKS = [3, 2, 1];\n\n// NOTE no slash at last character of VITE_KB_STEMIFY_API_URL\nconst TRACK_CREATOR_ENDPOINT = `${import.meta.env?.VITE_KB_STEMIFY_API_URL || 'https://api.stemplayer.com'}/track-creator`;\n\nexport const calculateTempoOrigSzFromBeatDownBeat = (downbeatsToUse: number[]): number => {\n const diffs = [...downbeatsToUse]\n .slice(1)\n .map((v, i) => v - downbeatsToUse[i]);\n const sorted = [...diffs].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n const median = sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];\n return Math.round(median * 48000);\n}\n\n// link to fetch the features\n// https://api.staging.stemplayer.com/track-creator/tracks?id=029bf607-2b76-4f6d-949d-861e784298dd&include_features=true\n\nexport const BEAT_ENDPOINT_ERROR_NOT_ENOUGH_BEATS = `Do not have enough beats`;\nexport const BEAT_ENDPOINT_ERROR_EMPTY_DATA_FROM_RESPONSE = 'No data returned';\nexport const BEAT_ENDPOINT_ERROR_MISSING_IMPORTANT_MUSICAL_DATA = 'Missing musical data';\nexport const BEAT_ENDPOINT_ERROR_EMPTY_ARRAY_IN_BAR_TIMESTAMPS = 'Empty timestamps (bars)';\nexport const BEAT_ENDPOINT_ERROR_EMPTY_ARRAY_IN_BAR_TIMESTAMPS_AFTER_FILTERING = 'Empty timestamps (bars, after filtering)';\n \ntype BeatsFromBackend = {\n data: {\n barTimestamps: number[]; // ts equal to 1\n bpm: number;\n key: IMusicKey;\n tonality: IMusicTonality;\n segmentInfo: [number, number, number][];\n beatSource: number;\n };\n}\n\ntype BeatsResolved = {\n data: {\n [key: string]: {\n barTimestamps: number[]; // ts equal to 1\n bpm: number;\n key: IMusicKey;\n tonality: IMusicTonality;\n beats: {\n frame: number,\n number: number,\n timestamp: number,\n }[];\n indices: SegmentDetails,\n segmentInfo: [number, number, number][];\n beatSource: number;\n };\n };\n}\n\nconst _FF_log: typeof console.log = (...data) => {\n return;\n console.log(...data);\n}\n\n// this function only be used in Prototype page and resolve next mix\n// it will suppress the error when resolveSingleBeatsAndKeysWithBeatsLink throw error \nexport async function resolveMultipleBeatsAndKeysWithBeatsLink(ids: {id: string, url: string}[], token: string = '', smoothBeats: boolean = false, beatVersion: number | null = null): Promise<BeatsResolved> {\n const promises = ids.map((track: {id: string, url: string})=>{\n return resolveSingleBeatsAndKeysWithBeatsLink(track.id, token, smoothBeats, beatVersion,\n track.url)\n .catch(error => {\n console.warn(`Failed to fetch beats for track ${track.id}:`, error);\n // only used in prototype page and resolve next mix\n // this ensure the coming procedure below is happy with the error\n const processedResults: BeatsResolved = { data: {} };\n return processedResults;\n });\n });\n\n try {\n const results = await Promise.all(promises);\n const processedResults: BeatsResolved = { data: {} };\n \n // Filter out null results and empty data objects\n results.forEach((item) => {\n if (item && item.data) {\n const trackIds = Object.keys(item.data);\n trackIds.forEach((trackId) => {\n const trackData = item.data[trackId];\n // Only include tracks that have all required fields and data\n if (trackData && \n trackData.barTimestamps && \n trackData.barTimestamps.length > 0 &&\n trackData.bpm && \n trackData.key && \n trackData.tonality && \n trackData.beats) {\n processedResults.data[trackId] = trackData;\n } else {\n _FF_log(`[Debug] Excluded track ${trackId} from final results due to missing data`);\n }\n });\n }\n });\n \n // const includedTracks = Object.keys(processedResults.data);\n \n // _FF_log(`[Debug] Final results summary:`, {\n // totalTracksRequested: ids.length,\n // tracksIncluded: includedTracks.length,\n // includedTrackIds: includedTracks,\n // beatVersion: beatVersion !== null ? beatVersion : 'default'\n // });\n \n return processedResults;\n } catch (err) {\n console.error('Error processing multiple beats:', err);\n return { data: {} };\n }\n}\n\nexport async function resolveSingleBeatsAndKeysWithBeatsLink(trackId: string, token: string = '', smoothBeats: boolean = false, beatVersion: number | null = null, mp4Url: string | null | undefined = undefined): Promise<BeatsResolved> {\n // For prototype only: take the token from localStorage if not provided\n // if (token==='') {\n // token = localStorage.getItem('accessToken');\n // }\n\n smoothBeats = true;\n \n if (beatVersion !== 1 && beatVersion !== 2 && beatVersion !== 3) {\n beatVersion = null;\n }\n\n // console.time(`preload: ${trackId} smoothing beat grid`);\n\n // Construct the URL with optional version parameter\n let url = `${TRACK_CREATOR_ENDPOINT}/tracks/${trackId}/beats`;\n const MIN_BARS = 16;\n if (beatVersion !== null) {\n url += `?v=${beatVersion}&min_bars=${MIN_BARS}`;\n } else {\n url += `?min_bars=${MIN_BARS}`;\n }\n\n \n const options: RequestInit = {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`\n }\n };\n\n try {\n // _FF_log(`[Debug] Fetching beats for track ${trackId} with version ${beatVersion !== null ? beatVersion : 'default'}`);\n // just fire the request for mp4 tail:\n \n try {\n if (mp4Url) {\n // const _mprUrl = replaceMp4ForLocalUse(mp4Url);\n // fetch(_mprUrl, {cache: 'no-cache', headers: {'Authorization': `Bearer ${token}`, Range: `bytes=-20480`, 'Connection': 'keep-alive'},});\n }\n } catch (err) {\n console.error(err);\n }\n\n let response = await fetch(url, options);\n\n // Resilience: a deprecated `?v=N` (e.g. an old beat-grid algorithm\n // that the server has since removed) returns 404 and would\n // otherwise kill the entire downstream flow β including the\n // stem.fm session importer, which needs every track's beats to\n // resolve before clips can land. If we asked for a specific\n // version and the server doesn't have it, retry with no version\n // so we get whatever the server now considers the default. The\n // common cause is a stale `localStorage.stemAudioBeatGridVersion`\n // value from an old dev session.\n if (!response.ok && response.status === 404 && beatVersion !== null) {\n const fallbackUrl = `${TRACK_CREATOR_ENDPOINT}/tracks/${trackId}/beats?min_bars=${MIN_BARS}`;\n console.warn(\n `[fetchFeature] beats v=${beatVersion} returned 404 for ` +\n `track ${trackId}; retrying with server default.`,\n );\n response = await fetch(fallbackUrl, options);\n }\n\n if (!response.ok) {\n switch (response.status) {\n case 490:\n throw new Error(BEAT_ENDPOINT_ERROR_NOT_ENOUGH_BEATS);\n break;\n default:\n throw new Error(`HTTP error! ${response.status}`);\n }\n }\n \n const results: BeatsFromBackend = await response.json();\n // _FF_log(`[Debug] Raw API response for track ${trackId}:`, {\n // hasData: !!results?.data,\n // dataKeys: results?.data ? Object.keys(results.data) : [],\n // barTimestampsLength: results?.data?.barTimestamps?.length,\n // bpm: results?.data?.bpm,\n // key: results?.data?.key,\n // tonality: results?.data?.tonality,\n // segmentInfo: results?.data?.segmentInfo,\n // });\n \n // Try other versions if no barTimestamps\n // if (results?.data?.barTimestamps?.length === 0) {\n // _FF_log(`[Debug] No beats found for version ${beatVersion}, trying fallback versions`);\n // for (const version of BEAT_VERSION_FALLBACKS) {\n // if (version === beatVersion) continue;\n // try {\n // const fallbackUrl = `https://api.staging.stemplayer.com/track-creator/tracks/${trackId}/beats?v=${version}`;\n // const fallbackResponse = await fetch(fallbackUrl, options);\n // if (!fallbackResponse.ok) continue;\n \n // const fallbackResults = await fallbackResponse.json();\n // if (fallbackResults?.data?.barTimestamps?.length > 0) {\n // _FF_log(`[Debug] Found beats with version ${version}`);\n // results.data.barTimestamps = fallbackResults.data.barTimestamps;\n // break;\n // }\n // } catch (error) {\n // console.warn(`[Debug] Failed to fetch beats for version ${version}:`, error);\n // }\n // }\n // }\n \n const processedResults: BeatsResolved = { data: {} };\n \n // Handle case where results or results.data is null/undefined\n if (!results?.data) {\n console.warn(`No data returned for track ${trackId}, skipping`);\n // console.timeEnd(`preload: ${trackId} smoothing beat grid`);\n throw Error(BEAT_ENDPOINT_ERROR_EMPTY_DATA_FROM_RESPONSE);\n return processedResults; // Return empty result for this track\n }\n \n const trackData = results.data;\n \n // Validate required fields and skip if missing\n if (!trackData.bpm || !trackData.key || !trackData.tonality || !trackData.barTimestamps) {\n console.warn(`[Debug] Missing required fields for track ${trackId}, skipping:`, {\n hasBpm: !!trackData.bpm,\n hasKey: !!trackData.key,\n hasTonality: !!trackData.tonality,\n hasBarTimestamps: !!trackData.barTimestamps\n });\n // console.timeEnd(`preload: ${trackId} smoothing beat grid`);\n throw Error(BEAT_ENDPOINT_ERROR_MISSING_IMPORTANT_MUSICAL_DATA);\n return processedResults; // Return empty result for this track\n }\n \n let barTimestamps = trackData.barTimestamps || [];\n if (barTimestamps.length === 0) {\n console.warn(`[Debug] Empty barTimestamps array for track ${trackId}, skipping`);\n // console.timeEnd(`preload: ${trackId} smoothing beat grid`);\n throw Error(BEAT_ENDPOINT_ERROR_EMPTY_ARRAY_IN_BAR_TIMESTAMPS);\n return processedResults;\n }\n \n if (ENABLE_DEBUG_FOR_BEAT_SMOOTHING) _FF_log(`[Debug] Initial barTimestamps for ${trackId}:`, {\n length: barTimestamps.length,\n first: barTimestamps[0],\n last: barTimestamps[barTimestamps.length - 1],\n isValidArray: Array.isArray(barTimestamps),\n allNumbers: barTimestamps.every(ts => typeof ts === 'number'),\n sampleValues: barTimestamps.slice(0, 3)\n });\n \n // Apply smoothing (always basic-only)\n if (smoothBeats && barTimestamps.length > 0) {\n if (ENABLE_DEBUG_FOR_BEAT_SMOOTHING) _FF_log(`[Debug] Starting smoothing for ${trackId} with ${barTimestamps.length} timestamps`);\n \n // Validate timestamps before smoothing\n if (!barTimestamps.every(ts => typeof ts === 'number' && !isNaN(ts))) {\n console.warn(`[Debug] Invalid timestamps detected for track ${trackId}, filtering out invalid values`);\n barTimestamps = barTimestamps.filter(ts => typeof ts === 'number' && !isNaN(ts));\n \n if (barTimestamps.length === 0) {\n console.warn(`[Debug] No valid timestamps remaining for track ${trackId} after filtering, skipping`);\n // console.timeEnd(`preload: ${trackId} smoothing beat grid`);\n throw Error(BEAT_ENDPOINT_ERROR_EMPTY_ARRAY_IN_BAR_TIMESTAMPS_AFTER_FILTERING);\n return processedResults;\n }\n }\n \n const smoothedTimestamps = basicSmoothing(barTimestamps, 1.6, false);\n \n if (smoothedTimestamps && smoothedTimestamps.length > 0) {\n barTimestamps = smoothedTimestamps;\n if (ENABLE_DEBUG_FOR_BEAT_SMOOTHING) _FF_log(`[Debug] Successfully smoothed timestamps for track ${trackId}:`, {\n originalLength: barTimestamps.length,\n smoothedLength: smoothedTimestamps.length\n });\n } else {\n console.warn(`[Debug] Smoothing returned invalid result for ${trackId}, keeping original timestamps`);\n }\n }\n \n // Create the beats array from timestamps\n if (ENABLE_DEBUG_FOR_BEAT_SMOOTHING) _FF_log(`[Debug] Creating beats array for ${trackId} from ${barTimestamps.length} timestamps`);\n \n const beats = barTimestamps.map(ts => ({\n timestamp: ts,\n frame: Math.round(ts * SAMPLE_RATE), /// IF REACHED THIS\n number: 1\n }));\n\n const indices = resolveStartEndIndexOfSegments(beats, trackData.segmentInfo, trackId);\n\n // TODO throw error on incorrect indices\n\n\n\n \n // // VALIDATE TRANSITION LENGTH\n // if (!recommendedTransitionLength || recommendedTransitionLength <= 0 || !Number.isInteger(recommendedTransitionLength)) {\n // const error = `π¨ CRITICAL ERROR: Invalid recommendedTransitionLength for track ${trackId}. Got: ${recommendedTransitionLength}. Cannot store track data without valid transition length!`;\n // console.error(error);\n // throw new Error(error);\n // }\n \n // // VALIDATE INDICES\n // if (typeof startIndex !== 'number' || typeof endIndex !== 'number' || startIndex < 0 || endIndex < 0 || startIndex >= beats.length || endIndex >= beats.length) {\n // const error = `π¨ CRITICAL ERROR: Invalid start/end indices for track ${trackId}. StartIndex: ${startIndex}, EndIndex: ${endIndex}, BeatsLength: ${beats.length}`;\n // console.error(error);\n // throw new Error(error);\n // }\n \n // _FF_log(`β
[FetchFeature] VALIDATED track data for ${trackId}: transition=${recommendedTransitionLength}, indices=[${startIndex}, ${endIndex}]`);\n \n // Store the processed data\n processedResults.data[trackId] = {\n ...trackData,\n barTimestamps,\n beats,\n indices,\n };\n \n return processedResults;\n } catch (error) {\n _FF_log(`[Debug] Error processing track ${trackId}:`, error);\n throw error;\n return { data: {} }; // Return empty result on error\n }\n}\n\n// _FF_log(JSON.stringify(await resolveBeatsAndKeysV1(['026d8b26-c132-4be2-94c9-262486faa902', '0296c6a5-fb2d-4938-87a7-0845ecafd726'])));\n\nexport type SegmentDetails = {\n 'infinite-quick': {\n startingIndex: number,\n endingIndex: number,\n totalBarCountsRecognisedAtAEV3Parser: number,\n barExepctedFromIndicesReturned: number,\n recommendedTransitionLength: number,\n },\n 'infinite-dj': {\n startingIndex: number,\n endingIndex: number,\n totalBarCountsRecognisedAtAEV3Parser: number,\n barExepctedFromIndicesReturned: number,\n recommendedTransitionLength: number,\n },\n normal: {\n startingIndex: number,\n endingIndex: number,\n totalBarCountsRecognisedAtAEV3Parser: number,\n barExepctedFromIndicesReturned: number,\n recommendedTransitionLength: number,\n }\n};\n\nconst resolveStartEndIndexOfSegments = (smoothedBeatGrid: {timestamp: number;frame: number;number: number;}[], segmentsFromBeatsEndpoint: [number, number, number][], trackId: string): SegmentDetails => {\n // bar composing based on the beats from this function,\n // so the range of index must obey this bar count\n const beatsUsingAtV3_DEBUG_ONLY = composeBarsFromBeats(smoothedBeatGrid);\n\n const playbackPoints = findPlaybackPoints( segmentsFromBeatsEndpoint, smoothedBeatGrid, trackId);\n\n // Enhanced Segment Selection Results - Single filterable log\n const totalBars = smoothedBeatGrid.length;\n const segmentCount = segmentsFromBeatsEndpoint?.length || 0;\n // console.log(`[ENHANCED-SELECTION] ${trackId} | Track: ${totalBars}bars, ${segmentCount}seg | Normal: T${playbackPoints.normal.transitionLength} | Quick: ${playbackPoints.infiniteQuick.startBeatIndex}β${playbackPoints.infiniteQuick.endBeatIndex} (${playbackPoints.infiniteQuick.endBeatIndex - playbackPoints.infiniteQuick.startBeatIndex + 1}bars, T${playbackPoints.infiniteQuick.transitionLength}) | DJ: ${playbackPoints.infiniteLarge.startBeatIndex}β${playbackPoints.infiniteLarge.endBeatIndex} (${playbackPoints.infiniteLarge.endBeatIndex - playbackPoints.infiniteLarge.startBeatIndex + 1}bars, T${playbackPoints.infiniteLarge.transitionLength})`);\n\n const segments: SegmentDetails = {\n 'infinite-quick': {\n startingIndex: playbackPoints.infiniteQuick.startBeatIndex,\n endingIndex: playbackPoints.infiniteQuick.endBeatIndex,\n totalBarCountsRecognisedAtAEV3Parser: beatsUsingAtV3_DEBUG_ONLY.length,\n barExepctedFromIndicesReturned: playbackPoints.infiniteQuick.endBeatIndex - playbackPoints.infiniteQuick.startBeatIndex + 1,\n recommendedTransitionLength: playbackPoints.infiniteQuick.transitionLength,\n },\n 'infinite-dj': {\n startingIndex: playbackPoints.infiniteLarge.startBeatIndex,\n endingIndex: playbackPoints.infiniteLarge.endBeatIndex,\n totalBarCountsRecognisedAtAEV3Parser: beatsUsingAtV3_DEBUG_ONLY.length,\n barExepctedFromIndicesReturned: playbackPoints.infiniteLarge.endBeatIndex - playbackPoints.infiniteLarge.startBeatIndex + 1,\n recommendedTransitionLength: playbackPoints.infiniteLarge.transitionLength,\n },\n normal: {\n startingIndex: playbackPoints.normal.startBeatIndex,\n endingIndex: playbackPoints.normal.endBeatIndex,\n totalBarCountsRecognisedAtAEV3Parser: beatsUsingAtV3_DEBUG_ONLY.length,\n barExepctedFromIndicesReturned: playbackPoints.normal.endBeatIndex - playbackPoints.normal.startBeatIndex + 1,\n recommendedTransitionLength: playbackPoints.normal.transitionLength,\n }\n };\n\n // Pure output from function\n // _FF_log(`π― [FetchFeature] ${trackId} playback points:`, {\n // quick: `${playbackPoints.infiniteQuick.startBeatIndex}β${playbackPoints.infiniteQuick.endBeatIndex} (${playbackPoints.infiniteQuick.endBeatIndex - playbackPoints.infiniteQuick.startBeatIndex + 1}bars)`,\n // large: `${playbackPoints.infiniteLarge.startBeatIndex}β${playbackPoints.infiniteLarge.endBeatIndex} (${playbackPoints.infiniteLarge.endBeatIndex - playbackPoints.infiniteLarge.startBeatIndex + 1}bars)`,\n // totalBars: smoothedBeatGrid.length\n // });\n\n // TED...\n\n // Keep this on so we know if some missing cases slip away\n if (playbackPoints.infiniteQuick.endBeatIndex >= smoothedBeatGrid.length) {\n _FF_log('%cπ¨ ERROR:: this will prevent infinite playback goes on (endBeatIndex >= total length)', 'color: magenta; background: white;', {\n trackId,\n endBeatIndex: playbackPoints.infiniteQuick.endBeatIndex,\n totalLength: smoothedBeatGrid.length,\n transitionLengthQuick: playbackPoints.infiniteQuick.transitionLength,\n transitionLengthLarge: playbackPoints.infiniteLarge.transitionLength\n });\n // throw Error('this will prevent infinite playback goes on');\n // eslint-disable-next-line no-debugger\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) debugger;\n }\n if ((playbackPoints.infiniteQuick.startBeatIndex - playbackPoints.infiniteQuick.transitionLength)+1 < 0) {\n _FF_log('%cπ¨ ERROR:: this will prevent infinite playback goes on (2) - not enough bars before start for transition', 'color: magenta; background: white;', {\n trackId,\n startBeatIndex: playbackPoints.infiniteQuick.startBeatIndex,\n transitionLengthQuick: playbackPoints.infiniteQuick.transitionLength,\n requiredMinStart: playbackPoints.infiniteQuick.transitionLength - 1,\n deficit: (playbackPoints.infiniteQuick.transitionLength - 1) - playbackPoints.infiniteQuick.startBeatIndex\n });\n // throw Error('this will prevent infinite playback goes on');\n\n // note this should only affect s1/s2... can be fixed i think\n // eslint-disable-next-line no-debugger\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) debugger;\n }\n if (playbackPoints.infiniteQuick.startBeatIndex > playbackPoints.infiniteQuick.endBeatIndex) {\n _FF_log('%cπ¨ ERROR:: this will prevent any Bar Sequence playback goes on (3) - starting index > ending index', 'color: magenta; background: white;', {\n trackId,\n startBeatIndex: playbackPoints.infiniteQuick.startBeatIndex,\n endBeatIndex: playbackPoints.infiniteQuick.endBeatIndex,\n // recommendedTransitionLength: playbackPoints.recommendedTransitionLength,\n // deficit: (playbackPoints.recommendedTransitionLength - 1) - playbackPoints.infinite.startBeatIndex\n });\n // throw Error('this will prevent infinite playback goes on');\n\n // note this should only affect s1/s2... can be fixed i think\n // eslint-disable-next-line no-debugger\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) debugger;\n }\n // if ((playbackPoints.infinite.endBeatIndex - playbackPoints.infinite.startBeatIndex) < 15) {\n // _FF_log('%cπ¨ ERROR:: this will prevent infinite playback goes on (3) - segment too short for minimum playback', 'color: magenta; background: white;', {\n // trackId,\n // startBeatIndex: playbackPoints.infinite.startBeatIndex,\n // endBeatIndex: playbackPoints.infinite.endBeatIndex,\n // actualSegmentLength: playbackPoints.infinite.endBeatIndex - playbackPoints.infinite.startBeatIndex + 1,\n // minimumRequired: 15,\n // deficit: 15 - (playbackPoints.infinite.endBeatIndex - playbackPoints.infinite.startBeatIndex + 1),\n // recommendedTransitionLength: playbackPoints.recommendedTransitionLength,\n // totalBars: smoothedBeatGrid.length\n // });\n // throw Error('this will prevent infinite playback goes on');\n // note this should only affect s1/s2... can be fixed i think\n // debugger;\n // }\n\n\n // return [startIndex, endIndex, recommendedTransitionLength]\n // Keep returning medium by default for compatibility\n return segments;\n // return [\n // playbackPoints.infiniteMedium.startBeatIndex,\n // playbackPoints.infiniteMedium.endBeatIndex,\n // playbackPoints.infiniteMedium.transitionLength\n // ]\n}","// the beat grid is from graphql\nexport const calculateQuantisedTrackActualDurationFromBeatGrid = ( originalDuration: number, beats: {\n frame: number,\n number: number,\n timestamp: number,\n}[]): number => {\n // console.log(beats);\n // first 1\n try {\n const one = beats.filter((b)=>b.number===1);\n // last 4 full frame ( eq to last 1)\n // const four = beats.filter((b)=>b.number===4);\n\n // not using following because we an just derive from timestamp\n // const SAMPLE_RATE_FROM_ENDPOINT = 44100;\n // const accurate_duration = (one[one.length-1].frame - one[0].frame) / SAMPLE_RATE_FROM_ENDPOINT;\n const accurate_duration = one[one.length-1].timestamp - one[0].timestamp;\n\n // console.table({\n // caution: 'note this one only need for playing quantised source',\n // accurate_duration,originalDuration\n // })\n\n return accurate_duration;\n } catch (err) {\n console.error('cannot get endTime of calculateQuantisedTrackActualDurationFromBeatGrid', err);\n return 0;\n }\n}\n\nexport const getDurationFromBeatsLinkUpToLastDownbeat0 = ( originalDuration: number, beats: {\n frame: number,\n number: number,\n timestamp: number,\n}[]): number => {\n // console.log(beats);\n // first 1\n try {\n const one = beats.filter((b)=>b.number===1);\n // last 4 full frame ( eq to last 1)\n // const four = beats.filter((b)=>b.number===4);\n\n // not using following because we an just derive from timestamp\n // const SAMPLE_RATE_FROM_ENDPOINT = 44100;\n // const accurate_duration = (one[one.length-1].frame - one[0].frame) / SAMPLE_RATE_FROM_ENDPOINT;\n const accurate_duration = one[one.length-1].timestamp;\n\n // console.table({\n // caution: 'note this one only need for playing quantised source',\n // accurate_duration,originalDuration\n // })\n\n return accurate_duration;\n } catch (err) {\n console.error('cannot get endTime of getDurationFromBeatsLinkUpToLastDownbeat0', err);\n return 0;\n }\n}\n\n// segmentTypeId:\n// START: 0,\n// END: 1,\n// INTRO: 2,\n// OUTRO: 3,\n// BREAK: 4,\n// BRIDGE: 5,\n// INST: 6,\n// SOLO: 7,\n// VERSE: 8,\n// CHORUS: 9\n\nexport const getFullDurationFromBeatsLinkSegmentInfo = (segmentInfo: [number, number, number][]): number => {\n const length = segmentInfo?.length || 0;\n if (length === 0) return 0;\n \n try {\n const lastItem = segmentInfo[length-1];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [startTime, endTime, segmentTypeId] = lastItem;\n return endTime;\n } catch (err) {\n console.error('cannot get endTime of getFullDurationFromBeatsLinkSegmentInfo', err);\n return 0;\n }\n}\n","/**\n * Store for current stationTrack JSON data\n * Used to share stationTrack JSON between components (e.g., stationTrack list and prototype panel)\n */\n\nimport { create } from 'zustand';\n\nexport interface CurrentStationTrackJsonStore {\n stationTrackJsonString: string | null;\n stationTrackUrl: string | null;\n setStationTrackJson: (stationTrackJsonString: string, stationTrackUrl: string) => void;\n clearStationTrackJson: () => void;\n}\n\nexport const useCurrentStationTrackJsonStore = create<CurrentStationTrackJsonStore>((set) => ({\n stationTrackJsonString: null,\n stationTrackUrl: null,\n setStationTrackJson: (stationTrackJsonString: string, stationTrackUrl: string) => {\n set({ stationTrackJsonString, stationTrackUrl });\n },\n clearStationTrackJson: () => {\n set({ stationTrackJsonString: null, stationTrackUrl: null });\n },\n}));\n","const REPLACE_MP4_URL_REDIRECT_AS_LOCAL = false;\n\n// fallback: Missing sample sizes for track, using fixed-size frame fallback, NOTE this could lead to missing audio in that segment\n// messed up volume: volume goes up and down due to Normalisation flag at Source mp3/WAV composition at upstream of pipeline\n\nexport const replaceMp4ForLocalUse = (mp4: string | null | undefined): string | null | undefined => {\n if (!mp4) return mp4;\n \n // let url = `${mp4}`;\n \n if (REPLACE_MP4_URL_REDIRECT_AS_LOCAL) {\n // YELLOW - Cold play\n if (mp4.includes('02121794-90dc-4a52-b05a-31111f0bc06c')) {\n // messed up volume [YES]\n // url = 'http://localhost:3001/WEB_SCRAPING_FOLDER/02121794-90dc-4a52-b05a-31111f0bc06c-after-demucs.mp4';\n\n // messed up volume [YES]\n // fallback kick in AND missing \"I swam across\" at around 02:00\n // url = 'http://localhost:3001/WEB_SCRAPING_FOLDER/02121794-90dc-4a52-b05a-31111f0bc06c-after-bs.mp4';\n \n // messed up volume [NO]\n // this track has no problem\n // url = 'http://localhost:3001/WEB_SCRAPING_FOLDER/02121794-90dc-4a52-b05a-31111f0bc06c-non-norm-20260126-1130.mp4';\n\n // url = 'http://localhost:3001/WEB_SCRAPING_FOLDER/02121794-90dc-4a52-b05a-31111f0bc06c/track_11.mp4';\n\n }\n if (mp4.includes('0294741e-bf59-4685-9ec7-1a8f46277633')) {\n // url = 'http://localhost:3001/WEB_SCRAPING_FOLDER/0294741e-bf59-4685-9ec7-1a8f46277633.mp4';\n }\n\n // swapping to local\n const trackIds = [\n \"02121794-90dc-4a52-b05a-31111f0bc06c\",\n \"0294741e-bf59-4685-9ec7-1a8f46277633\",\n \"024b12e4-1fbd-4e5f-afb9-6a69145df713\",\n \"028ef481-c836-4a04-8be7-47c3c007fa33\",\n \"02199af1-24f3-4fda-8ca2-d01981f6b2a5\",\n \"0215a752-3a78-4aaa-a53b-5c5d1b8d3d1b\",\n \"023a1f68-3f98-4111-bff4-904a5483945c\",\n \"023b94b8-6e4b-4637-ad88-26b3f9a6651e\",\n \"025e543f-d426-4088-bf04-5619bd2a519e\",\n \"0277b01e-96ec-4f5a-b01e-4207ddd5ac7e\",\n \"023b4036-7fa7-4bfa-a02b-d1c2a9f521db\",\n \"02655d9d-d8cc-4724-9215-d23105d682b5\",\n \"0256ef10-c561-4e04-b893-5e970da06e94\",\n \"02224b0f-7330-4621-82d8-1fc522542ea7\",\n \"02735fd6-bc65-4f30-8539-aabbe9ea04ab\",\n \"02226b5a-a54b-4502-b61c-3e7819d0ed7c\",\n ];\n\n const index = trackIds.findIndex((tid)=>mp4.includes(tid));\n if (index > -1) {\n const trackId = trackIds[index];\n const url = `http://localhost:3001/WEB_SCRAPING_FOLDER/2026-01/${trackId}.mp4`;\n return url;\n }\n }\n return mp4;\n}\n","import { createTranslator } from 'short-uuid';\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** Stem web uses flickr Base58 shortening (same as `short-uuid` default / stemplayer session-route-ids). */\nconst flickrTranslator = createTranslator();\n\n/**\n * Match stemplayer `session-route-ids`: `/session/:id` may be a short Base58 id or a plain UUID.\n * GraphQL `stations(filter: { ids })` expects canonical UUIDs.\n */\nexport function resolveStemSessionRouteStationId(segment: string | null | undefined): string | undefined {\n if (segment == null || segment === '') return undefined;\n if (segment === 'new') return segment;\n if (UUID_RE.test(segment)) return segment;\n try {\n const uuid = flickrTranslator.toUUID(segment);\n return UUID_RE.test(uuid) ? uuid : segment;\n } catch {\n return segment;\n }\n}\n","// import { SAVE_REMOTE_M3U8_AAC_TO_LOCAL, COVER_REMIXES_WHEN_SAVE_TO_LOCAL, PRINT_CURL_COMMAND_ON_SOURCE_FILE_ONLY } from \"@/components/prototype-panel-v2\";\nimport { calculateTempoOrigSzFromBeatDownBeat, resolveMultipleBeatsAndKeysWithBeatsLink } from \"./fetchFeature\";\nimport { /*IStems,*/ ITrackForSequence, ITrackForSequenceNoBeats } from \"@/stem-audio-engine-v3/interface\";\nimport { AEV3Controller } from \"@/stem-audio-engine-v3/global-aev3-controller\";\nimport { calculateQuantisedTrackActualDurationFromBeatGrid, getFullDurationFromBeatsLinkSegmentInfo, getDurationFromBeatsLinkUpToLastDownbeat0 } from \"./track-resolvers\";\nimport { AEV3Config } from \"@/stem-audio-engine-v3/aev3-env-config\";\nimport { useCurrentStationTrackJsonStore } from \"@/stem-audio-engine-v3/store/use-current-station-track-json-store\";\n\n// import { NEXT_MIX_ID_DROPPED_ON_RESOLVING_NEXT_MIX } from \"./dropped-mix-ids\";\nimport { replaceMp4ForLocalUse } from \"@/stem-audio-engine-v3/utils/mp4-local-utils\";\nimport { getUnknownThrownMessage } from '@/utils/unknown-caught-error';\nimport { resolveStemSessionRouteStationId } from '@/utils/sessionRouteStationId';\n\ntype StationTrackBeatsPayload = Pick<\n ITrackForSequence,\n 'beats' | 'indices' | 'segmentInfo' | 'key' | 'tonality' | 'beatSource'\n>;\n\n// NOTE no slash at last character of VITE_KB_STEMIFY_API_URL\nconst TRACK_CREATOR_ENDPOINT = `${import.meta.env?.VITE_KB_STEMIFY_API_URL || 'https://api.stemplayer.com'}/track-creator`;\nconst LOGIN_LINK = `${import.meta.env?.VITE_KB_STEMIFY_API_URL || 'https://api.stemplayer.com'}/accounts/user/login`;\n// const LOGIN_LINK = 'https://api.staging.stemplayer.com/accounts/user/signup-limited';\n\n// make it test_playback_2/v1\n// const APPLY_HACK_ON_THE_QUANTISED_WAV_FILE_PATH = false;\n\nconst FETCH_MIX_CONSOLE_TIME = '';\n\n// already aligning with what platform using, enforced at resolveSingleBeatsAndKeysWithBeatsLink\n\n// In-memory cache for MixesToPlay (getNextMixMetadata) to avoid CloudFront/network when repeat-requesting same (stationId, stationTrackId, direction).\n// CloudFront misses because the request URL includes variables.afterId = current stationTrackId and variables.sort, so every \"next/prev\" call has a unique URL.\n// const MIXES_TO_PLAY_LOCAL_CACHE_MAX = 80;\n\n// In-memory cache for GetMix (getMixMetadata) to avoid CloudFront/network when repeat-requesting same mix.\nconst GET_MIX_LOCAL_CACHE_MAX = 60;\n\nconst StationTracksLocalCache = new Map<string, { data: unknown; cachedAt: number }>();\nconst getStationTracksCacheKey = (stationTrackId: string, stationId: string, extraTracksToLoad: number) =>\n `${stationTrackId}|${stationId}|${extraTracksToLoad}`;\nconst getStationTracksPositionCacheKey = (position: number, stationId: string, extraTracksToLoad: number) =>\n `pos${position}|${stationId}|${extraTracksToLoad}`;\n\n// Shared GraphQL fragments to avoid duplication\nconst TRACK_ITEM_FRAGMENT = `fragment TrackItem on Track {\n artistDisplayName\n colors\n name\n trackId\n trackMixType\n trackStatus\n isClaimed\n duration\n artwork: image\n artworkGlowColor\n url: url(codec: aac, container: mp4, profile: raw)\n}`;\n\n/** stemplayer.com session root URLs: load this many tracks (API + DAW / player). */\nexport const BARE_SESSION_STATION_TRACK_LIMIT = 3;\n\nconst getBareSessionTracksCacheKey = (stationId: string, first: number) =>\n `bareSession|${stationId}|${first}`;\n\nconst _FM_log: typeof console.log = (...data) => {\n return;\n console.log(...data);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst _FM_log_table: typeof console.table = (...data) => {\n return;\n console.table(...data);\n}\n\nexport const login = async () => {\n const loginUrl = LOGIN_LINK;\n\n try {\n const cachedToken = localStorage.getItem('accessToken');\n const tokenExpiry = localStorage.getItem('tokenExpiry');\n\n if (cachedToken && tokenExpiry && new Date().getTime() < parseInt(tokenExpiry, 10)) {\n const cachedTokenObj = JSON.parse(cachedToken);\n _FM_log('Using cached access token:', cachedTokenObj.accessToken.value);\n return cachedTokenObj.accessToken.value;\n }\n\n let loginPayload: { email: string, password: string };\n try {\n const username = import.meta.env?.VITE_STEM_API_USERNAME;\n const password = import.meta.env?.VITE_STEM_API_PASSWORD;\n if (!username || !password) {\n throw new Error('Username or password not found in environment variables');\n }\n loginPayload = {\n email: username,\n password: password,\n };\n } catch (error) {\n _FM_log(error);\n throw new Error('Username or password not found');\n }\n\n _FM_log('Starting login request...');\n const loginResponse = await fetch(loginUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(loginPayload),\n });\n\n if (!loginResponse.ok) {\n throw new Error('Login failed');\n }\n\n const loginData = await loginResponse.json();\n const accessTokenObj = loginData.data;\n const expiryTime = new Date().getTime() + (20 * 60 * 1000); // Token valid for 20 minutes\n _FM_log('Login successful. Access token:', accessTokenObj.accessToken.value);\n\n localStorage.setItem('accessToken', JSON.stringify(accessTokenObj));\n localStorage.setItem('tokenExpiry', expiryTime.toString());\n\n return accessTokenObj.accessToken.value;\n } catch (error) {\n console.error('Error during login or fetching mix data:', getUnknownThrownMessage(error));\n return null;\n }\n};\n\ntype QueryResult = { data:\n {\n stations: {\n stationId: string;\n lastModified: string;\n currentTrack: {\n position: number;\n stationTrackId: string;\n track: ITrackForSequenceNoBeats\n }[];\n nextTracks: {\n position: number;\n stationTrackId: string;\n track: ITrackForSequenceNoBeats\n }[];\n }[]\n }\n}\n\ntype QueryResultResolved = { data:\n {\n stations: {\n stationId: string;\n lastModified: string;\n currentTrack: {\n position: number;\n stationTrackId: string;\n track: ITrackForSequence;\n }[];\n nextTracks: {\n position: number;\n stationTrackId: string;\n track: ITrackForSequence;\n }[];\n }[]\n }\n}\n\nexport type StationTrackJsonReturn = QueryResultResolved;\n\n// keeping the first appearence\nexport const removeDuplicatesById = (arr: {id: string, url: string | undefined | null}[]) => {\n const seen = new Set();\n return arr.filter(item => {\n if (seen.has(item.id)) {\n return false;\n }\n seen.add(item.id);\n return true;\n });\n};\n\nconst replaceMp4Url = (m_t: { url: string | null | undefined }) => {\n const mp4 = m_t.url;\n if (mp4 == null) return;\n m_t.url = replaceMp4ForLocalUse(mp4);\n};\n\nconst addBeatsRelatedParam = (m_t: ITrackForSequenceNoBeats & Partial<ITrackForSequence>, beats: StationTrackBeatsPayload) => {\n m_t.beats = beats.beats;\n m_t.tempoOrigSz = calculateTempoOrigSzFromBeatDownBeat(beats.beats.map((b) => b.timestamp));\n m_t.duration = calculateQuantisedTrackActualDurationFromBeatGrid(-1, m_t.beats);\n m_t.indices = beats.indices;\n m_t.segmentInfo = beats.segmentInfo;\n m_t.key = beats.key;\n m_t.tonality = beats.tonality;\n m_t.beatSource = beats.beatSource;\n return m_t;\n};\n\n/** Variable nullability mirrors stemplayer `StationTracksPage` (TracksPage bundle) for schema compatibility. */\nconst getQueryForStationTracksPage = () => (`query StationTracksPage($filter: StationsFilterInput, $first: Int = 20, $after: Int, $sort: Sort, $searchQuery: String) {\n stations(filter: $filter) {\n stationId\n lastModified\n tracksPage(first: $first, after: $after, sort: $sort, searchQuery: $searchQuery) {\n nodes {\n stationTrackId\n position\n track {\n ...TrackItem\n }\n }\n }\n }\n}\n\n${TRACK_ITEM_FRAGMENT}`);\n\nasync function hydrateStationTracksWithBeats(\n authToken: string,\n responseData: QueryResult,\n useLocalCache: boolean,\n cacheKey: string,\n): Promise<QueryResultResolved | null> {\n try {\n const trackIdsCurrent: { id: string; url: string | null | undefined }[] = responseData.data.stations[0].currentTrack.map((t) => ({\n id: t.track.trackId,\n url: t.track.url,\n }));\n const trackIdsNext: { id: string; url: string | null | undefined }[] = responseData.data.stations[0].nextTracks.map((t) => ({\n id: t.track.trackId,\n url: t.track.url,\n }));\n const tracksMerged = removeDuplicatesById([...trackIdsCurrent, ...trackIdsNext]);\n const tracks = tracksMerged.filter((t): t is { id: string; url: string } => t.url != null);\n\n const smoothBeatsDepreciated = true;\n const trackBeatsCollection = await resolveMultipleBeatsAndKeysWithBeatsLink(tracks, authToken, smoothBeatsDepreciated, 3);\n\n const modifyStationTracks = (track: ITrackForSequenceNoBeats, beatsCollection: Awaited<ReturnType<typeof resolveMultipleBeatsAndKeysWithBeatsLink>>): ITrackForSequence => {\n const trackId = track.trackId;\n const m_t: ITrackForSequence = track as ITrackForSequence;\n\n if (beatsCollection.data[trackId]) {\n replaceMp4Url(m_t);\n addBeatsRelatedParam(m_t, beatsCollection.data[trackId]);\n m_t.__falseTrack = false;\n m_t.__durationForValidation1 = getFullDurationFromBeatsLinkSegmentInfo(m_t.segmentInfo);\n m_t.__durationForValidation2 = getDurationFromBeatsLinkUpToLastDownbeat0(-1, m_t.beats);\n } else {\n m_t.__falseTrack = true;\n m_t.__durationForValidation1 = 0;\n m_t.__durationForValidation2 = 0;\n }\n return m_t;\n };\n\n responseData.data.stations[0].currentTrack.forEach((t) => {\n modifyStationTracks(t.track, trackBeatsCollection);\n });\n responseData.data.stations[0].nextTracks.forEach((t) => {\n modifyStationTracks(t.track, trackBeatsCollection);\n });\n const responseDataResolved: QueryResultResolved = responseData as QueryResultResolved;\n if (useLocalCache) {\n if (StationTracksLocalCache.size >= GET_MIX_LOCAL_CACHE_MAX) {\n const oldestKey = StationTracksLocalCache.keys().next().value;\n if (oldestKey !== undefined) StationTracksLocalCache.delete(oldestKey);\n }\n StationTracksLocalCache.set(cacheKey, { data: responseDataResolved, cachedAt: Date.now() });\n }\n return responseDataResolved;\n } catch (e) {\n console.error(`Error hydrating station tracks with beats: ${e}`);\n return null;\n }\n}\n\nconst getQueryForStationTrackId = () => (`query GetStationTracks($stationIds: [ID]!, $first: Int, $currentStationTrackId: ID, $sort: Sort) {\n stations(filter: { ids: $stationIds }) {\n stationId\n lastModified\n trackCount\n currentTrack: tracks(stationTrackId: $currentStationTrackId){\n position\n stationTrackId\n track {...TrackItem}\n }\n nextTracks: tracks(first: $first, afterId: $currentStationTrackId, sort: $sort) {\n position\n stationTrackId\n track {...TrackItem}\n }\n }\n}\n\n${TRACK_ITEM_FRAGMENT}`);\n\nconst getQueryForPosition = () => (`query GetStationTracks($stationIds: [ID]!, $first: Int, $position: Int, $sort: Sort) {\n stations(filter: { ids: $stationIds }) {\n stationId\n lastModified\n trackCount\n currentTrack: tracks(first: 1, after: $position, sort: $sort) {\n position\n stationTrackId\n track {...TrackItem}\n }\n nextTracks: tracks(first: $first, after: $position, sort: $sort) {\n position\n stationTrackId\n track {...TrackItem}\n }\n }\n}\n\n${TRACK_ITEM_FRAGMENT}`);\n\n/** e.g. https://www.stemplayer.com/session/11111abc?mode=infinite-mix β path must be `/session/{stationId}` only (not `/session/.../track/...`). */\nexport function extractBareSessionStationId(rawUrl: string): string | null {\n try {\n const trimmed = rawUrl.trim();\n const url = new URL(trimmed.startsWith('http') ? trimmed : `https://${trimmed}`);\n const bare = url.pathname.match(/^\\/session\\/([^/]+)\\/?$/i);\n return bare ? bare[1] : null;\n } catch {\n return null;\n }\n}\n\nexport async function getStationTracksPageFirstN(\n authToken: string,\n stationId: string,\n first: number,\n useLocalCache: boolean,\n abortController?: AbortController,\n): Promise<QueryResultResolved | null> {\n const graphqlStationId = resolveStemSessionRouteStationId(stationId) ?? stationId;\n if (import.meta.env.DEV && graphqlStationId !== stationId) {\n // eslint-disable-next-line no-console\n console.info('[StationTracksPage] Resolved short session id for GraphQL', { routeId: stationId, graphqlStationId });\n }\n const cacheKey = getBareSessionTracksCacheKey(graphqlStationId, first);\n if (useLocalCache) {\n const entry = StationTracksLocalCache.get(cacheKey);\n if (entry?.data) {\n _FM_log('getStationTracksPageFirstN: local cache hit', cacheKey);\n return typeof structuredClone !== 'undefined'\n ? structuredClone(entry.data) as QueryResultResolved\n : JSON.parse(JSON.stringify(entry.data)) as QueryResultResolved;\n }\n }\n\n const query = getQueryForStationTracksPage().trim();\n const variables = {\n filter: { ids: [graphqlStationId] },\n first,\n sort: 'asc',\n searchQuery: '',\n };\n const body = JSON.stringify({\n query,\n variables,\n operationName: 'StationTracksPage',\n });\n const url = `${TRACK_CREATOR_ENDPOINT}/graphql`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${authToken}`,\n },\n signal: abortController?.signal,\n body,\n });\n\n const payload = await response.json();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errors = payload?.errors as any[] | undefined;\n if (errors?.length) {\n console.error('StationTracksPage GraphQL errors:', errors);\n // eslint-disable-next-line no-console\n if (import.meta.env.DEV) console.debug('StationTracksPage full payload', payload);\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const station = payload?.data?.stations?.[0] as any;\n const nodes = station?.tracksPage?.nodes as\n | { stationTrackId: string; position: number; track: ITrackForSequenceNoBeats }[]\n | undefined;\n if (!station?.stationId || !nodes?.length) {\n console.error('StationTracksPage: empty GraphQL payload or no tracks', {\n graphqlStationId,\n status: response.status,\n stations: payload?.data?.stations,\n });\n return null;\n }\n\n const limited = nodes.slice(0, first);\n const currentTrack = limited.slice(0, 1).map((n) => ({\n position: n.position,\n stationTrackId: n.stationTrackId,\n track: n.track,\n }));\n const nextTracks = limited.slice(1).map((n) => ({\n position: n.position,\n stationTrackId: n.stationTrackId,\n track: n.track,\n }));\n\n const queryResult: QueryResult = {\n data: {\n stations: [\n {\n stationId: station.stationId,\n lastModified: station.lastModified ?? '',\n currentTrack,\n nextTracks,\n },\n ],\n },\n };\n\n return await hydrateStationTracksWithBeats(authToken, queryResult, useLocalCache, cacheKey);\n } catch (e) {\n console.error(`Error in getStationTracksPageFirstN: ${e}`);\n return null;\n }\n}\n\n// useLocalCache: when true, return in-memory cached result for (stationTrackId, stationId, smoothBeats) if present, and store new results in cache.\nexport const getStationTracksGeneric = async (\n authToken: string,\n stationId: string,\n extraTracksToLoad: number,\n direction: 'prevMixId'|'nextMixId',\n useLocalCache: boolean,\n field: 'stationTrackId'|'position',\n val: string | number, // this will be included\n abortController?: AbortController\n): Promise<QueryResultResolved | null> => {\n \n let cacheKey: string;\n if (field==='stationTrackId') {\n cacheKey = getStationTracksCacheKey(val.toString(), stationId, extraTracksToLoad);\n } else if (field==='position') {\n cacheKey = getStationTracksPositionCacheKey(+val, stationId, extraTracksToLoad);\n } else {\n cacheKey = '';\n }\n if (useLocalCache) {\n const entry = StationTracksLocalCache.get(cacheKey);\n if (entry?.data) {\n _FM_log('getMixMetadata: local cache hit', cacheKey);\n return typeof structuredClone !== 'undefined'\n ? structuredClone(entry.data) as QueryResultResolved\n : JSON.parse(JSON.stringify(entry.data)) as QueryResultResolved;\n }\n }\n\n let query: string;\n let stationTrackId: string;\n let position: number;\n let variables: object;\n\n switch(field){\n case 'stationTrackId':\n stationTrackId = val.toString();\n query = getQueryForStationTrackId();\n variables = {\"stationIds\":[stationId],\"currentStationTrackId\": stationTrackId,\"first\":extraTracksToLoad, \"sort\": (direction==='nextMixId' ? 'asc': 'desc')};\n break;\n case 'position':\n position = +val;\n query = getQueryForPosition();\n variables = {\"stationIds\":[stationId],\"position\": position,\"first\":extraTracksToLoad, \"sort\": (direction==='nextMixId' ? 'asc': 'desc')};\n break;\n }\n \n // GET REQUEST:\n /*\n const queryParams = new URLSearchParams({\n query: query.trim(),\n variables: JSON.stringify(variables),\n operationName: 'GetStationTracks'\n });\n const url = `${TRACK_CREATOR_ENDPOINT}/graphql?${queryParams.toString()}`;\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${authToken}`,\n };\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: abortController?.signal,\n });\n */\n // POST REQUEST:\n const queryParams = ({\n query: query.trim(),\n variables: variables,\n operationName: 'GetStationTracks'\n });\n const url = `${TRACK_CREATOR_ENDPOINT}/graphql`;\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${authToken}`,\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n signal: abortController?.signal,\n body: JSON.stringify(queryParams),\n });\n \n const responseData:QueryResult = await response.json();\n // console.timeEnd(FETCH_MIX_CONSOLE_TIME);\n if (response.ok) {\n _FM_log('Successfully fetched the mix details.');\n _FM_log(responseData);\n \n // if (CREATE_UNQUANTISE_MP3_AS_HLS_AAC){\n // downloadAudioStemsUnquantiseMP3ToLocalAndConvertToAAC(responseData);\n // }\n\n // if (CREATE_QUANTISED_WAV_AS_HLS_AAC){\n // downloadAudioStemsQuantiseWAVToLocalAndConvertToAAC(responseData);\n // }\n\n // if (SAVE_REMOTE_M3U8_AAC_TO_LOCAL) {\n // downloadAudioStemsM3U8AndAACToLocal(responseData);\n // }\n\n const hydrated = await hydrateStationTracksWithBeats(authToken, responseData, useLocalCache, cacheKey);\n if (hydrated) return hydrated;\n return null;\n } else {\n console.error(`Failed to fetch mix details. ${FETCH_MIX_CONSOLE_TIME}`);\n return null;\n }\n } catch (e) {\n // console.timeEnd(FETCH_MIX_CONSOLE_TIME);\n console.error(`Error during mix detail retrieval: ${e}`);\n return null;\n }\n}\n\n/**\n * This Util function is only for prototype page - It will try to do following:\n * 1) Login with the .env info\n * 2) Fetch the Mix Object and Resolve the BeatGrids with getMixMetadata\n * \n * @param url \n * @param smoothBeats \n * @returns \n */\nexport const extractStationTrackIdVer2 = (url:string): string | null => {\n _FM_log(url);\n const legacyPattern = /^https?:\\/\\/[^/]+\\/(?:set|artist)\\/([^/]+)\\/stationtrack\\/([^/?#]+)(?:\\/|$|\\?)/i;\n const sessionPattern = /^https?:\\/\\/[^/]+\\/session\\/([^/]+)\\/track\\/([^/?#]+)(?:\\/|$|\\?)/i;\n\n const match = url.match(legacyPattern) || url.match(sessionPattern);\n\n if (match) {\n const mixValue = match[2];\n _FM_log(`Extracted value: ${mixValue}`);\n return mixValue;\n }\n _FM_log(\"No match found.\");\n return null;\n}\n\nexport const extractStationIdVer2 = (url:string): string | null => {\n _FM_log(url);\n const legacyPattern = /^https?:\\/\\/[^/]+\\/(?:set|artist)\\/([^/]+)\\/stationtrack\\/([^/?#]+)(?:\\/|$|\\?)/i;\n const sessionPattern = /^https?:\\/\\/[^/]+\\/session\\/([^/]+)\\/track\\/([^/?#]+)(?:\\/|$|\\?)/i;\n\n const match = url.match(legacyPattern) || url.match(sessionPattern);\n\n if (match) {\n const mixValue = match[1];\n _FM_log(`Extracted value: ${mixValue}`);\n return mixValue;\n } else {\n _FM_log(\"No match found.\");\n }\n return null;\n}\n\nexport const fetchStationTrackDataWithSharedURL = async (url: string, abortController?: AbortController) => {\n\n if (!url) {\n _FM_log('empty');\n return;\n }\n\n const stationTrackId = extractStationTrackIdVer2(url);\n const stationId = extractStationIdVer2(url);\n const bareSessionStationId = extractBareSessionStationId(url);\n\n if (!((stationTrackId && stationId) || bareSessionStationId)) {\n console.error('Invalid URL: not a recognised station / session link.');\n return;\n }\n\n const token = await login();\n AEV3Config.getInstance().setAccessToken(token);\n if (!token) {\n console.error('Could not authenticate for station / session fetch');\n return;\n }\n\n if (stationTrackId && stationId) {\n _FM_log(stationTrackId);\n const fetchedData = await getStationTracksGeneric(token, stationId, 1, AEV3Controller.getInstance().fieldToUseOnAutoplayNext, true, 'stationTrackId', stationTrackId, abortController);\n\n if (fetchedData) {\n return JSON.stringify(fetchedData);\n }\n console.error('Failed to fetch station track data (shared URL with track)');\n return;\n }\n\n if (!bareSessionStationId) {\n return;\n }\n\n const fetchedBare = await getStationTracksPageFirstN(token, bareSessionStationId, BARE_SESSION_STATION_TRACK_LIMIT, true, abortController);\n if (fetchedBare) {\n return JSON.stringify(fetchedBare);\n }\n console.error('Failed to fetch station tracks (bare session URL)');\n};\n\n/**\n * Loads a mix from JSON data and sets it as the current track in the audio engine.\n * This is a shared utility function that can be used by mix list components and other UI components.\n * \n * @param mixJsonString - The JSON string containing the mix data\n * @param mixURL - The URL of the mix (used to extract station ID)\n */\nexport const loadStationTrackFromJsonForPrototype = (mixJsonString: string, mixURL: string): void => {\n try {\n const mixObject: QueryResultResolved = JSON.parse(mixJsonString);\n \n if (!mixObject?.data?.stations) {\n console.error('[loadMixFromJsonForPrototype] Invalid mix object structure:', mixObject);\n throw new Error('Invalid mix object structure');\n }\n \n // Store the mix JSON in Zustand store\n // This allows components to reactively update when a mix is loaded\n useCurrentStationTrackJsonStore.getState().setStationTrackJson(mixJsonString, mixURL);\n \n // Preload seed track\n const seedTrack: ITrackForSequence = mixObject?.data?.stations?.[0].currentTrack?.[0].track;\n \n if (seedTrack) {\n const triggerLoadingOfHLS = false;\n AEV3Controller.getInstance().setCurrentSeedTrackObject(seedTrack, 'seed1', triggerLoadingOfHLS, -1, 'fetch mix');\n } else {\n console.warn('[loadMixFromJsonForPrototype] No seed track found');\n }\n \n // Preload mix track\n const mixTrack: ITrackForSequence = mixObject?.data?.stations?.[0]?.nextTracks?.[0]?.track;\n if (mixTrack) {\n replaceMp4Url(mixTrack);\n const triggerLoadingOfHLS = false;\n const memoriseMixTrackForSeekTo = true;\n AEV3Controller.getInstance().setCurrentMixTrackObject(mixTrack, 'mix1', triggerLoadingOfHLS, memoriseMixTrackForSeekTo, -1, 'fetch mix');\n } else {\n console.warn('[loadMixFromJsonForPrototype] No mix track found');\n }\n \n // Assign optional parameters\n // const stationTrackId = mixObject?.data?.mix?.stationTrackId;\n const stationTrackId = mixObject?.data?.stations?.[0]?.currentTrack?.[0]?.stationTrackId;\n const stationId = extractStationIdFromUrl(mixURL);\n if (stationTrackId) {\n AEV3Controller.getInstance().setCurrentTrackOptionalParam({\n stationTrackId: stationTrackId,\n nextStationTrackId: undefined,\n stationId,\n });\n } else {\n console.warn('[loadMixFromJsonForPrototype] No stationTrackId found');\n }\n \n } catch (error) {\n console.error('[loadMixFromJsonForPrototype] Error loading mix from JSON:', error);\n throw error;\n }\n};\n\nexport const uniqueTrackIds = (ids: string[]): string[] => {\n const stringSet: Set<string> = new Set(ids);\n const stringArray: string[] = Array.from(stringSet);\n return stringArray;\n}\n\nexport const extractStationIdFromUrl = (url:string) => {\n const legacyPattern = /^https?:\\/\\/[^/]+\\/(?:set|artist)\\/([^/]+)\\/stationtrack\\/([^/?#]+)(?:\\/|$|\\?)/i;\n const sessionPattern = /^https?:\\/\\/[^/]+\\/session\\/([^/]+)\\/track\\/([^/?#]+)(?:\\/|$|\\?)/i;\n\n const match = url.match(legacyPattern) || url.match(sessionPattern);\n\n if (match) {\n return match[1];\n }\n const bare = extractBareSessionStationId(url);\n if (!bare) return '';\n return resolveStemSessionRouteStationId(bare) ?? bare;\n}\n\nexport const isStationIdLibraryArtistStation = (stationId: string) => {\n return stationId?.includes(\"00000014-\");\n}","// import { rejects } from \"assert\";\nimport { AEV3Controller, SAMPLE_RATE } from \"../global-aev3-controller\";\nimport { ITrackForSequence } from \"../interface\";\n\nexport const ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES = false;\nconst TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST = 3500;\n\nconst _PRELOAD_log: typeof console.log = (...data) => {\n return;\n console.log(...data);\n};\n\nconst _PRELOAD_time: typeof console.time = (...data) => {\n return;\n console.time(...data);\n};\n\nconst _PRELOAD_timeEnd: typeof console.timeEnd = (...data) => {\n return;\n console.timeEnd(...data);\n};\n\n/**\n * A Util function that by using MP4Sequence Class preload specific segment of MOOF Box of the track provided\n * Note if the Sequences wasn't there it will trigger the creation as well\n * \n * Basically this function will be able to replace many logic in AEV3Context, for now we just adopt it at \n * Skipping to Next Track as first implementation\n * \n * @param track \n * @param preloadStartSample \n * @param preloadEndSample \n * @returns \n */\nconst preloadMP4_BasedOnSampleRange = async (track: ITrackForSequence, preloadStartSample: number, preloadEndSample: number): Promise<void> => {\n\n if (!Number.isInteger(preloadStartSample) || !Number.isInteger(preloadEndSample)) {\n throw new Error('preloadStartSample and preloadEndSample must be integers');\n }\n\n if (preloadStartSample < 0 || preloadEndSample < 0) {\n throw new Error('preloadStartSample and preloadEndSample must be non-negative integers');\n }\n\n if (preloadStartSample > preloadEndSample) {\n throw new Error('preloadStartSample must be less than or equal to preloadEndSample');\n }\n\n const audioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(track.trackId);\n \n // track already there\n if (audioSource) {\n // make sure it is initialised, which means it has valid MP4 Tail fetched\n if (audioSource.getIsInitialised()==='INITIALISED' || audioSource.getIsInitialised()==='FLAWED') {\n const timeSignature = `preload ${track.trackId} [${track.name}] sample: [start: ${preloadStartSample}, end: ${preloadEndSample}]`;\n _PRELOAD_time(timeSignature)\n \n // note the sample provided will be used to search within moof box list, and preloadStartSample - 2112 sample will be covered, \n // hence the sample asked for is sure can be decoded\n await audioSource.preloadWithSampleRange(\n preloadStartSample, \n preloadEndSample);\n _PRELOAD_timeEnd(timeSignature);\n _PRELOAD_log(`%c${timeSignature} ^ See Time Logged Above`, 'color: #00ff00; font-weight: bold');\n return;\n } else {\n // Use Promise.race for consistent retry logic\n await Promise.race([\n new Promise<void>((resolve) => {\n const checkInitialized = () => {\n if (audioSource.getIsInitialised()==='INITIALISED' || audioSource.getIsInitialised()==='FLAWED') {\n resolve();\n } else {\n setTimeout(checkInitialized, 100);\n }\n };\n checkInitialized();\n }),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error(`Failed to initialize existing audio source for track ${track.trackId} (${track.name}) after ${TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST} ms`)), TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST )\n )\n ]);\n \n // await until the AudioSource is initialised and preload the MP4 Segments\n return preloadMP4_BasedOnSampleRange(track, preloadStartSample, preloadEndSample);\n }\n } else {\n // trigger initialising of MP4 instance and await until the AudioSource is initialised and preload the MP4 Segments\n let createdAudioSource;\n try {\n createdAudioSource = await AEV3Controller.getInstance().createAudioSourceSequenceWithPreloadSampleLoc(track, false, 0 ,false, 'preloadMP4 Utils');\n } catch (err) {\n console.error('Failed to create audio source sequence:', err);\n throw err;\n }\n \n // If the tail is not resolved in ${TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST} ms throw an error instead\n await Promise.race([\n new Promise<void>((resolve) => {\n const checkInitialized = () => {\n if (createdAudioSource && (createdAudioSource.getIsInitialised()==='INITIALISED' || createdAudioSource.getIsInitialised()==='FLAWED')) {\n resolve();\n } else {\n setTimeout(checkInitialized, 100);\n }\n };\n checkInitialized();\n }),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error(`Failed to initialize audio source for track ${track.trackId} (${track.name}) after ${TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST} ms`)), TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST )\n )\n ]);\n \n return preloadMP4_BasedOnSampleRange(track, preloadStartSample, preloadEndSample);\n }\n}\n\n/**\n * A Util function that by using MP4Sequence Class preload specific segment of MOOF Box of the track provided\n * Note if the Sequences wasn't there it will trigger the creation as well\n * \n * Basically this function will be able to replace many logic in AEV3Context, for now we just adopt it at \n * Skipping to Next Track as first implementation\n * \n * @param track \n * @param preloadStartSample \n * @param preloadEndSample \n * @returns \n */\nconst preloadMP4_IsInitialsed = async (track: ITrackForSequence): Promise<void> => {\n\n const audioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(track.trackId);\n \n // track already there\n if (audioSource) {\n // make sure it is initialised, which means it has valid MP4 Tail fetched\n if (audioSource.getIsInitialised()==='INITIALISED' || audioSource.getIsInitialised()==='FLAWED'){\n const timeSignature = `preload ${track.trackId} [${track.name}] tail only`;\n _PRELOAD_time(timeSignature)\n \n _PRELOAD_timeEnd(timeSignature);\n _PRELOAD_log(`%c${timeSignature} ^ See Time Logged Above`, 'color: #00ff00; font-weight: bold');\n return;\n } else {\n // Use Promise.race for consistent retry logic\n await Promise.race([\n new Promise<void>((resolve) => {\n const checkInitialized = () => {\n if (audioSource.getIsInitialised()==='INITIALISED' || audioSource.getIsInitialised()==='FLAWED'){\n resolve();\n } else {\n setTimeout(checkInitialized, 100);\n }\n };\n checkInitialized();\n }),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error(`Failed to initialize existing audio source for track ${track.trackId} (${track.name}) after ${TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST} ms`)), TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST )\n )\n ]);\n \n // await until the AudioSource is initialised and preload the MP4 Segments\n return;\n }\n } else {\n // trigger initialising of MP4 instance and await until the AudioSource is initialised and preload the MP4 Segments\n const createdAudioSource = await AEV3Controller.getInstance().createAudioSourceSequenceWithPreloadSampleLoc(track, false, 0 ,false, 'preloadMP4 Utils');\n if (!createdAudioSource) {\n // _PRELOAD_log('autoplay', track.trackId, track.name, AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(track.trackId).getIsInitialised());\n return new Promise((_, reject)=>reject(new Error(`Failed to initialize audio source for track ${track.trackId} (${track.name}), should be due to bad MP4 not matching with beats`)));\n }\n \n // If the tail is not resolved in ${TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST} ms throw an error instead\n await Promise.race([\n new Promise<void>((resolve) => {\n const checkInitialized = () => {\n // _PRELOAD_log('checking audioSource', createdAudioSource.getIsInitialised())\n if (createdAudioSource && (createdAudioSource.getIsInitialised()==='INITIALISED' || createdAudioSource.getIsInitialised()==='FLAWED')) {\n resolve();\n } else {\n setTimeout(checkInitialized, 100);\n }\n };\n checkInitialized();\n }),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error(`Failed to initialize audio source for track ${track.trackId} (${track.name}) after ${TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST} ms`)), TIMEOUT_ALLOWANCE_FOR_EACH_REQUEST )\n )\n ]);\n \n return;\n }\n}\n\ninterface PreloadResult {\n trackId: string;\n trackName: string;\n success: boolean;\n error?: string;\n}\n\n/**\n * Preload MP4s with a sample range\n * All the Moof Box will be downloaded separately\n * \n * @param tracks \n * @returns \n */\nexport const preloadMP4s_BasedOnSampleRange = async (tracks: {track: ITrackForSequence, preloadStartSample: number, preloadEndSample: number}[]): Promise<PreloadResult[]> => {\n if (!Array.isArray(tracks) || tracks.length === 0) {\n throw new Error('tracks must be a non-empty array');\n }\n\n const uniqueId = Math.random().toString(36).substring(2, 8);\n const timeSignature = `preloading [${tracks.length} tracks] ${uniqueId}`;\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_time(timeSignature);\n\n // Process tracks in batches of 3 to prevent overwhelming the system\n const batchSize = 3;\n const results: PreloadResult[] = [];\n \n for (let i = 0; i < tracks.length; i += batchSize) {\n const batch = tracks.slice(i, i + batchSize);\n const batchPromises = batch.map(async ({ track, preloadStartSample, preloadEndSample }) => {\n try {\n await preloadMP4_BasedOnSampleRange(track, preloadStartSample, preloadEndSample);\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: true\n };\n } catch (error) {\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n });\n \n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_timeEnd(timeSignature);\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_log(`%c${timeSignature} ^ See Time Logged Above`, 'color: #00ff00; font-weight: bold');\n return results;\n}\n\n/**\n * Preload MP4s based on Beat Grid Index\n * All the Moof Box will be downloaded separately\n * \n * @param tracks \n * @returns \n */\nexport const preloadMP4s_BasedOnBeatGridIndex = async (tracks: {track: ITrackForSequence, beatStartIndex: number, beatEndIndex: number}[]): Promise<PreloadResult[]> => {\n if (!Array.isArray(tracks) || tracks.length === 0) {\n throw new Error('tracks must be a non-empty array');\n }\n\n const uniqueId = Math.random().toString(36).substring(2, 8);\n const timeSignature = `preloading [${tracks.length} tracks] ${uniqueId}`;\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_time(timeSignature);\n\n // Process tracks in batches of 3 to prevent overwhelming the system\n const batchSize = 3;\n const results: PreloadResult[] = [];\n \n for (let i = 0; i < tracks.length; i += batchSize) {\n const batch = tracks.slice(i, i + batchSize);\n const batchPromises = batch.map(async ({ track, beatStartIndex, beatEndIndex }) => {\n try {\n const preloadStartSample = track.beats[beatStartIndex].frame;\n\n // calculate the last frame\n const endingIndex = (beatEndIndex + 1 >= track.beats.length) ? track.beats.length - 1 : beatEndIndex + 1;\n const preloadEndSample = track.beats[endingIndex].frame - 1;\n\n await preloadMP4_BasedOnSampleRange(track, preloadStartSample, preloadEndSample);\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: true\n };\n } catch (error) {\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n });\n \n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_timeEnd(timeSignature);\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_log(`%c${timeSignature} ^ See Time Logged Above`, 'color: #00ff00; font-weight: bold');\n return results;\n}\n\n/**\n * Preload MP4s based on Beat Grid Index\n * All the Moof Box will be downloaded separately\n * \n * @param tracks \n * @returns \n */\nexport const preloadMP4s_BasedOnTime = async (tracks: {track: ITrackForSequence, startTime: number, endTime: number}[]): Promise<PreloadResult[]> => {\n if (!Array.isArray(tracks) || tracks.length === 0) {\n throw new Error('tracks must be a non-empty array');\n }\n\n const uniqueId = Math.random().toString(36).substring(2, 8);\n const timeSignature = `preloading [${tracks.length} tracks] ${uniqueId}`;\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_time(timeSignature);\n\n // Process tracks in batches of 3 to prevent overwhelming the system\n const batchSize = 3;\n const results: PreloadResult[] = [];\n \n for (let i = 0; i < tracks.length; i += batchSize) {\n const batch = tracks.slice(i, i + batchSize);\n const batchPromises = batch.map(async ({ track, startTime, endTime }) => {\n try {\n const preloadStartSample = startTime * SAMPLE_RATE;\n const preloadEndSample = endTime * SAMPLE_RATE;\n\n await preloadMP4_BasedOnSampleRange(track, preloadStartSample, preloadEndSample);\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: true\n };\n } catch (error) {\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n });\n \n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_timeEnd(timeSignature);\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_log(`%c${timeSignature} ^ See Time Logged Above`, 'color: #00ff00; font-weight: bold');\n return results;\n}\n\n// the promise returned contains the results of await preloadMp4_IsInitialsed, but it does not mean all of them succeed\n// note the MP4 might still be a flawed one, tail is resolved but segments not correct\nexport const preloadMP4s_OnlyCheckIfInitialised = async (tracks: {track: ITrackForSequence}[]): Promise<PreloadResult[]> => {\n if (!Array.isArray(tracks) || tracks.length === 0) {\n throw new Error('tracks must be a non-empty array');\n }\n\n const uniqueId = Math.random().toString(36).substring(2, 8);\n const timeSignature = `preloading [${tracks.length} tracks] ${uniqueId}`;\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_time(timeSignature);\n\n // Process tracks in batches of 3 to prevent overwhelming the system\n const batchSize = 3;\n const results: PreloadResult[] = [];\n \n for (let i = 0; i < tracks.length; i += batchSize) {\n const batch = tracks.slice(i, i + batchSize);\n const batchPromises = batch.map(async ({ track }) => {\n try {\n await preloadMP4_IsInitialsed(track);\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: true\n };\n } catch (error) {\n return {\n trackId: track.trackId,\n trackName: track.name,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n });\n \n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_timeEnd(timeSignature);\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) _PRELOAD_log(`%c${timeSignature} ^ See Time Logged Above`, 'color: #00ff00; font-weight: bold');\n return results;\n}","import { AEV3Controller } from \"../global-aev3-controller\";\nimport { ITrackForSequence } from \"../interface\";\nimport { preloadMP4s_OnlyCheckIfInitialised } from \"../utils/preload\";\n\n/**\n * preload the mp4 tail and check if it is valid\n * @param nextMix \n * @param nextSeed \n * @param stationId for debug purpose\n * @param stationTrackId for debug purpose \n * @param debug_index \n * @returns \n */\nexport const preloadAndValidateMP4 = async (nextMix: ITrackForSequence, nextSeed: ITrackForSequence, stationId: string, stationTrackId: string, debug_index: number): Promise<boolean> => {\n const _stationId = stationId?.toString() || '';\n const _stationTrackId = stationTrackId?.toString() || '';\n const i = debug_index;\n \n // Check if tracks exist and are not false tracks\n if (!nextMix || !nextSeed) {\n // console.error(`%cautoplay next - tracks not found in mix data ${_stationId}_${stationTrackId} for mix ${i}`, 'color: red');\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91390]`);\n throw new Error(`[code 91390] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n }\n\n if (nextMix.__falseTrack || nextSeed.__falseTrack) {\n // _DEBUG_LOAD_NEXT_MIX(`%cautoplay next - one of the two tracks are false track in mix ${i} ${_stationId}_${stationTrackId}, skipping`, 'color: orangered');\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91391]`);\n throw new Error(`[code 91391] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n }\n\n // Before assigning next mix, validate the nextMix's tracks\n const tracksValidation = await preloadMP4s_OnlyCheckIfInitialised([{track:nextSeed}, {track:nextMix}]);\n \n // _DEBUG_LOAD_NEXT_MIX(`%cautoplay await preloadMP4s_OnlyCheckIfInitialised returns for mix ${i}, ${_stationId}_${stationTrackId} (deepCloned):`, 'color: orangered;', JSON.parse(JSON.stringify({tracksValidation, nextSeed, nextMix})));\n\n const oneOfTwoTracksFailed = tracksValidation.filter((r)=>!r.success).length > 0;\n\n // bad mp4 - incorrect audio segments count, 16,15,15,2\n const badMP4Tracks = tracksValidation.filter((e)=>(e.error?.includes('Invalid audio format')));\n if (badMP4Tracks.length > 0) {\n const moreinfo = badMP4Tracks[0].error;\n throw new Error(`[code 91398] Skipping ${i} ${_stationId}/${_stationTrackId} - ${moreinfo}`); // Skip this mix and try the next one\n }\n \n let oneOfTwoTracksFailedToResolveTailsOnTime = false;\n if (oneOfTwoTracksFailed) {\n // reason failed?\n // _DEBUG_LOAD_NEXT_MIX(`%c[oneOfTwoTracksFailed] autoplay await preloadMP4s_OnlyCheckIfInitialised returns for mix ${i} ${_stationId}_${stationTrackId}(deepCloned):`, 'color: orangered;', JSON.parse(JSON.stringify({tracksValidation, nextSeed, nextMix})));\n const failedDueToBadMP4 = tracksValidation.filter((e)=>(e.error?.includes('bad MP4 not matching with beats'))).length > 0;\n if (failedDueToBadMP4 === false) oneOfTwoTracksFailedToResolveTailsOnTime = true\n }\n\n if (oneOfTwoTracksFailedToResolveTailsOnTime) {\n // _DEBUG_LOAD_NEXT_MIX(`%cautoplay next - one of the two tracks' tails cannot be resolve in 2500ms for mix ${i} ${_stationId}_${stationTrackId}, skipping`, 'color: orangered');\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91393]`);\n throw new Error(`[code 91393] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n }\n\n const nextSeedMP4 = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(nextSeed.trackId);\n const nextMixMP4 = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(nextMix.trackId);\n \n if (nextSeedMP4 && nextSeedMP4.isMP4TailFlawed) {\n // _DEBUG_LOAD_NEXT_MIX(`%cautoplay next - one of the two tracks (seed) is flawed mp4 for mix ${i} ${_stationId}_${stationTrackId}, skipping`, 'color: orangered', nextSeedMP4);\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91394]`);\n throw new Error(`[code 91394] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n } else if (nextMixMP4 && nextMixMP4.isMP4TailFlawed) {\n // _DEBUG_LOAD_NEXT_MIX(`%cautoplay next - one of the two tracks (mix) is flawed mp4 for mix ${i} ${_stationId}_${stationTrackId}, skipping`, 'color: orangered', nextMixMP4);\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91395]`);\n throw new Error(`[code 91395] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n } else if (!nextSeedMP4) {\n // _DEBUG_LOAD_NEXT_MIX(`autoplay next - mix ${i} ${_stationId}_${stationTrackId} has a seedTrack which is undefined.`)\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91396]`);\n throw new Error(`[code 91396] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n } else if (!nextMixMP4) {\n // _DEBUG_LOAD_NEXT_MIX(`autoplay next - mix ${i} ${_stationId}_${stationTrackId} has a mixTrack which is undefined.`)\n // console.warn(`Skipping ${i} ${_stationId}/${_stationTrackId} [code 91397]`);\n throw new Error(`[code 91397] Skipping ${i} ${_stationId}/${_stationTrackId}`); // Skip this mix and try the next one\n }\n\n // All validations passed\n return true;\n}","import { PLAY_MODE_CLASSIC, PLAY_MODE_CLASSIC_MIXTRACK, PLAY_MODE_DJ_MIX, PLAY_MODE_INFINITE_MIX, PLAY_MODE_MIX, PlayModes } from \"./global-aev3-controller\";\nimport type { SelectedSegmentIndice } from \"./interface\";\n\nexport const getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode = (playMode: PlayModes): 'quantised' | 'seed' | 'mix' => {\n // TODO: clean up the un-used code later\n // return true; // always play nature tempo on seedTrack\n // if ([PLAY_MODE_MIX /*, PLAY_MODE_DJ_MIX, PLAY_MODE_INFINITE_MIX*/].includes(playMode)) {\n // return 'quantised';\n // } else\n if (playMode === PLAY_MODE_CLASSIC_MIXTRACK) {\n return 'mix';\n } else {\n return 'seed';\n }\n}\n\nexport const getSegmentIndiceFromPlayMode = (playMode: PlayModes): SelectedSegmentIndice => {\n switch(playMode) {\n default:\n case PLAY_MODE_MIX:\n case PLAY_MODE_CLASSIC:\n case PLAY_MODE_CLASSIC_MIXTRACK:\n return \"normal\";\n case PLAY_MODE_INFINITE_MIX:\n return \"infinite-quick\";\n case PLAY_MODE_DJ_MIX:\n return \"infinite-dj\";\n }\n}\n\n// when creating intelliskip transition zone, the starting index for seed2 will be always 4 bars (not segment) before, and this 4 bars will be used for transition\n// this ensure when playzone starts it will always be startingIndex of the segment\nexport const segmentRequiredSpecialTreatmentAtIntelli = (segment: SelectedSegmentIndice) => {\n return [\"infinite-quick\", \"infinite-dj\"].includes(segment);\n}\n\nexport const getEnableTransitionZoneFromPlayMode = (playMode: PlayModes): boolean => {\n return [PLAY_MODE_CLASSIC, PLAY_MODE_CLASSIC_MIXTRACK, PLAY_MODE_MIX, PLAY_MODE_DJ_MIX, PLAY_MODE_INFINITE_MIX].includes(playMode);\n // return (playMode !== PLAY_MODE_CLASSIC);\n}\n\nexport const getRetainStemProfileExitingTransitionConfig = (playMode: PlayModes): boolean => {\n // return true;\n return false;\n const profiles_to_retain_stem_profile_while_exiting_transition = [PLAY_MODE_MIX];\n return profiles_to_retain_stem_profile_while_exiting_transition.includes(playMode);\n}\n\n// except the starting bar while genetics change OR transition\n// ENABLED: With optimal rubberband settings (Preserved + Balance + Faster R2 + Quality + Instant 1.0)\n// per-bar pitch compensation now works smoothly without pops!\nexport const COMPENSATE_PITCH_SHIFT_PER_BAR = true;\n\nexport const getRandomiseStemsAfterVarirantsStartPlaying = () => {\n return false;\n}","/**\n * Listen to the Event fired from AEV3Controller on assignment changed\n */\n\nimport { create } from \"zustand\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\n\n// import { ITrackForSequence } from \"../interface\";\n// import { consoleColorfulMessage4Lawful } from '../utils/colorConsole';\n\n// Zustand Store\nexport interface NextMixTransitionStorePrototypeONLY {\n seedTrackId: string;\n barIndexStart: number;\n barIndexEnd: number;\n transitionBarCount: number;\n updateNextSeedStartEndIndexNTransitionIfIdchanged: (trackId: string, barIndexStart: number, barIndexEnd: number, transitionBarCount: number) => void;\n enforceNextSeedStartEndIndex: (trackId: string, barIndexStart: number, barIndexEnd: number) => void;\n enforceNextSeedTransitionDuration: (trackId: string, barCount: number) => void;\n resetStore: () => void;\n}\n\nexport const useNextMixTransitionStore_PROTOTYPE_ONLY = create<NextMixTransitionStorePrototypeONLY>()(\n subscribeWithSelector((set, get) => ({\n seedTrackId: '',\n barIndexStart: -1,\n barIndexEnd: -1,\n transitionBarCount: -1,\n\n // TODO/FIXME: mainly in use after toggle mode, preventing it memorise former segments (in prototype, but now FE is relying on V3's fallback)\n resetStore() {\n set((/*state*/) => ({\n seedTrackId: '',\n barIndexStart: -1,\n barIndexEnd: -1,\n transitionBarCount: -1,\n }));\n },\n\n updateNextSeedStartEndIndexNTransitionIfIdchanged: (trackId: string, barIndexStart: number, barIndexEnd: number, transitionBarCount: number) => {\n const {seedTrackId} = get();\n if (seedTrackId!==trackId) {\n set((/*state*/) => ({\n seedTrackId: trackId,\n barIndexStart,\n barIndexEnd,\n transitionBarCount,\n }));\n } else {\n // do nothing\n console.log('no need to update useNextMixTransitionStore_PROTOTYPE_ONLY.updateNextSeedStartEndIndexIfIdchanged since it should be from testing');\n }\n },\n\n enforceNextSeedStartEndIndex: (trackId: string, barIndexStart: number, barIndexEnd: number) => {\n set((/*state*/) => ({\n seedTrackId: trackId,\n barIndexStart,\n barIndexEnd,\n }));\n },\n\n enforceNextSeedTransitionDuration: (trackId: string, barCount: number) => {\n set((/*state*/) => ({\n seedTrackId: trackId,\n transitionBarCount: barCount,\n }));\n },\n \n })),\n);\n\nexport default useNextMixTransitionStore_PROTOTYPE_ONLY;\n","/**\n * Slider-Based Segment Selection (Segment-Boundary-Aligned)\n *\n * Two sliders drive selection:\n * - sizeSlider (0-1): picks from segment-boundary-aligned candidate windows\n * 0 = smallest valid window, 1 = largest (full track)\n * - overlapSlider (0-4 integer): indexes into [2, 4, 8, 12, 16] bar crossfade\n *\n * Position is automatically determined: candidate windows are generated at\n * every combination of segment boundaries, scored by segment type coverage\n * (CHORUS=100, VERSE=85, etc.), and the best-scored window at each size is kept.\n *\n * Playback position can optionally constrain selection to windows starting\n * after the current playhead.\n *\n * This is a standalone prototyping / analysis utility. It does NOT replace\n * the production segment selection in segmentSelectionSimplifiedEnhanced.ts.\n */\n\n// βββ Constants βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\nconst MIN_WINDOW_BARS = 4;\nconst OVERLAP_STEPS = [1, 2, 4, 8, 12, 16] as const;\n\n/** When slider is at shortest: fixed 4-bar segment with 2-bar transition */\nconst SHORTEST_WINDOW_BARS = 4;\nconst SHORTEST_OVERLAP_BARS = 2;\n\nexport const SEGMENT_TYPES: Record<string, number> = {\n START: 0, END: 1, INTRO: 2, OUTRO: 3, BREAK: 4,\n BRIDGE: 5, INST: 6, SOLO: 7, VERSE: 8, CHORUS: 9,\n};\n\nconst SEG_SCORES: Record<number, number> = {\n 9: 100, 8: 85, 5: 70, 4: 55, 7: 45, 6: 35, 2: 15, 3: 10, 0: 5, 1: 5,\n};\n\n// βββ Types βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\nexport type SegmentInfo = [number, number, number][];\n\nexport interface CandidateWindow {\n si: number;\n ei: number;\n bars: number;\n score: number;\n /** Human-readable description of covered segment types */\n segs: string;\n}\n\nexport interface SliderInput {\n /** 0-1: picks from smallest to largest segment-aligned window */\n sizeSlider: number;\n /** 0-4 integer index into OVERLAP_STEPS [2, 4, 8, 12, 16] */\n overlapIndex: number;\n /** Beat grid (bar start timestamps). Last beat marks an incomplete bar. */\n beats: { timestamp: number }[];\n /** Segment info: [startTime, endTime, type][] */\n segmentInfo: SegmentInfo;\n /** Optional: bar index of current playback position */\n playbackBar?: number;\n /** Whether to constrain windows to contain playbackBar with 2-bar lookahead */\n constrainToPlayback?: boolean;\n /** Role in the mix: 'outgoing' (Track A) or 'incoming' (Track B) */\n role?: 'outgoing' | 'incoming';\n\n /**\n * 0β1: how much to prioritise the user's size request over segment mapping.\n * 0 = segment quality dominates (CHORUS/VERSE preferred even if further from target size).\n * 1 = size dominates (choose window closest to target bars; more continuous slider response).\n * Default 0.7 = favour continuous size control.\n */\n sizeVsSegmentWeight?: number;\n\n}\n\nexport interface SliderResult {\n window: CandidateWindow;\n overlapBars: number;\n /**\n * Bar index where the transition zone starts (outgoing role) or ends (incoming role).\n * For outgoing: last `overlapBars` bars of the window (si of transition = transitionBar).\n * For incoming: first `overlapBars` bars of the window (ei of transition = transitionBar).\n * When overlapBars is 0, equals window.ei (outgoing) or window.si (incoming).\n */\n transitionBar: number;\n allWindows: CandidateWindow[];\n /** Prepared beat timestamps (last incomplete bar removed) */\n beats: number[];\n totalBars: number;\n}\n\n// βββ Advanced mode types βββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\nexport interface AdvancedInput {\n /** Exact number of bars the user wants */\n targetBars: number;\n /** Exact transition overlap in bars */\n overlapBars: number;\n /** Beat grid (bar start timestamps). Last beat marks an incomplete bar. */\n beats: { timestamp: number }[];\n /** Segment info: [startTime, endTime, type][] */\n segmentInfo: SegmentInfo;\n /** Role in the mix: 'outgoing' (Track A) or 'incoming' (Track B) */\n role?: 'outgoing' | 'incoming';\n /**\n * Preferred segment types for where the segment should land.\n * Empty = use default scoring. Otherwise these types get heavily boosted.\n * Use SEGMENT_TYPES values, e.g. [9] for CHORUS, [9, 8] for CHORUS + VERSE.\n */\n preferredSegmentTypes?: number[];\n}\n\n// βββ Helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/** Determine which segment a bar belongs to (matches visual drawing) */\nfunction segmentAtBar(bi: number, beats: number[], segmentInfo: SegmentInfo): number | null {\n if (bi >= beats.length) return null;\n const t = beats[bi];\n for (const [st, et, tp] of segmentInfo) {\n if (t >= st - 0.01 && t < et + 0.01) return tp;\n }\n return null;\n}\n\ninterface SegRange { si: number; ei: number; type: number; }\n\nconst SEGMENT_NAMES: Record<number, string> = {\n 0: 'START', 1: 'END', 2: 'INTRO', 3: 'OUTRO', 4: 'BREAK',\n 5: 'BRIDGE', 6: 'INST', 7: 'SOLO', 8: 'VERSE', 9: 'CHORUS',\n};\n\n// βββ Build candidate windows βββββββββββββββββββββββββββββββββββββββββββββββββ\n// Boundaries are detected by walking every bar through segmentAtBar() β the\n// exact same logic that paints segment colours β so alignment is guaranteed.\n\nexport function buildCandidateWindows(\n rawBeats: { timestamp: number }[],\n segmentInfo: SegmentInfo,\n): { beats: number[]; total: number; bounds: Set<number>; windows: CandidateWindow[] } {\n const timestamps = rawBeats.map(b => b.timestamp);\n const beats = timestamps.length > 2 ? timestamps.slice(0, -1) : [...timestamps];\n const total = beats.length;\n\n if (total < 2 || !segmentInfo || segmentInfo.length === 0) {\n return {\n beats, total, bounds: new Set([0, total]),\n windows: [{ si: 0, ei: total - 1, bars: total, score: 0, segs: 'FULL' }],\n };\n }\n\n // Walk every bar to find where segment type changes (matches drawing exactly)\n const bounds: number[] = [0];\n const ranges: SegRange[] = [];\n let curType: number | null = null;\n let rangeStart = 0;\n for (let i = 0; i <= total; i++) {\n const tp = i < total ? segmentAtBar(i, beats, segmentInfo) : null;\n if (tp !== curType) {\n if (i > 0) {\n bounds.push(i);\n if (curType !== null && curType >= 0) {\n ranges.push({ si: rangeStart, ei: i, type: curType });\n }\n }\n rangeStart = i;\n curType = tp;\n }\n }\n if (bounds[bounds.length - 1] !== total) bounds.push(total);\n\n // Add sub-boundaries so we have 4-bar windows (shortest) and finer size steps.\n const extraBounds: number[] = [];\n for (let r = 0; r < ranges.length; r++) {\n const segLen = ranges[r].ei - ranges[r].si;\n if (segLen >= 8) {\n for (let b = ranges[r].si + 4; b < ranges[r].ei; b += 4) {\n extraBounds.push(b);\n }\n }\n if (segLen >= 20) {\n for (let b = ranges[r].si + 8; b < ranges[r].ei; b += 8) {\n extraBounds.push(b);\n }\n }\n }\n let allBounds = [...new Set([...bounds, ...extraBounds])].sort((a, b) => a - b);\n\n // Ensure we have 4-bar windows for shortest mode (add every 4 bars if needed)\n const hasFourBar = allBounds.some((b, i) => allBounds.some((c, j) => j > i && c - b === 4));\n if (!hasFourBar && total >= 4) {\n for (let b = 4; b < total; b += 4) extraBounds.push(b);\n allBounds = [...new Set([...bounds, ...extraBounds])].sort((a, b) => a - b);\n }\n bounds.length = 0;\n bounds.push(...allBounds);\n\n // Generate all valid windows between boundaries\n const byBars: Record<number, CandidateWindow[]> = {};\n\n for (let i = 0; i < bounds.length; i++) {\n for (let j = i + 1; j < bounds.length; j++) {\n const si = bounds[i];\n const ei = bounds[j] - 1;\n if (ei < si) continue;\n const bars = ei - si + 1;\n if (bars < MIN_WINDOW_BARS) continue;\n\n let score = 0;\n const covered: string[] = [];\n for (const r of ranges) {\n const ov = Math.max(0, Math.min(ei, r.ei - 1) - Math.max(si, r.si) + 1);\n if (ov > 0) {\n score += (SEG_SCORES[r.type] ?? 20) * (ov / bars);\n if (ov >= 2) covered.push(SEGMENT_NAMES[r.type] || '?');\n }\n }\n // Positional preference toward centre\n const rel = (si + bars / 2) / total;\n score += (1 - Math.abs(rel - 0.45)) * 12;\n\n const win: CandidateWindow = {\n si, ei, bars,\n score: Math.round(score * 10) / 10,\n segs: covered.join(' + ') || 'β',\n };\n\n if (!byBars[bars]) byBars[bars] = [];\n byBars[bars].push(win);\n }\n }\n\n // For each bar count, keep top 2 (different start positions)\n const final: CandidateWindow[] = [];\n for (const barCount of Object.keys(byBars).map(Number).sort((a, b) => a - b)) {\n const group = byBars[barCount].sort((a, b) => b.score - a.score);\n final.push(group[0]);\n if (group.length > 1 && group[1].si !== group[0].si) {\n final.push(group[1]);\n }\n }\n\n final.sort((a, b) => a.bars - b.bars || b.score - a.score);\n\n const boundsSet = new Set(bounds);\n return {\n beats, total, bounds: boundsSet,\n windows: final.length > 0\n ? final\n : [{ si: 0, ei: total - 1, bars: total, score: 0, segs: 'FULL' }],\n };\n}\n\n/**\n * Compute the bar index where the transition zone boundary sits.\n * - Outgoing: transition starts at (ei - overlapBars + 1), clamped to si.\n * - Incoming: transition ends at (si + overlapBars - 1), clamped to ei.\n * When overlapBars is 0, returns ei (outgoing) or si (incoming) β no transition zone.\n */\nfunction computeTransitionBar(\n win: CandidateWindow,\n overlapBars: number,\n role: 'outgoing' | 'incoming' = 'outgoing',\n): number {\n if (overlapBars <= 0) return role === 'outgoing' ? win.ei : win.si;\n if (role === 'incoming') return Math.min(win.ei, win.si + overlapBars - 1);\n return Math.max(win.si, win.ei - overlapBars + 1);\n}\n\n// βββ Main selection ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n/** Minimum bars between playback position and mix-out zone start */\nconst LOOKAHEAD = 2;\n\n/** Base scoring weights at sizeVsSegmentWeight=0 (segment-led) */\nconst W_SEG_BASE = 0.45;\nconst W_TX_BASE = 0.30;\nconst W_SIZE_BASE = 0.25;\n\n/** At sizeVsSegmentWeight=1, favour size proximity for continuous slider */\nconst W_SIZE_MAX = 0.70;\nconst W_SEG_MIN = 0.15;\nconst W_TX_MIN = 0.15;\n\nexport function computeSliderSegment(input: SliderInput): SliderResult {\n const {\n sizeSlider, overlapIndex, beats: rawBeats, segmentInfo,\n playbackBar, constrainToPlayback, role = 'outgoing',\n sizeVsSegmentWeight = 0.7,\n } = input;\n\n // sizeVsSegmentWeight 0β1: interpolate from segment-led to size-led weights\n const w = Math.max(0, Math.min(1, sizeVsSegmentWeight));\n const W_SIZE = W_SIZE_BASE + w * (W_SIZE_MAX - W_SIZE_BASE);\n const W_SEG = W_SEG_BASE - w * (W_SEG_BASE - W_SEG_MIN);\n const W_TX = W_TX_BASE - w * (W_TX_BASE - W_TX_MIN);\n\n const { beats, total, bounds: boundsSet, windows } = buildCandidateWindows(rawBeats, segmentInfo);\n\n // Preliminary overlap from OL_STEPS β used for constraint filtering.\n // Replaced with a proportional value once we know the target bar count.\n const olIdx = Math.max(0, Math.min(OVERLAP_STEPS.length - 1, overlapIndex));\n let overlapBars: number = OVERLAP_STEPS[olIdx];\n\n let pool = windows;\n let poolReason = 'all';\n if (constrainToPlayback && playbackBar !== undefined && playbackBar > 0) {\n const strict = windows.filter(w =>\n w.si <= playbackBar && w.ei >= playbackBar + overlapBars + LOOKAHEAD - 1\n );\n if (strict.length > 0) {\n pool = strict;\n poolReason = 'strict-playback';\n } else {\n const relaxed = windows.filter(w => w.si <= playbackBar && w.ei >= playbackBar + LOOKAHEAD);\n if (relaxed.length > 0) {\n pool = relaxed;\n poolReason = 'relaxed-playback';\n } else {\n const sorted = [...windows].sort((a, b) => {\n const distA = Math.min(Math.abs(a.si - playbackBar), Math.abs(a.ei - playbackBar));\n const distB = Math.min(Math.abs(b.si - playbackBar), Math.abs(b.ei - playbackBar));\n return distA - distB;\n });\n pool = sorted.slice(0, Math.max(3, Math.ceil(sorted.length / 2)));\n poolReason = 'nearest-fallback';\n }\n }\n }\n\n if (pool.length === 0) pool = windows;\n\n // For incoming tracks, the engine needs si >= overlapBars for the crossfade\n // pre-roll. Filter out windows that can't accommodate the transition.\n if (role === 'incoming') {\n const viable = pool.filter(w => w.si >= overlapBars);\n if (viable.length > 0) pool = viable;\n }\n\n const sorted = [...pool].sort((a, b) => a.bars - b.bars);\n\n // At extremes, force smallest/largest window directly\n if (sizeSlider >= 0.98) {\n const win = sorted[sorted.length - 1];\n return { window: win, overlapBars, transitionBar: computeTransitionBar(win, overlapBars, role), allWindows: windows, beats, totalBars: total };\n }\n if (sizeSlider <= 0.02) {\n const minBars = pool.filter(w => w.bars === SHORTEST_WINDOW_BARS);\n const win =\n minBars.length > 0\n ? minBars.sort((a, b) => b.score - a.score)[0]\n : sorted[0];\n return {\n window: win,\n overlapBars: SHORTEST_OVERLAP_BARS,\n transitionBar: computeTransitionBar(win, SHORTEST_OVERLAP_BARS, role),\n allWindows: windows,\n beats,\n totalBars: total,\n };\n }\n\n // Derive target bar count from slider\n const minB = sorted[0].bars;\n const maxB = sorted[sorted.length - 1].bars;\n const range = maxB - minB || 1;\n const targetBars = minB + sizeSlider * range;\n\n // Proportional overlap: shorter segments get a higher transition ratio.\n // 4b β 50% (2b), 8b β 38% (3b), 16b β 25% (4b), 32b+ β capped at 8b absolute.\n const overlapFraction = 0.12 + 0.38 * Math.pow(Math.max(0, 1 - (targetBars - 4) / 60), 0.8);\n const maxAbsolute = targetBars <= 16 ? Math.round(targetBars / 2) : 8;\n overlapBars = Math.max(1, Math.min(maxAbsolute, Math.round(targetBars * overlapFraction)));\n\n // Re-filter incoming pool now that overlapBars may have changed\n if (role === 'incoming') {\n const viable = pool.filter(w => w.si >= overlapBars);\n if (viable.length > 0) pool = viable;\n }\n\n const maxScore = Math.max(...pool.map(w => w.score), 1);\n\n // Rank by combined score: segment quality + transition alignment + size proximity\n let bestWin = sorted[0];\n let bestC = -Infinity;\n\n // Slight adaptive nudge: at \"short\" end, bias a bit more toward size for monotonicity\n const sizeEmphasis = 1 - sizeSlider;\n const wSize = W_SIZE + sizeEmphasis * 0.08;\n const wSeg = W_SEG - sizeEmphasis * 0.05;\n const wTx = W_TX - sizeEmphasis * 0.03;\n\n for (const w of pool) {\n const segNorm = w.score / maxScore;\n const sizeDist = Math.abs(w.bars - targetBars) / range;\n const sizeNorm = 1 - sizeDist;\n\n // Transition alignment: check across ALL overlap sizes so score is stable\n // regardless of which overlap the combined slider selects\n let txAlign = 0;\n for (const ol of OVERLAP_STEPS) {\n if (ol > w.bars) break; // overlap can't exceed window\n let align = 0;\n if (role === 'outgoing') {\n const txStart = w.ei - ol + 1;\n if (boundsSet.has(txStart)) align = 1;\n else { for (const b of boundsSet) { if (Math.abs(b - txStart) <= 1) { align = 0.5; break; } } }\n } else {\n const fullyIn = w.si + ol;\n if (boundsSet.has(fullyIn)) align = 1;\n else { for (const b of boundsSet) { if (Math.abs(b - fullyIn) <= 1) { align = 0.5; break; } } }\n }\n if (align > txAlign) txAlign = align;\n }\n\n const combined = segNorm * wSeg + sizeNorm * wSize + txAlign * wTx;\n // Tie-break: if scores are very close, prefer the window whose size is\n // closer to target. If equally close, prefer the smaller window to maintain\n // monotonic behaviour (a smaller window can't be worse when slider wants shorter).\n const isBetter =\n combined > bestC + 0.005 ||\n (Math.abs(combined - bestC) <= 0.005 && (\n Math.abs(w.bars - targetBars) < Math.abs(bestWin.bars - targetBars) - 0.5 ||\n (Math.abs(Math.abs(w.bars - targetBars) - Math.abs(bestWin.bars - targetBars)) <= 0.5 && w.bars < bestWin.bars)\n ));\n if (isBetter) {\n bestC = combined;\n bestWin = w;\n }\n }\n\n return { window: bestWin, overlapBars, transitionBar: computeTransitionBar(bestWin, overlapBars, role), allWindows: windows, beats, totalBars: total };\n}\n\n// βββ Advanced mode selection βββββββββββββββββββββββββββββββββββββββββββββββββ\n// When the user controls exact bars, overlap, and preferred segment types,\n// we bypass the slider entirely and pick the best window at (or nearest to)\n// the requested bar count, scored by preferred type coverage.\n\nexport function computeAdvancedSegment(input: AdvancedInput): SliderResult {\n const {\n targetBars: rawTarget,\n overlapBars: rawOverlap,\n beats: rawBeats,\n segmentInfo,\n role = 'outgoing',\n preferredSegmentTypes = [],\n } = input;\n\n const { beats, total, bounds: boundsSet, windows } = buildCandidateWindows(rawBeats, segmentInfo);\n\n const targetBars = Math.max(2, Math.min(total, rawTarget));\n const overlapBars = Math.max(0, Math.min(targetBars - 1, rawOverlap));\n\n if (windows.length === 0) {\n const fallback: CandidateWindow = { si: 0, ei: total - 1, bars: total, score: 0, segs: 'FULL' };\n return { window: fallback, overlapBars, transitionBar: computeTransitionBar(fallback, overlapBars, role), allWindows: windows, beats, totalBars: total };\n }\n\n // For incoming tracks, prefer windows where si >= overlapBars so the engine\n // has enough pre-roll bars for the crossfade.\n let pool = windows;\n if (role === 'incoming') {\n const viable = windows.filter(w => w.si >= overlapBars);\n if (viable.length > 0) pool = viable;\n }\n\n // Re-score windows when user has preferred types\n const hasPrefs = preferredSegmentTypes.length > 0;\n\n let bestWin = pool[0];\n let bestScore = -Infinity;\n\n for (const w of pool) {\n // Size proximity: 1 when exact match, drops off linearly\n const sizeDist = Math.abs(w.bars - targetBars) / (total || 1);\n const sizeScore = 1 - Math.min(1, sizeDist * 3);\n\n // Segment quality: use preferred types if set, otherwise default score\n let segScore: number;\n if (hasPrefs) {\n // Parse which segment types this window covers\n const coveredTypes = new Set<number>();\n for (let bi = w.si; bi <= w.ei && bi < beats.length; bi++) {\n const t = beats[bi];\n for (const [st, et, tp] of segmentInfo) {\n if (t >= st - 0.01 && t < et + 0.01) { coveredTypes.add(tp); break; }\n }\n }\n // How many of the preferred types does this window contain?\n let prefHits = 0;\n for (const pt of preferredSegmentTypes) {\n if (coveredTypes.has(pt)) prefHits++;\n }\n segScore = preferredSegmentTypes.length > 0\n ? prefHits / preferredSegmentTypes.length\n : 0;\n } else {\n // Default: use built-in score (normalised)\n const maxScore = Math.max(...windows.map(w2 => w2.score), 1);\n segScore = w.score / maxScore;\n }\n\n // Transition alignment\n let txAlign = 0;\n if (role === 'outgoing') {\n const txStart = w.ei - overlapBars + 1;\n if (boundsSet.has(txStart)) txAlign = 1;\n else { for (const b of boundsSet) { if (Math.abs(b - txStart) <= 1) { txAlign = 0.5; break; } } }\n } else {\n const fullyIn = w.si + overlapBars;\n if (boundsSet.has(fullyIn)) txAlign = 1;\n else { for (const b of boundsSet) { if (Math.abs(b - fullyIn) <= 1) { txAlign = 0.5; break; } } }\n }\n\n // Weighted: size accuracy is king in advanced mode, then segment pref, then alignment\n const combined = sizeScore * 0.55 + segScore * 0.30 + txAlign * 0.15;\n\n // Tie-break: prefer closer to exact bar count, then higher segment score\n const isBetter =\n combined > bestScore + 0.003 ||\n (Math.abs(combined - bestScore) <= 0.003 &&\n Math.abs(w.bars - targetBars) < Math.abs(bestWin.bars - targetBars));\n if (isBetter) {\n bestScore = combined;\n bestWin = w;\n }\n }\n\n return { window: bestWin, overlapBars, transitionBar: computeTransitionBar(bestWin, overlapBars, role), allWindows: windows, beats, totalBars: total };\n}\n","/**\n * Segment Slider Store\n *\n * Zustand store with two mutually-exclusive control modes:\n *\n * **Simple mode** (default): a single 0β1 slider that controls segment length.\n * 0 = full track, 1 = shortest segment. The algorithm picks the best window.\n *\n * **Advanced mode**: user picks exact bar count, exact overlap, and preferred\n * segment types. The simple slider is bypassed entirely.\n *\n * Switching between modes:\n * - Calling `setSliderValue` automatically disables advanced mode.\n * - Calling any advanced setter (`setAdvancedBars`, `setAdvancedOverlapBars`,\n * `setPreferredSegmentTypes`) automatically enables advanced mode.\n *\n * ## Usage from stem-player (front-end)\n *\n * ```ts\n * import { SegmentSliderStore } from '@kano/stem-web-audio-player';\n *\n * // Simple mode\n * SegmentSliderStore.getState().setSliderValue(0.4);\n *\n * // Advanced mode (auto-enables)\n * SegmentSliderStore.getState().setAdvancedBars(16);\n * SegmentSliderStore.getState().setAdvancedOverlapBars(4);\n * SegmentSliderStore.getState().setPreferredSegmentTypes([9, 8]); // CHORUS, VERSE\n *\n * // Toggle explicitly\n * SegmentSliderStore.getState().setUseAdvancedMode(true);\n * ```\n */\n\nimport { create } from 'zustand';\nimport {\n computeSliderSegment,\n computeAdvancedSegment,\n SliderResult,\n SegmentInfo,\n SEGMENT_TYPES,\n} from '@/utils/segmentSelectionSlider';\nimport { ITrackForSequence, SelectedSegmentIndice } from '../interface';\n\n// βββ Constants ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\nconst OL_STEPS = [1, 2, 4, 8, 12, 16] as const;\nconst MAX_OL_FROM_COMBINED = 3;\n\nconst ALL_SEGMENT_KEYS: SelectedSegmentIndice[] = [\n 'normal',\n 'infinite-quick',\n 'infinite-dj',\n];\n\nconst DEFAULT_SIZE_VS_SEGMENT_WEIGHT = 0.7;\nconst DEFAULT_ADVANCED_BARS = 16;\nconst DEFAULT_ADVANCED_OVERLAP_BARS = 4;\n\n// βββ Types ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\nexport { SEGMENT_TYPES };\n\n/**\n * All the playback data a UI (e.g. timeline) needs for a single track.\n * Returned by `getTrackPlaybackInfo()` β the single source of truth for\n * segment bounds and transition point as real timestamps.\n */\nexport interface TrackPlaybackInfo {\n /** Timestamp (seconds) where playback of this segment begins. */\n startTime: number;\n /** Timestamp (seconds) where playback of this segment ends. */\n endTime: number;\n /**\n * Timestamp (seconds) where the transition zone begins (outgoing)\n * or ends (incoming). Use this to draw transition markers.\n */\n transitionTime: number;\n /** Duration of the transition zone in seconds. */\n transitionDuration: number;\n /** Number of bars in the playback window. */\n bars: number;\n /** Number of bars in the transition overlap. */\n overlapBars: number;\n /** Bar index where transition begins (outgoing) or ends (incoming). */\n transitionBar: number;\n /** Bar index where playback starts. */\n startBar: number;\n /** Bar index where playback ends. */\n endBar: number;\n}\n\nexport interface SegmentSliderStoreState {\n // ββ Simple mode βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n /** Slider position: 0 = full track, 1 = shortest segment */\n sliderValue: number;\n /** 0β1: prioritise size (1) vs segment mapping (0). Default 0.7. */\n sizeVsSegmentWeight: number;\n\n // ββ Advanced mode βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n /** When true, advanced settings are used instead of the slider. */\n useAdvancedMode: boolean;\n /** Exact segment size in bars the user wants (advanced mode). */\n advancedBars: number;\n /** Exact transition overlap in bars (advanced mode). */\n advancedOverlapBars: number;\n /**\n * Preferred segment types for window selection (advanced mode).\n * Empty = use default scoring. Values from SEGMENT_TYPES (e.g. 9=CHORUS).\n */\n preferredSegmentTypes: number[];\n\n // ββ Setters βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n /** Set slider value (0β1). **Automatically disables advanced mode.** */\n setSliderValue: (value: number) => void;\n setSizeVsSegmentWeight: (value: number) => void;\n\n /** Toggle advanced mode on/off explicitly. */\n setUseAdvancedMode: (on: boolean) => void;\n /** Set exact bar count (4β128). **Automatically enables advanced mode.** */\n setAdvancedBars: (value: number) => void;\n /** Set exact overlap bars (0βadvancedBars-1). 0 = no transition. **Automatically enables advanced mode.** */\n setAdvancedOverlapBars: (value: number) => void;\n /** Set preferred segment types. **Automatically enables advanced mode.** */\n setPreferredSegmentTypes: (types: number[]) => void;\n\n // ββ Compute βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n computeForTrack: (\n track: Readonly<ITrackForSequence>,\n role: 'outgoing' | 'incoming',\n ) => SliderResult | null;\n\n computeAndApply: (\n track: ITrackForSequence,\n role: 'outgoing' | 'incoming',\n ) => SliderResult | null;\n\n /**\n * Single-source-of-truth helper for UIs (timeline, scrubber, transition markers).\n *\n * Returns all timestamps and bar indices the front-end needs to visualise\n * a track's playback window and transition zone β no beat-index math required.\n *\n * Returns `null` when the track lacks beats/segments.\n */\n getTrackPlaybackInfo: (\n track: Readonly<ITrackForSequence>,\n role: 'outgoing' | 'incoming',\n ) => TrackPlaybackInfo | null;\n}\n\n// βββ Store ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\nconst segmentSliderStore = create<SegmentSliderStoreState>((set, get) => ({\n // Simple mode defaults\n sliderValue: 0,\n sizeVsSegmentWeight: DEFAULT_SIZE_VS_SEGMENT_WEIGHT,\n\n // Advanced mode defaults\n useAdvancedMode: false,\n advancedBars: DEFAULT_ADVANCED_BARS,\n advancedOverlapBars: DEFAULT_ADVANCED_OVERLAP_BARS,\n preferredSegmentTypes: [],\n\n // ββ Simple setters (disable advanced) βββββββββββββββββββββββββββββββββββββ\n\n setSliderValue: (value: number) => {\n set({\n sliderValue: Math.max(0, Math.min(1, value)),\n useAdvancedMode: false,\n });\n },\n\n setSizeVsSegmentWeight: (value: number) => {\n set({ sizeVsSegmentWeight: Math.max(0, Math.min(1, value)) });\n },\n\n // ββ Advanced setters (enable advanced) ββββββββββββββββββββββββββββββββββββ\n\n setUseAdvancedMode: (on: boolean) => {\n set({ useAdvancedMode: on });\n },\n\n setAdvancedBars: (value: number) => {\n const v = Math.max(4, Math.min(128, Math.round(value)));\n set(state => ({\n advancedBars: v,\n useAdvancedMode: true,\n ...(state.advancedOverlapBars >= v ? { advancedOverlapBars: v - 1 } : {}),\n }));\n },\n\n setAdvancedOverlapBars: (value: number) => {\n const { advancedBars } = get();\n set({\n advancedOverlapBars: Math.max(0, Math.min(advancedBars - 1, Math.round(value))),\n useAdvancedMode: true,\n });\n },\n\n setPreferredSegmentTypes: (types: number[]) => {\n set({\n preferredSegmentTypes: [...types],\n useAdvancedMode: true,\n });\n },\n\n // ββ Compute βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n\n computeForTrack: (\n track: Readonly<ITrackForSequence>,\n role: 'outgoing' | 'incoming',\n ): SliderResult | null => {\n if (!track?.beats?.length || !track?.segmentInfo?.length) return null;\n\n const state = get();\n\n if (state.useAdvancedMode) {\n return computeAdvancedSegment({\n targetBars: state.advancedBars,\n overlapBars: state.advancedOverlapBars,\n beats: track.beats,\n segmentInfo: track.segmentInfo as SegmentInfo,\n role,\n preferredSegmentTypes: state.preferredSegmentTypes,\n });\n }\n\n // Simple mode\n const effectiveSize = 1 - state.sliderValue;\n const olIdx = Math.min(\n MAX_OL_FROM_COMBINED,\n Math.round(effectiveSize * (OL_STEPS.length - 1)),\n );\n\n return computeSliderSegment({\n sizeSlider: effectiveSize,\n overlapIndex: olIdx,\n beats: track.beats,\n segmentInfo: track.segmentInfo as SegmentInfo,\n constrainToPlayback: false,\n role,\n sizeVsSegmentWeight: state.sizeVsSegmentWeight,\n });\n },\n\n computeAndApply: (\n track: ITrackForSequence,\n role: 'outgoing' | 'incoming',\n ): SliderResult | null => {\n const result = get().computeForTrack(track, role);\n if (!result || !track?.indices) return result;\n\n const state = get();\n const isDefaultSimpleMode =\n !state.useAdvancedMode &&\n state.sliderValue === 0 &&\n Math.abs(state.sizeVsSegmentWeight - DEFAULT_SIZE_VS_SEGMENT_WEIGHT) < 1e-9;\n\n // Default simple mode: keep per-mode indices from playmode / server (e.g. normal vs\n // infinite-quick vs infinite-dj). computeForTrack still returns a preview window, but\n // writing it into every key would collapse that differentiation silently.\n if (isDefaultSimpleMode) {\n return result;\n }\n\n for (const key of ALL_SEGMENT_KEYS) {\n if (!track.indices[key]) continue;\n const target = track.indices[key];\n\n (target as { startingIndex: number }).startingIndex = result.window.si;\n (target as { endingIndex: number }).endingIndex = result.window.ei;\n (target as { barExepctedFromIndicesReturned: number }).barExepctedFromIndicesReturned = result.window.bars;\n (target as { recommendedTransitionLength: number }).recommendedTransitionLength = result.overlapBars;\n }\n\n return result;\n },\n\n getTrackPlaybackInfo: (\n track: Readonly<ITrackForSequence>,\n role: 'outgoing' | 'incoming',\n ): TrackPlaybackInfo | null => {\n const result = get().computeForTrack(track, role);\n if (!result) return null;\n\n const beats = track.beats;\n const { window: win, overlapBars, transitionBar } = result;\n\n const startTime = beats[win.si]?.timestamp ?? 0;\n const endTime = beats[win.ei]?.timestamp ?? beats[beats.length - 1]?.timestamp ?? 0;\n const transitionTime = beats[transitionBar]?.timestamp ?? endTime;\n\n const transitionDuration = role === 'outgoing'\n ? endTime - transitionTime\n : transitionTime - startTime;\n\n return {\n startTime,\n endTime,\n transitionTime,\n transitionDuration: Math.max(0, transitionDuration),\n bars: win.bars,\n overlapBars,\n transitionBar,\n startBar: win.si,\n endBar: win.ei,\n };\n },\n}));\n\nexport default segmentSliderStore;\n","/**\n * IMPORTANT: this is a utility only for fallback or prototype use\n *\n * It wire to a primitive UI let us change the transition duration and the start/end index of next mix\n */\n\nimport { IMixConfiguration, IOptionalCurrentTrackInfo, ITrackForSequence } from '@/stem-audio-engine-v3/interface';\nimport { getStationTracksGeneric, isStationIdLibraryArtistStation } from './fetchStationTracks';\nimport { preloadAndValidateMP4 } from '@/stem-audio-engine-v3/cache/validate-mp4-tail';\nimport { consoleColorfulMessage4Lawful } from '@/stem-audio-engine-v3/utils/colorConsole';\nimport { getSegmentIndiceFromPlayMode } from '@/stem-audio-engine-v3/playmode-matrix';\nimport { unknownThrownToString } from '@/utils/unknown-caught-error';\nimport type { PlayModes } from '@/stem-audio-engine-v3/global-aev3-controller';\nimport useNextMixTransitionStore_PROTOTYPE_ONLY from '@/stem-audio-engine-v3/store/use-next-mix-transition-prototype-explicit';\nimport segmentSliderStore from '@/stem-audio-engine-v3/store/segment-slider-store';\n\n// TODO: CURSOR DO NOT MODIFY - align the stationId with SP main branch:\n// Refer to https://github.com/KanoComputing/stem-player/blob/main/src/constants/officialStations.ts\nconst FALL_BACK_HOT_MIX_STATION_ID = '00000005-9ed8-4c92-b1fc-4058d5782719';\nconst FALL_BACK_HOT_MIX_STATION_NEXT_TRACK_DIRECTION = 'prevMixId'; // align with next mix criteria at FE\n\nfunction isAbortError(err: unknown): boolean {\n return (\n (typeof DOMException !== 'undefined' && err instanceof DOMException && err.name === 'AbortError') ||\n (err instanceof Error && err.name === 'AbortError')\n );\n}\n\nexport interface NextMixBundle {\n seedTrack: ITrackForSequence;\n mixTrack: ITrackForSequence;\n nextMixOptional: IOptionalCurrentTrackInfo;\n mixConfigShouldNotInUse: IMixConfiguration;\n fieldToUseOnAutoplayNext: 'nextMixId' | 'prevMixId';\n configuredTransitionDuration_InSeed2BarCount: number;\n seedTrackStartingIndex: number;\n seedTrackEndingIndex: number;\n mixTrackStartingIndex: number;\n mixTrackEndingIndex: number;\n}\n\n/** Distinguishes intentional cancellation (abort / superseded resolve) from a successful bundle. Errors still throw. */\nexport type GetNextMixUtilsResult = { kind: 'ok'; bundle: NextMixBundle } | { kind: 'cancelled' };\n\nexport const getNextMixUtils = async (\n direction: 'nextMixId' | 'prevMixId',\n mixObject: IOptionalCurrentTrackInfo,\n token: string,\n currentSeedTrackId: string | undefined,\n currentMixTrackId: string | undefined,\n currentMixTrack: ITrackForSequence | undefined,\n audioEngineInternalPlayMode: PlayModes,\n abortController?: AbortController,\n): Promise<GetNextMixUtilsResult> => {\n // return getNextMixUtils_intecepted(direction, mixObject, token, currentSeedTrackId, currentMixTrackId);\n\n // console.log(`%cπππ getNextMixUtils with current Seed: ${currentSeedTrackId} (MixId: ${mixObject.__signature_mixId_relatedToSeed}), Mix: ${currentMixTrackId} (MixId: ${mixObject.__signature_mixId_relatedToSeed})`, 'color: turquoise');\n consoleColorfulMessage4Lawful(`[202603] getNextMixUtils(), prototype version`, '#ff0000', '#ff0000', 8, 'π');\n\n try {\n // console.log(mixObject, mixObject?.[AUTOPLAY_NEXT_MIX_DIRECTION]);\n\n // console.log(`π trigger assign next mix, because \\n\n // 1. nextMix_mixId == undefined,\\n\n // 2. \\n\n // `);\n // console.log(`π mixObject found and the only thing it need is mixId (fallback will use hot-mixes)`, mixObject);\n\n if (mixObject) {\n // NOTE\n const result = await loadNextStationTracks(\n mixObject as { stationTrackId: string; mixPosition?: number },\n direction,\n mixObject.stationId,\n token,\n abortController,\n );\n if (result === null) {\n return { kind: 'cancelled' };\n }\n console.log('autoplay loadNextMixJSON resolved', result);\n\n const { nextMix: nextMixTrack, nextSeed: nextSeedTrack, stationTrackId, stationId, isFallback, position } = result;\n let fieldToUseOnAutoplayNext = direction;\n if (isFallback) {\n fieldToUseOnAutoplayNext = FALL_BACK_HOT_MIX_STATION_NEXT_TRACK_DIRECTION; // align with the direction used in fetch next mix call\n }\n\n const mixPosition = position;\n\n // this one if going to resolve here, going to create many redundant call inside AEV3, and more calls in between only increase failure rate of appending sequence on time\n // think shouldn't even be kept in audio engine except loadAndPlay[Classic|Mix|DJ|Quick]\n // in order to make this work, it is similar to make up a controller sitting here in between of major procedures and await here\n // if it fails - audio has to stop\n const mixConfigShouldNotInUse: IMixConfiguration = { stemProfile: 'v', stemVolumes: [1, 1, 1, 1] };\n\n const nextMixOptional = {\n stationId: !isFallback ? stationId : FALL_BACK_HOT_MIX_STATION_ID,\n stationTrackId: stationTrackId,\n // nextStationTrackId: mix.nextMix.mixId,\n // prevMixId: mix.prevMix.mixId,\n mixPosition: mixPosition,\n };\n\n let nextSeedTrack_resolvedVariantsFactor: ITrackForSequence = nextSeedTrack;\n if (currentMixTrackId !== nextSeedTrack.trackId) {\n if (!currentMixTrack) {\n throw new Error('getNextMixUtils: currentMixTrack required when seed id differs from current mix track id');\n }\n nextSeedTrack_resolvedVariantsFactor = currentMixTrack;\n }\n\n const segmentToUse = getSegmentIndiceFromPlayMode(audioEngineInternalPlayMode);\n\n // Segment slider: computeAndApply mutates track.indices only when advanced mode is on,\n // or simple-mode slider/weight differs from defaults (see segment-slider-store).\n segmentSliderStore.getState().computeAndApply(nextSeedTrack_resolvedVariantsFactor, 'outgoing');\n segmentSliderStore.getState().computeAndApply(nextMixTrack, 'incoming');\n\n let configuredTransitionDuration_InSeed2BarCount = 8;\n let seedTrackStartingIndex = nextSeedTrack_resolvedVariantsFactor.indices[segmentToUse].startingIndex;\n let seedTrackEndingIndex = nextSeedTrack_resolvedVariantsFactor.indices[segmentToUse].endingIndex;\n let mixTrackStartingIndex = nextMixTrack.indices[segmentToUse].startingIndex;\n let mixTrackEndingIndex = nextMixTrack.indices[segmentToUse].endingIndex;\n\n // IF trackId of next seed the same:\n // override with following in prototype if something changed\n if (useNextMixTransitionStore_PROTOTYPE_ONLY.getState().seedTrackId === nextSeedTrack.trackId) {\n console.table({\n seedTrackId: useNextMixTransitionStore_PROTOTYPE_ONLY.getState().seedTrackId,\n barIndexStart: useNextMixTransitionStore_PROTOTYPE_ONLY.getState().barIndexStart,\n barIndexEnd: useNextMixTransitionStore_PROTOTYPE_ONLY.getState().barIndexEnd,\n });\n configuredTransitionDuration_InSeed2BarCount = useNextMixTransitionStore_PROTOTYPE_ONLY.getState().transitionBarCount;\n seedTrackStartingIndex = useNextMixTransitionStore_PROTOTYPE_ONLY.getState().barIndexStart;\n seedTrackEndingIndex = useNextMixTransitionStore_PROTOTYPE_ONLY.getState().barIndexEnd;\n mixTrackStartingIndex = nextMixTrack.indices[segmentToUse].startingIndex;\n mixTrackEndingIndex = nextMixTrack.indices[segmentToUse].endingIndex;\n }\n\n /**\n * extract this and wire to SLIDER\n * IMPORTANT: this is prototype use only, Frontend should implement this with the slider\n *\n * END\n */\n\n if (abortController?.signal.aborted) {\n return { kind: 'cancelled' };\n }\n\n return {\n kind: 'ok',\n bundle: {\n seedTrack: nextSeedTrack_resolvedVariantsFactor,\n mixTrack: nextMixTrack,\n nextMixOptional,\n mixConfigShouldNotInUse,\n fieldToUseOnAutoplayNext,\n configuredTransitionDuration_InSeed2BarCount,\n seedTrackStartingIndex,\n seedTrackEndingIndex,\n mixTrackStartingIndex,\n mixTrackEndingIndex,\n },\n };\n // return {seedTrack: AEV3Controller.getInstance().getCurrentMixTrackObject(), mixTrack: seedTracks[0], nextMixOptional, mixConfigShouldNotInUse, fieldToUseOnAutoplayNext}\n } else {\n throw Error('autoplay - assignNextMix has no new mix object config');\n }\n } catch (err) {\n if (abortController?.signal.aborted || isAbortError(err)) {\n return { kind: 'cancelled' };\n }\n console.error(err);\n throw err;\n }\n};\n\ntype LoadNextStationTracksResult = {\n nextMix: ITrackForSequence;\n nextSeed: ITrackForSequence;\n stationTrackId: string;\n stationId: string;\n position: number;\n isFallback: boolean;\n};\n\nconst loadNextStationTracks = async (\n mixObj: {\n stationTrackId: string;\n mixPosition?: number;\n },\n direction: 'prevMixId' | 'nextMixId',\n stationId: string | undefined,\n token: string,\n abortController?: AbortController,\n retryCount = 0,\n maximumRetry = 2,\n): Promise<LoadNextStationTracksResult | null> => {\n if (abortController?.signal.aborted) {\n return null;\n }\n\n let isFallback = false;\n\n // at platform seems they can provide a stationId: undefined when playing something, as a fallback I continue the next track from hot-mixes station\n if (!stationId) {\n stationId = FALL_BACK_HOT_MIX_STATION_ID;\n direction = FALL_BACK_HOT_MIX_STATION_NEXT_TRACK_DIRECTION;\n isFallback = true;\n }\n\n const _DEBUG_LOAD_NEXT_MIX = (...data: unknown[]) => {\n return;\n console.log(...data);\n };\n\n if (token) {\n const stationTrackId = mixObj.stationTrackId;\n // const mixPosition = mixObj?.mixPosition || -1\n _DEBUG_LOAD_NEXT_MIX(stationTrackId);\n let nextMixObject: Awaited<ReturnType<typeof getStationTracksGeneric>>;\n try {\n nextMixObject = await getStationTracksGeneric(token, stationId, 4, direction, true, 'stationTrackId', stationTrackId, abortController);\n } catch (err) {\n if (abortController?.signal.aborted || isAbortError(err)) {\n return null;\n }\n throw err;\n }\n\n if (abortController?.signal.aborted) {\n return null;\n }\n\n if (nextMixObject) {\n const stations = nextMixObject?.data?.stations;\n if (!stations || stations.length === 0) {\n if (retryCount < maximumRetry) {\n console.error(`%cautoplay next - No stations found ${stationId} .. ${stationTrackId}, try again`, 'color: orangered');\n return loadNextStationTracks(mixObj, direction, stationId, token, abortController, retryCount + 1, maximumRetry);\n }\n throw Error('autoplay next - failed to resolve next mix stations');\n }\n\n const station = stations[0];\n let nextTracks = station?.nextTracks;\n\n if (!nextTracks) {\n throw Error('autoplay next - failed to resolve next mix');\n }\n\n if (nextTracks.length <= 1) {\n // fall back plan using\n try {\n let nextMixObject_fallback: Awaited<ReturnType<typeof getStationTracksGeneric>>;\n try {\n nextMixObject_fallback = await getStationTracksGeneric(token, stationId, 4, direction, true, 'position', 0, abortController);\n } catch (err) {\n if (abortController?.signal.aborted || isAbortError(err)) {\n return null;\n }\n throw err;\n }\n if (abortController?.signal.aborted) {\n return null;\n }\n const nextTracks_fallback = nextMixObject_fallback?.data?.stations?.[0]?.nextTracks;\n if (nextTracks_fallback) {\n if (nextTracks_fallback.length === 0) {\n throw Error('empty track returned');\n } else {\n nextTracks = [...nextTracks, ...nextTracks_fallback];\n }\n }\n } catch (err) {\n console.log(err);\n throw Error('autoplay next - failed to resolve next mix, this is last mix of the station and failed to fetch first few tracks from this station');\n }\n }\n\n if (nextTracks.length === 0) {\n // fail?\n throw Error('autoplay next - failed to resolve next mix, this is last mix of the station...');\n }\n\n // current mix position\n // mixes = mixes.filter((m)=>m.mixPosition!==mixPosition);\n // if (!mixes || mixes.length === 0) {\n // throw Error('autoplay next - failed to resolve next mix, this is last mix of the station (2)');\n // }\n if (isStationIdLibraryArtistStation(stationId)) {\n // ascending\n nextTracks = nextTracks.sort((a, b) => {\n const aPos = !isNaN(a.position * 1) ? a.position * 1 : -1;\n const bPos = !isNaN(b.position * 1) ? b.position * 1 : -1;\n return aPos - bPos;\n });\n }\n\n // Validate all mixes in the response\n for (let i = 0; i < nextTracks.length - 1; i++) {\n if (abortController?.signal.aborted) {\n return null;\n }\n const _nextTrack = nextTracks[i].track;\n const position = nextTracks[i].position;\n const _stationTrackId = nextTracks[i]?.stationTrackId;\n const _stationId = station.stationId;\n const nextSeed = _nextTrack;\n const nextMix = nextTracks[i + 1].track;\n\n _DEBUG_LOAD_NEXT_MIX(`Validating mix ${i}:`, nextTracks, nextMix, nextSeed);\n\n try {\n await preloadAndValidateMP4(nextMix, nextSeed, _stationId, _stationTrackId, i);\n } catch (err) {\n console.warn(`LoadNextMixError - Invalid audio data ${unknownThrownToString(err)}`);\n continue;\n }\n\n _DEBUG_LOAD_NEXT_MIX(`%cautoplay next - found valid mix at index ${i} ${_stationId}_${stationTrackId}`, 'color: green', nextTracks);\n return { nextMix, nextSeed, stationTrackId: _stationTrackId, stationId, position, isFallback };\n }\n\n throw Error('autoplay next - no valid mixes within 3 mixes');\n } else {\n if (retryCount < maximumRetry) {\n console.error(`%cautoplay next - Failed to fetch mix data ${stationTrackId}, try again`, 'color: orangered');\n return loadNextStationTracks(mixObj, direction, stationId, token, abortController, retryCount + 1, maximumRetry);\n }\n throw Error('autoplay next - failed to resolve next mix');\n }\n } else {\n throw Error('autoplay next - no token');\n }\n};\n","import { getNextMixUtils } from '@/services/get-next-mix-util';\nexport class AEV3Config {\n private accessToken: string | null = null;\n\n // Static variable to hold the single instance\n private static instance: AEV3Config;\n\n static getInstance(): AEV3Config {\n // If instance does not exist, create it\n if (!AEV3Config.instance) {\n AEV3Config.instance = new AEV3Config();\n }\n return AEV3Config.instance;\n }\n\n setAccessToken(token: string | null) {\n this.accessToken = token;\n }\n\n getAccessToken(): string | null {\n return this.accessToken;\n }\n\n nextMixUtils: typeof getNextMixUtils | null = getNextMixUtils;\n\n getNextTracksResolver() {\n if (this.nextMixUtils === null) {\n console.info('using fallback next track resolver.');\n }\n return this.nextMixUtils || getNextMixUtils;\n }\n\n setNextTrackResolver(nextMixUtils: typeof getNextMixUtils) {\n this.nextMixUtils = nextMixUtils;\n }\n\n useFallbackResolver() {\n this.nextMixUtils = getNextMixUtils;\n }\n}\n","import { AEV3Config } from \"../aev3-env-config\";\nimport { ByteSampleSegment } from \"./mp4\";\nimport { unknownThrownToString } from '@/utils/unknown-caught-error';\n\nconst ENABLE_LOGGING_OF_FETCH_SEGMENT_HEADERS = false;\n\n// Enable ETag validation for range requests using If-Range header\n// When enabled, if the file changes on CDN between tail fetch and segment fetch,\n// we detect it and throw ETagMismatchError\n// NOTE: Requires CloudFront to allow 'If-Range' in Access-Control-Allow-Headers\n// Set to false until CloudFront CORS is configured to allow If-Range header\n\n// IMPORTANT, if this is enabled, disk cache no longer being use, \n// so we need another way to refetch when etags are diff\nconst ENABLE_ETAG_VALIDATION = false;\nexport interface ByteSampleSegmentLoaded extends ByteSampleSegment {\n arrayBuffer: ArrayBuffer;\n cacheTimeMS: number;\n cacheStartTime: number;\n}\n\nexport type SingleArrayBufferLoadingPercent = {\n percent: number,\n signature: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n optionalSingature: any,\n}\n\nexport type FetchGroupErrorCause = {\n detailMessage:string;\n http_status:number;\n segmentIdx:number;\n sequenceId:number;\n sequenceIdx:number;\n type:'mp4';\n url:string;\n}\n\n// Custom error class for ETag mismatch (412 Precondition Failed)\nexport class ETagMismatchError extends Error {\n constructor(message: string, public url: string, public expectedETag: string | undefined) {\n super(message);\n this.name = 'ETagMismatchError';\n }\n}\n\nexport const fetchSegment = async (\n chunk: ByteSampleSegment,\n retryCount: number = 3, // Default to 3 retries if not provided,\n expectedETag?: string, // ETag from tail fetch - use If-Match to validate file hasn't changed\n expectedLastModifiedDate?: string,\n expectedDate?: string,\n diffETagDetected?: boolean,\n // eventName: {\n // onIndividualChunkProgress: string;\n // onChunkGroupProgress: string;\n // },\n // dispatchEvent: (eventName: string, detail: unknown) => void = null,\n): Promise<[ArrayBuffer, string, string, string]> => {\n // let error_detected: boolean = false;\n // const startTime: number = Date.now();\n\n // Helper function to retry fetching a chunk\n\n const authToken = AEV3Config.getInstance().getAccessToken();\n const appendDebugString = true;\n\n // if (diffETagDetected) {\n // console.log('ffs FETCHING with tail: '+ chunk.path, `${chunk.byteRangeStart}-${chunk.byteRangeEnd}` + expectedETag?.replaceAll('\"', ''));\n // } else {\n // console.log('FETCHING '+ chunk.path, `${chunk.byteRangeStart}-${chunk.byteRangeEnd}`);\n // }\n \n const fetchWithRetry = async (url: string, signature: string, retriesLeft: number, byteRangeStart: number, byteRangeEnd: number, optionalSingature: {sequenceIdx: number, sequenceId: string, segmentIdx: number}, retryIncompleteSegment: boolean = false): Promise<[ArrayBuffer, string, string, string]> => {\n try {\n // console.log(`Starting to load stem: ${signature}, ${byteRangeStart}-${byteRangeEnd}`, optionalSingature);\n\n // snippet to add segmentIdx to the URL:\n // const response = await fetch(`${url}?idx=${optionalSingature?.signatures.segmentIdx||-1}`, {\n\n const sequenceAndChunk: string = `c${optionalSingature.segmentIdx}`;\n \n // Build headers with optional If-Range for ETag validation\n // - If ETag matches: returns 206 Partial Content (normal range response)\n // - If ETag differs: return 412 error\n // This is more graceful than If-Match which returns 412 error\n \n const buildHeaders = (includeNoCache: boolean = false): HeadersInit => {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${authToken}`,\n 'Range': `bytes=${byteRangeStart}-${byteRangeEnd}`,\n 'Connection': 'keep-alive',\n };\n // Add If-Range header if ETag validation is enabled and we have an ETag\n // This validates the file hasn't changed since we fetched the MFRA/TFRA offsets\n if (diffETagDetected && expectedETag) {\n // headers['if-none-match'] = expectedETag.replaceAll('\"', '');\n // headers['if-modified-since'] = 'Tue, 27 Jan 2024 16:21:36 GMT';\n // console.log('ffs fetching with IF NONE MATCH MANUALLY', expectedETag.replaceAll('\"', ''));\n }\n\n // can actually ride on this send something if cloudfront needs\n if (includeNoCache) {\n headers['Cache-Control'] = 'no-cache';\n }\n \n return headers;\n };\n // debugger;\n \n const ac = new AbortController();\n const _url: string = url;\n const _fetchOptions: RequestInit = {\n // MDN\n // no-store: The browser fetches the resource from the remote server without first looking in the cache, and will not update the cache with the downloaded resource.\n // no-cache: If there is a match, fresh or stale, the browser will make a conditional request to the remote server. If the server indicates that the resource has not changed, it will be returned from the cache. Otherwise the resource will be downloaded from the server and the cache will be updated.\n // If there is no match, the browser will make a normal request, and will update the cache with the downloaded resource.\n cache: \"no-cache\", \n headers: buildHeaders(diffETagDetected || retryIncompleteSegment),\n signal: ac.signal,\n };\n // console.log(_fetchOptions);\n const response = await fetch(_url, _fetchOptions);\n \n // Handle If-Range ETag mismatch detection (only when feature is enabled)\n // When using If-Range with an ETag:\n // - 206 Partial Content = ETag matched, got the range we requested β\n // - 200 OK = ETag didn't match, server returned FULL file instead\n // If we expected a range (206) but got 412, the file changed\n if (ENABLE_ETAG_VALIDATION && expectedETag && response.status === 412) {\n // Server returned full file because ETag didn't match\n // This means the file changed since we fetched the tail/MFRA offsets\n const etag = getETag(response.headers);\n throw new ETagMismatchError(\n `File changed since tail fetch (If-Match returned full file)`,\n url,\n `expected: ${expectedETag}, actual: ${etag}`,\n );\n }\n\n // debugger;\n if (!response.ok) {\n const errStr = `Failed to fetch audio chunk`;\n const detailMessage = '';\n throw new Error(errStr, {cause: {type:'mp4', http_status: response.status, url, detailMessage, ...optionalSingature}});\n }\n\n // Only treat 200 as \"full file returned instead of range\" β do not treat 4xx/5xx the same way\n if (response.status === 200) {\n console.log(`Aborting.... ${url} ${chunk.byteRangeStart}-${chunk.byteRangeEnd}` , response.status);\n ac.abort(); // stop downloading more\n throw new Error(\"Range request not honored (got full content).\");\n }\n \n // Convert Headers to plain object for logging (Headers object doesn't serialize well)\n // NOTE: Due to CORS restrictions, JavaScript can only access headers that are:\n // 1. \"Simple\" headers (Cache-Control, Content-Length, Content-Type, Last-Modified, etc.)\n // 2. Headers explicitly exposed via Access-Control-Expose-Headers\n // Headers like 'etag', 'age', 'server-timing', 'via', 'x-amz-*' may not be accessible\n // even though they appear in Chrome DevTools Network tab\n // \n // In Node.js, there are NO CORS restrictions - you can access ALL headers.\n // This is why you can see all headers in Node.js but only some in browser JavaScript.\n // const exposedHeaders = response.headers.get('Access-Control-Expose-Headers');\n // console.log('Access-Control-Expose-Headers', exposedHeaders);\n\n if (ENABLE_LOGGING_OF_FETCH_SEGMENT_HEADERS) {\n const headersObj = getResponseHeaders(response.headers);\n console.log(`${getMp4PrintUrl(_url)} : ` + JSON.stringify(headersObj));\n // Content-Range\n /*\n {\"access-control-allow-origin\":\"*\",\n \"access-control-expose-headers\":\"*\",\n \"age\":\"2080287\",\n \"alt-svc\":\"h3=\\\":443\\\"; ma=86400\",\n \"cache-control\":\"max-age=7776000\",\n \"content-length\":\"301481\",\n \"content-range\":\"bytes 3313830-3615310/6602827\",\n \"content-type\":\"audio/mp4\",\n \"cross-origin-resource-policy\":\"cross-origin\",\n \"date\":\"Mon, 05 Jan 2026 12:57:14 GMT\",\n \"etag\":\"\\\"d56c349bb1e6e296fa7f11a5db4714b3\\\"\",\n \"last-modified\":\"Tue, 09 Dec 2025 18:09:24 GMT\",\n \"server\":\"AmazonS3\",\n \"server-timing\":\"cdn-cache-hit,cdn-pop;desc=\\\"LHR5-P6\\\",\n cdn-hit-layer;desc=\\\"EDGE\\\",\n cdn-rid;desc=\\\"uyo9cpd8Vbhe3euDPEZ_jyWJg2vsQHXAC9fSndHrpI5sIBNBanCazw==\\\",\n cdn-downstream-fbl;dur=4\",\n \"via\":\"1.1 ca53f639bef01f344039a9cea8b984e6.cloudfront.net (CloudFront)\",\n \"x-amz-cf-id\":\"uyo9cpd8Vbhe3euDPEZ_jyWJg2vsQHXAC9fSndHrpI5sIBNBanCazw==\",\n \"x-amz-cf-pop\":\"LHR5-P6\",\n \"x-amz-server-side-encryption\":\"AES256\",\n \"x-cache\":\"Hit from cloudfront\"}\n */\n }\n\n const etag = getETag(response.headers);\n const lastModified = getHeaderField(response.headers, 'last-modified');\n const date = getHeaderField(response.headers, 'date');\n // Validate HTTP status for range requests\n if (response.status !== 206 && response.status !== 200) {\n const errStr = `Invalid HTTP status for range request`;\n const detailMessage = '';\n throw new Error(errStr, {cause: {type:'mp4', http_status: response.status, url, detailMessage, ...optionalSingature}});\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n // Validate that we received the complete range (body can be truncated vs Content-Length in transit)\n const expectedSize = byteRangeEnd - byteRangeStart + 1;\n if (arrayBuffer.byteLength !== expectedSize) {\n // const randomSeed = Math.random();\n // if (arrayBuffer.byteLength !== expectedSize || randomSeed > 0.5) { // enable this instead if we want to test the mechanism to avoid using disk cache\n const eTagStringToPrint = `[expected eTag: {S: ${etag}, T: ${expectedETag}]`;\n const lastModifiedStringToPrint = `[expected last-modified: {S: ${lastModified}, T: ${expectedLastModifiedDate}]`;\n const dateStringToPrint = `[expected date: {S: ${date}, T: ${expectedDate}]`;\n const eTagRelated = `${eTagStringToPrint}${lastModifiedStringToPrint}${dateStringToPrint}`;\n const errStr = `Incomplete buffer`;\n const headersObj = getResponseHeaders(response.headers);\n const headerDebugStr = getHeaderDebugStr(headersObj);\n // follow up : Maybe make another request with missing range?\n // Body truncated in transit: headers say expectedSize, response.arrayBuffer() got less (connection/CDN/network).\n const detailMessage = `expected ${expectedSize} bytes, got ${arrayBuffer.byteLength} bytes for range ${byteRangeStart}-${byteRangeEnd}, ${headerDebugStr}${eTagRelated}, ${getMp4PrintUrl(_url)}`;\n console.error(errStr + '-' + detailMessage);\n throw new Error(errStr, {cause: {type:'mp4', http_status: response.status, url, detailMessage, ...optionalSingature}});\n }\n\n // Additional validation: Check for common corruption patterns\n if (arrayBuffer.byteLength === 0) {\n const eTagStringToPrint = `[expected eTag: {S: ${etag}, T: ${expectedETag}]`;\n const lastModifiedStringToPrint = `[expected last-modified: {S: ${lastModified}, T: ${expectedLastModifiedDate}]`;\n const dateStringToPrint = `[expected date: {S: ${date}, T: ${expectedDate}]`;\n const eTagRelated = `${eTagStringToPrint}${lastModifiedStringToPrint}${dateStringToPrint}`;\n const errStr = `Empty buffer received`;\n const headersObj = getResponseHeaders(response.headers);\n const headerDebugStr = getHeaderDebugStr(headersObj);\n const detailMessage = `Empty buffer received for range ${byteRangeStart}-${byteRangeEnd} - ${url}:${sequenceAndChunk}, ${headerDebugStr}${eTagRelated}, ${getMp4PrintUrl(_url)}`;\n console.error(errStr + '-' + detailMessage);\n throw new Error(errStr, {cause: {type:'mp4', http_status: response.status, url, detailMessage, ...optionalSingature}});\n }\n\n // if (etag !== expectedETag) {\n // enforcing 1 retry no matter what the retriesLeft is\n // return fetchWithRetry(url, signature, retriesLeft - 1, byteRangeStart, byteRangeEnd, optionalSingature, true, etag);\n // }\n\n // Log successful validation for debugging\n // console.log(`Validated complete buffer: ${arrayBuffer.byteLength} bytes for range ${byteRangeStart}-${byteRangeEnd}`);\n \n return [arrayBuffer, etag ?? '', lastModified ?? '', date ?? ''];\n } catch (err) {\n // console.error(`${signature} ${err.toString()}`);\n \n // Don't retry ETag mismatch - this requires refetching the tail to get new offsets\n // The caller should handle this by re-initializing the sequence\n if (err instanceof ETagMismatchError) {\n console.warn(`[ETag Mismatch] File changed since tail fetch - caller should refetch tail and retry`);\n throw err; // Escalate immediately - no retries will help\n }\n\n if (retryIncompleteSegment === false && unknownThrownToString(err).includes('Range request not honored (got full content)')) {\n console.log(`%cRange request not honored (got full content), Retry now ${url}`, 'color: red; ');\n return fetchWithRetry(url, signature, retriesLeft - 1, byteRangeStart, byteRangeEnd, optionalSingature, true);\n }\n \n /*\n // Check for specific network error patterns\n \n if (err instanceof TypeError && err.message.includes('Failed to fetch')) {\n // This covers network disconnection, DNS failures, etc.\n console.error('Network error detected:', err.message);\n }\n \n // Check for specific error messages\n if (err.message.includes('ERR_NETWORK_CHANGED') || \n err.message.includes('ERR_INTERNET_DISCONNECTED') ||\n err.message.includes('ERR_NETWORK_ACCESS_DENIED')) {\n console.error('Network connectivity issue:', err.message);\n }\n */\n\n if (retryIncompleteSegment === false && unknownThrownToString(err).includes('Incomplete buffer')) {\n // enforcing 1 retry no matter what the retriesLeft is\n return fetchWithRetry(url, signature, retriesLeft - 1, byteRangeStart, byteRangeEnd, optionalSingature, true);\n }\n\n if (retriesLeft > 0) {\n // console.warn(`Retrying ${url} (${retriesLeft} retries left)...`);\n return fetchWithRetry(url, signature, retriesLeft - 1, byteRangeStart, byteRangeEnd, optionalSingature);\n } else {\n // error_detected = true;\n // console.error(\n // `Error fetching chunk ${url} after ${retryCount} retries:`, err\n // );\n throw(err); // escalate\n // return null; // Return null to indicate failure after retries\n }\n }\n };\n\n return fetchWithRetry(chunk.path,\n `${chunk.path}[${chunk.sampleStart}:${chunk.sampleEnd}]`,\n retryCount,\n chunk.byteRangeStart,\n chunk.byteRangeEnd,\n chunk.signatures,\n );\n};\n\nexport const getResponseHeaders = (responseHeaders: Headers) => {\n const headersObj: Record<string, string> = {};\n responseHeaders.forEach((value, key) => {\n headersObj[key] = value;\n });\n return headersObj;\n}\n\nexport const getETag = (responseHeaders: Headers) => {\n // Try both case variations for ETag (header names are case-insensitive but get() is case-sensitive)\n const etag = responseHeaders?.get('Etag') || responseHeaders?.get('etag') || responseHeaders?.get('ETag');\n return etag;\n}\n\nexport const getHeaderField = (responseHeaders: Headers, field: string)=> {\n const _field = responseHeaders?.get(field);\n return _field;\n}\n\nconst getHeaderDebugStr = (headersObj: Record<string, string>) => {\n let headerDebugStr = '';\n Object.keys(headersObj).forEach((k)=>{\n if (['content-length', 'content-range', /*'etag',*/ 'date', 'last-modified', 'x-cache', 'x-amz-cf-id'].includes(k)) {\n headerDebugStr+=`${k}: ${headersObj[k]}, `;\n }\n });\n return headerDebugStr;\n}\nexport const getMp4PrintUrl = (_url: string) => {\n return _url.replace('https://d3aj9yujg8n59a.cloudfront.net/tracks/','');\n}","/**\n * Bivariant listener so handlers may narrow `{ type; detail }` while dispatch uses\n * `{ type: string; detail: unknown }` (required under strictFunctionTypes).\n */\nexport type EmitterListener = {\n bivarianceHack(event: { type: string; detail: unknown }): void;\n}['bivarianceHack'];\n\nexport class EventEmitter {\n events: Record<string, EmitterListener[]>;\n\n constructor() {\n this.events = {};\n }\n\n on(eventName: string, listener: EmitterListener) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(listener);\n }\n\n off(eventName: string, listener: EmitterListener) {\n if (!this.events[eventName]) return;\n const index = this.events[eventName].indexOf(listener);\n if (index !== -1) {\n this.events[eventName].splice(index, 1);\n }\n }\n\n dispatchEvent(eventName: string, detail: unknown = {}) {\n if (!this.events[eventName]) return;\n for (const listener of this.events[eventName]) {\n listener({ type: eventName, detail });\n }\n }\n\n clearEventEmitter() {\n Object.keys(this.events).forEach((k) => {\n this.events[k].splice(0, this.events[k].length);\n });\n }\n\n showListenersAttached() {\n const result: Record<string, number> = {};\n Object.keys(this.events).forEach((k) => {\n result[k] = this.events[k].length;\n });\n return result;\n }\n}\n","/**\n * MP4 TFRA Extractor\n * Extracts TFRA data from MP4 files by parsing the MFRA box\n */\n\nconst ENABLE_LOGGING_OF_FETCH_SEGMENT_HEADERS = false;\nexport class MP4TfraExtractor {\n constructor(options = {}) {\n this.options = {\n onLog: console.log,\n ...options\n };\n this.lastFoundMfraInfo = null;\n }\n \n log(message, type = 'info') {\n if (this.options.onLog) {\n // this.options.onLog(message, type);\n }\n }\n \n /**\n * Extract TFRA data from an MP4 file\n * @param {string} url - URL of the MP4 file\n * @param {number} tailSize - Size of the tail to fetch in KB\n * @param {boolean} autoIncrease - Whether to automatically increase the tail size if MFRA is not found\n * @param {boolean} diffETagDetected - Fallback when eTag of range requested segment not matched\n * @returns {Promise<Array>} - Array of TFRA data objects\n */\n async extractTfraData(url, token, tailSize = 20, autoIncrease = true, diffETagDetected = false) {\n try {\n // Convert tailSize from KB to bytes\n let tailSizeBytes = tailSize * 1024;\n let tfraResult = null;\n let mfraInfo = null;\n let iterationCount = 0;\n const MAX_ITERATIONS = 10; // Maximum number of iterations\n const MAX_TAIL_SIZE = 0.5 * 1024 * 1024; // 0.5MB maximum tail size\n \n let buffer, eTag, lastModified, date;\n \n while (!tfraResult && iterationCount < MAX_ITERATIONS && tailSizeBytes <= MAX_TAIL_SIZE) {\n iterationCount++;\n this.log(`Attempt ${iterationCount}: Trying with tail size ${(tailSizeBytes/1024).toFixed(2)}KB`, 'info');\n \n // Fetch the tail\n [buffer, eTag, lastModified, date] = await this.fetchTail(url, token, tailSizeBytes, diffETagDetected);\n\n // debugger;\n // If we previously found MFRA info but needed more data, use that info\n if (mfraInfo && tailSizeBytes >= mfraInfo.requiredSize) {\n this.log(`Using previously found MFRA info to locate MFRA in larger buffer`, 'info');\n const mfraOffset = buffer.byteLength - mfraInfo.size;\n \n if (mfraOffset >= 0 && mfraOffset + mfraInfo.size <= buffer.byteLength) {\n this.log(`MFRA should be at buffer offset ${mfraOffset}`, 'info');\n const dataView = new DataView(buffer);\n tfraResult = this.manualParseMfraBox(dataView, mfraOffset, mfraInfo.size);\n }\n }\n \n // If we still don't have a result, scan the buffer\n if (!tfraResult) {\n const scanResult = this.manualScanBufferForMfra(buffer, 0);\n \n // If we got TFRA data, use it\n if (scanResult) {\n tfraResult = scanResult;\n }\n // If we got MFRA info but need more data, store it\n else if (scanResult === null && this.lastFoundMfraInfo) {\n mfraInfo = this.lastFoundMfraInfo;\n this.log(`Found MFRA but need more data. Required size: ${mfraInfo.requiredSize/1024}KB`, 'info');\n }\n }\n \n if (!tfraResult && autoIncrease) {\n // If we have MFRA info, calculate exactly how much we need\n if (mfraInfo) {\n const requiredTailSize = mfraInfo.requiredSize;\n tailSizeBytes = Math.min(Math.max(requiredTailSize, tailSizeBytes * 1.5), MAX_TAIL_SIZE);\n this.log(`MFRA found but incomplete. Increasing tail size to ${tailSizeBytes/1024}KB to capture it`, 'warning');\n } else {\n // Double the tail size for next attempt, but don't exceed MAX_TAIL_SIZE\n const newTailSize = Math.min(tailSizeBytes * 2, MAX_TAIL_SIZE);\n this.log(`TFRA not found, increasing tail size to ${newTailSize/1024}KB`, 'warning');\n tailSizeBytes = newTailSize;\n }\n } else {\n // Either found TFRA or not using auto-increase\n break;\n }\n }\n \n // Clear the last found MFRA info\n this.lastFoundMfraInfo = null;\n \n if (!tfraResult) {\n if (iterationCount >= MAX_ITERATIONS) {\n throw new Error(`Failed to extract TFRA data after ${MAX_ITERATIONS} iterations`);\n } else if (tailSizeBytes > MAX_TAIL_SIZE) {\n throw new Error(`Failed to extract TFRA data: Maximum tail size (${MAX_TAIL_SIZE/1024}KB) reached`);\n } else {\n throw new Error('Failed to extract TFRA data');\n }\n }\n \n // Add default entries if none were found\n for (const tfra of tfraResult) {\n if (!tfra.entries || tfra.entries.length === 0) {\n this.log(`No entries found for track ${tfra.track_id}, adding default entry`, 'warning');\n \n // Add a default entry with moof_offset at the beginning of the file\n tfra.entries = [{\n time: 0,\n moof_offset: 0,\n traf_number: 1,\n trun_number: 1,\n sample_number: 1\n }];\n }\n }\n\n tfraResult.eTag = eTag;\n tfraResult.lastModified = lastModified;\n tfraResult.date = date;\n\n return tfraResult;\n } catch (error) {\n this.log(`Error extracting TFRA data: ${error.message}`, 'error');\n throw error;\n }\n }\n \n /**\n * Fetch a range of bytes from a file\n * @param {string} url - URL of the file\n * @param {number} length - Byte length, last bit of the file\n * @param {boolean} diffETagDetected - fallback need to kick in\n * @returns {Promise<ArrayBuffer>} - ArrayBuffer containing the requested bytes\n */\n async fetchTail(url, token, length, diffETagDetected) {\n // console.log(`fetching tail ${url}`, diffETagDetected)\n try {\n // const cacheBust = diffETagDetected ? `&_=${Date.now()}` : '';\n // const appendDebugString = true;\n const _url = url;\n const headers = {\n 'Authorization': `Bearer ${token}`,\n Range: `bytes=-${length}`,\n 'Connection': 'keep-alive',\n };\n if (diffETagDetected) {\n headers['Cache-Control'] = 'no-cache'; \n }\n const response = await fetch(_url, {\n // The browser looks in its HTTP cache for a response matching the request.\n // If there is a match, fresh or stale, the browser will make a conditional request to the remote server. If the server indicates that the resource has not changed, it will be returned from the cache. Otherwise the resource will be downloaded from the server and the cache will be updated.\n // If there is no match, the browser will make a normal request, and will update the cache with the downloaded resource.\n // https://developer.mozilla.org/en-US/docs/Web/API/RequestInit\n cache: \"no-cache\", \n headers\n });\n \n if (!response.ok) {\n throw new Error(`HTTP range request error: ${response.status}`);\n }\n \n // Convert headers to a regular object for better console logging\n // const headers = Object.fromEntries(response.headers.entries());\n // const contentRange = response.headers.get('Content-Range');\n\n if (ENABLE_LOGGING_OF_FETCH_SEGMENT_HEADERS) {\n let headersObj = getResponseHeaders(response.headers);\n console.log(`${getMp4PrintUrl(url)}?tail : ` + JSON.stringify(headersObj));\n headersObj = null;\n }\n\n const etag = getETag(response.headers);\n const lastModified = getHeaderField(response.headers, 'last-modified');\n const date = getHeaderField(response.headers, 'date');\n \n const buffer = await response.arrayBuffer();\n return [buffer, etag, lastModified, date];\n } catch (error) {\n this.log(`Error fetching range: ${error.message}`, 'error');\n throw error;\n }\n }\n \n manualScanBufferForMfra(buffer, fileStart) {\n try {\n const dataView = new DataView(buffer);\n \n if (buffer.byteLength >= 16) {\n const potentialMfroOffset = buffer.byteLength - 16;\n let mfroType = '';\n \n for (let i = 0; i < 4; i++) {\n mfroType += String.fromCharCode(dataView.getUint8(potentialMfroOffset + 4 + i));\n }\n \n if (mfroType === 'mfro') {\n this.log(`Found MFRO box at offset ${potentialMfroOffset}`, 'info');\n \n const mfraSize = dataView.getUint32(potentialMfroOffset + 12);\n this.log(`MFRA size from MFRO: ${mfraSize} bytes`, 'info');\n \n const absoluteMfraOffset = fileStart + potentialMfroOffset - mfraSize + 16;\n const bufferMfraOffset = potentialMfroOffset - mfraSize + 16;\n \n if (bufferMfraOffset >= 0 && bufferMfraOffset + 8 < buffer.byteLength) {\n const foundSize = dataView.getUint32(bufferMfraOffset);\n let foundType = '';\n for (let i = 0; i < 4; i++) {\n foundType += String.fromCharCode(dataView.getUint8(bufferMfraOffset + 4 + i));\n }\n \n if (foundType === 'mfra') {\n this.log(`Found MFRA box at buffer offset ${bufferMfraOffset}`, 'info');\n \n if (bufferMfraOffset + foundSize <= buffer.byteLength) {\n return this.manualParseMfraBox(dataView, bufferMfraOffset, foundSize);\n } else {\n this.lastFoundMfraInfo = {\n fileOffset: fileStart + bufferMfraOffset,\n size: foundSize,\n requiredSize: foundSize + 1024\n };\n }\n }\n }\n }\n }\n return null;\n } catch (error) {\n this.log(`Error scanning for MFRA: ${error.message}`, 'error');\n return null;\n }\n }\n \n manualParseMfraBox(dataView, offset, size) {\n try {\n const mfraStart = offset;\n const mfraEnd = offset + size;\n let currentOffset = mfraStart + 8;\n const tfraData = [];\n \n this.log(`Parsing MFRA box from offset ${offset} to ${mfraEnd}`);\n \n while (currentOffset < mfraEnd - 8) {\n const boxSize = dataView.getUint32(currentOffset);\n if (boxSize === 0 || boxSize > mfraEnd - currentOffset) {\n break;\n }\n \n let boxType = '';\n for (let i = 0; i < 4; i++) {\n boxType += String.fromCharCode(dataView.getUint8(currentOffset + 4 + i));\n }\n \n if (boxType === 'tfra') {\n this.log(`Found TFRA box at offset ${currentOffset} with size ${boxSize}`);\n \n const tfraBox = this.manualParseTfraBox(dataView, currentOffset, boxSize);\n if (tfraBox) {\n tfraData.push(tfraBox);\n }\n }\n \n currentOffset += boxSize;\n }\n \n this.log(`Parsed ${tfraData.length} TFRA boxes from MFRA`);\n return tfraData;\n } catch (error) {\n this.log(`Error parsing MFRA box: ${error.message}`, 'error');\n return null;\n }\n }\n \n manualParseTfraBox(dataView, offset, size) {\n try {\n const version = dataView.getUint8(offset + 8);\n const flags = (dataView.getUint8(offset + 9) << 16) |\n (dataView.getUint8(offset + 10) << 8) |\n dataView.getUint8(offset + 11);\n \n const trackId = dataView.getUint32(offset + 12);\n \n const lengthSizeField = dataView.getUint8(offset + 16);\n const lengthSizeTrafNum = (lengthSizeField >> 4) & 0x3;\n const lengthSizeTrunNum = (lengthSizeField >> 2) & 0x3;\n const lengthSizeSampleNum = lengthSizeField & 0x3;\n \n const entryCount = dataView.getUint32(offset + 20);\n \n this.log(`TFRA track ID: ${trackId}, version: ${version}, entries: ${entryCount}`);\n \n let entryOffset = offset + 24;\n const entries = [];\n \n for (let i = 0; i < entryCount; i++) {\n let time, moofOffset;\n \n if (version === 1) {\n time = this.readUint64(dataView, entryOffset);\n entryOffset += 8;\n \n moofOffset = this.readUint64(dataView, entryOffset);\n entryOffset += 8;\n } else {\n time = dataView.getUint32(entryOffset);\n entryOffset += 4;\n \n moofOffset = dataView.getUint32(entryOffset);\n entryOffset += 4;\n }\n \n let trafNumber = 0;\n const trafNumberSize = lengthSizeTrafNum + 1;\n for (let j = 0; j < trafNumberSize; j++) {\n trafNumber = (trafNumber << 8) | dataView.getUint8(entryOffset++);\n }\n \n let trunNumber = 0;\n const trunNumberSize = lengthSizeTrunNum + 1;\n for (let j = 0; j < trunNumberSize; j++) {\n trunNumber = (trunNumber << 8) | dataView.getUint8(entryOffset++);\n }\n \n let sampleNumber = 0;\n const sampleNumberSize = lengthSizeSampleNum + 1;\n for (let j = 0; j < sampleNumberSize; j++) {\n sampleNumber = (sampleNumber << 8) | dataView.getUint8(entryOffset++);\n }\n \n entries.push({\n time,\n moof_offset: moofOffset,\n traf_number: trafNumber,\n trun_number: trunNumber,\n sample_number: sampleNumber,\n track_id: trackId\n });\n }\n \n return {\n track_id: trackId,\n version: version,\n entries: entries\n };\n } catch (error) {\n this.log(`Error parsing TFRA box: ${error.message}`, 'error');\n return null;\n }\n }\n \n readUint64(dataView, offset) {\n const high = dataView.getUint32(offset);\n const low = dataView.getUint32(offset + 4);\n return low;\n }\n}\n\n/*\n// Export the class\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = MP4TfraExtractor;\n} else {\n window.MP4TfraExtractor = MP4TfraExtractor;\n}\n*/\n\nconst getResponseHeaders = (responseHeaders) => {\n const headersObj = {};\n responseHeaders.forEach((value, key) => {\n headersObj[key] = value;\n });\n return headersObj;\n}\n\nexport const getETag = (responseHeaders) => {\n // Try both case variations for ETag (header names are case-insensitive but get() is case-sensitive)\n const etag = responseHeaders?.get('Etag') || responseHeaders?.get('etag') || responseHeaders?.get('ETag');\n return etag;\n}\n\nexport const getHeaderField = (responseHeaders, field)=> {\n const _field = responseHeaders?.get(field);\n return _field;\n}\n\n\n/*\nconst xCache = result.headers.get(\"x-cache\");\nconst xCacheLookup = result.headers.get(\"x-cache-lookup\");\nconst xAmzCfId = result.headers.get(\"x-amz-cf-id\");\nconst age = result.headers.get(\"age\");\nconst eTag = result.headers.get(\"eTag\");\nconst cacheStatus = xCache || xCacheLookup || \"Unknown\";\n*/\nexport const getMp4PrintUrl = (_url) => {\n return _url.replace('https://d3aj9yujg8n59a.cloudfront.net/tracks/','');\n}\n","import { IAudioSourceSequence, IMP4SequenceChunk } from \"../cache/mp4-sequence\";\nimport { v4 as uuid } from 'uuid';\nimport { IStems } from \"../interface\";\nimport { STEM_FIELDS_SUPPORTED } from \"@/components/prototype-panel-v2\";\n// import { arrayBufferToText, fetchAAC, fetchWithAACWorker } from \"./fetch-with-worker\";\n\nimport {MP4TfraExtractor} from './mp4-parser/mp4-tfra-extractor';\nimport { getUnknownThrownMessage } from '@/utils/unknown-caught-error';\n\n// this is TFRA\nexport interface ByteSampleSegment {\n // note this is only the estimation\n sampleStart: number;\n sampleEnd: number;\n sampleLength: number;\n // accumulate with duration \n startTime: number;\n endTime: number;\n duration: number;\n path: string;\n byteRangeStart: number;\n byteRangeEnd: number;\n\n _mp4TrackId: number;\n tracks: {\n [_mp4TrackId: number]: {\n // withint the byte fetched\n decodeByteStart: number;\n decodeByteLength: number;\n \n // decodedAudio: AudioBuffer; // from now on we store this decoded AudioData, if it wasn't cleared, will be used at mp4-decoding-class-v2\n \n \n // instead of storing below and above, resolve the trun and mdat\n // which should be able to restore to frames each contains 1024 samples\n frames: {\n sampleStart: number;\n sampleEnds: number;\n rawData: Uint8Array;\n }[];\n // note better to have a checksum on frames.length x 1024, it should be equal to sampleLength\n \n timeLog: {\n a_extractbytes: number;\n b_extractmoof: number;\n c_packageAACFrames: number;\n }\n }\n },\n signatures: {sequenceIdx: number, sequenceId: string, segmentIdx: number}\n};\n\n// Assuming a sample rate is defined (in Hz)\nconst SAMPLE_RATE = 48000; // Example sample rate, adjust to actual audio properties\n\nexport interface TFRAEntries {\n track_id: number;\n time: number;\n moof_offset: number;\n traf_number: number;\n trun_number: number;\n sample_number: number;\n}\n\nexport interface TfraTrackDescriptor {\n track_id: number;\n version: number;\n entries: TFRAEntries[];\n}\n\n/** Per-track TFRA rows with HTTP metadata on the array (see mp4-tfra-extractor.js). */\nexport type TfraExtractResult = TfraTrackDescriptor[] & {\n eTag?: string;\n lastModified?: string;\n date?: string;\n};\n\n// this function now takes in tfraData (which can decrease the extra request from backend)\nexport function composeMP4Sequences(s: IStems, sindex: number, stemAlignedId: string, trackSignature: string, field: STEM_FIELDS_SUPPORTED, tfraData: TfraExtractResult): IAudioSourceSequence {\n const [byteSampleSegments, headerBuffer] = fetchAndParseMP4(tfraData, s[field], sindex, stemAlignedId);\n\n const sequence: IAudioSourceSequence = {\n manifest_url: '',\n segments: [],\n headerBuffer: headerBuffer ?? new ArrayBuffer(0),\n stemType: s.stemPosition,\n signature: `${trackSignature}_${s.stemPosition}`,\n sequenceId: stemAlignedId,\n };\n\n const maxLength = byteSampleSegments.length;\n let nextSegmentId = uuid();\n\n const segments: IMP4SequenceChunk[] = byteSampleSegments.map((segment, index) => {\n const currentSegmentId = nextSegmentId;\n nextSegmentId = uuid();\n const isLastSegment = index + 1 >= maxLength;\n return {\n segmentId: currentSegmentId,\n nextSegmentId: isLastSegment ? nextSegmentId : '',\n byteSampleSegment: segment,\n isLastSegment,\n cached: {\n arrayBuffer: undefined,\n cacheTimeMS: -1,\n isDownloading: false,\n cacheStartTime: -1,\n firstError: '',\n _error: [],\n },\n parent: sequence,\n };\n });\n sequence.segments = segments;\n return sequence;\n}\n\nconst fetchAndParseMP4 = (tfraData: TfraExtractResult, mp4: string, sequenceIdx: number, sequenceId: string): [ByteSampleSegment[], ArrayBuffer | undefined] => {\n \n \n // const tfraData = await extractTfraData(mp4);\n // if (!tfraData) {\n // throw Error('tfra data not found');\n // }\n\n // console.log(tfraData[0].entries[0]);\n // console.log(tfraData[0].entries[1]);\n const a = parseMP4(tfraData, sequenceIdx, sequenceId, mp4);\n // console.log(a[0]);\n\n// console.log('parsed m3u8 eq', a);\n return [a, undefined]\n}\n\nfunction parseMP4(tfraData: TfraExtractResult, sequenceIdx: number, sequenceId: string, audioSegmentPath: string): ByteSampleSegment[] {\n // debugger;\n const chunks: ByteSampleSegment[] = [];\n let chunksIdx: number = 0;\n\n let currentTime = 0;\n const SAMPLE_RATE_OF_TIME_PROP = 48000;\n const convertTo48000 = (length: number) =>{\n return Math.ceil((length / SAMPLE_RATE_OF_TIME_PROP ) * SAMPLE_RATE)\n }\n\n // let auditChunks = [];\n\n // map the AEV3's sequenceIdx to that of MP4\n let tfraTrackIndex = sequenceIdx;\n switch(sequenceIdx) {\n case 0:\n tfraTrackIndex = 2;\n break;\n case 1:\n tfraTrackIndex = 3;\n break;\n case 2:\n tfraTrackIndex = 0;\n break;\n case 3:\n tfraTrackIndex = 1;\n break;\n }\n \n // Push chunk information\n for(let i=0; i<tfraData[tfraTrackIndex].entries.length-1; i++){\n const current = tfraData[tfraTrackIndex].entries[i];\n const next = tfraData[tfraTrackIndex].entries[i+1];\n\n \n // if (next/...MP4TfraExtractor..)\n const nextTrack = tfraData[tfraTrackIndex === tfraData.length-1 ? 0 : tfraTrackIndex +1].entries[i];\n // CAUTION: following 2048 tunning is required to use the tfra parser\n // start = 0, \n // end = 89088 + 2048, \n // duration = 89088 (+2048)\n \n // start = 89088 + 2048, \n // end = 180224 + 2048,\n // duration = 180224 - 89088 (as is)\n \n // start = 180224 + 2048, \n // end = 206960 + 2048,\n // = duration = 206960 - 180224 (as is)\n const sampleLength = convertTo48000( next.time + ((i === 0) ? 2048: 0) - current.time );\n const sampleStart = convertTo48000(current.time + ((i === 0) ? 0: 2048));\n const sampleEnd = sampleStart + sampleLength - 1;\n const duration = sampleLength / SAMPLE_RATE;\n \n const track0Current = tfraData[0].entries[i];\n const track0Next = tfraData[0].entries[i+1];\n chunksIdx = i;\n\n // to the mapping to the MP4 provided\n let decodeByteLength = 0;\n let decodeByteStart = 0;\n if (tfraTrackIndex===tfraData.length-1){\n decodeByteLength = track0Next.moof_offset - current.moof_offset;\n decodeByteStart = current.moof_offset - track0Current.moof_offset;\n } else {\n decodeByteLength = nextTrack.moof_offset - current.moof_offset;\n decodeByteStart = current.moof_offset - track0Current.moof_offset;\n }\n \n const _mp4TrackId: number = tfraTrackIndex + 1;\n\n chunks.push({\n sampleStart: (sampleStart ),\n sampleEnd: (sampleEnd),\n sampleLength: (sampleLength),\n startTime: currentTime,\n duration,\n endTime: currentTime + duration,\n path: audioSegmentPath,\n _mp4TrackId,\n tracks: {\n [_mp4TrackId]: {\n decodeByteStart,\n decodeByteLength,\n // decodedAudio: undefined,\n frames: [],\n timeLog: {\n a_extractbytes: -1,\n b_extractmoof: -1,\n c_packageAACFrames: -1,\n }\n }\n },\n byteRangeStart: track0Current.moof_offset,\n byteRangeEnd: track0Next.moof_offset - 1, // starts from 0\n signatures: {\n sequenceIdx,\n sequenceId,\n segmentIdx: chunksIdx,\n }\n });\n // Update for next iteration\n // currentSampleStart = sampleEnd; // Move to the next sample start\n currentTime += duration; // Move to the next start time\n\n\n // auditChunks.push({\n // decodeByteRangeStart,\n // decodeByteRangeEnd,\n // })\n }\n\n // console.log('audit', auditChunks)\n\n return chunks;\n\n}\n\n\n\n// Step 1: Extract TFRA data\nexport const extractTfraData = async (mp4: string, token: string, diffETagDetected: boolean): Promise<TfraExtractResult | null> => {\n try {\n // Get URL and tail size\n const url = mp4.trim();\n const tailSize = 20;\n \n if (!url) {\n throw Error('Please enter a valid MP4 URL');\n }\n \n // console.log(`Extracting TFRA data from ${url}`);\n \n // Create TFRA extractor\n const tfraExtractor = new MP4TfraExtractor({\n onLog: console.log\n });\n \n // Extract TFRA data\n const tfraData = await tfraExtractor.extractTfraData(url, token, tailSize, true, diffETagDetected);\n \n if (tfraData && tfraData.length > 0) {\n // console.log(`Successfully extracted TFRA data for ${tfraData.length} tracks`);\n // console.log(tfraData);\n return tfraData;\n \n } else {\n console.log('No TFRA data found', 'warning');\n return null;\n }\n } catch (error) {\n console.log(`Error extracting TFRA data: ${getUnknownThrownMessage(error)}`, 'error');\n return null;\n } finally {\n // // Re-enable button\n // step1Btn.disabled = false;\n }\n }\n\n\nexport const isAudioFormatValid = (tfraData: TfraExtractResult, mp4PathForDebug: string) => {\n // console.log(tfraData);\n \n if (!tfraData) {\n throw Error (`Invalid audio format: ${mp4PathForDebug} - undefined`);\n }\n\n // have four tracks\n if (tfraData.length!==4) {\n throw Error (`Invalid audio format: ${mp4PathForDebug} - incorrect stem counts: ${tfraData.length}`);\n }\n\n // each track has same number of TFRAEntries\n if (!(tfraData[0]?.entries?.length===tfraData[1]?.entries?.length\n && tfraData[0]?.entries?.length===tfraData[2]?.entries?.length\n && tfraData[0]?.entries?.length===tfraData[3]?.entries?.length\n )) {\n throw Error (`Invalid audio format: ${mp4PathForDebug} - incorrect audio segments count, ${tfraData[0]?.entries?.length},${tfraData[1]?.entries?.length},${tfraData[2]?.entries?.length},${tfraData[3]?.entries?.length}`);\n }\n \n return true;\n}","export function mergeArrayBuffers(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp.buffer;\n}\n\nexport function copyAndmergeArrayBuffersVer2(buffers: ArrayBuffer[]): ArrayBuffer {\n // console.log(buffers);\n const length = buffers.reduce(function (acc, obj) { return (acc+obj.byteLength); }, 0);\n const tmp = new Uint8Array(length);\n let offset: number = 0;\n buffers.forEach((buffer)=>{\n tmp.set(new Uint8Array(buffer), offset);\n offset = offset + buffer.byteLength;\n });\n return tmp.buffer;\n // const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n // tmp.set(new Uint8Array(buffer1), 0);\n // tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n // return tmp.buffer;\n}\n\n// export function copyAndmergeUint8Array(buffers: Uint8Array[]): ArrayBuffer {\n// // console.log(buffers);\n// const length = buffers.reduce(function (acc, obj) { return (acc+obj.length); }, 0);\n// const tmp = new Uint8Array(length);\n// let offset: number = 0;\n// buffers.forEach((buffer: Uint8Array)=>{\n// tmp.set(buffer, offset);\n// offset = offset + buffer.byteLength;\n// });\n// return tmp.buffer;\n// // const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n// // tmp.set(new Uint8Array(buffer1), 0);\n// // tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n// // return tmp.buffer;\n// }\n\n/**\n * \n * @param audioBuffer Buffer Size Remains the Same: The buffer length remains unchanged, meaning the size of audioBuffer.length will still reflect the original length. However, you can use the trimmedLength to know how many samples are valid. Not Truly Resizing: JavaScriptβs AudioBuffer does not support resizing, so you're effectively marking a new \"usable range\" within the buffer rather than actually reducing its memory footprint (beyond removing the need for duplication).\n * @param n \n * @param m \n * @returns \n */\nexport const trimAudioBufferInPlace = (audioBuffer: AudioBuffer, n: number, m: number) => {\n // Ensure n and m are within the valid range\n const totalSamples = audioBuffer.length;\n if (n < 0 || m < 0 || n + m >= totalSamples) {\n throw new Error(\"Invalid values for n and m. They must not exceed the total length of the audio.\");\n }\n\n const trimmedLength = totalSamples - n - m; // Effective new length\n\n // Shift the audio data in place for each channel\n for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {\n const channelData = audioBuffer.getChannelData(channel);\n\n // Shift data from the range [n, totalSamples - m) to the beginning\n for (let i = 0; i < trimmedLength; i++) {\n channelData[i] = channelData[n + i];\n }\n\n // Optionally, zero out the leftover samples at the end\n for (let i = trimmedLength; i < totalSamples; i++) {\n channelData[i] = 0;\n }\n }\n\n return {\n audioBuffer,\n trimmedLength\n };\n};\n\nexport const trimAudioBufferAtBeginning = (audioBuffer: AudioBuffer, n: number, audioContext: AudioContext) => {\n const totalSamples = audioBuffer.length;\n const lengthToKeep = totalSamples - n;\n return trimAudioBuffer(audioBuffer, n, lengthToKeep, audioContext);\n}\n\n\nconst appendBufferAtEnd = (audioBuffer: AudioBuffer, n: number, len: number, audioContext: AudioContext) => {\n // Ensure n and m are within the valid range\n const totalSamples = audioBuffer.length;\n const length = Math.round(len);\n \n console.warn(`Requested sample range exceeds audio buffer size. Creating silent buffer. [Buffer size: ${totalSamples}, requested start: ${n}, length: ${length}]`);\n // Create a silent buffer of the requested size\n const silentBuffer = audioContext.createBuffer(\n audioBuffer.numberOfChannels,\n length,\n audioBuffer.sampleRate\n );\n \n // If we have some valid data at the beginning, copy it\n if (n < totalSamples) {\n const validSamples = totalSamples - n;\n \n // Copy the valid part of the audio\n for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {\n const sourceData = audioBuffer.getChannelData(channel);\n const targetData = silentBuffer.getChannelData(channel);\n \n // Copy the valid samples\n // for (let i = 0; i < validSamples; i++) {\n // targetData[i] = sourceData[n + i];\n // }\n targetData.set(sourceData.subarray(n, n + validSamples), 0);\n \n // The rest remains silent (zeros)\n }\n \n console.log(`Created hybrid buffer with ${validSamples} valid samples and ${length - validSamples} silent samples`);\n } else {\n console.log(`Created completely silent buffer of ${length} samples`);\n }\n return silentBuffer;\n}\n\nexport const trimAudioBuffer = (audioBuffer: AudioBuffer, start: number, len: number, audioContext: AudioContext) => {\n // console.log(`%cExtracting Bar [${Math.round(len/48)}ms] from DecodedAudio [${Math.round(audioBuffer.length/48)}ms] (efficiency: ${Math.round(1000*((len) / audioBuffer.length))/10}%)`, 'color: orange; background: black;');\n const n = Math.floor(start);\n const length = Math.round(len);\n // Ensure n and m are within the valid range\n const totalSamples = audioBuffer.length;\n \n if (n < 0 || length < 0) {\n const msge = `Invalid values for n and m. They must not exceed the total length of the audio. [samples of AB: ${totalSamples}], start: ${n}, length: ${length}`;\n throw new Error(msge);\n } else if (n + length > totalSamples) {\n return appendBufferAtEnd(audioBuffer, start, len, audioContext);\n }\n\n // Calculate the length of the new trimmed buffer\n const trimmedLength = length;\n\n // Create a new buffer with the trimmed length\n const newBuffer = audioContext.createBuffer(\n audioBuffer.numberOfChannels,\n trimmedLength,\n audioBuffer.sampleRate\n );\n\n // Copy the audio data from the original buffer to the new trimmed buffer\n for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {\n const oldChannelData = audioBuffer.getChannelData(channel);\n const newChannelData = newBuffer.getChannelData(channel);\n\n // Copy the middle portion of the original data (excluding the first n and last m samples)\n newChannelData.set(oldChannelData.subarray(n, n+trimmedLength));\n }\n\n return newBuffer;\n};\n\ntype AxisAlignedRect = { x: number; y: number; width: number; height: number };\n\nexport function isOverlap(rect1: AxisAlignedRect, rect2: AxisAlignedRect): boolean {\n // Check if one rectangle is to the left of the other\n if (rect1.x + rect1.width <= rect2.x || rect2.x + rect2.width <= rect1.x) {\n return false;\n }\n\n // Check if one rectangle is above the other\n if (rect1.y + rect1.height <= rect2.y || rect2.y + rect2.height <= rect1.y) {\n return false;\n }\n\n // If neither of the above, the rectangles must be overlapping\n return true;\n}\n\nexport const extractBytes = (ab: ArrayBuffer, byteStart: number, byteLength: number) => {\n const tmp = new Uint8Array(byteLength);\n // Copy the bytes from the source buffer to the new buffer\n // Get a view of the source buffer\n const sourceView = new Uint8Array(ab, byteStart, byteLength);\n // Copy the data\n tmp.set(sourceView);\n return tmp.buffer;\n}\n","import { trimAudioBuffer } from \"@/stem-audio-engine-v3/utils/buffer-ops\";\nimport { AEV3Controller, TrackLabelType } from \"../../global-aev3-controller\";\n// import { copyAndmergeArrayBuffersVer2 } from \"../../utils/buffer-ops\";\nimport { AudioSourceSequence } from \"@/stem-audio-engine-v3/cache/mp4-sequence\";\n\nlet ENABLE_DEBUG_OF_DECODING_MICRO_PROCESS = false;\n\nexport const toggleDecodingDebug = (enable: boolean) => {\n ENABLE_DEBUG_OF_DECODING_MICRO_PROCESS = enable;\n}\n\ntype DecodeQueueSegment = {\n frames: Uint8Array[];\n start: number;\n length: number;\n decodeQueueId: number;\n signature: string;\n};\n\nclass AudioDecoderQueueV2 {\n private queue: {\n segment: DecodeQueueSegment;\n resolve: (value: {\n audio: AudioBuffer;\n timeElapsedGlueFrames: number;\n timeElapsedDecode: number;\n timeElapsedChopSamples: number;\n decodeQueueId: number;\n }) => void;\n reject: (reason?: any) => void;\n }[];\n private processing: boolean;\n private sampleRate: number;\n private offlineContext: AudioContext;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n constructor(sampleRate: number = 48000, bufferLength: number = 48000 * 10) {\n this.sampleRate = sampleRate;\n this.queue = [];\n this.processing = false;\n // const moofExtractor = new MP4MoofExtractor({\n // onLog: console.log\n // });\n this.offlineContext = new AudioContext({sampleRate: 48000});\n }\n\n // Gelded this function for now to test performance of multiple audio context on decoding\n public setAudioContext(audioContext: AudioContext) {\n // this.offlineContext = audioContext;\n }\n\n /**\n * Enqueue an audio file for decoding.\n * Ensures only one audio is decoded at a time.\n */\n public enqueue(segment: DecodeQueueSegment): Promise<{\n audio: AudioBuffer;\n timeElapsedGlueFrames: number;\n timeElapsedDecode: number;\n timeElapsedChopSamples: number;\n decodeQueueId: number;\n }> {\n // const buffers[] ... grab the buffers according to the actual decoding range\n // decode the audio data with the byteRange information\n // with the arraybuffer, we can decode the segment we want\n \n return new Promise((resolve, reject) => {\n this.queue.push({ segment, resolve, reject });\n this.processNext();\n });\n }\n\n /**\n * Process the next audio buffer in the queue.\n * Ensures sequential decoding.\n */\n private async processNext(): Promise<void> {\n if (this.processing || this.queue.length === 0) return;\n this.processing = true;\n\n const { segment, resolve, reject } = this.queue.shift()!;\n \n try {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {frames, start, length, decodeQueueId, signature} = segment;\n // console.log(`decoding queue ${decodeQueueId} length`, this.queue.length);\n \n // console.log(frames_previous)\n \n let startTime: number = Date.now();\n const triggeredStartTime = startTime;\n const totalLength = frames.reduce((sum, frame) => sum + (frame?.byteLength || 0), 0);\n\n // Validate that we have enough data to decode\n /*\n if (totalLength === 0) {\n console.error(`[AudioDecoderQueueV2] No valid frames to decode for queue ${decodeQueueId}`);\n // Return a placeholder audio buffer to avoid errors\n const sampleRate = this.offlineContext.sampleRate;\n const emptyBuffer = this.offlineContext.createBuffer(2, length, sampleRate);\n resolve({\n audio: emptyBuffer, \n timeElapsedGlueFrames: 0, \n timeElapsedDecode: 0, \n timeElapsedChopSamples: 0, \n decodeQueueId\n });\n }\n */\n\n const mergedArray = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const frame of frames) {\n if (frame && frame.byteLength > 0) {\n mergedArray.set(frame, offset);\n offset += frame.byteLength;\n }\n }\n const timeElapsedGlueFrames = Date.now() - startTime;\n\n startTime = Date.now();\n // console.log(`decoding ${signature}`);\n const decodedBuffer = await this.decodeWithOfflineContext(mergedArray.buffer);\n // console.log(`decoded ${signature}`);\n const timeElapsedDecode = Date.now() - startTime;\n \n if (timeElapsedDecode> frames.length * (2/3) ) {\n if (ENABLE_DEBUG_OF_DECODING_MICRO_PROCESS) {\n console.warn(`audio decoded took longer than it normally does ${timeElapsedDecode.toFixed(2)}ms on Queue ${decodeQueueId} signature: ${signature}, framesize: ${frames.length}, triggeredTime: ${(triggeredStartTime/1000).toFixed(5)}s` );\n }\n } else {\n if (ENABLE_DEBUG_OF_DECODING_MICRO_PROCESS) {\n console.info(`audio decoded took ${timeElapsedDecode.toFixed(2)}ms on Queue ${decodeQueueId} signature: ${signature}, framesize: ${frames.length}, triggeredTime: ${(triggeredStartTime/1000).toFixed(5)}s` );\n }\n }\n\n startTime = Date.now();\n const decodedBufferToKeep = trimAudioBuffer(decodedBuffer, start, length, this.offlineContext);\n const timeElapsedChopSamples = Date.now() - startTime;\n resolve({audio: decodedBufferToKeep, timeElapsedGlueFrames, timeElapsedDecode, timeElapsedChopSamples, decodeQueueId});\n } catch (error) {\n reject(error);\n } finally {\n this.processing = false;\n this.processNext(); // Process next in the queue\n }\n }\n\n async decodeDirectly(segment: DecodeQueueSegment) {\n try {\n const {frames, start, length, decodeQueueId, signature} = segment;\n // console.log(`decoding queue ${decodeQueueId} length`, this.queue.length);\n \n // console.log(frames_previous)\n \n let startTime: number = Date.now();\n const triggeredStartTime = startTime;\n const validFrames = frames.filter((frame: Uint8Array | undefined) => frame && frame.byteLength > 0);\n const arrayBuffer = await new Blob(validFrames, { type: 'audio/aac' }).arrayBuffer();\n const timeElapsedGlueFrames = Date.now() - startTime;\n\n startTime = Date.now();\n // console.log(`decoding ${signature}`);\n const decodedBuffer = await this.decodeWithOfflineContext(arrayBuffer);\n // console.log(`decoded ${signature}`);\n const timeElapsedDecode = Date.now() - startTime;\n\n if (timeElapsedDecode> frames.length) {\n if (ENABLE_DEBUG_OF_DECODING_MICRO_PROCESS) {\n console.warn(`audio decoded took longer than it normally does ${timeElapsedDecode.toFixed(2)}ms on Queue ${decodeQueueId} signature: ${signature}, framesize: ${frames.length}, triggeredTime: ${(triggeredStartTime/1000).toFixed(5)}s` );\n }\n } else {\n if (ENABLE_DEBUG_OF_DECODING_MICRO_PROCESS) {\n console.info(`audio decoded took ${timeElapsedDecode.toFixed(2)}ms on Queue ${decodeQueueId} signature: ${signature}, framesize: ${frames.length}, triggeredTime: ${(triggeredStartTime/1000).toFixed(5)}s` );\n }\n }\n\n startTime = Date.now();\n const decodedBufferToKeep = trimAudioBuffer(decodedBuffer, start, length, this.offlineContext);\n const timeElapsedChopSamples = Date.now() - startTime;\n return {audio: decodedBufferToKeep, timeElapsedGlueFrames, timeElapsedDecode, timeElapsedChopSamples, decodeQueueId};\n } catch (error) {\n console.error(`[AudioDecoderQueueV2] Error in decoding for queue ${segment.decodeQueueId}:`, error);\n throw error;\n } finally {\n // this.processing = false;\n // this.processNext(); // Process next in the queue\n }\n }\n\n /**\n * Decode audio data using a persistent AudioContext.\n * This offloads decoding from the main thread while reusing resources.\n */\n private async decodeWithOfflineContext(audioData: ArrayBuffer): Promise<AudioBuffer> {\n return this.offlineContext.decodeAudioData(audioData);\n /*\n try {\n return await this.offlineContext.decodeAudioData(audioData);\n } catch (error) {\n console.error(`[AudioDecoderQueueV2] Audio decoding failed:`, error);\n \n // Calculate a reasonable fallback length - most AAC frames are 1024 samples\n // If we have an audioData buffer, assume 1 frame per ~265 bytes (rough estimate)\n let estimatedFrames = 96; // Default fallback if we can't estimate\n if (audioData && audioData.byteLength) {\n estimatedFrames = Math.ceil(audioData.byteLength / 265);\n }\n \n const fallbackLength = estimatedFrames * 1024;\n console.warn(`[AudioDecoderQueueV2] Creating fallback silent buffer with ${estimatedFrames} frames (${fallbackLength} samples)`);\n \n // Create a silent buffer with the estimated length\n return this.offlineContext.createBuffer(2, fallbackLength, this.offlineContext.sampleRate);\n }\n */\n }\n\n public resetContext() {\n // this.offlineContext = new AudioContext(2, this.sampleRate * 10, this.sampleRate);\n }\n}\n\n\n// Initialize the decoder queue globally\nconst decoderQueue = new AudioDecoderQueueV2();\nconst decoderQueue2 = new AudioDecoderQueueV2();\nconst decoderQueue3 = new AudioDecoderQueueV2();\nconst decoderQueue4 = new AudioDecoderQueueV2();\nconst decoderQueue5 = new AudioDecoderQueueV2();\n\nexport async function decodeMp4AudioBufferVer2(segment: {frames: Uint8Array[], start: number, length: number}, decodingQueueIndex: number, signature: string): Promise<{audio: AudioBuffer, timeElapsedGlueFrames: number, timeElapsedDecode: number, timeElapsedChopSamples: number, decodeQueueId: number}> {\n \n // const audioContext = AEV3Controller.getInstance().getAudioContextAlias();\n\n let selectedQueue: AudioDecoderQueueV2;\n // let decodeQueueId: number;\n // Select the appropriate queue based on trackId\n switch (decodingQueueIndex) {\n case 0:\n selectedQueue = decoderQueue;\n break;\n case 1:\n selectedQueue = decoderQueue2;\n break;\n case 2:\n selectedQueue = decoderQueue3;\n break;\n case 3:\n selectedQueue = decoderQueue4;\n break; \n default:\n selectedQueue = decoderQueue5;\n break; \n }\n\n \n return selectedQueue.decodeDirectly({...segment, decodeQueueId: decodingQueueIndex, signature});\n /*\n // Set the audio context\n selectedQueue.setAudioContext(audioContext);\n\n // Create an array of promises, one for each segment\n const decodingPromises = segments.map(segment => \n selectedQueue.enqueue({...segment, decodeQueueId: decodingQueueIndex, signature})\n );\n\n // Wait for all segments to be decoded in parallel\n return Promise.all(decodingPromises);\n */\n}\n\n/*\nasync function decodeAudio(mdatData, trunData, audioContext) {\n // Package AAC frames with ADTS headers\n // const { buffer: adtsBuffer } = adtsPackager.packageAacFrames(mdatData, trunData, 0, trunData.length-1);\n const { buffer: adtsBuffer } = adtsPackager.packageAacFrames(mdatData, trunData);\n // console.log(`Created ADTS buffer of ${adtsBuffer.byteLength} bytes`, 'info');\n\n // Decode the audio\n const decodedAudio = await adtsPackager.decodeAudioForAEV3(adtsBuffer, audioContext);\n return decodedAudio;\n}\n*/\n\nexport const getChunkTimeLogOfSingleChunk = (trackType: TrackLabelType, chunkIdx: number) => {\n const trackId = AEV3Controller.getInstance().getBarSequenceWithType(trackType)?.trackData?.trackId;\n if (!trackId) {\n return;\n }\n const sequence = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(trackId);\n if (!sequence) {\n return;\n }\n console.log(\n sequence.sequences.reduce(\n (curr, e) => {\n return {...curr, ...e.segments[chunkIdx].byteSampleSegment.tracks}\n }\n , {chunkIdx})\n );\n const bar = AEV3Controller.getInstance().getBarSequenceWithType(trackType);\n if (!bar?.sequences) {\n return;\n }\n console.log(\n bar.sequences.reduce(\n (curr, e) => {\n return [...curr, e.segments[chunkIdx].decoded]\n }\n , [] as unknown[])\n );\n}\n","/**\n * MP4 MOOF Extractor\n * Extracts MOOF, TRUN, and MDAT data from MP4 files\n */\nexport class MP4MoofExtractor {\n constructor(options = {}) {\n this.options = {\n onLog: console.log,\n ...options\n };\n }\n \n log(message, type = 'info') {\n if (this.options.onLog) {\n // this.options.onLog(message, type);\n }\n }\n \n /**\n * Extract MOOF, TRUN, and MDAT data for a specific track\n * @param {string} url - URL of the MP4 file\n * @param {Object} tfraEntry - TFRA entry for the track\n * @returns {Promise<Object>} - Object containing MOOF, TRUN, and MDAT data\n */\n async extractMoofData(url, tfraEntry) {\n try {\n const totalStartTime = Date.now();\n \n const moofOffset = tfraEntry.moof_offset;\n const trackId = tfraEntry.track_id;\n \n this.log(`Extracting MOOF data from offset ${moofOffset} for track ${trackId}`, 'info');\n \n const fetchSize = 300000; // 300KB should be enough for most audio segments\n this.log(`Fetching ${fetchSize/1024}KB from offset ${moofOffset}`);\n \n // Measure fetch time\n const fetchStartTime = Date.now();\n const buffer = await this.fetchRange(url, moofOffset, moofOffset + fetchSize - 1);\n const fetchEndTime = Date.now();\n this.log(`Fetch completed in ${(fetchEndTime - fetchStartTime).toFixed(2)}ms`, 'timing');\n \n this.log(`Received ${buffer.byteLength} bytes`, 'info');\n \n const dataView = new DataView(buffer);\n \n // Find MOOF box\n const moofSize = dataView.getUint32(0);\n const moofType = this.readFourCC(dataView, 4);\n \n if (moofType !== 'moof') {\n throw new Error(`Expected MOOF box at offset ${moofOffset}, found ${moofType}`);\n }\n \n this.log(`Found MOOF box with size ${moofSize}`, 'info');\n \n // Measure parse time\n const parseStartTime = Date.now();\n const trunData = this.parseMoofBox(dataView, 0, moofSize, trackId, '');\n const parseEndTime = Date.now();\n this.log(`MOOF parsing completed in ${(parseEndTime - parseStartTime).toFixed(2)}ms`, 'timing');\n \n if (!trunData) {\n throw new Error(`Failed to extract TRUN data from MOOF box for track ${trackId}`);\n }\n \n this.log(`Extracted TRUN data with ${trunData.sample_size ? trunData.sample_size.length : 0} samples`, 'info');\n \n // Find MDAT box (should be right after MOOF)\n const mdatOffset = moofSize;\n \n if (mdatOffset + 8 > buffer.byteLength) {\n throw new Error('MDAT box not found or incomplete');\n }\n \n const mdatSize = dataView.getUint32(mdatOffset);\n const mdatType = this.readFourCC(dataView, mdatOffset + 4);\n \n if (mdatType !== 'mdat') {\n throw new Error(`Expected MDAT box after MOOF, found ${mdatType}`);\n }\n \n this.log(`Found MDAT box with size ${mdatSize}`, 'info');\n \n // Extract MDAT data (skip the 8-byte header)\n const mdatStartTime = Date.now();\n const mdatData = buffer.slice(mdatOffset + 8, mdatOffset + mdatSize);\n const mdatEndTime = Date.now();\n this.log(`MDAT extraction completed in ${(mdatEndTime - mdatStartTime).toFixed(2)}ms`, 'timing');\n \n this.log(`Extracted ${mdatData.byteLength} bytes of audio data`, 'info');\n \n const totalEndTime = Date.now();\n this.log(`Total MOOF extraction completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return {\n moofOffset,\n moofSize,\n trunData,\n mdatData\n };\n } catch (error) {\n this.log(`Error extracting MOOF data: ${error.message}`, 'error');\n throw error;\n }\n }\n\n extractMoofDataForAEV3(buffer, trackId, moofboxIndex, eTag, tfraDataETag, trackIdForDebug) {\n try {\n const totalStartTime = Date.now();\n \n const moofOffset = 9999999999999;\n \n // Measure fetch time\n const fetchStartTime = Date.now();\n \n const fetchEndTime = Date.now();\n this.log(`Fetch completed in ${(fetchEndTime - fetchStartTime).toFixed(2)}ms`, 'timing');\n \n this.log(`Received ${buffer.byteLength} bytes`, 'info');\n \n const dataView = new DataView(buffer);\n \n // Find MOOF box\n const moofSize = dataView.getUint32(0);\n const moofType = this.readFourCC(dataView, 4);\n \n if (moofType !== 'moof') {\n let eTagInfo = '';\n if (eTag === tfraDataETag) {\n if (eTag) {\n eTagInfo = `{S: ${eTag}, T: SAME}`;\n } else {\n eTagInfo = `S & T: EMPTY`; // or undefined\n }\n } else {\n eTagInfo = `{S: ${eTag}, T: ${tfraDataETag}}`;\n }\n throw new Error(`[eTag: ${eTagInfo}] Expected MOOF box from audio ${trackId} index: ${moofboxIndex}, found this: \\\"${moofType}\\\"`);\n }\n \n this.log(`Found MOOF box with size ${moofSize}`, 'info');\n \n // Measure parse time\n const parseStartTime = Date.now();\n const trunData = this.parseMoofBox(dataView, 0, moofSize, trackId, trackIdForDebug);\n const parseEndTime = Date.now();\n this.log(`MOOF parsing completed in ${(parseEndTime - parseStartTime).toFixed(2)}ms`, 'timing');\n \n if (!trunData) {\n throw new Error(`Failed to extract TRUN data from MOOF box for track ${trackId}`);\n }\n \n this.log(`Extracted TRUN data with ${trunData.sample_size ? trunData.sample_size.length : 0} samples`, 'info');\n \n // Find MDAT box (should be right after MOOF)\n const mdatOffset = moofSize;\n \n if (mdatOffset + 8 > buffer.byteLength) {\n throw new Error('MDAT box not found or incomplete');\n }\n \n const mdatSize = dataView.getUint32(mdatOffset);\n const mdatType = this.readFourCC(dataView, mdatOffset + 4);\n \n if (mdatType !== 'mdat') {\n throw new Error(`Expected MDAT box after MOOF, found ${mdatType}`);\n }\n \n this.log(`Found MDAT box with size ${mdatSize}`, 'info');\n \n // Extract MDAT data (skip the 8-byte header)\n const mdatStartTime = Date.now();\n const mdatData = buffer.slice(mdatOffset + 8, mdatOffset + mdatSize);\n const mdatEndTime = Date.now();\n this.log(`MDAT extraction completed in ${(mdatEndTime - mdatStartTime).toFixed(2)}ms`, 'timing');\n \n this.log(`Extracted ${mdatData.byteLength} bytes of audio data`, 'info');\n \n const totalEndTime = Date.now();\n this.log(`Total MOOF extraction completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return {\n moofOffset,\n moofSize,\n trunData, // grab this one\n mdatData // grab this one\n };\n } catch (error) {\n this.log(`Error extracting MOOF data: ${error.message}`, 'error');\n throw error;\n }\n }\n \n /**\n * Parse a MOOF box to extract TRUN data\n * @param {DataView} dataView - DataView of the buffer\n * @param {number} offset - Offset of the MOOF box in the buffer\n * @param {number} size - Size of the MOOF box\n * @param {number} targetTrackId - Track ID to extract TRUN data for\n * @param {string} trackIdForDebug - the song's trackId\n * @returns {Object} - TRUN data object\n */\n parseMoofBox(dataView, offset, size, targetTrackId, trackIdForDebug) {\n try {\n let currentOffset = offset + 8; // Skip MOOF header\n const endOffset = offset + size;\n \n this.log(`Parsing MOOF box, looking for track ${targetTrackId}`, 'info');\n \n while (currentOffset < endOffset) {\n const boxSize = dataView.getUint32(currentOffset);\n const boxType = this.readFourCC(dataView, currentOffset + 4);\n \n if (boxType === 'traf') {\n // Parse TRAF box\n const trafData = this.parseTrafBox(dataView, currentOffset, boxSize, targetTrackId, trackIdForDebug);\n this.log(`Got TRAF data: ${JSON.stringify(trafData)}`, 'info');\n \n if (trafData && trafData.track_id === targetTrackId) {\n this.log(`Found matching TRAF data for track ${targetTrackId}`, 'success');\n return trafData;\n } else {\n this.log(`TRAF data doesn't match target track (got ${trafData?.track_id}, want ${targetTrackId})`, 'info');\n }\n }\n \n currentOffset += boxSize;\n }\n \n return null;\n } catch (error) {\n this.log(`Error parsing MOOF box: ${error.message}`, 'error');\n return null;\n }\n }\n \n /**\n * Parse TFHD box to extract track ID and default sample values\n */\n parseTfhdBox(dataView, offset, boxSize) {\n const flags = (dataView.getUint8(offset + 9) << 16) |\n (dataView.getUint8(offset + 10) << 8) |\n dataView.getUint8(offset + 11);\n \n const trackId = dataView.getUint32(offset + 12);\n let tfhdOffset = offset + 16;\n \n let defaultSampleSize = null;\n \n // Parse optional fields based on flags (must be in this order per spec)\n if (flags & 0x000001) tfhdOffset += 8; // base_data_offset_present\n if (flags & 0x000002) tfhdOffset += 4; // sample_description_index_present\n if (flags & 0x000008) tfhdOffset += 4; // default_sample_duration_present\n if (flags & 0x000010) { // default_sample_size_present\n defaultSampleSize = dataView.getUint32(tfhdOffset);\n }\n \n return { trackId, defaultSampleSize };\n }\n\n /**\n * Parse a TRAF box to extract TRUN data\n */\n parseTrafBox(dataView, offset, size, targetTrackId, trackIdForDebug) {\n try {\n let currentOffset = offset + 8; // Skip TRAF header\n const endOffset = offset + size;\n let trackId = null;\n let trunData = null;\n let tfhdData = null;\n \n while (currentOffset < endOffset) {\n const boxSize = dataView.getUint32(currentOffset);\n const boxType = this.readFourCC(dataView, currentOffset + 4);\n \n if (boxType === 'tfhd') {\n tfhdData = this.parseTfhdBox(dataView, currentOffset, boxSize);\n trackId = tfhdData.trackId;\n this.log(`Found TFHD box for track ${trackId}`, 'info');\n } else if (boxType === 'trun') {\n trunData = this.parseTrunBox(dataView, currentOffset, boxSize);\n this.log(`Found TRUN box with ${trunData ? trunData.sample_count : 'unknown'} samples`, 'info');\n }\n \n currentOffset += boxSize;\n }\n \n // KEY FIX: Apply default sample size from TFHD if TRUN doesn't have per-sample sizes\n // NOTE reason why the sample_size did not come back might due to they are actually the same: 256, so instead of returning [256, 256, 256, ...], empty array is returned\n if (trunData && !trunData.sample_size && tfhdData?.defaultSampleSize && trunData.sample_count) {\n // console.warn(`[MP4 Parser] Applying TFHD default_sample_size (${tfhdData.defaultSampleSize} bytes) to ${trunData.sample_count} samples for track ${targetTrackId} ${trackIdForDebug}`);\n trunData.sample_size = new Array(trunData.sample_count).fill(tfhdData.defaultSampleSize);\n } else if (trunData && !trunData.sample_size) {\n console.error(`[${trackIdForDebug}] sample_size/defaultSampleSize missing`);\n }\n \n if (trunData && trackId) {\n trunData.track_id = trackId;\n this.log(`Returning TRUN data with track_id ${trackId}`, 'info');\n return trunData;\n }\n \n this.log(`No valid TRUN data found for track ${trackId}`, 'warning');\n return null;\n } catch (error) {\n this.log(`Error parsing TRAF box: ${error.message}`, 'error');\n return null;\n }\n }\n \n /**\n * Parse a TRUN box\n * @param {DataView} dataView - DataView of the buffer\n * @param {number} offset - Offset of the TRUN box in the buffer\n * @param {number} size - Size of the TRUN box\n * @returns {Object} - TRUN data object\n */\n parseTrunBox(dataView, offset, size) {\n try {\n const version = dataView.getUint8(offset + 8);\n const flags = (dataView.getUint8(offset + 9) << 16) |\n (dataView.getUint8(offset + 10) << 8) |\n dataView.getUint8(offset + 11);\n \n const sampleCount = dataView.getUint32(offset + 12);\n this.log(`TRUN box: ${sampleCount} samples, version ${version}, flags 0x${flags.toString(16)}`, 'info');\n \n // Determine which fields are present based on flags\n const dataOffsetPresent = (flags & 0x000001) !== 0;\n const firstSampleFlagsPresent = (flags & 0x000004) !== 0;\n const sampleDurationPresent = (flags & 0x000100) !== 0;\n const sampleSizePresent = (flags & 0x000200) !== 0;\n const sampleFlagsPresent = (flags & 0x000400) !== 0;\n const sampleCompositionTimeOffsetPresent = (flags & 0x000800) !== 0;\n \n this.log(`TRUN flags: dataOffset=${dataOffsetPresent}, firstSampleFlags=${firstSampleFlagsPresent}, duration=${sampleDurationPresent}, size=${sampleSizePresent}`, 'info');\n \n let currentOffset = offset + 16; // Skip TRUN header\n \n // Read data_offset if present\n let dataOffset = null;\n if (dataOffsetPresent) {\n dataOffset = dataView.getInt32(currentOffset);\n this.log(`TRUN data_offset: ${dataOffset}`, 'info');\n currentOffset += 4;\n }\n \n // Read first_sample_flags if present\n let firstSampleFlags = null;\n if (firstSampleFlagsPresent) {\n firstSampleFlags = dataView.getUint32(currentOffset);\n currentOffset += 4;\n }\n \n // Read sample information\n const sampleDurations = [];\n const sampleSizes = [];\n const sampleFlags = [];\n const sampleCompositionTimeOffsets = [];\n \n for (let i = 0; i < sampleCount; i++) {\n if (sampleDurationPresent) {\n sampleDurations.push(dataView.getUint32(currentOffset));\n currentOffset += 4;\n }\n \n if (sampleSizePresent) {\n const size = dataView.getUint32(currentOffset);\n sampleSizes.push(size);\n currentOffset += 4;\n }\n \n if (sampleFlagsPresent) {\n sampleFlags.push(dataView.getUint32(currentOffset));\n currentOffset += 4;\n }\n \n if (sampleCompositionTimeOffsetPresent) {\n if (version === 0) {\n sampleCompositionTimeOffsets.push(dataView.getUint32(currentOffset));\n } else {\n sampleCompositionTimeOffsets.push(dataView.getInt32(currentOffset));\n }\n currentOffset += 4;\n }\n }\n \n this.log(`Parsed ${sampleSizes.length} sample sizes`, 'info');\n \n const result = {\n version,\n flags,\n sample_count: sampleCount,\n data_offset: dataOffset,\n first_sample_flags: firstSampleFlags,\n sample_duration: sampleDurations.length > 0 ? sampleDurations : null,\n sample_size: sampleSizes.length > 0 ? sampleSizes : null,\n sample_flags: sampleFlags.length > 0 ? sampleFlags : null,\n sample_composition_time_offset: sampleCompositionTimeOffsets.length > 0 ? sampleCompositionTimeOffsets : null\n };\n \n this.log(`Returning TRUN data with ${result.sample_size ? result.sample_size.length : 0} sample sizes`, 'info');\n return result;\n } catch (error) {\n this.log(`Error parsing TRUN box: ${error.message}`, 'error');\n return null;\n }\n }\n \n /**\n * Fetch a range of bytes from a file\n * @param {string} url - URL of the file\n * @param {number} start - Start byte position\n * @param {number} end - End byte position\n * @returns {Promise<ArrayBuffer>} - ArrayBuffer containing the requested bytes\n */\n async fetchRange(url, start, end) {\n try {\n const response = await fetch(url, {\n cache: \"no-cache\", \n headers: {\n Range: `bytes=${start}-${end}`\n }\n });\n \n if (!response.ok) {\n throw new Error(`HTTP range request error: ${response.status}`);\n }\n \n return await response.arrayBuffer();\n } catch (error) {\n this.log(`Error fetching range: ${error.message}`, 'error');\n throw error;\n }\n }\n \n /**\n * Read a four-character code from a DataView\n * @param {DataView} dataView - DataView to read from\n * @param {number} offset - Offset to read at\n * @returns {string} - Four-character code\n */\n readFourCC(dataView, offset) {\n return String.fromCharCode(\n dataView.getUint8(offset),\n dataView.getUint8(offset + 1),\n dataView.getUint8(offset + 2),\n dataView.getUint8(offset + 3)\n );\n }\n \n /**\n * Extract MOOF data for multiple segments\n * @param {string} url - URL of the MP4 file\n * @param {Object} tfraEntry - TFRA entry for the track\n * @param {number} startSegment - Index of the first segment to extract\n * @param {number} endSegment - Index of the last segment to extract (optional)\n * @returns {Promise<Array<Object>>} - Array of objects containing MOOF data for each segment\n */\n async extractMultipleSegments(url, trackTfra, startSegment, endSegment = startSegment) {\n try {\n const totalStartTime = Date.now();\n \n if (!trackTfra || !trackTfra.entries || trackTfra.entries.length === 0) {\n throw new Error('No TFRA entries found for track');\n }\n \n const trackId = trackTfra.track_id;\n const maxSegment = trackTfra.entries.length - 1;\n \n // Validate segment indices\n startSegment = Math.max(0, Math.min(startSegment, maxSegment));\n endSegment = Math.max(startSegment, Math.min(endSegment || startSegment, maxSegment));\n \n this.log(`Extracting segments ${startSegment} to ${endSegment} for track ${trackId}`, 'info');\n this.log(`Track has ${trackTfra.entries.length} total segments`, 'info');\n \n const results = [];\n \n for (let i = startSegment; i <= endSegment; i++) {\n const tfraEntry = trackTfra.entries[i];\n tfraEntry.track_id = trackId; // Ensure track_id is set\n \n this.log(`Extracting segment ${i} from offset ${tfraEntry.moof_offset}`, 'info');\n \n const segmentStartTime = Date.now();\n const moofData = await this.extractMoofData(url, tfraEntry);\n const segmentEndTime = Date.now();\n \n this.log(`Segment ${i} extraction completed in ${(segmentEndTime - segmentStartTime).toFixed(2)}ms`, 'timing');\n \n results.push({\n segmentIndex: i,\n ...moofData\n });\n }\n \n const totalEndTime = Date.now();\n this.log(`Total extraction of ${results.length} segments completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return results;\n } catch (error) {\n this.log(`Error extracting multiple segments: ${error.message}`, 'error');\n throw error;\n }\n }\n \n /**\n * Extract MOOF data for all tracks and multiple segments with a single optimized request\n * @param {string} url - URL of the MP4 file\n * @param {Array<Object>} allTfraData - Complete TFRA data for all tracks\n * @param {number} startSegment - Index of the first segment to extract\n * @param {number} endSegment - Index of the last segment to extract (optional)\n * @returns {Promise<Object>} - Object containing MOOF data for all tracks and segments\n */\n async extractAllTracksMultipleSegmentsOptimized(url, allTfraData, startSegment, endSegment = startSegment) {\n try {\n const totalStartTime = Date.now();\n \n if (!allTfraData || allTfraData.length === 0) {\n throw new Error('No TFRA data provided');\n }\n \n // Validate segment indices for each track\n const validTracks = [];\n for (const trackTfra of allTfraData) {\n const trackId = trackTfra.track_id;\n const maxSegment = trackTfra.entries.length - 1;\n \n if (startSegment > maxSegment) {\n this.log(`Track ${trackId} doesn't have segment ${startSegment} (max: ${maxSegment})`, 'warning');\n continue;\n }\n \n const validStartSegment = Math.max(0, Math.min(startSegment, maxSegment));\n const validEndSegment = Math.max(validStartSegment, Math.min(endSegment || validStartSegment, maxSegment));\n \n validTracks.push({\n trackTfra,\n startSegment: validStartSegment,\n endSegment: validEndSegment\n });\n }\n \n if (validTracks.length === 0) {\n throw new Error('No valid tracks found for the requested segment range');\n }\n \n this.log(`Extracting segments ${startSegment} to ${endSegment} for ${validTracks.length} tracks with a single request`, 'info');\n \n // Find min and max offsets across all tracks and segments\n let minOffset = Infinity;\n let maxOffset = 0;\n \n for (const { trackTfra, startSegment, endSegment } of validTracks) {\n for (let i = startSegment; i <= endSegment; i++) {\n if (i < trackTfra.entries.length) {\n const offset = trackTfra.entries[i].moof_offset;\n minOffset = Math.min(minOffset, offset);\n maxOffset = Math.max(maxOffset, offset);\n }\n }\n }\n \n // For the max offset, we need to estimate the size of the last segment\n // We'll use the reference track (track 1 or first track) to determine the next segment boundary\n const referenceTrack = allTfraData.find(tfra => tfra.track_id === 1) || allTfraData[0];\n let fetchEndOffset;\n \n // Find the segment after the last requested segment\n const lastRequestedSegmentIndex = Math.min(endSegment, referenceTrack.entries.length - 1);\n const nextSegmentIndex = lastRequestedSegmentIndex + 1;\n \n if (nextSegmentIndex < referenceTrack.entries.length) {\n // If there's a next segment, use its offset as the end boundary\n fetchEndOffset = referenceTrack.entries[nextSegmentIndex].moof_offset;\n this.log(`Using next segment boundary at offset ${fetchEndOffset}`, 'info');\n } else {\n // If there's no next segment, estimate the size (300KB per segment)\n const estimatedSize = 300000;\n fetchEndOffset = maxOffset + estimatedSize;\n this.log(`Using estimated end offset: ${fetchEndOffset} (added ${estimatedSize} bytes)`, 'info');\n }\n \n const fetchSize = fetchEndOffset - minOffset;\n this.log(`Fetching data from offset ${minOffset} to ${fetchEndOffset} (${(fetchSize / 1024).toFixed(2)}KB)`, 'info');\n \n // Fetch the range\n const fetchStartTime = Date.now();\n const buffer = await this.fetchRange(url, minOffset, fetchEndOffset - 1);\n const fetchEndTime = Date.now();\n \n this.log(`Fetch completed in ${(fetchEndTime - fetchStartTime).toFixed(2)}ms`, 'timing');\n this.log(`Received ${buffer.byteLength} bytes`, 'info');\n \n // Process each track and segment\n const dataView = new DataView(buffer);\n const results = {};\n \n for (const { trackTfra, startSegment, endSegment } of validTracks) {\n const trackId = trackTfra.track_id;\n const trackResults = [];\n \n this.log(`Processing track ${trackId}, segments ${startSegment}-${endSegment}`, 'info');\n \n for (let i = startSegment; i <= endSegment; i++) {\n if (i >= trackTfra.entries.length) {\n this.log(`Segment ${i} exceeds available segments for track ${trackId}`, 'warning');\n continue;\n }\n \n const tfraEntry = trackTfra.entries[i];\n const moofOffset = tfraEntry.moof_offset;\n const relativeOffset = moofOffset - minOffset;\n \n if (relativeOffset < 0 || relativeOffset >= buffer.byteLength) {\n this.log(`MOOF offset for track ${trackId}, segment ${i} is outside the fetched range`, 'error');\n continue;\n }\n \n this.log(`Processing segment ${i} for track ${trackId} at relative offset ${relativeOffset}`, 'info');\n \n // Find MOOF box\n const moofSize = dataView.getUint32(relativeOffset);\n const moofType = this.readFourCC(dataView, relativeOffset + 4);\n \n if (moofType !== 'moof') {\n this.log(`Expected MOOF box for track ${trackId}, segment ${i}, found ${moofType}`, 'error');\n continue;\n }\n \n this.log(`Found MOOF box for track ${trackId}, segment ${i} with size ${moofSize}`, 'info');\n \n // Parse MOOF box\n const parseStartTime = Date.now();\n const trunData = this.parseMoofBox(dataView, relativeOffset, moofSize, trackId, '');\n const parseEndTime = Date.now();\n \n this.log(`MOOF parsing for track ${trackId}, segment ${i} completed in ${(parseEndTime - parseStartTime).toFixed(2)}ms`, 'timing');\n \n if (!trunData) {\n this.log(`Failed to extract TRUN data for track ${trackId}, segment ${i}`, 'error');\n continue;\n }\n \n // Find MDAT box (should be right after MOOF)\n const mdatOffset = relativeOffset + moofSize;\n \n if (mdatOffset + 8 > buffer.byteLength) {\n this.log(`MDAT box for track ${trackId}, segment ${i} is outside the fetched range`, 'error');\n continue;\n }\n \n const mdatSize = dataView.getUint32(mdatOffset);\n const mdatType = this.readFourCC(dataView, mdatOffset + 4);\n \n if (mdatType !== 'mdat') {\n this.log(`Expected MDAT box after MOOF for track ${trackId}, segment ${i}, found ${mdatType}`, 'error');\n continue;\n }\n \n this.log(`Found MDAT box for track ${trackId}, segment ${i} with size ${mdatSize}`, 'info');\n \n // Extract MDAT data\n const mdatStartTime = Date.now();\n const mdatData = buffer.slice(mdatOffset + 8, mdatOffset + mdatSize);\n const mdatEndTime = Date.now();\n \n this.log(`MDAT extraction for track ${trackId}, segment ${i} completed in ${(mdatEndTime - mdatStartTime).toFixed(2)}ms`, 'timing');\n this.log(`Extracted ${mdatData.byteLength} bytes of audio data for track ${trackId}, segment ${i}`, 'info');\n \n // Store results for this segment\n trackResults.push({\n segmentIndex: i,\n moofOffset,\n moofSize,\n trunData,\n mdatData\n });\n }\n \n results[trackId] = trackResults;\n }\n \n const totalEndTime = Date.now();\n this.log(`Total extraction for all tracks and segments completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return results;\n } catch (error) {\n this.log(`Error extracting all tracks and segments: ${error.message}`, 'error');\n throw error;\n }\n }\n}\n\n/*\n// Export the class\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = MP4MoofExtractor;\n} else {\n window.MP4MoofExtractor = MP4MoofExtractor;\n} \n*/","/**\n * AAC ADTS Packager\n * Packages AAC frames with ADTS headers for playback\n */\nexport class AACAdtsPackager {\n constructor(options = {}) {\n this.options = {\n onLog: console.log,\n ...options\n };\n }\n \n log(message, type = 'info') {\n if (this.options.onLog) {\n // this.options.onLog(message, type);\n }\n }\n\n headerCache = new Map();\n\n getHeader(frameLength) {\n let header;\n // Get or create ADTS header\n // this.header;\n if (this.headerCache.has(frameLength)) {\n header = this.headerCache.get(frameLength);\n } else {\n header = this.buildADTSHeader(frameLength, 2, 3, 2);\n this.headerCache.set(frameLength, header);\n }\n return header;\n }\n \n /**\n * Package raw AAC data with ADTS headers - optimized version\n * @param {ArrayBuffer} mdatData - Raw AAC data from MDAT box\n * @param {Object} trunData - TRUN data containing sample sizes\n * @returns {Object} - ADTS-packaged AAC data and raw bytes\n */\n packageAacFrames(mdatData, trunData) {\n try {\n const totalStartTime = Date.now();\n \n if (!mdatData || !trunData || !trunData.sample_size) {\n throw new Error('Invalid input data');\n }\n\n // Use a more efficient buffer allocation strategy\n const sampleSizes = trunData.sample_size;\n const totalSize = sampleSizes.reduce((sum, size) => sum + size, 0);\n const rawData = new Uint8Array(mdatData);\n \n // Pre-allocate the output buffer with exact size\n const totalOutputSize = totalSize + (sampleSizes.length * 7); // 7 bytes per ADTS header\n const output = new Uint8Array(totalOutputSize);\n \n // Pre-compute ADTS headers for common frame sizes to avoid redundant calculations\n const headerCache = new Map();\n \n let inputOffset = 0;\n let outputOffset = 0;\n \n // Use a faster loop with direct array access\n const sampleCount = sampleSizes.length;\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = sampleSizes[i];\n const frameLength = sampleSize + 7;\n \n // Get or create ADTS header\n let header;\n if (headerCache.has(frameLength)) {\n header = headerCache.get(frameLength);\n } else {\n header = this.buildADTSHeader(frameLength, 2, 3, 2);\n headerCache.set(frameLength, header);\n }\n \n // Copy header\n output.set(header, outputOffset);\n outputOffset += 7;\n \n // Copy sample data directly using subarray for zero-copy where possible\n output.set(rawData.subarray(inputOffset, inputOffset + sampleSize), outputOffset);\n inputOffset += sampleSize;\n outputOffset += sampleSize;\n }\n \n const totalEndTime = Date.now();\n this.log(`Total AAC packaging completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return { buffer: output.buffer };\n } catch (error) {\n this.log(`Error packaging AAC frames: ${error.message}`, 'error');\n throw error;\n }\n }\n\n packageAacFramesWithADTSHeader(frames) {\n try {\n const totalStartTime = Date.now();\n \n if (frames.length===0) {\n throw new Error('Invalid input data');\n }\n \n // Pre-compute ADTS headers for common frame sizes to avoid redundant calculations\n // Get or create ADTS header\n let header;\n \n \n \n // Use a faster loop with direct array access\n // const sampleCount = sampleSizes.length;\n const output_buffers = [];\n for (let i = 0; i < frames.length; i++) {\n let inputOffset = 0;\n const rawData = frames[i].rawData;\n const sampleSize = frames[i].sampleSize;\n const frameLength = sampleSize + 7; // header is always 7 bytes\n header = this.getHeader(frameLength);\n \n const output = new Uint8Array(frameLength);\n let outputOffset = 0;\n // Copy header\n output.set(header, outputOffset);\n outputOffset += 7; // header is always 7 bytes\n \n // Copy sample data directly using subarray for zero-copy where possible\n output.set(rawData.subarray(inputOffset, inputOffset + sampleSize), outputOffset);\n inputOffset += sampleSize;\n // outputOffset += sampleSize;\n output_buffers.push(output)\n }\n \n const totalEndTime = Date.now();\n this.log(`Total AAC packaging completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return { buffers: output_buffers };\n } catch (error) {\n this.log(`Error packaging AAC frames: ${error.message}`, 'error');\n throw error;\n }\n }\n\n /**\n * Modify the original packageAacFrames function and return array of ATDS buffers to be used/glued later\n * @param {*} mdatData \n * @param {*} trunData \n * @returns \n */\n packageAacFramesForAEV3(mdatData, trunData, trackIdForDebug) {\n try {\n const totalStartTime = Date.now();\n \n if (!mdatData || !trunData || !trunData.sample_size) {\n \n console.warn(`Missing sample sizes for track, using fixed-size frame fallback`, {\n trackIdForDebug,\n hasMdatData: !!mdatData,\n mdatSize: mdatData ? mdatData.byteLength : 0,\n trunSampleCount: trunData && trunData.sample_count ? trunData.sample_count : 0\n });\n \n // If we at least have MDAT data, try the fallback method with fixed-size frames\n if (mdatData && mdatData.byteLength > 0) {\n // Use the new divideByCount approach - divide MDAT size by 96 frames\n // 96 frames would be typical for ~2 seconds of AAC audio at 48kHz\n const targetFrameCount = 96;\n const frames = this.packageAacFramesWithFixedSize(mdatData, targetFrameCount, true, trackIdForDebug);\n return {buffers: frames.buffers}\n \n } else {\n // No MDAT data either, we can't do anything\n throw new Error('Invalid input data');\n // continue;\n }\n \n }\n\n // Use a more efficient buffer allocation strategy\n const sampleSizes = trunData.sample_size;\n // const totalSize = sampleSizes.reduce((sum, size) => sum + size, 0);\n const rawData = new Uint8Array(mdatData);\n \n // Pre-allocate the output buffer with exact size\n // const totalOutputSize = totalSize + (sampleSizes.length * 7); // 7 bytes per ADTS header\n // const output = new Uint8Array(totalOutputSize);\n \n // Pre-compute ADTS headers for common frame sizes to avoid redundant calculations\n // Get or create ADTS header\n let header;\n \n let inputOffset = 0;\n // let outputOffset = 0;\n \n // Use a faster loop with direct array access\n const sampleCount = sampleSizes.length;\n const output_buffers = [];\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = sampleSizes[i];\n const frameLength = sampleSize + 7; // header is always 7 bytes\n header = this.getHeader(frameLength);\n \n const output = new Uint8Array(frameLength);\n let outputOffset = 0;\n // Copy header\n output.set(header, outputOffset);\n outputOffset += 7; // header is always 7 bytes\n \n // Copy sample data directly using subarray for zero-copy where possible\n output.set(rawData.subarray(inputOffset, inputOffset + sampleSize), outputOffset);\n inputOffset += sampleSize;\n // outputOffset += sampleSize;\n output_buffers.push(output)\n }\n \n const totalEndTime = Date.now();\n this.log(`Total AAC packaging completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n return { buffers: output_buffers };\n } catch (error) {\n this.log(`Error packaging AAC frames: ${error.message}`, 'error');\n throw error;\n }\n }\n\n /**\n * Create samples array from MDAT data using sample sizes\n * @param {ArrayBuffer} mdatData - Raw AAC data from MDAT box\n * @param {Array<number>} sampleSizes - Array of sample sizes\n * @returns {Array<Object>} - Array of sample objects\n */\n createSamplesFromMdat(mdatData, sampleSizes) {\n const rawData = new Uint8Array(mdatData);\n const samples = [];\n let offset = 0;\n\n this.log(`Creating ${sampleSizes.length} samples from MDAT data`, 'info');\n\n for (let i = 0; i < sampleSizes.length; i++) {\n const size = sampleSizes[i];\n if (offset + size > rawData.length) {\n throw new Error(`Sample ${i} exceeds MDAT data bounds`);\n }\n\n samples.push({\n data: rawData.slice(offset, offset + size).buffer,\n size: size\n });\n\n offset += size;\n }\n\n return samples;\n }\n \n /**\n * Package samples with ADTS headers\n * @param {Array<Object>} samples - Array of sample objects\n * @param {number} profile - AAC profile (1 = Main, 2 = LC, 3 = SSR, 4 = LTP)\n * @param {number} samplingFrequencyIndex - Index of sampling frequency\n * @param {number} channelConfig - Number of channels\n * @returns {ArrayBuffer} - ADTS-packaged AAC data\n */\n packageSamplesToADTS(samples, profile, samplingFrequencyIndex, channelConfig) {\n // Calculate total size needed\n const totalLength = samples.reduce((acc, s) => acc + 7 + s.size, 0);\n const output = new Uint8Array(totalLength);\n let offset = 0;\n\n samples.forEach(sample => {\n const frameLength = sample.size + 7;\n const header = this.buildADTSHeader(frameLength, profile, samplingFrequencyIndex, channelConfig);\n \n output.set(header, offset);\n offset += 7;\n output.set(new Uint8Array(sample.data), offset);\n offset += sample.size;\n });\n\n return output.buffer;\n }\n \n /**\n * Build an ADTS header\n * @param {number} frameLength - Length of the frame including header\n * @param {number} profile - AAC profile (1 = Main, 2 = LC, 3 = SSR, 4 = LTP)\n * @param {number} samplingFrequencyIndex - Index of sampling frequency\n * @param {number} channelConfig - Number of channels\n * @returns {Uint8Array} - ADTS header (7 bytes)\n */\n buildADTSHeader(frameLength, profile, samplingFrequencyIndex, channelConfig) {\n let adts = new Uint8Array(7);\n \n // Syncword: 12 bits set to 1\n adts[0] = 0xFF;\n adts[1] = 0xF1; // 0xF1 for MPEG-4 with protection_absent=1\n \n // Bits 7-6: profile (profile - 1)\n // Bits 5-2: sampling frequency index (4 bits)\n // Bit 1: private bit (0)\n // Bit 0: high bit of channel configuration (channelConfig >> 2)\n adts[2] = ((profile - 1) << 6) | (samplingFrequencyIndex << 2) | (channelConfig >> 2);\n \n // Bits 7-6: lower 2 bits of channel configuration (channelConfig & 3)\n // Bits 5-0: first 6 bits of frame length (frameLength >> 11)\n adts[3] = ((channelConfig & 3) << 6) | ((frameLength >> 11) & 0x3F);\n \n // Next 8 bits of frame length\n adts[4] = (frameLength >> 3) & 0xFF;\n \n // Bits 7-5: last 3 bits of frame length\n // Bits 4-0: first 5 bits of buffer fullness (set to 0x7FF, so high bits = 0x1F)\n adts[5] = ((frameLength & 7) << 5) | 0x1F;\n \n // Last 6 bits of buffer fullness (all set) and 2 bits for number of raw data blocks (0)\n adts[6] = 0xFC;\n \n // this.log(`ADTS header: ${Array.from(adts).map(b => b.toString(16).padStart(2, '0')).join(' ')}`, 'info');\n return adts;\n }\n \n /**\n * Get frequency index for a sample rate\n * @param {number} sampleRate - Sample rate in Hz\n * @returns {number} - Frequency index\n */\n getFrequencyIndex(sampleRate) {\n const rates = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000];\n const index = rates.indexOf(sampleRate);\n if (index === -1) {\n this.log(`Warning: Sample rate ${sampleRate} not found in standard rates, defaulting to 44100Hz`, 'warning');\n return 4; // Default to 44.1kHz\n }\n return index;\n }\n \n /**\n * Decode ADTS-packaged AAC data using Web Audio API\n * @param {ArrayBuffer} adtsBuffer - ADTS-packaged AAC data\n * @returns {Promise<{duration: number, sampleRate: number, numberOfChannels: number, length: number, pcmData: Float32Array[]}>} - Decoded audio data\n */\n async decodeAudio(adtsBuffer) {\n try {\n const totalStartTime = Date.now();\n \n if (!adtsBuffer || !(adtsBuffer instanceof ArrayBuffer)) {\n throw new Error('Invalid ADTS buffer provided');\n }\n\n // Create audio context with a shared instance\n if (!window._sharedAudioContext) {\n window._sharedAudioContext = new (window.AudioContext || window.webkitAudioContext)();\n }\n const audioContext = window._sharedAudioContext;\n \n // Use a worker for decoding if available\n const decodeStartTime = Date.now();\n const audioBuffer = await new Promise((resolve, reject) => {\n audioContext.decodeAudioData(adtsBuffer, resolve, reject);\n });\n const decodeEndTime = Date.now();\n \n // Extract PCM data more efficiently\n const pcmData = [];\n for (let i = 0; i < audioBuffer.numberOfChannels; i++) {\n pcmData.push(audioBuffer.getChannelData(i));\n }\n \n // Create a more efficient play function\n const play = () => {\n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(audioContext.destination);\n source.start(0);\n \n return {\n source,\n context: audioContext,\n stop: () => source.stop()\n };\n };\n \n return {\n duration: audioBuffer.duration,\n sampleRate: audioBuffer.sampleRate,\n numberOfChannels: audioBuffer.numberOfChannels,\n length: audioBuffer.length,\n pcmData,\n play\n };\n } catch (error) {\n this.log(`Error decoding audio: ${error.message}`, 'error');\n throw error;\n }\n }\n\n async decodeAudioForAEV3(adtsBuffer, audioContext) {\n try {\n const totalStartTime = Date.now();\n \n if (!adtsBuffer || !(adtsBuffer instanceof ArrayBuffer)) {\n throw new Error('Invalid ADTS buffer provided');\n }\n \n // Use a worker for decoding if available\n const decodeStartTime = Date.now();\n const audioBuffer = await new Promise((resolve, reject) => {\n audioContext.decodeAudioData(adtsBuffer, resolve, reject);\n });\n\n return audioBuffer;\n } catch (error) {\n this.log(`Error decoding audio: ${error.message}`, 'error');\n throw error;\n }\n }\n\n /**\n * Verify samples before packaging\n * @param {Array<Object>} samples - Array of sample objects\n */\n verifySamples(samples) {\n if (!samples || samples.length === 0) {\n throw new Error('No samples to package');\n }\n\n // Check first few samples\n for (let i = 0; i < Math.min(3, samples.length); i++) {\n const sample = samples[i];\n if (!sample.data || !sample.size) {\n throw new Error(`Invalid sample at index ${i}: missing data or size`);\n }\n if (sample.data.byteLength !== sample.size) {\n throw new Error(`Sample size mismatch at index ${i}: expected ${sample.size}, got ${sample.data.byteLength}`);\n }\n \n // Log sample details\n const dataView = new Uint8Array(sample.data);\n // this.log(`Sample ${i} details:`, 'info');\n // this.log(` Size: ${sample.size} bytes`, 'info');\n // this.log(` First 8 bytes: ${Array.from(dataView.slice(0, 8)).map(b => b.toString(16).padStart(2, '0')).join(' ')}`, 'info');\n }\n }\n\n /**\n * Verify ADTS buffer after packaging\n * @param {ArrayBuffer} adtsBuffer - ADTS-packaged AAC data\n */\n verifyAdtsBuffer(adtsBuffer) {\n if (!adtsBuffer || adtsBuffer.byteLength === 0) {\n throw new Error('Empty ADTS buffer created');\n }\n\n const dataView = new Uint8Array(adtsBuffer);\n \n // Check first frame\n if (dataView[0] !== 0xFF || (dataView[1] & 0xF0) !== 0xF0) {\n throw new Error('Invalid ADTS syncword in first frame');\n }\n\n this.log(`ADTS buffer verification:`, 'info');\n this.log(`Total size: ${adtsBuffer.byteLength} bytes`, 'info');\n this.log(`First 16 bytes: ${Array.from(dataView.slice(0, 16)).map(b => b.toString(16).padStart(2, '0')).join(' ')}`, 'info');\n\n // Try to find subsequent frames\n let offset = 0;\n let frameCount = 0;\n while (offset < adtsBuffer.byteLength) {\n if (dataView[offset] !== 0xFF || (dataView[offset + 1] & 0xF0) !== 0xF0) {\n throw new Error(`Invalid ADTS syncword at offset ${offset}`);\n }\n \n // Get frame length from ADTS header\n const frameLength = ((dataView[offset + 3] & 0x03) << 11) |\n (dataView[offset + 4] << 3) |\n ((dataView[offset + 5] & 0xE0) >> 5);\n \n if (frameLength <= 7) {\n throw new Error(`Invalid frame length ${frameLength} at offset ${offset}`);\n }\n\n offset += frameLength;\n frameCount++;\n\n if (frameCount <= 3) {\n this.log(`Frame ${frameCount}: length=${frameLength}, offset=${offset}`, 'info');\n }\n }\n\n this.log(`Found ${frameCount} valid ADTS frames`, 'success');\n }\n\n\n /**\n * Dynamic frame size variant of getHeader that handles variable frame sizes efficiently\n * @param {number} frameLength - Length of the frame including header\n * @returns {Uint8Array} - ADTS header (7 bytes)\n */\n getDynamicHeader(frameLength) {\n // Default AAC-LC profile with 2 channels and 44.1kHz\n const profile = 2; // AAC-LC\n const samplingFrequencyIndex = 4; // 44.1kHz\n const channelConfig = 2; // Stereo\n \n const adts = new Uint8Array(7);\n \n // Syncword: 12 bits set to 1\n adts[0] = 0xFF;\n adts[1] = 0xF1; // 0xF1 for MPEG-4 with protection_absent=1\n \n // Bits 7-6: profile (profile - 1)\n // Bits 5-2: sampling frequency index (4 bits)\n // Bit 1: private bit (0)\n // Bit 0: high bit of channel configuration (channelConfig >> 2)\n adts[2] = ((profile - 1) << 6) | (samplingFrequencyIndex << 2) | (channelConfig >> 2);\n \n // Bits 7-6: lower 2 bits of channel configuration (channelConfig & 3)\n // Bits 5-0: first 6 bits of frame length (frameLength >> 11)\n adts[3] = ((channelConfig & 3) << 6) | ((frameLength >> 11) & 0x3F);\n \n // Next 8 bits of frame length\n adts[4] = (frameLength >> 3) & 0xFF;\n \n // Bits 7-5: last 3 bits of frame length\n // Bits 4-0: first 5 bits of buffer fullness (set to 0x7FF, so high bits = 0x1F)\n adts[5] = ((frameLength & 7) << 5) | 0x1F;\n \n // Last 6 bits of buffer fullness (all set) and 2 bits for number of raw data blocks (0)\n adts[6] = 0xFC;\n \n return adts;\n }\n \n /**\n * Enhanced fallback method with improved ADTS header generation\n * @param {ArrayBuffer} mdatData - Raw AAC data from MDAT box\n * @param {number} frameSizeOrCount - Either the size of each frame in bytes, or if divideByCount=true, the number of frames to create\n * @param {boolean} divideByCount - If true, creates frameSizeOrCount frames of equal size\n * @returns {Object} - ADTS-packaged AAC frames\n */\n packageAacFramesWithFixedSize(mdatData, frameSizeOrCount = 1024, divideByCount = false, trackIdForDebug) {\n try {\n const totalStartTime = Date.now();\n \n if (!mdatData) {\n throw new Error('Invalid input data: mdatData is missing');\n }\n \n // Use a more efficient buffer allocation strategy\n const rawData = new Uint8Array(mdatData);\n const totalSize = rawData.length;\n \n let frameSize, frameCount;\n \n if (divideByCount) {\n // Calculate frame size by dividing total size by requested frame count\n frameCount = frameSizeOrCount;\n frameSize = Math.floor(totalSize / frameCount);\n this.log(`Using frame count division: ${frameCount} frames with ~${frameSize} bytes per frame`, 'warning');\n } else {\n // Use fixed frame size\n frameSize = frameSizeOrCount;\n frameCount = Math.floor(totalSize / frameSize);\n this.log(`Using fixed frame size: ${frameSize} bytes per frame, creating ${frameCount} frames`, 'warning');\n }\n \n if (frameCount === 0 || frameSize < 16) {\n throw new Error(`Invalid frame configuration: count=${frameCount}, size=${frameSize}`);\n }\n \n this.log(`Creating ${frameCount} frames from ${totalSize} bytes of data`, 'info');\n \n // Create the frames\n const output_buffers = [];\n for (let i = 0; i < frameCount; i++) {\n // For the last frame, adjust size if necessary to avoid reading past the end\n let currentFrameSize = frameSize;\n const inputOffset = i * frameSize;\n \n // Make sure we don't read past the end of the data\n if (inputOffset + currentFrameSize > totalSize) {\n currentFrameSize = totalSize - inputOffset;\n // Skip this frame if we don't have enough data left for a meaningful frame\n if (currentFrameSize < 16) {\n continue;\n }\n }\n \n // For each frame, generate a header with exactly the right frame length\n const adtsFrameLength = currentFrameSize + 7; // header is always 7 bytes\n const header = this.getDynamicHeader(adtsFrameLength);\n \n const output = new Uint8Array(adtsFrameLength);\n \n // Copy header\n output.set(header, 0);\n \n // Copy frame data\n output.set(rawData.subarray(inputOffset, inputOffset + currentFrameSize), 7);\n \n output_buffers.push(output);\n }\n \n const totalEndTime = Date.now();\n this.log(`Total AAC fixed-size packaging completed in ${(totalEndTime - totalStartTime).toFixed(2)}ms`, 'timing');\n \n console.log(`Successfully created frames by dividing MDAT (${mdatData.byteLength} bytes), track: ${trackIdForDebug}`);\n \n // debugger;\n return { buffers: output_buffers };\n } catch (error) {\n this.log(`Error in fixed-size AAC packaging: ${error.message}`, 'error');\n throw error;\n }\n }\n}\n\n/*\n// Export the class\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = AACAdtsPackager;\n} else {\n window.AACAdtsPackager = AACAdtsPackager;\n}\n*/","/**\n * CAUTION: this is obviously a technical debt to build to just to speed up testing of MP4/AAC\n *\n * Goal is to replace quantised AAC with unquantise MP4 contains four stems of AACs\n */\n\n// import { clearInterval, clearTimeout, setInterval, setTimeout } from 'worker-timers';\nimport { FetchGroupErrorCause, fetchSegment, SingleArrayBufferLoadingPercent } from '../utils/cache';\nimport { EventEmitter } from '../event-emitter';\nimport { ITrackForSequence, TStemType } from '../interface';\n// import { calculateMemoryForAudioBuffers } from \"../utils/memory\";\nimport { composeMP4Sequences, extractTfraData, ByteSampleSegment, isAudioFormatValid } from '../utils/mp4';\nimport { extractBytes, isOverlap } from '../utils/buffer-ops';\nimport { isSafariOriOS } from '../utils/browser-check';\nimport { STEM_FIELDS_SUPPORTED } from '@/components/prototype-panel-v2';\n// import { decodeAudioBuffer } from \"../decode/depreciated/decoding-class\";\nimport { decodeMp4AudioBufferVer2 } from '../decode/3-parallel-queue/mp4-decoding-class-v2-audio-context';\n// import { decodeAudioBufferVer2 } from \"../decode/3-parallel-queue/decoding-class-v2-workers\";\n// import { TIMER_LOG_AUDIO_CONTEXT } from \"../audio-context\";\n// import { LATENCY_HINT_DECODE } from \"../global-aev3-controller\";\n// import { pause } from '@/components/music-control-audio/audio-context';\nimport { AEV3Config } from '../aev3-env-config';\n\nimport { MP4MoofExtractor } from '../utils/mp4-parser/mp4-moof-extractor';\nimport { AACAdtsPackager } from '../utils/mp4-parser/aac-adts-packager';\n\nimport { ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES } from '../utils/preload';\nimport { consoleColorfulMessage } from '../utils/colorConsole';\n\nexport const MOOF_BATCH_SIZE = 3; // Fetch 3 MOOF boxes at a time\n\n/** Parse HTTP date (e.g. 'Tue, 09 Dec 2025 18:20:24 GMT') to Date for comparison. Returns null if input is null/undefined or invalid. */\nfunction parseHttpDate(value: string | undefined | null): Date | null {\n if (value == null || value === '') return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nconst adtsPackager = new AACAdtsPackager({\n onLog: console.log,\n});\n\nconst moofExtractor = new MP4MoofExtractor({\n log: console.log,\n});\n\nexport interface IAudioSourceSequence {\n manifest_url: string;\n segments: IMP4SequenceChunk[];\n headerBuffer: ArrayBuffer;\n stemType: string;\n sequenceId: string;\n signature: string;\n}\n\nexport interface IMP4SequenceChunk {\n segmentId: string;\n nextSegmentId: string;\n isLastSegment: boolean;\n byteSampleSegment: ByteSampleSegment;\n cached: {\n arrayBuffer: ArrayBuffer | undefined;\n cacheTimeMS: number;\n isDownloading: boolean;\n cacheStartTime: number;\n firstError: string;\n _error: FetchGroupErrorCause[];\n };\n parent: IAudioSourceSequence;\n}\n\nexport type AudioSourceSequenceEventM3U8Created = {\n detail: { trackId: string };\n type: string;\n};\n\nexport type AudioSourceSequenceEventM3U8Failed = {\n detail: { trackId: string };\n type: string;\n};\n\nexport type AudioSourceSequenceEventSegmentOfSingleSequenceLoaded = {\n detail: { scope: string; sequenceIdx: number; segmentIdx: number };\n type: string;\n};\n\nexport type AudioSourceSequenceEventSegmentOfMultipleSequenceLoaded = {\n detail: { scope: string; sequenceIndices: number[]; segmentIdx: number };\n type: string;\n};\n\nexport type AudioSourceSequenceEventSingleArrayBufferLoadingPercent = {\n detail: SingleArrayBufferLoadingPercent;\n type: string;\n};\n\nexport type AudioSourceSequenceEventLoadAllSequencesWithIndexRangeProvided = {\n detail: { startSegmentIndex: number; endSegmentIndex: number; sessionId: string; isPreloadCommand: boolean };\n type: string;\n};\n\nexport type AudioSourceSequenceEventLoadSingleSequenceWithIndexRangeProvided = {\n detail: { sequenceIdx: number; startSegmentIndex: number; endSegmentIndex: number; sessionId: string };\n type: string;\n};\n\nexport type AudioSourceSequenceEventChunkDetails = {\n detail: MP4ChunkDetails;\n type: string;\n};\n\nexport type AudioSourceSequenceEventSequenceDetails = {\n detail: AudioSourceSequenceDetails;\n};\n\ntype AudioSourceSequenceDetails = {\n sequenceIdx: number;\n sequenceId: string;\n trackId: number;\n};\n\ntype MP4ChunkDetails = {\n sequenceIdx: number;\n sequenceId: string;\n segmentIdx: number;\n segmentId: string;\n trackId: number;\n};\n\nconst PRELOAD_AAC_SEGMENTS_COUNT = 3;\nconst SAMPLE_RATE = 48000;\nconst SHOW_DEBUG_FOR_GET_AUDIO_BUFFER = false;\n\nconst ENABLE_DEBUG_FOR_INFINITE_MIX_PRELOAD = false;\n\nconst PRIMING_SAMPLES_FOR_DECODE = 2048;\n\nconst GET_AUDIO_BUFFER_MESSAGE_STILL_INITIALISING = 'MP4 still initialising';\nconst GET_AUDIO_BUFFER_MESSAGE_SUCCEED = 'succeed';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst GET_AUDIO_BUFFER_MESSAGE_RANGE_NOT_EXIST = 'MOOV range not exists';\nconst GET_AUDIO_BUFFER_MESSAGE_STILL_DOWNLOADING_SEGMENT = 'MOOV segment still downloading';\nexport const GET_AUDIO_BUFFER_MESSAGE_AUDIO_SOURCE_NOT_INIT = 'MP4Sequence not initialised';\nexport const GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR = 'Corrupted audio file detected';\nexport const GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET = 'segment not ready';\nexport const GET_AUDIO_BUFFER_MESSAGE_EXCEPTIONAL_ERROR = 'MOOV exception error';\n\nexport class AudioSourceSequence extends EventEmitter {\n // Commands\n static AUDIO_SOURCE_MANIFEST_PARSED_CREATED = 'audio source manifest parsed';\n static AUDIO_SOURCE_MANIFEST_PARSED_FAILED = 'audio source manifest parsing failed';\n static LOADED_ALL_SEQUENCES_SEGMENTS_REQUESTED = 'MP4-all-stems-segments-requested-loaded (Range)';\n static LOADED_SINGLE_SEQUENCE_SEGMENTS_REQUESTED = 'MP4-single-stem-segments-requested-loaded (Range)';\n static UNLOADED_ALL_SEQUENCES_SEGMENTS_REQUESTED = 'MP4-all-stems-segments-requested-UNloaded (Range)';\n\n // Progress\n static PROGRESS_SINGLE_STEM_INDIVIDUAL_SEGMENT_LOADED = 'MP4-single-stem-segments-loaded';\n static PROGRESS_MULTIPLE_STEMS_INDIVIDUAL_SEGMENT_LOADED = 'MP4-multiple-stems-segments-loaded';\n\n static SEGMENT_LOADING_ERROR = 'MP4-stems-segments-loading-error';\n static SEGMENTS_BATCH_LOADING_ERROR = 'MP4-segments-batch-loading-error';\n static SAMPLE_RANGE_REQUESTED_NOT_EXISTED = 'MP4-segments-error-sample range is not covered at this track';\n\n // Not using\n static SINGLE_ARRAY_BUFFER_LOAGING_PERCENT = 'single-array-buffer-loading-percent';\n static GROUP_ARRAY_BUFFER_LOAGING_PERCENT = 'grouped-array-buffer-loading-percent (not implemented)';\n\n // properties\n isLoading: boolean;\n isInitialised: 'INITIALISED' | 'NOT_YET' | 'FLAWED';\n isDecoding: boolean;\n trackId: string = '';\n trackData!: ITrackForSequence;\n\n eTagOfTailSegment: string | undefined;\n lastModifiedOfTailSegment: string | undefined;\n dateOfTailSegment: string | undefined;\n\n isMP4TailFlawed: boolean;\n errorOnInit: string;\n\n diffETagDetected = false;\n\n // change to private later\n sequences: IAudioSourceSequence[] = [];\n\n // updated when BAR_PLAYED fired\n sourcePlaying: {\n [sequenceIdx: number]: {\n sampleEndOfPlayingChunk: number;\n sequenceIdx: number;\n sequenceId: string;\n };\n } = {};\n\n interval_caching: ReturnType<typeof setInterval> | undefined;\n interval_evicting: ReturnType<typeof setInterval> | undefined;\n\n constructor() {\n super();\n this.isLoading = false;\n this.isInitialised = 'NOT_YET';\n this.isDecoding = false;\n this.isMP4TailFlawed = false;\n this.errorOnInit = '';\n }\n\n _log(...msg: unknown[]) {\n return;\n console.log(...msg);\n }\n\n destroy() {\n this._log(`destroying MP4 ${this.trackData?.trackId || 'NIL'}`);\n this.clearEventEmitter();\n this.sequences.forEach((s) => {\n s.segments.forEach((c) => {\n // delete c.cached.arrayBuffer;\n c.cached.arrayBuffer = undefined;\n c.cached.cacheTimeMS = -1;\n c.cached._error = [];\n\n type FrameRow = ByteSampleSegment['tracks'][number]['frames'][number];\n Object.keys(c.byteSampleSegment.tracks).forEach((key) => {\n const trackId = Number(key) as keyof ByteSampleSegment['tracks'];\n const trackEntry = c.byteSampleSegment.tracks[trackId];\n if (!trackEntry) return;\n trackEntry.frames.forEach((f: FrameRow) => {\n f.sampleStart = 0;\n f.sampleEnds = 0;\n f.rawData = new Uint8Array(0);\n });\n delete c.byteSampleSegment.tracks[trackId];\n });\n c.byteSampleSegment.tracks = {} as ByteSampleSegment['tracks'];\n const clearedChunk = c as unknown as {\n byteSampleSegment: ByteSampleSegment | null;\n parent: IAudioSourceSequence | null;\n };\n clearedChunk.byteSampleSegment = null;\n clearedChunk.parent = null;\n });\n s.headerBuffer = new ArrayBuffer(0);\n s.segments = [];\n s.segments.length = 0; // Clear the array\n });\n\n // performance.clearResourceTimings();\n // this._log(this.sequences)\n const tornDown = this as unknown as {\n sequences: IAudioSourceSequence[] | null;\n trackData: ITrackForSequence | null;\n sourcePlaying: AudioSourceSequence['sourcePlaying'] | null;\n };\n tornDown.sequences = null;\n // this.trackData.beats = null; // don't ever try to do this, or it remove original objects's beats\n tornDown.trackData = null;\n // this should be no longer in use\n tornDown.sourcePlaying = null;\n this.errorOnInit = '';\n }\n\n async initialise(trackData: ITrackForSequence, field: STEM_FIELDS_SUPPORTED, token: string, diffETagDetected: boolean) {\n this.diffETagDetected = diffETagDetected;\n this.isLoading = true;\n this.sequences = [];\n this.sourcePlaying = {};\n\n // this._log(trackData);\n\n const stemPosition = ['drums', 'bass', 'vocals', 'other'];\n const stems = stemPosition.map((position) => {\n return { stemId: `${trackData.trackId}_${position}` as TStemType, stemPosition: position, mp4: trackData.url };\n });\n\n // this._log(stems)\n\n const mp4Path = trackData.url;\n this.trackData = trackData;\n this.trackId = trackData.trackId;\n\n this._log(`%cpreload at ${this.trackData.trackId} [${this.trackData.name}] - byte sample mapping`, 'color: red');\n\n return new Promise((resolve, reject) => {\n // Store reference to this to prevent context loss\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n extractTfraData(mp4Path, token, diffETagDetected)\n .then((tfraData) => {\n // Check if the instance is still valid\n if (!self || !self.trackData) {\n this._log('autoplay - AudioSourceSequence instance is null or trackData is null?', mp4Path, tfraData, self, self?.trackData);\n this._log('This suggests the AudioSourceSequence was destroyed before the Promise resolved');\n resolve(false);\n return;\n }\n\n if (!tfraData) {\n throw Error('tfra data not found');\n }\n\n if (!isAudioFormatValid(tfraData, mp4Path)) {\n throw Error('audio formater not valid');\n }\n\n this.eTagOfTailSegment = tfraData.eTag;\n this.lastModifiedOfTailSegment = tfraData.lastModified;\n this.dateOfTailSegment = tfraData.date;\n\n const sequences = stems.map((s, index) => composeMP4Sequences(s, index, `${index.toString()}_${s.stemPosition}`, trackData.name, field, tfraData));\n\n const dispatchEventOnUtils = self.dispatchEvent.bind(self);\n\n this._log(`[AudioSourceSequence::initialise]`, trackData.trackId, trackData.name);\n\n this._log(`[MP4Sequence::audio_source_manifest_created] (results remarked)` /*, sequences*/);\n\n // Camus: to follow up: 20250923-771-songs-station.md\n // this.trackData became null\n // this.isMP4TailFlawed // [this] became undefined\n // which means the AudioSource already cleared, see if it is related to ultra short segemnt/chunk length\n\n if (!AudioSequenceValidation_Beats_Matching_MP4(sequences[0], self.trackData)) {\n self.isMP4TailFlawed = true;\n self.isInitialised = 'FLAWED';\n self.errorOnInit = `MP4 Error: Beats is not matching with MP4 Tail ${trackData?.trackId}`;\n\n this._log(`autoplay flawed mp4 ${self?.trackData?.trackId}`, self.sequences[0], self.trackData);\n\n dispatchEventOnUtils(AudioSourceSequence.AUDIO_SOURCE_MANIFEST_PARSED_FAILED, {\n trackId: self.trackData.trackId,\n });\n throw Error(`MP4 Error: Beats is not matching with MP4 Tail ${trackData?.trackId}`);\n }\n\n self.sequences = sequences;\n self.isLoading = false;\n self.isInitialised = 'INITIALISED';\n\n if ((self.trackData as ITrackForSequence).indices) {\n try {\n /*\n const normalStartBeatIndex = (self.trackData as ITrackForSequence).indices.normal.startingIndex;\n const normalStartMoofIndex = self.getSegmentsIdxWithSampleLoc(0, resolveSampleLocOfDownbeatFromBarIndex(self.trackData as ITrackForSequence,normalStartBeatIndex));\n const infiniteStartBeatIndex = (self.trackData as ITrackForSequence).indices.infinite.startingIndex;\n const infiniteStartMoofIndex = self.getSegmentsIdxWithSampleLoc(0, resolveSampleLocOfDownbeatFromBarIndex(self.trackData as ITrackForSequence, infiniteStartBeatIndex));\n this._log(`trigger preload: (self.trackData as ITrackForSequence).indices.normal.startingIndex(${normalStartBeatIndex}, ${self.sequences[0].segments[normalStartMoofIndex].byteSampleSegment.sampleStart})`, normalStartMoofIndex);\n this._log(`trigger preload: (self.trackData as ITrackForSequence).indices.infinite.startingIndex(${infiniteStartBeatIndex}, ${self.sequences[0].segments[infiniteStartMoofIndex].byteSampleSegment.sampleStart})`, infiniteStartMoofIndex);\n // Investigate later on this one: Is preload index correct\n self.preload(normalStartMoofIndex, false, 'MP4::After Tail init (normal)')\n .then(()=>{\n this._log('MP4::After Tail init (normal) done preload')\n })\n self.preload(infiniteStartMoofIndex, false, 'MP4::After Tail init (infinite)')\n .then(()=>{\n this._log('MP4::After Tail init (infinite) done preload')\n })\n */\n } catch (err) {\n this._log('error preloading after byte sample mapping resolved - ', err);\n }\n }\n\n dispatchEventOnUtils(AudioSourceSequence.AUDIO_SOURCE_MANIFEST_PARSED_CREATED, {\n trackId: self.trackData.trackId,\n });\n\n resolve(true);\n })\n .catch((err: Error) => {\n self.isMP4TailFlawed = true;\n self.isInitialised = 'FLAWED';\n self.errorOnInit = err.toString();\n\n this._log(`autoplay flawed mp4 ${self?.trackData?.trackId}`, self.sequences[0], self.trackData);\n if (err.toString()?.includes('tfra data not found')) {\n // console.error('This audio track is not re-processed yet.');\n } else {\n // console.error('MP4 Parsing Error', err);\n }\n // Reject the outer promise instead of throwing, so it can be caught by callers\n reject(err);\n });\n });\n }\n\n async preload(preloadAtMoofBoxIndex: number = 0, updatePlayheadAtTargetIndex: boolean = false, signature: string = ''): Promise<boolean> {\n this._log(`%cpreload at ${this.trackData.trackId} [${this.trackData.name}] ${preloadAtMoofBoxIndex}... ${updatePlayheadAtTargetIndex} /// ${signature}`, 'color: red');\n\n for (let i = 0; i < 4; i++) {\n this._log(this.sequences[i].segments[preloadAtMoofBoxIndex]);\n }\n const segmentLength = this.sequences?.[0]?.segments?.length;\n const chunkToPreload = preloadAtMoofBoxIndex + PRELOAD_AAC_SEGMENTS_COUNT; // if wanna make it 2, trigger the decode check after cacheing\n const target = segmentLength <= chunkToPreload ? segmentLength - 1 : chunkToPreload;\n if (ENABLE_DEBUG_FOR_INFINITE_MIX_PRELOAD) {\n this._log(`${this.trackData.trackId} ${this.trackData.trackMixType} [AudioSourceSequence::preload] ${preloadAtMoofBoxIndex}-${target} segments, getAudioBuffer`);\n }\n return this.loadAllSequencesWithMoofIndex(preloadAtMoofBoxIndex, target, Math.random().toFixed(9), true).then((loadedSuccessfully) => {\n if (updatePlayheadAtTargetIndex) {\n for (let i = 0; i < 4; i++) {\n this.updateSampleLocJustPlayed(i, this.sequences[i].segments[chunkToPreload].byteSampleSegment.sampleEnd, 'preload');\n }\n }\n return loadedSuccessfully;\n });\n }\n\n // both values provide should included\n async preloadWithRange(preloadAtMoofIndex: number, preloadEndAtMoofIndex: number, signature: string = ''): Promise<boolean> {\n if (this.getIsInitialised() !== 'INITIALISED') {\n throw Error(`Trying to preload before Audio Source is initialised ${signature}`);\n }\n\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES)\n this._log(`%cpreloadWithRange at ${this.trackData.trackId} [${this.trackData.name}] ${preloadAtMoofIndex} - ${preloadEndAtMoofIndex}... ${signature}`, 'color: red');\n\n // for(let i=0; i<4; i++) {\n // this._log(this.sequences[i].segments[preloadAtMoofIndex]);\n // }\n const segmentLength = this.sequences?.[0]?.segments?.length;\n const target = segmentLength <= preloadEndAtMoofIndex ? segmentLength - 1 : preloadEndAtMoofIndex;\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES)\n this._log(`${this.trackData.trackId} ${this.trackData.trackMixType} [AudioSourceSequence::preload] ${preloadAtMoofIndex}-${target} segments, getAudioBuffer`);\n\n return this.loadAllSequencesWithMoofIndex(preloadAtMoofIndex, target, Math.random().toFixed(9), true).then((loadedSuccessfully) => {\n // this._log(this.sequences[0].segments.map((v, index)=> (index >=preloadAtMoofIndex && index <=target) ? v : null ).filter((v)=> v!==null));\n return loadedSuccessfully;\n });\n }\n\n // both values provide should included\n // note the sample provided will be used to search within moof box list, and preloadAtSample48000 - 2112 sample will be covered\n async preloadWithSampleRange(preloadAtSample48000: number, preloadEndAtSample48000: number, signature: string = ''): Promise<boolean> {\n if (this.getIsInitialised() !== 'INITIALISED') {\n throw Error(`Trying to preload before Audio Source is initialised ${signature}`);\n }\n\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES)\n this._log(`%cpreloadWithSampleRange at ${this.trackData.trackId} [${this.trackData.name}] ${preloadAtSample48000}...${preloadEndAtSample48000} ${signature}`, 'color: red');\n\n const sequenceIdx = 0; // use OTHER stem, for MP4, all four stems are baked into 1, so it doesn't matter the byte sample mapping to download should be the same\n const [sequence, segments] = this.getSegmentInfo(sequenceIdx, preloadAtSample48000, preloadEndAtSample48000);\n const segmentsStartIndex = sequence.segments.findIndex((s) => s === segments[0]);\n const segmentsEndIndex = sequence.segments.findIndex((s) => s === segments[segments.length - 1]);\n /*\n console.table({\n trackId: this.trackData.trackId,\n name: this.trackData.name,\n note: 'CAUTION: values should included the number itself, and actual sampleRequestedFrom used will be (sampleRequestedFrom - 2112 due to safari decoding), so it might end up cover previous segment as backup',\n sampleRequestedFrom: preloadAtSample48000, \n sampleRequestedTo: preloadEndAtSample48000,\n segmentsCoveredFrom: segments[0].byteSampleSegment.sampleStart, \n segmentsCoveredTo: segments[segments.length-1].byteSampleSegment.sampleEnd, \n segmentsStartIndex,\n segmentsEndIndex,\n });\n */\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) this._log('[preload] sequence for audit', sequence);\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) this._log('[preload] segments for audit', sequence.segments);\n\n return this.preloadWithRange(segmentsStartIndex, segmentsEndIndex, `${signature} [resolved from preloadWithSampleRange]`);\n }\n\n // both values provide should included\n async preloadWithTimeRange(preloadAtStartTime: number, preloadDuration: number, signature: string = ''): Promise<boolean> {\n if (this.getIsInitialised() !== 'INITIALISED') {\n throw Error(`Trying to preload before Audio Source is initialised ${signature}`);\n }\n\n this._log(`%cpreloadWithTimeRange at ${this.trackData.trackId} [${this.trackData.name}] ${preloadAtStartTime} duration: ${preloadDuration} ${signature}`, 'color: red');\n return this.preloadWithSampleRange(preloadAtStartTime * SAMPLE_RATE, (preloadAtStartTime + preloadDuration) * SAMPLE_RATE, `${signature} [resolved from preloadWithSampleRange]`);\n }\n\n async preloadSneakyVer(preloadAtIndex: number, count: number = 2): Promise<boolean> {\n const segmentLength = this.sequences?.[0]?.segments?.length;\n const chunkToPreload = preloadAtIndex + count - 1; // if wanna make it 2, trigger the decode check after cacheing\n const target = segmentLength <= chunkToPreload ? segmentLength - 1 : chunkToPreload;\n return new Promise((resolve) => {\n this.loadAllSequencesWithMoofIndex(preloadAtIndex, target, Math.random().toFixed(9), false).then((loadedWithoutError) => {\n // validate if the chunks are loaded\n // if yes resolve with true\n resolve(loadedWithoutError);\n });\n });\n }\n\n updateSampleLocJustPlayed(sequenceIdx: number, samplePlayed: number, signature: string) {\n if (!this.sequences || !this.sequences[sequenceIdx]) {\n // this._log(`mp4[${sequenceIdx}] is not resolved yet, updatePlayhead later.`);\n return false;\n }\n\n if (ENABLE_DEBUG_FOR_INFINITE_MIX_PRELOAD) {\n this._log(`${this.trackData.trackId} ${this.trackData.name} ${this.trackData.trackMixType} updateSampleLocJustPlayed ${samplePlayed}, getAudioBuffer, ${signature}`);\n }\n // this._log(`${this.trackData.trackId} ${this.trackData.name} ${this.trackData.trackMixType} updateSampleLocJustPlayed ${samplePlayed}, getAudioBuffer, ${signature}`);\n this.sourcePlaying[sequenceIdx] = {\n sequenceIdx,\n sequenceId: this.sequences[sequenceIdx].sequenceId,\n sampleEndOfPlayingChunk: samplePlayed,\n };\n\n return true;\n }\n\n updateSampleLocJustPlayedUntilManifestResolved(sequenceIdx: number, samplePlayed: number, signature: string) {\n if (!this.updateSampleLocJustPlayed(sequenceIdx, samplePlayed, signature)) {\n setTimeout(() => {\n this.updateSampleLocJustPlayedUntilManifestResolved(sequenceIdx, samplePlayed, signature);\n }, 100);\n }\n }\n\n getSegmentsWithSampleLoc(sequenceId: string, sample: number): number {\n const sequenceIdx = this.sequences.findIndex((s) => s.sequenceId === sequenceId);\n return this.getSegmentsIdxWithSampleLoc(sequenceIdx, sample);\n }\n\n getSegmentsIdxWithSampleLoc(sequenceIdx: number, sample_: number): number {\n // always cover previous 2112 samples if possible, since this function is used to resolve the MOOF segments from sample\n // make sure it covered 2112 sample diff is quite important, that makes it when decoding audio, the getAudioBuffer always have the stuff it needed\n const sample = sample_ - PRIMING_SAMPLES_FOR_DECODE < 0 ? 0 : sample_ - PRIMING_SAMPLES_FOR_DECODE;\n const currentSequence = this.sequences[sequenceIdx];\n const currentSegmentIndex = currentSequence.segments.findIndex((e) => e.byteSampleSegment.sampleStart <= sample && sample <= e.byteSampleSegment.sampleEnd);\n return currentSegmentIndex;\n }\n\n getPlayingChunksInfo(): {\n segmentId: string;\n segmentIdx: number;\n sequenceId: string;\n sequenceIdx: number;\n }[] {\n return Object.values(this.sourcePlaying).map((value) => {\n const currentSequence = this.sequences[value.sequenceIdx];\n const sampleEnd = value.sampleEndOfPlayingChunk;\n const currentSegmentIndex = currentSequence.segments.findIndex((e) => e.byteSampleSegment.sampleStart <= sampleEnd && sampleEnd <= e.byteSampleSegment.sampleEnd);\n\n return {\n segmentId: currentSequence.segments[currentSegmentIndex].segmentId,\n segmentIdx: currentSegmentIndex,\n sequenceId: value.sequenceId,\n sequenceIdx: value.sequenceIdx,\n };\n });\n }\n\n getMinimumPlayingIndex() {\n // current minimum index\n try {\n const currentChunksPlaying = this.getPlayingChunksInfo();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const minIndex = currentChunksPlaying.reduce((prev, current, index, arr) => {\n // this._log(prev, current)\n return Math.min(prev, current.segmentIdx);\n }, 9999999);\n const startIndex = minIndex === -1 || minIndex === 9999999 ? 0 : minIndex;\n return startIndex;\n } catch (err) {\n this._log(err);\n return -1;\n }\n }\n\n isSegmentIdxCached(segmentIdx: number, sequenceIdx: number = -1) {\n if (sequenceIdx === -1) {\n let cached = true;\n for (let j = 0; j < 4; j++) {\n if (!this.isMoofSegmentCached(this.sequences[j].segments[segmentIdx])) {\n cached = false;\n break;\n }\n }\n return cached;\n } else {\n return !!this.isMoofSegmentCached(this.sequences[sequenceIdx].segments[segmentIdx]);\n }\n }\n\n isMoofSegmentCached(segment: IMP4SequenceChunk) {\n const mp4TrackId = segment.byteSampleSegment._mp4TrackId;\n if (mp4TrackId && segment.byteSampleSegment.tracks[mp4TrackId].frames?.length > 0) {\n return true;\n }\n\n return false;\n }\n\n evictArrayBufferOnAllSequencesWithMoofIndex(moofBoxIndex: number) {\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) this._log(`%cpreload - evict MoofBox ${this.trackData.trackId} [${this.trackData.name}] ${moofBoxIndex}`, 'color: purple');\n this.sequences.forEach((s) => {\n s.segments[moofBoxIndex].cached.arrayBuffer = undefined;\n // evict the decoded audio\n const _mp4TrackId = s.segments[moofBoxIndex].byteSampleSegment._mp4TrackId;\n\n s.segments[moofBoxIndex].byteSampleSegment.tracks[_mp4TrackId].frames.forEach((f) => {\n f.sampleStart = 0;\n f.sampleEnds = 0;\n f.rawData = new Uint8Array(0);\n });\n s.segments[moofBoxIndex].byteSampleSegment.tracks[_mp4TrackId].frames = [];\n\n s.segments[moofBoxIndex].byteSampleSegment.tracks[_mp4TrackId].timeLog = {\n a_extractbytes: -1,\n b_extractmoof: -1,\n c_packageAACFrames: -1,\n };\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n evictArrayBufferAccordingToSampleRange(sequenceIdx: number, sampleStart48000: number, sampleEnd48000: number, _signature: string) {\n if (this.getIsInitialised() !== 'INITIALISED') {\n return;\n }\n try {\n const _sampleStart48000 = sampleStart48000; // - 192 > 0 ? sampleStart48000 - 192 : sampleStart48000;\n const _sampleEnd48000 = sampleEnd48000; // + 192;\n\n //const [sequence, segments, expectedBufferDecodedStart , expectedBufferDecodedEnd] = this.getSegmentInfo(sequenceIdx, _sampleStart48000 - PRIMING_SAMPLES_FOR_DECODE || 0, _sampleEnd48000);\n\n // now it will automatically cover the PRIMING_SAMPLES_FOR_DECODE with getSegmentInfo function\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [sequence, segments, expectedBufferDecodedStart, expectedBufferDecodedEnd] = this.getSegmentInfo(sequenceIdx, _sampleStart48000, _sampleEnd48000);\n\n if (ENABLE_DEBUG_FOR_INFINITE_MIX_PRELOAD) {\n const debugStartIndex = sequence.segments.findIndex((s) => s === segments[0]);\n this._log(`${this.trackData.trackId} ${this.trackData.trackMixType} getAudioBuffer finding arraybuffer at `, debugStartIndex);\n this._log(`${this.trackData.trackId} ${this.trackData.trackMixType} getAudioBuffer`, segments);\n }\n\n // validate the segments see if it is cached\n const segmentsDownloaded = segments.filter((s) => this.isMoofSegmentCached(s));\n segmentsDownloaded.forEach((s) => {\n const index = sequence.segments.findIndex((seg) => seg === s);\n this.evictArrayBufferOnAllSequencesWithMoofIndex(index);\n });\n } catch (err) {\n this._log(err);\n throw err;\n }\n }\n\n /**\n * Trigger caching of MP4 segments, ARRAY_BUFFER_PRELOADED will be fired or error will be printed\n * the arrayBuffer will be updated directly to sequences's items\n *\n * When this function resolved as true, should promise the Moof Boxes are accessible\n *\n * @param startIndex start (including) the MP4 segment's index\n * @param endIndex end (including) the MP4 segment's index\n * @param sessionId will be included in the dispatcher of events\n */\n // Missing:\n // Find the possible way to re-use startIndex / endIndex\n // for example\n // 3-4 for normal is asked\n // 12-14 for infinite is asked, how can we increase chance of reusing 12-15 if used started from 3...\n // 3-4, 5-6, 7-8, 9-10, 11-12\n\n // 15 16 17 - 18\n // 012, 345, 678, 9 10 11, 12 13 14, 15 16 17, 18 19 20\n\n loadAllSequencesWithMoofIndex(moofStartIndex: number, moofEndIndex: number, sessionId: string, isPreloadCommand: boolean = false): Promise<boolean> {\n const LOG_LOCAL_FUNCTION = false;\n\n // Make it always a Fraction equal to MOOF_BATCH_SIZE\n // 012, 345, 678, 91011...\n // so if startIndex is 2, it might cover previous 2 MOOF boxes as well, but this way we can ensure the indexedDB at\n // service worker.js likely to be a hit and able to re-use the MOOF if possible\n const startIndex = moofStartIndex - (moofStartIndex % MOOF_BATCH_SIZE);\n let endIndex = (Math.round(moofEndIndex / MOOF_BATCH_SIZE) + 1) * MOOF_BATCH_SIZE - 1;\n endIndex = Math.min(endIndex, this.sequences[0].segments.length - 1);\n\n // also determine if need to load it.\n\n if (LOG_LOCAL_FUNCTION) {\n this._log(`loadAllSequencesWithMoofIndex ${this.trackData.trackId} [${this.trackData.name}] ${moofStartIndex} - ${moofEndIndex}`);\n this._log(`loadAllSequencesWithMoofIndex ${this.trackData.trackId} [${this.trackData.name}] ACTUAL RANGE ${startIndex} - ${endIndex} (MOOF_BATCH_SIZE: ${MOOF_BATCH_SIZE})`);\n }\n const dispatchEventOnUtils = this.dispatchEvent.bind(this);\n this.isLoading = true;\n\n // Batch size for fetching multiple MOOF boxes in one request\n\n const promises = [];\n\n // TODO: We have to consider this bit is re-usable, trick is to massage the startIndex to make it more \"expectable\"\n\n const isMoofSegmentsCached = (moofStartIndex: number, moofEndindex: number) => {\n const sequenceIdx = 0;\n const segmentCachedStatus = this.sequences[sequenceIdx].segments\n .map((s, index) => {\n if (index >= moofStartIndex && index <= moofEndindex) {\n return !!this.isMoofSegmentCached(this.sequences[sequenceIdx].segments[index]);\n }\n return true;\n })\n .filter((v) => v === false);\n\n const isAllCached = segmentCachedStatus.length === 0;\n return isAllCached;\n // this._log(`%c${this.trackData.trackId} [${this.trackData.name}] ${moofStartIndex} - ${moofEndindex} ${isAllCached ? 'isAllCached': 'NOT cached'}`, 'color: orangered;');\n };\n\n const isMoofSegmentsMarkedAsErr = (moofStartIndex: number, moofEndindex: number) => {\n const sequenceIdx = 0;\n const segmentCachedStatus = this.sequences[sequenceIdx].segments\n .map((s, index) => {\n if (index >= moofStartIndex && index <= moofEndindex) {\n return this.sequences[sequenceIdx].segments[index].cached._error && this.sequences[sequenceIdx].segments[index].cached._error?.length > 0;\n }\n return false;\n })\n .filter((v) => v === true);\n // console.log('error marked: ', segmentCachedStatus);\n const hasError = segmentCachedStatus.length !== 0;\n return hasError;\n // this._log(`%c${this.trackData.trackId} [${this.trackData.name}] ${moofStartIndex} - ${moofEndindex} ${isAllCached ? 'isAllCached': 'NOT cached'}`, 'color: orangered;');\n };\n\n // Process in batches\n for (let batchStart = startIndex; batchStart <= endIndex; batchStart += MOOF_BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + MOOF_BATCH_SIZE - 1, endIndex);\n\n // Find min and max byte offsets for this batch\n let minOffset = Infinity;\n let maxOffset = 0;\n\n for (let i = batchStart; i <= batchEnd; i++) {\n const segment = this.sequences[0].segments[i];\n if (segment) {\n minOffset = Math.min(minOffset, segment.byteSampleSegment.byteRangeStart);\n maxOffset = Math.max(maxOffset, segment.byteSampleSegment.byteRangeEnd);\n }\n }\n\n // Actual code above lines doing:\n // minOffset = this.sequences[0].segments?.[batchStart]?.byteSampleSegment?.byteRangeStart;\n // maxOffset = this.sequences[0].segments?.[batchEnd]?.byteSampleSegment?.byteRangeEnd;\n\n if (isMoofSegmentsMarkedAsErr(batchStart, batchEnd)) {\n console.log(`${this.trackData?.trackId} - segments ${batchStart}-${batchEnd} already marked as error`);\n }\n\n if (!isMoofSegmentsCached(batchStart, batchEnd)) {\n promises.push(this.loadMultipleMoofSegments(batchStart, batchEnd, minOffset, maxOffset));\n }\n }\n\n return Promise.all(promises)\n .then(() => {\n dispatchEventOnUtils(AudioSourceSequence.LOADED_ALL_SEQUENCES_SEGMENTS_REQUESTED, {\n startSegmentIndex: startIndex,\n endSegmentIndex: endIndex,\n sessionId,\n isPreloadCommand,\n });\n this.isLoading = false;\n return true;\n })\n .catch(() => {\n // console.log(err);\n // console.error(`AudioSourceSequence: loadAllSequencesWithMoofIndex_Error: ${err.toString()}`);\n this.isLoading = false;\n return false;\n });\n }\n\n // note the endIndex is included\n // if this function is called, it will carry on all the procedures without consider if it is already in memory\n private loadMultipleMoofSegments(moofStartIndex: number, moofEndIndex: number, byteRangeStart: number, byteRangeEnd: number) {\n // const dispatchEventOnUtils = this.dispatchEvent.bind(this);\n\n // Create a promise for this batch\n const promise = new Promise<boolean>((resolve, reject) => {\n // Only fetch if we have valid offsets\n if (byteRangeStart === Infinity || byteRangeEnd === 0) {\n reject(false);\n return;\n }\n\n // Mark segments as downloading\n for (let i = moofStartIndex; i <= moofEndIndex; i++) {\n const segment = this.sequences[0].segments[i];\n if (segment) {\n segment.cached.isDownloading = true;\n }\n }\n\n // const sessionId = `loadMultipleMoofSegments ${this.trackData.trackId} [${this.trackData.name}] fetchGroup (${moofStartIndex} - ${moofEndIndex})...${Math.random().toFixed(4)}`;\n // console.time(sessionId);\n // Fetch the entire batch range\n const cacheStartTime: number = Date.now();\n\n const path = this.sequences[0].segments[moofStartIndex].byteSampleSegment.path;\n fetchSegment(\n {\n byteRangeStart: byteRangeStart,\n byteRangeEnd: byteRangeEnd,\n path: this.sequences[0].segments[moofStartIndex].byteSampleSegment.path,\n // Copy all required properties from the first segment in batch\n sampleStart: this.sequences[0].segments[moofStartIndex].byteSampleSegment.sampleStart,\n sampleEnd: this.sequences[0].segments[moofEndIndex].byteSampleSegment.sampleEnd,\n sampleLength: this.sequences[0].segments[moofEndIndex].byteSampleSegment.sampleEnd - this.sequences[0].segments[moofStartIndex].byteSampleSegment.sampleStart,\n startTime: this.sequences[0].segments[moofStartIndex].byteSampleSegment.startTime,\n endTime: this.sequences[0].segments[moofEndIndex].byteSampleSegment.endTime,\n duration: this.sequences[0].segments[moofEndIndex].byteSampleSegment.endTime - this.sequences[0].segments[moofStartIndex].byteSampleSegment.startTime,\n _mp4TrackId: this.sequences[0].segments[moofStartIndex].byteSampleSegment._mp4TrackId,\n tracks: this.sequences[0].segments[moofStartIndex].byteSampleSegment.tracks,\n signatures: {\n segmentIdx: moofStartIndex,\n sequenceIdx: 0,\n sequenceId: this.sequences[0].sequenceId,\n },\n // retry count = 1 since the iteration itself can deal with it again\n // Pass ETag from tail fetch to validate file hasn't changed (If-Match header)\n },\n 1,\n this.eTagOfTailSegment,\n this.lastModifiedOfTailSegment,\n this.dateOfTailSegment,\n this.diffETagDetected,\n // {\n // onIndividualChunkProgress: AudioSourceSequence.SINGLE_ARRAY_BUFFER_LOAGING_PERCENT,\n // onChunkGroupProgress: AudioSourceSequence.GROUP_ARRAY_BUFFER_LOAGING_PERCENT,\n // }, dispatchEventOnUtils)\n )\n .then(async (results) => {\n // debugger;\n const batchBuffer = results?.[0];\n const eTag: string | undefined = results?.[1];\n const lastModified: string | undefined = results?.[2];\n const date: string | undefined = results?.[3];\n\n if (\n eTag !== this.eTagOfTailSegment\n // || lastModified!==this.lastModifiedOfTailSegment\n // || date!==this.dateOfTailSegment\n ) {\n // if both are date and eTag > this.eTagOfTailSegment\n const tailLastModifiedParsed = parseHttpDate(this.lastModifiedOfTailSegment);\n const tailDateParsed = parseHttpDate(this.dateOfTailSegment);\n const segmentLastModifiedParsed = parseHttpDate(lastModified);\n const segmentDateParsed = parseHttpDate(date);\n const badFile = {\n id: 'ffs',\n trackId: this.trackId,\n 'TAIL(eTag)': this.eTagOfTailSegment,\n 'TAIL(lastModified)': this.lastModifiedOfTailSegment,\n 'TAIL(date)': this.dateOfTailSegment,\n 'TAIL(lastModifiedParsed)': tailLastModifiedParsed,\n 'TAIL(dateParsed)': tailDateParsed,\n\n 'SEGMENT(eTag)': eTag,\n 'SEGMENT(lastModified)': lastModified,\n 'SEGMENT(date)': date,\n 'SEGMENT(lastModifiedParsed)': segmentLastModifiedParsed,\n 'SEGMENT(dateParsed)': segmentDateParsed,\n\n // Comparable: same time = equal, null vs null = equal, null vs Date = not equal\n lastModifiedEqual: tailLastModifiedParsed?.getTime() === segmentLastModifiedParsed?.getTime(),\n dateEqual: tailDateParsed?.getTime() === segmentDateParsed?.getTime(),\n };\n console.table(badFile);\n\n const a = await extractTfraData(path, AEV3Config.getInstance().getAccessToken() ?? '', true);\n const tailLastModifiedParsedNew = a ? parseHttpDate(a.lastModified) : null;\n const badFile2 = {\n id: 'ffs',\n // trackId: this.trackId,\n 'TAIL-RE-FETCHED(eTag)': a?.eTag ?? null,\n 'TAIL-RE-FETCHED(lastModified)': a?.lastModified ?? null,\n 'TAIL-RE-FETCHED(date)': a?.date ?? null,\n };\n console.table(badFile2);\n\n if (a) {\n if (a.eTag === eTag) {\n console.log(\n `%cffs [file hash changed] mapping updated successfully ${path}, going to throw Error let caller retry, the new eTag should be ${eTag}`,\n 'color: yellowgreen',\n );\n } else {\n if (segmentLastModifiedParsed && tailLastModifiedParsedNew && segmentLastModifiedParsed > tailLastModifiedParsedNew) {\n console.log(\n `%cffs [file hash changed] mapping does not update after refetch! ${path}, going to throw Error let caller retry once`,\n 'color: red; background: black;',\n );\n }\n }\n\n if (segmentLastModifiedParsed && tailLastModifiedParsedNew && segmentLastModifiedParsed < tailLastModifiedParsedNew) {\n console.log(`%cffs Problem happens at Segment Level... when retry might need to fetch with tails eTag ${path}`, 'color: pink; background: black');\n }\n } else {\n console.warn(`ffs tail refetch failed for ${path}, throwing to trigger caller retry`);\n }\n\n throw new Error(`bad moof loc: ${moofStartIndex}-${moofEndIndex}`, { cause: `${JSON.stringify({ ...badFile, ...badFile2 })}` });\n }\n\n const cacheTimeMS = Date.now() - cacheStartTime;\n\n // Process each segment in the batch\n for (let i = moofStartIndex; i <= moofEndIndex; i++) {\n const segment = this.sequences[0].segments[i];\n if (!segment) continue;\n\n // Calculate relative offset in the batch buffer\n const relativeStart = segment.byteSampleSegment.byteRangeStart - byteRangeStart;\n // const segmentLength = segment.byteSampleSegment.byteRangeEnd - segment.byteSampleSegment.byteRangeStart + 1;\n const relativeEnd = segment.byteSampleSegment.byteRangeEnd - byteRangeStart;\n\n // Extract this segment's data\n const segmentBuffer = batchBuffer.slice(relativeStart, relativeEnd + 1); // End might be diff, but it seems + 1 is the one not included\n\n // Process for each sequence (stem)\n for (let sequenceIndex = 0; sequenceIndex < 4; sequenceIndex++) {\n const segment = this.sequences[sequenceIndex].segments[i];\n const _mp4TrackId = segment.byteSampleSegment._mp4TrackId;\n const { decodeByteStart, decodeByteLength } = segment.byteSampleSegment.tracks[_mp4TrackId];\n\n let start = Date.now();\n const ab = extractBytes(segmentBuffer, decodeByteStart, decodeByteLength);\n segment.byteSampleSegment.tracks[_mp4TrackId].timeLog.a_extractbytes = Date.now() - start;\n\n start = Date.now();\n\n // error handling of this, in case if it failed?\n let audioInfo;\n try {\n audioInfo = moofExtractor.extractMoofDataForAEV3(ab, _mp4TrackId, i, eTag, this.eTagOfTailSegment, this.trackData?.trackId || '');\n } catch (err) {\n // console.error(err);\n throw new Error(`bad moof loc: ${moofStartIndex}-${moofEndIndex}`, { cause: err });\n }\n\n segment.byteSampleSegment.tracks[_mp4TrackId].timeLog.b_extractmoof = Date.now() - start;\n\n start = Date.now();\n const { mdatData, trunData } = audioInfo;\n const { buffers: adtsBuffers } = adtsPackager.packageAacFramesForAEV3(mdatData, trunData, this.trackData?.trackId);\n segment.byteSampleSegment.tracks[_mp4TrackId].frames = adtsBuffers.map((e, index) => ({\n sampleStart: segment.byteSampleSegment.sampleStart + index * 1024,\n sampleEnds: segment.byteSampleSegment.sampleStart + (index + 1) * 1024 - 1,\n rawData: e,\n }));\n segment.byteSampleSegment.tracks[_mp4TrackId].timeLog.c_packageAACFrames = Date.now() - start;\n\n // segment.cached.arrayBuffer = segmentBuffer;\n segment.cached.arrayBuffer = undefined;\n segment.cached.cacheTimeMS = cacheTimeMS;\n segment.cached.isDownloading = false;\n segment.cached.cacheStartTime = cacheStartTime;\n }\n\n // this wont work after destory\n if (this.sequences) {\n this.dispatchEvent(AudioSourceSequence.PROGRESS_MULTIPLE_STEMS_INDIVIDUAL_SEGMENT_LOADED, {\n scope: 'all stems',\n sequenceIndices: [...this.sequences.map((item, index) => index)],\n segmentIdx: i,\n });\n }\n }\n // console.timeLog(sessionId);\n\n // Mark segments as not downloading\n for (let i = moofStartIndex; i <= moofEndIndex; i++) {\n const segment = this.sequences[0].segments[i];\n if (segment) {\n segment.cached.isDownloading = false;\n }\n }\n resolve(true);\n })\n .catch((err) => {\n const cause: FetchGroupErrorCause = err.cause;\n\n this.dispatchEvent(AudioSourceSequence.SEGMENTS_BATCH_LOADING_ERROR, { index: moofStartIndex });\n // this might get destroyed already at refetch of tail\n console.error(`FG_Error: ${this?.trackData?.trackId || ''} ${err.toString()}`, cause?.toString());\n // Mark segments as not downloading\n const NUMBER_OF_ERRORS_KEEP_ON_SAME_SEGMENT = 5;\n // this might get destroyed already at refetch of tail\n if (this.sequences?.[0]) {\n for (let i = moofStartIndex; i <= moofEndIndex; i++) {\n const segment = this.sequences[0].segments[i];\n if (segment) {\n segment.cached.isDownloading = false;\n if (segment.cached._error && segment.cached._error?.length < NUMBER_OF_ERRORS_KEEP_ON_SAME_SEGMENT && cause) {\n segment.cached._error.push(cause);\n segment.cached.cacheStartTime = cacheStartTime; // only latest is recorded\n }\n }\n }\n }\n // reject(false);\n reject('one of the segment marked as error');\n });\n });\n\n return promise;\n }\n\n // This function is up to 5 samples accuracy since the sampleStart and sampleEnd are composed from m3u8 manifest which is time based and up to 4 decimal base\n async getAudioBuffer(\n sequenceIdx: number,\n sampleStart48000: number,\n sampleEnd48000: number,\n decodingQueueIndex: number,\n signature: string,\n ): Promise<[AudioBuffer | null, number, number, number, number, number, string, string]> {\n // this._log('%clook try to decode me', 'color: red;');\n const startTime = Date.now();\n\n if (this.getIsInitialised() !== 'INITIALISED') {\n return [null, Date.now() - startTime, -1, -1, -1, -1, signature, GET_AUDIO_BUFFER_MESSAGE_STILL_INITIALISING];\n }\n\n // eslint-disable-next-line no-useless-catch\n try {\n const _sampleStart48000 = sampleStart48000; // - 192 > 0 ? sampleStart48000 - 192 : sampleStart48000;\n const _sampleEnd48000 = sampleEnd48000; // + 192;\n\n //const [sequence, segments, expectedBufferDecodedStart , expectedBufferDecodedEnd] = this.getSegmentInfo(sequenceIdx, _sampleStart48000 - PRIMING_SAMPLES_FOR_DECODE || 0, _sampleEnd48000);\n\n // now it will automatically cover the PRIMING_SAMPLES_FOR_DECODE with getSegmentInfo function\n const [sequence, segments, expectedBufferDecodedStart, expectedBufferDecodedEnd] = this.getSegmentInfo(sequenceIdx, _sampleStart48000, _sampleEnd48000);\n\n if (ENABLE_DEBUG_FOR_INFINITE_MIX_PRELOAD) {\n const debugStartIndex = sequence.segments.findIndex((s) => s === segments[0]);\n this._log(`${this.trackData.trackId} ${this.trackData.trackMixType} getAudioBuffer finding arraybuffer at `, debugStartIndex);\n this._log(`${this.trackData.trackId} ${this.trackData.trackMixType} getAudioBuffer`, segments);\n }\n const segmentsMarkedAsError = segments.filter((c) => c.cached._error && c.cached._error?.length > 0);\n if (segmentsMarkedAsError.length > 0) {\n // console.log(`${this.trackData?.trackId} [${this.trackData?.name}] - segments ${sampleStart48000}-${sampleEnd48000} already marked as error`);\n throw Error(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR, {\n cause: `${this.trackData?.trackId} [${this.trackData?.name}] - segments ${sampleStart48000}-${sampleEnd48000}, ${segmentsMarkedAsError?.[0].cached?._error?.join(',')}`,\n });\n }\n\n // validate the segments see if it is cached\n const segmentsNotDownloaded = segments.filter((s) => !this.isMoofSegmentCached(s));\n if (segments.filter((s) => !this.isMoofSegmentCached(s)).length > 0) {\n if (SHOW_DEBUG_FOR_GET_AUDIO_BUFFER) {\n // this._log(`AudioSourceSequence:: getAudioBuffer - sample range found but not yet cached: ${stemAlignedId}, ${_sampleStart48000} - ${_sampleEnd48000}`);\n this._log(sequence);\n }\n // throw Error('error decoding: sample range found but not yet cached');\n if (sequenceIdx === 0) {\n const foundIndex = this.sequences[0].segments.findIndex((s) => s === segmentsNotDownloaded[0]);\n if (this.sequences[0].segments[foundIndex].cached?.isDownloading === false) {\n if (ENABLE_DEBUG_OF_FETCH_EVICT_MOOF_BOXES) this._log(`trigger download of moof box to play: ${this.trackData.trackId} [${this.trackData.name}]`, foundIndex); //, segmentsNotDownloaded);\n this.preloadWithRange(foundIndex, foundIndex, 'getAudioBuffer');\n } else {\n // consoleColorfulMessage(`getAudioBuffer() ${this.trackData.trackId} ${this.sequences[0].segments[foundIndex].cached?.isDownloading ? 'isDownloading' : 'not isDownloading'}`);\n }\n }\n return [null, Date.now() - startTime, -1, -1, -1, -1, signature, GET_AUDIO_BUFFER_MESSAGE_STILL_DOWNLOADING_SEGMENT];\n }\n\n if (segments.length === 0) {\n if (SHOW_DEBUG_FOR_GET_AUDIO_BUFFER) {\n this._log(`AudioSourceSequence:: getAudioBuffer - sample range is not covered at this track: ${sequenceIdx}, ${_sampleStart48000} - ${_sampleEnd48000}`);\n this._log(sequence);\n this._log(this.trackData);\n this._log(this);\n }\n throw Error(AudioSourceSequence.SAMPLE_RANGE_REQUESTED_NOT_EXISTED);\n // return [null, Date.now() - startTime, -1, -1, -1, -1, signature, GET_AUDIO_BUFFER_MESSAGE_RANGE_NOT_EXIST];\n }\n\n const all_frames = extractAndFlattenFrames(segments);\n const frames_in_use = all_frames.filter((v) => v.sampleEnds >= _sampleStart48000 - PRIMING_SAMPLES_FOR_DECODE && v.sampleStart <= _sampleEnd48000);\n const startSample = _sampleStart48000 - frames_in_use[0].sampleStart;\n const sampleLength = _sampleEnd48000 - _sampleStart48000 + 1;\n if (sampleLength === 0) {\n // maybe because included last seg? ... no?\n throw Error('Empty sampleLength');\n }\n const frames: Uint8Array[] = frames_in_use.map((v) => v.rawData);\n const results: { audio: AudioBuffer; timeElapsedGlueFrames: number; timeElapsedDecode: number; timeElapsedChopSamples: number; decodeQueueId: number } = await decodeMp4AudioBufferVer2(\n { frames, start: startSample, length: sampleLength },\n decodingQueueIndex,\n signature,\n );\n\n const audioBuffer = results.audio;\n\n if (Math.abs(audioBuffer.length - sampleLength) > 4) {\n this._log(`AudioSourceSequence:: getAudioBuffer - checksum error: ${sequenceIdx}, ${_sampleStart48000} ~ ${_sampleEnd48000}`);\n this._log(`length decoded: ${audioBuffer.length}, expected: ${sampleLength}, diff: ${sampleLength - audioBuffer.length}`);\n this._log(segments);\n if (!segments[segments.length - 1].isLastSegment) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }\n\n // since expectedBufferDecodedEnd is index, so length should be End - Start + 1\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const actualLength = expectedBufferDecodedEnd - expectedBufferDecodedStart + 1;\n\n if (segments[segments.length - 1].isLastSegment) {\n // modifiedAudioBuffer = trimAudioBufferAtBeginning(audioBuffer, _sampleStart48000 - expectedBufferDecodedStart, this.decodeContext);\n } else {\n // modifiedAudioBuffer = trimAudioBuffer(audioBuffer, _sampleStart48000 - expectedBufferDecodedStart, _sampleEnd48000 - _sampleStart48000, this.decodeContext);\n }\n\n const modifiedAudioBuffer = audioBuffer;\n\n // this._log('actual: ')\n // console.table({\n // resultSample: modifiedAudioBuffer.length,\n // });\n // this._log(\"====\")\n\n return [\n modifiedAudioBuffer,\n Date.now() - startTime,\n results.timeElapsedGlueFrames,\n results.timeElapsedDecode,\n results.decodeQueueId,\n Date.now(),\n signature,\n GET_AUDIO_BUFFER_MESSAGE_SUCCEED,\n ];\n } catch (err) {\n /*\n console.table({\n sampleStart48000,\n sampleEnd48000,\n stemAlignedId,\n expectedSample: sampleEnd48000 - sampleStart48000,\n });\n this._log(this.sequences);\n console.error(err);\n */\n // return [undefined, Date.now() - startTime];\n // console.error(err);\n throw err;\n }\n }\n\n getIsInitialised() {\n return this.isInitialised;\n }\n\n // always return 1 aac segment more before head if it is not starting\n getSegmentInfo(sequenceIdx: number, sampleStart48000_: number, sampleEnd48000: number): [IAudioSourceSequence, IMP4SequenceChunk[], number, number] {\n if (this.getIsInitialised() !== 'INITIALISED') {\n return [undefined as unknown as IAudioSourceSequence, [], -1, -1];\n }\n\n // always cover previous 2112 samples if possible, since this function is used to resolve the MOOF segments from sample\n // make sure it covered 2112 sample diff is quite important, that makes it when decoding audio, the getAudioBuffer always have the stuff it needed\n const sampleStart48000 = sampleStart48000_ - PRIMING_SAMPLES_FOR_DECODE < 0 ? 0 : sampleStart48000_ - PRIMING_SAMPLES_FOR_DECODE;\n\n const sequence: IAudioSourceSequence = this.sequences?.[sequenceIdx];\n\n if (!sequence) {\n throw Error('getSegmentInfo:: requested sequence not found');\n }\n\n let segments = sequence.segments.filter((s) => {\n // if s overlap with input start/end sample range\n return isOverlap(\n { x: s.byteSampleSegment.sampleStart, y: 0, width: s.byteSampleSegment.sampleLength, height: 1 },\n { x: sampleStart48000, y: 0, width: sampleEnd48000 - sampleStart48000, height: 1 },\n );\n });\n\n // // AAC Decoding on iOS or Safari\n // // https://developer.apple.com/documentation/quicktime-file-format/background_aac_encoding\n // const m3u8SampleStart = s.byteSampleSegment.sampleStart + 2112;\n // const m3u8SampleDuration = s.byteSampleSegment.sampleStart + (s.byteSampleSegment.sampleLength - 2112);\n try {\n if (segments.length === 0) {\n return [sequence, [], -1, -1];\n }\n\n const index = sequence.segments.findIndex((f) => f === segments[0]);\n if (index > 0) {\n // cover previous aac segments when decoding, since safari will need that\n if (sampleStart48000 - segments[0].byteSampleSegment.sampleStart < 2112 && isSafariOriOS) {\n segments = [sequence.segments[index - 1], ...segments];\n }\n }\n\n // remember diff start for chunk 0, there will be always missing 0-2112 of the starting of the track\n const expectdBufferDecodedStart = isSafariOriOS ? segments[0].byteSampleSegment.sampleStart + 2112 : segments[0].byteSampleSegment.sampleStart;\n if (ENABLE_DEBUG_FOR_INFINITE_MIX_PRELOAD) {\n this._log(`${this.trackData.trackId}, ${this.trackData.trackMixType} searching ${sampleStart48000}`, segments);\n }\n return [sequence, segments, expectdBufferDecodedStart, segments[segments.length - 1].byteSampleSegment.sampleEnd];\n } catch (err) {\n console.error(err);\n return [sequence, [], -1, -1];\n // throw Error(err);\n }\n }\n\n fetchCacheRecord(sampleStart: number, sampleEnd: number): { totalCacheTime: string; cacheTimes: string; firstErrorOfEachMoov: string } {\n const sequenceIdx = 0; // all cache record are same since 1 fetch cover all four stems\n const moovs = this.getSegmentInfo(sequenceIdx, sampleStart, sampleEnd)?.[1];\n\n let totalCacheTime = 'NIL';\n let cacheTimes = 'NIL';\n let firstErrorOfEachMoov = '';\n\n if (moovs.length > 0) {\n totalCacheTime = moovs\n .reduce((sum, m) => {\n return m.cached.cacheTimeMS > -1 ? sum + m.cached.cacheTimeMS : sum;\n }, 0)\n .toFixed(3);\n\n cacheTimes = moovs.reduce((sum, m, index) => {\n if (index === 0) return m.cached.cacheStartTime === -1 ? 'NIL' : m.cached.cacheStartTime.toFixed(1);\n sum = sum + ', ' + (m.cached.cacheStartTime === -1 ? 'NIL' : m.cached.cacheStartTime?.toFixed(1));\n return sum;\n }, '');\n\n firstErrorOfEachMoov = moovs.reduce((sum, m, index) => {\n if (index === 0) return m.cached._error && m.cached._error?.length > 0 ? m.cached._error?.[0]?.detailMessage || '' : '';\n sum = sum + ', ' + (m.cached._error && m.cached._error?.length > 0 ? m.cached._error[0]?.detailMessage || '' : '');\n return sum;\n }, '');\n }\n\n return { totalCacheTime, cacheTimes, firstErrorOfEachMoov };\n }\n\n /*\n getSequenceStatus(): IChunkStatus[] {\n return;\n return this.sequences.map((chunk)=>{\n return {\n url: chunk.url,\n chunkId: chunk.chunkId,\n signature: chunk.signature,\n nextChunkId: chunk.nextChunkId,\n //@ts-expect-error: detached is not supported?\n arrayBufferDetached: chunk.arrayBuffer?.detached,\n cacheTimeMS: chunk.cacheTimeMS,\n audioBufferMemoryUsageMB: chunk.audioBuffer ? calculateMemoryForAudioBuffers([chunk.audioBuffer]) : 0,\n decodeTimeMS: chunk.decodeTimeMS,\n }\n })\n }\n */\n}\n\n/**\n * Extracts and flattens all frames from tracks in an array of IMP4SequenceChunk objects\n * @param chunks Array of IMP4SequenceChunk objects\n * @returns Array of flattened frames from all tracks\n */\nfunction extractAndFlattenFrames(chunks: IMP4SequenceChunk[]) {\n // Type for the frames we're extracting\n type Frame = {\n sampleStart: number;\n sampleEnds: number;\n rawData: Uint8Array;\n // Add additional metadata to identify the source\n segmentId: string;\n trackId: number;\n };\n\n // Initialize array to store all frames\n const allFrames: Frame[] = [];\n\n // Loop through each chunk\n for (const chunk of chunks) {\n const { segmentId, byteSampleSegment } = chunk;\n\n // Loop through each track in the segment\n for (const trackIdStr in byteSampleSegment.tracks) {\n const trackId = Number(trackIdStr);\n const track = byteSampleSegment.tracks[trackId];\n\n // Only process if frames exist\n if (track.frames && track.frames.length > 0) {\n // Map frames to include metadata about their source\n const framesWithMetadata = track.frames.map((frame) => ({\n ...frame,\n segmentId,\n trackId,\n }));\n\n // Add to our result array\n allFrames.push(...framesWithMetadata);\n }\n }\n }\n\n return allFrames;\n}\n\nconst AudioSequenceValidation_Beats_Matching_MP4 = (\n s: IAudioSourceSequence,\n trackData: { url: string; duration: number; __durationForValidation1: number; __durationForValidation2: number },\n): boolean => {\n const length = s.segments.length;\n\n if (length === 0) return false;\n\n const lastSegmentEndingTimeBasedOnMp4Tail = s.segments[length - 1]?.byteSampleSegment?.endTime || 0;\n if (lastSegmentEndingTimeBasedOnMp4Tail < trackData.__durationForValidation2) {\n const TOLERANCE = 2.048;\n if (Math.abs(lastSegmentEndingTimeBasedOnMp4Tail - trackData.__durationForValidation2) > TOLERANCE) {\n console.error('MP4 Error: Beats is not matching with MP4 Tail', {\n id: 'track duration audit',\n url: trackData.url,\n '[check this] lastSegmentEndingTimeBasedOnMp4Tail': lastSegmentEndingTimeBasedOnMp4Tail,\n 'track duration based on beats[last].timestamp - beats[first].timestamp': trackData.duration,\n 'track duration based on last item on segemntInfo': trackData.__durationForValidation1,\n '[check this] track duration based on beats[last].timestamp': trackData.__durationForValidation2,\n diff: lastSegmentEndingTimeBasedOnMp4Tail - trackData.__durationForValidation2,\n });\n return false;\n }\n // if (lastSegmentEndingTimeBasedOnMp4Tail < 10) {\n // return false;\n // }\n\n consoleColorfulMessage(\n `MP4 Warning: Beats is not matching with MP4 Tail, but lesser than ${TOLERANCE}s so let it pass thru, tail: ${lastSegmentEndingTimeBasedOnMp4Tail}, duration(0 ~ beats[last-item].timestamp): ${trackData.__durationForValidation2}`,\n );\n return true;\n }\n\n return true;\n};\n","import { IMusicKey, IMusicTonality } from \"../interface\";\n\n// type IMusicKey = 'A'| 'A#'| 'B'| 'C'| 'C#'| 'D'| 'D#'| 'E'| 'F'| 'F#'| 'G'| 'G#';\n\n// type IMusicTonality = 'minor' | 'major';\n\nconst ENABLE_LOCAL_DEBUG = false;\n\ninterface ITempoMatch {\n targetBarLength: number;\n playbackRate: number;\n}\n\nexport const calculateMixTempoMatch = (\n seedBarLength: number,\n mixBarLength: number\n): ITempoMatch => {\n // Calculate possible target lengths (half, same, double)\n const possibleLengths = [\n seedBarLength / 2,\n seedBarLength,\n seedBarLength * 2\n ];\n \n // Find the closest match to mixBarLength\n const targetBarLength = possibleLengths.reduce((prev, curr) => \n Math.abs(curr - mixBarLength) < Math.abs(prev - mixBarLength) ? curr : prev\n );\n \n // Calculate required playback rate to achieve target length\n const playbackRate = mixBarLength / targetBarLength;\n \n return {\n targetBarLength,\n playbackRate\n };\n}\n\nconst playbackRateToSemitoneChange = (playbackRate: number): number => {\n // Formula: 12 * log2(playbackRate)\n // This gives us the number of semitones change based on the playback rate\n return 12 * Math.log2(playbackRate);\n}\n\nconst keyToSemitones: Record<IMusicKey, number> = {\n 'A': 1,\n 'A#': 2,\n 'B': 3,\n 'C': 4,\n 'C#': 5,\n 'D': 6,\n 'D#': 7,\n 'E': 8,\n 'F': 9,\n 'F#': 10,\n 'G': 11,\n 'G#': 12\n};\n\n// Create reverse mapping by inverting keyToSemitones\nconst semitonesToKey = Object.entries(keyToSemitones).reduce((acc, [key, value]) => {\n acc[value] = key as IMusicKey;\n return acc;\n}, {} as Record<number, IMusicKey>);\n\nconst convertKeyToRelativeMinor = (key: IMusicKey, tonality: IMusicTonality): number => {\n let semitones = keyToSemitones[key];\n \n // If the key is major, convert to its relative minor (subtract 3 semitones)\n if (tonality === 'major') {\n semitones = ((semitones - 3 + 12) % 12) || 12; // Ensure we stay in 1-12 range\n }\n \n return semitones;\n};\n\ninterface IKeyMatch {\n semitoneShift: number; // Amount to shift the mix track\n matchedSemitones: number; // The semitone value being matched to\n resultingKey: IMusicKey; // Final key after all transformations\n}\n\nconst findOptimalKeyMatch = (\n seedKeySemitones: number,\n mixKeySemitones: number,\n exactKeyWeighting: number,\n mixTonality: IMusicTonality,\n semitoneChangeFromTempo: number\n): IKeyMatch => {\n // Calculate possible match points (seed key and its fifths)\n const possibleMatches = [\n seedKeySemitones,\n ((seedKeySemitones + 5) % 12) || 12, // Up a fifth\n ((seedKeySemitones - 5 + 12) % 12) || 12 // Down a fifth\n ];\n\n // For each possible match, calculate the required shift and total change\n const shifts = possibleMatches.map(match => {\n let shift = match - mixKeySemitones;\n \n // Ensure shift is in the smallest possible direction (-6 to +6)\n if (shift > 6) shift -= 12;\n if (shift < -6) shift += 12;\n\n // Calculate total pitch change including tempo-induced change\n const totalChange = Math.abs(shift + semitoneChangeFromTempo);\n\n return {\n match,\n shift,\n totalChange,\n // Apply higher weighting for exact key match\n weightedChange: match === seedKeySemitones ? \n totalChange * exactKeyWeighting :\n totalChange\n };\n });\n\n // Find the option with the smallest total change\n const bestMatch = shifts.reduce((prev, curr) => \n curr.weightedChange < prev.weightedChange ? curr : prev\n );\n\n // Calculate resulting key\n let finalSemitones = bestMatch.match;\n if (mixTonality === 'major') {\n // Convert back to major (+3 semitones)\n finalSemitones = ((finalSemitones + 3) % 12) || 12;\n }\n\n return {\n semitoneShift: bestMatch.shift,\n matchedSemitones: bestMatch.match,\n resultingKey: semitonesToKey[finalSemitones]\n };\n};\n\n/**\n * Pitch Shift Strategies\n * \n * DEFAULT:\n * The original algorithm that attempts to find an optimal balance between key matching and minimal pitch shift.\n * It first applies tempo compensation to the mix key, then finds the closest match between the seed key\n * and possible Camelot-compatible keys (original key and fifths), with a preference for exact key matches.\n * \n * PRESERVE_MIX_KEY:\n * Prioritizes staying close to the mix track's original key while maintaining Camelot compatibility.\n * Considers the original key and Camelot-compatible alternatives (fifths and fourths),\n * choosing the option that requires the least total pitch change while including necessary\n * tempo compensation. Best for maintaining the character of the mix track.\n * \n * MATCH_SEED_KEY:\n * Directly matches the mix key to the seed key using the shortest possible semitone distance,\n * plus tempo compensation. Does not consider Camelot wheel compatibility.\n * This provides the most direct key matching but may result in larger pitch shifts.\n * \n * KEY_PRESERVE:\n * Applies only tempo compensation to preserve the mix track's original key exactly.\n * This ensures the mix track maintains its original key relationship but may result\n * in less harmonically compatible transitions.\n * \n * NO_SHIFT:\n * Applies no pitch shifting at all (returns 0). The mix track plays at its original pitch\n * regardless of tempo changes or key differences. May result in key clashes but preserves\n * the original sound completely.\n */\nexport enum PitchShiftStrategy {\n DEFAULT = 'DEFAULT', // Current \"minimal pitch\" logic\n PRESERVE_MIX_KEY = 'PRESERVE_MIX_KEY', // Current preserveMixKey logic\n MATCH_SEED_KEY = 'MATCH_SEED_KEY', // Direct key match\n NO_SHIFT = 'NO_SHIFT', // Always return 1\n KEY_PRESERVE = 'KEY_PRESERVE' // Only tempo compensation\n}\n\nexport const getMixAttributes = (\n seedKey: IMusicKey, \n seedTonality: IMusicTonality, \n seedTempoOrigSz: number,\n mixKey: IMusicKey, \n mixTonality: IMusicTonality, \n mixTempoOrigSz: number,\n strategy: PitchShiftStrategy,\n): number => {\n if (ENABLE_LOCAL_DEBUG) console.log('\\n=== Pitch Shift Calculation ===');\n if (ENABLE_LOCAL_DEBUG) console.log(`Strategy: ${strategy}`);\n \n // Validate inputs\n if (ENABLE_LOCAL_DEBUG) console.log('\\nInput Validation:');\n if (ENABLE_LOCAL_DEBUG) console.log('Tempo values:', { seedTempoOrigSz, mixTempoOrigSz });\n \n if (typeof seedTempoOrigSz !== 'number' || typeof mixTempoOrigSz !== 'number' ||\n isNaN(seedTempoOrigSz) || isNaN(mixTempoOrigSz) || \n seedTempoOrigSz <= 0 || mixTempoOrigSz <= 0) {\n console.error('Invalid tempo values:', { seedTempoOrigSz, mixTempoOrigSz });\n return 0;\n }\n \n // Calculate tempo matching attributes (needed for all strategies)\n const tempoMatch = calculateMixTempoMatch(seedTempoOrigSz, mixTempoOrigSz);\n const playbackRate = tempoMatch.playbackRate;\n const semitoneChangeFromTempo = playbackRateToSemitoneChange(playbackRate);\n \n if (ENABLE_LOCAL_DEBUG) console.log('Tempo calculations:', {\n tempoMatch,\n playbackRate,\n semitoneChangeFromTempo\n });\n \n // Validate tempo calculations\n if (isNaN(playbackRate) || isNaN(semitoneChangeFromTempo)) {\n console.error('Invalid tempo calculations:', {\n playbackRate,\n semitoneChangeFromTempo\n });\n return 0;\n }\n\n // Convert keys to semitones (needed for most strategies)\n const seedKeySemitones = convertKeyToRelativeMinor(seedKey, seedTonality);\n const originalMixKeySemitones = convertKeyToRelativeMinor(mixKey, mixTonality);\n \n if (ENABLE_LOCAL_DEBUG) console.log('Key conversions:', {\n seedKey: `${seedKey} ${seedTonality} -> ${seedKeySemitones}`,\n mixKey: `${mixKey} ${mixTonality} -> ${originalMixKeySemitones}`\n });\n \n switch (strategy) {\n case PitchShiftStrategy.NO_SHIFT:\n return 0; // No pitch shift at all\n\n case PitchShiftStrategy.KEY_PRESERVE: {\n // Only apply tempo compensation to preserve original key\n return -semitoneChangeFromTempo;\n }\n\n case PitchShiftStrategy.MATCH_SEED_KEY: {\n // Same logic as PRESERVE_MIX_KEY but only considering direct key match\n const fullTempoCompensation = -semitoneChangeFromTempo;\n \n // Calculate shift needed\n let shift = seedKeySemitones - originalMixKeySemitones;\n \n // Ensure shift is in the smallest possible direction (-6 to +6)\n if (shift > 6) shift -= 12;\n if (shift < -6) shift += 12;\n \n // Total shift combines tempo compensation and key shift\n const totalShift = fullTempoCompensation + shift;\n \n if (ENABLE_LOCAL_DEBUG) console.log(`Direct key match shift: ${totalShift.toFixed(2)} semitones`);\n return totalShift;\n }\n\n case PitchShiftStrategy.PRESERVE_MIX_KEY: {\n // Original preserve mix key logic that considers Camelot compatibility\n const fullTempoCompensation = -semitoneChangeFromTempo;\n const keyMatch = findOptimalKeyMatchPreserving(\n seedKeySemitones,\n originalMixKeySemitones,\n fullTempoCompensation,\n mixTonality\n );\n if (ENABLE_LOCAL_DEBUG) console.log(`Preserve mix key shift: ${keyMatch.totalShift.toFixed(2)} semitones`);\n return keyMatch.totalShift;\n }\n\n case PitchShiftStrategy.DEFAULT:\n default: {\n // Original minimal pitch logic\n const mixKeySemitones = ((originalMixKeySemitones + semitoneChangeFromTempo + 12) % 12) || 12;\n const keyMatch = findOptimalKeyMatch(\n seedKeySemitones, \n mixKeySemitones, \n 1, // High weighting for exact match\n mixTonality,\n semitoneChangeFromTempo\n );\n if (ENABLE_LOCAL_DEBUG) console.log(`Default minimal pitch shift: ${keyMatch.semitoneShift.toFixed(2)} semitones`);\n return keyMatch.semitoneShift;\n }\n }\n};\n\n// New helper function for preserving mix key while maintaining Camelot compatibility\nconst findOptimalKeyMatchPreserving = (\n seedKeySemitones: number,\n originalMixKeySemitones: number,\n tempoCompensation: number,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n mixTonality: IMusicTonality\n): { totalShift: number } => {\n // Calculate the base shift needed to compensate for tempo\n const baseShift = tempoCompensation;\n \n // Calculate possible Camelot-compatible target semitones\n const possibleTargets = [\n originalMixKeySemitones, // Original key\n (originalMixKeySemitones + 5) % 12 || 12, // Fifth up\n (originalMixKeySemitones - 5 + 12) % 12 || 12, // Fifth down\n (originalMixKeySemitones + 7) % 12 || 12, // Perfect fourth up\n (originalMixKeySemitones - 7 + 12) % 12 || 12 // Perfect fourth down\n ];\n \n // For each possible target, calculate total shift needed\n const shifts = possibleTargets.map(target => {\n // Calculate additional shift needed beyond tempo compensation\n let additionalShift = target - originalMixKeySemitones;\n \n // Ensure shift is in the smallest possible direction (-6 to +6)\n if (additionalShift > 6) additionalShift -= 12;\n if (additionalShift < -6) additionalShift += 12;\n \n // Total shift combines tempo compensation and additional shift\n const totalShift = baseShift + additionalShift;\n \n return {\n target,\n additionalShift,\n totalShift,\n // Weight based on how close we stay to original key\n totalChange: Math.abs(totalShift - baseShift)\n };\n });\n \n // Find the option with the smallest total change from the tempo-compensated position\n const bestMatch = shifts.reduce((prev, curr) => \n curr.totalChange < prev.totalChange ? curr : prev\n );\n \n return {\n totalShift: bestMatch.totalShift\n };\n};\n\n/*\n// Test Case 1: Same key, different tempos\nconst result1 = getMixAttributes(\n 'C', // seedKey\n 'minor', // seedTonality\n 2.0, // seedTempoOrigSz (2 second bar)\n 'D', // mixKey\n 'major', // mixTonality\n 2.0, // mixTempoOrigSz (4 second bar)\n PitchShiftStrategy.DEFAULT\n);\nconsole.log('Test 1 (Same keys, different tempos):', result1);\n*/\n","import { AVOID_RUBBERBAND_WORKLET_AT_MIX1, AVOID_RUBBERBAND_WORKLET_AT_SEED, TIMER_LOG_AUDIO_CONTEXT } from \"../audio-context\";\n// import { setTimeout } from 'worker-timers';\nimport isMobile from 'is-mobile';\nimport { AEV3Controller, TrackIndexType, TrackLabelType } from \"../global-aev3-controller\";\nimport { IMusicKey, IMusicTonality, ITrackForSequence } from \"../interface\";\nimport { calculateMixTempoMatch, getMixAttributes, PitchShiftStrategy } from \"./seed-mix-utils\";\nimport { RatioOfBarsAllowedBetweenSeedAndMix } from \"../decode/parser\";\n\n// Simple flag to check which engine is being used (matches audio-context config)\nconst USE_PHAZE_ENGINE = isMobile(); // Keep in sync with audio-context/index.ts\n\n// Track last sent pitch values per worklet to avoid unnecessary micro-adjustments\nconst lastSentPitchValues: Map<AudioWorkletNode, number> = new Map();\nconst PITCH_CHANGE_THRESHOLD = 0.01; // Only send if difference > 1%\n\n// Expose pitch tracking state for debugging\nif (typeof window !== 'undefined') {\n (window as any).getPitchState = () => {\n console.log('Last sent pitch values:', lastSentPitchValues);\n console.log('Threshold:', PITCH_CHANGE_THRESHOLD);\n };\n (window as any).resetPitchTracking = () => {\n lastSentPitchValues.clear();\n console.log('β
Pitch tracking reset');\n };\n}\n\n/**\n * Directly modify on the AudioBuffer and append ticks sound on it\n * @param audioBuffer \n * @param tempoOrigSz \n * @param sampleRate \n * @param tickDuration \n * @param tickFrequency \n * @param tickVolume \n * @param fadeDuration \n * @returns \n */\nexport const appendMetronomeTick = (audioBuffer: AudioBuffer, tempoOrigSz: number, sampleRate: number, tickDuration = 0.05, tickFrequency = 1000, tickVolume = 0.1, fadeDuration = 0.005) => {\n const tickSampleArray = getMetronomeTickAsFloat32Array(sampleRate, tickDuration, tickFrequency, tickVolume, fadeDuration);\n const tickSamples = tickSampleArray.length;\n const tempoOrigSzSamples = tempoOrigSz;\n\n // Modify the original buffer directly to save memory\n for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {\n const channelData = audioBuffer.getChannelData(channel);\n\n // Overlay ticks on the original audio\n for (let i = 0; i < channelData.length; i += tempoOrigSzSamples) {\n for (let j = 0; j < tickSamples && (i + j) < channelData.length; j++) {\n channelData[i + j] += tickSampleArray[j];\n\n // Ensure audio sample stays within the valid range [-1, 1]\n channelData[i + j] = Math.max(-1, Math.min(1, channelData[i + j]));\n }\n }\n }\n return audioBuffer;\n}\n\nconst getMetronomeTickAsFloat32Array = (\n sampleRate: number,\n tickDuration = 0.05,\n tickFrequency = 1000,\n tickVolume = 0.1,\n fadeDuration = 0.005,\n): Float32Array => {\n const tickSamples = Math.floor(tickDuration * sampleRate);\n const fadeSamples = Math.floor(fadeDuration * sampleRate);\n\n // Generate tick samples (simple sine wave with fade-in and fade-out)\n const tickSampleArray = new Float32Array(tickSamples);\n for (let i = 0; i < tickSamples; i++) {\n const envelope = i < fadeSamples\n ? (i / fadeSamples) // Fade-in\n : (i > tickSamples - fadeSamples)\n ? ((tickSamples - i) / fadeSamples) // Fade-out\n : 1;\n tickSampleArray[i] = Math.sin(2 * Math.PI * tickFrequency * i / sampleRate) * tickVolume * envelope;\n }\n return tickSampleArray;\n}\n\n/*\n// this will not be a solution cuz of memory concern\nexport const appendMetronomeTick = (audioBuffer: AudioBuffer, tempoOrigSz: number, audioContext: AudioContext, sampleRate: number) => {\n const tickDuration = 0.05; // 50 milliseconds\n const tickSamples = Math.floor(tickDuration * sampleRate);\n const tempoOrigSzSamples = tempoOrigSz;\n\n // Create a new buffer with the same length as the original\n const newBuffer = audioContext.createBuffer(\n audioBuffer.numberOfChannels,\n audioBuffer.length,\n sampleRate\n );\n\n // Generate tick samples (simple sine wave)\n const tickSampleArray = new Float32Array(tickSamples);\n for (let i = 0; i < tickSamples; i++) {\n tickSampleArray[i] = Math.sin(2 * Math.PI * 1000 * i / sampleRate) * 0.1; // 1000 Hz sine wave at 10% volume\n }\n\n // Copy original audio data and overlay ticks\n for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {\n const newChannelData = newBuffer.getChannelData(channel);\n const originalChannelData = audioBuffer.getChannelData(channel);\n\n // Copy the original data\n newChannelData.set(originalChannelData);\n\n // Overlay ticks\n for (let i = 0; i < originalChannelData.length; i += tempoOrigSzSamples) {\n for (let j = 0; j < tickSamples && (i + j) < originalChannelData.length; j++) {\n newChannelData[i + j] += tickSampleArray[j];\n // Ensure we don't exceed the valid range for audio samples (-1 to 1)\n newChannelData[i + j] = Math.max(-1, Math.min(1, newChannelData[i + j]));\n }\n }\n }\n\n return newBuffer;\n}\n*/\n\nexport function playbackRateToSemitones(playbackRate: number) {\n // Formula to convert playback rate to semitones\n // Semitones = 12 * log2(playbackRate)\n return 12 * Math.log2(playbackRate);\n}\n\n/*\nfunction playbackRateToPitchShiftValueForWorklet(playbackRate) {\n const pitchShiftSemitones = playbackRateToSemitones(1/playbackRate) || 1; //pitchShift from back end = pitchShiftSemitones\n\n const pitchShiftValueForWorklet = Math.pow(2, pitchShiftSemitones / 12);\n return pitchShiftValueForWorklet;\n}\n*/\n\n//pitchShift from back end = pitchShiftSemitones\nexport function backEndPitchShift4Worklet(pitchCompensationSemitones: number){\n const pitchShiftSemitones = pitchCompensationSemitones\n const pitchShiftValueForWorklet = Math.pow(2, pitchShiftSemitones / 12);\n return pitchShiftValueForWorklet;\n}\n\nexport const sendInitPitchShiftCommandToWorklet = (pitchCompensationSemitones: number, trackIndex: TrackIndexType) => {\n if (trackIndex !== 0 && trackIndex !== 1) {\n return;\n }\n const slot: 0 | 1 = trackIndex;\n const workletResponsibleForPitchShift = AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[slot];\n if (!workletResponsibleForPitchShift) {\n return;\n }\n const pitchShift = backEndPitchShift4Worklet(pitchCompensationSemitones);\n sendPitchShiftToWorkletWithTrackIndex(pitchShift, workletResponsibleForPitchShift, slot);\n // return and finish the call, if the trackIndex are 0|1, non standby\n return;\n\n}\n\nconst sendPitchShiftToWorkletWithTrackIndex = (valueToRubberband: number,\n workletResponsibleForPitchShift: AudioWorkletNode,\n trackIndex: number,\n ) => {\n \n if (AVOID_RUBBERBAND_WORKLET_AT_SEED && [0].includes(trackIndex)) {\n console.log(`%cDROPPED: pitch@worklet${trackIndex}`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0, valueToRubberband);\n } else if (AVOID_RUBBERBAND_WORKLET_AT_MIX1 && [1].includes(trackIndex)) {\n console.log(`%cDROPPED: pitch@worklet${trackIndex}`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0, valueToRubberband);\n } else {\n if (workletResponsibleForPitchShift) {\n // Determine track type from track index\n const trackType: TrackLabelType = [0].includes(trackIndex) ? 'seed1' : 'mix1';\n sendPitchCommand(valueToRubberband, workletResponsibleForPitchShift, trackType);\n }\n }\n}\n\nexport const sendPitchShiftToWorkletWithTrackLabel = (valueToRubberband: number,\n workletResponsibleForPitchShift: AudioWorkletNode,\n trackType: TrackLabelType | string) => {\n\n if ((AVOID_RUBBERBAND_WORKLET_AT_SEED || AVOID_RUBBERBAND_WORKLET_AT_MIX1) && !['seed1', 'mix1', 'seed2', 'mix2'].includes(trackType)){\n return;\n throw Error('AVOID_RUBBERBAND_WORKLET_AT_SEED or AVOID_RUBBERBAND_WORKLET_AT_MIX1 is true while command will still send to worklet in this setup.');\n }\n \n if (AVOID_RUBBERBAND_WORKLET_AT_SEED && ['seed1'].includes(trackType)) {\n console.log(`%cDROPPED: pitch@worklet${trackType}`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0, valueToRubberband);\n } else if (AVOID_RUBBERBAND_WORKLET_AT_MIX1 && ['mix1'].includes(trackType)) {\n console.log(`%cDROPPED: pitch@worklet${trackType}`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0, valueToRubberband);\n } else {\n if (workletResponsibleForPitchShift) {\n sendPitchCommand(valueToRubberband, workletResponsibleForPitchShift, trackType);\n }\n }\n}\n\nexport const getPitchShiftForMixTrack = (\n seedKey: IMusicKey, seedTonality: IMusicTonality, seedTempoOrigSz: number,\n mixKey: IMusicKey, mixTonality: IMusicTonality, mixTempoOrigSz: number,\n pitchShiftFromBackend4Debug: number,\n preserveMixKey: PitchShiftStrategy,\n verbose: boolean = false\n): number => {\n \n // looks like the backend has different type defined, e.g. G# as G_SHARP\n const safeguardingOfKeyFromBackend = (e: string): IMusicKey => {\n return e.replace(\"_SHARP\", '#') as IMusicKey;\n }\n \n // this is the value for semitone change\n const pitchShiftOnMixTrack = getMixAttributes(\n safeguardingOfKeyFromBackend(seedKey), seedTonality, seedTempoOrigSz,\n safeguardingOfKeyFromBackend(mixKey), mixTonality, mixTempoOrigSz,\n preserveMixKey\n );\n \n if (verbose) {\n console.log('%cFinding PitchShift at client-side', 'color: orangered;');\n console.table({\n seedKey,\n seedTonality,\n seedTempoOrigSz,\n mixKey,\n mixTonality,\n mixTempoOrigSz,\n pitchShiftOnMixTrack,\n pitchShiftFromBackend4Debug,\n preserveMixKey\n });\n\n if (Math.round(pitchShiftOnMixTrack*100000)!==Math.round(pitchShiftFromBackend4Debug*100000)) {\n console.error(`The PitchShift value composed ${pitchShiftOnMixTrack} is different to value provided from backend: ${pitchShiftFromBackend4Debug}`)\n }\n }\n\n return pitchShiftOnMixTrack;\n}\n\nexport const getTargetSampleLengthForSeedTrack = (seedTrackBarLength: number): number => {\n return seedTrackBarLength;\n}\n\nexport const getTargetSampleLengthForMixTrack = (seedTrackBarLength: number, mixTrackBarLength: number): number => {\n return calculateMixTempoMatch(\n seedTrackBarLength,\n mixTrackBarLength,\n ).targetBarLength;\n}\n\n/**\n * ratioWhenComposingBar:\n * 0.5: 1 mix bar = 2 seed bar\n * 2 : 2 mix bar = 1 seed bar\n * @param seedTrack \n * @param mixTrack \n */\nexport const getTargetTempoOrigSzAndBpmRatio = (seedTrack: ITrackForSequence, mixTrack: ITrackForSequence): {\n seedTrackTargetBarLength48000: number,\n mixTrackTargetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n originalSeed: number,\n originalMix: number,\n} => {\n const seedTrackTargetBarLength48000 = getTargetSampleLengthForSeedTrack(seedTrack.tempoOrigSz);\n const mixTrackTargetBarLength48000 = getTargetSampleLengthForMixTrack(seedTrack.tempoOrigSz, mixTrack.tempoOrigSz);\n const ratioWhenComposingBar = mixTrackTargetBarLength48000 / seedTrackTargetBarLength48000 as RatioOfBarsAllowedBetweenSeedAndMix;\n const result = {\n seedTrackTargetBarLength48000,\n mixTrackTargetBarLength48000: seedTrackTargetBarLength48000,\n ratioWhenComposingBar,\n originalSeed: seedTrack.tempoOrigSz,\n originalMix: mixTrack.tempoOrigSz,\n seed: seedTrack.name,\n mix: mixTrack.name,\n };\n // console.log(`%c/************************************************************\\n * Determine the Transition count based on seed1 \\n * `, 'color: pink; background: black')\n \n // console.table(result);\n return result;\n}\n\nexport const getRandomPitchForRubberbandWorklet = () => {\n const min = 5;\n const max = 20;\n const random = Math.floor(Math.random() * (max - min + 1)) + min;\n const valueToWorklet = random/10\n\n // console.log(`Random number between ${min} and ${max}: ${random}`);\n return valueToWorklet;\n}\n\n// Function to access channel data starting from an offset without copying\n/*\nfunction getChannelDataWithOffset(buffer, skipSamples) {\n const channels = [];\n\n for (let k = 0; k < buffer.numberOfChannels; k++) {\n const originalChannelData = buffer.getChannelData(k);\n \n // Create a subarray view that starts from the offset without copying\n const offsetChannelData = new Float32Array(\n originalChannelData.buffer,\n originalChannelData.byteOffset + skipSamples * Float32Array.BYTES_PER_ELEMENT,\n originalChannelData.length - skipSamples\n );\n\n channels.push(offsetChannelData);\n }\n\n return channels;\n}\n\nfunction audioBufferToTransferable(audioBuffer) {\n const channelData = [];\n for (let i = 0; i < audioBuffer.numberOfChannels; i++) {\n channelData.push(audioBuffer.getChannelData(i).buffer); // Get raw ArrayBuffer\n }\n return {\n sampleRate: audioBuffer.sampleRate,\n length: audioBuffer.length,\n numberOfChannels: audioBuffer.numberOfChannels,\n channelData: channelData\n };\n}\n*/\n\nexport const mergeMultipleAudioBuffers = (source: AudioBuffer[], audioContext: AudioContext): AudioBuffer => {\n if (!source || source.length === 0) {\n throw new Error('No source buffers provided');\n }\n\n // Get the total length and verify channel consistency\n const totalLength = source.reduce((sum, buffer) => sum + buffer.length, 0);\n const numberOfChannels = source[0].numberOfChannels;\n const sampleRate = source[0].sampleRate;\n\n // Verify all buffers have the same number of channels and sample rate\n for (const buffer of source) {\n if (buffer.numberOfChannels !== numberOfChannels) {\n throw new Error('All buffers must have the same number of channels');\n }\n if (buffer.sampleRate !== sampleRate) {\n throw new Error('All buffers must have the same sample rate');\n }\n }\n\n // Create a new buffer with the total length\n const mergedBuffer = audioContext.createBuffer(\n numberOfChannels,\n totalLength,\n sampleRate\n );\n\n // For each channel\n for (let channel = 0; channel < numberOfChannels; channel++) {\n const mergedChannelData = mergedBuffer.getChannelData(channel);\n let offset = 0;\n\n // Copy data from each source buffer\n for (const buffer of source) {\n const sourceChannelData = buffer.getChannelData(channel);\n mergedChannelData.set(sourceChannelData, offset);\n offset += buffer.length;\n }\n }\n\n return mergedBuffer;\n}\n\n\n/**\n * Converts an AudioBuffer to a WAV file and triggers a download\n * @param audioBuffer The AudioBuffer to convert\n * @param filename Optional filename (defaults to \"audio.wav\")\n */\n/*\nexport function downloadAudioBufferAsWAV(audioBuffer: AudioBuffer, filename: string = \"audio.wav\"): void {\n // WAV file format constants\n const HEADER_SIZE = 44;\n const FORMAT_PCM = 1; // Linear PCM\n const NUM_CHANNELS = audioBuffer.numberOfChannels;\n const SAMPLE_RATE = audioBuffer.sampleRate;\n const BIT_DEPTH = 16; // We'll use 16-bit PCM\n const BYTES_PER_SAMPLE = BIT_DEPTH / 8;\n\n // Calculate file size\n const numSamples = audioBuffer.length;\n const dataSize = numSamples * NUM_CHANNELS * BYTES_PER_SAMPLE;\n const fileSize = HEADER_SIZE + dataSize;\n\n // Create the buffer for the WAV file\n const buffer = new ArrayBuffer(fileSize);\n const view = new DataView(buffer);\n\n // Write WAV header\n // \"RIFF\" chunk descriptor\n writeString(view, 0, \"RIFF\");\n view.setUint32(4, fileSize - 8, true);\n writeString(view, 8, \"WAVE\");\n\n // \"fmt \" sub-chunk\n writeString(view, 12, \"fmt \");\n view.setUint32(16, 16, true); // fmt chunk size (16 for PCM)\n view.setUint16(20, FORMAT_PCM, true); // audio format (1 for PCM)\n view.setUint16(22, NUM_CHANNELS, true);\n view.setUint32(24, SAMPLE_RATE, true);\n view.setUint32(28, SAMPLE_RATE * NUM_CHANNELS * BYTES_PER_SAMPLE, true); // byte rate\n view.setUint16(32, NUM_CHANNELS * BYTES_PER_SAMPLE, true); // block align\n view.setUint16(34, BIT_DEPTH, true); // bits per sample\n\n // \"data\" sub-chunk\n writeString(view, 36, \"data\");\n view.setUint32(40, dataSize, true);\n\n // Write audio data\n let offset = HEADER_SIZE;\n const channels = [];\n\n // Get audio data from each channel\n for (let i = 0; i < NUM_CHANNELS; i++) {\n channels.push(audioBuffer.getChannelData(i));\n }\n\n // Interleave channels and convert float32 samples to int16\n for (let i = 0; i < numSamples; i++) {\n for (let channel = 0; channel < NUM_CHANNELS; channel++) {\n // Convert float32 (-1.0 to 1.0) to int16 (-32768 to 32767)\n const sample = Math.max(-1, Math.min(1, channels[channel][i]));\n const int16Sample = sample < 0 ? sample * 0x8000 : sample * 0x7FFF;\n view.setInt16(offset, int16Sample, true);\n offset += BYTES_PER_SAMPLE;\n }\n }\n\n // Create Blob and download\n const blob = new Blob([buffer], { type: \"audio/wav\" });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n\n // Clean up\n URL.revokeObjectURL(url);\n\n // Helper function to write strings to the DataView\n function writeString(view: DataView, offset: number, string: string): void {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i));\n }\n }\n}\n\n*/\n\n/*(\nsendInitPitchShiftToWorkletWithTrackLabel(\n 0.8, \n AEV3Controller.getInstance().getPitchShiftWorklet('mix1'), 'mix1'\n)\n*/\n\n/**\n * Universal pitch shift command that works with both Rubberband and Phaze engines\n * Only sends if pitch change exceeds threshold to avoid unnecessary micro-adjustments\n */\nconst sendPitchCommand = (pitchValue: number, workletNode: AudioWorkletNode, trackTypeForDebug: TrackLabelType | string ) => {\n if (!workletNode) return;\n const ENABLE_LOGGING_VALUES_SEND_TO_WORKLET = false;\n \n // Check if pitch change is significant enough to warrant sending\n const lastPitch = lastSentPitchValues.get(workletNode);\n const pitchDifference = lastPitch !== undefined ? Math.abs(pitchValue - lastPitch) : Infinity;\n \n if (pitchDifference < PITCH_CHANGE_THRESHOLD) {\n return; // Skip sending - difference too small\n }\n \n // Update the last sent value\n lastSentPitchValues.set(workletNode, pitchValue);\n \n if (USE_PHAZE_ENGINE) {\n // Phaze uses AudioParam interface\n if (workletNode.parameters) {\n try {\n const pitchFactorParam = (workletNode.parameters as any).get('pitchFactor');\n if (pitchFactorParam) {\n pitchFactorParam.value = pitchValue;\n if (ENABLE_LOGGING_VALUES_SEND_TO_WORKLET) console.log(`%cpitch@phaze-${trackTypeForDebug}`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0, pitchValue);\n }\n } catch (error) {\n console.warn(`%cError setting Phaze pitch for ${trackTypeForDebug}:`, 'color: orange', error);\n }\n }\n } else {\n // Rubberband uses port messages - requires 2 decimal places\n if (workletNode.port) {\n workletNode.port.postMessage(JSON.stringify(['pitch', pitchValue.toFixed(2)]));\n if (ENABLE_LOGGING_VALUES_SEND_TO_WORKLET) console.log(`%cpitch@rubberband-${trackTypeForDebug}`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0, pitchValue.toFixed(2));\n }\n }\n};","import { IBarMapping } from \"../utils/bars\";\nimport { isSafariOriOS } from \"../utils/browser-check\";\nimport { UUID, TStemType, AEV3StemIntegerType } from \"../interface\";\n\nimport { IBarSequence, IBarSequenceChunk, MasterBarSegmentGeneticSignature } from \"./types-interfaces\";\n// import { USE_NATURAL_TEMPO_MIXING_EXPORTED, USE_BAR_WISE_PITCH_CORRECTION_EXPORTED } from \"../audio-context\";\nimport { ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR } from \"@/services/engine_dev_flags\";\nimport { consoleColorfulMessage4Lawful } from \"../utils/colorConsole\";\nimport { BarSequence } from \"./bar-sequence\";\n// import { v4 as uuid } from 'uuid';\n\n// 0.5: 1 mix bar = 2 seed bar\n// 2 : 2 mix bar = 1 seed bar\nexport type RatioOfBarsAllowedBetweenSeedAndMix = 0.5 | 1 | 2; //mixBar.targetBarLength48000 / seedBar.targetBarLength48000\nexport const isValidRatioBetweenBarsOfSeedAndMix = (value: number) => {\n return [0.5, 1, 2].includes(value);\n}\n\nconst SEPERATOR_OF_SYNTHETIC_BAR_FUSION = '$_$';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst composeBarSequence = (s: {stemId: string; hls: string; stemPosition: string; }, \n sequenceIdx: AEV3StemIntegerType, \n stemAlignedId: TStemType, \n trackSignature: string, \n startBarIndex: number, \n endBarIndex: number, \n maxSampleLength48000: number, \n barLength48000: number,\n speedRatio_SeedMixMatching: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n trackIdOfBar: UUID,\n): IBarSequence => {\n const sequence: IBarSequence = {\n segments: [],\n stemType: s.stemPosition,\n signature: `${trackSignature}_${s.stemPosition}`,\n sequenceId: stemAlignedId,\n // AudioSourceSequence: undefined,\n }\n\n const applySpecialBarLengthOnGenerationForNonIntegerNumber = !Number.isInteger(barLength48000);\n if (applySpecialBarLengthOnGenerationForNonIntegerNumber){\n // the targetBarLength is not integer, \n // very likely it is a mixTrack which the wished Bar length is derived from seedTrack\n // we need a way to compose the bar sequence to achieve optimal results\n // whenever this applySpecialBarLengthOnGenerationForNonIntegerNumber is true, round the barLength even index:i\n\n // besides throw warning if ratioWhenComposingBar is non-ONE\n if (ratioWhenComposingBar!==1){\n console.table({\n barLength48000,\n ratioWhenComposingBar,\n });\n throw Error('Unexpected error on generating bar, decimal value appears on bar length. (code: 2501082115)');\n }\n\n // BECAUSE it should be coming from matching 1 seed = 2 mix bar\n // besides the seed track's BarLength should be an odd value, e.g. 124803, then if mix track has a tempoOrigSz of 63004\n // the getTargetSampleLengthForMixTrack will resolve 0.5 ratio on mixTrack and expects tempoShiftSz value as 124803/2 = 62401.5\n }\n\n let segments: IBarSequenceChunk[] = [];\n const totalBarCount = Math.ceil( (maxSampleLength48000) / barLength48000);\n const _endBarIndex = endBarIndex > totalBarCount - 1 ? totalBarCount - 1: endBarIndex;\n\n for (let i = startBarIndex; i <= _endBarIndex; i++) {\n \n let sampleStart: number;\n let actualLength: number;\n let sampleEnd: number;\n \n if (!applySpecialBarLengthOnGenerationForNonIntegerNumber) {\n sampleStart = i * barLength48000;\n actualLength = barLength48000;\n } else {\n // special treatment for non-integer barLength48000\n /**\n * example: barLength48000 = 62401.5\n * [0-EVEN: start: 0, duration - 62401]\n * [1-ODD: start: 62401 = Math.floor(i*62401.5), duration - 62402]\n * [2-EVEN: start: 62401 + 62402 = Math.ceil(i*62401.5) duration - 62401]\n * [3-ODD: start: 62401 + 62402 + 62401 = Math.floor(i*62401.5), duration - 62402]\n * [4-EVEN: start: 62401 + 62402 + 62401 = 62402 = Math.ceil(i*62401.5) duration - 62401]\n * [5-ODD: start: 62401 + 62402 + 62401 + 62402 = 62402 = Math.ceil(i*62401.5) duration - 62402]\n * .\n * .\n * .\n */\n if (i % 2 === 0) {\n // even index\n sampleStart = Math.ceil(i*barLength48000);\n actualLength = Math.floor(barLength48000);\n } else {\n // odd index\n sampleStart = Math.floor(i*barLength48000);\n actualLength = Math.ceil(barLength48000);\n }\n }\n sampleEnd = sampleStart + actualLength - 1;\n\n if (isSafariOriOS && i === 0) {\n sampleStart = sampleStart + 2112;\n actualLength = sampleEnd - sampleStart + 1;\n }\n\n let isLastBar = false;\n // always true within this function, but not on divideBarSegmentsIntoTwo\n const isExplicitEndOfBar = true;\n const isSegmentFromSplittedBar = false;\n\n if (i === totalBarCount -1) {\n sampleEnd = maxSampleLength48000 - 1;\n actualLength = maxSampleLength48000 % barLength48000;\n isLastBar = true;\n }\n segments.push({\n chunkId: `${s.stemId}_bar_${i}`,\n nextChunkId: (i+1 < totalBarCount) ? `${s.stemId}_bar_${i+1}`: '',\n nextScheduledChunkId: \"\",\n nextScheduledChunkOffset: 0,\n nextChunkRedirectionCount: 0,\n isLastBar: isLastBar,\n isLastBarFromIntelli: false,\n isExplicitEndOfBar: isExplicitEndOfBar,\n isSegmentFromSplittedBar: isSegmentFromSplittedBar,\n isLastBarFromMasterBarEditing: false,\n updateCurrentTrackIfThisMasterBarSegmentPlays: false,\n updateSelfTrackData: false,\n updateCurrentMixMetaIfThisMasterBarSegmentPlays: false,\n isFirstBarOfLiveEditSwap: false,\n isFirstBarOfLiveEditSwap_remixId: {type: undefined, id: ''},\n isFirstBarOfLiveEditSwap_stationId: '',\n swapTrackIndex0_n_1: false,\n geneticSignatureForThisMasterBarSegment: null,\n isTransitionalBar: false,\n halfBarOnlyOnSquash: false,\n isBarProductOfSquash: false,\n originalBar: {\n sampleStart: sampleStart,\n sampleEnd: sampleEnd,\n sampleLength: actualLength,\n startTime: (sampleStart / 48000),\n endTime: sampleEnd / 48000,\n duration: actualLength / 48000,\n trackId: trackIdOfBar,\n stemId: stemAlignedId,\n sequenceIdx,\n beatIndex: i,\n beatIndexIsReal: true,\n beatSource: -1,\n },\n decoded: {\n audioBuffer: undefined,\n totalTimeElapsed: -1,\n isDecoding: false,\n glueFramesTime: -1, decodeTime: -1, decodeQueueId: -1, finishedDecodedAt: -1\n },\n parent: null as unknown as IBarSequence, // sequence,\n speedRatio_SeedMixMatching: speedRatio_SeedMixMatching,\n // will be modified after bar sequences between mix/seed aligned\n speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised: 1,\n speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised: 1,\n\n pitchCorrectionSemitones_SeedMixMatching: 0,\n pitchCorrectionSemitones_SeedIsPlayingAsUnquantised: 0,\n pitchCorrectionSemitones_MixIsPlayingAsUnquantised: 0,\n\n // by default since April\n playQuantisedSpeedAs: 'seed',\n speedRatio_ManualScheduling: 1,\n stemsToggle_StartOfBar: {},\n \n progress: {\n chunkIdx: -1,\n chunkId: '',\n cached: false,\n decoded: false,\n invalid: false, // not match with any AAC/MP4 segment\n isPlaying: false,\n }\n });\n }\n if (ratioWhenComposingBar===0.5) {\n // combine 2 into 1\n segments = squashTwoBarSegmentsIntoOne(segments,barLength48000);\n } else if (ratioWhenComposingBar===2) {\n // divide into 2\n segments = divideBarSegmentsIntoTwo(segments);\n } else {\n // squashTwoBarSegmentsIntoOne(segments);\n // divideBarSegmentsIntoTwo(segments);\n }\n\n return {\n ...sequence,\n segments: segments,\n }\n}\n\nexport const composeBarSequenceVariableBarLength = (s: {stemId: string; hls: string; stemPosition: string; }, \n sequenceIdx: number, \n stemAlignedId: TStemType, \n trackSignature: string, \n startBarIndex: number, \n endBarIndex: number, \n maxSampleLength48000: number, \n barMapping48000: IBarMapping[], \n targetBarLength48000: number, \n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix, //mixBar.targetBarLength48000 / seedBar.targetBarLength48000\n trackIdOfBar: UUID,\n trackType: 'seed' | 'mix', // New parameter to distinguish track types\n seedBarMapping48000: IBarMapping[], // New parameter for seed reference when creating mix\n playQuantisedSpeedOnBars: 'quantised' | 'seed' | 'mix', \n beatVersion: number,\n): IBarSequence => {\n const sequence: IBarSequence = {\n segments: [],\n stemType: s.stemPosition,\n signature: `${trackSignature}_${s.stemPosition}`,\n sequenceId: stemAlignedId,\n // AudioSourceSequence: undefined,\n }\n // debugger;\n\n let segments: IBarSequenceChunk[] = [];\n const totalBarCount = barMapping48000.length;\n\n // 26-06-2025 added this error because it is getting more important on calculating endBarIndex especially for infinite-mix\n if (endBarIndex > totalBarCount - 1) {\n throw Error(`${trackIdOfBar} endBarIndex(${endBarIndex}) is larger than possible value. Bar Length: ${totalBarCount}`)\n }\n\n const _endBarIndex = endBarIndex > totalBarCount - 1 ? totalBarCount - 1: endBarIndex;\n\n for (let i = startBarIndex; i <= _endBarIndex; i++) {\n \n // eslint-disable-next-line prefer-const\n let {sampleStart, sampleEnd} = barMapping48000[i];\n \n if (isSafariOriOS && i === 0) {\n sampleStart = sampleStart + 2112;\n }\n const actualLength = sampleEnd - sampleStart + 1;\n \n // Speed calculation: Natural tempo mode vs Quantized mode\n const speedRatio_SeedMixMatching: number = (actualLength / ratioWhenComposingBar) / targetBarLength48000;\n \n /*\n if (USE_NATURAL_TEMPO_MIXING_EXPORTED && trackType === 'seed') {\n // NATURAL TEMPO: Seed track will be set to natural tempo (1) during alignment\n // For now, use original logic and let alignment fix it\n speedRatio_SeedMixMatching = (actualLength / ratioWhenComposingBar) / targetBarLength48000;\n } else if (USE_NATURAL_TEMPO_MIXING_EXPORTED && trackType === 'mix' && seedBarMapping48000) {\n // NATURAL TEMPO: Mix track will be calculated during alignment to match seed\n // For now, use original logic and let alignment fix it \n speedRatio_SeedMixMatching = (actualLength / ratioWhenComposingBar) / targetBarLength48000;\n } else {\n // QUANTIZED MODE: Original logic - both tracks normalized to common tempo\n speedRatio_SeedMixMatching = (actualLength / ratioWhenComposingBar) / targetBarLength48000;\n }\n \n // NEW: Bar-wise pitch correction calculation\n let pitchCorrectionSemitones: number | undefined = undefined;\n \n if (USE_BAR_WISE_PITCH_CORRECTION_EXPORTED) {\n // Calculate pitch correction based on speed ratio to compensate for pitch artifacts\n // When speed ratio is 1, pitch correction will be 0 (no correction needed)\n // Pitch correction = -12 * log2(speedRatio) to compensate for speed-induced pitch change\n pitchCorrectionSemitones = -12 * Math.log2(speedRatio_SeedMixMatching);\n \n // Clamp to reasonable range to avoid extreme pitch corrections\n pitchCorrectionSemitones = Math.max(-12, Math.min(12, pitchCorrectionSemitones));\n }\n */\n \n // const speedRatio_SeedMixMatching = 1; // no speed change at quantisation\n \n segments.push({\n chunkId: `${s.stemId}_bar_${i}`,\n nextChunkId: (i+1 < totalBarCount) ? `${s.stemId}_bar_${i+1}`: '',\n nextScheduledChunkId: \"\",\n nextScheduledChunkOffset: 0,\n nextChunkRedirectionCount: 0,\n isLastBar: i===_endBarIndex,\n isLastBarFromIntelli: false,\n isExplicitEndOfBar: true,\n isSegmentFromSplittedBar: false,\n isLastBarFromMasterBarEditing: false,\n updateCurrentTrackIfThisMasterBarSegmentPlays: false,\n updateSelfTrackData: false,\n updateCurrentMixMetaIfThisMasterBarSegmentPlays: false,\n isFirstBarOfLiveEditSwap: false,\n isFirstBarOfLiveEditSwap_remixId: {type: undefined, id: ''},\n isFirstBarOfLiveEditSwap_stationId: '',\n swapTrackIndex0_n_1: false,\n geneticSignatureForThisMasterBarSegment: null,\n isTransitionalBar: false,\n halfBarOnlyOnSquash: false,\n isBarProductOfSquash: false,\n originalBar: {\n sampleStart: sampleStart,\n sampleEnd: sampleEnd,\n sampleLength: actualLength,\n startTime: (sampleStart / 48000),\n endTime: sampleEnd / 48000,\n duration: actualLength / 48000,\n trackId: trackIdOfBar,\n stemId: stemAlignedId,\n sequenceIdx,\n beatIndex: i,\n beatIndexIsReal: true,\n beatSource: beatVersion,\n },\n decoded: {\n audioBuffer: undefined,\n totalTimeElapsed: -1,\n isDecoding: false,\n glueFramesTime: -1,\n decodeTime: -1,\n decodeQueueId: -1,\n finishedDecodedAt: -1,\n },\n parent: null as unknown as IBarSequence, // sequence,\n speedRatio_SeedMixMatching: speedRatio_SeedMixMatching,\n // will be modified after bar sequences between mix/seed aligned\n speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised: 1,\n speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised: 1,\n \n pitchCorrectionSemitones_SeedMixMatching: 0,\n pitchCorrectionSemitones_SeedIsPlayingAsUnquantised: 0,\n pitchCorrectionSemitones_MixIsPlayingAsUnquantised: 0,\n \n playQuantisedSpeedAs: playQuantisedSpeedOnBars,\n speedRatio_ManualScheduling: 1,\n // NEW: Bar-wise pitch correction\n // pitchCorrectionSemitones: 0,\n \n\n stemsToggle_StartOfBar: {},\n \n progress: {\n chunkIdx: -1,\n chunkId: '',\n cached: false,\n decoded: false,\n invalid: false, // not match with any AAC/MP4 segment\n isPlaying: false,\n }\n });\n }\n\n if (ratioWhenComposingBar===0.5) {\n // combine 2 into 1\n segments = squashTwoBarSegmentsIntoOne(segments, targetBarLength48000);\n // debugger;\n } else if (ratioWhenComposingBar===2) {\n // divide into 2\n segments = divideBarSegmentsIntoTwo(segments);\n } else {\n // squashTwoBarSegmentsIntoOne(segments);\n // divideBarSegmentsIntoTwo(segments);\n }\n \n // console.log(segments);\n // debugger;\n return {\n ...sequence,\n segments: segments,\n }\n}\n\n/**\n * Note this ops carry out on the currentSequences directly\n */\nexport const replaceLastFewSegementsInBarSequences = (currentSequences: IBarSequence[], newSequences: IBarSequence[], startingFromLastNItems: number) => {\n currentSequences.forEach((s, index)=>{\n const originalSegments = [...s.segments];\n\n const startIndex = 0;\n const endIndex = s.segments.length - startingFromLastNItems;\n\n const updated = originalSegments.splice(startIndex, endIndex);\n const append = newSequences[index].segments.splice(endIndex);\n \n s.segments = [...updated, ...append];\n \n // take care of bar in middle\n s.segments[endIndex-1].nextChunkId = s.segments[endIndex].chunkId;\n s.segments[endIndex-1].isLastBar = false;\n \n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n\n });\n}\n\nconst squashTwoBarSegmentsIntoOne = (input: IBarSequenceChunk[] , targetBarLength48000: number): IBarSequenceChunk[] => {\n const cloned: IBarSequenceChunk[] = JSON.parse(JSON.stringify(input));\n let squashed: IBarSequenceChunk[] = [];\n for (let i=0; i<cloned.length; i=i+2) {\n const obI = cloned[i].originalBar;\n const obI1 = cloned[i + 1]?.originalBar;\n if (i+1 > cloned.length-1) {\n // last one\n if (!obI) throw Error('squashTwoBarSegmentsIntoOne: missing originalBar');\n const sampleLength = obI.sampleLength;\n const newSpeedRatio_SeedMixMatching = (sampleLength)/(targetBarLength48000);\n\n // debugger;\n squashed.push({\n // half\n ...cloned[i],\n halfBarOnlyOnSquash: true,\n isBarProductOfSquash: false,\n speedRatio_SeedMixMatching: newSpeedRatio_SeedMixMatching,\n });\n } else {\n // have i+1\n if (!obI || !obI1) throw Error('squashTwoBarSegmentsIntoOne: missing originalBar');\n const sampleStart = obI.sampleStart;\n const sampleEnd = obI1.sampleEnd;\n const sampleLength = obI.sampleLength + obI1.sampleLength;\n if (obI.trackId!==obI1.trackId){\n throw Error('different trackId is not allowed to be squashed together.');\n }\n if (obI.stemId!==obI1.stemId){\n throw Error('different stemId is not allowed to be squashed together.');\n }\n const trackId = obI1.trackId;\n const stemId = obI1.stemId;\n const sequenceIdx = obI1.sequenceIdx;\n\n // combined two Bar while trying to match the targetBarLength48000\n const newSpeedRatio_SeedMixMatching = (sampleLength)/(targetBarLength48000);\n \n squashed.push({\n ...cloned[i+1],\n isBarProductOfSquash: true,\n originalBar: {\n sampleStart,\n sampleEnd,\n sampleLength,\n startTime: (sampleStart / 48000),\n endTime: sampleEnd / 48000,\n duration: sampleLength / 48000,\n trackId,\n stemId,\n sequenceIdx,\n beatIndex: obI.beatIndex,\n beatIndexIsReal: obI.beatIndexIsReal,\n beatSource: obI.beatSource,\n },\n speedRatio_SeedMixMatching: newSpeedRatio_SeedMixMatching,\n revertInfo: {\n 0: {\n originalBar: {\n sampleLength: obI.sampleLength, \n sampleStart: obI.sampleStart, \n sampleEnd: obI.sampleEnd, \n beatIndex: obI.beatIndex,\n beatIndexIsSplited: obI.beatIndexIsReal,\n }, \n speedRatio_SeedMixMatching: cloned[i].speedRatio_SeedMixMatching},\n 1: {\n originalBar: {\n sampleLength: obI1.sampleLength, \n sampleStart: obI1.sampleStart, \n sampleEnd: obI1.sampleEnd, \n beatIndex: obI1.beatIndex,\n beatIndexIsSplited: obI1.beatIndexIsReal,\n }, \n speedRatio_SeedMixMatching: cloned[i+1].speedRatio_SeedMixMatching},\n }\n });\n }\n };\n squashed = squashed.map((v, idx: number)=>{\n if (idx < squashed.length - 1) {\n v.nextChunkId = squashed[idx+1].chunkId;\n }\n return v;\n });\n // console.log(JSON.parse(JSON.stringify(input)));\n // console.log(JSON.parse(JSON.stringify(squashed)));\n return squashed;\n}\n\nconst divideBarSegmentsIntoTwo = (input: IBarSequenceChunk[]): IBarSequenceChunk[] => {\n const cloned: IBarSequenceChunk[] = JSON.parse(JSON.stringify(input));\n let squashed: IBarSequenceChunk[] = [];\n for (let i=0; i<cloned.length; i++) {\n const ob = cloned[i].originalBar;\n if (!ob) throw Error('divideBarSegmentsIntoTwo: missing originalBar');\n const trackId = ob.trackId;\n const stemId = ob.stemId;\n const sequenceIdx = ob.sequenceIdx;\n\n let sampleStart = ob.sampleStart;\n \n // special treatment for non-integer barLength48000\n let sampleLength = Math.floor(ob.sampleLength / 2);\n let sampleEnd = ob.sampleStart + sampleLength - 1;\n squashed.push({\n // ...cloned[i],\n chunkId: cloned[i].chunkId + '_eve',\n \n nextChunkId: \"\", // update later\n nextScheduledChunkId: \"\",\n nextScheduledChunkOffset: 0,\n nextChunkRedirectionCount: 0,\n \n isLastBar: false,\n isLastBarFromIntelli: false,\n isExplicitEndOfBar: false,\n isSegmentFromSplittedBar: true,\n isLastBarFromMasterBarEditing: false,\n updateCurrentTrackIfThisMasterBarSegmentPlays: false,\n updateSelfTrackData: false,\n updateCurrentMixMetaIfThisMasterBarSegmentPlays: false,\n isFirstBarOfLiveEditSwap: false,\n isFirstBarOfLiveEditSwap_remixId: {type: undefined, id: ''},\n isFirstBarOfLiveEditSwap_stationId: '',\n swapTrackIndex0_n_1: false,\n geneticSignatureForThisMasterBarSegment: null,\n isTransitionalBar: false,\n halfBarOnlyOnSquash: false,\n isBarProductOfSquash: false,\n originalBar: {\n sampleStart,\n sampleEnd,\n sampleLength,\n startTime: (sampleStart / 48000),\n endTime: sampleEnd / 48000,\n duration: sampleLength / 48000,\n trackId,\n stemId,\n sequenceIdx,\n beatIndex: ob.beatIndex,\n beatIndexIsReal: ob.beatIndexIsReal,\n beatSource: ob.beatSource,\n },\n // CAUTION: if we use ...cloned[i] and skip following lines\n // the decoded (object references will be shared between the two chunks)\n // then when decode process update the decoded.audioBuffer, the second part\n // will share the same audioBuffer with _eve\n decoded: {\n audioBuffer: undefined,\n totalTimeElapsed: -1,\n isDecoding: false,\n glueFramesTime: -1,\n decodeTime: -1,\n decodeQueueId: -1,\n finishedDecodedAt: -1,\n },\n parent: null as unknown as IBarSequence, // cloned[i].parent, // just copy the reference\n speedRatio_SeedMixMatching: cloned[i].speedRatio_SeedMixMatching,\n // will be modified after bar sequences between mix/seed aligned\n speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised: 1,\n speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised: 1,\n\n pitchCorrectionSemitones_SeedMixMatching: cloned[i].pitchCorrectionSemitones_SeedMixMatching,\n pitchCorrectionSemitones_SeedIsPlayingAsUnquantised: cloned[i].pitchCorrectionSemitones_SeedIsPlayingAsUnquantised,\n pitchCorrectionSemitones_MixIsPlayingAsUnquantised: cloned[i].pitchCorrectionSemitones_MixIsPlayingAsUnquantised,\n \n playQuantisedSpeedAs: cloned[i].playQuantisedSpeedAs,\n speedRatio_ManualScheduling: 1,\n stemsToggle_StartOfBar: cloned[i].stemsToggle_StartOfBar,\n \n progress: {\n chunkIdx: cloned[i].progress.chunkIdx,\n chunkId: cloned[i].progress.chunkId,\n cached: cloned[i].progress.cached,\n decoded: cloned[i].progress.decoded,\n invalid: cloned[i].progress.invalid, // not match with any AAC/MP4 segment\n isPlaying: cloned[i].progress.isPlaying,\n }\n });\n // special treatment for non-integer barLength48000\n const newSampleStart = sampleEnd + 1; // ending index of previous splited segment + 1\n const newSampleEnd = ob.sampleEnd; // ending index of original bar\n const newSampleLength = newSampleEnd - newSampleStart + 1; // calculation the length \n\n if (newSampleLength + sampleLength !== ob.sampleLength) {\n console.log('issue on sample continuity')\n console.log(ob);\n console.table({\n id: '1',\n sampleStart,\n sampleEnd,\n sampleLength,\n\n id2: '2',\n newSampleStart,\n newSampleEnd,\n newSampleLength,\n });\n // debugger;\n }\n\n sampleStart = newSampleStart;\n sampleEnd = newSampleEnd;\n sampleLength = newSampleLength;\n \n // might append extra 1 sample at end\n squashed.push({\n // ...cloned[i],\n chunkId: cloned[i].chunkId,\n \n nextChunkId: \"\", // update later\n nextScheduledChunkId: \"\",\n nextScheduledChunkOffset: 0,\n nextChunkRedirectionCount: 0,\n \n isLastBar: cloned[i].isLastBar,\n isLastBarFromIntelli: false,\n \n isExplicitEndOfBar: cloned[i].isExplicitEndOfBar,\n isSegmentFromSplittedBar: true,\n\n isLastBarFromMasterBarEditing: false,\n updateCurrentTrackIfThisMasterBarSegmentPlays: false,\n updateSelfTrackData: false,\n updateCurrentMixMetaIfThisMasterBarSegmentPlays: false,\n isFirstBarOfLiveEditSwap: false,\n isFirstBarOfLiveEditSwap_remixId: {type: undefined, id: ''},\n isFirstBarOfLiveEditSwap_stationId: '',\n swapTrackIndex0_n_1: false,\n geneticSignatureForThisMasterBarSegment: null,\n isTransitionalBar: false,\n halfBarOnlyOnSquash: false,\n isBarProductOfSquash: false,\n originalBar: {\n sampleStart,\n sampleEnd,\n sampleLength,\n startTime: (sampleStart / 48000),\n endTime: sampleEnd / 48000,\n duration: sampleLength / 48000,\n trackId,\n stemId,\n sequenceIdx,\n beatIndex: ob.beatIndex,\n beatIndexIsReal: false,\n beatSource: ob.beatSource,\n },\n // CAUTION: if we use ...cloned[i] and skip following lines\n // the decoded (object references will be shared between the two chunks)\n // then when decode process update the decoded.audioBuffer, the second part\n // will share the same audioBuffer with _eve\n decoded: {\n audioBuffer: undefined,\n totalTimeElapsed: -1,\n isDecoding: false,\n glueFramesTime: -1,\n decodeTime: -1,\n decodeQueueId: -1,\n finishedDecodedAt: -1,\n },\n parent: null as unknown as IBarSequence, // cloned[i].parent, // just copy the reference\n speedRatio_SeedMixMatching: cloned[i].speedRatio_SeedMixMatching,\n // will be modified after bar sequences between mix/seed aligned\n speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised: 1,\n speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised: 1,\n\n pitchCorrectionSemitones_SeedMixMatching: cloned[i].pitchCorrectionSemitones_SeedMixMatching,\n pitchCorrectionSemitones_SeedIsPlayingAsUnquantised: cloned[i].pitchCorrectionSemitones_SeedIsPlayingAsUnquantised,\n pitchCorrectionSemitones_MixIsPlayingAsUnquantised: cloned[i].pitchCorrectionSemitones_MixIsPlayingAsUnquantised,\n\n // by default since April\n playQuantisedSpeedAs: cloned[i].playQuantisedSpeedAs,\n speedRatio_ManualScheduling: 1,\n stemsToggle_StartOfBar: {},\n \n progress: {\n chunkIdx: cloned[i].progress.chunkIdx,\n chunkId: cloned[i].progress.chunkId,\n cached: cloned[i].progress.cached,\n decoded: cloned[i].progress.decoded,\n invalid: cloned[i].progress.invalid, // not match with any AAC/MP4 segment\n isPlaying: cloned[i].progress.isPlaying,\n }\n });\n }\n \n squashed = squashed.map((v, idx: number)=>{\n if (idx < squashed.length - 1) {\n v.nextChunkId = squashed[idx+1].chunkId;\n }\n return v;\n });\n // console.log(JSON.parse(JSON.stringify(input)));\n // console.log(JSON.parse(JSON.stringify(squashed)));\n return squashed;\n}\n\nexport const fuseFewSegementsInBarSequences = (firstSequence: IBarSequence[], newSequence: IBarSequence[], startingFromLastNItems: number) => {\n firstSequence.forEach((s, index)=>{\n const originalSegments = [...s.segments];\n\n const startIndex = 0;\n const endIndex = startingFromLastNItems; //s.segments.length - startingFromLastNItems;\n\n const updated = originalSegments.splice(startIndex, endIndex);\n const append = newSequence[index].segments.splice(endIndex);\n \n // avoid duplicate of chunkId incase two segments are merging\n const uniqueId = Math.random().toString(36).substring(2, 8); // Generate a random 6-character string\n append.forEach(segment => {\n // Preserve the original chunkId structure but add a unique suffix\n const [originalChunkId] = segment.chunkId.split(SEPERATOR_OF_SYNTHETIC_BAR_FUSION);\n segment.chunkId = `${originalChunkId}${SEPERATOR_OF_SYNTHETIC_BAR_FUSION}${uniqueId}`;\n \n // Update nextChunkId if it exists\n if (segment.nextChunkId) {\n const [originalChunkId] = segment.nextChunkId.split(SEPERATOR_OF_SYNTHETIC_BAR_FUSION);\n segment.nextChunkId = `${originalChunkId}${SEPERATOR_OF_SYNTHETIC_BAR_FUSION}${uniqueId}`;\n }\n });\n \n s.segments = [...updated, ...append];\n \n // take care of bar in middle\n s.segments[endIndex-1].nextChunkId = s.segments[endIndex].chunkId;\n s.segments[endIndex-1].isLastBar = false;\n \n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n });\n}\n\n/**\n * got to be careful before cutting segments\n * the segment already sent to buffer-processor ask for nextChunkId being cut\n * \n * Also if multiple operation are carry out on same trackId which is repeative\n * \n * @param firstSequence \n * @param startingFromLastNItems remove item after this index\n * @returns \n */\nexport const cutSegmentsInBarSequences = (firstSequence: IBarSequence[], startingFromLastNItems: number): IBarSequenceChunk[][] => {\n const removedSequence: IBarSequenceChunk[][] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n firstSequence.forEach((s, index)=>{\n const originalSegments = [...s.segments];\n\n const startIndex = 0;\n const endIndex = startingFromLastNItems; //s.segments.length - startingFromLastNItems;\n\n const updated = originalSegments.splice(startIndex, endIndex);\n const removed = originalSegments;\n \n // TODO: make sure removed are clean up\n removedSequence.push(removed);\n\n s.segments = [...updated];\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n });\n return removedSequence;\n}\n\n/**\n * got to be careful before cutting segments\n * the segment already sent to buffer-processor ask for nextChunkId being cut\n * \n * Also if multiple operation are carry out on same trackId which is repeative\n * \n * @param firstSequence \n * @param removeUntilLastNItems remove items until this index\n * @returns \n */\nexport const popSegmentsInMasterBarSequences = (firstSequence: IBarSequence[], removeUntilLastNItems: number): IBarSequenceChunk[][] => {\n const removedSequence: IBarSequenceChunk[][] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n firstSequence.forEach((s, index)=>{\n const originalSegments = [...s.segments];\n\n const startIndex = 0;\n const endIndex = removeUntilLastNItems; //s.segments.length - startingFromLastNItems;\n\n const updated = originalSegments.splice(startIndex, endIndex);\n const removed = originalSegments;\n \n // TODO: make sure removed are clean up\n removedSequence.push(updated);\n\n s.segments = [...removed];\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n });\n return removedSequence;\n}\n\nexport function trimBarSequenceSegments(bar: BarSequence, chunksToRemove: number) {\n\t// make sure the resolution of processor not relying on chunkIdx\n\tconsole.log('before trim', bar?.sequences?.[0]?.segments?.length || 'nil');\n if (bar?.sequences) {\n bar.stopDecoding();\n bar.stopEvicting();\n for (let i=0; i<4; i++) {\n if (bar.sequences[i].segments.length > chunksToRemove) {\n // segments now are the one behind chunksToRemove\n // const removed = \n bar.sequences[i].segments.splice(0, chunksToRemove);\n\n if (bar.sourcePlaying?.[i] && bar.sourcePlaying[i].chunkIdx - chunksToRemove > 0 ) {\n bar.sourcePlaying[i].chunkIdx -= chunksToRemove;\n }\n if (bar.sourceJustPlayed?.[i] && bar.sourceJustPlayed[i].chunkIdx - chunksToRemove > 0 ) {\n bar.sourceJustPlayed[i].chunkIdx -= chunksToRemove;\n }\n if (bar.sourceSentToBufferWorklet?.[i] && bar.sourceSentToBufferWorklet[i].chunkIdx - chunksToRemove > 0) {\n bar.sourceSentToBufferWorklet[i].chunkIdx -= chunksToRemove;\n }\n }\n }\n bar.startDecoding();\n bar.startEvicting();\n }\n console.log('after trim', bar?.sequences?.[0]?.segments?.length || 'nil');\n}\n\nexport const combineSegmentsOfTwoBarSequences = (firstSequence: IBarSequence[], \n newSequence: IBarSequence[], cleanupSegmentsAfterUse: boolean, \n markIsLastBarFromMasterBarEditingOnFirstSequence: boolean,\n updateCurrentTrackIfThisMasterBarSegmentPlays: boolean,\n updateCurrentMixMetaIfThisMasterBarSegmentPlays: boolean,\n geneticSignatureForThisMasterBarSegment: MasterBarSegmentGeneticSignature, \n swapTrackIndex0_n_1: boolean,\n) => {\n // console.log(firstSequence);\n // debugger;\n firstSequence.forEach((s, index)=>{\n const originalSegments = s.segments;\n const endIndex = originalSegments.length - 1;\n\n const append = newSequence[index].segments;\n // prevent destroying of bars affect the instances copied to firstSequence\n if (cleanupSegmentsAfterUse) {\n newSequence[index].segments = [];\n }\n\n // avoid duplicate of chunkId incase two segments are merging\n const uniqueId = Math.random().toString(36).substring(2, 8); // Generate a random 6-character string\n append.forEach(segment => {\n // Preserve the original chunkId structure but add a unique suffix\n const [originalChunkId, formerID_IF_ANY] = segment.chunkId.split(SEPERATOR_OF_SYNTHETIC_BAR_FUSION);\n segment.chunkId = `${originalChunkId}${SEPERATOR_OF_SYNTHETIC_BAR_FUSION}${uniqueId}_${formerID_IF_ANY||''}`;\n \n // Update nextChunkId if it exists\n if (segment.nextChunkId) {\n const [originalChunkId, formerID_IF_ANY] = segment.nextChunkId.split(SEPERATOR_OF_SYNTHETIC_BAR_FUSION);\n segment.nextChunkId = `${originalChunkId}${SEPERATOR_OF_SYNTHETIC_BAR_FUSION}${uniqueId}_${formerID_IF_ANY||''}`;\n }\n });\n \n s.segments = [...originalSegments, ...append];\n \n // take care of bar in middle\n s.segments[endIndex].nextChunkId = s.segments[endIndex+1].chunkId;\n s.segments[endIndex].isLastBar = false;\n s.segments[endIndex].isLastBarFromMasterBarEditing = markIsLastBarFromMasterBarEditingOnFirstSequence;\n \n s.segments[endIndex+1].updateSelfTrackData = updateCurrentTrackIfThisMasterBarSegmentPlays;\n s.segments[endIndex+1].updateCurrentMixMetaIfThisMasterBarSegmentPlays = updateCurrentMixMetaIfThisMasterBarSegmentPlays;\n s.segments[endIndex+1].updateCurrentTrackIfThisMasterBarSegmentPlays = updateCurrentTrackIfThisMasterBarSegmentPlays;\n \n s.segments[endIndex+1].geneticSignatureForThisMasterBarSegment = geneticSignatureForThisMasterBarSegment;\n s.segments[endIndex+1].swapTrackIndex0_n_1 = swapTrackIndex0_n_1;\n \n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n });\n // console.log(firstSequence);\n // debugger;\n}\n\n/* note currently it can't jump backwards */\nexport const loopWithinSameSegments = (sequence: IBarSequence[]) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n sequence.forEach((s, index)=>{\n s.segments[s.segments.length-1].nextScheduledChunkId = s.segments[0].chunkId;\n });\n}\n\n/**\n * Note this ops carry out on the currentSequences directly\n */\nexport const removeLastFewSegementsInBarSequences = (currentSequences: IBarSequence[], startingFromLastNItems: number) => {\n currentSequences.forEach((s)=>{\n const originalSegments = [...s.segments];\n\n const startIndex = 0;\n const endIndex = s.segments.length - startingFromLastNItems;\n\n const updated = originalSegments.splice(startIndex, endIndex);\n \n s.segments = [...updated];\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n });\n}\n\n/**\n * Note this ops carry out on the currentSequences directly\n */\nexport const removeFirstFewSegementsInBarSequences = (currentSequences: IBarSequence[], numberOfItemsToRemove: number) => {\n currentSequences.forEach((s)=>{\n const originalSegments = [...s.segments];\n\n const startIndex = numberOfItemsToRemove;\n const endIndex = s.segments.length - 1;\n\n const updated = originalSegments.splice(startIndex, endIndex);\n \n s.segments = [...updated];\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n });\n}\n\nexport const replenishSegmentsInBarSequences = (currentSequences: IBarSequence[], targetSegmentLength: number, iteration: number, appendTo: 'place-repeat-segments-at-last' | 'place-repeat-segments-at-front') => {\n return replenishSegmentsInBarSequencesV2(currentSequences, targetSegmentLength, currentSequences, iteration, appendTo);\n}\n\n/**\n * replenish the segments based on another composed bar sequence\n * mainly for the use of looping from different startingBeatIndex\n * \n * e.g. on normal mode, startingIndex when composing M2 could be 8th bar, however when replenishing the sequence if mix < seed length\n * it is more preferrable to start from 0\n */\nexport const replenishSegmentsInBarSequencesV2 = (currentSequences: IBarSequence[], targetSegmentLength: number, replenishWithSequences: IBarSequence[], iteration: number, appendTo: 'place-repeat-segments-at-last' | 'place-repeat-segments-at-front') => {\n if (currentSequences !== replenishWithSequences) {\n // this only happens when this bar composition actually need to be replenished (mix < seed)\n // also it has to be normal mode and composition for auto play next mix\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n console.warn('when replenishSegmentsInBarSequences in bar composing process, replenishing based on another bar sequences (auto play next + normal + seed duration > mix duration');\n }\n // debugger;\n }\n\n // if (currentSequences[0].signature.includes(\"Trojan Horse_\")) {\n // debugger;\n // }\n \n const originalSegmentsLength = currentSequences[0].segments.length;\n const replenishSegmentsLength = replenishWithSequences[0].segments.length;\n\n let diff: number;\n if ( targetSegmentLength - originalSegmentsLength >= replenishSegmentsLength) {\n diff = replenishSegmentsLength;\n } else {\n diff = targetSegmentLength - originalSegmentsLength;\n }\n\n currentSequences.forEach((s, sequenceIdx)=>{\n const _s = replenishWithSequences[sequenceIdx];\n const originalSegments = [...s.segments];\n const replenishSegments = [..._s.segments];\n \n let replenishItems: IBarSequenceChunk[];\n if (diff > 0) {\n if (diff === replenishSegmentsLength) {\n switch (appendTo) {\n case 'place-repeat-segments-at-last':\n default:\n // make sure it is deepcloned before moving on\n replenishItems = JSON.parse(JSON.stringify(replenishSegments)) as IBarSequenceChunk[];\n replenishItems.forEach((i: IBarSequenceChunk, index: number) => {\n // take care of repeated id by serialise the iteration count\n i.chunkId = i.chunkId + `-${iteration}`;\n if (index > 0) {\n replenishItems[index-1].nextChunkId = i.chunkId;\n } else if (index === replenishItems.length-1) {\n replenishItems[index].nextChunkId = '';\n }\n });\n s.segments = [...originalSegments, ...replenishItems];\n\n // take care of bar in middle\n s.segments[originalSegmentsLength-1].isLastBar = false;\n s.segments[originalSegmentsLength-1].nextChunkId = s.segments[originalSegmentsLength].chunkId;\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n break;\n case 'place-repeat-segments-at-front':\n // fill this in\n\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n // make sure it is deepcloned before moving on\n replenishItems = JSON.parse(JSON.stringify(replenishSegments)) as IBarSequenceChunk[]; // grab last few items\n // if (s.signature.includes(\"Trojan Horse_\")) {\n // debugger;\n // }\n try {\n replenishItems.forEach((i: IBarSequenceChunk, index: number) => {\n // take care of repeated id by serialise the iteration count\n i.chunkId = i.chunkId + `-${iteration}`;\n if (index > 0) {\n replenishItems[index-1].nextChunkId = i.chunkId;\n } else if (index === replenishItems.length-1) {\n replenishItems[index].nextChunkId = '';\n }\n });\n const lengthOfFirstItem = replenishItems.length;\n s.segments = [...replenishItems, ...originalSegments];\n\n // take care of bar in middle\n s.segments[lengthOfFirstItem-1].isLastBar = false;\n s.segments[lengthOfFirstItem-1].nextChunkId = s.segments[lengthOfFirstItem].chunkId;\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n } catch (err){\n console.error(err);\n }\n break;\n }\n } else {\n switch (appendTo) {\n case 'place-repeat-segments-at-last':\n default:\n // make sure it is deepcloned before moving on\n replenishItems = JSON.parse(JSON.stringify(replenishSegments.slice(0, diff))) as IBarSequenceChunk[];\n replenishItems.forEach((i: IBarSequenceChunk, index: number) => {\n // take care of repeated id by serialise the iteration count\n i.chunkId = i.chunkId + `-${iteration}`;\n if (index > 0) {\n replenishItems[index-1].nextChunkId = i.chunkId;\n } else if (index === replenishItems.length-1) {\n replenishItems[index].nextChunkId = '';\n }\n });\n s.segments = [...originalSegments, ...replenishItems];\n\n // take care of bar in middle\n s.segments[originalSegmentsLength-1].isLastBar = false;\n s.segments[originalSegmentsLength-1].nextChunkId = s.segments[originalSegmentsLength].chunkId;\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n break;\n case 'place-repeat-segments-at-front':\n // fill this in\n\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n // make sure it is deepcloned before moving on\n replenishItems = JSON.parse(\n JSON.stringify(replenishSegments.slice(replenishSegments.length - 1 - diff, replenishSegments.length - 1)),\n ) as IBarSequenceChunk[]; // grab last few items\n // if (s.signature.includes(\"Trojan Horse_\")) {\n // debugger;\n // }\n try {\n replenishItems.forEach((i: IBarSequenceChunk, index: number) => {\n // take care of repeated id by serialise the iteration count\n i.chunkId = i.chunkId + `-${iteration}`;\n if (index > 0) {\n replenishItems[index-1].nextChunkId = i.chunkId;\n } else if (index === replenishItems.length-1) {\n replenishItems[index].nextChunkId = '';\n }\n });\n const lengthOfFirstItem = replenishItems.length;\n s.segments = [...replenishItems, ...originalSegments];\n\n // take care of bar in middle\n s.segments[lengthOfFirstItem-1].isLastBar = false;\n s.segments[lengthOfFirstItem-1].nextChunkId = s.segments[lengthOfFirstItem].chunkId;\n\n // take care of isLastBar\n s.segments[s.segments.length-1].isLastBar = true;\n s.segments[s.segments.length-1].nextChunkId = '';\n } catch (err){\n console.error(err);\n }\n break;\n }\n }\n }\n });\n\n if (currentSequences[0].segments.length < targetSegmentLength) {\n // debugger;\n replenishSegmentsInBarSequencesV2(currentSequences, targetSegmentLength, replenishWithSequences, iteration+1, appendTo);\n return;\n }\n}\n\n/**\n * Note this function only apply to Bar composed with seed/mix already aligned (that is with ratioWhenComposingBar resolved)\n */\nexport const alignBarCountsOfComposedSeedMix = (\n composedSeedBar: {\n sequences: IBarSequence[];\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n },\n composedMixBar: {\n sequences: IBarSequence[];\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n },\n composedMixBarForLoopingOnNormalMode: {\n sequences: IBarSequence[];\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n },\n alignMixTrackFrom: 'align-mix-segment-from-first-item' | 'align-mix-segment-from-last-item' = 'align-mix-segment-from-first-item',\n) => {\n if (!composedSeedBar) {\n throw Error (`seedBar is not valid`);\n }\n if (!composedMixBar) {\n throw Error (`mixBar is not valid`);\n }\n if (composedSeedBar.targetBarLength48000 !== composedMixBar.targetBarLength48000) {\n throw Error (`the two composedBars targetBarLength48000 are not the same. make sure they are aligned before using this function`);\n }\n const sequenceIdx = 0;\n\n const lengthOfSeedBars = composedSeedBar.sequences[sequenceIdx].segments.length;\n const lengthOfMixBars = composedMixBar.sequences[sequenceIdx].segments.length;\n\n if (alignMixTrackFrom === 'align-mix-segment-from-first-item') {\n if (lengthOfSeedBars < lengthOfMixBars) {\n // trim the MixBars\n removeLastFewSegementsInBarSequences(composedMixBar.sequences, lengthOfMixBars - lengthOfSeedBars);\n } else if (lengthOfSeedBars > lengthOfMixBars) {\n // replicate the MixBars\n // console.table({\n // lengthOfSeedBars,\n // lengthOfMixBars,\n // })\n /*\n [ 1 ][ 2 ][ ]//seed\n [ 1 + 2 ][ 3 + 4 ] //mix\n [ 1 + 2 ][ 3 + 4 ] \n */\n if (composedMixBar.ratioWhenComposingBar == 0.5 && composedMixBar.sequences[0].segments[lengthOfMixBars-1].halfBarOnlyOnSquash) {\n // remove last incompleted bar of composedMixBar\n removeLastFewSegementsInBarSequences(composedMixBar.sequences, 1);\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger; // suppose this won't happen?\n }\n // then dump it into replenish\n }\n replenishSegmentsInBarSequencesV2(composedMixBar.sequences, lengthOfSeedBars, composedMixBarForLoopingOnNormalMode.sequences, 1, 'place-repeat-segments-at-last');\n } else {\n // do nothing\n }\n } else if (alignMixTrackFrom === 'align-mix-segment-from-last-item') {\n \n if (lengthOfSeedBars < lengthOfMixBars) {\n // trim the MixBars\n removeFirstFewSegementsInBarSequences(composedMixBar.sequences, lengthOfMixBars - lengthOfSeedBars);\n } else if (lengthOfSeedBars > lengthOfMixBars) {\n // replicate the MixBars\n // console.table({\n // lengthOfSeedBars,\n // lengthOfMixBars,\n // })\n /*\n [ 1 ][ 2 ][ ]//seed\n [ 1 + 2 ][ 3 + 4 ] //mix\n [ 1 + 2 ][ 3 + 4 ] \n */\n \n if (composedMixBar.ratioWhenComposingBar == 0.5 && composedMixBar.sequences[0].segments[lengthOfMixBars-1].halfBarOnlyOnSquash) {\n // remove last incompleted bar of composedMixBar\n removeFirstFewSegementsInBarSequences(composedMixBar.sequences, 1);\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger; // suppose this won't happen?\n }\n // then dump it into replenish\n }\n console.log('case 2 , waiting to verify till getting a mix suitable');\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n replenishSegmentsInBarSequencesV2(composedMixBar.sequences, lengthOfSeedBars, composedMixBarForLoopingOnNormalMode.sequences, 1, 'place-repeat-segments-at-front');\n } else {\n // do nothing\n }\n }\n\n // console.table({\n // \"lengthOfSeedBars (Before)\": lengthOfSeedBars,\n // \"lengthOfMixBars (Before)\": lengthOfMixBars,\n // \"lengthOfSeedBars (After)\": composedSeedBar.sequences[0].segments.length,\n // \"lengthOfMixBars (After)\": composedMixBar.sequences[0].segments.length,\n \n // })\n}\n\n/**\n * Note this function only apply to Bar composed with seed/mix already aligned (that is with ratioWhenComposingBar resolved)\n */\n// this version match the length of the mix track\nexport const alignBarCountsOfComposedSeedMix_MakeSureMixTrackFullyCovered = (\n composedSeedBar: {\n sequences: IBarSequence[];\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n },\n composedMixBar: {\n sequences: IBarSequence[];\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n },\n composedSeedBarForLoopingOnNormalMode: {\n sequences: IBarSequence[];\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n },\n alignSeedTrackFrom: 'align-seed-segment-from-first-item' | 'align-seed-segment-from-last-item' = 'align-seed-segment-from-first-item',\n) => {\n if (!composedSeedBar) {\n throw Error (`seedBar is not valid`);\n }\n if (!composedMixBar) {\n throw Error (`mixBar is not valid`);\n }\n if (composedSeedBar.targetBarLength48000 !== composedMixBar.targetBarLength48000) {\n throw Error (`the two composedBars targetBarLength48000 are not the same. make sure they are aligned before using this function`);\n }\n \n // reverse version\n // cannot just reverse it due to 0.5 composerRatio thing\n // return alignBarCountsOfComposedSeedMix(composedMixBar, composedSeedBar, composedSeedBarForLoopingOnNormalMode, 'align-mix-segment-from-last-item'); // enforce from last item so the continue playback (next mix location won't be affected)\n\n const sequenceIdx = 0;\n\n const lengthOfSeedBars = composedSeedBar.sequences[sequenceIdx].segments.length;\n const lengthOfMixBars = composedMixBar.sequences[sequenceIdx].segments.length;\n\n if (alignSeedTrackFrom === 'align-seed-segment-from-first-item') {\n if (lengthOfSeedBars > lengthOfMixBars) {\n // trim the SeedBars\n removeLastFewSegementsInBarSequences(composedSeedBar.sequences, lengthOfSeedBars - lengthOfMixBars);\n } else if (lengthOfSeedBars < lengthOfMixBars) {\n // replicate the MixBars\n // console.table({\n // lengthOfSeedBars,\n // lengthOfMixBars,\n // })\n /*\n [ 1 ][ 2 ][ ]//seed\n [ 1 + 2 ][ 3 + 4 ] //mix\n [ 1 + 2 ][ 3 + 4 ] \n */\n \n // if (composedMixBar.ratioWhenComposingBar == 0.5 && composedMixBar.sequences[0].segments[lengthOfMixBars-1].halfBarOnlyOnSquash) {\n // // remove last incompleted bar of composedMixBar\n // removeLastFewSegementsInBarSequences(composedMixBar.sequences, 1);\n // // if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // // eslint-disable-next-line no-debugger\n // debugger; // suppose this won't happen?\n // // }\n // // then dump it into replenish\n // }\n consoleColorfulMessage4Lawful(`replenishSegmentsInBarSequencesV2 [seed version] (place-repeat-segments-at-last) `)\n replenishSegmentsInBarSequencesV2(composedSeedBar.sequences, lengthOfMixBars, composedSeedBarForLoopingOnNormalMode.sequences, 1, 'place-repeat-segments-at-last');\n } else {\n // do nothing\n }\n } else if (alignSeedTrackFrom === 'align-seed-segment-from-last-item') {\n \n if (lengthOfSeedBars > lengthOfMixBars) {\n // trim the MixBars\n removeFirstFewSegementsInBarSequences(composedSeedBar.sequences, lengthOfSeedBars - lengthOfMixBars);\n } else if (lengthOfSeedBars < lengthOfMixBars) {\n // replicate the MixBars\n // console.table({\n // lengthOfSeedBars,\n // lengthOfMixBars,\n // })\n /*\n [ 1 ][ 2 ][ ]//seed\n [ 1 + 2 ][ 3 + 4 ] //mix\n [ 1 + 2 ][ 3 + 4 ] \n */\n \n // if (composedMixBar.ratioWhenComposingBar == 0.5 && composedMixBar.sequences[0].segments[lengthOfMixBars-1].halfBarOnlyOnSquash) {\n // // remove last incompleted bar of composedMixBar\n // removeFirstFewSegementsInBarSequences(composedMixBar.sequences, 1);\n // if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // // eslint-disable-next-line no-debugger\n // debugger; // suppose this won't happen?\n // }\n // // then dump it into replenish\n // }\n // console.log('case 2 , waiting to verify till getting a mix suitable');\n // if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // // eslint-disable-next-line no-debugger\n // debugger;\n // }\n consoleColorfulMessage4Lawful(`replenishSegmentsInBarSequencesV2 [seed version] (place-repeat-segments-at-front) `)\n console.log(lengthOfSeedBars, lengthOfMixBars);\n // if (composedSeedBar.sequences[0].signature.includes(\"Trojan Horse_\")) {\n // console.log(composedSeedBar.sequences);\n // console.log(composedSeedBarForLoopingOnNormalMode.sequences);\n // }\n \n replenishSegmentsInBarSequencesV2(composedSeedBar.sequences, lengthOfMixBars, composedSeedBarForLoopingOnNormalMode.sequences, 1, 'place-repeat-segments-at-front');\n } else {\n // do nothing\n }\n }\n\n // console.table({\n // \"lengthOfSeedBars (Before)\": lengthOfSeedBars,\n // \"lengthOfMixBars (Before)\": lengthOfMixBars,\n // \"lengthOfSeedBars (After)\": composedSeedBar.sequences[0].segments.length,\n // \"lengthOfMixBars (After)\": composedMixBar.sequences[0].segments.length,\n \n // })\n}\n\n/**\n * This function resolve the speed of each bar at mixTrack while seed1 is playing as classic mode\n * a new parameter will be setup at IBarSequenceChunk which if it is a seedTrack's bar, eq to 1, and if it is mixTrack's bar eq to quantisation aligning seed\n */\nexport const alignSpeedOfMixToUnquantisedSeedOfComposedSeedMix = (seedBar: {sequences: IBarSequence[], ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix}, mixBar:{sequences: IBarSequence[], ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix}) => {\n seedBar.sequences.forEach((s, sequenceIdx)=>{\n s.segments.forEach((seedChunk, chunkIdx)=>{\n const mixChunk = mixBar.sequences[sequenceIdx].segments[chunkIdx];\n // pitch compensation with seed/mix matching (calculate again on every bar start)\n seedChunk.pitchCorrectionSemitones_SeedMixMatching = -12 * Math.log2(seedChunk.speedRatio_SeedMixMatching); // = 0\n\n // speed and pitch compensation with seed playing as unquantised\n seedChunk.speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised = 1; \n seedChunk.pitchCorrectionSemitones_SeedIsPlayingAsUnquantised = 0\n \n\n mixChunk.pitchCorrectionSemitones_SeedMixMatching= -12 * Math.log2(mixChunk.speedRatio_SeedMixMatching); // = 0\n {\n const seedLen = seedChunk.originalBar?.sampleLength;\n const mixLen = mixChunk.originalBar?.sampleLength;\n mixChunk.speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised =\n seedLen && mixLen ? mixLen / seedLen : 1;\n }\n mixChunk.pitchCorrectionSemitones_SeedIsPlayingAsUnquantised= -12 * Math.log2(mixChunk.speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised); // = 0\n });\n });\n}\n\n// planned work\nexport const alignSpeedOfSeedToUnquantisedMixOfComposedSeedMix = (seedBar: {sequences: IBarSequence[], ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix}, mixBar:{sequences: IBarSequence[], ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix}) => {\n seedBar.sequences.forEach((s, sequenceIdx)=>{\n s.segments.forEach((seedChunk, chunkIdx)=>{\n const mixChunk = mixBar.sequences[sequenceIdx].segments[chunkIdx];\n // pitch compensation with seed/mix matching (calculate again on every bar start)\n // seedChunk.pitchCorrectionSemitones_SeedMixMatching = -12 * Math.log2(seedChunk.speedRatio_SeedMixMatching); // = 0\n\n // speed and pitch compensation with seed playing as unquantised\n mixChunk.speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised = 1; \n mixChunk.pitchCorrectionSemitones_MixIsPlayingAsUnquantised = 0\n \n\n seedChunk.pitchCorrectionSemitones_SeedMixMatching= -12 * Math.log2(seedChunk.speedRatio_SeedMixMatching); // = 0\n {\n const mixLen = mixChunk.originalBar?.sampleLength;\n const seedLen = seedChunk.originalBar?.sampleLength;\n seedChunk.speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised =\n mixLen && seedLen ? seedLen / mixLen : 1;\n }\n seedChunk.pitchCorrectionSemitones_MixIsPlayingAsUnquantised= -12 * Math.log2(seedChunk.speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised); // = 0\n });\n }); \n}\n\n/**\n * NEW: Natural tempo mixing - seed track maintains natural tempo, mix track matches seed per bar\n * This function sets the main speedRatio_SeedMixMatching to implement natural tempo mixing\n * IMPORTANT: This runs AFTER bar squashing/dividing and alignment operations are complete\n */\n/*\nexport const alignMixToNaturalSeedTempo = (seedBar: {sequences: IBarSequence[], ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix}, mixBar:{sequences: IBarSequence[], ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix}) => {\n seedBar.sequences.forEach((seedSequence, sequenceIdx)=>{\n const mixSequence = mixBar.sequences[sequenceIdx];\n \n seedSequence.segments.forEach((seedChunk, chunkIdx)=>{\n const mixChunk = mixSequence.segments[chunkIdx];\n \n if (seedChunk && mixChunk) {\n // SEED: Always natural tempo (no quantization)\n seedChunk.speedRatio_SeedMixMatching = 1;\n \n // SEED: Recalculate pitch correction (will be 0 since speedRatio = 1)\n if (USE_BAR_WISE_PITCH_CORRECTION_EXPORTED) {\n seedChunk.pitchCorrectionSemitones = -12 * Math.log2(seedChunk.speedRatio_SeedMixMatching); // = 0\n }\n \n // MIX: Match corresponding seed bar accounting for ratio operations\n const seedBarLength = seedChunk.originalBar?.sampleLength || 1;\n const mixBarLength = mixChunk.originalBar?.sampleLength || 1;\n // const ratioWhenComposingBar = mixBar.ratioWhenComposingBar || 1;\n \n // Natural tempo calculation: Direct bar-to-bar matching\n // After squashing/dividing, we have aligned bar counts, so direct matching works\n mixChunk.speedRatio_SeedMixMatching = mixBarLength / seedBarLength;\n \n // MIX: Recalculate pitch correction for mix track with new speed ratio\n if (USE_BAR_WISE_PITCH_CORRECTION_EXPORTED) {\n const pitchCorrection = -12 * Math.log2(mixChunk.speedRatio_SeedMixMatching);\n mixChunk.pitchCorrectionSemitones = Math.max(-12, Math.min(12, pitchCorrection));\n }\n }\n });\n });\n}\n*/\n\nexport const applyNewSpeedFactorToQuantisedSegments = (\n bar1: BarSequence,\n bar2: BarSequence,\n newSpeedFactor: number,\n) => {\n if (!bar1.sequences || !bar2.sequences) {\n return;\n }\n for(let i=0; i<4; i++) {\n // Suppose to be Mix, but should make this generic\n bar1.sequences[i].segments.forEach((segment: IBarSequenceChunk)=>{\n const speedRatio_SeedMixMatching: number = newSpeedFactor * segment.speedRatio_SeedMixMatching;\n segment.speedRatio_SeedMixMatching = speedRatio_SeedMixMatching;\n });\n\n // Suppose to be Seed, but should make this generic\n bar2.sequences[i].segments.forEach((segment: IBarSequenceChunk)=>{\n const speedRatio_SeedMixMatching: number = newSpeedFactor * segment.speedRatio_SeedMixMatching;\n segment.speedRatio_SeedMixMatching = speedRatio_SeedMixMatching;\n });\n }\n \n}","import { AEV3Controller } from \"../global-aev3-controller\";\nimport { AudioSourceSequence, GET_AUDIO_BUFFER_MESSAGE_AUDIO_SOURCE_NOT_INIT, GET_AUDIO_BUFFER_MESSAGE_EXCEPTIONAL_ERROR, GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR, GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET } from \"./mp4-sequence\";\nimport { getUnknownThrownCauseString, unknownThrownToString } from '@/utils/unknown-caught-error';\n\nexport const getAudioBufferUtil = async (\n trackId: string, \n sequenceIdx: number,\n sampleStart: number,\n sampleEnd: number,\n decodingQueueIndex: number,\n signature: string,\n isRetryDueToETagIssue: boolean,\n): Promise<{\n audioBuffer: AudioBuffer | null,\n totalTimeElapsed: number,\n error: string | undefined,\n glueFramesTime: number,\n decodeTime: number,\n decodeQueueId: number,\n finishedDecodedAt: number,\n signature: string,\n message: string,\n}> => {\n const audioSourceSequence = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(trackId);\n\n if (!audioSourceSequence) {\n return {audioBuffer: null, totalTimeElapsed: -1, error: 'HLS sequence is not accessible at getAudioBuffer helper function.', glueFramesTime: -1, decodeTime: -1, decodeQueueId: -1, finishedDecodedAt: -1, signature, message: GET_AUDIO_BUFFER_MESSAGE_AUDIO_SOURCE_NOT_INIT};\n }\n \n try {\n const result = await audioSourceSequence.getAudioBuffer(sequenceIdx, sampleStart, sampleEnd, decodingQueueIndex, signature);\n\n const [audioBuffer, totalTimeElapsed, glueFramesTime, decodeTime, decodeQueueId, finishedDecodedAt, resultSignature, message] = result;\n return {audioBuffer,\n totalTimeElapsed,\n error: audioBuffer === null ? GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET : undefined,\n glueFramesTime,\n decodeTime,\n decodeQueueId,\n finishedDecodedAt,\n signature: resultSignature,\n message};\n \n // chunk.decoded.audioBuffer = audioBuffer;\n // chunk.decoded.isDecoding = false;\n // chunk.decoded.decodeTimeMS = timeElapsed;\n\n // const transferableBuffer = audioBufferToTransferable(audioBuffer);\n // managerWorker.postMessage({\n // type: 'addBuffer',\n // data: { sequenceId, segmentIndex: index, buffer: transferableBuffer, timeElapsed }\n // }, [transferableBuffer.channelData] ); // Transfer ArrayBuffers\n\n // dispatchEventOnUtils(BarSequence.BAR_DECODED, {\n // sequenceIdx: sequenceIdx,\n // sequenceId,\n // chunkIdx: index,\n // chunkId: chunk.chunkId,\n // trackIndex: trackIndex,\n // });\n } catch(err){\n const errStr = unknownThrownToString(err);\n\n if (errStr.includes('getSegmentInfo:: sequence is not initialised yet.')) {\n // getSegmentInfo:: sequence is not initialised yet.\n console.log('getSegmentInfo:: sequence is not initialised yet, it is now hosted in AudioSourceSequenceInPreloadedQueued.');\n return {audioBuffer: null, totalTimeElapsed: -1, error: errStr, glueFramesTime: -1, decodeTime: -1, decodeQueueId: -1, finishedDecodedAt: -1, signature, message: GET_AUDIO_BUFFER_MESSAGE_AUDIO_SOURCE_NOT_INIT};\n } else if (errStr.includes(AudioSourceSequence.SAMPLE_RANGE_REQUESTED_NOT_EXISTED)) {\n throw err;\n } else if (errStr.includes('empty sampleLength')) {\n throw err;\n } else if (errStr.includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n // console.log('getaudiobuffer:')\n\n \n if (isRetryDueToETagIssue === false) {\n // only works if tail is older than segment\n const t = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(trackId);\n if (t) {\n const index = AEV3Controller.getInstance().preloadedAudioSource.findIndex((s)=>(s===t));\n // make sure it detached from the array before carry on, because BarSequences might accessing those stuff via preloadedAudioSource() in some iterations, and if the MP4 is destoryed before that, all those function fails\n // make sure Bar Sequence created are destroyed\n const trackData = AEV3Controller.getInstance().preloadedAudioSource[index].trackData;\n if (AEV3Controller.getInstance().preloadedAudioSource[index].getIsInitialised()!=='NOT_YET') { // keep it if it is initialsing\n AEV3Controller.getInstance().preloadedAudioSource.splice(index, 1);\n console.log(`ffs destroy ${trackId} ${t.eTagOfTailSegment}`);\n t?.destroy();\n // recreate only if isRetryDueToETagIssue is false (only try once)\n const u = await AEV3Controller.getInstance().createAudioSourceSequenceWithPreloadSampleLoc(trackData, false, 0, false, '', true);\n console.log(`ffs recreated ${trackId} ${(u as AudioSourceSequence)?.eTagOfTailSegment}`);\n }\n // retry on getAudioBufferUtil\n return getAudioBufferUtil(\n trackId,\n sequenceIdx,\n sampleStart,\n sampleEnd,\n decodingQueueIndex,\n signature,\n true, \n );\n }\n }\n return {audioBuffer: null, totalTimeElapsed: -1, error: GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR, glueFramesTime: -1, decodeTime: -1, decodeQueueId: -1, finishedDecodedAt: -1, signature, message: getUnknownThrownCauseString(err)};\n } else {\n // todo: find out is it about steps triggering decoding not correct?\n console.error('\\n\\n\\n\\n\\\\n\\n\\n\\n\\n***** \\nDECODINGERROR:', err);\n return {audioBuffer: null, totalTimeElapsed: -1, error: errStr, glueFramesTime: -1, decodeTime: -1, decodeQueueId: -1, finishedDecodedAt: -1, signature, message: GET_AUDIO_BUFFER_MESSAGE_EXCEPTIONAL_ERROR};\n }\n // chunk.decoded.audioBuffer = undefined;\n } finally {\n // if (chunk){\n // chunk.decoded.isDecoding = false;\n // } else {\n // console.log('the callback of getAudioBuffer failed might because of HLS is destroyed.');\n // }\n // // console.timeLog(sessionId);\n // resolve(true);\n // return [null, null];\n };\n}","import { AEV3Controller } from \"@/stem-audio-engine-v3/global-aev3-controller\";\nimport useTransitionInfoStore from \"@/stem-audio-engine-v3/store/use-transitional-info-store\";\n\nconst ENABLE_CONSOLE_SWAP_CHANNEL = false;\n\nexport const _tempSwapTheAudioPipelineForMasterBar = (uuidCurrent: string) => {\n \n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log(`%c[SWAPPING] current isSwappingSeedMix ${AEV3Controller.getInstance().isSwappingSeedMix}, ${uuidCurrent}`);\n \n if (AEV3Controller.getInstance().isSwappingSeedMix.indexOf(uuidCurrent)>-1) {\n // this is triggered by second time\n // reset the signature or next swapping will be failed since seed1's signature will be init\n AEV3Controller.getInstance().isSwappingSeedMix = ''\n // quit the command since it should trigger only once or it become a mirror command\n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log(`%c[SWAPPING] quit swapping command: ${uuidCurrent}`);\n return;\n }\n\n const signature = 'command from swapping audio pipeline.';\n\n AEV3Controller.getInstance().setIsBusy(true, signature);\n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log(`[SWAPPING] _tempSwapTheAudioPipelineForMasterBar, swapping the index, ${Date.now(), AEV3Controller.getInstance().isSwappingSeedMix}`);\n\n const seedBarForSwapSig = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBarForSwapSig = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n if (!seedBarForSwapSig || !mixBarForSwapSig) {\n AEV3Controller.getInstance().setIsBusy(false, signature);\n return;\n }\n\n // remember the mix undergoing swapping\n AEV3Controller.getInstance().isSwappingSeedMix = seedBarForSwapSig.uuid + '_' + mixBarForSwapSig.uuid;\n \n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log(`[SWAPPING] _tempSwapTheAudioPipelineForMasterBar, swapping the index (2), ${Date.now(), AEV3Controller.getInstance().isSwappingSeedMix}`);\n\n // See how many I am missing...\n\n // swap trackIndex of master Bar\n const currentSeedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const currentMixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n if (!currentSeedBar || !currentMixBar) {\n AEV3Controller.getInstance().setIsBusy(false, signature);\n return;\n }\n \n // inform the buffer-player-processor not to fire event asking for next buffer\n\n // currentSeedBar.suspendBufferPlayerProcessor();\n // currentMixBar.suspendBufferPlayerProcessor();\n\n const currentSeedBarTrackIndex = currentSeedBar.trackIndex; //= AEV3Controller.getInstance().getBarSequenceIdWithType('seed1');\n const currentMixBarTrackIndex = currentMixBar.trackIndex ;// AEV3Controller.getInstance().getBarSequenceIdWithType('mix1');\n currentSeedBar.updateTrackindex(currentMixBarTrackIndex);\n currentMixBar.updateTrackindex(currentSeedBarTrackIndex);\n\n\n AEV3Controller.getInstance().barSequence1 = currentMixBar;\n AEV3Controller.getInstance().barSequence2 = currentSeedBar;\n\n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log('[SWAPPING] new mix:', currentSeedBar.trackData?.name);\n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log('[SWAPPING] new mix from method', AEV3Controller.getInstance().getBarSequenceWithType('mix1')?.trackData?.name);\n\n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log('[SWAPPING] new seed:', currentMixBar.trackData?.name);\n if (ENABLE_CONSOLE_SWAP_CHANNEL) console.log('[SWAPPING] new seed from method', AEV3Controller.getInstance().getBarSequenceWithType('seed1')?.trackData?.name);\n\n // debugger;\n\n let tmp1, tmp2;\n \n tmp1 = AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack1;\n tmp2 = AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack2;\n AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack1 = tmp2;\n AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack2 = tmp1;\n\n tmp1 = AEV3Controller.getInstance().aev3Context.stemAnalyserNodesTrack1;\n tmp2 = AEV3Controller.getInstance().aev3Context.stemAnalyserNodesTrack2;\n AEV3Controller.getInstance().aev3Context.stemAnalyserNodesTrack1 = tmp2;\n AEV3Controller.getInstance().aev3Context.stemAnalyserNodesTrack2 = tmp1;\n\n tmp1 = AEV3Controller.getInstance().aev3Context.stemGainNodesTrack1;\n tmp2 = AEV3Controller.getInstance().aev3Context.stemGainNodesTrack2;\n AEV3Controller.getInstance().aev3Context.stemGainNodesTrack1 = tmp2;\n AEV3Controller.getInstance().aev3Context.stemGainNodesTrack2 = tmp1;\n\n tmp1 = AEV3Controller.getInstance().aev3Context.trackGainNodes[0];\n tmp2 = AEV3Controller.getInstance().aev3Context.trackGainNodes[1];\n const gainValue1 = tmp1.gain.value;\n const gainValue2 = tmp2.gain.value;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[0] = tmp2;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[1] = tmp1;\n // keep the original gainNodes value the same between swapping\n AEV3Controller.getInstance().aev3Context.trackGainNodes[0].gain.value = gainValue1;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[1].gain.value = gainValue2;\n\n tmp1 = AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[0];\n tmp2 = AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[1];\n AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[0] = tmp2;\n AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[1] = tmp1;\n\n \n // all invert the stem-selection store.\n AEV3Controller.getInstance().invertStemSelectionBasedOnSeedForChannelSwapping(0, null, signature);\n AEV3Controller.getInstance().setIsBusy(false, signature);\n // AEV3Controller.getInstance().isSwappingSeedMix = false;\n // AEV3Controller.getInstance().setBarWithType(currentMixBar, 'seed1', currentSeedBarTrackIndex);\n // AEV3Controller.getInstance().setBarWithType(currentSeedBar, 'mix1', currentMixBarTrackIndex);\n\n // AEV3Controller.getInstance().dispatchEvent(AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED, {trackType: 'seed1'});\n // AEV3Controller.getInstance().dispatchEvent(AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED, {trackType: 'mix1'});\n\n // currentSeedBar.resumeBufferPlayerProcessor();\n // currentMixBar.resumeBufferPlayerProcessor();\n}","// import { fetchGroup } from \"../utils/cache\";\n\n// import { clearInterval, clearTimeout, setInterval, setTimeout } from 'worker-timers';\nimport { AudioSourceSequence, GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR, GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET, MOOF_BATCH_SIZE } from '../cache/mp4-sequence';\nimport { EventEmitter } from '../event-emitter';\nimport { IMusicKey, IMusicTonality, ITrackForSequence, TStemType } from '../interface';\n\nimport { backEndPitchShift4Worklet, sendPitchShiftToWorkletWithTrackLabel, getPitchShiftForMixTrack, sendInitPitchShiftCommandToWorklet } from '../utils/audio';\nimport { AEV3Context, AVOID_RUBBERBAND_WORKLET_AT_MIX1, AVOID_RUBBERBAND_WORKLET_AT_SEED, SILENT_BUFFER_SAMPLE_SIZE } from '@/stem-audio-engine-v3/audio-context';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {\n composeBarsFromBeats,\n endIndexOfThisSegmentBeforeTransitionEnds,\n endIndexOfThisSegmentBeforeTransitionStarts,\n endIndexOfThisSegmentCover1Transtion,\n lastIndexOfThisSegmentBeforeTransitionZone,\n lastIndexOfThisSegmentIncludeTransition,\n searchSegmentIdxBackwards,\n startIndexOfThisSegment,\n startIndexOfThisSegmentCover1Transtion,\n type IBarMapping,\n} from '../utils/bars';\nimport { composeBarSequenceVariableBarLength, RatioOfBarsAllowedBetweenSeedAndMix } from './parser';\nimport { AEV3Controller, FADE_OUT_DURATION_ON_PAUSE, PLAY_MODE_CLASSIC, TrackIndexType } from '../global-aev3-controller';\nimport { getAudioBufferUtil } from '../cache/get-audio-buffer';\nimport { BarChunkDetails, IBarSequence, IBarSequenceChunk, StemSwitchingScheduler } from './types-interfaces';\nimport { PitchShiftStrategy } from '../utils/seed-mix-utils';\nimport { v4 as uuid } from 'uuid';\nimport { ENABLE_CAMUS_ALERT_PREVENT_SEND_BUFFERS_REPEATEDLY, ENABLE_CAMUS_DECODE_AND_POST_MESSAGE_TO_PORT, ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR } from '@/services/engine_dev_flags';\nimport { IBarSequenceProgress, PlayedChunk } from './bar-seqeunce/interface-typescript';\nimport { _tempSwapTheAudioPipelineForMasterBar } from './bar-seqeunce/bar-sequence-swap-channel';\nimport { COMPENSATE_PITCH_SHIFT_PER_BAR } from '../playmode-matrix';\nimport { consoleColorfulMessage } from '../utils/colorConsole';\nimport { formatUnknownCaughtForLog } from '@/utils/unknown-caught-error';\n\n// import { calculateMemoryForAudioBuffers } from \"../utils/memory\";\n// import { composeM3U8Sequences, ByteSampleSegment } from \"../utils/hls\";\n\n//const BAR_CHUNK_TEST_LENGTH = 1000;\nconst ENABLE_CONSOLE_OF_MESSAGE_FROM_BUFFER_PLAYER = false;\nconst ENABLE_CONSOLE_ON_ASKING_FOR_EXHAUSTED_QUEUE = false;\n\nconst ENABLE_CONSOLE_OF_SENDING_MESSAGE_TO_BUFFER_PlAYER = false;\n\n/** Narrowing cast: bar utils assume non-null originalBar on each segment. */\ntype SegmentsWithOriginalBar = Parameters<typeof startIndexOfThisSegment>[0];\ntype SegmentsForSearchSegmentIdxBackwards = Parameters<typeof searchSegmentIdxBackwards>[0];\nconst ENABLE_CONSOLE_ON_NATURAL_TEMPO = false;\n// const ENABLE_CONSOLE_OF_BAR_WISE_PITCH_CORRECTION = false;\n\n// const TMP_PITCH = [1, 1];\n\n// end bar is excluded\n\nexport class BarSequence extends EventEmitter {\n // Commands\n static BAR_SEQUENCES_CREATED = 'Bar-Stems-Sequences-Created (solely based on tempoOrigSz)';\n static BAR_DECODE_COMMAND_FINISHED = 'Bar-stems-bar-decode-command-finished (it only decode all available ?)';\n\n // Progress\n static BAR_DECODED = 'Bar-Stems-Bar-decoded'; // sub-procedure of BAR_DECODE_COMMAND_FINISHED\n static BAR_UNLOADED_ON_ALL_SEQUENCES = 'Bar-Stems-Bar-unloaded-on-all-seq';\n\n // Playback Related\n static CURRENT_BAR_CHUNK_UPDATED_AND_TO_START = 'Current-Bar-Chunk-updated-and-starting';\n static CURRENT_BAR_ALMOST_PLAYED_TILL_THE_END = 'Current-Bar-Chunk-almost-end (10 samples left)';\n static BAR_STARTS_PLAYING = 'Bar-Chunk-starts-playing';\n static BAR_PLAYED = 'Bar-Chunk-played';\n static BAR_PARTIALLY_PLAYED_ZERO_POINT_25 = 'Bar-Chunk-partially-played(0.25';\n static BAR_PARTIALLY_PLAYED_ZERO_POINT_5 = 'Bar-Chunk-partially-played(0.5)';\n static BAR_PARTIALLY_PLAYED_ZERO_POINT_75 = 'Bar-Chunk-partially-played(0.75)';\n static BAR_PROGRESS = 'Bar-Chunk-played-progress';\n static NEXT_BAR_AUDIO_DATA_NOT_READY_DURING_PLAYBACK = 'One-of-the-next-bar-chunk-is-not-ready-when-needed';\n static LAST_BAR_ALMOST_FINISHED_PLAYING = 'Current-Bar-is-lastBar-and-almost-finished-playing';\n static FIRST_BAR_OF_MASTER_BAR_EDIT_STARTS_PLAYING = 'Master-Bar-Segment-First-Bar-Starts-Playing';\n static LAST_BAR_OF_MASTER_BAR_EDIT_FINISHED_PLAYING = 'Master-Bar-Segment-Last-Bar-Finished-Playing';\n static FATAL_PLAYBACK_ERROR_MP4_AND_STOP_DECODING_ITERATION = 'Playback-Fatal-Error-Corrupted-Audio-File';\n\n // Errors that need to stop playback\n static PLAYBACK_ERROR_FROM_BAR_SEQUENCE_INVALID_SAMPLE_RANGE = 'PlaybackErrorFromBar: invalid sample range requested from beat grids (bar composition)';\n\n // Streaming Control\n // static BAR_SEQUENCE_CHANGED_ACCORDING_TO_ACTUAL_TIME = 'bar-sequence-context-changed(from actualDuation)';\n\n // properties\n isDecoding: boolean;\n managerWorker!: Worker;\n triggeredPlay!: boolean;\n\n // change to private later\n sequences!: IBarSequence[] | null;\n globalPlaybackRate: number;\n aev3Context!: AEV3Context | null;\n\n uuid!: string;\n\n trackIndex: TrackIndexType;\n // private startBar: number;\n private suspendedChunkIdx!: number;\n bufferPlayerNodes!: AudioWorkletNode[] | null;\n pitchShiftNode!: AudioWorkletNode | null;\n\n // only if buffer really playing\n sourcePlaying!: { [sequenceIdx: number]: PlayedChunk };\n\n sourceJustPlayed!: {\n [sequenceIdx: number]: {\n chunkIdx: number;\n chunkId: string;\n sequenceIdx: number;\n sequenceId: string;\n contextTime: number;\n };\n };\n\n samplePlayed!: number;\n\n // sent doesn't mean it starts play\n sourceSentToBufferWorklet!: {\n [sequenceIdx: number]: {\n chunkIdx: number;\n chunkId: string;\n sequenceIdx: number;\n sequenceId: string;\n barSequenceUUID: string; // this is the BarSequence Instance's UUID\n };\n };\n\n // cleaningBuffers: boolean;\n\n private playQuantisedSpeedOnBars: 'quantised' | 'seed' | 'mix';\n\n trackData!: ITrackForSequence;\n isTransitionTrack!: boolean;\n internalFingerprint!: string;\n\n // these should be from seedTrack\n targetKey!: IMusicKey;\n targetBarLength48000!: number;\n targetTonality!: IMusicTonality;\n\n // drawback of 2: losting odd index's end of bar\n // drawback of 0.5: what if the original tempoOrigSz is odd number and round it up to even number\n ratioWhenComposingBar!: RatioOfBarsAllowedBetweenSeedAndMix;\n\n // now this is value composed at client-side, and it is a value for pitch compensation (eq semitones changed)\n pitchShift!: number;\n\n // Sub-bar pitch interpolation: speed ratios at current and next bar.\n // At each 1/8th progress event, pitch = 1/lerp(speedFrom, speedTo, t).\n // Speed itself jumps instantly at bar boundary (the 74ms pitch delay\n // in Rubberband compensates for the async pitch update).\n private _speedFrom: number = 1;\n private _speedTo: number = 1;\n private _interpActive: boolean = false;\n\n // signature of what start/end barIndex used\n barIndexStart!: number;\n barIndexEnd!: number;\n\n private interval_decoding: ReturnType<typeof setInterval> | undefined;\n /** When false, decodingInternal is a no-op β covers direct worklet calls after stopDecoding clears the interval. */\n private decodingSchedulerActive = false;\n private interval_evicting: ReturnType<typeof setInterval> | undefined;\n private cancelledDecodeChunks: Set<number> = new Set(); // Track cancelled decode operations\n\n constructor(globalPlaybackRate: number) {\n super();\n this.isDecoding = false;\n this.playQuantisedSpeedOnBars = 'quantised'; // when turned off on both Seed/Mix, it is equivalent to applying former alignMixToNaturalSeedTempo\n // this.managerWorker = new Worker('/workers/buffer-manager-processor.js');\n this.globalPlaybackRate = globalPlaybackRate;\n this.cancelledDecodeChunks = new Set();\n }\n\n // Method to cancel all decode operations (called when one fails in Promise.all)\n cancelAllDecodeOperations(): void {\n // Clear and mark all chunks as cancelled - this will stop all active decode operations\n // We use a special marker (-1) to indicate \"cancel all\"\n this.cancelledDecodeChunks.clear();\n this.cancelledDecodeChunks.add(-1); // -1 means cancel all\n }\n\n // Method to cancel specific chunk decode\n cancelDecodeOperation(chunkIdx: number): void {\n this.cancelledDecodeChunks.add(chunkIdx);\n }\n\n // Check if a decode operation is cancelled\n isDecodeOperationCancelled(chunkIdx: number): boolean {\n // Check if all operations are cancelled or this specific chunk is cancelled\n return this.cancelledDecodeChunks.has(-1) || this.cancelledDecodeChunks.has(chunkIdx);\n }\n\n // Clear cancellation flags (call when starting new decode batch)\n clearDecodeCancellations(): void {\n this.cancelledDecodeChunks.clear();\n }\n\n _log(...msg: unknown[]) {\n return;\n console.log(...msg);\n }\n\n _log_table(...msg: unknown[]) {\n return;\n console.table(...msg);\n }\n\n /**\n *\n * @param cleanUpWorkletCallback should be false if the bar sequence created is only for compilation of master bar of bars won't play\n */\n destroy(cleanUpWorkletCallback = true) {\n console.log(`destroying Bar ${this.trackData.trackId} ${cleanUpWorkletCallback ? 'cleanUpWorkletCallback' : ''}`);\n this.clearEventEmitter();\n if (this.triggeredPlay) {\n this.cleanBuffersInBufferPlayerProcessor();\n this.triggeredPlay = false;\n }\n if (cleanUpWorkletCallback) {\n this.cleanUpCallbackOfBufferWorklet();\n }\n this.stopDecoding('from destroy of bar');\n this.stopEvicting('from destroy of bar');\n // destroy after stop decoding\n // this.AudioSourceSequence.destroy();\n // this.AudioSourceSequence = null;\n this.sequences?.forEach((s) => {\n s.segments?.forEach((c) => {\n c.parent = null as unknown as IBarSequence;\n c.decoded = null;\n c.originalBar = null;\n });\n s.segments.length = 0; // Clear the array\n });\n this.triggeredPlay = false;\n this.sequences = null;\n this.sourcePlaying = {};\n this.sourceJustPlayed = {};\n // this.cleaningBuffers = false;\n this.sourceSentToBufferWorklet = {};\n this.aev3Context = null;\n this.bufferPlayerNodes = null;\n this.pitchShiftNode = null;\n // performance.clearResourceTimings();\n }\n\n destroyOnObsoleteRefreshMix() {\n const cleanUpWorkletCallback = false;\n\n this.clearEventEmitter();\n if (this.triggeredPlay) {\n // this.cleanBuffersInBufferPlayerProcessor();\n this.triggeredPlay = false;\n }\n if (cleanUpWorkletCallback) {\n this.cleanUpCallbackOfBufferWorklet();\n }\n this.stopDecoding('from destroy of bar');\n this.stopEvicting('from destroy of bar');\n // destroy after stop decoding\n // this.AudioSourceSequence.destroy();\n // this.AudioSourceSequence = null;\n this.sequences?.forEach((s) => {\n s.segments?.forEach((c) => {\n c.parent = null as unknown as IBarSequence;\n c.decoded = null;\n c.originalBar = null;\n });\n s.segments.length = 0; // Clear the array\n });\n this.triggeredPlay = false;\n this.sequences = null;\n this.sourcePlaying = {};\n this.sourceJustPlayed = {};\n // this.cleaningBuffers = false;\n this.sourceSentToBufferWorklet = {};\n this.aev3Context = null;\n this.bufferPlayerNodes = null;\n this.pitchShiftNode = null;\n // performance.clearResourceTimings();\n }\n\n // suppose each buffer-player-processor can link to one BarSequence only\n // hence this process nuke all the callback from it\n // so whenever calling destroy() make sure this flag is feed correctly\n cleanUpCallbackOfBufferWorklet() {\n let bufferNodes: AudioWorkletNode[];\n try {\n bufferNodes = this.getBufferPlayerNodes();\n if (!bufferNodes.length) {\n return;\n }\n for (let i = 0; i < 4; i++) {\n const bufferPlayerNode = bufferNodes[i];\n bufferPlayerNode.port.onmessage = null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n // no task to do\n }\n }\n\n createSequence(\n trackData: ITrackForSequence,\n trackIndex: TrackIndexType,\n startBar: number,\n endBar: number,\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n targetKey: IMusicKey,\n targetTonality: IMusicTonality,\n expectedPitchShiftForDebugPurpose: number,\n preserveMixKey: PitchShiftStrategy,\n playQuantisedSpeedOnBarsByDefault: 'quantised' | 'seed' | 'mix',\n ) {\n this.internalFingerprint = Math.random().toFixed(4);\n this.sequences = [];\n const pitchShift = getPitchShiftForMixTrack(\n // target is the seed track\n targetKey,\n targetTonality,\n targetBarLength48000,\n // oneself is the mix\n trackData.key,\n trackData.tonality,\n trackData.tempoOrigSz / ratioWhenComposingBar,\n expectedPitchShiftForDebugPurpose,\n preserveMixKey, // has to be KEY_PRESERVE for transitional track\n );\n\n if (trackData.trackMixType === 'mix') {\n // const newval = (pitchShift / ratioWhenComposingBar) + 1;\n // const newval = -4.2;\n // this._log_table({\n // id: 'hardcode mix pitch shift change',\n // old: pitchShift,\n // // new: newval,\n // })\n // pitchShift=newval;\n // this._log(ratioWhenComposingBar);\n // debugger;\n }\n\n let duration = trackData.duration; // trackData.duration might not be equal to actual duration of m3u8\n const maxSampleLength48000 = Math.ceil(duration * 48000);\n this.trackIndex = trackIndex;\n // this.startBar = startBar;\n this.trackData = trackData;\n this.barIndexStart = startBar;\n this.barIndexEnd = endBar;\n this.targetBarLength48000 = targetBarLength48000;\n this.targetKey = targetKey;\n this.targetTonality = targetTonality;\n this.pitchShift = pitchShift;\n this.ratioWhenComposingBar = ratioWhenComposingBar;\n this.playQuantisedSpeedOnBars = playQuantisedSpeedOnBarsByDefault;\n\n this.uuid = uuid();\n\n // make sure the stems sequence used is correct\n const stemPosition = ['drums', 'bass', 'vocals', 'other'];\n const stems = stemPosition.map((position) => {\n return { stemId: `${trackData.trackId}_${position}` as TStemType, stemPosition: position, aac: trackData.url, wav: '', hls: '', mp3: '' };\n });\n\n // const barMapping = composeBarsFromBeats(trackData.beats);\n\n // !! PROBLEM - BarMapping is used to compose bars, while startBar and endBar decided earlier?\n\n // Suppose the beats received already have smoothing applied, the following procedure can cause misalign on the startBeatIndex and endBeatIndex if the length changed:\n\n // const barMapping = composeBarsFromBeatsSmoothedVersion(trackData.beats, 48000, 2500);\n const barMapping = composeBarsFromBeats(trackData.beats);\n\n duration = barMapping.reduce((previousValue: number, currentValue, currentIndex, arr) => {\n if (currentIndex === 0 || currentIndex === arr.length - 1) {\n return previousValue;\n } else {\n return previousValue + currentValue.duration;\n }\n }, 0);\n\n this.sequences = stems.map((s, sequenceIdx) =>\n composeBarSequenceVariableBarLength(\n s,\n sequenceIdx,\n `${sequenceIdx.toString()}_${s.stemPosition}` as TStemType,\n trackData.name,\n startBar,\n endBar,\n maxSampleLength48000,\n barMapping,\n targetBarLength48000,\n ratioWhenComposingBar,\n trackData.trackId,\n trackData.trackMixType === 'seed' ? 'seed' : 'mix', // Pass track type for potential future use\n [] as IBarMapping[], // seedBarMapping48000 - not needed with alignment approach\n this.playQuantisedSpeedOnBars,\n trackData.beatSource,\n ),\n );\n\n const dispatchEventOnUtils = this.dispatchEvent.bind(this);\n dispatchEventOnUtils(BarSequence.BAR_SEQUENCES_CREATED, {\n trackIndex,\n });\n\n // this.decodeAllSequencesWithBarIndex(0, BAR_CHUNK_TEST_LENGTH, Math.random().toFixed(9));\n // this._log(`[BarSequence::createSequence]`, trackData, actualDurationDepreciated);\n // this._log(this.sequences);\n }\n\n getActualDurationBasedOnLastBarRegardlessOfSpeedRatio(): { isActual: boolean; duration: number } {\n if (!this.sequences?.length) return { isActual: false, duration: 0 };\n if (this.sequences?.[0]?.segments) {\n const length = this.sequences?.[0]?.segments.length;\n const lastItem = this.sequences?.[0]?.segments[length - 1];\n const ob = lastItem?.originalBar;\n if (!ob) return { isActual: false, duration: 0 };\n return { isActual: true, duration: ob.endTime };\n }\n return { isActual: false, duration: 0 };\n }\n\n // this is expensive\n // if a segment is already decoded and audioBuffer exists, it will be skipped the expensive function\n //\n // the promise returned will be an error flag, which could be due to MOOF not yet downloaded\n // not all segment decoded yet\n // or something else\n private async decodeSequencesWithIndex(index: number): Promise<boolean> {\n // consoleColorfulMessage(`decodeSequencesWithIndex ${this.trackData.trackId} ${this.uuid} ${index}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n // this._log(this.sequences);\n // const startTime: number = Date.now();\n // this.decodeAllSequencesWithBarIndex(0, BAR_CHUNK_TEST_LENGTH, Math.random().toFixed(9));\n // this._log(AudioSourceSequence);\n // this._log(this.sequences);\n // const firstChunk = this.sequences.filter((s)=>s.stemType==='drums')[0].segments[0];\n // AudioSourceSequence.getAudioBuffer('drums', firstChunk.originalBar.sampleStart, firstChunk.originalBar.sampleEnd)\n // .then((e)=>{\n // this._log(e);\n // })\n\n if (this.isAllFourSequencesSegmentReady(index)) {\n return new Promise((resolve) => {\n const hasError = false;\n // consoleColorfulMessage(`decodeSequencesWithIndex - all four segment ready, return hasError = false`);\n resolve(hasError);\n });\n }\n\n const trackIndex = this.trackIndex;\n\n return new Promise((resolve, reject) => {\n const dispatchEventOnUtils = this.dispatchEvent.bind(this);\n\n // Track completion of all sequences\n let completedCount = 0;\n if (!this.sequences?.length) {\n throw `sequence is deleted already, ${this.trackData?.trackId || 'no trackData found'}`;\n }\n const totalSequences = this.sequences?.length;\n let hasError = false;\n\n const checkAllCompleted = () => {\n completedCount++;\n if (completedCount === totalSequences) {\n // consoleColorfulMessage(`decodeSequencesWithIndex - checkAllCompleted, return hasError = ${hasError}`);\n resolve(hasError);\n }\n };\n\n // compose the group to be preloaded as a pair\n // const group: ByteSampleSegment[] = [];\n // const AudioSourceSequence: AudioSourceSequence = this.getAudioSourceSequence();\n // const sequences = this.sequences.filter((v)=>v.)\n this.sequences.forEach((sequence: IBarSequence, sequenceIdx: number) => {\n const chunk = sequence.segments[index];\n\n // this._log(`decoding chunk ${this.trackData.trackId} ${this.uuid}, ${this.trackData.trackMixType} ${index}`, chunk, this);\n\n const { sequenceId } = sequence;\n // const managerWorker = this.managerWorker;\n\n // only cover if it is not downloaded\n\n if (chunk && !chunk?.decoded?.audioBuffer && !chunk?.decoded?.isDecoding) {\n if (!chunk.originalBar) {\n checkAllCompleted();\n return;\n }\n if (!chunk.decoded) {\n chunk.decoded = {\n audioBuffer: undefined,\n totalTimeElapsed: -1,\n isDecoding: false,\n glueFramesTime: -1,\n decodeTime: -1,\n decodeQueueId: -1,\n finishedDecodedAt: -1,\n };\n }\n // const sessionId = `decode ${Math.random().toFixed(9)}`;\n // console.time(sessionId);\n chunk.decoded.isDecoding = true;\n\n // const [arrayBuffer, timeElapsed, bufferDecodedStart, bufferDecodedEnd] = AudioSourceSequence.getRawBuffer(sequenceId, chunk.originalBar.sampleStart, chunk.originalBar.sampleEnd);\n\n // managerWorker.postMessage({\n // type: 'decodeAudioData',\n // data: { sequenceId, segmentIndex: index, arrayBuffer, bufferDecodedStart, bufferDecodedEnd, sampleStart48000: chunk.originalBar.sampleStart, sampleEnd48000: chunk.originalBar.sampleEnd }\n // }, [arrayBuffer]); // Transfer ownership of buffer\n\n // consoleColorfulMessage(`getAudioBufferUtil() ${this.trackData.trackId} - ${index}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n\n getAudioBufferUtil(\n chunk.originalBar.trackId,\n chunk.originalBar.sequenceIdx,\n chunk.originalBar.sampleStart,\n chunk.originalBar.sampleEnd,\n this.trackIndex ?? 0,\n `decoding T${this.trackIndex} S${chunk.originalBar.sequenceIdx} C${index} B${chunk.originalBar.beatIndex}`,\n false,\n )\n .then((result) => {\n // consoleColorfulMessage(`${result.signature} getting result from ${result.decodeQueueId}`);\n if (!result.error && chunk.decoded) {\n chunk.decoded.audioBuffer = result.audioBuffer ?? undefined;\n chunk.decoded.isDecoding = false;\n chunk.decoded.totalTimeElapsed = result.totalTimeElapsed;\n chunk.decoded.glueFramesTime = result.glueFramesTime;\n chunk.decoded.decodeTime = result.decodeTime;\n chunk.decoded.decodeQueueId = result.decodeQueueId;\n chunk.decoded.finishedDecodedAt = result.finishedDecodedAt;\n\n // const transferableBuffer = audioBufferToTransferable(audioBuffer);\n // managerWorker.postMessage({\n // type: 'to-buffer-processor-event-add-buffer',\n // data: { sequenceId, segmentIndex: index, buffer: transferableBuffer, timeElapsed }\n // }, [transferableBuffer.channelData] ); // Transfer ArrayBuffers\n\n dispatchEventOnUtils(BarSequence.BAR_DECODED, {\n sequenceIdx: sequenceIdx,\n sequenceId,\n chunkIdx: index,\n chunkId: chunk.chunkId,\n trackIndex: trackIndex,\n });\n } else {\n // errors can tolerate and let it pass through not stopping the iteration\n hasError = true;\n // tolerate if it is not yet cached\n\n if (!(result.error?.toString() ?? '').includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET)) {\n // console.log('gottaaaaa', result.error.toString())\n // Reset isDecoding flag before throwing to ensure it's always reset\n if (chunk?.decoded) {\n chunk.decoded.isDecoding = false;\n }\n throw Error(result.error ?? 'getAudioBufferUtil', { cause: result.message });\n } else {\n // since currently there is iteration to resolve next chunk, where GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET might be the case\n // which means the fetching is still going on so we left it here\n // console.log('GET_AUDIO_BUFFER_MESSAGE_MOOF_NOT_CACHED_YET', result.error.toString())\n }\n // consoleColorfulMessage(`[getAudioBufferUtil ERROR(${result.error})]`, '#e6dc24ff', '#a71ab7ff');\n }\n\n if (chunk?.decoded) {\n chunk.decoded.isDecoding = false;\n } else {\n this._log('the callback of getAudioBuffer failed might because AudioSource is destroyed.');\n }\n // console.timeLog(sessionId);\n checkAllCompleted();\n })\n .catch((err) => {\n hasError = true;\n if (chunk?.decoded) {\n chunk.decoded.isDecoding = false;\n }\n if (err.toString().includes(AudioSourceSequence.SAMPLE_RANGE_REQUESTED_NOT_EXISTED)) {\n dispatchEventOnUtils(BarSequence.PLAYBACK_ERROR_FROM_BAR_SEQUENCE_INVALID_SAMPLE_RANGE, {\n sequenceIdx: sequenceIdx,\n sequenceId,\n chunkIdx: index,\n chunkId: chunk.chunkId,\n trackIndex: trackIndex,\n });\n } else {\n // console.error(`gocha ${this.trackData?.trackId} [${this.trackData?.name}] decodeSequencesWithIndex(${index})`, err);\n // instead of resolve(false)\n // reject the main promise if this is critical error\n if (err.toString().includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n // console.log(`reject if critical err`, err);\n reject(err);\n return; // Don't call checkAllCompleted() if we're rejecting\n }\n\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n this._log(err);\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }\n checkAllCompleted();\n });\n } else {\n // If chunk is already decoded or being decoded, count it as completed\n checkAllCompleted();\n /*\n this._log('skip decoding cause it might be decoded');\n this._log(`%c[SKIP DECODE] T${this.trackIndex} S${sequenceIdx} C${index} might be already decoded, check details for reference`, 'color: purple;', {\n audioBufferLength: chunk?.decoded?.audioBuffer?.length | 0,\n isDecoding: chunk?.decoded?.isDecoding,\n });\n */\n }\n });\n });\n }\n\n // this assume the mp4 already there\n decode(chunkIdx: number, secondsBeforeThrowError: number): Promise<boolean> {\n return new Promise((resolve, reject) => {\n // Set up retry mechanism\n const startTime = Date.now();\n const retryInterval = 100; // 100ms between checks\n const maxTime = secondsBeforeThrowError * 1000; // Convert to milliseconds\n let fatalError = '';\n let isSettled = false; // Track if promise is already resolved/rejected\n const timeoutIds: ReturnType<typeof setTimeout>[] = []; // Track all setTimeout IDs\n\n // Helper function to clear all pending timeouts\n const clearAllTimeouts = () => {\n timeoutIds.forEach((id) => clearTimeout(id));\n timeoutIds.length = 0;\n };\n\n // Helper function to safely reject (only if not already settled)\n const safeReject = (error: Error) => {\n if (!isSettled) {\n isSettled = true;\n clearAllTimeouts();\n this.isDecoding = false;\n reject(error);\n }\n };\n\n // Helper function to safely resolve (only if not already settled)\n const safeResolve = (value: boolean) => {\n if (!isSettled) {\n isSettled = true;\n clearAllTimeouts();\n this.isDecoding = false;\n resolve(value);\n }\n };\n\n // Wrapper for setTimeout that tracks the ID and checks if settled\n const scheduleRetry = (fn: () => void) => {\n if (isSettled) {\n return; // Don't schedule if already settled\n }\n const id = setTimeout(fn, retryInterval);\n timeoutIds.push(id);\n };\n\n const checkAndRetry = async () => {\n // Early return if promise is already settled - CHECK FIRST\n if (isSettled) {\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { totalCacheTime, cacheTimes, firstErrorOfEachMoov } = this.fetchCacheRecord(chunkIdx, chunkIdx);\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled - CHECK AFTER ANY OPERATION\n if (isSettled) {\n return;\n }\n\n // Check if timeout exceeded\n if (Date.now() - startTime >= maxTime) {\n // console.log(`Decoding timeout after ${secondsBeforeThrowError} seconds for chunk ${this?.trackData?.url} ${chunkIdx}`);\n safeReject(\n new Error(`${Date.now()} Decoding timeout after ${secondsBeforeThrowError} seconds for chunk ${this?.trackData?.url} ${chunkIdx}`, {\n cause: { detailMessage: `totalCacheTime: ${totalCacheTime}, cacheTimes: ${cacheTimes}` },\n }),\n );\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled - CHECK AGAIN\n if (isSettled) {\n return;\n }\n\n if (fatalError !== '') {\n safeReject(new Error(`fatalError`));\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled - CHECK BEFORE SCHEDULING\n if (isSettled) {\n return;\n }\n\n // Check if AudioSourceSequence is available first\n if (!this.getAudioSourceSequence()) {\n // AudioSourceSequence not ready yet, retry after interval\n scheduleRetry(checkAndRetry);\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled - CHECK BEFORE DECODING\n if (isSettled) {\n return;\n }\n\n // AudioSourceSequence is available, proceed with decoding\n try {\n await this.decodeAllSequencesWithBarIndex(chunkIdx, 'decode()' + Math.random().toFixed(9));\n } catch (err) {\n // Check if already settled before processing error\n if (isSettled) {\n return;\n }\n // Check if cancelled - if so, resolve with false instead of rejecting\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n console.error('decode()', err, err instanceof Error ? err.cause : undefined);\n fatalError = formatUnknownCaughtForLog(err);\n // Immediately reject if fatal error occurred\n safeReject(new Error(`fatalError - ${fatalError}`));\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled (might have been rejected by another checkAndRetry call)\n if (isSettled) {\n return;\n }\n\n // Check fatalError again (defensive check)\n if (fatalError !== '') {\n safeReject(new Error(`fatalError - ${fatalError}`));\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled - CHECK BEFORE CHECKING READY\n if (isSettled) {\n return;\n }\n\n // Check if already ready\n const checkIsReady = this.checkFourStemsIsReady(chunkIdx);\n if (checkIsReady) {\n safeResolve(true);\n return;\n }\n\n // Check if this decode operation has been cancelled\n if (this.isDecodeOperationCancelled(chunkIdx)) {\n safeResolve(false); // Resolve with false to indicate cancellation\n return;\n }\n\n // Check if promise is already settled - FINAL CHECK BEFORE SCHEDULING RETRY\n if (isSettled) {\n return;\n }\n\n // Schedule next retry\n scheduleRetry(checkAndRetry);\n };\n\n // Start the retry loop\n checkAndRetry();\n });\n }\n\n private decodeAllSequencesWithBarIndex(startIndex: number, sessionId: string): Promise<void> {\n // this._log_table({\n // sessionId,\n // startIndex,\n // endIndex\n // });\n\n // RACE CONDITION DEBUG: Track all calls\n // const callStack = new Error().stack;\n // const timestamp = Date.now();\n\n if (this.isDecoding === true) {\n return Promise.resolve(); // Actually return early to prevent duplicate execution\n }\n\n // just in case before any MP4 is triggered\n if (!this.getAudioSourceSequence()) {\n consoleColorfulMessage(\n `autoplay: decodeAllSequencesWithBarIndex triggered ${startIndex} but AudioSourceSequence return nothing ${this?.trackData?.trackId} [${this?.trackData?.trackDisplayName}]`,\n );\n this.isDecoding = false; // Reset isDecoding before returning\n return Promise.resolve();\n }\n\n if (this.isAllFourSequencesSegmentReady(startIndex)) {\n if (this.isDecoding) {\n this.isDecoding = false; // Reset isDecoding before returning\n consoleColorfulMessage('better follow up if there is racing here');\n } else {\n consoleColorfulMessage(\n `decodeAllSequencesWithBarIndex skipped - decoded ${this.trackData.trackId} ${startIndex}`,\n this.trackIndex === 0 ? '#f7ac1fff' : this.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n }\n // debugger;\n return Promise.resolve();\n }\n\n const dispatchEventOnUtils = this.dispatchEvent.bind(this);\n // let error_detected = false;\n this.isDecoding = true;\n // consoleColorfulMessage(`decodeAllSequencesWithBarIndex ${this.trackData.trackId} ${startIndex} did it set to true: ${this.isDecoding}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n\n // consoleColorfulMessage(`Decoding ${this.trackData.trackId} ${this.uuid} ${startIndex}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n return this.decodeSequencesWithIndex(startIndex)\n .then((hasError) => {\n if (hasError) {\n consoleColorfulMessage(\n `Decoded ${this.trackData.trackId} ${startIndex} grab a result: hasError - ${hasError}`,\n this.trackIndex === 0 ? '#f7ac1fff' : this.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n // but do nothing here since it might not be critical, only deal with those with error thrown but not resolve(false)\n // debugger;\n }\n\n // consoleColorfulMessage(`Decoded ${this.trackData.trackId} ${startIndex} grab a result: hasError - ${hasError}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n\n let totalCacheTime = 'Nil',\n cacheTimes = 'Nil';\n\n if (AEV3Controller.getInstance()?.colorful_debugging) {\n const _a = this.fetchCacheRecord(startIndex, startIndex);\n totalCacheTime = _a.totalCacheTime;\n cacheTimes = _a.cacheTimes;\n }\n\n if (!hasError) {\n const d0 = this.sequences![0].segments[startIndex].decoded;\n const d1 = this.sequences![1].segments[startIndex].decoded;\n const d2 = this.sequences![2].segments[startIndex].decoded;\n const d3 = this.sequences![3].segments[startIndex].decoded;\n const totalTimeElapsed_0 = d0?.totalTimeElapsed.toFixed(3) ?? 'NaN';\n const totalTimeElapsed_1 = d1?.totalTimeElapsed.toFixed(3) ?? 'NaN';\n const totalTimeElapsed_2 = d2?.totalTimeElapsed.toFixed(3) ?? 'NaN';\n const totalTimeElapsed_3 = d3?.totalTimeElapsed.toFixed(3) ?? 'NaN';\n\n // consoleColorfulMessage(`Decoded CB ${this.trackData.trackId} ${startIndex}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n if (ENABLE_CAMUS_DECODE_AND_POST_MESSAGE_TO_PORT) {\n consoleColorfulMessage(\n `Decoded ${this.trackData.trackId} ${startIndex} totalTimeElapsed[${totalTimeElapsed_0}, ${totalTimeElapsed_1}, ${totalTimeElapsed_2}, ${totalTimeElapsed_3}], \\n ___ cacheRecord: {totalCacheTime: ${totalCacheTime},ms, cached at: [${cacheTimes}]}`,\n this.trackIndex === 0 ? '#f7ac1fff' : this.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n }\n // consoleColorfulMessage(`Decoded ${this.trackData.trackId} ${startIndex} totalTimeElapsed[${totalTimeElapsed_0}, ${totalTimeElapsed_1}, ${totalTimeElapsed_2}, ${totalTimeElapsed_3}]`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n\n dispatchEventOnUtils(BarSequence.BAR_DECODE_COMMAND_FINISHED, { trackIndex: this.trackIndex, startIndex, endIndex: startIndex, sessionId });\n } else {\n // consoleColorfulMessage(`Decoded failed, but the decodingInternal procedure will keep on retry ${this.trackData.trackId} ${startIndex} cacheRecord: {totalCacheTime: ${totalCacheTime}, cached at: [${cacheTimes}]}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n }\n this.isDecoding = false;\n })\n .catch((err) => {\n // error_detected = true;\n // console.error(`todo: error: decoding segment: ${startIndex} (${sessionId})`, error_detected);\n\n // WORKING ON THIS - decide what to do for bad MP4 MOOF MBox\n // for starting playback, terminate and avoid waiting for 8000ms\n // for case that while mix is playing: throw error to UI\n console.error(err);\n // debugger;\n this.isDecoding = false;\n throw err;\n });\n }\n\n fetchCacheRecord(startSegmentIndex: number, endSegmentIndex: number): { totalCacheTime: string; cacheTimes: string; firstErrorOfEachMoov: string } {\n const sequenceIdx = 0;\n const startSample = this.sequences?.[sequenceIdx]?.segments?.[startSegmentIndex]?.originalBar?.sampleStart;\n const endSample = this.sequences?.[sequenceIdx]?.segments?.[endSegmentIndex]?.originalBar?.sampleEnd;\n\n try {\n return this.getAudioSourceSequence().fetchCacheRecord(startSample ?? 0, endSample ?? 0);\n } catch {\n return { totalCacheTime: 'Nil', cacheTimes: 'Nil', firstErrorOfEachMoov: '' };\n }\n }\n\n updateTrackindex(trackIndex: TrackIndexType) {\n this._log(`updatingTrack Index [${this.trackData.name}] from ${this.trackIndex} as ${trackIndex}`);\n this.trackIndex = trackIndex;\n // this._log(`updated Track Index [${this.trackData.name}] as ${this.trackIndex}` , this);\n }\n\n setAudioSourceSequence(trackIndex: TrackIndexType) {\n this.trackIndex = trackIndex;\n // update last bar's sampleEnd?\n // const segmentLength = AudioSourceSequence?.sequences?.[0]?.segments?.length;\n // const actualSampleLength = AudioSourceSequence?.sequences?.[0]?.segments?.[segmentLength-1]?.byteSampleSegment?.sampleEnd;\n // this._log(actualSampleLength);\n this.sourcePlaying = {};\n this.sourceJustPlayed = {};\n this.sourceSentToBufferWorklet = {};\n // this.cleaningBuffers = false;\n\n // this._log(this.sequences.)\n }\n\n initReferenceToBufferPlayerNodes() {\n switch (this.trackIndex) {\n case 0:\n this.bufferPlayerNodes = AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack1;\n break;\n case 1:\n this.bufferPlayerNodes = AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack2;\n break;\n }\n }\n\n initReferenceToPitchShiftNode() {\n switch (this.trackIndex) {\n case 0:\n this.pitchShiftNode = AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[0];\n break;\n case 1:\n this.pitchShiftNode = AEV3Controller.getInstance().aev3Context.trackWorkletNodesCurrent[1];\n break;\n }\n }\n\n purgeDecodedAudio() {}\n\n setSourceSentToBufferWorklet(sequenceIdx: number, chunkIdx: number, source_barSequenceUUID: string) {\n // console.log(\n // 'setSourceSentToBufferWorklet', chunkIdx, source_barSequenceUUID\n // )\n if (!this.sourceSentToBufferWorklet[sequenceIdx]) {\n // prevent re-recreate of object\n this.sourceSentToBufferWorklet[sequenceIdx] = {\n chunkIdx: chunkIdx,\n chunkId: this.sequences![sequenceIdx].segments[chunkIdx].chunkId,\n sequenceIdx: sequenceIdx,\n sequenceId: this.sequences![sequenceIdx].sequenceId,\n barSequenceUUID: source_barSequenceUUID,\n };\n } else {\n this.sourceSentToBufferWorklet[sequenceIdx].chunkIdx = chunkIdx;\n this.sourceSentToBufferWorklet[sequenceIdx].chunkId = this.sequences![sequenceIdx].segments[chunkIdx].chunkId;\n this.sourceSentToBufferWorklet[sequenceIdx].sequenceIdx = sequenceIdx;\n this.sourceSentToBufferWorklet[sequenceIdx].sequenceId = this.sequences![sequenceIdx].sequenceId;\n this.sourceSentToBufferWorklet[sequenceIdx].barSequenceUUID = source_barSequenceUUID;\n }\n }\n\n // * triggerer for from-buffer-processor-event-bufferStarted\n // * and update playhead - later should remove this one\n setSourcePlaying(sequenceIdx: number, chunkIdx: number, source_barSequenceUUID: string) {\n // console.log(\n // 'setSourcePlaying', chunkIdx, source_barSequenceUUID\n // )\n // this._log(`setSourcePlaying ${sequenceIdx}, ${chunkIdx}`);\n // prevent re-recreate of object\n if (!this.sourcePlaying[sequenceIdx]) {\n // this.sourcePlaying = {};\n this.sourcePlaying[sequenceIdx] = {\n chunkIdx: chunkIdx,\n chunkId: this.sequences![sequenceIdx].segments[chunkIdx].chunkId,\n sequenceIdx: sequenceIdx,\n sequenceId: this.sequences![sequenceIdx].sequenceId,\n contextTime: AEV3Controller.getInstance().aev3Context.audioContext.currentTime,\n barSequenceUUID: source_barSequenceUUID,\n };\n } else {\n this.sourcePlaying[sequenceIdx].chunkIdx = chunkIdx;\n this.sourcePlaying[sequenceIdx].chunkId = this.sequences![sequenceIdx].segments[chunkIdx].chunkId;\n this.sourcePlaying[sequenceIdx].sequenceIdx = sequenceIdx;\n this.sourcePlaying[sequenceIdx].sequenceId = this.sequences![sequenceIdx].sequenceId;\n this.sourcePlaying[sequenceIdx].contextTime = AEV3Controller.getInstance().aev3Context.audioContext.currentTime;\n this.sourcePlaying[sequenceIdx].barSequenceUUID = source_barSequenceUUID;\n }\n }\n\n setSourceJustPlayed(sequenceIdx: number, chunkIdx: number) {\n if (!this.sourceJustPlayed[sequenceIdx]) {\n // prevent re-recreate of object\n this.sourceJustPlayed[sequenceIdx] = {\n chunkIdx: chunkIdx,\n chunkId: this.sequences![sequenceIdx].segments[chunkIdx].chunkId,\n sequenceIdx: sequenceIdx,\n sequenceId: this.sequences![sequenceIdx].sequenceId,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n };\n } else {\n this.sourceJustPlayed[sequenceIdx].chunkIdx = chunkIdx;\n this.sourceJustPlayed[sequenceIdx].chunkId = this.sequences![sequenceIdx].segments[chunkIdx].chunkId;\n this.sourceJustPlayed[sequenceIdx].sequenceIdx = sequenceIdx;\n this.sourceJustPlayed[sequenceIdx].sequenceId = this.sequences![sequenceIdx].sequenceId;\n this.sourceJustPlayed[sequenceIdx].contextTime = this.aev3Context?.audioContext.currentTime ?? 0;\n }\n }\n\n //\n isAllSourcePlayingSameChunkIdx() {\n try {\n const _idx = this.sourcePlaying?.[0]?.chunkIdx;\n const _not_eq_arr = Object.values(this.sourcePlaying).filter((c) => c.chunkIdx !== _idx);\n if (_not_eq_arr.length === 0) {\n // save to change\n return true;\n }\n return false;\n } catch (err) {\n this._log(err);\n return false;\n }\n }\n\n updatePlayedHead(sequenceIdx: number, chunkIdx: number) {\n this.setSourcePlaying(sequenceIdx, chunkIdx, 'nil');\n }\n\n getPlayingChunksInfo(): { chunkId: string; chunkIdx: number; sequenceId: string; sequenceIdx: number }[] {\n try {\n const source = this.sourcePlaying;\n return Object.values(source).map((value) => {\n return {\n chunkId: value.chunkId,\n chunkIdx: value.chunkIdx,\n sequenceId: value.sequenceId,\n sequenceIdx: value.sequenceIdx,\n };\n });\n } catch (err) {\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n this._log(err);\n // eslint-disable-next-line no-debugger\n debugger;\n }\n return [];\n }\n }\n\n getLatestBufferSentInfo(): { chunkId: string; chunkIdx: number; sequenceId: string; sequenceIdx: number }[] {\n try {\n const source = this.sourceSentToBufferWorklet;\n return Object.values(source).map((value) => {\n return {\n chunkId: value.chunkId,\n chunkIdx: value.chunkIdx,\n sequenceId: value.sequenceId,\n sequenceIdx: value.sequenceIdx,\n };\n });\n } catch (err) {\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n this._log(err);\n // eslint-disable-next-line no-debugger\n debugger;\n }\n return [];\n }\n }\n\n /**\n * Chunk index of the latest buffer queued to the worklet. Prefer this over\n * `getLatestBufferSentInfo()?.[0]?.chunkIdx` β that optional chain yields `undefined` when the\n * method returns `undefined` (catch path / null source) or `[]` (empty object), and\n * `undefined !== -1` incorrectly passes a loose guard.\n */\n getLatestBufferSentChunkIdxOrThrow(): number {\n const info = this.getLatestBufferSentInfo();\n const chunkIdx = info?.[0]?.chunkIdx;\n if (typeof chunkIdx !== 'number' || !Number.isFinite(chunkIdx) || chunkIdx < 0) {\n throw new Error(`cannot resolve a proper index (1) ${this?.trackData?.trackId}`);\n }\n return chunkIdx;\n }\n\n getPlayingChunks(): IBarSequenceChunk[] {\n try {\n if (!this.sequences?.length) {\n return [];\n }\n return Object.values(this.sourcePlaying).map((value) => {\n return this.sequences![value.sequenceIdx].segments[value.chunkIdx];\n });\n } catch (err) {\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n this._log(err);\n // eslint-disable-next-line no-debugger\n debugger;\n }\n return [];\n }\n }\n\n getChunkAudibleDuration(sequenceIdx: number, chunkIdx: number): number {\n const sequence = this.sequences?.[sequenceIdx];\n if (!sequence) {\n return 0;\n }\n const chunk = sequence.segments[chunkIdx];\n\n // this._log_table({\n // chunkIdx,\n // playQuantisedSpeed: chunk.playQuantisedSpeed,\n // });\n\n let speedRatio_SeedMixMatching_Resolved;\n if (chunk.playQuantisedSpeedAs === 'quantised') {\n speedRatio_SeedMixMatching_Resolved = chunk.speedRatio_SeedMixMatching;\n } else if (chunk.playQuantisedSpeedAs === 'seed') {\n speedRatio_SeedMixMatching_Resolved = chunk.speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised;\n } else if (chunk.playQuantisedSpeedAs === 'mix') {\n speedRatio_SeedMixMatching_Resolved = chunk.speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised;\n } else {\n speedRatio_SeedMixMatching_Resolved = 1; // fallback\n }\n\n const ob = chunk.originalBar;\n if (!ob) {\n return 0;\n }\n return ob.duration / (speedRatio_SeedMixMatching_Resolved * chunk.speedRatio_ManualScheduling * this.globalPlaybackRate);\n }\n\n loopBarsAtNearestBarDividableBy4() {\n const playingChunks = this.getPlayingChunksInfo();\n\n const loopBackInBars = 4;\n const counts = 3;\n\n playingChunks.forEach((playingChunk) => {\n const currentSequence = this.sequences!.find((s) => s.sequenceId === playingChunk.sequenceId);\n if (!currentSequence) {\n return;\n }\n const _barChunkIdx = currentSequence.segments.findIndex((seg) => seg.chunkId === playingChunk.chunkId);\n this._log('currentBarIndex', _barChunkIdx);\n const _idxDivided4 = _barChunkIdx % 4; // if it is 3, happen now\n let barChunkIdx;\n if (_idxDivided4 === 3) {\n barChunkIdx = _barChunkIdx;\n } else if (_idxDivided4 === 2) {\n barChunkIdx = _barChunkIdx + 1;\n } else if (_idxDivided4 === 1) {\n barChunkIdx = _barChunkIdx + 2;\n } else {\n barChunkIdx = _barChunkIdx + 3;\n }\n const barChunkInfo = currentSequence.segments[barChunkIdx];\n if (barChunkIdx - loopBackInBars > 0) {\n const targetBar = currentSequence.segments.find((seg, index) => index === barChunkIdx - loopBackInBars);\n if (!targetBar) {\n return;\n }\n barChunkInfo.nextScheduledChunkId = targetBar.chunkId;\n barChunkInfo.nextChunkRedirectionCount = counts;\n } else {\n console.error('targetBarIndex exceeded length');\n }\n });\n }\n\n loopCurrentBarForNTimes(loopCount: number, noOfBeatBackwards: 1 | 2 | 3 | 4): boolean {\n const bufferNodes = this.getBufferPlayerNodes();\n\n if (!bufferNodes.length) return false;\n\n if (!this.triggeredPlay) return false;\n\n let barPortion: number = 0;\n switch (noOfBeatBackwards) {\n case 1:\n barPortion = 0.25;\n break;\n case 2:\n barPortion = 0.5;\n break;\n case 3:\n barPortion = 0.75;\n break;\n case 4:\n barPortion = 1;\n break;\n }\n\n this.sequences!.forEach((s, sequenceIdx) => {\n const bufferPlayerNode = bufferNodes[sequenceIdx];\n bufferPlayerNode.port.postMessage({ type: 'to-buffer-processor-event-loop', detail: { loopCount: loopCount, barPortion } });\n });\n return true;\n }\n\n stopLoopBeats() {\n const bufferNodes = this.getBufferPlayerNodes();\n\n if (!bufferNodes.length) return false;\n\n if (!this.triggeredPlay) return false;\n\n this.sequences!.forEach((s, sequenceIdx) => {\n const bufferPlayerNode = bufferNodes[sequenceIdx];\n bufferPlayerNode.port.postMessage({ type: 'to-buffer-processor-event-stop-loop', detail: { loopCount: 0, barPotion: -1 } });\n });\n return true;\n }\n\n skipBarsAtPlayingChunks(bars: number) {\n const playingChunks = this.getPlayingChunksInfo();\n // this._log(bars);\n playingChunks.forEach((playingChunk) => {\n const currentSequence = this.sequences!.find((s) => s.sequenceId === playingChunk.sequenceId);\n if (!currentSequence) {\n return;\n }\n const currentBarChunkIdx = currentSequence.segments.findIndex((seg) => seg.chunkId === playingChunk.chunkId);\n const currentBarChunkInfo = currentSequence.segments[currentBarChunkIdx];\n\n if (currentBarChunkIdx + bars < currentSequence.segments.length) {\n const targetBar = currentSequence.segments.find((seg, index) => index === currentBarChunkIdx + bars);\n if (!targetBar) {\n return;\n }\n currentBarChunkInfo.nextScheduledChunkId = targetBar.chunkId;\n currentBarChunkInfo.nextScheduledChunkOffset = 0;\n currentBarChunkInfo.nextChunkRedirectionCount = 1;\n } else {\n console.error('targetBarIndex exceeded length');\n }\n });\n }\n\n getChunkById(sequenceId: string, chunkId: string) {\n try {\n return this.sequences?.find((s) => s.sequenceId === sequenceId)?.segments.find((seg) => seg.chunkId === chunkId);\n } catch (err) {\n console.error(err);\n return undefined;\n }\n }\n\n getChunkByIdx(sequenceIdx: number, chunkIdx: number) {\n try {\n return this.sequences?.find((s, index) => index === sequenceIdx)?.segments.find((seg, index2) => index2 === chunkIdx);\n } catch (err) {\n console.error(err);\n return undefined;\n }\n }\n\n getPlayQuantisedSpeedOnBars(): 'quantised' | 'seed' | 'mix' {\n return this.playQuantisedSpeedOnBars;\n }\n\n /**\n * funtion to toggle between quantiseSpeedOnBars\n * @param flag\n */\n setPlayQuantisedSpeedOnBars(flag: 'quantised' | 'seed' | 'mix') {\n this.playQuantisedSpeedOnBars = flag;\n\n const chunkIdxSent = this.getLatestBufferSentInfo()?.[0]?.chunkIdx || 0;\n // apply the changes to bars after current bar\n this.sequences?.forEach((s) => {\n s.segments.forEach((c, segmentIdx) => {\n if (segmentIdx > chunkIdxSent) {\n c.playQuantisedSpeedAs = flag;\n }\n });\n });\n }\n\n play(aev3Context: AEV3Context) {\n this.triggeredPlay = true;\n // when a bar sequence starts to play, better make sure the chunks were ready\n\n // suitable for brand new starting playback:\n this.playWorketVersion(aev3Context);\n }\n\n /**\n * the currentTime and targetTime must at least having SILENT_BUFFER_SAMPLE_SIZE samples difference\n * besides trackIndex is used to map the audio output to correct pipeline\n * @param audioContext\n * @param startingChunkIdx\n * @param scheduledStartTime\n */\n schedulePlay(aev3Context: AEV3Context, startingChunkIdx: number, scheduledStartTime: number, skipSilentBuffers: boolean = false) {\n if ((scheduledStartTime - aev3Context.audioContext.currentTime) * 48000 < SILENT_BUFFER_SAMPLE_SIZE) {\n console.error('cannot schedule play, because the silent buffer do not have time to play, and have worklet startup properly');\n return;\n }\n this.triggeredPlay = true;\n // this._log(`schedulePlay`, aev3Context);\n\n // set the scheduledStartTime, it better be at least SILENT_BUFFER_SAMPLE_SIZE samples away from current playhead\n this.schedulePlayWorketVersion(aev3Context, startingChunkIdx, scheduledStartTime, skipSilentBuffers);\n }\n\n cancelSchedulePlay() {\n // remove the pending buffers in buffer-player-processors\n }\n\n schedulePlayWorketVersion(aev3Context: AEV3Context, startingChunkIdx: number, targetTime: number, skipSilentBuffers: boolean = false) {\n if (!aev3Context) {\n throw Error('no valid audio context');\n }\n // const startingChunkIdx = 0;\n // const steps = 1;\n\n this.aev3Context = aev3Context;\n\n // make sure the play-buffer-worklet has right global playback rate\n this.setGlobalPlaybackRate(this.globalPlaybackRate);\n\n const startTime = targetTime - SILENT_BUFFER_SAMPLE_SIZE / 48000;\n const sharedStartTime = startTime;\n this._log(\n `Scheduled play at ${startTime}, current context time: ${this.aev3Context?.audioContext?.currentTime}, playback should start after ${startTime - this.aev3Context?.audioContext?.currentTime}`,\n );\n // console.time(`[${this.trackIndex}] Time to setup 2 buffers for 8 stems`);\n\n sendInitPitchShiftCommandToWorklet(this.pitchShift, this.trackIndex);\n this._playWorkletVersionSubProcess(startingChunkIdx, sharedStartTime, skipSilentBuffers);\n }\n\n playWorketVersion(aev3Context: AEV3Context) {\n if (!aev3Context) {\n throw Error('no valid audio context');\n }\n const startingChunkIdx = 0;\n // const steps = 1;\n\n this.aev3Context = aev3Context;\n\n const startTime = this.aev3Context.audioContext.currentTime;\n const sharedStartTime = startTime + SILENT_BUFFER_SAMPLE_SIZE / 48000;\n this._log('Scheduled play at', startTime);\n // console.time(`[${this.trackIndex}] Time to setup 2 buffers for 8 stems`);\n\n sendInitPitchShiftCommandToWorklet(this.pitchShift, this.trackIndex);\n\n this._playWorkletVersionSubProcess(startingChunkIdx, sharedStartTime);\n }\n\n // refactor the common sub procedures between playWorketVersion and schedulePlayWorketVersion\n _playWorkletVersionSubProcess(startingChunkIdx: number, sharedStartTime: number, skipSilentBuffers: boolean = false) {\n this._log('_playWorkletVersionSubProcess startingChunkIdx', startingChunkIdx);\n const bufferNodes = this.getBufferPlayerNodes();\n if (!this.aev3Context || bufferNodes.length < 4) {\n return;\n }\n const silentBuffer = this.aev3Context.silentTrackBuffers[this.trackIndex ?? 0];\n\n if (AVOID_RUBBERBAND_WORKLET_AT_SEED && this.trackIndex === 0) {\n // this._log('no need to send silent buffer to worklet because it is seed1');\n } else if (AVOID_RUBBERBAND_WORKLET_AT_MIX1) {\n // this._log('no need to send silent buffer to worklet because it is seed1');\n } else {\n // const silentSource1 = aev3Context.recreateAndConnectSilentBufferToWorklet(aev3Context.audioContext, this.trackIndex, aev3Context.silentTrackBuffers, aev3Context.trackWorkletNodesCurrent);\n // silentSource1.start(startTime); // start at once\n }\n\n this._log(`_playWorkletVersionSubProcess: barIdx - ${startingChunkIdx}`);\n // use average speed to calculate pitch compensation end\n if (!skipSilentBuffers) {\n for (let i = 0; i < 4; i++) {\n const bufferPlayerNode = bufferNodes[i];\n\n // Send each AudioBuffer to the processor\n const buffer = silentBuffer;\n const channels = [];\n for (let k = 0; k < buffer.numberOfChannels; k++) {\n channels.push(buffer.getChannelData(k));\n }\n const speedRatio_SeedMixMatching = 1;\n const speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised = 1;\n const speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised = 1;\n const playQuantisedSpeedAs = this.playQuantisedSpeedOnBars;\n\n if (ENABLE_CONSOLE_OF_SENDING_MESSAGE_TO_BUFFER_PlAYER) {\n this._log(\n '%cAdd silent buffer to processor',\n 'color: orange',\n JSON.stringify({\n trackIndex: this.trackIndex,\n sequenceIdx: i,\n chunkIdx: -1,\n timeStmap: this.aev3Context.audioContext.currentTime,\n speedRatio_SeedMixMatching,\n skipSamplesAtStart: 0,\n playQuantisedSpeed: this.playQuantisedSpeedOnBars,\n }),\n );\n }\n\n bufferPlayerNode.port.postMessage({\n type: 'to-buffer-processor-event-add-buffer',\n detail: {\n buffer: channels,\n trackIndex: this.trackIndex,\n chunkId: 'silent',\n sequenceIdx: i,\n chunkIdx: -1,\n speedRatio_SeedMixMatching,\n speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised,\n speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised,\n speedRatio_ManualScheduling: 1,\n skipSamplesAtStart: 0,\n playQuantisedSpeedAs,\n stemId: `silent_${i}`,\n trackId: ``,\n barSequenceUUID: this.uuid,\n rampFromZeroAtStart: true,\n rampToZeroBeforeEnd: true,\n },\n });\n }\n }\n\n // const decodeNext = this.decodeNext.bind(this);\n this._initialiseOnMessagesOfBufferPlayerProcess();\n\n for (let sequenceIdx = 0; sequenceIdx < 4; sequenceIdx++) {\n // Error fired from the buffer-player-processor if following line disabled\n // TypeError: Cannot read properties of undefined (reading 'speedRatio')\n // at BufferPlayerProcessor.loadNextBuffer (buffer-player-processor.js:100:73)\n // at BufferPlayerProcessor.process (buffer-player-processor.js:189:38)\n\n this.postBuffer(sequenceIdx, startingChunkIdx, 0);\n\n // NOTE: the error is fine, since it is caught in a try block\n // however we have to consider suspend postBuffer to the processor as a whole\n // and resume posting after all of the segments ready\n\n // for experimental: resume the playback like following:\n // setTimeout(()=>{\n // this.postBuffer(sequenceIdx, startingChunkIdx, 0);\n // }, 3000);\n }\n\n // console.timeLog(`[${this.trackIndex}] Time to setup 2 buffers for 8 stems`);\n // console.timeEnd(`[${this.trackIndex}] Time to setup 2 buffers for 8 stems`);\n\n for (let i = 0; i < 4; i++) {\n const bufferPlayerNode = bufferNodes[i];\n // sync the starting time\n this._log('%csetStartTime to processor', 'color: orange', JSON.stringify({ trackIndex: this.trackIndex, startTime: sharedStartTime }));\n bufferPlayerNode.port.postMessage({ type: 'to-buffer-processor-event-set-start-time', startTime: sharedStartTime });\n }\n }\n\n _initialiseOnMessagesOfBufferPlayerProcess() {\n const bufferNodes = this.getBufferPlayerNodes();\n const postBuffer_aka_playNext: (sequenceIdx: number, chunkIdx: number, offsetAtAudioBuffer: number) => void = this.postBuffer.bind(this);\n const prepBuffer_aka_cacheDecodeNext = this.decodingInternal.bind(this);\n // const decodeNext = this.decodeNext.bind(this);\n\n // Play Next\n const fireEventForLastBar = (\n currentSequenceIdx: number,\n currentSequenceId: string,\n currentChunkIdx: number,\n currentChunkId: string,\n originalBarCopy: NonNullable<IBarSequenceChunk['originalBar']>,\n ) => {\n // fire event mark the end of a track\n this.dispatchEvent(BarSequence.LAST_BAR_ALMOST_FINISHED_PLAYING, {\n sequenceIdx: currentSequenceIdx,\n sequenceId: currentSequenceId,\n chunkIdx: currentChunkIdx,\n chunkId: currentChunkId,\n trackIndex: this.trackIndex,\n timeStampMS: Date.now(),\n originalBar: originalBarCopy,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n });\n };\n\n // search current chunkIdx at CB of buffer processor\n // if chunkIdx is provided and the item matched with chunkId, return the chunkIdx directly rather than using findIndex()\n const getCurrentChunkIdx = (dataDetail: { sequenceIdx: number; chunkId: string; chunkIdx: number }): number => {\n const currentSequence = this.sequences![dataDetail.sequenceIdx];\n // const currentSequenceIdx = dataDetail.sequenceIdx;\n // const currentChunk = currentSequence.segments.find((s)=>s.chunkId===dataDetail.chunkId);\n // if (currentSequence.segments[dataDetail.chunkIdx].chunkId===dataDetail.chunkId) {\n // return dataDetail.chunkIdx;\n // } else {\n return currentSequence.segments.findIndex((s) => s.chunkId === dataDetail.chunkId);\n // }\n };\n\n for (let i = 0; i < 4; i++) {\n const bufferPlayerNode = bufferNodes[i];\n bufferPlayerNode.port.onmessage = (event) => {\n if (!this.sequences?.length) {\n this._log('%cMessage is sent from AudioWorklet, however looks like the sequence is destroyed already', 'color: blue', event.data.detail);\n return;\n }\n if (event.data.type === 'from-buffer-processor-event-logOnSafari') {\n // this._log(`%c${event.data.detail.message}`, 'color: magenta');\n // this._log('detail', event.data.detail);\n // debugger;\n } else if (event.data.type === 'from-buffer-processor-event-bufferStarted') {\n if (ENABLE_CONSOLE_OF_MESSAGE_FROM_BUFFER_PLAYER) {\n if (this.trackIndex === 0) {\n this._log('%cA buffer has started playing', 'color: blue', JSON.stringify(event.data.detail));\n }\n }\n\n if (event.data.detail.chunkIdx !== -1) {\n const currentSequence = this.sequences![event.data.detail.sequenceIdx];\n const currentSequenceIdx = event.data.detail.sequenceIdx;\n const currentChunkIdx = getCurrentChunkIdx(event.data.detail);\n const currentChunk = currentSequence.segments[currentChunkIdx];\n if (!currentChunk?.originalBar || !currentChunk.decoded) {\n return;\n }\n const barSequenceUUID = event.data.detail.barSequenceUUID;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const trackId = event.data.detail.trackId;\n const trackIndex = event.data.detail.trackIndex;\n if (ENABLE_CAMUS_ALERT_PREVENT_SEND_BUFFERS_REPEATEDLY) {\n if (currentSequenceIdx === 1) {\n if (trackIndex === 0) {\n // consoleColorfulMessage4Lawful(`Bar Starts play: trackId: ${trackId}, barSequenceUUID: ${barSequenceUUID}, currentSequenceIdx: ${currentSequenceIdx}, currentChunkIdx: ${currentChunkIdx}`, '#00Ff00', '#18c2b7ff', 8);\n } else {\n // consoleColorfulMessage4Lawful(`Bar Starts play: trackId: ${trackId}, barSequenceUUID: ${barSequenceUUID}, currentSequenceIdx: ${currentSequenceIdx}, currentChunkIdx: ${currentChunkIdx}`, '#ff1900ff', '#8ad0cbff', 8);\n }\n }\n if (barSequenceUUID !== this.uuid) {\n // maybe duplicated bar is sending command to buffer-player-processor // Screenshot 2025-11-26 at 11.53.05\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }\n\n this.setSourcePlaying(currentSequenceIdx, currentChunkIdx, barSequenceUUID);\n\n const _processorInternalSpeed = { ...event.data.detail._internalSpeed };\n const ob = currentChunk.originalBar;\n const originalBarWithSpeed = {\n ...ob,\n _processorInternalSpeed,\n };\n\n const obj: BarChunkDetails = {\n sequenceIdx: currentSequenceIdx,\n sequenceId: currentSequence.sequenceId,\n chunkIdx: currentChunkIdx,\n chunkId: currentChunk.chunkId,\n trackIndex: this.trackIndex ?? 0,\n timeStampMS: Date.now(),\n originalBar: originalBarWithSpeed,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n };\n\n // BarEventChunkDetails\n this.dispatchEvent(BarSequence.BAR_STARTS_PLAYING, obj);\n // disabled for now, and have to make sure if this happened the index swapping finished\n\n const ENABLE_LOGGING_VALUES_SEND_TO_WORKLET = false;\n if (ENABLE_LOGGING_VALUES_SEND_TO_WORKLET) {\n if (this.trackIndex === 0 && currentSequenceIdx === 0) {\n console.log(`seed (${currentChunkIdx})`, _processorInternalSpeed.speedRatio_SeedMixMatching_Resolved);\n }\n if (this.trackIndex === 1 && currentSequenceIdx === 0) {\n console.log(`mix (${currentChunkIdx})`, _processorInternalSpeed.speedRatio_SeedMixMatching_Resolved);\n }\n }\n\n // Note another command of pitch change is sent here:\n this.triggererOnlyIfFourStemResolved(currentChunk, currentSequenceIdx, _processorInternalSpeed);\n }\n // Add additional actions here, such as loading the next buffer if needed\n } else if (event.data.type === 'from-buffer-processor-event-bufferEnded') {\n if (ENABLE_CONSOLE_OF_MESSAGE_FROM_BUFFER_PLAYER) {\n this._log('%cA buffer has finished playing, TBACS/Intelliskip/InfiniteFix', 'color: blue', JSON.stringify(event.data.detail));\n }\n\n if (event.data.detail.chunkIdx !== -1) {\n const currentSequence = this.sequences![event.data.detail.sequenceIdx];\n const currentSequenceIdx = event.data.detail.sequenceIdx;\n const currentChunkIdx = getCurrentChunkIdx(event.data.detail);\n const currentChunk = currentSequence.segments[currentChunkIdx];\n if (!currentChunk?.originalBar) {\n return;\n }\n\n if (currentChunk.isLastBar) {\n this._log(`%cA buffer has finished last bar [${this.trackData.name}] ${Date.now()}`, 'color: blue', JSON.stringify(event.data.detail));\n }\n\n const originalBar = {\n ...currentChunk.originalBar,\n _processorInternalSpeed: { ...event.data.detail._internalSpeed },\n };\n\n const obj: BarChunkDetails = {\n sequenceIdx: currentSequenceIdx,\n sequenceId: currentSequence.sequenceId,\n chunkIdx: currentChunkIdx,\n chunkId: currentChunk.chunkId,\n trackIndex: this.trackIndex ?? 0,\n timeStampMS: Date.now(),\n originalBar,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n };\n\n this.setSourceJustPlayed(currentSequenceIdx, currentChunkIdx);\n\n // BarEventChunkDetails\n this.dispatchEvent(BarSequence.BAR_PLAYED, obj);\n\n if (currentChunk.isLastBarFromMasterBarEditing === true) {\n /*\n this.dispatchEvent(BarSequence.LAST_BAR_OF_MASTER_BAR_EDIT_FINISHED_PLAYING, {\n sequenceIdx: currentSequenceIdx,\n sequenceId: currentSequence.sequenceId,\n chunkIdx: currentChunkIdx,\n chunkId: currentChunk.chunkId,\n trackIndex: this.trackIndex,\n timeStampMS: Date.now(),\n originalBar,\n contextTime: this.aev3Context.audioContext.currentTime,\n });\n */\n }\n }\n // Add additional actions here, such as loading the next buffer if needed\n } else if (event.data.type === 'from-buffer-processor-event-bufferAlmostEnd-depreciated[dropped]') {\n // this event now removed\n return;\n\n if (ENABLE_CONSOLE_OF_SENDING_MESSAGE_TO_BUFFER_PlAYER) {\n this._log('%cA buffer almost plays till the end, attempt to post buffer or halt the playback', 'color: orange', JSON.stringify(event.data.detail));\n }\n\n // Should really halt the warning here\n const currentChunkIdx = event.data.detail.chunkIdx;\n\n // Update: required all four stem's segment ready before carry on, which means\n if (!this.isAllFourSequencesSegmentReady(currentChunkIdx)) {\n this.suspendedChunkIdx = currentChunkIdx;\n const j = currentChunkIdx;\n this._log(`%c[Post Buffer - NOT DECODED] T${this.trackIndex} S${i} C${j}, ${Date.now()}`, 'color: purple;');\n this._log(`%cConsider Suspend the playback here, MARK THE SUSPENDED ID: ${this.suspendedChunkIdx}`, 'color: orange; background: black;');\n this._log(`Segment related:`, this.sequences![i].segments[j]);\n\n // TODO:\n // dispatch event and inform the other track (seed1/mix1)\n // note it should be restarting based on seedTrack's even index (the bar ratio might not be the same)\n\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n\n // BarEventChunkDetails\n this.dispatchEvent(BarSequence.NEXT_BAR_AUDIO_DATA_NOT_READY_DURING_PLAYBACK, {\n sequenceIdx: null,\n sequenceId: null,\n chunkIdx: currentChunkIdx,\n chunkId: null,\n trackIndex: this.trackIndex,\n timeStampMS: Date.now(),\n originalBar: null,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n });\n return;\n }\n } else if (event.data.type === 'from-buffer-processor-event-buffer-queue-is-emptied' || event.data.type === 'from-buffer-processor-event-bufferAlmostEnd') {\n // if (ENABLE_CONSOLE_OF_MESSAGE_FROM_BUFFER_PLAYER) {\n // this._log('%cA buffer almost plays till the end, append next buffer now', 'color: orange', JSON.stringify(event.data.detail));\n // }\n\n if (ENABLE_CONSOLE_OF_SENDING_MESSAGE_TO_BUFFER_PlAYER) {\n this._log(\n '%cA buffer just detached from the buffer lists or the list is emptied and not replenished (len:0), trying to replenish next chunk',\n 'color: orange',\n JSON.stringify(event.data.detail),\n );\n }\n\n if (event.data.type === 'from-buffer-processor-event-buffer-queue-is-emptied') {\n // consoleColorfulMessage(`${event.data.type}, queue exhausted ... send another buffer if possible... [Signature: ${event.data.detail?.signature}]`, event.data?.detail.trackIndex === 0 ? '#f7ac1fff': event.data?.detail.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n } else if (event.data.type === 'from-buffer-processor-event-bufferAlmostEnd') {\n consoleColorfulMessage(\n `${event.data.type} (11000 sample before ends), send another buffer if possible... [Signature: ${event.data.detail?.signature}]`,\n event.data?.detail.trackIndex === 0 ? '#f7ac1fff' : event.data?.detail.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n }\n\n // if (event.data.detail.chunkIdx!==-1){\n\n const currentSequence = this.sequences![event.data.detail.sequenceIdx];\n const currentSequenceIdx = event.data.detail.sequenceIdx;\n const currentChunkIdx = getCurrentChunkIdx(event.data.detail);\n const currentChunk = currentSequence.segments[currentChunkIdx];\n const nextChunkId = currentChunk.nextChunkId;\n const obLast = currentChunk.originalBar;\n\n // playNext(event.data.detail.sequenceIdx, event.data.detail.chunkIdx+1);\n\n // this._log(currentChunk.nextScheduledChunkId);\n // not good practice if we use undefined to carry out the check, they property key might go missing if we do destruct pattern a = {...b}\n if (currentSequenceIdx === 0) {\n prepBuffer_aka_cacheDecodeNext(`from-buffer-processor-event-bufferAlmostEnd (sequenceIdx: 0, chunkIdx: ${currentChunkIdx})`);\n }\n\n if (currentChunk.nextScheduledChunkId !== '') {\n if (currentChunk.nextChunkRedirectionCount > 0) {\n const nextScheduledChunkIdx = currentSequence.segments.findIndex((s) => s.chunkId === currentChunk.nextScheduledChunkId);\n const nextScheduledChunkOffsetAt = currentChunk.nextScheduledChunkOffset;\n if (nextScheduledChunkOffsetAt === undefined) {\n console.error('error?', currentChunk);\n alert('error');\n }\n currentChunk.nextChunkRedirectionCount = currentChunk.nextChunkRedirectionCount - 1;\n if (currentChunk.nextChunkRedirectionCount === 0) {\n currentChunk.nextScheduledChunkId = '';\n currentChunk.nextScheduledChunkOffset = 0;\n }\n postBuffer_aka_playNext(currentSequenceIdx, nextScheduledChunkIdx, nextScheduledChunkOffsetAt ?? 0);\n } else if (nextChunkId !== '') {\n currentChunk.nextChunkRedirectionCount = 0;\n currentChunk.nextScheduledChunkId = '';\n const nextChunkIdx = currentSequence.segments.findIndex((c) => c.chunkId === nextChunkId);\n if (nextChunkIdx > -1) {\n postBuffer_aka_playNext(currentSequenceIdx, nextChunkIdx, 0);\n } else {\n console.error('invalid nextChunkIdx', nextChunkIdx);\n }\n } else if (currentChunk.isLastBar && obLast) {\n fireEventForLastBar(currentSequenceIdx, currentSequence.sequenceId, currentChunkIdx, currentChunk.chunkId, { ...obLast });\n } else {\n console.error('Sequence Error: next chunk not configurated');\n }\n } else if (currentChunk.isLastBar && obLast) {\n // fire event mark the end of a track\n fireEventForLastBar(currentSequenceIdx, currentSequence.sequenceId, currentChunkIdx, currentChunk.chunkId, { ...obLast });\n } else {\n const nextChunkIdx = currentSequence.segments.findIndex((c) => c?.chunkId === nextChunkId);\n if (nextChunkIdx > -1) {\n // consoleColorfulMessage(`postBuffer_aka_playNext s${currentSequenceIdx} c${nextChunkIdx}`, event.data?.detail.trackIndex === 0 ? '#f7ac1fff': event.data?.detail.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n postBuffer_aka_playNext(currentSequenceIdx, nextChunkIdx, 0);\n } else {\n consoleColorfulMessage(\n `invalid nextChunkIdx ${nextChunkIdx}`,\n event.data?.detail.trackIndex === 0 ? '#f7ac1fff' : event.data?.detail.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n console.error('invalid nextChunkIdx', nextChunkIdx);\n }\n }\n\n // }\n // Add additional actions here, such as loading the next buffer if needed\n } else if (event.data.type === 'from-buffer-processor-event-nextBufferNotReady') {\n if (event.data.detail.chunkIdx !== -1) {\n // this._log(`%cNote Worklet: buffer-player-processor in standby mode since next buffer is not ready yet ${event.data.detail?.trackIndex} ${event.data.detail?.sequneceIdx} ${event.data.detail?.chunkIdx}, ${event.data.detail?.timeStamp}`, 'color: magenta; background: black;');\n\n // const currentSequence = this.sequences[event.data.detail.sequenceIdx];\n // const currentSequenceIdx = event.data.detail.sequenceIdx;\n // const currentChunk = currentSequence.segments.find((s)=>s.chunkId===event.data.detail.chunkId);\n // const currentChunkIdx = currentSequence.segments.findIndex((s)=>s.chunkId===event.data.detail.chunkId);\n const currentChunkIdx = getCurrentChunkIdx(event.data.detail);\n // const currentChunk = currentSequence.segments[currentChunkIdx];\n\n consoleColorfulMessage(\n `[buffer almost plays till the end but next buffer not provided, really need to halt the playback, {idx:${event.data.detail?.chunkIdx}/len: ${this.sequences?.[0].segments?.length || 'NaN'}} [Signature: ${event.data.detail?.signature}]`,\n event.data?.detail.trackIndex === 0 ? '#f7ac1fff' : event.data?.detail.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n\n consoleColorfulMessage(\n `${JSON.stringify(event.data.detail)}`,\n event.data?.detail.trackIndex === 0 ? '#f7ac1fff' : event.data?.detail.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n\n this.dispatchEvent(BarSequence.NEXT_BAR_AUDIO_DATA_NOT_READY_DURING_PLAYBACK, {\n sequenceIdx: event.data.detail.segmentIdx,\n sequenceId: event.data.detail.segmentId,\n chunkIdx: currentChunkIdx,\n chunkId: event.data.detail.chunkId,\n trackIndex: event.data.detail.trackIndex,\n timeStampMS: Date.now(),\n originalBar: null,\n trackId: event.data.detail.trackId,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n });\n } else {\n this._log(\n `%cNote Worklet: buffer-player-processor in standby mode since next buffer is not ready yet ${event.data.detail?.trackIndex} ${event.data.detail?.sequneceIdx} ${event.data.detail?.chunkIdx}, ${event.data.detail?.timeStamp}`,\n 'color: yellow; background: black;',\n );\n }\n return;\n } else if (event.data.type === 'from-buffer-processor-event-sample-loc-updated') {\n // this._log(`%c${event.data.detail.message}`, 'color: magenta');\n // this._log('detail', event.data.detail);\n // debugger;\n if (event.data.detail.chunkIdx !== -1) {\n if (event.data.detail.sequenceIdx === 0) {\n const currentSequence = this.sequences![event.data.detail.sequenceIdx];\n // const currentSequenceIdx = event.data.detail.sequenceIdx;\n const currentChunkIdx = getCurrentChunkIdx(event.data.detail);\n const currentChunk = currentSequence.segments[currentChunkIdx];\n // const barSequenceUUID = event.data.detail.barSequenceUUID;\n // console.log(`event.data.detail?.bufferPosPlayedInThisChunk: ${event.data.detail?.bufferPosPlayedInThisChunk}, currentChunk?.originalBar?.sampleStart: ${currentChunk?.originalBar?.sampleStart}`);\n const currentSampleLoc = Math.round(event.data.detail?.bufferPosPlayedInThisChunk + currentChunk?.originalBar?.sampleStart || 0);\n this.samplePlayed = currentSampleLoc;\n }\n }\n } else if (['from-buffer-processor-event-bufferPlayed_1/4', 'from-buffer-processor-event-bufferPlayed_2/4', 'from-buffer-processor-event-bufferPlayed_3/4'].includes(event.data.type)) {\n // only fire event if it is first stem\n if (event.data.detail.sequenceIdx !== 0) return;\n const currentSequence = this.sequences![event.data.detail.sequenceIdx];\n const currentSequenceIdx = event.data.detail.sequenceIdx;\n const currentChunkIdx = getCurrentChunkIdx(event.data.detail);\n const currentChunk = currentSequence.segments[currentChunkIdx];\n const cob = currentChunk.originalBar;\n if (!cob) {\n return;\n }\n const trackId = event.data.detail.trackId;\n const stemId = event.data.detail.stemId;\n const sequenceIdx = event.data.detail.sequenceIdx;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const nextChunkId = currentChunk.nextChunkId;\n // debugger;\n\n const ratio =\n event.data.type === 'from-buffer-processor-event-bufferPlayed_1/4'\n ? 0.25\n : event.data.type === 'from-buffer-processor-event-bufferPlayed_2/4'\n ? 0.5\n : event.data.type === 'from-buffer-processor-event-bufferPlayed_3/4'\n ? 0.75\n : 1;\n if (ratio === 1) {\n throw Error('wrong ratio returned');\n }\n\n const sampleLength = Math.round(ratio * cob.sampleLength);\n\n // note this for performance\n // on every 0.25, 0.5, 0.75 bars an object is created\n const originalBar = {\n beatIndex: cob.beatIndex,\n beatIndexIsReal: cob.beatIndexIsReal,\n beatSource: cob.beatSource,\n sampleStart: cob.sampleStart,\n sampleEnd: cob.sampleStart + sampleLength,\n sampleLength: sampleLength,\n startTime: cob.startTime,\n endTime: cob.startTime + sampleLength / 48000,\n duration: sampleLength / 48000,\n trackId,\n stemId,\n sequenceIdx,\n _processorInternalSpeed: { ...event.data.detail._internalSpeed },\n };\n\n const obj: BarChunkDetails = {\n sequenceIdx: currentSequenceIdx,\n sequenceId: currentSequence.sequenceId,\n chunkIdx: currentChunkIdx,\n chunkId: currentChunk.chunkId,\n trackIndex: this.trackIndex ?? 0,\n timeStampMS: Date.now(),\n originalBar,\n contextTime: this.aev3Context?.audioContext.currentTime ?? 0,\n };\n\n // BarEventChunkDetails\n if (ratio === 0.25) {\n // this._log('1/4')\n this.dispatchEvent(BarSequence.BAR_PARTIALLY_PLAYED_ZERO_POINT_25, obj);\n } else if (ratio === 0.5) {\n // this._log('1/2')\n this.dispatchEvent(BarSequence.BAR_PARTIALLY_PLAYED_ZERO_POINT_5, obj);\n } else if (ratio === 0.75) {\n // this._log('3/4')\n this.dispatchEvent(BarSequence.BAR_PARTIALLY_PLAYED_ZERO_POINT_75, obj);\n }\n } else if (typeof event.data.type === 'string' && event.data.type.startsWith('from-buffer-processor-event-bufferPlayed_') && event.data.type.endsWith('/8')) {\n // Sub-bar 1/8th progress: compute pitch as exact inverse of\n // the interpolated speed (same t value the worklet used).\n // pitch = 1/speed ensures perfect cancellation at every step.\n if (!this._interpActive) return;\n if (event.data.detail.sequenceIdx !== 0) return;\n\n const eighthMatch = event.data.type.match(/(\\d+)\\/8$/);\n if (!eighthMatch) return;\n const eighthNum = parseInt(eighthMatch[1], 10); // 1β7\n const t = eighthNum / 8;\n\n const interpSpeed = this._speedFrom + (this._speedTo - this._speedFrom) * t;\n const workletValue = 1 / interpSpeed;\n const trackType = this.trackIndex === 0 ? 'seed1' : 'mix1';\n\n console.log(\n `%c[Pitch Interp] ${trackType} ${eighthNum}/8` +\n ` | speed=${interpSpeed.toFixed(4)} β pitch=1/spd=${workletValue.toFixed(4)}`,\n 'color: #a78bfa',\n );\n sendPitchShiftToWorkletWithTrackLabel(workletValue, this.getPitchShiftNode(), trackType);\n }\n };\n }\n }\n\n private getSequenceSegment(sequenceIdx: number, chunkIdx: number) {\n const i = sequenceIdx;\n const j = chunkIdx;\n if (!this.sequences?.[i]?.segments) {\n return undefined;\n }\n const audioBuffer = this.sequences[i].segments.find((seg, index) => index === j);\n return audioBuffer;\n }\n\n private isSegmentsBufferReady(sequenceIdx: number, chunkIdx: number) {\n const i = sequenceIdx;\n const j = chunkIdx;\n // Defensive guards to avoid null/undefined access during edge cases\n if (!this.sequences || !this.sequences[i] || !this.sequences[i].segments) {\n return false;\n }\n const segments = this.sequences[i].segments;\n if (j < 0 || j >= segments.length) {\n return false;\n }\n const audioBuffer = segments.find((seg, index) => index === j);\n if (!audioBuffer) return false;\n return !!audioBuffer.decoded?.audioBuffer;\n }\n\n private isSegmentValid(sequenceIdx: number, chunkIdx: number) {\n const i = sequenceIdx;\n const j = chunkIdx;\n if (!this.sequences || !this.sequences[i] || !this.sequences[i].segments) {\n return false;\n }\n const segment = this.sequences[i].segments.find((seg, index) => index === j);\n return !!segment;\n }\n\n private isAllFourSequencesSegmentReady(chunkIdx: number) {\n // If sequences are not initialised or incomplete, treat as not ready rather than throwing\n if (!this.sequences || this.sequences.length === 0) {\n return false;\n }\n for (let sequenceIdx = 0; sequenceIdx < this.sequences.length; sequenceIdx += 1) {\n const seq = this.sequences[sequenceIdx];\n if (!seq || !seq.segments) {\n // consoleColorfulMessage(`isAllFourSequencesSegmentReady s${sequenceIdx} c${chunkIdx} - return because segment not exists`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n return false;\n }\n\n if (!this.isSegmentsBufferReady(sequenceIdx, chunkIdx)) {\n // consoleColorfulMessage(`isAllFourSequencesSegmentReady s${sequenceIdx} c${chunkIdx} - return because this segment not ready`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n return false;\n }\n }\n // consoleColorfulMessage(`isAllFourSequencesSegmentReady c${chunkIdx} - yes!`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n return true;\n }\n\n checkFourStemsIsReady(chunkIdx: number) {\n return this.isAllFourSequencesSegmentReady(chunkIdx);\n }\n\n async awaitTillFourStemsReady(chunkIdx: number, secondsAwaitBeforeDeclareFail = 1): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const interval = 30; // Retry every N ms\n const timeout = secondsAwaitBeforeDeclareFail * 1000; // Convert seconds to milliseconds\n const startTime = Date.now();\n\n const checkCriteria = () => {\n if (this.isAllFourSequencesSegmentReady(chunkIdx)) {\n resolve(true); // Resolve the promise if the criteria is met\n } else if (Date.now() - startTime >= timeout) {\n reject(new Error('Segments not ready within the specified time.')); // Reject if timeout exceeded\n } else {\n setTimeout(checkCriteria, interval); // Retry after the interval\n }\n };\n\n checkCriteria(); // Start the first check\n });\n }\n\n private getPitchShiftNode(): AudioWorkletNode {\n if (!this.pitchShiftNode) {\n this.initReferenceToPitchShiftNode();\n }\n return this.pitchShiftNode!;\n }\n\n private getBufferPlayerNodes(): AudioWorkletNode[] {\n if (this.bufferPlayerNodes === null) {\n return [];\n }\n if (!this.bufferPlayerNodes?.length) {\n this.initReferenceToBufferPlayerNodes();\n }\n return this.bufferPlayerNodes!;\n /*\n switch (this.trackIndex) {\n case 0:\n bufferNodes = AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack1;\n break;\n case 1:\n bufferNodes = AEV3Controller.getInstance().aev3Context.stemBufferNodeTrack2;\n break;\n }\n return bufferNodes;\n */\n }\n\n // each call no more than 1 ms\n private postBuffer(sequenceIdx: number, chunkIdx: number, offsetAtAudioBuffer: number) {\n // this._log('postBuffer()',this.trackIndex, sequenceIdx, chunkIdx, offsetAtAudioBuffer);\n // if (this.cleaningBuffers) {\n // setTimeout(()=>{\n // this.postBuffer(sequenceIdx, chunkIdx, offsetAtAudioBuffer);\n // }, 100);\n // return;\n // }\n\n const bufferNodes = this.getBufferPlayerNodes();\n if (bufferNodes.length < 4) {\n return;\n }\n // const i=sequenceIdx;\n // const j=chunkIdx;\n let bufferPlayerNode = undefined;\n\n // Update: required all four stem's segment ready before carry on, which means\n if (this.suspendedChunkIdx !== undefined) {\n this._log(`%c[Post Buffer - ABORTED] T${this.trackIndex} S${sequenceIdx} C${chunkIdx}`, 'color: purple;');\n this._log(`%cPlayback is suspended, SUSPENDED ID: ${this.suspendedChunkIdx}`, 'color: orange; background: black;');\n this._log(`Segment related:`, this.sequences![sequenceIdx].segments[chunkIdx]);\n return;\n }\n\n if (chunkIdx === -1) {\n this._log(`%c[Post Buffer - ABORTED] T${this.trackIndex} S${sequenceIdx} C${chunkIdx}`, 'color: purple;');\n this._log(`%cPlayback should suspended, chunkId is ID: ${chunkIdx}`, 'color: orange; background: black;');\n this._log(`Segment related:`, this.sequences![sequenceIdx].segments[chunkIdx]);\n return;\n }\n\n if (!this.isAllFourSequencesSegmentReady(chunkIdx)) {\n // this.suspendedChunkIdx = chunkIdx;\n if (ENABLE_CONSOLE_ON_ASKING_FOR_EXHAUSTED_QUEUE) {\n this._log(`%c[Post Buffer - NOT DECODED] T${this.trackIndex} S${sequenceIdx} C${chunkIdx}, ${Date.now()}`, 'color: purple;');\n this._log(`%cWill not Suspend the playback here, since still have time to retry`, 'color: orange; background: black;');\n this._log(`Segment related:`, this.sequences![sequenceIdx].segments[chunkIdx]);\n }\n\n // instead of halt, notify buffer player processor with nextBufferIsNotReadyForExhaustedArray\n bufferPlayerNode = bufferNodes[sequenceIdx];\n bufferPlayerNode.port.postMessage({ type: 'to-buffer-processor-event-next-buffer-is-not-ready-for-exhausted-queue', detail: {} });\n return;\n }\n\n const audioBuffer = this.getSequenceSegment(sequenceIdx, chunkIdx);\n if (!audioBuffer) {\n consoleColorfulMessage(`postBuffer s${sequenceIdx} c${chunkIdx} - !audioBuffer`, this.trackIndex === 0 ? '#f7ac1fff' : this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n\n this._log(`%c[Post Buffer - CANNOT FIND SEGMENT] T${this.trackIndex} S${sequenceIdx} C${chunkIdx}`, 'color: purple;');\n this._log(`%cConsider Suspend the playback here.`, 'color: orange; background: black;');\n this._log(`Segment related:`, this.sequences![sequenceIdx].segments[chunkIdx]);\n return;\n }\n\n if (!audioBuffer.decoded?.audioBuffer) {\n consoleColorfulMessage(\n `postBuffer s${sequenceIdx} c${chunkIdx} - !audioBuffer.decoded.audioBuffer`,\n this.trackIndex === 0 ? '#f7ac1fff' : this.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n\n this._log(`%c[Post Buffer - NOT DECODED] T${this.trackIndex} S${sequenceIdx} C${chunkIdx}, ${Date.now()}`, 'color: purple;');\n this._log(`%cConsider Suspend the playback here.`, 'color: orange; background: black;');\n this._log(`Segment related:`, this.sequences![sequenceIdx].segments[chunkIdx]);\n return;\n }\n\n // avoid sending the buffer to the processor once again if it is already on the fly\n if (\n this.sourceSentToBufferWorklet?.[sequenceIdx]?.sequenceIdx === sequenceIdx &&\n this.sourceSentToBufferWorklet?.[sequenceIdx]?.chunkIdx === chunkIdx &&\n this.sourceSentToBufferWorklet?.[sequenceIdx]?.barSequenceUUID !== 'nil'\n ) {\n if (ENABLE_CAMUS_ALERT_PREVENT_SEND_BUFFERS_REPEATEDLY) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n return;\n }\n\n if (\n chunkIdx === this.sourcePlaying[sequenceIdx]?.chunkIdx &&\n this.sourcePlaying[sequenceIdx]?.barSequenceUUID &&\n !['nil', 'resume'].includes(this.sourcePlaying[sequenceIdx].barSequenceUUID)\n ) {\n if (ENABLE_CAMUS_ALERT_PREVENT_SEND_BUFFERS_REPEATEDLY) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }\n\n this.setSourceSentToBufferWorklet(sequenceIdx, chunkIdx, this.uuid);\n\n bufferPlayerNode = bufferNodes[sequenceIdx];\n const buffer = audioBuffer.decoded!.audioBuffer;\n\n // Audio buffer cannot be sent to Worker\n // I reckon same for Worklet that is why channel data copied from AudioBuffer\n\n // Send each AudioBuffer to the processor\n const channels = [];\n for (let k = 0; k < buffer.numberOfChannels; k++) {\n channels.push(buffer.getChannelData(k)); // should streamline this one as well\n }\n const speedRatio_SeedMixMatching = this.sequences![sequenceIdx].segments[chunkIdx].speedRatio_SeedMixMatching;\n const speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised = this.sequences![sequenceIdx].segments[chunkIdx].speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised;\n const speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised = this.sequences![sequenceIdx].segments[chunkIdx].speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised;\n const playQuantisedSpeedAs = this.sequences![sequenceIdx].segments[chunkIdx].playQuantisedSpeedAs; //\n\n if (sequenceIdx === 0) {\n if (ENABLE_CAMUS_DECODE_AND_POST_MESSAGE_TO_PORT) {\n consoleColorfulMessage(\n `postMessage to ports ${this.sequences![sequenceIdx].segments[chunkIdx].originalBar?.trackId} ${this.trackIndex} chunkIdx: ${chunkIdx}`,\n this.trackIndex === 0 ? '#f7ac1fff' : this.trackIndex === 1 ? '#00ff5eff' : '#ff0000',\n '#ffffff',\n );\n }\n }\n // consoleColorfulMessage(`postMessage to port sequence: ${i} chunkIdx: ${j}\\n *************************************************** `, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n let currentTrackIdDiffToPrev = false;\n const segPrev = this.sequences![sequenceIdx].segments[chunkIdx - 1];\n const segCur = this.sequences![sequenceIdx].segments[chunkIdx];\n const segNext = this.sequences![sequenceIdx].segments[chunkIdx + 1];\n if (segPrev?.originalBar && segCur?.originalBar) {\n currentTrackIdDiffToPrev = segPrev.originalBar.trackId !== segCur.originalBar.trackId;\n }\n let currentTrackIdDiffToNext = false;\n if (segNext?.originalBar && segCur?.originalBar) {\n currentTrackIdDiffToNext = segNext.originalBar.trackId !== segCur.originalBar.trackId;\n }\n\n bufferPlayerNode.port.postMessage({\n type: 'to-buffer-processor-event-add-buffer',\n detail: {\n buffer: channels,\n trackIndex: this.trackIndex,\n chunkId: this.sequences![sequenceIdx].segments[chunkIdx].chunkId,\n sequenceIdx: sequenceIdx,\n chunkIdx: chunkIdx,\n speedRatio_SeedMixMatching,\n speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised,\n speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised,\n speedRatio_ManualScheduling: audioBuffer.speedRatio_ManualScheduling,\n skipSamplesAtStart: offsetAtAudioBuffer * 48000,\n playQuantisedSpeedAs,\n stemId: this.sequences![sequenceIdx].sequenceId,\n trackId: this.sequences![sequenceIdx].segments[chunkIdx].originalBar!.trackId,\n barSequenceUUID: this.uuid,\n rampFromZeroAtStart: currentTrackIdDiffToPrev,\n rampToZeroBeforeEnd: currentTrackIdDiffToNext,\n },\n });\n }\n\n cleanBuffersInBufferPlayerProcessor() {\n const bufferNodes = this.getBufferPlayerNodes();\n if (!bufferNodes.length) {\n this._log('BufferNodes not found');\n return;\n }\n this._log(`sending clean up buffer and stop to processors, buffer clean up in ${FADE_OUT_DURATION_ON_PAUSE}s, [tag: refresh-mix]`); //, AEV3Controller.getInstance().aev3Context.audioContext.currentTime);\n for (let i = 0; i < 4; i++) {\n const bufferPlayerNode = bufferNodes[i];\n bufferPlayerNode.port.postMessage({\n type: 'to-buffer-processor-event-fade-out-and-clean-all-buffers', // new version of stop with fading\n // type: 'to-buffer-processor-event-cleanAllBuffersAndStop',\n detail: {},\n });\n }\n }\n\n setGlobalPlaybackRate(value: number) {\n this.globalPlaybackRate = value;\n this.changePlaybackRate_PlayBufferVersion(value);\n }\n\n setScheduledBarSpeed(barIndex: number, value: number) {\n this.sequences?.forEach((sequence: IBarSequence) => {\n sequence.segments[barIndex].speedRatio_ManualScheduling = value;\n });\n }\n\n // rely on sourcePlaying, only init at play4by4 or postBuffer\n // if -1 nothing ever played\n getMinimumPlayingIndex() {\n // current minimum index\n try {\n const currentChunksPlaying = this.getPlayingChunksInfo();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const minIndex = currentChunksPlaying.reduce((prev, current, index, arr) => {\n // this._log(prev, current)\n return Math.min(prev, current.chunkIdx);\n }, 9999999);\n const startIndex = minIndex === -1 || minIndex === 9999999 ? -1 : minIndex;\n return startIndex;\n } catch (err) {\n this._log(err);\n return -1;\n }\n }\n\n getMaximumPlayingIndex() {\n // current minimum index\n try {\n const currentChunksPlaying = this.getPlayingChunksInfo();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const maxIndex = currentChunksPlaying.reduce((prev, current, index, arr) => {\n // this._log(prev, current)\n return Math.max(prev, current.chunkIdx);\n }, -1);\n const startIndex = maxIndex === -1 ? 0 : maxIndex;\n return startIndex;\n } catch (err) {\n this._log(err);\n return 0;\n }\n }\n\n /** return -1 if nothing is decoded before */\n getMinimumDecodedIdx() {\n // set the init point\n let startIndex = this.getMinimumPlayingIndex();\n if (startIndex === -1) {\n // which means isPlaying Object is not even init\n startIndex = 0;\n }\n\n // after startIndex finds the latest caching index\n let decodedIndex = startIndex;\n if (!this.sequences?.[0]?.segments) return -1;\n const segmentsLength = this.sequences[0].segments.length;\n for (let i = startIndex; i < segmentsLength; i++) {\n const decoded = this.isSegmentIdxDecoded(i, -1);\n if (!decoded) {\n if (i === startIndex) {\n // which means it not starts to play, make it -1\n decodedIndex = -1;\n }\n break;\n }\n decodedIndex = i;\n }\n return decodedIndex;\n }\n\n isSegmentIdxDecoded(segmentIdx: number, sequenceIdx: number = -1) {\n if (sequenceIdx === -1) {\n let decoded = true;\n for (let j = 0; j < 4; j++) {\n if (!this.sequences![j].segments[segmentIdx].decoded?.audioBuffer) {\n decoded = false;\n break;\n }\n }\n return decoded;\n } else {\n return !!this.sequences![sequenceIdx].segments[segmentIdx].decoded?.audioBuffer;\n }\n }\n\n isMultipleSegmentIdxDecoded(segmentIndices: number[], sequenceIdx: number = -1) {\n let decoded = true;\n segmentIndices.forEach((v) => {\n if (!this.isSegmentIdxDecoded(v, sequenceIdx)) {\n decoded = false;\n return;\n }\n });\n return decoded;\n }\n\n /**\n * this return the composed segment, not necessary to be a full bar\n * @param sequenceIdx\n * @returns\n */\n getBarsLength(sequenceIdx: number = 0): number | undefined {\n return this.sequences?.[sequenceIdx]?.segments?.length;\n }\n\n /**\n * DECODED AUDIO DATA\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n startDecoding(signature = '') {\n this._log(`[BarSequence::startDecoding], trackIndex: ${this.trackIndex}`);\n // const previousId = this.interval_evicting;\n if (this.interval_decoding) this.stopDecoding();\n\n // enable the caching function with dynamic interval\n this.startDynamicDecoding();\n // why this create stutter on animation?\n // this._log(`%cstale auditor:: BAR-${this.trackData.trackId} - start-decoding-id from ${previousId} to ${this.interval_decoding}, signature: ${signature}`, 'color: greenyellow');\n }\n\n private startDynamicDecoding() {\n this.decodingSchedulerActive = true;\n // Start with normal frequency (100ms)\n this.interval_decoding = setInterval(this.decodingInternal.bind(this), 100);\n }\n\n private adjustDecodingFrequency(isActive: boolean) {\n if (this.interval_decoding) {\n clearInterval(this.interval_decoding);\n // Use faster polling when active, slower when idle\n const interval = isActive ? 100 : 1000; // 100ms when active, 1s when idle\n this.interval_decoding = setInterval(this.decodingInternal.bind(this), interval);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stopDecoding(signature = '') {\n // console.log(`${this.trackData?.trackId} [${this.trackData?.name}] stopDecoding()`);\n this.decodingSchedulerActive = false;\n clearInterval(this.interval_decoding);\n // this._log(`%cstale auditor:: BAR-${this.trackData.trackId} - stop-decoding-id-${this.interval_decoding} set as undefined, signature: ${signature}`, 'color: greenyellow');\n this.interval_decoding = undefined;\n }\n\n // caching function\n // an intervel function that load the coming chunk 1 by 1 until it reaches the buffer needed\n // note this will ignore the nextChunkId and instead depend on the chunkIdx of decodedIndex\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n decodingInternal(signature: string = '') {\n // this._log(this.isLoading))\n // console.log(`${this.trackData?.trackId} [${this.trackData?.name}] decodingInternal()`);\n if (!this.decodingSchedulerActive) {\n return;\n }\n\n if (!this.isDecoding) {\n // if (signature!=='') {\n // console.log(`decodingInternal: ${signature}`)\n // }\n const decodedIndex = this.getMinimumDecodedIdx();\n const currentPlayingIndex = this.getMinimumPlayingIndex();\n // this._log(this.trackIndex, this.isDecoding);\n // this._log('cache next of ' , decodedIndex);\n // this._log_table({\n // trackIndex: this.trackIndex,\n // decodedIndex,\n // currentPlayingIndex,\n // diff: decodedIndex - currentPlayingIndex,\n // });\n if (this.trackIndex === 0) {\n // this._log(`seekTo:: [${this.trackData.name}, ${this.internalFingerprint}] decodingInternal::decodeAllSequencesWithBarIndex()`, currentPlayingIndex, decodedIndex);\n }\n\n // OPTIMIZATION: Adjust polling frequency based on playback state\n const isPlaybackActive = currentPlayingIndex >= 0;\n const isIdle = currentPlayingIndex === -1 && decodedIndex >= 0;\n\n if (isIdle) {\n // Switch to slower polling when idle\n this.adjustDecodingFrequency(false);\n return;\n } else if (isPlaybackActive) {\n // Switch to faster polling when playback is active\n this.adjustDecodingFrequency(true);\n }\n\n if (decodedIndex - currentPlayingIndex <= MOOF_BATCH_SIZE + 4) {\n if (decodedIndex === -1 && currentPlayingIndex > 0) {\n // this scenario mainly due to sourcePlaying is set as specific target manually\n // consoleColorfulMessage(`decodingInternal(1) ${this.trackData.trackId} - ${currentPlayingIndex}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n this.decodeAllSequencesWithBarIndex(currentPlayingIndex, 'decodingInternal(1)' + Math.random().toFixed(3)).catch((err) => {\n // Handle errors gracefully in background decoding\n // Don't let uncaught promise rejections crash the app\n console.error(`decodingInternal(1) error for chunk ${currentPlayingIndex}:`, err);\n if (err?.toString().includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n this.stopDecoding();\n // fire event for AEV3Controller to follow up\n this.dispatchEvent(BarSequence.FATAL_PLAYBACK_ERROR_MP4_AND_STOP_DECODING_ITERATION, {\n trackId: this.trackData?.trackId,\n name: this.trackData?.name,\n });\n }\n });\n } else if (this.sequences?.[0]?.segments?.[decodedIndex]?.isLastBar) {\n // ignore decoding\n /*\n this._log('%cDrop decoding, since decodedIndex is already a last bar', 'color: magenta; background: black;');\n this._log('%cStop the caching & decoding', 'color: magenta; background: black;')\n this.stopDecoding();\n */\n // suppress the message ..\n // this._log('%ckeep on decoding, decodedIndex is already a last bar but might need to keep this up for master bar playback especially for 0.5 ratio', 'color: magenta; background: black;');\n return;\n } else {\n // consoleColorfulMessage(`decodingInternal(2) ${this.trackData.trackId} - ${decodedIndex+1}`, this.trackIndex === 0 ? '#f7ac1fff': this.trackIndex === 1 ? '#00ff5eff' : '#ff0000', '#ffffff');\n // it doesn't really care, always trigger decoding of next index\n this.decodeAllSequencesWithBarIndex(decodedIndex + 1, 'decodingInternal(2)' + Math.random().toFixed(3)).catch((err) => {\n // Handle errors gracefully in background decoding\n // Don't let uncaught promise rejections crash the app\n console.error(`decodingInternal(2) error for chunk ${decodedIndex + 1}:`, err);\n if (err?.toString().includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n this.stopDecoding();\n // fire event for AEV3Controller to follow up\n this.dispatchEvent(BarSequence.FATAL_PLAYBACK_ERROR_MP4_AND_STOP_DECODING_ITERATION, {\n trackId: this.trackData?.trackId,\n name: this.trackData?.name,\n });\n }\n });\n }\n } else {\n // this._log('out of range', decodedIndex);\n }\n } else {\n // this._log('still decoding');\n }\n }\n\n /**\n * EVICTION OF DECODED AUDIO DATA\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n startEvicting(signature = '') {\n this._log(`[BarSequence::startEvicting], trackIndex: ${this.trackIndex}`);\n // const previousId = this.interval_evicting;\n if (this.interval_evicting) this.stopEvicting();\n // enable the caching function\n this.interval_evicting = setInterval(this.evictingInternal.bind(this), 500);\n // why this create stutter on animation\n // this._log(`%cstale auditor:: BAR-${this.trackData.trackId} - start-evicting-id from ${previousId} to ${this.interval_evicting}, signature: ${signature}`, 'color: greenyellow');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stopEvicting(signature = '') {\n clearInterval(this.interval_evicting);\n // this._log(`%cstale auditor:: BAR-${this.trackData.trackId} - stop-evicting-id-${this.interval_evicting} set as undefined, signature: ${signature}`, 'color: greenyellow');\n this.interval_evicting = undefined;\n }\n\n evictingInternal() {\n // const decodedIndex = this.getMinimumDecodedIdx();\n const currentPlayingIndex = this.getMinimumPlayingIndex();\n // this is setInterval, the bar might already cleaned up in between\n try {\n if (currentPlayingIndex > 5) {\n // this._log(`${this.trackIndex} clear buffers `, 0, currentPlayingIndex - 4);\n this.evictAudioBufferOnAllSequencesWithBarIndex(0, currentPlayingIndex - 2);\n }\n this.dispatchEvent(BarSequence.BAR_UNLOADED_ON_ALL_SEQUENCES, {});\n } catch (err) {\n console.error(err);\n }\n }\n\n evictAudioBufferOnAllSequencesWithBarIndex(startIndex: number, endIndex: number) {\n for (let i = startIndex; i <= endIndex; i++) {\n this.sequences?.forEach((s, sequenceIdx) => {\n const dec = s.segments[i]?.decoded;\n if (dec) {\n dec.audioBuffer = undefined;\n const originalBar = s.segments[i].originalBar;\n if (originalBar) {\n this.evictAudioSourceOnlyIfItNoLongerInUseOnSequence(sequenceIdx, s.segments[i].chunkId, originalBar);\n }\n }\n });\n }\n }\n\n // CAUTION, edge case, if this trackId is used on other BarSequence, it might get evicted as well\n evictAudioSourceOnlyIfItNoLongerInUseOnSequence(sequenceIdx: number, chunkId: string, originalBar: { trackId: string; sampleStart: number; sampleEnd: number }) {\n const trackId = originalBar.trackId;\n\n // *********************************************************************************************************\n // avoid doing this if the trackId x sampleStart x sampleEnd will be used in future\n\n const playingIndex = this.getMinimumPlayingIndex();\n\n // only trigger on other stem\n if (sequenceIdx === 0) {\n const seq = this.sequences![sequenceIdx];\n const chunkIdx = seq.segments.findIndex((c) => c.chunkId === chunkId);\n const futureSegmentsUsingSameOriginalBarIdx = seq.segments.findIndex((c, i) => {\n const i_within_playing_chunkRange = i > playingIndex - 1 && i < playingIndex + 8;\n const cob = c.originalBar;\n if (\n i > chunkIdx &&\n i_within_playing_chunkRange &&\n cob &&\n cob.sampleStart === originalBar.sampleStart &&\n cob.sampleEnd === originalBar.sampleEnd &&\n cob.trackId === originalBar.trackId\n ) {\n return true;\n }\n return false;\n });\n if (futureSegmentsUsingSameOriginalBarIdx > -1) {\n // if (futureSegmentsUsingSameOriginalBarIdx - chunkIdx > 5) {\n // it is too far away, maybe clean it up at this moment - just let the decodingInterval fetch it again\n // } else {\n // skip removing this segment:\n // this._log('%cpreload - avoid evicting golden segment because it will be used in future', 'color: purple;', sequenceIdx, originalBar)\n // this._log('future', futureSegmentsUsingSameOriginalBarIdx, this.sequences[sequenceIdx].segments[futureSegmentsUsingSameOriginalBarIdx])\n // return;\n // }\n return;\n }\n } else {\n return;\n }\n\n AEV3Controller.getInstance().evictArrayBufferAccordingToSampleRange(trackId, 0, originalBar.sampleStart, originalBar.sampleEnd, 'bar:evictAudioBufferOnAllSequencesWithBarIndex');\n }\n\n private changePlaybackRate_PlayBufferVersion(value: number) {\n const bufferNodes = this.getBufferPlayerNodes();\n\n if (!bufferNodes.length) {\n console.error('fail to set playback rate to worklet');\n return;\n }\n for (let i = 0; i < 4; i++) {\n const bufferPlayerNode = bufferNodes[i];\n // this._log('setPlaybackRate to worklet');\n // console.log('setPlaybackRate', value);\n bufferPlayerNode.port.postMessage({ type: 'to-buffer-processor-event-setPlaybackRate', playbackRate: value });\n }\n }\n\n // Keep Cache status in Bar?\n getProgressStatus(): IBarSequenceProgress {\n try {\n const playingChunks = this.getPlayingChunksInfo();\n\n const final = this.sequences!.map((sequence, sequenceIdx) => {\n // const { sequenceId } = sequence;\n // this._log(sequenceId);\n // this._log(this.sequences);\n // this._log(this.getAudioSourceSequence());\n\n // this._log(\"===\")\n // const result = [];\n // everytime it create a new result\n sequence.segments.map((barChunk, segmentIdx) => {\n let cached = false;\n let invalid = false;\n let isPlaying = false;\n const trackId = barChunk.originalBar?.trackId || undefined;\n // debugger;\n if (barChunk.originalBar) {\n if (this.getAudioSourceSequence(trackId)) {\n // this._log(this.getAudioSourceSequence());\n // const correspondingAudioSourceSequence: IAudioSourceSequence = Object.values(this.getAudioSourceSequence(trackId).sequences).find((v: IAudioSourceSequence)=>v.sequenceId === sequenceId);\n // this._log('%cMe', 'color: orange;', this.getAudioSourceSequence());\n // const stemAlignedId = sequenceId;\n const correspondingHLSSegments = this.getAudioSourceSequence(trackId).getSegmentInfo(sequenceIdx, barChunk.originalBar.sampleStart, barChunk.originalBar.sampleEnd);\n // this._log(correspondingAudioSourceSequence);\n // this._log(correspondingHLSSegments)\n const segmentsGroup = correspondingHLSSegments[1];\n const segmentsNotCached = segmentsGroup.filter((s) => !!s.cached && !s.cached?.arrayBuffer);\n if (segmentsGroup.length === 0) {\n // no corresponding AAC Segment found\n invalid = true;\n }\n\n if (\n !invalid &&\n // no bar-segment not cached found\n segmentsNotCached.length === 0\n ) {\n cached = true;\n }\n\n // this._log(segmentsNotCached)\n\n const currentChunkInSequence = playingChunks.find((v) => v.sequenceIdx === sequenceIdx);\n if (currentChunkInSequence && currentChunkInSequence.chunkId === barChunk.chunkId) {\n isPlaying = true;\n }\n\n barChunk.progress.chunkIdx = segmentIdx;\n barChunk.progress.chunkId = barChunk.chunkId;\n barChunk.progress.cached = cached;\n barChunk.progress.decoded = !!barChunk.decoded?.audioBuffer;\n barChunk.progress.invalid = invalid;\n barChunk.progress.isPlaying = isPlaying;\n\n // TODO re\n // result.push({chunkIdx: segmentIdx, chunkId:barChunk.chunkId, cached, decoded: !!barChunk.decoded?.audioBuffer, invalid, isPlaying})\n } else {\n barChunk.progress.chunkIdx = segmentIdx;\n barChunk.progress.chunkId = barChunk.chunkId;\n barChunk.progress.cached = false;\n barChunk.progress.decoded = false;\n barChunk.progress.invalid = true;\n barChunk.progress.isPlaying = false;\n // result.push({chunkIdx: segmentIdx, chunkId:barChunk.chunkId, cached: false, decoded: false, invalid: true, isPlaying: false})\n }\n } else {\n barChunk.progress.chunkIdx = segmentIdx;\n barChunk.progress.chunkId = barChunk.chunkId;\n barChunk.progress.cached = false;\n barChunk.progress.decoded = false;\n barChunk.progress.invalid = true;\n barChunk.progress.isPlaying = false;\n // result.push({chunkIdx: segmentIdx, chunkId:barChunk.chunkId, cached: false, decoded: false, invalid: true, isPlaying: false})\n }\n });\n return {\n sequenceId: sequence.sequenceId,\n sequenceIdx: sequenceIdx,\n sequence: sequence.segments.map((c) => c.progress),\n };\n });\n return final;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n // console.error(err);\n return {} as IBarSequenceProgress;\n }\n }\n\n /**\n * Scheduling / Advanced Method\n */\n setLastBarDueToIntelli(barIndex: number) {\n const bufferNodes = this.getBufferPlayerNodes();\n if (!bufferNodes.length) {\n return;\n }\n this.sequences!.forEach((s, sequenceIdx) => {\n const foundBar = s.segments.find((segment, chunkIdx) => chunkIdx === barIndex);\n if (foundBar) {\n foundBar.isLastBar = true;\n foundBar.isLastBarFromIntelli = true;\n }\n\n const bufferPlayerNode = bufferNodes[sequenceIdx];\n // // Send Message to worklet to kill the pending buffer, replenish the next chunk\n bufferPlayerNode.port.postMessage({\n type: 'to-buffer-processor-event-remove-pending-buffer',\n detail: { sequenceIdx, chunkIdx: barIndex },\n });\n });\n }\n\n /**\n * apply switching profile (all stems) to all four stems' bars\n * but it only trigger when all four stem's bar starts playing\n */\n setStemSwitchingCommandForIntelli(barIndex: number, command: { [key: number]: StemSwitchingScheduler }) {\n this.sequences?.forEach((s) => {\n // if (index !== 0) return;\n const foundBar = s.segments.find((segment, chunkIdx) => chunkIdx === barIndex);\n if (foundBar) foundBar.stemsToggle_StartOfBar = command;\n });\n }\n\n /**\n * need to work on this to recall the buffers\n **/\n setStemScheduledSpeedForIntelli(startBarIndex: number, endBarIndex: number, startSpeed: number, endSpeed: number) {\n const bufferNodes = this.getBufferPlayerNodes();\n if (!bufferNodes.length) {\n return;\n }\n // this.cleaningBuffers = true;\n\n const steps = endBarIndex - startBarIndex + 1;\n const delta = (endSpeed - startSpeed) / steps;\n // const startTime = Date.now();\n let i = 0;\n for (let chunkIdx = startBarIndex; chunkIdx <= endBarIndex; chunkIdx++) {\n this.sequences!.forEach((s, sequenceIdx) => {\n const foundBar = s.segments.find((segment, index) => index === chunkIdx);\n if (foundBar) {\n foundBar.speedRatio_ManualScheduling = startSpeed + i * delta;\n const bufferPlayerNode = bufferNodes[sequenceIdx];\n // // Send Message to worklet to kill the pending buffer, replenish the next chunk\n bufferPlayerNode.port.postMessage({\n type: 'to-buffer-processor-event-update-manual-schedule-speed',\n detail: { sequenceIdx, chunkIdx, speedRatio_ManualScheduling: foundBar.speedRatio_ManualScheduling },\n });\n }\n\n // this._log(foundBar);\n });\n i++;\n }\n // this._log('%cTime used to change speed ratio of segments', 'color: red', Date.now()-startTime);\n }\n\n // note the profile is assigned to all stem of the sequence, besides it only assign to one of the two sequence (Seed)\n // but only one of the bar will triggered the switch\n\n // combo workaround\n // 1 only apply stem switching on seed\n // 2 only send toggle command and not touching the volume\n\n applyStemSwitchingOnBarStart(lastBarStartPlayingOnThisIndex: IBarSequenceChunk, chunkIdx: number) {\n const bar = lastBarStartPlayingOnThisIndex;\n const sequenceIndices: string[] = Object.keys(bar.stemsToggle_StartOfBar);\n if (sequenceIndices.length > 0) {\n if (bar.updateCurrentTrackIfThisMasterBarSegmentPlays && !bar.isTransitionalBar) {\n console.error(\n 'you are scheduling a stem switching at first bar of master bar segment and it is not transition zone so the swapping is going to happen, likely there will be racing issue while using [1, <del>3</del>] logic below',\n );\n if (ENABLE_CAMUS_DEV_DEBUGGER_INTERCEPTOR) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n // console.info('it should work now since the applyStemSwitchingOnBarStart only can happen after channel swap');\n return;\n }\n if (this.trackIndex !== 1) {\n // this._log(`STARTED!!! debugToggleStem \\n********\\n * applyStemSwitchingOnBarStart [${this.trackData.name}] ${this.trackIndex}`, JSON.stringify(bar.stemsToggle_StartOfBar), JSON.stringify(sequenceIndices));\n\n if (bar.updateCurrentTrackIfThisMasterBarSegmentPlays && bar.isTransitionalBar) {\n // only do that in normal transition (autoplay next)\n if (!bar.isFirstBarOfLiveEditSwap) {\n AEV3Controller.getInstance().snapStemProfileBeforeTransition();\n }\n }\n\n sequenceIndices.forEach((v: string) => {\n const sequenceIdx = parseInt(v, 10);\n if (!Number.isFinite(sequenceIdx)) {\n return;\n }\n\n /*\n const target = AEV3Controller.getInstance().getBarSequenceIdWithType('seed1') === this.trackIndex ? 'seed1': 'mix1';\n const volume: number = bar.stemsToggle_StartOfBar[v] ? 1: 0;\n const informMasterStore = true;\n const informStemVolumeStore = false;\n //\n AEV3Controller.getInstance().changeStemVolumeNow(\n target, \n sequneceIdx,\n volume,\n informMasterStore, // for those triggered not initialised from Master\n informStemVolumeStore,\n )\n */\n\n // this._log(`debugToggleStem \\n********\\n * applyStemSwitchingOnBarStart - send command ///${sequneceIdx} as ${bar.stemsToggle_StartOfBar[v]}//// from [${this.trackData.name}] ${this.trackIndex}`, JSON.stringify(bar.stemsToggle_StartOfBar), JSON.stringify(sequenceIndices));\n\n // Note: the bar trigger might be another sequenceIdx\n const barToSubmit = this.sequences![sequenceIdx].segments.find((c, index) => chunkIdx === index);\n if (barToSubmit) {\n AEV3Controller.getInstance().toggleStemSelectionBasedOnSeedFromStemSwitching(\n sequenceIdx,\n bar.stemsToggle_StartOfBar[Number(v)],\n this.trackIndex ?? 0,\n barToSubmit,\n );\n } else {\n console.error('applyStemSwitchingOnBarStart failed.', sequenceIdx, bar);\n }\n });\n }\n }\n // reset it after usage\n bar.stemsToggle_StartOfBar = {};\n }\n\n // the following function only trigger when S2 OR M2 (actual segment) starts playing\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n restoreStemProfileOnBarStart(lastBarStartPlayingOnThisIndex: IBarSequenceChunk, chunkIdx: number, invertStems: boolean) {\n // const bar = lastBarStartPlayingOnThisIndex;\n\n if (this.trackIndex !== 1) {\n AEV3Controller.getInstance().resumeStemProfileBeforeSwitching(invertStems);\n }\n }\n\n // Note this function is follow up of Master Bar starts play something\n // it does not further fire event to trigger other action\n triggererOnlyIfFourStemResolved(\n currentChunk: IBarSequenceChunk,\n currentSequenceIdx: number,\n internalSpeedFromBufferPlayerProcessor: {\n speedRatio_SeedMixMatching_Resolved: number;\n isPlayingQuantisedAs: 'quantised' | 'seed' | 'mix';\n playbackRate: number;\n speedRatio_ManualScheduling: number;\n },\n ) {\n const isAllPlayingSameChunkIdx = this.isAllSourcePlayingSameChunkIdx();\n if (!isAllPlayingSameChunkIdx) {\n return;\n }\n\n const chunkIdx = this.sequences![currentSequenceIdx].segments.findIndex((c) => c.chunkId === currentChunk.chunkId);\n\n // consoleColorfulMessage4Lawful(`[triggererOnlyIfFourStemResolved - from-buffer-processor-event-bufferStarted (trackIndex-${this.trackIndex}-${chunkIdx})]`, '#18fef3ff', '#c6db08ff', 9, 'βΎοΈ');\n\n // only trigger if all of the currentSequenceIdx resolved\n\n // Update this BarSequence's Parameters according to the signature of the master baer sequence\n const updateSelfTrackDataGeneticsWhenMasterBarSeqPlays = (currentChunk: IBarSequenceChunk) => {\n if (currentChunk.updateSelfTrackData === true) {\n this._log(`%cMasterBarSequence:: Editing of the genetic signature of Bar`, this);\n\n // update the trackData etc\n const geneticSignature = currentChunk.geneticSignatureForThisMasterBarSegment;\n if (!geneticSignature) {\n return;\n }\n this.trackData = geneticSignature.trackData;\n this.targetKey = geneticSignature.targetKey;\n this.targetBarLength48000 = geneticSignature.targetBarLength48000;\n this.targetTonality = geneticSignature.targetTonality;\n this.ratioWhenComposingBar = geneticSignature.ratioWhenComposingBar;\n this.barIndexStart = geneticSignature.barIndexStart;\n this.barIndexEnd = geneticSignature.barIndexEnd;\n\n // the correct pitch set for first bar\n this.pitchShift = currentChunk.pitchCorrectionSemitones_SeedIsPlayingAsUnquantised; // bug - this should be based on what is currently in use\n }\n };\n\n const getPitchSemitonesForChunk = (\n chunk: IBarSequenceChunk,\n playingAs: 'quantised' | 'seed' | 'mix',\n ): number => {\n if (playingAs === 'quantised') return chunk.pitchCorrectionSemitones_SeedMixMatching;\n if (playingAs === 'seed') return chunk.pitchCorrectionSemitones_SeedIsPlayingAsUnquantised;\n return chunk.pitchCorrectionSemitones_MixIsPlayingAsUnquantised;\n };\n\n const getSpeedRatioForChunk = (\n chunk: IBarSequenceChunk,\n playingAs: 'quantised' | 'seed' | 'mix',\n ): number => {\n if (playingAs === 'quantised') return chunk.speedRatio_SeedMixMatching;\n if (playingAs === 'seed') return chunk.speedRatio_SeedMixMatching_SeedIsPlayingAsUnquantised;\n return chunk.speedRatio_SeedMixMatching_MixIsPlayingAsUnquantised;\n };\n\n const sendPitchShiftCommandWhenNewBarPlaysOnAllSeq = (\n currentChunk: IBarSequenceChunk,\n internalSpeedFromBufferPlayerProcessor: {\n speedRatio_SeedMixMatching_Resolved: number;\n isPlayingQuantisedAs: 'quantised' | 'seed' | 'mix';\n playbackRate: number;\n speedRatio_ManualScheduling: number;\n },\n ) => {\n this._interpActive = false;\n\n if (!currentChunk.isTransitionalBar && currentChunk.updateCurrentTrackIfThisMasterBarSegmentPlays === true) {\n // not transitional bar , start of master bar segment\n // Note this must be after genetics updated\n sendInitPitchShiftCommandToWorklet(this.pitchShift, this.trackIndex ?? 0);\n } else if (currentChunk.isTransitionalBar === true) {\n // is a starting point of transitional bar\n // do something at starting of every transitional bar\n const { playbackRate, speedRatio_SeedMixMatching_Resolved, speedRatio_ManualScheduling } = internalSpeedFromBufferPlayerProcessor;\n const finalSpeed = playbackRate * speedRatio_SeedMixMatching_Resolved * speedRatio_ManualScheduling;\n const valueToWorklet = 1 / finalSpeed;\n sendPitchShiftToWorkletWithTrackLabel(valueToWorklet, this.getPitchShiftNode(), 'sendPitchShiftCommandWhenNewBarPlaysOnAllSeq(currentChunk.isTransitionalBar === true)');\n } else if (COMPENSATE_PITCH_SHIFT_PER_BAR) {\n const { isPlayingQuantisedAs } = internalSpeedFromBufferPlayerProcessor;\n const trackType = this.trackIndex === 0 ? 'seed1' : 'mix1';\n const currentSemitones = getPitchSemitonesForChunk(currentChunk, isPlayingQuantisedAs);\n\n // Set up interpolation toward the next bar's pitch+speed correction\n const currentSpeed = getSpeedRatioForChunk(currentChunk, isPlayingQuantisedAs);\n let nextSemitones: number | null = null;\n let nextSpeed: number | null = null;\n let debugInfo = '';\n const seqCount = this.sequences?.length ?? 0;\n for (let si = 0; si < seqCount; si++) {\n const seq = this.sequences![si];\n const currentIdx = seq.segments.findIndex((c) => c.chunkId === currentChunk.chunkId);\n if (currentIdx < 0) continue;\n const nextChunk = seq.segments[currentIdx + 1];\n debugInfo = `seq=${si} idx=${currentIdx}/${seq.segments.length} next=${!!nextChunk}`;\n if (nextChunk) {\n nextSemitones = getPitchSemitonesForChunk(nextChunk, isPlayingQuantisedAs);\n nextSpeed = getSpeedRatioForChunk(nextChunk, isPlayingQuantisedAs);\n const speedDelta = Math.abs(nextSpeed - currentSpeed);\n if (speedDelta >= 0.0001) {\n this._speedFrom = currentSpeed;\n this._speedTo = nextSpeed;\n this._interpActive = true;\n\n const bufferNodes = this.getBufferPlayerNodes();\n if (bufferNodes) {\n for (let i = 0; i < bufferNodes.length; i++) {\n bufferNodes[i].port.postMessage({\n type: 'to-buffer-processor-event-set-speed-interp',\n fromSpeed: currentSpeed,\n toSpeed: nextSpeed,\n });\n }\n }\n }\n }\n break;\n }\n\n // Pitch = exact inverse of speed. This ensures perfect cancellation.\n const workletValue = 1 / currentSpeed;\n sendPitchShiftToWorkletWithTrackLabel(workletValue, this.getPitchShiftNode(), trackType);\n\n console.log(\n `%c[Bar Pitch] ${trackType} | ${isPlayingQuantisedAs}` +\n ` | speed=${currentSpeed.toFixed(4)} β pitch=1/spd=${workletValue.toFixed(4)}` +\n ` | ${debugInfo}` +\n (this._interpActive\n ? ` | interpβspd=${nextSpeed?.toFixed(4)} (8 steps)`\n : ' | no interp'),\n this._interpActive ? 'color: #fbbf24' : 'color: #81c784',\n );\n }\n };\n\n const cleanMemory = (currentChunk: IBarSequenceChunk) => {\n if (currentChunk.updateCurrentTrackIfThisMasterBarSegmentPlays === true) {\n this.sequences!.forEach((s) => {\n const chunkIdx = s.segments.findIndex((c) => c.chunkId === currentChunk?.chunkId);\n if (chunkIdx > 0) {\n // Requirement: decouple all the usage of the chunkIdx\n // make sure they are evicted\n this.evictAudioBufferOnAllSequencesWithBarIndex(0, chunkIdx - 1);\n s.segments.forEach((c, i) => {\n if (i <= chunkIdx - 1) {\n // c.decoded = null;\n // c.originalBar = null;\n }\n });\n }\n });\n\n // get a list of trackId ahead\n }\n if (currentChunk.updateCurrentMixMetaIfThisMasterBarSegmentPlays === true) {\n AEV3Controller.getInstance().cleanupMemory();\n }\n };\n\n const toggleTrackGainsAtTransition = (isTransitionalBar: boolean) => {\n if (isTransitionalBar) {\n // specical treatment for transition bars on Classic mode\n if (this.trackIndex !== 1) {\n // depend on playMode toggle the transtems\n\n // override the track's gainNodes of mix pipeline\n const gSeed = AEV3Controller.getInstance().getTrackGainNodeWithTrackType('seed1')?.gain;\n const gMix = AEV3Controller.getInstance().getTrackGainNodeWithTrackType('mix1')?.gain;\n if (gSeed) gSeed.value = 1;\n if (gMix) gMix.value = 1;\n }\n } else {\n // S2/M2 plays\n if (this.trackIndex !== 1) {\n // depend on playMode toggle the transtems\n const gSeed = AEV3Controller.getInstance().getTrackGainNodeWithTrackType('seed1')?.gain;\n const gMix = AEV3Controller.getInstance().getTrackGainNodeWithTrackType('mix1')?.gain;\n if (AEV3Controller.getInstance().getPlayMode() === PLAY_MODE_CLASSIC) {\n // enforce the track's gainNodes of mix pipeline\n if (gSeed) gSeed.value = 1;\n if (gMix) gMix.value = 0;\n } else {\n if (gSeed) gSeed.value = 1;\n if (gMix) gMix.value = 1;\n }\n }\n }\n };\n\n // for s2/m2\n if (currentChunk.swapTrackIndex0_n_1 === true) {\n this._log(`%c******\\n * MasterBarSequence:: masterBarPlaybackTriggererOnlyIfFourStemResolved`, 'color: yellowgreen; background: black', this.trackIndex);\n\n // required before swapping of track\n this.isTransitionTrack = currentChunk.isTransitionalBar;\n _tempSwapTheAudioPipelineForMasterBar(this.uuid); // guarded by isSwappingSeedMix\n // work on this\n this.applyStemSwitchingOnBarStart(currentChunk, chunkIdx);\n this.restoreStemProfileOnBarStart(currentChunk, chunkIdx, true);\n\n toggleTrackGainsAtTransition(false);\n\n // only trigger this after index swap finished\n\n // both Bars has to wait until AEV3Controller.getInstance().isSwappingSeedMix is false\n // if need to use getBarSequenceWithType()\n updateSelfTrackDataGeneticsWhenMasterBarSeqPlays(currentChunk); // no getBarWithTypeId ops\n AEV3Controller.getInstance().updateCurrentTrackWhenMasterBarSeqPlays(currentChunk, this.trackIndex ?? 0);\n AEV3Controller.getInstance().updateCurrentOptionalTrackObjWhenMasterBarSeqPlays(currentChunk, this.trackIndex ?? 0);\n\n sendPitchShiftCommandWhenNewBarPlaysOnAllSeq(currentChunk, internalSpeedFromBufferPlayerProcessor); // no getBarWithTypeId ops\n cleanMemory(currentChunk); // no getBarWithTypeId ops\n } else {\n // for s1/s2\n // think even normal segment plays here?\n\n this.isTransitionTrack = currentChunk.isTransitionalBar;\n // work on this\n this.applyStemSwitchingOnBarStart(currentChunk, chunkIdx);\n toggleTrackGainsAtTransition(currentChunk.isTransitionalBar);\n // both Bars has to wait until AEV3Controller.getInstance().isSwappingSeedMix is false\n // if need to use getBarSequenceWithType()\n updateSelfTrackDataGeneticsWhenMasterBarSeqPlays(currentChunk); // no getBarWithTypeId ops\n AEV3Controller.getInstance().updateCurrentTrackWhenMasterBarSeqPlays(currentChunk, this.trackIndex ?? 0);\n AEV3Controller.getInstance().updateCurrentOptionalTrackObjWhenMasterBarSeqPlays(currentChunk, this.trackIndex ?? 0);\n\n sendPitchShiftCommandWhenNewBarPlaysOnAllSeq(currentChunk, internalSpeedFromBufferPlayerProcessor); // no getBarWithTypeId ops\n cleanMemory(currentChunk); // no getBarWithTypeId ops\n }\n\n //\n\n // send pitch shfit command\n // 0.5 ~ 2\n // BarSequence.BAR_STARTS_PLAYING\n }\n\n /**\n * return Major trackId of this Bar Sequence\n */\n getAudioSourceSequence(trackId?: string): AudioSourceSequence {\n const _trackId = trackId || this.trackData?.trackId;\n return AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(_trackId)!;\n }\n\n /**\n * get all trackId in this Bar Sequences\n */\n getAllTrackIdsInSequences(): string[] {\n if (!this.sequences?.length) {\n return [];\n }\n const trackIds = this.sequences.map((seq) => {\n return seq.segments.map((c) => {\n return c?.originalBar?.trackId || '';\n });\n });\n // this._log(trackIds);\n const result: string[] = [...new Set(trackIds.flat(Infinity) as string[])];\n return result.filter((r) => r !== '');\n }\n\n getAllTrackIdsInSequencesWithThreshold(): string[] {\n if (!this.sequences?.length) {\n return [];\n }\n const currentChunkIdx = this.getMinimumPlayingIndex() || 0;\n\n const trackIds = this.sequences.map((seq) => {\n return seq.segments.map((c, chunkIdx) => {\n if (currentChunkIdx > chunkIdx) return '';\n return c?.originalBar?.trackId || '';\n });\n });\n // this._log(trackIds);\n const result: string[] = [...new Set(trackIds.flat(Infinity) as string[])];\n return result.filter((r) => r !== '');\n }\n\n /**\n * get information of current segment of track playing based on the TrackId of current originalBar\n * if current trackId of the bar playing is abcde, this will return information of this segment on the sequence\n *\n */\n // in use\n getEstimatedSamplePlayedOnCurrentSegment(ignoreTransitionZoneChange: boolean) {\n // based on sourcePlaying and segments array\n const stemsPlaying = this.getPlayingChunks();\n const trackId = stemsPlaying?.[0]?.originalBar?.trackId || '';\n const sampleStartOfCurrentBar = stemsPlaying?.[0]?.originalBar?.sampleStart || 0;\n\n // this.sourcePlaying and the context time\n const markedContextTime = this.sourcePlaying?.[0]?.contextTime || 0;\n const currentContextTime = this.aev3Context?.audioContext?.currentTime || 0;\n\n // note this is estimate since it is no point to fire event from buffer-player-processor on every sample played\n let estimatedSamplePlayedFromSampleStart = -1;\n if (this.globalPlaybackRate > 0) {\n estimatedSamplePlayedFromSampleStart = Math.round(((currentContextTime - markedContextTime) / this.globalPlaybackRate) * 48000);\n }\n return {\n trackId,\n // markedContextTime,\n // currentContextTime,\n sampleStartOfCurrentBar,\n // timeElipsedOnCurrentBar: currentContextTime - markedContextTime,\n firstSampleOfCurrentSegment: this.getFirstSampleOfCurrentSegmentPlaying(ignoreTransitionZoneChange),\n estimatedSamplePlaying: sampleStartOfCurrentBar + estimatedSamplePlayedFromSampleStart,\n };\n }\n\n /**\n * ride on the trackId of current bar playing\n * find out the starting sample of this segment\n *\n * e.g.\n * [ TrackId 1 12800 - 38400 ] [ TrackId 2] [ TrackId 1 245000 - 2450810 ]\n * ^ If current bar playing is here, return 245000\n */\n // in use\n getFirstSampleOfCurrentSegmentPlaying(ignoreTransitionZoneChange: boolean) {\n // based on sourcePlaying\n const stemsPlaying = this.getPlayingChunks();\n const barPlaying = this.getPlayingChunksInfo();\n const trackId = stemsPlaying?.[0]?.originalBar?.trackId || '';\n const chunkIdx = barPlaying?.[0]?.chunkIdx;\n\n try {\n if (trackId) {\n // loop back find last item with same trackId\n const segs = this.sequences![0].segments as SegmentsWithOriginalBar;\n const startingChunkIdx = startIndexOfThisSegment(segs, chunkIdx ?? 0, ignoreTransitionZoneChange);\n return this.sequences?.[0]?.segments[startingChunkIdx]?.originalBar?.sampleStart ?? 0;\n }\n return 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n return 0;\n }\n }\n\n /**\n * Get the segment information of the current bar sequence playing\n * refer to the graph `Post-Intelliskip Era Bars alignment at Continue-Playback`\n * https://www.figma.com/board/H6cJFjmJDqifOyxu3hyxbr/Audio-Engine-v3?node-id=2708-13286&t=s15UIWUHktRutmmS-4\n *\n * Value with T1 prefix is the segmentIdx of area covered in former transition (not eq to Bar Index as during alignment it might be chopped or combined)\n * Value with S_ prefix is the segmentIdx of area covered by startingIndex and endingIndex of a segment, note the endingIndex is covering the T2_, besides the segmentIdxStart of S_ might be shifted a bit to the left according to SPECIAL CASE in the figma\n * Value with T2 prefix is the area which the track is used as transition to next Mix\n *\n * the startingSegmentIdx_fromSegmentConfig is a experimental value that when a Track is used as SPECIAL CASE, it will try to revive the startingIndex of a segment, which is useful on the scrubber handler\n * @param segmentIdx: number\n * @returns {{\n * t1_exists: boolean;\n * startingSegmentIdx_fromSegmentConfig: number;\n * t1_segmentIdxStart: number;\n * t1_segmentIdxEnd: number;\n * s_segmentIdxStart: number;\n * s_segmentIdxEnd: number;\n * t2_exists: boolean;\n * t2_segmentIdxStart: number;\n * t2_segmentIdxEnd: number;\n * }}\n */\n // upgraded\n getChunkIndexOfCurrentSegment(chunkIdx: number): {\n // formerTransitionStart: number,\n // actualSegmentStart: number,\n // segmentIdxBeforeTransition: number,\n // transitionStart: number | 'no transition',\n // actualSegmentEnd: number,\n\n // updated: Refer to `Post-Intelliskip Era Bars alignment at Continue-Playback`\n\n // T1_, is the transition that when a track is used as S2 in S1/S2\n t1_exists: boolean;\n startingSegmentIdx_fromSegmentConfig: number;\n t1_segmentIdxStart: number;\n t1_segmentIdxEnd: number;\n // S_ is the Segment that when Track is start playing exited the transition of S1/S2\n s_segmentIdxStart: number; // should be eq to startingBarIndex, except for case that startingIndex = 0, Special Case in the Figma\n s_segmentIdxEnd: number;\n // T2, when the track start to transit and fade out and using as S1 in S1/S2\n t2_exists: boolean;\n t2_segmentIdxStart: number;\n t2_segmentIdxEnd: number; // should be eq or less than endingBarIndex (half or 1 bar depending on the BPM ratio between S1/S2)\n } {\n // based on sourcePlaying\n // const targetSegment = this.getPlayingChunks();\n // const barPlaying = this.getPlayingChunksInfo();\n const targetSegment = this.sequences?.[0]?.segments?.[chunkIdx];\n const trackId = targetSegment?.originalBar?.trackId || '';\n // const chunkIdx = barPlaying?.[0]?.chunkIdx;\n\n consoleColorfulMessage(`getChunkIndexOfCurrentSegment() triggered while it is ${targetSegment?.isTransitionalBar ? 'Transition' : 'NON-transition'}`);\n\n try {\n if (trackId) {\n const segs0 = this.sequences![0].segments as SegmentsWithOriginalBar;\n // loop back find last item with same trackId\n const startingSegmentIdx = startIndexOfThisSegmentCover1Transtion(segs0, chunkIdx);\n const startingSegmentIdx_fromSegmentConfig = searchSegmentIdxBackwards(\n segs0 as SegmentsForSearchSegmentIdxBackwards,\n startingSegmentIdx,\n this.barIndexStart,\n trackId,\n );\n // const startingSegmentIdx_fromSegmentConfig = startingSegmentIdx;//searchSegmentIdxBackwards(this.sequences[0].segments, startingSegmentIdx, this.trackData.segmentInfo['normal'].startingBarIndex, this.trackData.trackId);\n const endingSegmentIdx = endIndexOfThisSegmentCover1Transtion(segs0, chunkIdx);\n\n const segmentHasStartingTransition = this.sequences![0].segments[startingSegmentIdx].isTransitionalBar;\n const actualStartIndex = !segmentHasStartingTransition ? startingSegmentIdx : endIndexOfThisSegmentBeforeTransitionEnds(segs0, startingSegmentIdx) + 1;\n\n const segmentHasEndingTransition = this.sequences![0].segments[endingSegmentIdx].isTransitionalBar;\n\n const actualSegmentEnd = endingSegmentIdx;\n\n const segmentIdxBeforeTransition = !segmentHasEndingTransition ? actualSegmentEnd : endIndexOfThisSegmentBeforeTransitionStarts(segs0, actualStartIndex);\n const result: {\n // formerTransitionStart: number,\n // actualSegmentStart: number,\n // segmentIdxBeforeTransition: number,\n // transitionStart: number | 'no transition',\n // actualSegmentEnd: number,\n\n // updated: Refer to `Post-Intelliskip Era Bars alignment at Continue-Playback`\n t1_exists: boolean;\n startingSegmentIdx_fromSegmentConfig: number;\n t1_segmentIdxStart: number;\n t1_segmentIdxEnd: number;\n s_segmentIdxStart: number; // should be eq to startingBarIndex\n s_segmentIdxEnd: number;\n t2_exists: boolean;\n t2_segmentIdxStart: number;\n t2_segmentIdxEnd: number; // should be eq or less than endingBarIndex (half or 1 bar depending on the BPM ratio between S1/S2)\n } = {\n // formerTransitionStart: startingSegmentIdx,\n // actualSegmentStart: actualStartIndex, // first sample is segment start beat index\n // segmentIdxBeforeTransition: segmentIdxBeforeTransition,\n // transitionStart: segmentIdxBeforeTransition === actualSegmentEnd ? 'no transition' : segmentIdxBeforeTransition+1,\n // actualSegmentEnd: actualSegmentEnd, // last segment's beat index\n\n t1_exists: segmentHasStartingTransition,\n startingSegmentIdx_fromSegmentConfig: startingSegmentIdx_fromSegmentConfig,\n t1_segmentIdxStart: startingSegmentIdx,\n t1_segmentIdxEnd: !segmentHasStartingTransition ? -1 : actualStartIndex - 1,\n s_segmentIdxStart: actualStartIndex, // should be eq to startingBarIndex\n s_segmentIdxEnd: actualSegmentEnd,\n t2_exists: segmentHasEndingTransition,\n t2_segmentIdxStart: !segmentHasEndingTransition ? -1 : segmentIdxBeforeTransition + 1,\n t2_segmentIdxEnd: actualSegmentEnd, // should be eq or less than endingBarIndex (half or 1 bar depending on the BPM ratio between S1/S2)\n };\n\n this._log_table(result);\n return result;\n }\n return {\n // formerTransitionStart: -1,\n // actualSegmentStart: -1, // first sample is segment start beat index\n // segmentIdxBeforeTransition: -1,\n // transitionStart: -1,\n // actualSegmentEnd: -1, // last segment's beat index\n\n t1_exists: false,\n startingSegmentIdx_fromSegmentConfig: -1,\n t1_segmentIdxStart: -1,\n t1_segmentIdxEnd: -1,\n s_segmentIdxStart: -1,\n s_segmentIdxEnd: -1,\n t2_exists: false,\n t2_segmentIdxStart: -1,\n t2_segmentIdxEnd: -1,\n };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n return {\n // formerTransitionStart: -1,\n // actualSegmentStart: -1, // first sample is segment start beat index\n // segmentIdxBeforeTransition: -1,\n // transitionStart: -1,\n // actualSegmentEnd: -1, // last segment's beat index\n\n t1_exists: false,\n startingSegmentIdx_fromSegmentConfig: -1,\n t1_segmentIdxStart: -1,\n t1_segmentIdxEnd: -1,\n s_segmentIdxStart: -1,\n s_segmentIdxEnd: -1,\n t2_exists: false,\n t2_segmentIdxStart: -1,\n t2_segmentIdxEnd: -1,\n };\n }\n\n // return {\n // formerTransitionStart: -1,\n // actualSegmentStart: -1, // first sample is segment start beat index\n // comingTransitionStart: -1,\n // actualSegmentEnd: -1, // last segment's beat index\n // }\n }\n\n /**\n * Get the segment information of the current bar sequence playing\n * refer to the graph `Post-Intelliskip Era Bars alignment at Continue-Playback`\n * https://www.figma.com/board/H6cJFjmJDqifOyxu3hyxbr/Audio-Engine-v3?node-id=2708-13286&t=s15UIWUHktRutmmS-4\n *\n * Value with T1 prefix is the segmentIdx of area covered in former transition (not eq to Bar Index as during alignment it might be chopped or combined)\n * Value with S_ prefix is the segmentIdx of area covered by startingIndex and endingIndex of a segment, note the endingIndex is covering the T2_, besides the segmentIdxStart of S_ might be shifted a bit to the left according to SPECIAL CASE in the figma\n * Value with T2 prefix is the area which the track is used as transition to next Mix\n *\n * the startingSegmentIdx_fromSegmentConfig is a experimental value that when a Track is used as SPECIAL CASE, it will try to revive the startingIndex of a segment, which is useful on the scrubber handler\n * @param segmentIdx: number\n * @returns {{\n * t1_exists: boolean;\n * startingSegmentIdx_fromSegmentConfig: number;\n * t1_segmentIdxStart: number;\n * t1_segmentIdxEnd: number;\n * s_segmentIdxStart: number;\n * s_segmentIdxEnd: number;\n * t2_exists: boolean;\n * t2_segmentIdxStart: number;\n * t2_segmentIdxEnd: number;\n * }}\n */\n // upgraded\n getChunkIndexOfCurrentSegmentPlaying(): {\n // formerTransitionStart: number,\n // actualSegmentStart: number,\n // segmentIdxBeforeTransition: number,\n // transitionStart: number | 'no transition',\n // actualSegmentEnd: number,\n\n // updated: Refer to `Post-Intelliskip Era Bars alignment at Continue-Playback`\n\n // T1_, is the transition that when a track is used as S2 in S1/S2\n t1_exists: boolean;\n startingSegmentIdx_fromSegmentConfig: number;\n t1_segmentIdxStart: number;\n t1_segmentIdxEnd: number;\n // S_ is the Segment that when Track is start playing exited the transition of S1/S2\n s_segmentIdxStart: number; // should be eq to startingBarIndex, except for case that startingIndex = 0, Special Case in the Figma\n s_segmentIdxEnd: number;\n // T2, when the track start to transit and fade out and using as S1 in S1/S2\n t2_exists: boolean;\n t2_segmentIdxStart: number;\n t2_segmentIdxEnd: number; // should be eq or less than endingBarIndex (half or 1 bar depending on the BPM ratio between S1/S2)\n } {\n // based on sourcePlaying\n const stemsPlaying = this.getPlayingChunks();\n const barPlaying = this.getPlayingChunksInfo();\n // const trackId = stemsPlaying?.[0]?.originalBar?.trackId || '';\n const chunkIdx = barPlaying?.[0]?.chunkIdx;\n\n // NOTE: require special treatment if this function is called within tranistion\n\n consoleColorfulMessage(`getChunkIndexOfCurrentSegmentPlaying() triggered while it is ${stemsPlaying?.[0]?.isTransitionalBar ? 'Transition' : 'NON-transition'}`);\n return this.getChunkIndexOfCurrentSegment(chunkIdx ?? 0);\n }\n\n getLastSampleOfCurrentSegmentPlaying_depreciated(beforeTranstion: boolean) {\n // based on sourcePlaying\n const stemsPlaying = this.getPlayingChunks();\n const barPlaying = this.getPlayingChunksInfo();\n const trackId = stemsPlaying?.[0]?.originalBar?.trackId || '';\n const chunkIdx = barPlaying?.[0]?.chunkIdx;\n\n try {\n if (trackId) {\n const segs0 = this.sequences![0].segments as SegmentsWithOriginalBar;\n // loop back find last item with same trackId\n if (!beforeTranstion) {\n const lastIndex = lastIndexOfThisSegmentIncludeTransition(segs0, chunkIdx ?? 0);\n return this.sequences?.[0]?.segments[lastIndex]?.originalBar?.sampleEnd ?? 0;\n } else {\n const lastIndex = lastIndexOfThisSegmentBeforeTransitionZone(segs0, chunkIdx ?? 0);\n return this.sequences?.[0]?.segments[lastIndex]?.originalBar?.sampleEnd ?? 0;\n }\n }\n return 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n return 0;\n }\n }\n\n getLastChunkIdxOfCurrentSegmentPlaying_depreciated(beforeTranstion: boolean) {\n // based on sourcePlaying\n const stemsPlaying = this.getPlayingChunks();\n const barPlaying = this.getPlayingChunksInfo();\n const trackId = stemsPlaying?.[0]?.originalBar?.trackId || '';\n const chunkIdx = barPlaying?.[0]?.chunkIdx;\n\n try {\n if (trackId) {\n const segs0 = this.sequences![0].segments as SegmentsWithOriginalBar;\n // loop back find last item with same trackId\n if (!beforeTranstion) {\n const lastIndex = lastIndexOfThisSegmentIncludeTransition(segs0, chunkIdx ?? 0);\n return lastIndex;\n } else {\n const lastIndex = lastIndexOfThisSegmentBeforeTransitionZone(segs0, chunkIdx ?? 0);\n return lastIndex;\n }\n }\n return -1;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n return -1;\n }\n }\n}\n\n// TODO on Bar Sequence\n// Limit the object created when buffer-player-processor send message back to main thread\n","import { AEV3Controller } from '../global-aev3-controller';\nimport { create } from 'zustand';\nimport { StemProfileString } from '../interface';\nimport { getStemProfileFromBoolean } from './stems-selection-store';\n\n// Or let it toggle and when initialise the AEV3Context pass the profile to it\nconst isActionAllowed = () => {\n if (!AEV3Controller.getInstance().aev3Context) {\n console.log('audio context not initialised yet');\n return false;\n }\n return true;\n}\n\n// Define the structure of the Zustand store\nexport interface AEV3StemsIsolatedStateStore {\n stem0Isolated: boolean;\n stem1Isolated: boolean;\n stem2Isolated: boolean;\n stem3Isolated: boolean;\n isolatedStems: number[];\n isIsolationMode: boolean;\n updateStem0Isolated: (isolated: boolean) => void;\n updateStem1Isolated: (isolated: boolean) => void;\n updateStem2Isolated: (isolated: boolean) => void;\n updateStem3Isolated: (isolated: boolean) => void;\n toggleStem0Isolated: () => void;\n toggleStem1Isolated: () => void;\n toggleStem2Isolated: () => void;\n toggleStem3Isolated: () => void;\n // resetIsolationAsFalse: () => void;\n};\n\nconst aev3StemsIsolatedStateStore = create<AEV3StemsIsolatedStateStore>((set) => {\n const updateIsIsolationMode = ( state: AEV3StemsIsolatedStateStore) => {\n const currentIsolatedStems = [];\n state.isIsolationMode = (state.stem0Isolated || state.stem1Isolated || state.stem2Isolated || state.stem3Isolated); \n if (state.isIsolationMode) {\n if (state.stem0Isolated) currentIsolatedStems.push(0);\n if (state.stem1Isolated) currentIsolatedStems.push(1);\n if (state.stem2Isolated) currentIsolatedStems.push(2);\n if (state.stem3Isolated) currentIsolatedStems.push(3);\n }\n state.isolatedStems = currentIsolatedStems;\n return state;\n }\n return {\n isolatedStems: [],\n stem0Isolated: false,\n stem1Isolated: false,\n stem2Isolated: false,\n stem3Isolated: false,\n isIsolationMode: false,\n updateStem0Isolated: (isolated: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem0Isolated = isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n updateStem1Isolated: (isolated: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem1Isolated = isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n updateStem2Isolated: (isolated: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem2Isolated = isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n updateStem3Isolated: (isolated: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem3Isolated = isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n toggleStem0Isolated: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem0Isolated = !state.stem0Isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n toggleStem1Isolated: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem1Isolated = !state.stem1Isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n toggleStem2Isolated: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem2Isolated = !state.stem2Isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n toggleStem3Isolated: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem3Isolated = !state.stem3Isolated;\n state = updateIsIsolationMode(state);\n return {...state};\n });\n },\n /*\n // no longer maintain this, it is taken care of at stems-master-state-store\n resetIsolationAsFalse: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n if (state.stem0Isolated || state.stem1Isolated || state.stem2Isolated || state.stem3Isolated || state.isIsolationMode) {\n state.stem0Isolated = state.stem1Isolated = state.stem2Isolated = state.stem3Isolated = state.isIsolationMode = false;\n return {...state};\n } else {\n return state;\n }\n });\n },\n */\n }\n});\n\nexport default aev3StemsIsolatedStateStore;\n\n\nexport const getCurrentIsolatedProfileBasedOnStore = (): StemProfileString => {\n const {\n stem0Isolated,\n stem1Isolated,\n stem2Isolated,\n stem3Isolated,\n } = aev3StemsIsolatedStateStore.getState();\n return getStemProfileFromBoolean(stem0Isolated, stem1Isolated, stem2Isolated, stem3Isolated);\n}\n\n","import { create } from 'zustand';\nimport { AEV3Controller } from '../global-aev3-controller';\nimport { StemProfileString } from '../interface';\nimport { getStemProfileFromBoolean } from './stems-selection-store';\n\n// Or let it toggle and when initialise the AEV3Context pass the profile to it\nconst isActionAllowed = () => {\n if (!AEV3Controller.getInstance().aev3Context) {\n console.log('audio context not initialised yet');\n return false;\n }\n return true;\n}\n\n// Define the structure of the Zustand store\nexport interface AEV3StemsMutedStateStore {\n stem0Muted: boolean;\n stem1Muted: boolean;\n stem2Muted: boolean;\n stem3Muted: boolean;\n updateStem0Muted: (muted: boolean) => void;\n updateStem1Muted: (muted: boolean) => void;\n updateStem2Muted: (muted: boolean) => void;\n updateStem3Muted: (muted: boolean) => void;\n toggleStem0Muted: () => void;\n toggleStem1Muted: () => void;\n toggleStem2Muted: () => void;\n toggleStem3Muted: () => void;\n};\n\nconst aev3StemsMutedStateStore = create<AEV3StemsMutedStateStore>((set) => {\n return {\n stem0Muted: false,\n stem1Muted: false,\n stem2Muted: false,\n stem3Muted: false,\n updateStem0Muted: (muted: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem0Muted = muted;\n return {...state};\n });\n },\n updateStem1Muted: (muted: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem1Muted = muted;\n return {...state};\n });\n },\n updateStem2Muted: (muted: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem2Muted = muted;\n return {...state};\n });\n },\n updateStem3Muted: (muted: boolean)=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem3Muted = muted;\n return {...state};\n });\n },\n toggleStem0Muted: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem0Muted = !state.stem0Muted;\n return {...state};\n });\n },\n toggleStem1Muted: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem1Muted = !state.stem1Muted;\n return {...state};\n });\n },\n toggleStem2Muted: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem2Muted = !state.stem2Muted;\n return {...state};\n });\n },\n toggleStem3Muted: ()=>{\n if (!isActionAllowed()) return;\n set((state) => {\n state.stem3Muted = !state.stem3Muted;\n return {...state};\n });\n },\n }\n});\n\nexport default aev3StemsMutedStateStore;\n\nexport const getCurrentMutedProfileBasedOnStore = (): StemProfileString => {\n const {\n stem0Muted,\n stem1Muted,\n stem2Muted,\n stem3Muted,\n } = aev3StemsMutedStateStore.getState();\n return getStemProfileFromBoolean(stem0Muted, stem1Muted, stem2Muted, stem3Muted);\n}\n","import {create} from 'zustand';\nimport { AEV3Controller } from '../global-aev3-controller';\nimport { StemProfileString } from '../interface';\n\ntype AEV3StemOpsTrackType = 'seed1' | 'mix1';\n\n// Define the structure of the Zustand store\nexport type AEV3StemVolumeStoreState = {\n id: AEV3StemOpsTrackType;\n stem0volume: number;\n stem1volume: number;\n stem2volume: number;\n stem3volume: number;\n updateStem0Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n updateStem1Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n updateStem2Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n updateStem3Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n};\n\nconst aev3SeedStemsVolumeStore = create<AEV3StemVolumeStoreState>((set) => {\n return {\n id: 'seed1',\n stem0volume: 1,\n stem1volume: 1,\n stem2volume: 1,\n stem3volume: 1,\n updateStem0Volume: (vol: number, applyToGainNodeDirectly: boolean = true)=>{\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 0, vol, false, false);\n }\n set((state) => {\n state.stem0volume = vol;\n return {...state};\n });\n },\n updateStem1Volume: (vol: number, applyToGainNodeDirectly: boolean = true)=>{\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 1, vol, false, false);\n }\n set((state) => {\n state.stem1volume = vol;\n return {...state};\n });\n },\n updateStem2Volume: (vol: number, applyToGainNodeDirectly: boolean = true)=>{\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 2, vol, false, false);\n }\n set((state) => {\n state.stem2volume = vol;\n return {...state};\n });\n },\n updateStem3Volume: (vol: number, applyToGainNodeDirectly: boolean = true)=>{\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 3, vol, false, false);\n }\n set((state) => {\n state.stem3volume = vol;\n return {...state};\n });\n },\n }\n});\n\n// Subscribe to AEV3Controller's event emitter to update Zustand store\n// However there is an error of circular references when the PrototypePanel/index is not loaded, \n// which only track-stems-controls are referring this, maybe because PrototypePanel is an exporting class?\n\n// hence disable this, besides UPDATE_STEM_VOLUME_STORE is not fired now\n\n/*\nAEV3Controller.getInstance().on(\n AEV3Controller.UPDATE_STEM_VOLUME_STORE,\n (event: IEventUpdateStemVolumeStore) => {\n switch(event.detail.trackType) {\n case 'seed1':\n switch(event.detail.sequenceIdx) {\n case 0:\n aev3SeedStemsVolumeStore.setState({ stem0volume: event.detail.expected });\n break;\n case 1:\n aev3SeedStemsVolumeStore.setState({ stem1volume: event.detail.expected });\n break;\n case 2:\n aev3SeedStemsVolumeStore.setState({ stem2volume: event.detail.expected });\n break;\n case 3:\n aev3SeedStemsVolumeStore.setState({ stem3volume: event.detail.expected });\n break;\n }\n break;\n case 'mix1':\n switch(event.detail.sequenceIdx) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n break;\n case 3:\n break;\n }\n break;\n case 'seed2':\n switch(event.detail.sequenceIdx) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n break;\n case 3:\n break;\n }\n break;\n }\n});\n*/\nexport default aev3SeedStemsVolumeStore;\n\n\n\n// this function is triggered before a playback started\n// when the gainNode is initialised, the default value is resolved within `getDefaultValue()`\n// of this file, and query string is taken into account as well\nexport const seedStemsVolumeToEnableWhenPlaybackStarts = (stemProfile: StemProfileString, volumeProfile: number[]) => {\n const {\n updateStem0Volume,\n updateStem1Volume,\n updateStem2Volume,\n updateStem3Volume,\n } = aev3SeedStemsVolumeStore.getState();\n\n // console.log(`%cseedStemToEnableWhenPlaybackStarts ${stemProfile}`, 'color: red;')\n const stem0 = stemProfile.indexOf('o')>-1 ? volumeProfile[0]: 0;\n const stem1 = stemProfile.indexOf('v')>-1 ? volumeProfile[1]: 0;\n const stem2 = stemProfile.indexOf('b')>-1 ? volumeProfile[2]: 0;\n const stem3 = stemProfile.indexOf('d')>-1 ? volumeProfile[3]: 0;\n updateStem0Volume(volumeProfile[0], false);\n updateStem1Volume(volumeProfile[1], false);\n updateStem2Volume(volumeProfile[2], false);\n updateStem3Volume(volumeProfile[3], false);\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 0, stem0, true, false);\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 1, stem1, true, false);\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 2, stem2, true, false);\n AEV3Controller.getInstance().changeStemVolumeNow('seed1', 3, stem3, true, false);\n // console.log('volume profile', stemProfile);\n // trigger the resolver even it is ...\n}\n\nexport const trackVolumeToEnableWhenPlaybackStarts = (enableTracks: 'seed' | 'mix' | 'both') => {\n switch(enableTracks) {\n case 'seed':\n if (AEV3Controller.getInstance().aev3Context?.trackGainNodes){\n AEV3Controller.getInstance().aev3Context.trackGainNodes[0].gain.value = 1;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[1].gain.value = 0;\n }\n break;\n case 'mix':\n if (AEV3Controller.getInstance().aev3Context?.trackGainNodes){\n AEV3Controller.getInstance().aev3Context.trackGainNodes[0].gain.value = 0;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[1].gain.value = 1;\n }\n break;\n case 'both':\n if (AEV3Controller.getInstance().aev3Context?.trackGainNodes){\n AEV3Controller.getInstance().aev3Context.trackGainNodes[0].gain.value = 1;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[1].gain.value = 1;\n }\n break;\n }\n}\n\nexport const fadeOutAllGainNodeAtTrackLevel = () => {\n \n try {\n if (AEV3Controller.getInstance().aev3Context?.trackGainNodes){\n AEV3Controller.getInstance().aev3Context.trackGainNodes[0].gain.value = 0;\n AEV3Controller.getInstance().aev3Context.trackGainNodes[1].gain.value = 0;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n }catch(err) {\n // do nothing\n }\n}\n\nexport const getSeedTrackStemVolumeProfileBasedOnStore = (): number[] => {\n const {\n stem0volume,\n stem1volume,\n stem2volume,\n stem3volume,\n } = aev3SeedStemsVolumeStore.getState();\n \n return [stem0volume, stem1volume, stem2volume, stem3volume];\n}","/**\n * Direct control by the sliders\n * It won't notify Master Store for stem toggle\n * \n * But the value will be used at the toggles of Master Store\n */\n\nimport { AEV3Controller } from '../global-aev3-controller';\nimport { create } from 'zustand';\nimport { StemProfileString } from '../interface';\n\ntype AEV3StemOpsTrackType = 'seed1' | 'mix1';\n\n// Define the structure of the Zustand store\ntype AEV3StemVolumeStoreState = {\n id: AEV3StemOpsTrackType;\n stem0volume: number;\n stem1volume: number;\n stem2volume: number;\n stem3volume: number;\n updateStem0Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n updateStem1Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n updateStem2Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n updateStem3Volume: (vol: number, applyToGainNodeDirectly: boolean) => void;\n};\n\nconst aev3MixStemsVolumeStore = create<AEV3StemVolumeStoreState>((set) => {\n return {\n id: 'mix1',\n stem0volume: 1,\n stem1volume: 1,\n stem2volume: 1,\n stem3volume: 1,\n updateStem0Volume: (vol: number, applyToGainNodeDirectly: boolean = true) => {\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 0, vol, false, false);\n }\n set((state) => {\n state.stem0volume = vol;\n return { ...state };\n });\n },\n updateStem1Volume: (vol: number, applyToGainNodeDirectly: boolean = true) => {\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 1, vol, false, false);\n }\n set((state) => {\n state.stem1volume = vol;\n return { ...state };\n });\n },\n updateStem2Volume: (vol: number, applyToGainNodeDirectly: boolean = true) => {\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 2, vol, false, false);\n }\n set((state) => {\n state.stem2volume = vol;\n return { ...state };\n });\n },\n updateStem3Volume: (vol: number, applyToGainNodeDirectly: boolean = true) => {\n if (applyToGainNodeDirectly) {\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 3, vol, false, false);\n }\n set((state) => {\n state.stem3volume = vol;\n return { ...state };\n });\n },\n }\n});\n/*\n// Subscribe to AEV3Controller's event emitter to update Zustand store\n// However there is an error of circular references when the PrototypePanel/index is not loaded, \n// which only track-stems-controls are referring this, maybe because PrototypePanel is an exporting class?\n\n// hence disable this, besides UPDATE_STEM_VOLUME_STORE is not fired now\n\nAEV3Controller.getInstance().on(\n AEV3Controller.UPDATE_STEM_VOLUME_STORE,\n (event: IEventUpdateStemVolumeStore) => {\n switch(event.detail.trackType) {\n case 'seed1':\n switch(event.detail.sequenceIdx) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n break;\n case 3:\n break;\n }\n break;\n case 'mix1':\n switch(event.detail.sequenceIdx) {\n case 0:\n aev3MixStemsVolumeStore.setState({ stem0volume: event.detail.expected });\n break;\n case 1:\n aev3MixStemsVolumeStore.setState({ stem1volume: event.detail.expected });\n break;\n case 2:\n aev3MixStemsVolumeStore.setState({ stem2volume: event.detail.expected });\n break;\n case 3:\n aev3MixStemsVolumeStore.setState({ stem3volume: event.detail.expected });\n break;\n }\n break;\n case 'seed2':\n switch(event.detail.sequenceIdx) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n break;\n case 3:\n break;\n }\n break;\n }\n});\n*/\nexport default aev3MixStemsVolumeStore;\n\n\n// this function is triggered before a playback started\n// when the gainNode is initialised, the default value is resolved within `getDefaultValue()`\n// of this file, and query string is taken into account as well\nexport const mixStemsVolumeToEnableWhenPlaybackStarts = (stemProfile: StemProfileString, volumeProfile: number[]) => {\n const {\n updateStem0Volume,\n updateStem1Volume,\n updateStem2Volume,\n updateStem3Volume,\n } = aev3MixStemsVolumeStore.getState();\n\n // console.log(`%cmixStemToEnableWhenPlaybackStarts ${stemProfile}`, 'color: red;')\n const stem0 = stemProfile.indexOf('o') > -1 ? 0 : volumeProfile[0];\n const stem1 = stemProfile.indexOf('v') > -1 ? 0 : volumeProfile[1];\n const stem2 = stemProfile.indexOf('b') > -1 ? 0 : volumeProfile[2];\n const stem3 = stemProfile.indexOf('d') > -1 ? 0 : volumeProfile[3];\n updateStem0Volume(volumeProfile[0], false);\n updateStem1Volume(volumeProfile[1], false);\n updateStem2Volume(volumeProfile[2], false);\n updateStem3Volume(volumeProfile[3], false);\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 0, stem0, true, false);\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 1, stem1, true, false);\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 2, stem2, true, false);\n AEV3Controller.getInstance().changeStemVolumeNow('mix1', 3, stem3, true, false);\n // console.log('volume profile', stemProfile);\n // trigger the resolver even it is ...\n}\n\nexport const getMixTrackStemVolumeProfileBasedOnStore = (): number[] => {\n const {\n stem0volume,\n stem1volume,\n stem2volume,\n stem3volume,\n } = aev3MixStemsVolumeStore.getState();\n\n return [stem0volume, stem1volume, stem2volume, stem3volume];\n}","// In separate file from stems-master-state-store to resolve circular dependency issue\n\nimport { AEV3Controller, IEventUpdateStemMasterStore } from '../global-aev3-controller';\nimport { aev3StemsMasterStateStore } from './stems-master-state-store';\nimport aev3StemsSelectedStateStore from './stems-selection-store';\n\nlet initialized = false;\n\n// Subscribe to AEV3Controller's event emitter to update Zustand store\n// why is this one ok - is it because of using derive-zustand?\nexport const initializeStemsMasterStateStore = () => {\n if (initialized) return;\n\n AEV3Controller.getInstance().on(\n AEV3Controller.UPDATE_STEM_MASTER_STORE_ON_TOGGLING,\n (event: IEventUpdateStemMasterStore) => {\n const {sequenceIdx, trackType, newVolume} = event.detail;\n const expectedStemTobeSelected: boolean = newVolume > 0;\n // since its always a mirror on this kind of event, we only take care of seed1\n if (trackType === 'seed1'){\n switch(sequenceIdx){\n case 0:\n if (expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem0Selected!=='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n } else if (!expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem0Selected==='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n }\n break;\n case 1:\n if (expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem1Selected!=='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n } else if (!expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem1Selected==='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n }\n break;\n case 2:\n if (expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem2Selected!=='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n } else if (!expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem2Selected==='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n }\n break;\n case 3:\n if (expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem3Selected!=='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n } else if (!expectedStemTobeSelected && aev3StemsSelectedStateStore.getState().stem3Selected==='seed1') {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch')\n }\n break;\n }\n }\n }\n );\n\n initialized = true;\n};","import { useStore } from 'zustand';\nimport { derive } from 'derive-zustand';\nimport { AEV3Controller } from '../global-aev3-controller';\nimport aev3StemsIsolatedStateStore from './stems-isolate-state-store';\nimport aev3StemsMutedStateStore from './stems-muted-state-store';\nimport aev3SeedStemsVolumeStore, { AEV3StemVolumeStoreState } from './seed-stems-volume-store';\nimport aev3StemsSelectedStateStore, { generateStemProfiles, getCurrentStemProfileBasedOnStore, getRandomisedStemProfile } from './stems-selection-store';\nimport aev3MixStemsVolumeStore from './mix-stems-volume-store';\nimport { initializeStemsMasterStateStore } from '@/stem-audio-engine-v3/store/stems-master-state-store-init';\nimport { StemSwithingSchedulerSignature, StemSwithingSchedulerSignatureLabel } from '../decode/types-interfaces';\nimport { consoleColorfulMessage4Lawful } from '../utils/colorConsole';\nimport { StemProfileString } from '../interface';\n\nconst getAlternateTrackType = (trackType: AEV3StemOpsTrackType): AEV3StemOpsTrackType => {\n return (trackType === 'mix1') ? 'seed1' : 'mix1';\n}\n\nconst ENABLE_CONSOLE_LOG = false;\n\n// Correct stem index mapping:\n// 0 = other\n// 1 = vocals\n// 2 = bass\n// 3 = drums\n\n//Default fade in and out to be used if no stem is specified\nconst DEFAULT_FADE_IN_DURATION = 0.02;\nconst DEFAULT_FADE_OUT_DURATION = 0.01;\n\n// Correct stem index mapping:\n// 0 = other\n// 1 = vocals \n// 2 = bass\n// 3 = drums\n\nconst FADE_IN_DURATION_OTHER = 0.2;\nconst FADE_OUT_DURATION_OTHER = 1.0;\n\nconst FADE_IN_DURATION_VOCAL = 0.1;\nconst FADE_OUT_DURATION_VOCAL = 1.0;\n\nconst FADE_IN_DURATION_BASS = 0.2;\nconst FADE_OUT_DURATION_BASS = 1.0;\n\nconst FADE_IN_DURATION_DRUMS = 0.01;\nconst FADE_OUT_DURATION_DRUMS = 0.01;\n\n// Fast isolation durations for instant feel\nconst FAST_ISOLATION_FADE_IN = 0.01; // 10ms - nearly instant\nconst FAST_ISOLATION_FADE_OUT = 0.02; // 20ms - very quick\n\nconst EMPTY_STRING = 'Master Stem Stroe';\n\nexport type DurationFlag = 'isolation' | 'normal-switch' | 'scheduled-switch(only-fired-from-bar-scheduler-at-start)';\nconst getFadeDuration = (stemIndex: number, isFadeIn: boolean, fadingFlagSignature: DurationFlag, optionalSignatureForScheduledSwitch?: StemSwithingSchedulerSignature): number => {\n const duration = (() => {\n switch (fadingFlagSignature) {\n case 'isolation':\n // Fast isolation fades for instant feel\n return isFadeIn ? FAST_ISOLATION_FADE_IN : FAST_ISOLATION_FADE_OUT;\n case 'normal-switch':\n switch(stemIndex) {\n case 0: // other\n return isFadeIn ? FADE_IN_DURATION_OTHER : FADE_OUT_DURATION_OTHER;\n case 1: // vocals\n return isFadeIn ? FADE_IN_DURATION_VOCAL : FADE_OUT_DURATION_VOCAL;\n case 2: // bass\n return isFadeIn ? FADE_IN_DURATION_BASS : FADE_OUT_DURATION_BASS;\n case 3: // drums\n return isFadeIn ? FADE_IN_DURATION_DRUMS : FADE_OUT_DURATION_DRUMS;\n default:\n return isFadeIn ? DEFAULT_FADE_IN_DURATION : DEFAULT_FADE_OUT_DURATION;\n }\n case 'scheduled-switch(only-fired-from-bar-scheduler-at-start)':\n // CAMUS: can based on optionalSignatureForScheduledSwitch do something\n\n // Check if this is a complete track transition (s2/m2)\n if (optionalSignatureForScheduledSwitch?.profileName === 'NM-s2/m2 (1)') {\n // INSTANT fades for complete track transitions - easier to test\n // if (ENABLE_CONSOLE_LOG) console.log('[FADE-DURATION] π USING INSTANT s2/m2 TRANSITION FADES for', optionalSignatureForScheduledSwitch);\n return isFadeIn ? DEFAULT_FADE_IN_DURATION : DEFAULT_FADE_OUT_DURATION; // Use default durations (0.02 in, 0.01 out)\n } else if (optionalSignatureForScheduledSwitch?.profileName === 'NM-s1/s2 (4)') {\n // INSTANT fades for complete track transitions - easier to test\n // if (ENABLE_CONSOLE_LOG) console.log('[FADE-DURATION] π USING INSTANT s2/m2 TRANSITION FADES for', optionalSignatureForScheduledSwitch);\n switch(stemIndex) {\n case 0: // other\n return isFadeIn ? 3 : 4;\n case 1: // vocals\n return isFadeIn ? 2 : 2;\n case 2: // bass\n return isFadeIn ? 0.1 : 0.2;\n case 3: // drums\n return isFadeIn ? 0.1 : 0.05;\n default:\n return isFadeIn ? DEFAULT_FADE_IN_DURATION : DEFAULT_FADE_OUT_DURATION;\n }\n } else if (optionalSignatureForScheduledSwitch?.profileName === 'IN-s2/m2 (1)') {\n // INSTANT fades for complete track transitions - easier to test\n // if (ENABLE_CONSOLE_LOG) console.log('[FADE-DURATION] π USING INSTANT s2/m2 TRANSITION FADES (intelli) for', optionalSignatureForScheduledSwitch);\n return isFadeIn ? DEFAULT_FADE_IN_DURATION : DEFAULT_FADE_OUT_DURATION; // Use default durations (0.02 in, 0.01 out)\n } else if (\n optionalSignatureForScheduledSwitch?.profileName != null &&\n ['IN-s1/s2 (1)', 'IN-s1/s2 (2)', 'IN-s1/s2 (3)', 'IN-s1/s2 (4)'].includes(optionalSignatureForScheduledSwitch.profileName)\n ) {\n // INSTANT fades for complete track transitions - easier to test\n // if (ENABLE_CONSOLE_LOG) console.log('[FADE-DURATION] π USING INSTANT s2/m2 TRANSITION FADES (intelli) for', optionalSignatureForScheduledSwitch);\n switch(stemIndex) {\n case 0: // other\n return isFadeIn ? 1 : 1;\n case 1: // vocals\n return isFadeIn ? 0.4 : 0.8;\n case 2: // bass\n return isFadeIn ? 0.1 : 0.2;\n case 3: // drums\n return isFadeIn ? 0.1 : 0.05;\n default:\n return isFadeIn ? DEFAULT_FADE_IN_DURATION : DEFAULT_FADE_OUT_DURATION;\n }\n } else {\n // Longer fades for gradual s1/s2 stem-by-stem transitions\n // if (ENABLE_CONSOLE_LOG) console.log('[FADE-DURATION] β³ Using s1/s2 gradual transition fade durations for', optionalSignatureForScheduledSwitch);\n switch(stemIndex) {\n case 0: // other\n return isFadeIn ? 3 : 4;\n case 1: // vocals\n return isFadeIn ? 2 : 2;\n case 2: // bass\n return isFadeIn ? 0.5 : 1;\n case 3: // drums\n return isFadeIn ? 0.2 : 0.1;\n default:\n return isFadeIn ? DEFAULT_FADE_IN_DURATION : DEFAULT_FADE_OUT_DURATION;\n }\n }\n }\n })();\n // if (ENABLE_CONSOLE_LOG) console.log(`[FADE-DURATION] stem ${stemIndex} isFadeIn: ${isFadeIn} flag: ${fadingFlagSignature} signature: ${optionalSignatureForScheduledSwitch} => ${duration}`);\n return duration;\n}\n\n//This specifies the latency on the button effectivley\nconst DELAY_ON_CROSS_FADE_BETWEEN_STEMS_SWITCHING = 0.02;\nconst APPLY_DELAY_ON_CROSS_FADE_EXCEPT_STEM_IDX = 3; // No delay for drums (index 3), 0 will be used\n\n/*s\n\nFADE DURATION\n V\n|--------|\n|\\ /|\n| \\ / |\n| \\ / | \n| \\ / |\n| \\ / |\n| \\ / |\n| /\\ |\n| / \\ |\n| / \\ |\n| / \\ |\n|---|\n ^\nDELAY_ON_CROSS_FADE_BETWEEN_STEMS_SWITCHING\n\nWe make the fade in and fade out equal in this case and control the overlap with a delay\n\n*/\n\n// const resolveStemVolLogic = (targetStemSelected: AEV3StemOpsTrackType, muteStore: AEV3StemsMutedStateStore, seedVol: AEV3StemVolumeStoreState, mixVol: AEV3StemVolumeStoreState) => {\n// applyStemVolLogicWithIsolation(targetStemSelected, [], muteStore, seedVol, mixVol);\n// }\n\nconst applyStemVolLogicWithIsolation = (\n currentIsolatedStems: number[],\n selectedStemsStore: {\n stem0Selected: AEV3StemOpsTrackType,\n stem1Selected: AEV3StemOpsTrackType,\n stem2Selected: AEV3StemOpsTrackType,\n stem3Selected: AEV3StemOpsTrackType,\n },\n muteStore: {\n stem0Muted: boolean,\n stem1Muted: boolean,\n stem2Muted: boolean,\n stem3Muted: boolean,\n },\n seedVol: AEV3StemVolumeStoreState,\n mixVol: AEV3StemVolumeStoreState,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n signature: string,\n ) => {\n const volumeProfileOf4SeedStem: {[key:number]: number} = [];\n const volumeProfileOf4MixStem: {[key:number]: number} = [];\n let seedMaxVol: number;\n let mixMaxVol: number;\n let targetStemSelected: AEV3StemOpsTrackType;\n let targetStemMuted: boolean;\n\n consoleColorfulMessage4Lawful(`applyStemVolLogicWithIsolation... ${currentIsolatedStems.join(',')} ${signature}`)\n if (ENABLE_CONSOLE_LOG) console.log('seedVol', seedVol);\n if (ENABLE_CONSOLE_LOG) console.log('mixVol', mixVol);\n \n for (let sequenceIdx=0; sequenceIdx<4; sequenceIdx++) {\n switch(sequenceIdx) {\n case 0:\n targetStemSelected = selectedStemsStore.stem0Selected;\n targetStemMuted = muteStore.stem0Muted;\n seedMaxVol = seedVol.stem0volume;\n mixMaxVol = mixVol.stem0volume;\n break;\n case 1:\n targetStemSelected = selectedStemsStore.stem1Selected;\n targetStemMuted = muteStore.stem1Muted;\n seedMaxVol = seedVol.stem1volume;\n mixMaxVol = mixVol.stem1volume;\n break;\n case 2:\n targetStemSelected = selectedStemsStore.stem2Selected;\n targetStemMuted = muteStore.stem2Muted;\n seedMaxVol = seedVol.stem2volume;\n mixMaxVol = mixVol.stem2volume;\n break;\n case 3:\n targetStemSelected = selectedStemsStore.stem3Selected;\n targetStemMuted = muteStore.stem3Muted;\n seedMaxVol = seedVol.stem3volume;\n mixMaxVol = mixVol.stem3volume;\n break;\n default:\n continue;\n }\n\n if (currentIsolatedStems.length>0) {\n if (currentIsolatedStems.includes(sequenceIdx)) {\n // this sequenceIdx is in isolation mode\n if (targetStemSelected==='mix1') {\n volumeProfileOf4SeedStem[sequenceIdx] = 0;\n volumeProfileOf4MixStem[sequenceIdx] = mixMaxVol;\n } else {\n volumeProfileOf4SeedStem[sequenceIdx] = seedMaxVol;\n volumeProfileOf4MixStem[sequenceIdx] = 0;\n }\n } else {\n // not in isolation mode, mute both\n volumeProfileOf4SeedStem[sequenceIdx] = 0;\n volumeProfileOf4MixStem[sequenceIdx] = 0;\n }\n } else {\n // this sequenceIdx is in isolation mode\n if (targetStemSelected==='mix1') {\n volumeProfileOf4SeedStem[sequenceIdx] = 0;\n volumeProfileOf4MixStem[sequenceIdx] = targetStemMuted ? 0 : mixMaxVol;\n } else {\n volumeProfileOf4SeedStem[sequenceIdx] = targetStemMuted ? 0 : seedMaxVol;\n volumeProfileOf4MixStem[sequenceIdx] = 0;\n }\n }\n }\n\n if (ENABLE_CONSOLE_LOG) console.log('stemProfile: profile to apply on 8 stems:');\n if (ENABLE_CONSOLE_LOG) console.log(volumeProfileOf4SeedStem);\n if (ENABLE_CONSOLE_LOG) console.log(volumeProfileOf4MixStem);\n \n const sharedStartTime = AEV3Controller.getInstance().aev3Context.audioContext.currentTime; // Immediate for isolation\n Object.values(volumeProfileOf4SeedStem).forEach((volume, index)=>{\n const duration = getFadeDuration(index, volume > 0, 'isolation');\n const delay = 0; // No delay for isolation - instant response\n AEV3Controller.getInstance().logToggleStemVol('seed1', index, volume, sharedStartTime+delay);\n AEV3Controller.getInstance().changeStemVolumeWithFade('seed1', index, volume, sharedStartTime+delay, false, false, duration);\n })\n Object.values(volumeProfileOf4MixStem).forEach((volume, index)=>{\n const duration = getFadeDuration(index, volume > 0, 'isolation');\n const delay = 0; // No delay for isolation - instant response\n AEV3Controller.getInstance().logToggleStemVol('mix1', index, volume, sharedStartTime+delay);\n AEV3Controller.getInstance().changeStemVolumeWithFade('mix1', index, volume, sharedStartTime+delay, false, false, duration);\n })\n}\n\nconst applyStemVolLogicNonIsolation = (targetStemSelected: AEV3StemOpsTrackType, sequenceIdx: number, targetStemMuted: boolean, seedMaxVol: number, mixMaxVol: number, fadingFlagSignature: 'normal-switch' | 'scheduled-switch(only-fired-from-bar-scheduler-at-start)', optionalSignatureForScheduledSwitch?: StemSwithingSchedulerSignature, audibleBarDuration?: number, signature?: string) => {\n if (targetStemMuted) {\n seedMaxVol = 0;\n mixMaxVol = 0;\n changeStemVol('seed1', 'mix1', sequenceIdx, seedMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, signature); // both off\n } else if (targetStemSelected === 'seed1') {\n mixMaxVol = 0;\n changeStemVol('seed1', 'mix1', sequenceIdx, seedMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, signature);\n } else if (targetStemSelected === 'mix1') {\n seedMaxVol = 0;\n changeStemVol('mix1', 'seed1', sequenceIdx, mixMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, signature);\n }\n}\n\nconst changeStemVol = (trackOn: AEV3StemOpsTrackType, trackOff: AEV3StemOpsTrackType, sequenceIdx: number, volume: number, fadingFlagSignature: 'normal-switch' | 'scheduled-switch(only-fired-from-bar-scheduler-at-start)', optionalSignatureForScheduledSwitch?: StemSwithingSchedulerSignature, audibleBarDuration?: number, signature?: string) => {\n if (!isActionAllowed()) return;\n const sharedStartTime = AEV3Controller.getInstance().aev3Context.audioContext.currentTime;\n\n if (\n optionalSignatureForScheduledSwitch?.profileName != null &&\n ['NM-s1/s2 (4)', 'IN-s1/s2 (4)'].includes(optionalSignatureForScheduledSwitch.profileName)\n ) {\n // note: I reckon have to deal with this: when durationIn and durationOut larger than audibleBarDuration\n if (ENABLE_CONSOLE_LOG) console.log('audibleBarDuration', audibleBarDuration);\n if (audibleBarDuration !== undefined) {\n const durationIn = getFadeDuration(sequenceIdx, true, fadingFlagSignature, optionalSignatureForScheduledSwitch);\n const durationOut = getFadeDuration(sequenceIdx, false, fadingFlagSignature, optionalSignatureForScheduledSwitch);\n AEV3Controller.getInstance().changeStemVolumeWithFade(trackOn, sequenceIdx, volume, sharedStartTime + audibleBarDuration - durationIn, false, false, durationIn);\n AEV3Controller.getInstance().changeStemVolumeWithFade(trackOff, sequenceIdx, 0, sharedStartTime + audibleBarDuration - durationOut, false, false, durationOut);\n return;\n } else {\n if (ENABLE_CONSOLE_LOG) console.error('changeStemVol skipped on s1/s2 (4) because audibleBarDuration is undefined');\n return;\n }\n }\n\n const durationIn = getFadeDuration(sequenceIdx, true, fadingFlagSignature, optionalSignatureForScheduledSwitch);\n const durationOut = getFadeDuration(sequenceIdx, false, fadingFlagSignature, optionalSignatureForScheduledSwitch);\n \n const delay = sequenceIdx === APPLY_DELAY_ON_CROSS_FADE_EXCEPT_STEM_IDX ? 0 : DELAY_ON_CROSS_FADE_BETWEEN_STEMS_SWITCHING; \n \n if (optionalSignatureForScheduledSwitch?.profileName === 'resume-profile') {\n //\n }\n \n AEV3Controller.getInstance().logToggleStemVol(trackOn, sequenceIdx, volume, sharedStartTime+delay);\n AEV3Controller.getInstance().changeStemVolumeWithFade(trackOn, sequenceIdx, volume, sharedStartTime+delay, false, false, durationIn);\n AEV3Controller.getInstance().logToggleStemVol(trackOff, sequenceIdx, 0, sharedStartTime+delay);\n AEV3Controller.getInstance().changeStemVolumeWithFade(trackOff, sequenceIdx, 0, sharedStartTime+delay, false, false, durationOut);\n}\n\ntype AEV3StemOpsTrackType = 'seed1' | 'mix1';\n\n// Or let it toggle and when initialise the AEV3Context pass the profile to it\nconst isActionAllowed = () => {\n if (!AEV3Controller.getInstance().aev3Context) {\n if (ENABLE_CONSOLE_LOG) console.log('audio context not initialised yet');\n return false;\n }\n return true;\n}\n\n// Define the structure of the Zustand store\nexport interface AEV3StemsMasterStateStore {\n toggleStemSelection: (sequenceIdx: number, fadingFlagSignature: 'normal-switch' | 'scheduled-switch(only-fired-from-bar-scheduler-at-start)', optionalSignatureForScheduledSwitch?: StemSwithingSchedulerSignature, audibleBarDuration?: number) => void;\n enforceStemSelectionOnSeed: (sequenceIdx: number, turnOn: boolean, signatureOfScheduler: StemSwithingSchedulerSignatureLabel, barAudibleDruation?: number) => void;\n enforceStemSelectionOnSeedByRetainedStemProfile: (stemProfile: StemProfileString) => void;\n invertStemSelectionOnSeedWithoutModifyVol: (signatureOfScheduler: string) => void;\n toggleStemMutedStatus: (sequenceIdx: number) => void;\n toggleStemIsolateStatus: (sequenceIdx: number) => void;\n quitIsolation: (signature: string) => void;\n changeStemMaxVolume: (sequenceIdx: number, maxVolume: number) => void;\n resolveStemVolumes: () => void;\n};\n\nexport const aev3StemsMasterStateStore = derive<AEV3StemsMasterStateStore>((get) => {\n const selectedStemsStore = get(aev3StemsSelectedStateStore);\n const isolateStore = get(aev3StemsIsolatedStateStore);\n const mutedStore = get(aev3StemsMutedStateStore);\n \n // get MAX volume from here:\n const seedVol = get(aev3SeedStemsVolumeStore);\n const mixVol = get(aev3MixStemsVolumeStore);\n\n initializeStemsMasterStateStore();\n \n // the Master stem status\n return {\n toggleStemSelection: (sequenceIdx: number, fadingFlagSignature: 'normal-switch' | 'scheduled-switch(only-fired-from-bar-scheduler-at-start)', optionalSignatureForScheduledSwitch?: StemSwithingSchedulerSignature, audibleBarDuration?: number) => {\n if (ENABLE_CONSOLE_LOG) console.log(`toggleStemSelection (${sequenceIdx})`)\n let targetStemSelected: AEV3StemOpsTrackType;\n let targetStemMuted: boolean;\n let currentIsolatedStems: number[];\n let seedMaxVol: number;\n let mixMaxVol: number;\n switch (sequenceIdx) {\n case 0:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${selectedStemsStore.stem0Selected}`);\n targetStemSelected = getAlternateTrackType(selectedStemsStore.stem0Selected);\n targetStemMuted = mutedStore.stem0Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem0volume;\n mixMaxVol = mixVol.stem0volume;\n \n // update the store:\n selectedStemsStore.toggleStem0Selected();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, {\n stem0Selected: targetStemSelected,\n stem1Selected: selectedStemsStore.stem1Selected,\n stem2Selected: selectedStemsStore.stem2Selected,\n stem3Selected: selectedStemsStore.stem3Selected,\n }, mutedStore, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n case 1:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${selectedStemsStore.stem1Selected}`);\n targetStemSelected = getAlternateTrackType(selectedStemsStore.stem1Selected);\n targetStemMuted = mutedStore.stem1Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem1volume;\n mixMaxVol = mixVol.stem1volume;\n \n // update the store:\n selectedStemsStore.toggleStem1Selected();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, {\n stem0Selected: selectedStemsStore.stem0Selected,\n stem1Selected: targetStemSelected,\n stem2Selected: selectedStemsStore.stem2Selected,\n stem3Selected: selectedStemsStore.stem3Selected,\n }, mutedStore, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n case 2:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${selectedStemsStore.stem2Selected}`);\n targetStemSelected = getAlternateTrackType(selectedStemsStore.stem2Selected);\n targetStemMuted = mutedStore.stem2Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem2volume;\n mixMaxVol = mixVol.stem2volume;\n \n // update the store:\n selectedStemsStore.toggleStem2Selected();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, {\n stem0Selected: selectedStemsStore.stem0Selected,\n stem1Selected: selectedStemsStore.stem1Selected,\n stem2Selected: targetStemSelected,\n stem3Selected: selectedStemsStore.stem3Selected,\n }, mutedStore, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n case 3:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${selectedStemsStore.stem3Selected}`);\n targetStemSelected = getAlternateTrackType(selectedStemsStore.stem3Selected);\n targetStemMuted = mutedStore.stem3Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem3volume;\n mixMaxVol = mixVol.stem3volume;\n \n // update the store:\n selectedStemsStore.toggleStem3Selected();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, fadingFlagSignature, optionalSignatureForScheduledSwitch, audibleBarDuration, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, {\n stem0Selected: selectedStemsStore.stem0Selected,\n stem1Selected: selectedStemsStore.stem1Selected,\n stem2Selected: selectedStemsStore.stem2Selected,\n stem3Selected: targetStemSelected,\n }, mutedStore, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n default:\n // if (ENABLE_CONSOLE_LOG) console.error('not correct stem id?', sequenceIdx);\n // debugger;\n break;\n }\n },\n enforceStemSelectionOnSeed: (sequenceIdx: number, turnOn: boolean, signatureOfScheduler: StemSwithingSchedulerSignatureLabel, barAudibleDruation?: number) => {\n const targetStemSelected = (() => {\n switch (sequenceIdx) {\n case 0: return selectedStemsStore.stem0Selected;\n case 1: return selectedStemsStore.stem1Selected;\n case 2: return selectedStemsStore.stem2Selected;\n case 3: return selectedStemsStore.stem3Selected;\n default: return selectedStemsStore.stem0Selected;\n }\n })();\n \n \n // Your logic check\n if (!!turnOn && targetStemSelected !== 'seed1'\n ||!turnOn && targetStemSelected === 'seed1'\n ) {\n // if (ENABLE_CONSOLE_LOG) console.log('debugToggleStem', bar);\n // if (ENABLE_CONSOLE_LOG) console.log(`%cdebugToggleStem CurrentSelected: ${sequenceIdx} - ${targetStemSelected}, goging to toggle`, 'color: red')\n get()?.toggleStemSelection(sequenceIdx, 'scheduled-switch(only-fired-from-bar-scheduler-at-start)', { profileName: signatureOfScheduler }, barAudibleDruation);\n } else {\n // if (ENABLE_CONSOLE_LOG) console.log('debugToggleStem', bar);\n // if (ENABLE_CONSOLE_LOG) console.log(`%cdebugToggleStem CurrentSelected: ${sequenceIdx} - ${targetStemSelected}, NO NEED to toggle`, 'color: purple')\n }\n },\n enforceStemSelectionOnSeedByRetainedStemProfile: (stemProfile: StemProfileString) => {\n if (stemProfile.indexOf('o')>-1) { get()?.enforceStemSelectionOnSeed(0, true, 'resume-profile') } else { get()?.enforceStemSelectionOnSeed(0, false, 'resume-profile');}\n if (stemProfile.indexOf('v')>-1) { get()?.enforceStemSelectionOnSeed(1, true, 'resume-profile') } else { get()?.enforceStemSelectionOnSeed(1, false, 'resume-profile');}\n if (stemProfile.indexOf('b')>-1) { get()?.enforceStemSelectionOnSeed(2, true, 'resume-profile') } else { get()?.enforceStemSelectionOnSeed(2, false, 'resume-profile');}\n if (stemProfile.indexOf('d')>-1) { get()?.enforceStemSelectionOnSeed(3, true, 'resume-profile') } else { get()?.enforceStemSelectionOnSeed(3, false, 'resume-profile');}\n if (ENABLE_CONSOLE_LOG) console.log(`restoreStemProfileExitingTransition: restore this profile actual implementation: [${stemProfile}]`);\n },\n invertStemSelectionOnSeedWithoutModifyVol: (_signatureOfScheduler: string) => {\n selectedStemsStore.toggleStem0Selected();\n selectedStemsStore.toggleStem1Selected();\n selectedStemsStore.toggleStem2Selected();\n selectedStemsStore.toggleStem3Selected();\n },\n toggleStemMutedStatus: (sequenceIdx: number) => {\n let targetStemSelected: AEV3StemOpsTrackType;\n let targetStemMuted: boolean;\n let currentIsolatedStems: number[];\n let seedMaxVol: number;\n let mixMaxVol: number;\n switch (sequenceIdx) {\n case 0:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${mutedStore.stem0Muted}`);\n targetStemSelected = selectedStemsStore.stem0Selected;\n targetStemMuted = !mutedStore.stem0Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem0volume;\n mixMaxVol = mixVol.stem0volume;\n \n // update the store:\n mutedStore.toggleStem0Muted();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, 'normal-switch', undefined, undefined, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, selectedStemsStore, {\n stem0Muted:targetStemMuted,\n stem1Muted: mutedStore.stem1Muted,\n stem2Muted: mutedStore.stem2Muted,\n stem3Muted: mutedStore.stem3Muted,\n }, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n case 1:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${mutedStore.stem1Muted}`);\n targetStemSelected = selectedStemsStore.stem1Selected;\n targetStemMuted = !mutedStore.stem1Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem1volume;\n mixMaxVol = mixVol.stem1volume;\n \n // update the store:\n mutedStore.toggleStem1Muted();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, 'normal-switch', undefined, undefined, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, selectedStemsStore, {\n stem0Muted: mutedStore.stem0Muted,\n stem1Muted: targetStemMuted,\n stem2Muted: mutedStore.stem2Muted,\n stem3Muted: mutedStore.stem3Muted,\n }, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n case 2:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${mutedStore.stem2Muted}`);\n targetStemSelected = selectedStemsStore.stem2Selected;\n targetStemMuted = !mutedStore.stem2Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem2volume;\n mixMaxVol = mixVol.stem2volume;\n \n // update the store:\n mutedStore.toggleStem2Muted();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, 'normal-switch', undefined, undefined, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, selectedStemsStore, {\n stem0Muted: mutedStore.stem0Muted,\n stem1Muted: mutedStore.stem1Muted,\n stem2Muted: targetStemMuted,\n stem3Muted: mutedStore.stem3Muted,\n }, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n case 3:\n // if (ENABLE_CONSOLE_LOG) console.log(`before: ${mutedStore.stem3Muted}`);\n targetStemSelected = selectedStemsStore.stem3Selected;\n targetStemMuted = !mutedStore.stem3Muted;\n currentIsolatedStems = isolateStore.isolatedStems;\n seedMaxVol = seedVol.stem3volume;\n mixMaxVol = mixVol.stem3volume;\n \n // update the store:\n mutedStore.toggleStem3Muted();\n \n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, 'normal-switch', undefined, undefined, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, selectedStemsStore, {\n stem0Muted: mutedStore.stem0Muted,\n stem1Muted: mutedStore.stem1Muted,\n stem2Muted: mutedStore.stem2Muted,\n stem3Muted: targetStemMuted,\n }, seedVol, mixVol, EMPTY_STRING);\n }\n break;\n default:\n return;\n }\n \n },\n toggleStemIsolateStatus: (sequenceIdx: number) => {\n consoleColorfulMessage4Lawful(`toggleStemIsolateStatus before ${[...isolateStore.isolatedStems].join(',')}`);\n const currentIsolatedStems = [...isolateStore.isolatedStems];\n\n const currentIdx = currentIsolatedStems.findIndex((v)=>v===sequenceIdx);\n if (currentIdx>-1) {\n currentIsolatedStems.splice(currentIdx, 1);\n } else {\n currentIsolatedStems.push(sequenceIdx);\n }\n\n consoleColorfulMessage4Lawful(`toggleStemIsolateStatus after ${[...currentIsolatedStems].join(',')}`);\n\n // update the store\n switch (sequenceIdx) {\n case 0:\n isolateStore.toggleStem0Isolated();\n break;\n case 1:\n isolateStore.toggleStem1Isolated();\n break;\n case 2:\n isolateStore.toggleStem2Isolated();\n break;\n case 3:\n isolateStore.toggleStem3Isolated();\n break;\n }\n\n if (ENABLE_CONSOLE_LOG) consoleColorfulMessage4Lawful(`toggleStemIsolateStatus (${sequenceIdx}) `);\n\n applyStemVolLogicWithIsolation(currentIsolatedStems, selectedStemsStore, mutedStore, seedVol, mixVol, EMPTY_STRING);\n },\n quitIsolation: (signature: string) => {\n consoleColorfulMessage4Lawful(`quitIsolation ${signature}`)\n // Fast de-isolation: Clear all states at once and apply volume logic only once\n if (isolateStore.isIsolationMode) {\n // Clear all isolation states simultaneously\n if (isolateStore.stem0Isolated) isolateStore.toggleStem0Isolated();\n if (isolateStore.stem1Isolated) isolateStore.toggleStem1Isolated();\n if (isolateStore.stem2Isolated) isolateStore.toggleStem2Isolated();\n if (isolateStore.stem3Isolated) isolateStore.toggleStem3Isolated();\n \n // Apply volume logic once with empty isolation array (instant de-isolation)\n applyStemVolLogicWithIsolation([], selectedStemsStore, mutedStore, seedVol, mixVol, 'fast-quit-isolation');\n }\n },\n changeStemMaxVolume: (sequenceIdx: number, maxVolume: number) => {\n let targetStemSelected: AEV3StemOpsTrackType;\n let targetStemMuted: boolean;\n const currentIsolatedStems = isolateStore.isolatedStems;\n const seedMaxVol = maxVolume;\n const mixMaxVol = maxVolume;\n \n switch(sequenceIdx) {\n case 0:\n seedVol.updateStem0Volume(maxVolume, false);\n mixVol.updateStem0Volume(maxVolume, false);\n targetStemSelected = selectedStemsStore.stem0Selected;\n targetStemMuted = mutedStore.stem0Muted;\n break;\n case 1:\n seedVol.updateStem1Volume(maxVolume, false);\n mixVol.updateStem1Volume(maxVolume, false);\n targetStemSelected = selectedStemsStore.stem1Selected;\n targetStemMuted = mutedStore.stem1Muted;\n break;\n case 2:\n seedVol.updateStem2Volume(maxVolume, false);\n mixVol.updateStem2Volume(maxVolume, false);\n targetStemSelected = selectedStemsStore.stem2Selected;\n targetStemMuted = mutedStore.stem2Muted;\n break;\n case 3:\n seedVol.updateStem3Volume(maxVolume, false);\n mixVol.updateStem3Volume(maxVolume, false);\n targetStemSelected = selectedStemsStore.stem3Selected;\n targetStemMuted = mutedStore.stem3Muted;\n break;\n default:\n return;\n }\n\n // Non Isolation Mode\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(targetStemSelected, sequenceIdx, targetStemMuted, seedMaxVol, mixMaxVol, 'normal-switch', undefined, undefined, EMPTY_STRING);\n } else {\n applyStemVolLogicWithIsolation(currentIsolatedStems, {\n stem0Selected: selectedStemsStore.stem0Selected,\n stem1Selected: selectedStemsStore.stem1Selected,\n stem2Selected: selectedStemsStore.stem2Selected,\n stem3Selected: selectedStemsStore.stem3Selected,\n }, mutedStore, seedVol, mixVol, EMPTY_STRING);\n }\n },\n resolveStemVolumes: () => {\n if (!isolateStore.isIsolationMode) {\n applyStemVolLogicNonIsolation(selectedStemsStore.stem0Selected, 0, mutedStore.stem0Muted, seedVol.stem0volume, mixVol.stem0volume, 'normal-switch', undefined);\n applyStemVolLogicNonIsolation(selectedStemsStore.stem1Selected, 1, mutedStore.stem1Muted, seedVol.stem1volume, mixVol.stem1volume, 'normal-switch', undefined);\n applyStemVolLogicNonIsolation(selectedStemsStore.stem2Selected, 2, mutedStore.stem2Muted, seedVol.stem2volume, mixVol.stem2volume, 'normal-switch', undefined);\n applyStemVolLogicNonIsolation(selectedStemsStore.stem3Selected, 3, mutedStore.stem3Muted, seedVol.stem3volume, mixVol.stem3volume, 'normal-switch', undefined);\n } else {\n const currentIsolatedStems = [...isolateStore.isolatedStems];\n applyStemVolLogicWithIsolation(currentIsolatedStems, selectedStemsStore, {\n stem0Muted: mutedStore.stem0Muted,\n stem1Muted: mutedStore.stem1Muted,\n stem2Muted: mutedStore.stem2Muted,\n stem3Muted: mutedStore.stem3Muted,\n }, seedVol, mixVol, EMPTY_STRING);\n }\n }\n }\n});\n\nconst useAev3StemsMasterStateStore = <T,>(selector: (state: AEV3StemsMasterStateStore) => T) =>\n useStore(aev3StemsMasterStateStore, selector);\n\n\nexport const updateMaxStemVolumes = (volumeProfile: number[]) => {\n const {\n changeStemMaxVolume\n } = aev3StemsMasterStateStore.getState();\n\n for (const [index, volume] of volumeProfile.entries()) {\n changeStemMaxVolume(index,volume)\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst stemSwitchUtilForModule = (sequenceIdx: number) => {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch');\n}\n\nexport const applyStemProfile = (proposedStemProfile: StemProfileString) => {\n const currentStemProfile = getCurrentStemProfileBasedOnStore();\n if (proposedStemProfile.includes('o') && !currentStemProfile.includes('o') \n ||!proposedStemProfile.includes('o') && currentStemProfile.includes('o') ) stemSwitchUtilForModule(0);\n if (proposedStemProfile.includes('v') && !currentStemProfile.includes('v')\n ||!proposedStemProfile.includes('v') && currentStemProfile.includes('v') ) stemSwitchUtilForModule(1);\n if (proposedStemProfile.includes('b') && !currentStemProfile.includes('b')\n ||!proposedStemProfile.includes('b') && currentStemProfile.includes('b') ) stemSwitchUtilForModule(2);\n if (proposedStemProfile.includes('d') && !currentStemProfile.includes('d')\n ||!proposedStemProfile.includes('d') && currentStemProfile.includes('d') ) stemSwitchUtilForModule(3);\n}\n\nexport const randomiseStemsPlaying = () => {\n const currentStemProfile = getCurrentStemProfileBasedOnStore();\n const ALLOWED_STEM_PROFILES_BY_RANDOMISE = generateStemProfiles(true);\n const proposedStemProfile = getRandomisedStemProfile(currentStemProfile, ALLOWED_STEM_PROFILES_BY_RANDOMISE);\n consoleColorfulMessage4Lawful(`[randomiseStemsPlaying] currentStemProfile: ${currentStemProfile}, new StemProfile: ${proposedStemProfile}`, '#98cf7cff', '#ea5a0dff', 8);\n applyStemProfile(proposedStemProfile);\n}\n\nexport const invertStemProfile = (stemProfile: StemProfileString): StemProfileString => {\n let proposedStemProfile: StemProfileString = '';\n ['v','o','b','d'].forEach((s)=>{\n if (!stemProfile.includes(s)){\n proposedStemProfile += s;\n }\n });\n return proposedStemProfile;\n}\n\nexport default useAev3StemsMasterStateStore;\n","import { ENABLE_TOGGLE_PLAYMODE_DEBUG } from \"../debug-flags\";\nimport { AEV3Controller } from \"../global-aev3-controller\";\nimport { updateMaxStemVolumes } from \"@/stem-audio-engine-v3/store/stems-master-state-store\";\nimport { AudioEnginePlaybackState, StemProfileString } from \"../interface\";\n\nconst DEBUG_ASTERISK_LINE = '*'.repeat(80);\n\nexport const stemVolumeClassicToMix = (instance: AEV3Controller, contextTimeChangeAt: number, timeoutForEventFired: number) => {\n \n console.log('going to toggle off vocal/drums of Seed, and turned to mix on these two stems');\n instance.scheduleStemVolume('seed1', 0, false, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('seed1', 1, true, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, false, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, false, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, true, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('mix1', 1, false, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, true, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, true, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n setTimeout(()=>{\n // fire the event for checking\n console.log(`%c${DEBUG_ASTERISK_LINE}\\nMix β€οΈ Seed - playing parallelly\\n${DEBUG_ASTERISK_LINE}`, 'color: yellowgreen; background: black;');\n }, timeoutForEventFired * 1000 + 0.01);\n}\n\nexport const stemVolumeRefreshMixToggle = (instance: AEV3Controller, contextTimeChangeAt: number, timeoutForEventFired: number) => {\n console.log('going to toggle off vocal/drums of Seed, and turned to mix on these two stems');\n instance.scheduleStemVolume('seed1', 0, false, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('seed1', 1, true, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, false, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, true, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, true, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('mix1', 1, false, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, true, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, false, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n setTimeout(()=>{\n // fire the event for checking\n console.log(`%c${DEBUG_ASTERISK_LINE}\\nMix2 β€οΈ Seed - playing parallelly\\n${DEBUG_ASTERISK_LINE}`, 'color: yellowgreen; background: black;');\n }, timeoutForEventFired * 1000 + 0.01);\n}\n\n// seed1(v) + mix1(obd)\n// seed1(vo) + mix1(bd)\n// seed1(vod) + mix1(b)\n// seed1(vodb) + seed2()\n// seed1(vod) + seed2(d)\n// seed1(vo) + seed2(bd)\n// seed1(v) + seed2(obd)\n// seed1() + seed2(vobd)\n// seed2(vob) + mix2(d)\n// seed2(vo) + mix2(bd)\n// seed2(v) + mix2(obd)\n\n// before jump, seed1(vo)/mix(bd)\nexport const stemVolumeIntelliPhase1aToggle = (instance: AEV3Controller, contextTimeChangeAt: number, timeoutForEventFired: number) => {\n console.log('going to toggle off vocal/drums of Seed, and turned to mix on these two stems');\n instance.scheduleStemVolume('seed1', 0, true, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('seed1', 1, true, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, true, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, true, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, false, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('mix1', 1, false, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, false, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, false, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n setTimeout(()=>{\n // fire the event for checking\n console.log(`%c${DEBUG_ASTERISK_LINE}\\nMix2 β€οΈ Seed - playing parallelly\\n${DEBUG_ASTERISK_LINE}`, 'color: yellowgreen; background: black;');\n }, timeoutForEventFired * 1000 + 0.01);\n}\n\n// jumped, seed1(vo)/seed2(bd)\nexport const stemVolumeToggleAllToSeed = (instance: AEV3Controller, contextTimeChangeAt: number, timeoutForEventFired: number) => {\n console.log('going to toggle off vocal/drums of Seed, and turned to mix on these two stems');\n instance.scheduleStemVolume('seed1', 0, true, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('seed1', 1, true, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, true, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, true, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, false, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('mix1', 1, false, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, false, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, false, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n setTimeout(()=>{\n // fire the event for checking\n console.log(`%c${DEBUG_ASTERISK_LINE}\\nMix2 β€οΈ Seed - playing parallelly\\n${DEBUG_ASTERISK_LINE}`, 'color: yellowgreen; background: black;');\n }, timeoutForEventFired * 1000 + 0.01);\n}\n\n// before jump, seed1()/seed2(vobd)\nexport const stemVolumeIntelliPhase2aToggle = (instance: AEV3Controller, contextTimeChangeAt: number, timeoutForEventFired: number) => {\n console.log('going to toggle off vocal/drums of Seed, and turned to mix on these two stems');\n instance.scheduleStemVolume('seed1', 0, false, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('seed1', 1, false, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, false, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, false, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, true, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('mix1', 1, true, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, true, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, true, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n setTimeout(()=>{\n // fire the event for checking\n console.log(`%c${DEBUG_ASTERISK_LINE}\\nMix2 β€οΈ Seed - playing parallelly\\n${DEBUG_ASTERISK_LINE}`, 'color: yellowgreen; background: black;');\n }, timeoutForEventFired * 1000 + 0.01);\n}\n\nexport const stemVolumeIntelliPhase2Toggle = (instance: AEV3Controller, contextTimeChangeAt: number, timeoutForEventFired: number) => {\n console.log('going to toggle off vocal/drums of Seed, and turned to mix on these two stems');\n instance.scheduleStemVolume('seed1', 0, true, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('seed1', 1, true, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, false, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, false, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, false, contextTimeChangeAt, timeoutForEventFired, true, false); // other\n instance.scheduleStemVolume('mix1', 1, false, contextTimeChangeAt, timeoutForEventFired, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, true, contextTimeChangeAt, timeoutForEventFired, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, true, contextTimeChangeAt, timeoutForEventFired, true, false); // drums\n setTimeout(()=>{\n // fire the event for checking\n console.log(`%c${DEBUG_ASTERISK_LINE}\\nMix2 β€οΈ Seed - playing parallelly\\n${DEBUG_ASTERISK_LINE}`, 'color: yellowgreen; background: black;');\n }, timeoutForEventFired * 1000 + 0.01);\n}\n\nexport const stemVolumeMixToClassic = (instance: AEV3Controller): boolean => {\n if (!instance.aev3Context?.audioContext) {\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('togglePlayMode, stemVolumeMixToClassic', 'audioContext not init yet');\n return false;\n }\n const crossfadeTime = 0.5;\n const currentTime = instance.aev3Context.audioContext.currentTime;\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('stemVolumeMixToClassic togglePlayMode');\n\n const mixTrackGain = instance.getTrackGainNodeWithTrackType('mix1');\n const seedTrackGain = instance.getTrackGainNodeWithTrackType('seed1');\n if (!mixTrackGain || !seedTrackGain) {\n return false;\n }\n\n if (mixTrackGain.gain.value===0) {\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('stemVolumeMixToClassic togglePlayMode skipped - trackGainNode of mix pipeline is 0, it is redundant and better not reset the stem gainNodes');\n return false;\n }\n \n mixTrackGain.gain.linearRampToValueAtTime(0, currentTime+crossfadeTime);\n seedTrackGain.gain.linearRampToValueAtTime(1, currentTime+crossfadeTime);\n \n instance.getStemGainNodesWithTrackType('seed1')?.forEach((_s, index)=>{\n instance.changeStemVolumeWithFade('seed1', index, 1, currentTime, true, false);\n });\n\n instance.getStemGainNodesWithTrackType('mix1')?.forEach((_s, index)=>{\n instance.changeStemVolumeWithFade('mix1', index, 0, currentTime, true, false);\n });\n\n updateMaxStemVolumes([1, 1, 1, 1]);\n return true;\n}\n\nexport const stemVolumeMixToClassicMixtrack = (instance: AEV3Controller): boolean => {\n if (!instance.aev3Context?.audioContext) {\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('togglePlayMode, stemVolumeMixToClassicMixtrack', 'audioContext not init yet');\n return false;\n }\n const crossfadeTime = 0.5;\n const currentTime = instance.aev3Context.audioContext.currentTime;\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('stemVolumeMixToClassicMixtrack togglePlayMode');\n\n const seedTrackGainMix = instance.getTrackGainNodeWithTrackType('seed1');\n const mixTrackGainMix = instance.getTrackGainNodeWithTrackType('mix1');\n if (!seedTrackGainMix || !mixTrackGainMix) {\n return false;\n }\n\n if (seedTrackGainMix.gain.value===0) {\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('stemVolumeMixToClassicMixtrack togglePlayMode skipped - trackGainNode of seed pipeline is 0, it is redundant and better not reset the stem gainNodes');\n return false;\n }\n \n seedTrackGainMix.gain.linearRampToValueAtTime(0, currentTime+crossfadeTime);\n mixTrackGainMix.gain.linearRampToValueAtTime(1, currentTime+crossfadeTime);\n \n instance.getStemGainNodesWithTrackType('mix1')?.forEach((_s, index)=>{\n instance.changeStemVolumeWithFade('mix1', index, 1, currentTime, true, false);\n });\n\n instance.getStemGainNodesWithTrackType('seed1')?.forEach((_s, index)=>{\n instance.changeStemVolumeWithFade('seed1', index, 0, currentTime, true, false);\n });\n\n updateMaxStemVolumes([1, 1, 1, 1]);\n return true;\n}\n\nexport const stemVolumeClassicToMixVer2 = (instance: AEV3Controller, playbackState: AudioEnginePlaybackState, stemProfile: StemProfileString = 'v', volumeProfile: number[] = [1, 1, 1, 1]): boolean => {\n if (!instance.aev3Context?.audioContext) {\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('stemVolumeClassicToMixVer2, stemVolumeMixToClassic', 'audioContext not init yet');\n return false;\n }\n\n const crossfadeTime = 0.05;\n const contextTimeChangeAt = instance.aev3Context.audioContext.currentTime;\n if (ENABLE_TOGGLE_PLAYMODE_DEBUG) console.log('stemVolumeClassicToMixVer2 togglePlayMode');\n \n const mixGainV2 = instance.getTrackGainNodeWithTrackType('mix1');\n const seedGainV2 = instance.getTrackGainNodeWithTrackType('seed1');\n if (!mixGainV2 || !seedGainV2) {\n return false;\n }\n mixGainV2.gain.linearRampToValueAtTime(1, contextTimeChangeAt+crossfadeTime);\n seedGainV2.gain.linearRampToValueAtTime(1, contextTimeChangeAt+crossfadeTime);\n\n instance.scheduleStemVolume('seed1', 0, stemProfile.includes('o'), contextTimeChangeAt, 0, true, false); // other\n instance.scheduleStemVolume('seed1', 1, stemProfile.includes('v'), contextTimeChangeAt, 0, true, false); // vocal\n instance.scheduleStemVolume('seed1', 2, stemProfile.includes('b'), contextTimeChangeAt, 0, true, false); // bass\n instance.scheduleStemVolume('seed1', 3, stemProfile.includes('d'), contextTimeChangeAt, 0, true, false); // drums\n\n instance.scheduleStemVolume('mix1', 0, !stemProfile.includes('o'), contextTimeChangeAt, 0, true, false); // other\n instance.scheduleStemVolume('mix1', 1, !stemProfile.includes('v'), contextTimeChangeAt, 0, true, false); // vocal\n instance.scheduleStemVolume('mix1', 2, !stemProfile.includes('b'), contextTimeChangeAt, 0, true, false); // bass\n instance.scheduleStemVolume('mix1', 3, !stemProfile.includes('d'), contextTimeChangeAt, 0, true, false); // drums\n\n updateMaxStemVolumes(volumeProfile);\n return true;\n}\n\n/*\nconsole.log(AEV3Controller.getInstance().aev3Context.trackGainNodes.map((t)=>t.gain.value));\nconsole.log(AEV3Controller.getInstance().aev3Context.stemGainNodesTrack1.map((t)=>t.gain.value));\nconsole.log(AEV3Controller.getInstance().aev3Context.stemGainNodesTrack2.map((t)=>t.gain.value));\n*/\n\nexport const stemVolumePlayClassicFromStart = (instance: AEV3Controller) => {\n // const crossfadeTime = 0.01;\n const currentTime = instance.aev3Context.audioContext.currentTime;\n\n const mixGainClassic = instance.getTrackGainNodeWithTrackType('mix1');\n const seedGainClassic = instance.getTrackGainNodeWithTrackType('seed1');\n if (!mixGainClassic || !seedGainClassic) {\n return;\n }\n mixGainClassic.gain.linearRampToValueAtTime(1, currentTime);\n seedGainClassic.gain.linearRampToValueAtTime(1, currentTime);\n \n // enforce volume profile and ignore stems-volume-store\n instance.changeStemVolumeWithFade('seed1', 0, 1, currentTime, true, false);\n instance.changeStemVolumeWithFade('seed1', 1, 1, currentTime, true, false);\n instance.changeStemVolumeWithFade('seed1', 2, 1, currentTime, true, false);\n instance.changeStemVolumeWithFade('seed1', 3, 1, currentTime, true, false);\n\n // enforce volume profile and ignore stems-volume-store\n instance.changeStemVolumeWithFade('mix1', 0, 0, currentTime, true, false);\n instance.changeStemVolumeWithFade('mix1', 1, 0, currentTime, true, false);\n instance.changeStemVolumeWithFade('mix1', 2, 0, currentTime, true, false);\n instance.changeStemVolumeWithFade('mix1', 3, 0, currentTime, true, false);\n}\n\nexport const stemVolumePlayMixFromStart = (instance: AEV3Controller) => {\n // const crossfadeTime = 0.01;\n const currentTime = instance.aev3Context.audioContext.currentTime;\n \n const mixGainStart = instance.getTrackGainNodeWithTrackType('mix1');\n const seedGainStart = instance.getTrackGainNodeWithTrackType('seed1');\n if (!mixGainStart || !seedGainStart) {\n return;\n }\n mixGainStart.gain.linearRampToValueAtTime(1, currentTime);\n seedGainStart.gain.linearRampToValueAtTime(1, currentTime);\n \n // enforce volume profile and ignore stems-volume-store\n instance.changeStemVolumeWithFade('seed1', 0, 0, currentTime, true, false);\n instance.changeStemVolumeWithFade('seed1', 1, 1, currentTime, true, false);\n instance.changeStemVolumeWithFade('seed1', 2, 0, currentTime, true, false);\n instance.changeStemVolumeWithFade('seed1', 3, 0, currentTime, true, false);\n\n // enforce volume profile and ignore stems-volume-store\n instance.changeStemVolumeWithFade('mix1', 0, 1, currentTime, true, false);\n instance.changeStemVolumeWithFade('mix1', 1, 0, currentTime, true, false);\n instance.changeStemVolumeWithFade('mix1', 2, 1, currentTime, true, false);\n instance.changeStemVolumeWithFade('mix1', 3, 1, currentTime, true, false);\n}\n","/**\n * Listen to the Event fired from AEV3Controller on assignment changed\n */\n\nimport { create } from \"zustand\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { BarSequence } from \"../decode/bar-sequence\";\nimport {\n // AEV3Controller,\n // IEventBarSequenceAssignmentUpdated,\n // IEventBarSequenceDestroyed,\n TrackLabelType,\n} from \"../global-aev3-controller\";\nimport { IOptionalCurrentTrackInfo, ITrackForSequence } from \"../interface\";\n\n// Zustand Store\nexport interface BarSequenceStore {\n \n // Track Information based on current Bar Sequence playing:\n // barSequences: Record<TrackLabelType, BarSequence | null>;\n // removeBarSequence: (trackType: TrackLabelType) => void;\n // updateBarSequence: (trackType: TrackLabelType, barSequence: BarSequence) => void;\n // barSequencesLatestTrackData: Record<TrackLabelType, ITrackForSequence | null>;\n // removeBarSequenceTrackData: (trackType: TrackLabelType) => void;\n // updateBarSequenceTrackData: (trackType: TrackLabelType) => void;\n\n currentSeedBarSequence: BarSequence | null;\n currentMixBarSequence: BarSequence | null;\n\n updateCurrentSeedBarSequence: (bar: BarSequence) => void;\n updateCurrentMixBarSequence: (bar: BarSequence) => void;\n\n // Upcoming solely based on trackData\n currentSeedTrackData: ITrackForSequence | null;\n currentMixTrackData: ITrackForSequence | null;\n currentTrackOptionalParam: IOptionalCurrentTrackInfo | null;\n \n updateCurrentSeedTrackData: (trackData: ITrackForSequence) => void;\n updateCurrentMixTrackData: (trackData: ITrackForSequence) => void;\n updateCurrentTrackOptionalParam: (data: IOptionalCurrentTrackInfo) => void;\n\n currentSeedTrackBarStartIndex: number;\n currentSeedTrackBarEndIndex: number;\n currentMixTrackBarStartIndex: number;\n currentMixTrackBarEndIndex: number;\n\n updateCurrentSeedTrackBarRanges: (start: number, end: number) => void;\n updateCurrentMixTrackBarRanges: (start: number, end: number) => void;\n \n}\n\n// const LOCAL_CONSOLE = false;\n\nexport const useBarSequenceStore = create<BarSequenceStore>()(\n subscribeWithSelector((set) => ({\n barSequences: {} as Record<TrackLabelType, BarSequence | null>, // Store all track types\n barSequencesLatestTrackData: {} as Record<\n TrackLabelType,\n ITrackForSequence | null\n >, // Store all track types\n\n currentSeedBarSequence: null,\n currentMixBarSequence: null,\n updateCurrentSeedBarSequence: (bar: BarSequence) => {\n const trackData = bar?.trackData;\n\n set((/*state*/) => ({\n currentSeedBarSequence: bar,\n currentSeedTrackData: trackData,\n }));\n \n },\n updateCurrentMixBarSequence: (bar: BarSequence) => {\n const trackData = bar?.trackData;\n\n set((/*state*/) => ({\n currentMixBarSequence: bar,\n currentMixTrackData: trackData,\n }));\n },\n\n currentSeedTrackData: null,\n currentMixTrackData: null,\n currentTrackOptionalParam: null,\n \n updateCurrentSeedTrackData: (trackData: ITrackForSequence) => {\n set((/*state*/) => ({\n currentSeedTrackData: trackData,\n }));\n },\n\n updateCurrentMixTrackData: (trackData: ITrackForSequence) => {\n set((/*state*/) => ({\n currentMixTrackData: trackData,\n }));\n },\n\n updateCurrentTrackOptionalParam: (data: IOptionalCurrentTrackInfo) => {\n set((/*state*/) => ({\n currentTrackOptionalParam: data,\n }));\n },\n\n currentSeedTrackBarStartIndex: -1,\n currentSeedTrackBarEndIndex: -1,\n currentMixTrackBarStartIndex: -1,\n currentMixTrackBarEndIndex: -1,\n \n updateCurrentSeedTrackBarRanges: (start: number, end: number) => {\n set((/*state*/) => ({\n currentSeedTrackBarStartIndex: start,\n currentSeedTrackBarEndIndex: end,\n }));\n },\n updateCurrentMixTrackBarRanges: (start: number, end: number) => {\n set((/*state*/) => ({\n currentMixTrackBarStartIndex: start,\n currentMixTrackBarEndIndex: end,\n }));\n },\n\n })),\n);\n\n/*\n// Try to set up event listeners, but don't fail if AEV3Controller.getInstance() isn't ready yet\ntry {\n AEV3Controller.getInstance().on(\n AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED,\n (event: IEventBarSequenceAssignmentUpdated) => {\n const barSequence = AEV3Controller.getInstance().getBarSequenceWithType(event.detail.trackType);\n if (event.detail.trackType==='seed1'){\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(barSequence);\n } else if (event.detail.trackType==='mix1'){\n useBarSequenceStore.getState().updateCurrentMixBarSequence(barSequence);\n }\n },\n );\n\n AEV3Controller.getInstance().on(\n AEV3Controller.BAR_SEQUENCE_DESTROYED,\n (event: IEventBarSequenceDestroyed) => {\n if (event.detail.trackType==='seed1'){\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(null);\n } else if (event.detail.trackType==='mix1'){\n useBarSequenceStore.getState().updateCurrentMixBarSequence(null);\n }\n },\n );\n} catch {\n // console.warn('AEV3Controller.getInstance() not ready yet, event listeners will be set up later');\n // Set up listeners when AEV3Controller.getInstance() becomes available\n setTimeout(() => {\n try {\n AEV3Controller.getInstance().on(\n AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED,\n (event: IEventBarSequenceAssignmentUpdated) => {\n const barSequence = AEV3Controller.getInstance().getBarSequenceWithType(event.detail.trackType);\n if (event.detail.trackType==='seed1'){\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(barSequence);\n } else if (event.detail.trackType==='mix1'){\n useBarSequenceStore.getState().updateCurrentMixBarSequence(barSequence);\n }\n },\n );\n\n AEV3Controller.getInstance().on(\n AEV3Controller.BAR_SEQUENCE_DESTROYED,\n (event: IEventBarSequenceDestroyed) => {\n if (event.detail.trackType==='seed1'){\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(null);\n } else if (event.detail.trackType==='mix1'){\n useBarSequenceStore.getState().updateCurrentMixBarSequence(null);\n }\n },\n );\n } catch (retryError) {\n console.warn(\"Failed to set up event listeners on retry:\", retryError);\n }\n }, 100);\n}\n*/\nexport default useBarSequenceStore;\n","/**\n * Listen to the Event fired from AEV3Controller on assignment changed\n */\n\nimport { create } from \"zustand\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\n\n// import {\n// AEV3Controller,\n// INextMixMasterBarSegmentAssignmentUpdated,\n// INextSeedMixTrackDataAssignmentUpdated,\n// } from \"../global-aev3-controller\";\nimport { IOptionalCurrentTrackInfo, ITrackForSequence } from \"../interface\";\n// import { consoleColorfulMessage4Lawful } from '../utils/colorConsole';\n\n// Zustand Store\nexport interface NextMixStore {\n // Upcoming solely based on trackData\n nextSeedTrackData: ITrackForSequence | null;\n nextMixTrackData: ITrackForSequence | null;\n nextTrackOptionalParam: IOptionalCurrentTrackInfo | null;\n lastestMixAppendedToMasterBar: IOptionalCurrentTrackInfo | null;\n updateNextSeedTrackData: (trackData: ITrackForSequence) => void;\n updateNextMixTrackData: (trackData: ITrackForSequence) => void;\n updateNextTrackOptionalParam: (data: IOptionalCurrentTrackInfo) => void;\n\n nextSeedTrackBarStartIndex: number;\n nextSeedTrackBarEndIndex: number;\n nextMixTrackBarStartIndex: number;\n nextMixTrackBarEndIndex: number;\n updateNextSeedTrackBarRanges: (start: number, end: number) => void;\n updateNextMixTrackBarRanges: (start: number, end: number) => void;\n\n // only update when the append ops succeed, it is about timing to get transition duration used\n updateLastestMixAppendedToMasterBar: (\n data: IOptionalCurrentTrackInfo,\n ) => void;\n}\n\nexport const useNextMixStore = create<NextMixStore>()(\n subscribeWithSelector((set) => ({\n nextSeedTrackData: null,\n nextMixTrackData: null,\n nextTrackOptionalParam: null,\n lastestMixAppendedToMasterBar: null,\n\n nextSeedTrackBarStartIndex: -1,\n nextSeedTrackBarEndIndex: -1,\n nextMixTrackBarStartIndex: -1,\n nextMixTrackBarEndIndex: -1,\n\n updateNextSeedTrackData: (trackData: ITrackForSequence) => {\n set((/*state*/) => ({\n nextSeedTrackData: trackData,\n }));\n },\n\n updateNextMixTrackData: (trackData: ITrackForSequence) => {\n set((/*state*/) => ({\n nextMixTrackData: trackData,\n }));\n },\n\n updateNextTrackOptionalParam: (data: IOptionalCurrentTrackInfo) => {\n set((/*state*/) => ({\n nextTrackOptionalParam: data,\n }));\n },\n\n updateLastestMixAppendedToMasterBar: (data: IOptionalCurrentTrackInfo) => {\n // consoleColorfulMessage4Lawful(`updateLastestMixAppendedToMasterBar: ${JSON.stringify(data)}`, '#6b1ce3ff', '#ac12ceff');\n set((/*state*/) => ({\n lastestMixAppendedToMasterBar: data,\n }));\n },\n\n updateNextSeedTrackBarRanges: (start: number, end: number) => {\n set((/*state*/) => ({\n nextSeedTrackBarStartIndex: start,\n nextSeedTrackBarEndIndex: end,\n }));\n },\n updateNextMixTrackBarRanges: (start: number, end: number) => {\n set((/*state*/) => ({\n nextMixTrackBarStartIndex: start,\n nextMixTrackBarEndIndex: end,\n }));\n },\n })),\n);\n\n// Global Event Listener Setup (Ensures only one listener)\n\n// Try to set up event listeners, but don't fail if AEV3Controller.getInstance() isn't ready yet\n/*\ntry {\n AEV3Controller.getInstance().on(\n AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED,\n (event: INextSeedMixTrackDataAssignmentUpdated) => {\n if (event.detail.infoChanged === \"seed\") {\n // const track = AEV3Controller.getInstance().getNextSeedTrackObject();\n // useNextMixStore.getState().updateNextSeedTrackData(track);\n } else if (event.detail.infoChanged === \"mix\") {\n const track = AEV3Controller.getInstance().getNextMixTrackObject();\n useNextMixStore.getState().updateNextMixTrackData(track);\n } else if (event.detail.infoChanged === \"optionalParam\") {\n const data = AEV3Controller.getInstance().getNextTrackOptionalParam();\n useNextMixStore.getState().updateNextTrackOptionalParam(data);\n }\n },\n );\n\n AEV3Controller.getInstance().on(\n AEV3Controller.MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS,\n (event: INextMixMasterBarSegmentAssignmentUpdated) => {\n if (event.detail.infoChanged === \"nil\") {\n // consoleColorfulMessage4Lawful(`[useNextMixStore] AEV3Controller.MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS: ${JSON.stringify(event.detail)}`, '#f427c1ff', '#ffffff', 8);\n const data = AEV3Controller.getInstance().getNextTrackOptionalParam();\n if (event.detail.enforceUpdate) {\n useNextMixStore\n .getState()\n .updateLastestMixAppendedToMasterBar({ ...data });\n } else {\n useNextMixStore.getState().updateLastestMixAppendedToMasterBar(data);\n }\n }\n },\n );\n} catch {\n // console.warn('AEV3Controller.getInstance() not ready yet, event listeners will be set up later');\n // Set up listeners when AEV3Controller.getInstance() becomes available\n setTimeout(() => {\n try {\n AEV3Controller.getInstance().on(\n AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED,\n (event: INextSeedMixTrackDataAssignmentUpdated) => {\n if (event.detail.infoChanged === \"seed\") {\n const track = AEV3Controller.getInstance().getNextSeedTrackObject();\n useNextMixStore.getState().updateNextSeedTrackData(track);\n } else if (event.detail.infoChanged === \"mix\") {\n const track = AEV3Controller.getInstance().getNextMixTrackObject();\n useNextMixStore.getState().updateNextMixTrackData(track);\n } else if (event.detail.infoChanged === \"optionalParam\") {\n const data = AEV3Controller.getInstance().getNextTrackOptionalParam();\n useNextMixStore.getState().updateNextTrackOptionalParam(data);\n }\n },\n );\n AEV3Controller.getInstance().on(\n AEV3Controller.MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS,\n (event: INextMixMasterBarSegmentAssignmentUpdated) => {\n if (event.detail.infoChanged === \"nil\") {\n // consoleColorfulMessage4Lawful(`[useNextMixStore] AEV3Controller.MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS (2): ${JSON.stringify(event.detail)}`, '#f427c1ff', '#ffffff', 8);\n const data = AEV3Controller.getInstance().getNextTrackOptionalParam();\n if (event.detail.enforceUpdate) {\n useNextMixStore\n .getState()\n .updateLastestMixAppendedToMasterBar({ ...data });\n } else {\n useNextMixStore\n .getState()\n .updateLastestMixAppendedToMasterBar(data);\n }\n }\n },\n );\n } catch (retryError) {\n console.warn(\"Failed to set up event listeners on retry:\", retryError);\n }\n }, 100);\n}\n*/\nexport default useNextMixStore;\n","/**\n * Stem Download Utility\n *\n * Downloads an fMP4 track, decodes all 4 stems into AudioBuffers,\n * encodes each as WAV, bundles them into a zip, and triggers a browser download.\n *\n * Usage from stem-player-rd:\n *\n * import { downloadStemsAsZip, downloadCurrentTrackStemsAsZip } from '@kano/stem-web-audio-player';\n *\n * // Download stems for the currently playing track\n * await downloadCurrentTrackStemsAsZip({ onProgress: (p) => console.log(p) });\n *\n * // Or provide a specific MP4 URL\n * await downloadStemsAsZip({\n * mp4Url: 'https://cdn.stem.fm/path/to/track.mp4',\n * trackName: 'My Track',\n * onProgress: (p) => console.log(p),\n * });\n */\n\nimport JSZip from 'jszip';\nimport { extractTfraData } from './mp4';\nimport { MP4MoofExtractor } from './mp4-parser/mp4-moof-extractor';\nimport { AACAdtsPackager } from './mp4-parser/aac-adts-packager';\nimport { AEV3Config } from '../aev3-env-config';\nimport { AEV3Controller } from '../global-aev3-controller';\nimport { ITrackForSequence, ITrackForSequenceNoBeats } from '../interface';\n\nconst SAMPLE_RATE = 48000;\n\nexport type StemLabel = 'bass' | 'drums' | 'other' | 'vocals';\n\nexport const STEM_LABELS: StemLabel[] = ['bass', 'drums', 'other', 'vocals'];\n\nconst TFRA_STEM_MAP: Record<number, StemLabel> = {\n 0: 'bass',\n 1: 'drums',\n 2: 'other',\n 3: 'vocals',\n};\n\nexport interface StemDownloadProgress {\n phase: 'fetching' | 'parsing' | 'decoding' | 'encoding' | 'zipping' | 'done';\n percent: number;\n detail?: string;\n}\n\nexport interface DownloadStemsOptions {\n mp4Url: string;\n trackName?: string;\n artistName?: string;\n /** Subset of stems to include (defaults to all 4) */\n stems?: StemLabel[];\n onProgress?: (p: StemDownloadProgress) => void;\n}\n\nexport interface DownloadCurrentTrackOptions {\n trackName?: string;\n artistName?: string;\n stems?: StemLabel[];\n onProgress?: (p: StemDownloadProgress) => void;\n}\n\n/**\n * Encode an AudioBuffer to a 16-bit PCM WAV Blob.\n */\nfunction audioBufferToWavBlob(audioBuffer: AudioBuffer): Blob {\n const HEADER_SIZE = 44;\n const numChannels = audioBuffer.numberOfChannels;\n const sampleRate = audioBuffer.sampleRate;\n const bytesPerSample = 2; // 16-bit\n const numSamples = audioBuffer.length;\n const dataSize = numSamples * numChannels * bytesPerSample;\n const fileSize = HEADER_SIZE + dataSize;\n\n const buffer = new ArrayBuffer(fileSize);\n const view = new DataView(buffer);\n\n const writeStr = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) view.setUint8(offset + i, str.charCodeAt(i));\n };\n\n // RIFF header\n writeStr(0, 'RIFF');\n view.setUint32(4, fileSize - 8, true);\n writeStr(8, 'WAVE');\n\n // fmt sub-chunk\n writeStr(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true); // PCM\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * numChannels * bytesPerSample, true);\n view.setUint16(32, numChannels * bytesPerSample, true);\n view.setUint16(34, 16, true);\n\n // data sub-chunk\n writeStr(36, 'data');\n view.setUint32(40, dataSize, true);\n\n const channels: Float32Array[] = [];\n for (let c = 0; c < numChannels; c++) {\n channels.push(audioBuffer.getChannelData(c));\n }\n\n let offset = HEADER_SIZE;\n for (let i = 0; i < numSamples; i++) {\n for (let c = 0; c < numChannels; c++) {\n const sample = Math.max(-1, Math.min(1, channels[c][i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7FFF, true);\n offset += bytesPerSample;\n }\n }\n\n return new Blob([buffer], { type: 'audio/wav' });\n}\n\n/**\n * Download an fMP4, extract all stems, decode, encode to WAV, zip, and trigger download.\n */\nexport async function downloadStemsAsZip(options: DownloadStemsOptions): Promise<void> {\n const {\n mp4Url,\n trackName = 'track',\n artistName,\n stems = STEM_LABELS,\n onProgress,\n } = options;\n\n const token = AEV3Config.getInstance()?.getAccessToken?.() ?? '';\n\n // 1. Fetch TFRA index\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 // 2. Download full MP4\n onProgress?.({ phase: 'fetching', percent: 10, detail: 'Downloading audioβ¦' });\n const headers: Record<string, string> = {};\n if (token) headers['Authorization'] = `Bearer ${token}`;\n const response = await fetch(mp4Url, { headers, cache: 'no-cache' });\n if (!response.ok) throw new Error(`MP4 fetch failed: ${response.status}`);\n const fullBuffer = await response.arrayBuffer();\n\n onProgress?.({ phase: 'parsing', percent: 35, 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<StemLabel, Uint8Array[]> = {\n bass: [], drums: [], other: [], vocals: [],\n };\n\n const bufLen = fullBuffer.byteLength;\n\n for (let tfraIdx = 0; tfraIdx < 4; tfraIdx++) {\n const stemLabel = TFRA_STEM_MAP[tfraIdx];\n if (!stems.includes(stemLabel)) continue;\n\n const entries = tfraData[tfraIdx].entries;\n const mp4TrackId = tfraIdx + 1;\n\n for (let i = 0; i < entries.length; i++) {\n const moofOffset = entries[i].moof_offset;\n let moofEnd: number;\n if (tfraIdx < 3) {\n // Next stem's moof at the same fragment index bounds this stem's slice (valid for last i too).\n moofEnd = tfraData[tfraIdx + 1].entries[i].moof_offset;\n } else {\n // Last stem: next byte range starts at the following bass fragment, or EOF for the final fragment.\n const bassEntries = tfraData[0].entries;\n moofEnd =\n i + 1 < bassEntries.length ? bassEntries[i + 1].moof_offset : bufLen;\n }\n\n const byteLength = moofEnd - moofOffset;\n if (moofOffset + byteLength > bufLen || byteLength <= 0) continue;\n\n const trackBuffer = fullBuffer.slice(moofOffset, moofOffset + byteLength);\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 extraction failures near EOF are expected\n }\n }\n\n const pct = 35 + Math.round(((tfraIdx + 1) / 4) * 20);\n onProgress?.({ phase: 'parsing', percent: pct, detail: `Extracted ${stemLabel}` });\n }\n\n // 4. Decode each stem (always close context β browsers cap concurrent AudioContexts)\n onProgress?.({ phase: 'decoding', percent: 55, detail: 'Decoding audioβ¦' });\n const decodedStems: Partial<Record<StemLabel, AudioBuffer>> = {};\n const ctx = new AudioContext({ sampleRate: SAMPLE_RATE });\n try {\n for (let si = 0; si < stems.length; si++) {\n const label = stems[si];\n const frames = stemFrames[label];\n\n if (frames.length === 0) {\n decodedStems[label] = ctx.createBuffer(2, SAMPLE_RATE, SAMPLE_RATE);\n continue;\n }\n\n const merged = mergeFrames(frames);\n try {\n decodedStems[label] = await ctx.decodeAudioData(merged.buffer);\n } catch {\n const blob = new Blob([merged], { type: 'audio/aac' });\n const ab = await blob.arrayBuffer();\n decodedStems[label] = await ctx.decodeAudioData(ab);\n }\n\n const pct = 55 + Math.round(((si + 1) / stems.length) * 20);\n onProgress?.({ phase: 'decoding', percent: pct, detail: `Decoded ${label}` });\n }\n } finally {\n await ctx.close().catch(() => {});\n }\n\n // 5. Encode to WAV and add to zip\n onProgress?.({ phase: 'encoding', percent: 75, detail: 'Encoding WAV filesβ¦' });\n const zip = new JSZip();\n const prefix = artistName ? `${artistName} - ${trackName}` : trackName;\n\n for (let si = 0; si < stems.length; si++) {\n const label = stems[si];\n const audioBuffer = decodedStems[label];\n if (!audioBuffer) continue;\n\n const wavBlob = audioBufferToWavBlob(audioBuffer);\n zip.file(`${prefix} - ${label}.wav`, wavBlob);\n\n const pct = 75 + Math.round(((si + 1) / stems.length) * 15);\n onProgress?.({ phase: 'encoding', percent: pct, detail: `Encoded ${label}` });\n }\n\n // 6. Generate zip and trigger download\n onProgress?.({ phase: 'zipping', percent: 92, detail: 'Creating zipβ¦' });\n const zipBlob = await zip.generateAsync({ type: 'blob' });\n\n const a = document.createElement('a');\n a.href = URL.createObjectURL(zipBlob);\n a.download = `${prefix} - stems.zip`;\n a.click();\n URL.revokeObjectURL(a.href);\n\n onProgress?.({ phase: 'done', percent: 100, detail: 'Download started' });\n}\n\n/**\n * Download stems for the currently playing track.\n * Reads the track URL and metadata from AEV3Controller automatically.\n */\nexport async function downloadCurrentTrackStemsAsZip(options: DownloadCurrentTrackOptions = {}): Promise<void> {\n const ctrl = AEV3Controller.getInstance();\n const seedTrack = ctrl.getCurrentSeedTrackObject();\n const mixTrack = ctrl.getCurrentMixTrackObject();\n const track = seedTrack || mixTrack;\n\n if (!track?.url) {\n throw new Error('No track currently loaded β cannot download stems');\n }\n\n return downloadStemsAsZip({\n mp4Url: track.url,\n trackName: options.trackName ?? (track as ITrackForSequenceNoBeats).name ?? (track as ITrackForSequenceNoBeats).trackDisplayName ?? 'track',\n artistName: options.artistName ?? (track as ITrackForSequenceNoBeats).artistDisplayName,\n stems: options.stems,\n onProgress: options.onProgress,\n });\n}\n\n/**\n * React hook helper: returns metadata needed to trigger a download.\n * Does NOT trigger the download β call downloadStemsAsZip with the returned url.\n */\nexport function getStemDownloadInfo(): { available: boolean; mp4Url: string | null; trackName: string; artistName: string } {\n const ctrl = AEV3Controller.getInstance();\n const seedTrack = ctrl.getCurrentSeedTrackObject();\n const mixTrack = ctrl.getCurrentMixTrackObject();\n const track = seedTrack || mixTrack;\n\n return {\n available: !!track?.url,\n mp4Url: track?.url ?? null,\n trackName: (track as ITrackForSequenceNoBeats)?.name ?? (track as ITrackForSequenceNoBeats)?.trackDisplayName ?? 'track',\n artistName: (track as ITrackForSequenceNoBeats)?.artistDisplayName ?? '',\n };\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 * This panel responsible for putting the Mix JSON Object into AEV3Context\n * \n * Migrate all related code from V1 to V2\n * And make another cleaner V1 version up and able to run with exported code\n * \n * 1. \n * \n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport React, { MutableRefObject, useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from '../ui/input';\nimport { Textarea } from '../ui/textarea';\n\nimport { fetchStationTrackDataWithSharedURL, loadStationTrackFromJsonForPrototype, StationTrackJsonReturn } from '@/services/fetchStationTracks';\n// import { useCurrentMixJsonStore } from '@/stem-audio-engine-v3/store/use-current-mix-json-store';\nimport { useCurrentStationTrackJsonStore } from '@/stem-audio-engine-v3/store/use-current-station-track-json-store';\n\n// import { \n// getBeatGridVersion, \n// setBeatGridVersion, \n// BEAT_GRID_VERSION_CHANGED_EVENT,\n// getBeatGridVersionLabel\n// } from \"@/utils/window-debug-tools\";\n\n// import { useCurrentTrack } from '@/stem-audio-engine-v3/hooks/use-current-track';\nimport './style.scss';\n// import { preloadMP4s_OnlyCheckIfInitialised } from '@/stem-audio-engine-v3/utils/preload';\n// import { consoleColorfulMessage } from '@/stem-audio-engine-v3/utils/colorConsole';\nimport { useAudioEngineCurrentTrack } from '@/stem-audio-engine-v3/hooks/migration/use-audio-engine-current-track';\nimport { downloadCurrentTrackStemsAsZip, getStemDownloadInfo } from '@/stem-audio-engine-v3/utils/stem-download';\n\n// Some Notes\n// Quantise Source or not should only affect\n// 1. mp3_hls or hls being use (cache)\n// 2. initial pitch for mix/seed\n\n// todo \n// 1. should add 1 extra pitch worklet on mix, seed\n// 2. toggle on/off realtime quantisation\n\n\n// Classic to Mix playback\n// Mix1 is jumped on the timeline of Seed1 by bar calculation\n// here the tempoShiftSz is used to compose the bars of Mix1\n// the ratio is modified to mimic the case that \n// import data from '@/services/local/classic-to-mix-same-tempo-orig-sz.json'; // tempoShiftSz of both tracks are same\n// import data from '@/services/local/classic-to-mix-1seed-eq-2mix.json'; // tempoShiftSz of seed:mix = 1:2\n// import data from '@/services/local/classic-to-mix-2seed-eq-1mix.json'; // // tempoShiftSz of seed:mix = 2:1\n\n// Creepin'\n// import data3 from '@/services/00000006-8950-49f0-88a6-869af51b8e97.json';\nconst data3 = {};\nconst MIX_INPUT_3 = 'https://unstable-stemplatform.netlify.app/set/00000005-a69e-4d85-b245-b1371baa89f0/mix/00000006-8950-49f0-88a6-869af51b8e97?stems=v&mode=infinite-mix&mp=0';\n\n// liked station (487 songs)\n// import data from '@/services/00000006-1d4f-4701-ba10-c1596f39b72e.json';\nconst data = {};\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-6d3f-4e72-b72d-a7c3bdbaa253/mix/00000006-1d4f-4701-ba10-c1596f39b72e?stems=obd&mode=mix&mp=0'\nconst data2 = {};\nconst MIX_INPUT_2 = 'https://unstable-stemplatform.netlify.app/set/00000005-6d3f-4e72-b72d-a7c3bdbaa253/mix/00000006-023c-44d2-ad2b-a5e779252525?stems=obd&mode=mix&mp=1'\n\n// Alex Liked Station: 1376 mixes\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/05e93986-90ac-4542-9912-af935896bca6/mix/00000006-9847-4b06-a1a0-f78c3900c9b9?stems=v&mode=mix&mp=1376';\n\n// Mix form hot mixes station\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-5a0e-4376-917d-bb6b7b109661';\n\n/*\nError: Invalid audio format: https://d3aj9yujg8n59a.cloudfront.net/tracks/02e6b3a7-2c0a-4d04-8a0e-7b6556d3a328/96k/track.mp4 - incorrect audio segments count, 16,15,15,2\n at isAudioFormatValid (mp4.ts:297:15)\n at mp4-sequence.ts:279:26\n*/\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-302b-4a12-bb75-009cf50c8752'; // next mix has issue (mix-position around 96)\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-531f-498e-9051-3349eb62f9e8'; // this mix has issue (mix-position around 95)\n\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-9fef-4e58-bccd-7f331d01eda6' // sounds quite good\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/05890acf-895f-4dcb-b8b4-0599cc029697/mix/00000006-2181-4dc2-b0b1-0dcbb15b794b'; // toxic\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-af3e-4e61-87f8-67534d46ad05'; // new testing track\n\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-9f8d-4787-996e-dfcd48052878'; // sick\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/05e3b915-1550-4545-b071-17ae32f4aac1/mix/00000006-b87e-4ff9-b651-ce36f48b7a1c'; // blue (ba da dee)\n\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-ad0d-40c5-ad47-e6bc5d5073f0'; // my name swvery\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-760b-4681-885a-8f5b9adc3115'; // cold heart\nconst STATION_TRACK_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/stationtrackid/380edd01-63c7-4c78-b9aa-45805017dd12';\n\n// import data from '@/services/00000006-57d0-4b7d-8f5e-15a1f1d22b26.json';\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/05e3b915-1550-4545-b071-17ae32f4aac1/mix/00000006-57d0-4b7d-8f5e-15a1f1d22b26?sharemix=true';// the fuck?2\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-5104-4680-aea3-e3015be90d4b' // the fuck?\n\n\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-16ec-4ebc-b09f-3ba1598045fd'; // last christmas\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-3f7d-4efa-b07b-380667d0f097'; // merry christmas\n\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-82cd-4cec-9458-9747d2b02956'; // blackhole\n\n// Harutya\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/05e3b915-1550-4545-b071-17ae32f4aac1/mix/00000006-8cec-401a-bcd2-9db94971e2c1?stems=obd&mode=mix&mp=44';\n\n// J-dilla album 1 with broken mp4 tail:\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/00000005-20e5-4e53-b30f-159a0c4245d9/mix/00000006-6b8b-48dd-96ba-681f483f6ed8?stems=v&mode=mix&mp=2';\n// snap my finger\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/00000005-9ed8-4c92-b1fc-4058d5782719/mix/00000006-38ad-4472-814b-54b2a65a1c1e?stems=v&mode=infinite-mix&mp=763'\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/05e93986-90ac-4542-9912-af935896bca6/mix/00000006-3355-452b-b329-efad0b4a60eb?stems=v&mode=mix&mp=179';\n// const MIX_INPUT = 'https://lawful-stem.netlify.app/set/05e93986-90ac-4542-9912-af935896bca6/mix/00000006-38d1-43e1-a476-e4acb1ff2a01?stems=v&mode=mix&mp=193';\n\n// Metronome\n// const MIX_INPUT = 'https://unstable-stemplatform.netlify.app/set/00000005-1111-2222-3333-444444444444/mix/00000006-1111-2222-3333-444444444444';\n\nexport type STEM_FIELDS_SUPPORTED = 'mp4';\n\nexport const USE_LOCAL_SILENT_CHUNK_TS = false;\nexport const GRAPHQL_FIELDS_TO_USE_FOR_AUDIO: STEM_FIELDS_SUPPORTED = 'mp4'; // remember to edit the tempoOrigSz if it is from beat this.\n\nexport const SAVE_REMOTE_M3U8_AAC_TO_LOCAL = false;\n\n// PLAY UN-QUANTISED MP3\nexport const CREATE_QUANTISED_WAV_AS_HLS_AAC = false;\nexport const CREATE_UNQUANTISE_MP3_AS_HLS_AAC = false;\n\nexport const COVER_REMIXES_WHEN_SAVE_TO_LOCAL = false;\n\n// IF ENABLED, ONLY PRINT THE COMMAND TO CURL/FFMPEG\nexport const PRINT_CURL_COMMAND_ON_SOURCE_FILE_ONLY = false;\n\nconst mixObject = data;\n// console.log(mixObject)\nconst mixObject_2 = data2;\nconst mixObject_3 = data3;\n\ntype PrototypePanelV2Props = object;\n\nexport const PrototypePanelV2: React.FC<PrototypePanelV2Props> = () => {\n \n const textAreaMultipleMixesGraphql = useRef<HTMLTextAreaElement | null>(null);\n const textAreaMultipleMixesGraphql_2 = useRef<HTMLTextAreaElement | null>(null);\n const textAreaMultipleMixesGraphql_3 = useRef<HTMLTextAreaElement | null>(null);\n \n const mixIdInputRef = useRef<HTMLInputElement | null>(null);\n const mixIdInputRef_2 = useRef<HTMLInputElement | null>(null);\n\n // State to track if copy buttons should be enabled\n const [isCopyEnabled1, setIsCopyEnabled1] = useState(false);\n const [isCopyEnabled2, setIsCopyEnabled2] = useState(false);\n const [currentMix] = useAudioEngineCurrentTrack();\n \n // Subscribe to mix JSON store - when a mix is loaded from mix list, update textarea/input\n const mixJsonString = useCurrentStationTrackJsonStore((state) => state.stationTrackJsonString);\n const mixURL = useCurrentStationTrackJsonStore((state) => state.stationTrackUrl);\n\n const handleFetchMixData = useCallback(async (URL: string, textAreaRef: React.RefObject<HTMLTextAreaElement | null>) => {\n const inputElement = textAreaRef.current;\n \n if (!inputElement) {\n console.error('Input element is not available');\n return;\n }\n\n const json = await fetchStationTrackDataWithSharedURL(URL);\n inputElement.value = json ?? '';\n }, []); // No need for beatVersion dependency as it's now managed via window-debug-tools\n\n const copyToClipboard = useCallback(async (textAreaRef: React.RefObject<HTMLTextAreaElement | null>) => {\n const textArea = textAreaRef.current;\n if (!textArea) {\n console.error('Textarea element is not available');\n return;\n }\n\n try {\n await navigator.clipboard.writeText(textArea.value);\n console.log('Content copied to clipboard');\n } catch (err) {\n console.error('Failed to copy content to clipboard:', err);\n // Fallback for older browsers\n textArea.select();\n document.execCommand('copy');\n }\n }, []);\n\n // Extract mixId from URL pattern: set/{stationId}/mix/{mixId}\n const extractMixIdFromUrl = useCallback((url: string): string | null => {\n const match = url.match(/\\/stationtrack\\/([^/?]+)/);\n return match ? match[1] : null;\n }, []);\n\n // Extract mixId from JSON data\n const extractMixIdFromJson = useCallback((jsonString: string): string | null => {\n try {\n const data: StationTrackJsonReturn = JSON.parse(jsonString);\n return data?.data?.stations?.[0]?.currentTrack?.[0]?.stationTrackId || null;\n } catch (err) {\n return null;\n }\n }, []);\n\n // Check if copy button should be enabled for a given input/output pair\n const isCopyEnabled = useCallback((inputRef: React.RefObject<HTMLInputElement | null>, textAreaRef: React.RefObject<HTMLTextAreaElement | null>) => {\n const inputUrl = inputRef.current?.value || '';\n const textAreaContent = textAreaRef.current?.value || '';\n \n const inputMixId = extractMixIdFromUrl(inputUrl);\n const outputMixId = extractMixIdFromJson(textAreaContent);\n \n return Boolean(inputMixId && outputMixId && inputMixId === outputMixId);\n }, [extractMixIdFromUrl, extractMixIdFromJson]);\n\n // Update copy button states\n const updateCopyButtonStates = useCallback(() => {\n setIsCopyEnabled1(isCopyEnabled(mixIdInputRef, textAreaMultipleMixesGraphql));\n setIsCopyEnabled2(isCopyEnabled(mixIdInputRef_2, textAreaMultipleMixesGraphql_2));\n }, [isCopyEnabled]);\n\n // React to mix JSON store changes - when a mix is loaded from mix list, update textarea/input\n useEffect(() => {\n if (mixJsonString && mixURL) {\n if (textAreaMultipleMixesGraphql.current) {\n textAreaMultipleMixesGraphql.current.value = mixJsonString;\n }\n if (mixIdInputRef.current) {\n mixIdInputRef.current.value = mixURL;\n }\n updateCopyButtonStates();\n }\n }, [mixJsonString, mixURL, updateCopyButtonStates]);\n\n const fetchMixClickHandler = ()=>{\n if (!mixIdInputRef.current) return;\n handleFetchMixData(mixIdInputRef.current.value, textAreaMultipleMixesGraphql)\n .then((e)=>{\n updateCopyButtonStates();\n \n // Use the shared utility function to load the mix\n if (textAreaMultipleMixesGraphql.current && mixIdInputRef.current) {\n loadStationTrackFromJsonForPrototype(textAreaMultipleMixesGraphql.current.value, mixIdInputRef.current.value);\n }\n \n })\n .catch((err)=>{\n console.log('error received at V2 panel');\n console.error(err);\n });\n };\n \n // Check copy button states when inputs change\n useEffect(() => {\n updateCopyButtonStates();\n }, [updateCopyButtonStates]);\n\n\n /*\n useEffect(() => {\n fetchMixClickHandler();\n \n // trigger fetch mix on mount:\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n */\n\n /*\n // enable if using local Mix JSON\n useEffect(() => {\n updateCopyButtonStates();\n \n preloadSeedAndSetAsCurrentTrack();\n preloadMixAndSetAsCurrentTrack();\n assignOptionalParamOfCurrentTrack();\n \n // trigger fetch mix on mount:\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n */\n\n return (\n <div className='stem-aev3-styles'>\n <div className=\"\">\n {/* Hidden textarea for first mix data */}\n <Textarea \n id=\"fetch-mix-textarea\"\n className='min-h-10' \n ref={textAreaMultipleMixesGraphql} \n placeholder=\"Mixes\" \n defaultValue={JSON.stringify(mixObject)}\n style={{ display: 'none' }}\n />\n <div>\n <Input ref={mixIdInputRef} id=\"fetch-mix-input\" placeholder=\"Enter Mix ID\" onChangeCapture={e => {}} onChange={updateCopyButtonStates} type=\"text\" defaultValue={STATION_TRACK_INPUT} />\n <Button className='button-cta' id=\"fetch-mix-submit\" onClick={fetchMixClickHandler}>Fetch Mix</Button>\n <Button \n onClick={() => copyToClipboard(textAreaMultipleMixesGraphql)}\n disabled={!isCopyEnabled1}\n >Copy JSON</Button>\n\n <Button \n onClick={() => {\n const a = getStemDownloadInfo();\n console.log(a);\n }}\n >Print StemInfo</Button>\n\n <Button \n onClick={() => {\n const a = downloadCurrentTrackStemsAsZip();\n console.log(a);\n }}\n >Download track</Button>\n\n \n </div>\n </div>\n </div>\n );\n};\n\n","/**\n* Note following TBACS does not support the looping yet\n*/\n\nimport { BarChunkDetails } from \"../decode/types-interfaces\";\nimport { TBACSEvent } from \"../global-aev3-controller\";\n\nexport const composeTBACSEvent = (\n detail: BarChunkDetails,\n djAction: { trackId: string, sequenceIdx: number, vol: number, startTime: number, }[],\n stationTrackId?: string,\n trackMixType?: 'seed' | 'mix'\n): TBACSEvent | null => {\n // console.log('%c/****** TBACS Logging *******/', 'color: purple; background: pink');\n // console.log(event);\n // console.log(djAction);\n const {trackId, sequenceIdx, duration, _processorInternalSpeed} = detail.originalBar;\n const djActionOfStems = djAction.filter((dj)=>dj.trackId === trackId && dj.sequenceIdx === sequenceIdx);\n // console.log(djActionOfStems);\n const {\n playbackRate,\n isPlayingQuantised,\n speedRatio_SeedMixMatching_Resolved,\n speedRatio_ManualScheduling,\n } = _processorInternalSpeed;\n \n if (djActionOfStems.length > 0) {\n const durationTunnedWithSpeedChange = duration * playbackRate * speedRatio_SeedMixMatching_Resolved * speedRatio_ManualScheduling;\n \n const playedTime = calculateUnmutedDuration(\n djActionOfStems,\n detail.contextTime - durationTunnedWithSpeedChange, detail.contextTime,\n );\n \n const event: TBACSEvent = {\n type: 'tbacs_bar_played',\n detail: {...detail.originalBar, unmutedPlayTime: playedTime, stationTrackId: stationTrackId || '', trackMixType: trackMixType || 'seed'}\n }\n \n // console.log('%c/****** TBACS Logging *******/', 'color: purple; background: pink', event);\n \n return event;\n }\n return null;\n}\n\nexport const getDefaultDJAction = (seedTrackId: string, mixTrackId?: string) => {\n if (mixTrackId) {\n return [\n {trackId: seedTrackId,sequenceIdx: 0,vol: 1,startTime: 0,},\n {trackId: seedTrackId,sequenceIdx: 1,vol: 1,startTime: 0,},\n {trackId: seedTrackId,sequenceIdx: 2,vol: 1,startTime: 0,},\n {trackId: seedTrackId,sequenceIdx: 3,vol: 1,startTime: 0,},\n {trackId: mixTrackId,sequenceIdx: 0,vol: 0,startTime: 0,},\n {trackId: mixTrackId,sequenceIdx: 1,vol: 0,startTime: 0,},\n {trackId: mixTrackId,sequenceIdx: 2,vol: 0,startTime: 0,},\n {trackId: mixTrackId,sequenceIdx: 3,vol: 0,startTime: 0,}\n ];\n }\n return [\n {trackId: seedTrackId,sequenceIdx: 0,vol: 1,startTime: 0,},\n {trackId: seedTrackId,sequenceIdx: 1,vol: 1,startTime: 0,},\n {trackId: seedTrackId,sequenceIdx: 2,vol: 1,startTime: 0,},\n {trackId: seedTrackId,sequenceIdx: 3,vol: 1,startTime: 0,}\n ];\n}\n\n\nexport enum DJ_ACTION {\n vol_change = 1,\n}\n\n// export interface IVolumeProfileChange { type: DJ_ACTION, isMuted: boolean, currentTime: number, volume: number, stemType: IStemType, isAutoMix: boolean }\n\n/*\nthis._experimental_dj_action[sequenceIdx].push({\ntype: DJ_ACTION.vol_change,\nisMuted: value === 0,\ncurrentTime: this.getCurrentTime(),\nvolume: value,\nstemType: id,\nisAutoMix,\n});\n\ncalculateUnmutedDuration(\nthis._experimental_dj_action[type],\n_start, _end,\n);\n\n*/\ninterface TimeRange {\n start: number;\n end: number;\n}\n\nexport function calculateOverlap(range1: TimeRange, range2: TimeRange) {\n // Find the later start time and the earlier end time\n const maxStart = Math.max(range1.start, range2.start);\n const minEnd = Math.min(range1.end, range2.end);\n \n // Calculate the overlap\n const overlap = minEnd - maxStart;\n \n // If overlap is negative, there is no overlap\n return overlap > 0 ? overlap : 0;\n}\n\nexport function calculateUnmutedDuration (\n records: { trackId: string, sequenceIdx: number, vol: number, startTime: number }[],\n startTimeRelatedToBaseTrack: number,\n endTimeRelatedToBaseTrack: number\n): number {\n const startTime = startTimeRelatedToBaseTrack;\n const endTime = endTimeRelatedToBaseTrack;\n \n if (!Array.isArray(records) || records.length === 0) {\n throw new Error('Invalid records array');\n }\n \n if (records.length === 0) {\n // return if no Volume change record found\n // DebuggerConsoleLog('calculateUnmutedDuration: 1');\n return 0;\n }\n \n if (records.length === 1) {\n // for single record, determine base on first item's mute status\n if (records[0].vol===0) {\n // DebuggerConsoleLog('calculateUnmutedDuration: 2');\n return 0;\n }\n // DebuggerConsoleLog('calculateUnmutedDuration: 3');\n return endTime - startTime;\n }\n \n // for record with more than 1 item:\n // DebuggerConsoleLog('calculateUnmutedDuration: 4');\n let unmutedDuration = 0;\n \n for (let i = 0; i < records.length; i = i + 1) {\n const start = records[i].startTime;\n const end = records[i + 1]?.startTime || 99999999999;\n \n if (records[i].vol!==0) {\n // DebuggerConsoleLog('==CONSIDER== as it is not muted:');\n // DebuggerConsoleLog(records[i]);\n // DebuggerConsoleLog(records[i + 1]);\n // union between start vs startTime // end vs endTime\n const obj1: TimeRange = { start, end };\n const obj2: TimeRange = { start: startTime, end: endTime };\n // DebuggerConsoleLog(obj1);\n // DebuggerConsoleLog(obj2);\n const section = calculateOverlap(obj1, obj2);\n unmutedDuration += section;\n // DebuggerConsoleLog(`add ${section} unmutedDuration as ${unmutedDuration}`);\n }\n }\n return unmutedDuration;\n}\n","/**\n * seedBarPlaying <<< this guy is a master bar sequence likely\n */\n\n// import { ENABLE_CAMUS_INTERCEPTION_AT_VARIANT } from \"@/services/engine_dev_flags\";\nimport { BarSequence } from \"../../decode/bar-sequence\";\nimport { combineSegmentsOfTwoBarSequences } from \"../../decode/parser\";\n// import { StemSwithingSchedulerSignature } from \"../..decode/types-interfaces\";\nimport { AEV3Controller } from \"../../global-aev3-controller\";\n// import { applyStemProfile } from \"../../store/stems-master-state-store\";\n// import { getTargetTempoOrigSzAndBpmRatio } from \"../../utils/audio\";\nimport { consoleColorfulMessage4Lawful } from \"../../utils/colorConsole\";\n// import { PitchShiftStrategy } from \"../..utils/seed-mix-utils\";\n// import { isTwoSegmentContinuous } from \"../bar-sequence-swap-at-locus\";\n// import { findTargetSegmentIndexToReplace_baseOnFirstSegmentOfNewBar } from \"../variants-utils\";\n\n\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst _BSSALA_log: typeof console.log = (...data) => {\n if (!AEV3Controller.getInstance()?.colorful_debugging) return;\n if (data.length > 1) {\n if (typeof data[0] === 'string') {\n data[0] = '𧬠[Intelliskip] ' + data[0];\n }\n console.log(...data);\n } else {\n const [message] = data;\n if (typeof message === 'string') {\n consoleColorfulMessage4Lawful(`[Intelliskip] ${message}`, '#d51df1ff', '#fcc913ff', 8, 'π§¬');\n // console.log('𧬠[Intelliskip] ', message);\n } else {\n console.log('𧬠[Intelliskip] ', message);\n }\n }\n};\n\n// Important: Seed2 is taking lead in this `swapSeedMixAtRuntime` util\n// when composing transition area\nexport const swapSeedMixAtRuntime = (\n // current mix, or refreh mix, which assume seedTrack1 is same\n seedBarPlaying: BarSequence, mixBarPlaying: BarSequence,\n // numberOfCurrentSeedSegmentToCutOff: number,\n newSeedBar: BarSequence, newMixBar: BarSequence,\n // seed2DurationBarCount: number,\n // seed2StartingBarIndexAdopted: number,\n // TODO:\n // remixId: string,\n ) => {\n\n // infiniteInfo.seedBar.setPlayQuantisedSpeedOnBars(seed1.getPlayQuantisedSpeedOnBars());\n // infiniteInfo.mixBar.setPlayQuantisedSpeedOnBars(mix1.getPlayQuantisedSpeedOnBars());\n const swapTrackIndex0_n_1 = false;\n const debugStationMixIdSignature = 'from locus swapping';\n\n /*\n if (!isTwoSegmentContinuous(seedBarPlaying.sequences[0].segments[seedBarPlaying.sequences[0].segments.length-1], newSeedBar.sequences[0].segments[0] )){\n _BSSALA_log(`OPS FAILED!!! the seed track is NOT continuous at Mix Variants`);\n throw Error ('sample is not continuous (swapping mix variants)');\n } else {\n _BSSALA_log(`OPS Successful!!! the seed track is continuous at Mix Variants`);\n }\n */\n \n\n\n\n\n // append seed2 to mix\n if (!seedBarPlaying.sequences || !newSeedBar.sequences || !mixBarPlaying.sequences || !newMixBar.sequences) {\n throw new Error('bar-sequence-swap-at-locus-action-skipping: missing sequences');\n }\n combineSegmentsOfTwoBarSequences(seedBarPlaying.sequences, newSeedBar.sequences, true, true, true, true, {\n trackData: newSeedBar.trackData,\n targetKey: newSeedBar.targetKey,\n targetBarLength48000: newSeedBar.targetBarLength48000,\n targetTonality: newSeedBar.targetTonality,\n ratioWhenComposingBar: newSeedBar.ratioWhenComposingBar,\n pitchShift: newSeedBar.pitchShift,\n trackType: 'seed', \n debugStationMixIdSignature,\n barIndexStart: newSeedBar.barIndexStart,\n barIndexEnd: newSeedBar.barIndexEnd,\n }, swapTrackIndex0_n_1);\n // append to seed\n combineSegmentsOfTwoBarSequences(mixBarPlaying.sequences, newMixBar.sequences, true, true, true, true, {\n trackData: newMixBar.trackData,\n targetKey: newMixBar.targetKey,\n targetBarLength48000: newMixBar.targetBarLength48000,\n targetTonality: newMixBar.targetTonality,\n ratioWhenComposingBar: newMixBar.ratioWhenComposingBar,\n pitchShift: newMixBar.pitchShift,\n trackType: 'mix', \n debugStationMixIdSignature,\n barIndexStart: newMixBar.barIndexStart,\n barIndexEnd: newMixBar.barIndexEnd,\n }, swapTrackIndex0_n_1);\n \n // for each item if they are not transitional bar, update the chunkId \n // seedBarPlaying.sequences.forEach((s)=>{\n // s.segments.forEach((e)=>{\n\n // })\n // });\n\n // AEV3Controller.getInstance().consoleBarSampleContinuity();\n}\n\n\n// pending\n// the mixId ising updated at current track obj after swap","/**\n * This is brain to resolve the final start/end bar Index of mainly SEED2\n * it takes in seed2, mix2, and preferrable transition duration (based on seed2)\n * and decide the resolved start/end barIndex for seed2/mix2\n * \n * If the start bar index of Seed2 changed, it will be reflected by the proposed seed2TransitBarCounts\n * basically the only 2 variable should be modify \n * the Seed2, startBarIndex & TransitionBarCounts, \n * which depend on currentPlayIndex / Possible replenish length of of Seed1\n * \n * \n * new resolved param:\n * seed1 - target to cut it, it must be start of real bar index and it will always be replenished till the end and loop at somewhere (now default at segment start), \n * in short this beat index will be used for recreation of transition\n * \n * \n * \n * to new util\n * \n * 1. cut (from where)\n * 2. generate transitin zone (seed1 from where), (seed2 from where)\n * 3. generate next bar (from where)\n * 4. contactentate\n * \n * \n * \n * the 8 bars intelliskip at end of auto play next now refactored and safeguard at a step earlier\n * if wished bar is 8 but if it is not possible to achieve at runtime, the resolver will decrease \n * the 8->7 and retry until 0 and throw an error\n * \n * when this procedure has a transition duration as 0 bars, it should just disable the transtion\n * \n * the script which do the life locus swapping now cleaned up and remove unnecessary logic\n */\n\nimport { BarSequence } from \"../decode/bar-sequence\";\nimport { AEV3Controller } from \"../global-aev3-controller\";\nimport { ITrackForSequence, StemProfileString } from \"../interface\";\nimport { getTargetTempoOrigSzAndBpmRatio } from \"../utils/audio\";\nimport { consoleColorfulMessage, consoleColorfulMessage4Lawful } from \"../utils/colorConsole\";\nimport { preloadMP4s_OnlyCheckIfInitialised } from \"../utils/preload\";\nimport { PitchShiftStrategy } from \"../utils/seed-mix-utils\";\nimport { swapSeedMixAtRuntime } from \"./swap-at-locus-actions/bar-sequence-swap-at-locus-action-skipping-refactored\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const prepareAssignNextMixWithoutTransition = (\n seedTrack: ITrackForSequence, \n mixTrack: ITrackForSequence, \n stationId: string, \n stationTrackId: string, \n seedTrackStartingIndex: number,\n seedTrackEndingIndex: number,\n mixTrackStartingIndex: number,\n mixTrackEndingIndex: number,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stemProfile: StemProfileString,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n let processStart = false;\n \n if (AEV3Controller.getInstance().getCurrentSeedTrackObject()?.trackId === seedTrack.trackId\n && AEV3Controller.getInstance().getCurrentMixTrackObject()?.trackId === mixTrack.trackId) {\n reject(new Error('Track provided is same as current mix track'));\n return;\n }\n\n if (AEV3Controller.getInstance().getIsBusy()) {\n consoleColorfulMessage('V3 currently is busy', '#d311ffff', '#ffffff');\n reject(new Error('Engine is busy now'));\n return;\n }\n\n // TODO: santise the mp4 tail - is it done?\n\n processStart = true;\n AEV3Controller.getInstance().setIsBusy(true, 'skipping');\n \n const starttime = Date.now(); // benchmark it\n \n let newSeedBar: BarSequence;\n let newMixBar: BarSequence;\n\n\n\n\n\n\n \n\n \n \n const seedBarPlaying = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBarPlaying = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n consoleColorfulMessage4Lawful(`[skipping] following items are for skipping ${stationTrackId}`, '#d311ffff', '#ffffff');\n // console.log('π Current', seedBarPlaying, mixBarPlaying);\n // console.log('π Composed', newSeedBar, newMixBar);\n\n preloadMP4s_OnlyCheckIfInitialised([{track: seedTrack}, {track: mixTrack}])\n .then((e) => {\n if (e?.[0]?.success === false) {\n throw Error('failed to preload mix obj manifest');\n }\n // if the MP4 is resolved but it is flawed\n const seedTrackAudioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(seedTrack.trackId);\n if (!seedTrackAudioSource) {\n throw Error(`Audio source for seed track ${seedTrack.trackId} not found in preloaded queue after successful preload`);\n }\n const seedTrackError = seedTrackAudioSource.errorOnInit;\n if (seedTrackError) {\n throw Error(seedTrackError)\n }\n\n const mixTrackAudioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(mixTrack.trackId);\n if (!mixTrackAudioSource) {\n throw Error(`Audio source for mix track ${mixTrack.trackId} not found in preloaded queue after successful preload`);\n }\n const mixTrackError = mixTrackAudioSource.errorOnInit;\n if (mixTrackError) {\n throw Error(mixTrackError)\n }\n\n const endtime = Date.now() - starttime;\n consoleColorfulMessage(`time to prepare swap : ${endtime.toFixed(2)}ms`)\n // console.log('π ', newSeedBar, newMixBar);\n\n // todo : prevent runtime jump when it is almost end of track (done)\n // autoplay: decodeAllSequencesWithBarIndex triggered 36 but AudioSourceSequence return nothing 02da1be8-6cb9-4f24-9f1e-363\n\n // is it fine to do it at transition: NO\n\n if (!seedBarPlaying || !mixBarPlaying) {\n throw new Error('Seed or mix bar sequence not available');\n }\n\n\n\n\n\n\n const configuredTransitionDuration_InSeed2BarCount = 0;\n let seed2DurationBarCount: number = 0;\n let numberOfSeed1SegmentToCutOff = 0;\n let seedTrackStartingIndex_resolved = seedTrackStartingIndex;\n try {\n\n const enableCacheController = false;\n const dropSeedMixLoadingActionSinceThisIsPseudoBar = true;\n const matchMixTracksDuration = false;\n // const isSequenceCreateForIntelliskip = true;\n \n \n \n try {\n const resolvedValues = calculateSeed2TransitBarCountsFeasible(seedBarPlaying, seedTrack, seedTrackStartingIndex, configuredTransitionDuration_InSeed2BarCount);\n seed2DurationBarCount = resolvedValues[0];\n seedTrackStartingIndex_resolved = resolvedValues[1];\n numberOfSeed1SegmentToCutOff = resolvedValues[2];\n if (seed2DurationBarCount === 0 ) {\n // throw ('no transition needed');\n }\n if (configuredTransitionDuration_InSeed2BarCount!==seed2DurationBarCount) {\n console.log(`%c!!!!!!! shortened the preferred transition as ${seed2DurationBarCount}`, 'color: red; background: black;');\n } else if (seedTrackStartingIndex_resolved!==seedTrackStartingIndex) {\n console.log(`%c!!!!!!! startingBarIndex of Seed2 changed from ${seedTrackStartingIndex} as ${seed2DurationBarCount}`, 'color: red; background: black;');\n } else {\n console.log(`%c!!!!!!! preferred transition fulfill as ${seed2DurationBarCount}`, 'color: red; background: black;');\n }\n \n } catch (err) {\n console.log(err);\n }\n\n const bpmInfo = getTargetTempoOrigSzAndBpmRatio(seedBarPlaying.trackData, seedBarPlaying.trackData);\n\n console.table({\n 'swapSeedMixAtRuntime': 'assign-next mix locus',\n 'seed1': seedBarPlaying.trackData.tempoOrigSz,\n 'seed2': seedTrack.tempoOrigSz,\n 'ratioWhenComposingBar of seed1 comparing to seed2': bpmInfo.ratioWhenComposingBar,\n 'seed2@transition - BAR to use': seed2DurationBarCount,\n 'seed1@transition - BAR to use (Also equal segment since it is seed)': numberOfSeed1SegmentToCutOff,\n 'numberOfSeed1SegmentToCutOff': numberOfSeed1SegmentToCutOff,\n });\n\n console.table({\n seed2StartingIndex: seedTrackStartingIndex_resolved, seed2endingIndex: seedTrackEndingIndex,\n mix2StartingIndex: mixTrackStartingIndex, mix2endingIndex: mixTrackEndingIndex, \n seed2DurationBarCount,\n numberOfSeed1SegmentToCutOff\n })\n // debugger;\n\n const a = AEV3Controller.getInstance().composeMixTheDuoTracksWithBarDestination(\n seedTrack, mixTrack, enableCacheController,\n seedTrackStartingIndex_resolved, seedTrackEndingIndex, \n mixTrackStartingIndex, mixTrackEndingIndex, \n `BarSequenceEditing:prepareSkipWithoutNextMix`, PitchShiftStrategy.DEFAULT,\n 'align-mix-segment-from-first-item',\n mixTrackStartingIndex,\n AEV3Controller.getInstance().getPlayMixAsQuantised(),\n dropSeedMixLoadingActionSinceThisIsPseudoBar,\n matchMixTracksDuration,\n );\n newSeedBar = a.seedBar;\n newMixBar = a.mixBar;\n } catch (error) {\n AEV3Controller.getInstance().setIsBusy(false, 'skipping error');\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n \n\n swapSeedMixAtRuntime(\n seedBarPlaying, \n mixBarPlaying, // no stakes here\n // whereToCutAtSeedBarPlaying, even last bar it is fine because it can always regenerate?\n // based on whereToCutAtSeedBarPlaying, grab the startBeatIndex and generate Seed1Trans (mix match)\n // numberOfSeed1SegmentToCutOff,\n newSeedBar, newMixBar,\n // Real bar duration (Seed2)\n // this one used to determine startBarIndex of Seed2 to Seed1, and seems it inter-dependent to whereToCutAtSeedBarPlaying\n // if this Seed2Bar = 8, BPM ratio is seed2 = seed1 x 2 that means 16 bars of seed1 is needed to fill this gap\n // if bar index playing at Seed1 is less than 16 bars before end then this will be problem\n // so this number when provided, should try to obey it because the fade In point is very important\n // if the Seed1 is allowed to loop when composing as transition segment then no matter how large this value is it won't be a problem\n // seed2DurationBarCount,\n // seedTrackStartingIndex, //seed2StartingBarIndexAdopted,\n );\n // resolve next mix\n AEV3Controller.getInstance().setNextSeedTrackObject(newSeedBar.trackData, false, -1, 'assign next mix v2');\n AEV3Controller.getInstance().setNextMixTrackObject(newMixBar.trackData, false, -1, 'assign next mix v2');\n AEV3Controller.getInstance().setNextTrackOptionalParam({...AEV3Controller.getInstance().getNextTrackOptionalParam(), stationTrackId, stationId});\n // AEV3Controller.getInstance().setNextMixConfiguration(null);\n\n // todo : mark the segments before variant plays, and ban all action before head\n AEV3Controller.getInstance().setIsBusy(false, 'skipping finished');\n resolve();\n })\n .catch((error) => {\n if (processStart) {\n AEV3Controller.getInstance().setIsBusy(false, 'skipping error');\n }\n if (error.toString().includes('swapSeedMixAtRuntime is prohibited at Transition Zone')) {\n console.log('target segmentIdx fall into transition zone, maybe should retry with shorter duration.');\n }\n reject(error);\n });\n });\n};\n\n/**\n * some more factor when we do this at runtime\n * @param seedBarPlaying \n * @param seed2 \n * @param seed2StartingBarIndex \n * @param seed2TransitBarCounts \n * @returns {[number, number]} [seed2DurationBarCount, seed2SegmentStartBarIndex_Tunned, numberOfSeed1SegmentToCutOff]\n */\nconst calculateSeed2TransitBarCountsFeasible = (seedBarPlaying: BarSequence, seed2: ITrackForSequence, seed2SegmentStartingBarIndex: number, seed2TransitBarCounts: number) => {\n const seed2DurationBarCount = seed2TransitBarCounts;\n const seed2SegmentStartingBarIndex_origin = seed2SegmentStartingBarIndex;\n \n // this is seed2\n \n if (seed2SegmentStartingBarIndex - seed2DurationBarCount < 0) {\n // change seed2SegmentStartingBarIndex according to seed2DurationBarCount, IF WE WANT transition\n seed2SegmentStartingBarIndex = seed2DurationBarCount;\n } else {\n // seed2DurationBarCount safe for now\n }\n\n\n // if (isSequenceCreateForIntelliskip) {\n // seedTrackStartingIndex = getSeedTrackStartingIndexForIntelliskip(seedTrack, AEV3Controller.getInstance().getPlayMode());\n // if (seedTrackStartingIndex - seed2DurationBarCount < 0) {\n // // change seedTrackStartingIndex according to seed2DurationBarCount, IF WE WANT transition\n // seedTrackStartingIndex = ;// something\n // }\n // }\n\n const bpmInfo = getTargetTempoOrigSzAndBpmRatio(seed2, seedBarPlaying.trackData);\n const numberOfSeed1SegmentToCutOff = seed2DurationBarCount / bpmInfo.ratioWhenComposingBar;\n\n if ((seedBarPlaying.getBarsLength(0) ?? 0) - numberOfSeed1SegmentToCutOff >= seedBarPlaying.getMaximumPlayingIndex()+3) {\n // green to go\n console.log('green to go');\n } else {\n // shorten the seed2DurationBarCount\n if (seed2TransitBarCounts > 0) {\n return calculateSeed2TransitBarCountsFeasible(seedBarPlaying, seed2, seed2SegmentStartingBarIndex_origin, seed2TransitBarCounts - 1);\n } else {\n throw Error('cannot resolve a proper index');\n }\n }\n\n const seed2SegmentStartBarIndex_Tunned = seed2SegmentStartingBarIndex;\n // debugger;\n return [seed2DurationBarCount, seed2SegmentStartBarIndex_Tunned, numberOfSeed1SegmentToCutOff];\n}","import { BarSequence } from \"../decode/bar-sequence\";\nimport { StemSwithingSchedulerSignature } from \"../decode/types-interfaces\";\n\n/*\nconst assignStemSwitchingCommandAtTransitionZone = (transitionBarsBasedOnSeed1: number, firstBarIndexOfTransition: number, switchType: 'NM' | 'IN') => {\n const seed1 = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const seed2 = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n\n assignStemSwitchingCommandAtTransitionZone_Sub(seed1, seed2, transitionBarsBasedOnSeed1, firstBarIndexOfTransition, switchType);\n}\n*/\n\n/*\n * follow stem switching only can be applied asssuming the pipeline will swap after transition\n */\nconst assignStemSwitchingCommandAtTransitionZone_Sub_Inverted_Pipeline = (seed1: BarSequence, seed2: BarSequence, transitionBarsBasedOnSeed1: number, firstBarIndexOfTransition: number, switchType: 'NM' | 'IN' | 'IN-INVERT') => {\n const steps = 1;\n \n // const seed1 = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n // const seed2 = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n\n const signaturePrefix = switchType === 'IN' ? 'IN-' : 'NM-';\n\n if (transitionBarsBasedOnSeed1 === 1) {\n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( 0 * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( 0 * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 === 2) {\n const profile1_index = 0;\n // const profile2_index = -1;\n // const profile3_index = -1;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n // const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n // seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n // seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n // const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n // seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n // seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 === 3 || transitionBarsBasedOnSeed1 === 4) {\n const profile1_index = 0;\n // const profile2_index = -1;\n const profile3_index = 1;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: true, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n // const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n // seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n // seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 >= 5 && transitionBarsBasedOnSeed1 <=16 ) {\n const profile1_index = 0;\n let profile2_index = 2;\n let profile3_index = 4;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n switch(transitionBarsBasedOnSeed1) {\n case 5:\n profile2_index = 1;\n profile3_index = 2;\n break;\n case 6:\n case 7:\n profile2_index = 1;\n profile3_index = 3;\n break;\n case 8:\n case 9:\n profile2_index = 2;\n profile3_index = 4;\n break;\n case 10:\n case 11:\n profile2_index = 2;\n profile3_index = 5;\n break;\n case 12:\n case 13:\n profile2_index = 3;\n profile3_index = 6;\n break;\n case 14:\n case 15:\n profile2_index = 3;\n profile3_index = 7;\n break;\n case 16:\n profile2_index = 4;\n profile3_index = 8;\n break;\n \n }\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 > 16) {\n const profile1_index = 0;\n const profile2_index = Math.floor(transitionBarsBasedOnSeed1 / 4) * 2;\n const profile3_index = Math.floor(transitionBarsBasedOnSeed1 / 4) * 3;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n }\n}\n\nexport const assignStemSwitchingCommandAtTransitionZone_Sub = (seed1: BarSequence, seed2: BarSequence, transitionBarsBasedOnSeed1: number, firstBarIndexOfTransition: number, switchType: 'NM' | 'IN' | 'IN-INVERT') => {\n if (['NM', 'IN'].includes(switchType)) {\n return assignStemSwitchingCommandAtTransitionZone_Sub_Inverted_Pipeline(seed1, seed2, transitionBarsBasedOnSeed1, firstBarIndexOfTransition, switchType);\n } else {\n const _seed2 = seed1;\n const _mix1 = seed2;\n return assignStemSwitchingCommandAtTransitionZone_Sub_Keeping_Pipeline(_seed2, _mix1, transitionBarsBasedOnSeed1, firstBarIndexOfTransition, switchType);\n }\n}\n\n/*\nconst assignStemSwitchingExitingTransitionZone = (firstBarOfNextMix: number) => {\n const mix2 = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const seed2 = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n\n // all seed2 stems\n const profile: StemSwithingSchedulerSignature = {profileName: `IN-s2/m2 (1)`};\n mix2.setStemSwitchingCommandForIntelli(firstBarOfNextMix, {0: {enabled: false, profile: profile}, 1: {enabled: false, profile: profile}, 2: {enabled: false, profile: profile}, 3: {enabled: false, profile: profile}});\n seed2.setStemSwitchingCommandForIntelli(firstBarOfNextMix, {0: {enabled: true, profile: profile}, 1: {enabled: true, profile: profile}, 2: {enabled: true, profile: profile}, 3: {enabled: true, profile: profile}});\n}\n*/\n\n\nconst assignStemSwitchingCommandAtTransitionZone_Sub_Keeping_Pipeline = (seed1: BarSequence, seed2: BarSequence, transitionBarsBasedOnSeed1: number, firstBarIndexOfTransition: number, switchType: 'NM' | 'IN' | 'IN-INVERT') => {\n const steps = 1;\n \n // const seed1 = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n // const seed2 = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n\n const signaturePrefix = 'IN-INVERT-';\n\n if (transitionBarsBasedOnSeed1 === 1) {\n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( 0 * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( 0 * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 === 2) {\n const profile1_index = 0;\n // const profile2_index = -1;\n // const profile3_index = -1;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n // const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n // seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n // seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n // const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n // seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n // seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 === 3 || transitionBarsBasedOnSeed1 === 4) {\n const profile1_index = 0;\n // const profile2_index = -1;\n const profile3_index = 1;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n\n // all mix stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: true, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n // const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n // seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n // seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on mix, other + bass + drums on seed\n const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n \n // all seed stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 >= 5 && transitionBarsBasedOnSeed1 <=16 ) {\n const profile1_index = 0;\n let profile2_index = 2;\n let profile3_index = 4;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n switch(transitionBarsBasedOnSeed1) {\n case 5:\n profile2_index = 1;\n profile3_index = 2;\n break;\n case 6:\n case 7:\n profile2_index = 1;\n profile3_index = 3;\n break;\n case 8:\n case 9:\n profile2_index = 2;\n profile3_index = 4;\n break;\n case 10:\n case 11:\n profile2_index = 2;\n profile3_index = 5;\n break;\n case 12:\n case 13:\n profile2_index = 3;\n profile3_index = 6;\n break;\n case 14:\n case 15:\n profile2_index = 3;\n profile3_index = 7;\n break;\n case 16:\n profile2_index = 4;\n profile3_index = 8;\n break;\n \n }\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n } else if (transitionBarsBasedOnSeed1 > 16) {\n const profile1_index = 0;\n const profile2_index = Math.floor(transitionBarsBasedOnSeed1 / 4) * 2;\n const profile3_index = Math.floor(transitionBarsBasedOnSeed1 / 4) * 3;\n const profile4_index = transitionBarsBasedOnSeed1-1;\n\n // all seed stems except drums\n const profile1: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (1)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile1_index * steps), {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n \n // other + vocals on seed, bass + drums on mix (moved \"other\" switch from bar 2 to bar 4)\n const profile2: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (2)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: true, profile: profile2}, 1: {enabled: true, profile: profile2}, 2: {enabled: false, profile: profile2}, 3: {enabled: false, profile: profile2}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile2_index * steps), {0: {enabled: false, profile: profile2}, 1: {enabled: false, profile: profile2}, 2: {enabled: true, profile: profile2}, 3: {enabled: true, profile: profile2}});\n \n // vocals only on seed, other + bass + drums on mix\n const profile3: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (3)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: false, profile: profile3}, 1: {enabled: true, profile: profile3}, 2: {enabled: false, profile: profile3}, 3: {enabled: false, profile: profile3}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile3_index * steps), {0: {enabled: true, profile: profile3}, 1: {enabled: false, profile: profile3}, 2: {enabled: true, profile: profile3}, 3: {enabled: true, profile: profile3}});\n \n // all mix stems\n const profile4: StemSwithingSchedulerSignature = {profileName: `${signaturePrefix}s1/s2 (4)`};\n seed1.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n seed2.setStemSwitchingCommandForIntelli(firstBarIndexOfTransition + ( profile4_index * steps), {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n }\n}","/**\n * This is the newer master bar sequence application - swapping future's segments\n * \n * 0) first usage will be replacing all the future segments to be played\n * 1) possible to toggle to longer segment on the same track without breaking (Toggle Mode without Breaking)\n * 2) seekTo transition zone\n * \n * Requirement:\n * <del>starting point must not be transition zone</del>\n * \n * [ Current Mix (S1/M2) ][ NEXT MIX ]\n * [ Current Mix (S1/M4) ][ NEXT MIX ]\n * \n * Zoom In:\n * [ Current Mix (S1) ][ Current Mix (S1) ][ NEXT MIX ]\n * [ Current Mix (M2) ][ Current Mix (M4) ][ NEXT MIX ]\n * \n * Create a whole new pair of Sequences, which [NO EVENT LISTENERS ADDED!!!!!!!!] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< READ ME!\n * 1. Create a new Mix (S1/M4)\n * 2. Resolve the MP4 tail of M4\n * 3. Attach next Mix\n * \n * [NEXT]\n * Validate if current playhead has S1 overlapping and S1 still the active playing segment on the sequence, if yes...\n * carry on replace it at playhead + 2\n * make sure when replacing, the update genetics must be covered - the PS should be applied right the way\n */\n\nimport { IBarSequence, IBarSequenceChunk } from \"../../decode/types-interfaces\";\nimport { AEV3Controller } from \"../../global-aev3-controller\";\nimport { consoleColorfulMessage } from \"../../utils/colorConsole\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst _BSSAL_log: typeof console.log = (...data) => {\n return;\n if (!AEV3Controller.getInstance()?.colorful_debugging) return;\n if (data.length > 1) {\n if (typeof data[0] === 'string') {\n data[0] = 'βΎοΈ [202510] ' + data[0];\n }\n console.log(...data);\n } else {\n const [message] = data;\n if (typeof message === 'string') {\n consoleColorfulMessage(message, '#18fef3ff', '#c6db08ff', 8,'βΎοΈ');\n } else {\n console.log(message);\n }\n }\n};\n\n/** Asserts stem bar sequences exist (four tracks) for swap-at-locus paths. */\nexport const barSequencesOrThrow = (bar: { sequences: IBarSequence[] | null }, label: string): IBarSequence[] => {\n const s = bar.sequences;\n if (s === null || s.length < 4) {\n throw new Error(`${label}: BarSequence.sequences missing or incomplete`);\n }\n return s;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const isContainsRealStartOfBeatInSegment = (segment: IBarSequenceChunk, nextSegmentForDebug: IBarSequenceChunk): boolean => {\n // console.log('NIKKE CURRENT', segment)\n // console.log('NIKKE NEXT', nextSegmentForDebug)\n if (segment.chunkId.includes('_eve') \n || (!segment.isSegmentFromSplittedBar)\n ) {\n return true;\n }\n return false;\n}\n\nexport const isTwoSegmentContinuous = (segment1: IBarSequenceChunk, segment2: IBarSequenceChunk): boolean => {\n const ob1 = segment1.originalBar;\n const ob2 = segment2.originalBar;\n if (!ob1 || !ob2) {\n return false;\n }\n const isContinuous = ob1.sampleEnd + 1 === ob2.sampleStart;\n if (!isContinuous) {\n console.table({\n 'previous segment end at': ob1.sampleEnd,\n 'new segment starts at': ob2.sampleStart,\n });\n }\n return isContinuous;\n}\n\nexport const isSampleStartExactMatchBetweenInTargetSegments = (sampleStart: number, segments: IBarSequenceChunk[]): boolean => {\n \n // use the sample start/end instead of chunkId\n const segmentIndexFound = segments.findIndex(\n (c) => {\n const ob = c.originalBar;\n return !!ob && ob.sampleStart <= sampleStart && sampleStart <= ob.sampleEnd;\n },\n );\n \n if (segmentIndexFound === -1) {\n return false;\n }\n const foundOb = segments[segmentIndexFound].originalBar;\n return foundOb !== null && foundOb.sampleStart === sampleStart;\n}","/**\n * seedBarPlaying <<< this guy is a master bar sequence likely\n */\n\n// import { ENABLE_CAMUS_INTERCEPTION_AT_VARIANT } from \"@/services/engine_dev_flags\";\nimport { BarSequence } from \"../../decode/bar-sequence\";\nimport { combineSegmentsOfTwoBarSequences, cutSegmentsInBarSequences, applyNewSpeedFactorToQuantisedSegments, alignSpeedOfMixToUnquantisedSeedOfComposedSeedMix, alignSpeedOfSeedToUnquantisedMixOfComposedSeedMix } from \"../../decode/parser\";\nimport type { IBarSequence } from \"../../decode/types-interfaces\";\n// import { StemSwithingSchedulerSignature } from \"../decode/types-interfaces\";\nimport { AEV3Controller } from \"../../global-aev3-controller\";\n// import { applyStemProfile } from \"../store/stems-master-state-store\";\n// import { getTargetTempoOrigSzAndBpmRatio } from \"../utils/audio\";\nimport { consoleColorfulMessage4Lawful } from \"../../utils/colorConsole\";\nimport { PitchShiftStrategy } from \"../../utils/seed-mix-utils\";\nimport { assignStemSwitchingCommandAtTransitionZone_Sub } from \"../bar-sequence-stem-switching\";\nimport { barSequencesOrThrow } from \"./utils\";\n// import { isTwoSegmentContinuous } from \"./bar-sequence-swap-at-locus\";\n// import { findTargetSegmentIndexToReplace_baseOnFirstSegmentOfNewBar } from \"./variants-utils\";\n\n\n\nconst _BSSALA_log: typeof console.log = (...data) => {\n if (!AEV3Controller.getInstance()?.colorful_debugging) return;\n if (data.length > 1) {\n if (typeof data[0] === 'string') {\n data[0] = '𧬠[Intelliskip] ' + data[0];\n }\n console.log(...data);\n } else {\n const [message] = data;\n if (typeof message === 'string') {\n consoleColorfulMessage4Lawful(`[Intelliskip] ${message}`, '#d51df1ff', '#fcc913ff', 8, 'π§¬');\n // console.log('𧬠[Intelliskip] ', message);\n } else {\n console.log('𧬠[Intelliskip] ', message);\n }\n }\n};\n\n// Important: Seed2 is taking lead in this `swapSeedMixAtRuntime` util\n// when composing transition area\nexport const swapSeedMixAtRuntime = (\n // current mix, or refreh mix, which assume seedTrack1 is same\n seedBarPlaying: BarSequence, mixBarPlaying: BarSequence,\n numberOfCurrentSeedSegmentToCutOff: number,\n newSeedBar: BarSequence, newMixBar: BarSequence,\n seed2DurationBarCount: number,\n seed2StartingBarIndexAdopted: number,\n // TODO:\n // remixId: string,\n ) => {\n\n const seedPlayingSeqs = barSequencesOrThrow(seedBarPlaying, 'seedBarPlaying');\n const mixPlayingSeqs = barSequencesOrThrow(mixBarPlaying, 'mixBarPlaying');\n const newSeedSeqs = barSequencesOrThrow(newSeedBar, 'newSeedBar');\n const newMixSeqs = barSequencesOrThrow(newMixBar, 'newMixBar');\n\n // get the current playing Index\n // determine the expect point of swapping\n\n\n \n const segments = seedPlayingSeqs[0]!.segments;\n const barsLength = seedBarPlaying.getBarsLength(0);\n if (barsLength === undefined) {\n throw new Error('swapSeedMixAtRuntime(nextMix): getBarsLength unavailable');\n }\n const targetSegmentIdx = barsLength - numberOfCurrentSeedSegmentToCutOff;\n\n const latestBufferSentChunkIdx = seedBarPlaying.getLatestBufferSentChunkIdxOrThrow();\n if (targetSegmentIdx <= latestBufferSentChunkIdx) {\n throw new Error(`swapSeedMixAtRuntime: targetSegmentIdx ${targetSegmentIdx} is an index too closed to buffer sent to processor. ${targetSegmentIdx} vs ${latestBufferSentChunkIdx}`);\n }\n\n // const ENFORCED_BAR_COUNTS_FOR_INTELLISKIP_SAFEGUARDED = numberOfCurrentSeedSegmentToCutOff * bpmInfo.ratioWhenComposingBar;\n \n // Add bounds check before accessing segments array\n if (targetSegmentIdx >= segments.length) {\n throw new Error(`swapSeedMixAtRuntime: targetSegmentIdx ${targetSegmentIdx} is out of bounds. Array length: ${segments.length}`);\n }\n\n if (targetSegmentIdx <= -1) {\n throw new Error(`swapSeedMixAtRuntime: targetSegmentIdx ${targetSegmentIdx} is out of bounds.`);\n }\n \n if (!segments[targetSegmentIdx].isExplicitEndOfBar) {\n // targetSegmentIdx++;\n // Check bounds again after incrementing\n if (targetSegmentIdx >= segments.length) {\n throw new Error(`swapSeedMixAtRuntime: targetSegmentIdx ${targetSegmentIdx} is out of bounds after increment. Array length: ${segments.length}`);\n }\n }\n\n // try catch block to skip this op\n if (segments[targetSegmentIdx].isTransitionalBar) {\n throw ('swapSeedMixAtRuntime is prohibited at Transition Zone');\n }\n \n // const length = seedBarPlaying.getBarsLength();\n _BSSALA_log(segments[targetSegmentIdx]);\n\n \n \n // camus is having fun here\n\n\n // return;\n \n \n\n\n\n const ___chunkStartsToMergeIn = seedPlayingSeqs[0].segments[targetSegmentIdx];\n const mergeComposeOb = ___chunkStartsToMergeIn.originalBar;\n if (!mergeComposeOb) {\n throw new Error('swapSeedMixAtRuntime(nextMix): merge chunk missing originalBar');\n }\n // const ___startIndexToMergeIn = newSeedBar.sequences[0].segments.findIndex(\n // (c)=>(c.originalBar.sampleStart === ___chunkStartsToMergeIn.originalBar.sampleStart \n // && c.originalBar.sampleEnd === ___chunkStartsToMergeIn.originalBar.sampleEnd\n // ));\n const ___startIndexToMergeIn = 0;\n \n\n\n /*\n if (___startIndexToMergeIn === -1) {\n _BSSALA_log(`suppose to ops at beatIndex (Seed) ${___chunkStartsToMergeIn.originalBar.trackId} ${___chunkStartsToMergeIn.originalBar.sampleStart} but not found at new sequence:`);\n console.log(newSeedBar);\n // this means the newSeedBar does not contain the beatIndex asked for.\n if (ENABLE_CAMUS_INTERCEPTION_AT_VARIANT) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n throw ('the new seed bar does not contains the beatIndex asked for');\n } else {\n _BSSALA_log(`SegmentIdx - currentPlaying: ${segmentIdx} targetToSwap: ${targetSegmentIdx}`);\n if (targetSegmentIdx <= segmentIdx) {\n if (ENABLE_CAMUS_INTERCEPTION_AT_VARIANT) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }\n }\n \n if (newSeedBar.sequences[0].segments[___startIndexToMergeIn].isTransitionalBar) {\n throw ('swapSeedMixAtRuntime is prohibited at Transition Zone (2 M)');\n }\n\n if (newSeedBar.sequences[0].segments[___startIndexToMergeIn].originalBar.sampleStart !== ___chunkStartsToMergeIn.originalBar.sampleStart) {\n _BSSALA_log('note the sample is not continuous on seed track!!!!');\n _BSSALA_log('newBar start', ___chunkStartsToMergeIn)\n _BSSALA_log('new seed starts at: ', newSeedBar.sequences[0].segments[___startIndexToMergeIn])\n\n if (ENABLE_CAMUS_INTERCEPTION_AT_VARIANT) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n throw ('note the sample is not continuous on seed track!!!!');\n\n }\n */\n\n // debugger;\n\n\n\n // search on SeedTrack's Life Locus\n\n\n\n\n\n\n\n\n\n\n // past this mark and no return\n\n\n\n // trim segments from seedBarPlaying/mixBarPlaying\n // _BSSALA_log(length - targetSegmentIdx)\n const removedItems = cutSegmentsInBarSequences(seedPlayingSeqs, targetSegmentIdx);\n // const removedItems2 = \n cutSegmentsInBarSequences(mixPlayingSeqs, targetSegmentIdx);\n\n // _BSSALA_log(`targetSegmentIdx ${targetSegmentIdx}`);\n // _BSSALA_log(`removedItems(seed)`, removedItems);\n // re-append segemnts from newSeedBar/newMixBar\n const _chunkStartsToMergeIn = removedItems[0][0];\n \n _BSSALA_log(`the removed item's index on new seed - ${_chunkStartsToMergeIn.chunkId}`);\n // use the sample start/end instead of chunkId\n const _startIndexToMergeIn = ___startIndexToMergeIn;\n _BSSALA_log(`the removed item's index on new seed - ${_startIndexToMergeIn}`);\n\n\n /*\n if (_startIndexToMergeIn===-1) {\n _BSSALA_log('cannot find the target index, why');\n _BSSALA_log('i try to find this sample on mix: ', _chunkStartsToMergeIn.originalBar.sampleStart );\n _BSSALA_log('source chunk removed: ', _chunkStartsToMergeIn);\n _BSSALA_log('new mix bar seq', newSeedBar.sequences[0].segments)\n if (ENABLE_CAMUS_INTERCEPTION_AT_VARIANT) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }else if (newSeedBar.sequences[0].segments[_startIndexToMergeIn].originalBar.sampleStart !== _chunkStartsToMergeIn.originalBar.sampleStart) {\n _BSSALA_log('note the sample is not continuous on mix track!!!!');\n _BSSALA_log('removed bar', _chunkStartsToMergeIn)\n _BSSALA_log('new mix starts at: ', newSeedBar.sequences[0].segments[_startIndexToMergeIn])\n if (ENABLE_CAMUS_INTERCEPTION_AT_VARIANT) {\n // eslint-disable-next-line no-debugger\n debugger;\n }\n }\n */\n\n\n\n\n\n\n\n // prevent the Transplant rejection: align the signatures\n // {\n // s1: '$_$wfjwfk',\n // m1: '$_$wfjwfk2',\n // transition_m2: '$_$jgjewg',\n // transition_s2: '$_$jgjew2',\n // m2: '$_$jgkewg',\n // s2: '$_$jgkew2',\n // }\n\n // in order to make this work even on a master bar segments\n\n // update new seed/mix chop the first n item\n\n for(let i=0;i<4; i++){\n // const append1 = newSeedBar.sequences[i].segments.splice(_startIndexToMergeIn);\n // newSeedBar.sequences[i].segments = append1\n // newSeedBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap = true;\n // newSeedBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap_remixId = {type: '', id: remixId};\n\n // const append2 = newMixBar.sequences[i].segments.splice(_startIndexToMergeIn);\n // newMixBar.sequences[i].segments = append2\n // newMixBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap = true;\n // newMixBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap_remixId = {type: '', id: remixId};\n\n\n // console.log(newSeedBar.sequences[i].segments[0]);\n // console.log(newSeedBar.sequences[i].segments[1]);\n // console.log(newSeedBar.sequences[i].segments[2]);\n // console.log(newSeedBar.sequences[i].segments[3]);\n\n\n // console.log(newMixBar.sequences[i].segments[0]);\n // console.log(newMixBar.sequences[i].segments[1]);\n // console.log(newMixBar.sequences[i].segments[2]);\n // console.log(newMixBar.sequences[i].segments[3]);\n \n // debugger;\n }\n\n // AEV3Controller.getInstance().setIsRemixOnTheFly(remixId, 'intelliskip');\n\n // console.log(newSeedBar, newMixBar);\n // debugger;\n\n\n ///////\n // prevent the updating of any thing... like another refresh mix process\n // \n\n\n // infiniteInfo.seedBar.setPlayQuantisedSpeedOnBars(seed1.getPlayQuantisedSpeedOnBars());\n // infiniteInfo.mixBar.setPlayQuantisedSpeedOnBars(mix1.getPlayQuantisedSpeedOnBars());\n const swapTrackIndex0_n_1 = true;\n const debugStationMixIdSignature = 'from locus swapping';\n\n /*\n if (!isTwoSegmentContinuous(seedBarPlaying.sequences[0].segments[seedBarPlaying.sequences[0].segments.length-1], newSeedBar.sequences[0].segments[0] )){\n _BSSALA_log(`OPS FAILED!!! the seed track is NOT continuous at Mix Variants`);\n throw Error ('sample is not continuous (swapping mix variants)');\n } else {\n _BSSALA_log(`OPS Successful!!! the seed track is continuous at Mix Variants`);\n }\n */\n \n\n // AEV3Controller.getInstance().snapStemProfileBeforeTransition();\n // applyStemProfile('vobd');\n \n // replace first few bars of mix2 with seed1\n // newMixBar.sequences\n\n let seed1AtTransition: BarSequence;\n let seed2AtTransition: BarSequence;\n let seed1TransSeqs!: IBarSequence[];\n let seed2TransSeqs!: IBarSequence[];\n try {\n const enableCacheController = false;\n const dropSeedMixLoadingActionSinceThisIsPseudoBar = true;\n const matchMixTracksDuration = false;\n // const isSequenceCreateForIntelliskip = true;\n \n const seedTrackStartingIndex = seed2StartingBarIndexAdopted - seed2DurationBarCount;\n const seedTrackEndingIndex = seedTrackStartingIndex + seed2DurationBarCount - 1;\n \n // this one is used to ensure the track fading out has no need to loop backwards if not required\n // it wasn't a problem until silly behaviour revealed on scrubber playhead\n const seed1FadeOut_AllowedBarEndingIndex = seedBarPlaying.trackData.indices['normal'].endingIndex;\n const a = AEV3Controller.getInstance().composeMixTheDuoTracksWithBarDestination(\n newSeedBar.trackData, seedBarPlaying.trackData, enableCacheController,\n seedTrackStartingIndex, seedTrackEndingIndex,\n mergeComposeOb.beatIndex, seed1FadeOut_AllowedBarEndingIndex, \n `BarSequenceEditing:swapSeedMixAtRuntime(nextMix)`, PitchShiftStrategy.DEFAULT,\n 'align-mix-segment-from-first-item',\n seedBarPlaying.barIndexStart,\n AEV3Controller.getInstance().getPlayMixAsQuantised(),\n dropSeedMixLoadingActionSinceThisIsPseudoBar,\n matchMixTracksDuration,\n );\n \n seed2AtTransition = a.seedBar;\n seed1AtTransition = a.mixBar;\n seed1TransSeqs = barSequencesOrThrow(seed1AtTransition, 'seed1AtTransition');\n seed2TransSeqs = barSequencesOrThrow(seed2AtTransition, 'seed2AtTransition');\n\n // this is no longer needed if I re-created the seed2's transition length accurately\n // for(let i=0;i<4; i++){\n // // algin seed2\n // const append1 = seed2AtTransition.sequences[i].segments.splice(_startIndexToMergeIn);\n // seed2AtTransition.sequences[i].segments = append1;\n // for (let j=0; j<_startIndexToMergeIn; j++) {\n // seed1AtTransition.sequences[i].segments.pop();\n // }\n \n // }\n } catch (error) {\n AEV3Controller.getInstance().setIsBusy(false, 'intelliskip error');\n console.log(error);\n throw error instanceof Error ? error : new Error(String(error));\n }\n\n // debugger;\n // console.log(seed2AtTransition, seed1AtTransition);\n // console.log('seedbar playing', seedBarPlaying)\n // console.log('new seed bar', newSeedBar);\n\n // ready to use:\n // let REAL_BARS_USED_IN_TRANSITION: number; // note this is real bars at seed1, but switches might be 2 depends on bpm ratio\n // if (seed1AtTransition.ratioWhenComposingBar === 0.5) {\n // REAL_BARS_USED_IN_TRANSITION = ENFORCED_BAR_COUNTS_FOR_INTELLISKIP_SAFEGUARDED * 2; // 8\n // } else if (seed1AtTransition.ratioWhenComposingBar === 2) {\n // REAL_BARS_USED_IN_TRANSITION = ENFORCED_BAR_COUNTS_FOR_INTELLISKIP_SAFEGUARDED / 2; // 2\n // } else {\n // REAL_BARS_USED_IN_TRANSITION = ENFORCED_BAR_COUNTS_FOR_INTELLISKIP_SAFEGUARDED; // 4;\n // }\n // const segmentsUsedInTransition = REAL_BARS_USED_IN_TRANSITION * seed1AtTransition.ratioWhenComposingBar;\n \n // 1. replace items from seed1AtTranstion to first few items of newMixBar on 1:1\n // by 1. only keep first n items of those in transition\n \n // this is no longer needed if I re-created the seed2's transition length accurately\n // for(let i=0;i<4; i++){\n // seed2AtTransition.sequences[i].segments.splice(seed2DurationBarCount);\n // seed1AtTransition.sequences[i].segments.splice(seed2DurationBarCount);\n // }\n\n // const newTargetTempoLenght48000 = (seedBarPlaying.targetBarLength48000 / seed1AtTransition.ratioWhenComposingBar);\n\n // debugger;\n const newSpeedFactor = (seed1AtTransition.targetBarLength48000*seed1AtTransition.ratioWhenComposingBar)/seedBarPlaying.targetBarLength48000;\n // const newSpeedFactor = 0.78;\n // console.table({\n // seed1Original : seedBarPlaying.targetBarLength48000,\n // seed1New: seed1AtTransition.targetBarLength48000,\n // seed1NewRatio: seed1AtTransition.ratioWhenComposingBar,\n // newTargetTempoLenght48000,\n // newSpeedFactor,\n // })\n // debuggerl\n\n // 1.5 apply speed change\n let speedRatio = seedBarPlaying.trackData.tempoOrigSz / newSeedBar.trackData.tempoOrigSz;\n speedRatio = speedRatio / seed1AtTransition.ratioWhenComposingBar;\n const steps = seed1TransSeqs[0].segments.length;\n // console.table({speedRatio})\n const manualSpeedChangeFrom = 1;\n const manualSpeedChangeTo = speedRatio;\n const isTransitionalBars = true;\n seed1TransSeqs.forEach((s)=>{\n s.segments.forEach((c, index)=>{\n if (steps === 0) { // avoiding division by 0\n c.speedRatio_ManualScheduling = 1;\n } else {\n c.speedRatio_ManualScheduling = ((manualSpeedChangeFrom - 1) + 1) + (( manualSpeedChangeTo - manualSpeedChangeFrom ) / steps) * index;\n if (c.halfBarOnlyOnSquash) {\n c.speedRatio_ManualScheduling *= 2;\n }\n }\n c.isTransitionalBar = isTransitionalBars;\n });\n });\n seed2TransSeqs.forEach((s)=>{\n s.segments.forEach((c, index)=>{\n if (steps === 0) { // avoiding division by 0\n c.speedRatio_ManualScheduling = 1;\n } else {\n c.speedRatio_ManualScheduling = ((manualSpeedChangeFrom - 1) + 1) + (( manualSpeedChangeTo - manualSpeedChangeFrom ) / steps) * index;\n if (c.halfBarOnlyOnSquash) {\n c.speedRatio_ManualScheduling *= 2;\n }\n }\n c.isTransitionalBar = isTransitionalBars;\n });\n });\n\n seed1AtTransition.setPlayQuantisedSpeedOnBars(seedBarPlaying.getPlayQuantisedSpeedOnBars());\n seed2AtTransition.setPlayQuantisedSpeedOnBars(mixBarPlaying.getPlayQuantisedSpeedOnBars());\n\n // console.table({\n // segmentsUsedInTransition\n // })\n assignStemSwitchingCommandAtTransitionZone_Sub(seed1AtTransition, seed2AtTransition, seed2DurationBarCount, 0, 'IN');\n \n applyNewSpeedFactorToQuantisedSegments(seed2AtTransition, seed1AtTransition, newSpeedFactor);\n\n alignSpeedOfMixToUnquantisedSeedOfComposedSeedMix(\n { sequences: seed1TransSeqs, ratioWhenComposingBar: seed1AtTransition.ratioWhenComposingBar },\n { sequences: seed2TransSeqs, ratioWhenComposingBar: seed2AtTransition.ratioWhenComposingBar },\n );\n alignSpeedOfSeedToUnquantisedMixOfComposedSeedMix(\n { sequences: seed1TransSeqs, ratioWhenComposingBar: seed1AtTransition.ratioWhenComposingBar },\n { sequences: seed2TransSeqs, ratioWhenComposingBar: seed2AtTransition.ratioWhenComposingBar },\n );\n\n\n\n // const profile1: StemSwithingSchedulerSignature = {profileName: 's1/s2 (1)'};\n // seed1AtTransition.setStemSwitchingCommandForIntelli(0, {0: {enabled: true, profile: profile1}, 1: {enabled: true, profile: profile1}, 2: {enabled: true, profile: profile1}, 3: {enabled: false, profile: profile1}});\n // seed2AtTransition.setStemSwitchingCommandForIntelli(0, {0: {enabled: false, profile: profile1}, 1: {enabled: false, profile: profile1}, 2: {enabled: false, profile: profile1}, 3: {enabled: false, profile: profile1}});\n\n // const profile2: StemSwithingSchedulerSignature = {profileName: 's1/s2 (1)'};\n // seed1AtTransition.setStemSwitchingCommandForIntelli(1, {0: {enabled: true, profile: profile4}, 1: {enabled: true, profile: profile4}, 2: {enabled: true, profile: profile4}, 3: {enabled: true, profile: profile4}});\n // seed2AtTransition.setStemSwitchingCommandForIntelli(0, {0: {enabled: false, profile: profile4}, 1: {enabled: false, profile: profile4}, 2: {enabled: false, profile: profile4}, 3: {enabled: false, profile: profile4}});\n\n // console.log('segments length at transition', seed1AtTransition.sequences[0].segments.length);\n\n // 2. remove first n items of those in new bars\n \n // this is no longer needed if I re-created the seed2's transition length accurately\n // for(let i=0;i<4; i++){\n // const append1 = newSeedBar.sequences[i].segments.splice(seed2DurationBarCount);\n // newSeedBar.sequences[i].segments = append1;\n // // newSeedBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap = true;\n // // newSeedBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap_remixId = {type: '', id: remixId};\n // const append2 = newMixBar.sequences[i].segments.splice(seed2DurationBarCount);\n // newMixBar.sequences[i].segments = append2;\n // // newMixBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap = true;\n // // newMixBar.sequences[i].segments[0].isFirstBarOfLiveEditSwap_remixId = {type: '', id: remixId};\n // }\n\n \n // 3. combine playing, then transition, then new bars\n combineSegmentsOfTwoBarSequences(seed2TransSeqs, newSeedSeqs, true, true, true, true, {\n trackData: newSeedBar.trackData,\n targetKey: newSeedBar.targetKey,\n targetBarLength48000: newSeedBar.targetBarLength48000,\n targetTonality: newSeedBar.targetTonality,\n ratioWhenComposingBar: newSeedBar.ratioWhenComposingBar,\n pitchShift: newSeedBar.pitchShift,\n trackType: 'seed', \n debugStationMixIdSignature,\n barIndexStart: newSeedBar.barIndexStart,\n barIndexEnd: newSeedBar.barIndexEnd,\n }, swapTrackIndex0_n_1);\n combineSegmentsOfTwoBarSequences(seed1TransSeqs, newMixSeqs, true, true, true, true, {\n trackData: newMixBar.trackData,\n targetKey: newMixBar.targetKey,\n targetBarLength48000: newMixBar.targetBarLength48000,\n targetTonality: newMixBar.targetTonality,\n ratioWhenComposingBar: newMixBar.ratioWhenComposingBar,\n pitchShift: newMixBar.pitchShift,\n trackType: 'mix', \n debugStationMixIdSignature,\n barIndexStart: newMixBar.barIndexStart,\n barIndexEnd: newMixBar.barIndexEnd,\n }, swapTrackIndex0_n_1);\n\n\n\n for(let i=0;i<4; i++){\n seed1TransSeqs[i].segments[0].isFirstBarOfLiveEditSwap = true;\n // seed1AtTransition.sequences[i].segments[0].isFirstBarOfLiveEditSwap_remixId = {type: '', id: remixId};\n seed2TransSeqs[i].segments[0].isFirstBarOfLiveEditSwap = true;\n // seed2AtTransition.sequences[i].segments[0].isFirstBarOfLiveEditSwap_remixId = {type: '', id: remixId};\n }\n\n // debugger;\n\n\n\n // append seed2 to mix\n combineSegmentsOfTwoBarSequences(mixPlayingSeqs, seed2TransSeqs, true, true, true, false, {\n trackData: seed2AtTransition.trackData,\n targetKey: seed2AtTransition.targetKey,\n targetBarLength48000: seed2AtTransition.targetBarLength48000,\n targetTonality: seed2AtTransition.targetTonality,\n ratioWhenComposingBar: seed2AtTransition.ratioWhenComposingBar,\n pitchShift: seed2AtTransition.pitchShift,\n trackType: 'mix', \n debugStationMixIdSignature,\n barIndexStart: seed2AtTransition.barIndexStart,\n barIndexEnd: seed2AtTransition.barIndexEnd,\n }, false);\n // append to seed\n combineSegmentsOfTwoBarSequences(seedPlayingSeqs, seed1TransSeqs, true, true, true, false, {\n trackData: seed1AtTransition.trackData,\n targetKey: seed1AtTransition.targetKey,\n targetBarLength48000: seed1AtTransition.targetBarLength48000,\n targetTonality: seed1AtTransition.targetTonality,\n ratioWhenComposingBar: seed1AtTransition.ratioWhenComposingBar,\n pitchShift: seed1AtTransition.pitchShift,\n trackType: 'seed', \n debugStationMixIdSignature,\n barIndexStart: seed1AtTransition.barIndexStart,\n barIndexEnd: seed1AtTransition.barIndexEnd,\n }, false);\n \n // for each item if they are not transitional bar, update the chunkId \n // seedBarPlaying.sequences.forEach((s)=>{\n // s.segments.forEach((e)=>{\n\n // })\n // });\n\n // AEV3Controller.getInstance().consoleBarSampleContinuity();\n}\n\n\n// pending\n// the mixId ising updated at current track obj after swap","/**\n * This is brain to resolve the final start/end bar Index of mainly SEED2\n * it takes in seed2, mix2, and preferrable transition duration (based on seed2)\n * and decide the resolved start/end barIndex for seed2/mix2\n * \n * If the start bar index of Seed2 changed, it will be reflected by the proposed seed2TransitBarCounts\n * basically the only 2 variable should be modify \n * the Seed2, startBarIndex & TransitionBarCounts, \n * which depend on currentPlayIndex / Possible replenish length of of Seed1\n * \n * \n * new resolved param:\n * seed1 - target to cut it, it must be start of real bar index and it will always be replenished till the end and loop at somewhere (now default at segment start), \n * in short this beat index will be used for recreation of transition\n * \n * \n * \n * to new util\n * \n * 1. cut (from where)\n * 2. generate transitin zone (seed1 from where), (seed2 from where)\n * 3. generate next bar (from where)\n * 4. contactentate\n * \n * \n * \n * the 8 bars intelliskip at end of auto play next now refactored and safeguard at a step earlier\n * if wished bar is 8 but if it is not possible to achieve at runtime, the resolver will decrease \n * the 8->7 and retry until 0 and throw an error\n * \n * when this procedure has a transition duration as 0 bars, it should just disable the transtion\n * \n * the script which do the life locus swapping now cleaned up and remove unnecessary logic\n */\n\nimport { BarSequence } from \"../decode/bar-sequence\";\nimport { AEV3Controller } from \"../global-aev3-controller\";\nimport { ITrackForSequence, StemProfileString } from \"../interface\";\nimport useNextMixTransitionStore_PROTOTYPE_ONLY from \"../store/use-next-mix-transition-prototype-explicit\";\n// import { getSegmentIndiceFromPlayMode } from \"../playmode-matrix\";\nimport { getTargetTempoOrigSzAndBpmRatio } from \"../utils/audio\";\nimport { consoleColorfulMessage, consoleColorfulMessage4Lawful } from \"../utils/colorConsole\";\nimport { preloadMP4s_OnlyCheckIfInitialised } from \"../utils/preload\";\nimport { PitchShiftStrategy } from \"../utils/seed-mix-utils\";\nimport { prepareAssignNextMixWithoutTransition } from \"./assign-next-mix-v2(no-transition)\";\nimport { swapSeedMixAtRuntime } from \"./swap-at-locus-actions/bar-sequence-swap-at-locus-action-intelliskip-used-as-assign-next-mix-refactored\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const prepareAssignNextMixWithTransition = (\n seedTrack: ITrackForSequence,\n mixTrack: ITrackForSequence,\n stationId: string,\n stationTrackId: string,\n stemProfile: StemProfileString,\n configuredTransitionDuration_InSeed2BarCount: number,\n seedTrackStartingIndex: number,\n seedTrackEndingIndex: number,\n mixTrackStartingIndex: number,\n mixTrackEndingIndex: number,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n let processStart = false;\n \n if (AEV3Controller.getInstance().getCurrentSeedTrackObject()?.trackId === seedTrack.trackId\n && AEV3Controller.getInstance().getCurrentMixTrackObject()?.trackId === mixTrack.trackId) {\n reject(new Error('Track provided is same as current mix track'));\n return;\n }\n\n if (AEV3Controller.getInstance().getIsBusy()) {\n consoleColorfulMessage('V3 currently is busy', '#d311ffff', '#ffffff');\n reject(new Error('Engine is busy now'));\n return;\n }\n\n // TODO: santise the mp4 tail - is it done?\n\n processStart = true;\n AEV3Controller.getInstance().setIsBusy(true, 'assign next mix');\n \n const starttime = Date.now(); // benchmark it\n \n let newSeedBar: BarSequence;\n let newMixBar: BarSequence;\n\n\n\n\n\n\n\n /*\n // TODO/FIXME: remove after the get next track is stablised\n console.log(seedTrack, seedTrackStartingIndex, seedTrackEndingIndex);\n console.log(mixTrack, mixTrackStartingIndex, mixTrackEndingIndex);\n console.log(stationId, stationTrackId);\n console.log('transition:', configuredTransitionDuration_InSeed2BarCount);\n */\n\n \n \n const seedBarPlaying = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBarPlaying = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n consoleColorfulMessage4Lawful(`[Intelliskip] following items are for intelliskip ${stationTrackId}`, '#d311ffff', '#ffffff');\n // console.log('π Current', seedBarPlaying, mixBarPlaying);\n // console.log('π Composed', newSeedBar, newMixBar);\n\n preloadMP4s_OnlyCheckIfInitialised([{track: seedTrack}, {track: mixTrack}])\n .then((e) => {\n if (e?.[0]?.success === false) {\n throw Error('failed to preload mix obj manifest');\n }\n // if the MP4 is resolved but it is flawed\n const seedTrackAudioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(seedTrack.trackId);\n if (!seedTrackAudioSource) {\n throw Error(`Audio source for seed track ${seedTrack.trackId} not found in preloaded queue after successful preload`);\n }\n const seedTrackError = seedTrackAudioSource.errorOnInit;\n if (seedTrackError) {\n throw Error(seedTrackError)\n }\n\n const mixTrackAudioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(mixTrack.trackId);\n if (!mixTrackAudioSource) {\n throw Error(`Audio source for mix track ${mixTrack.trackId} not found in preloaded queue after successful preload`);\n }\n const mixTrackError = mixTrackAudioSource.errorOnInit;\n if (mixTrackError) {\n throw Error(mixTrackError)\n }\n\n const endtime = Date.now() - starttime;\n consoleColorfulMessage(`time to prepare swap : ${endtime.toFixed(2)}ms`)\n // console.log('π ', newSeedBar, newMixBar);\n\n // todo : prevent runtime jump when it is almost end of track (done)\n // autoplay: decodeAllSequencesWithBarIndex triggered 36 but AudioSourceSequence return nothing 02da1be8-6cb9-4f24-9f1e-363\n\n // is it fine to do it at transition: NO\n\n if (!seedBarPlaying || !mixBarPlaying) {\n throw new Error('Seed or mix bar sequence not available');\n }\n\n\n\n\n\n\n\n // const configuredTransitionDuration_InSeed2BarCount = 8;\n let seed2DurationBarCount: number = 0;\n let numberOfSeed1SegmentToCutOff = 0;\n let seedTrackStartingIndex_resolved = seedTrackStartingIndex;\n try {\n \n const enableCacheController = false;\n const dropSeedMixLoadingActionSinceThisIsPseudoBar = true;\n const matchMixTracksDuration = false;\n // const isSequenceCreateForIntelliskip = true;\n \n\n try {\n const resolvedValues = calculateSeed2TransitBarCountsFeasible(seedBarPlaying, seedTrack, seedTrackStartingIndex, configuredTransitionDuration_InSeed2BarCount);\n seed2DurationBarCount = resolvedValues[0];\n seedTrackStartingIndex_resolved = resolvedValues[1];\n numberOfSeed1SegmentToCutOff = resolvedValues[2];\n if (seed2DurationBarCount === 0 ) {\n throw ('no transition needed');\n }\n if (configuredTransitionDuration_InSeed2BarCount!==seed2DurationBarCount) {\n console.log(`%c!!!!!!! shortened the preferred transition as ${seed2DurationBarCount}`, 'color: red; background: black;');\n } else if (seedTrackStartingIndex_resolved!==seedTrackStartingIndex) {\n console.log(`%c!!!!!!! startingBarIndex of Seed2 changed from ${seedTrackStartingIndex} as ${seed2DurationBarCount}`, 'color: red; background: black;');\n } else {\n console.log(`%c!!!!!!! preferred transition fulfill as ${seed2DurationBarCount}`, 'color: red; background: black;');\n }\n \n } catch (err) {\n console.log(err);\n AEV3Controller.getInstance().setIsBusy(false, 'intelliskip error - fallback to skipping');\n prepareAssignNextMixWithoutTransition(seedTrack, mixTrack, stationId, stationTrackId, \n seedTrackStartingIndex, // this is fallback so do not use the resolved ver!\n seedTrackEndingIndex,\n mixTrackStartingIndex,\n mixTrackEndingIndex,\n stemProfile).then(resolve).catch(reject);\n return;\n }\n\n const bpmInfo = getTargetTempoOrigSzAndBpmRatio(seedBarPlaying.trackData, seedBarPlaying.trackData);\n\n console.table({\n 'swapSeedMixAtRuntime': 'assign-next mix locus',\n 'seed1': seedBarPlaying.trackData.tempoOrigSz,\n 'seed2': seedTrack.tempoOrigSz,\n 'ratioWhenComposingBar of seed1 comparing to seed2': bpmInfo.ratioWhenComposingBar,\n 'seed2@transition - BAR to use': seed2DurationBarCount,\n 'seed1@transition - BAR to use (Also equal segment since it is seed)': numberOfSeed1SegmentToCutOff,\n 'numberOfSeed1SegmentToCutOff': numberOfSeed1SegmentToCutOff,\n });\n\n console.table({\n seed2StartingIndex: seedTrackStartingIndex_resolved, seed2endingIndex: seedTrackEndingIndex,\n mix2StartingIndex: mixTrackStartingIndex, mix2endingIndex: mixTrackEndingIndex, \n seed2DurationBarCount,\n numberOfSeed1SegmentToCutOff\n })\n // debugger;\n\n const a = AEV3Controller.getInstance().composeMixTheDuoTracksWithBarDestination(\n seedTrack, mixTrack, enableCacheController,\n seedTrackStartingIndex_resolved, seedTrackEndingIndex, \n mixTrackStartingIndex, mixTrackEndingIndex, \n `BarSequenceEditing:prepareIntelliskipSwapWithoutNextMix`, PitchShiftStrategy.DEFAULT,\n 'align-mix-segment-from-first-item',\n mixTrackStartingIndex,\n AEV3Controller.getInstance().getPlayMixAsQuantised(),\n dropSeedMixLoadingActionSinceThisIsPseudoBar,\n matchMixTracksDuration,\n );\n newSeedBar = a.seedBar;\n newMixBar = a.mixBar;\n } catch (error) {\n AEV3Controller.getInstance().setIsBusy(false, 'assign next mix error');\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n \n\n swapSeedMixAtRuntime(\n seedBarPlaying, \n mixBarPlaying, // no stakes here\n // whereToCutAtSeedBarPlaying, even last bar it is fine because it can always regenerate?\n // based on whereToCutAtSeedBarPlaying, grab the startBeatIndex and generate Seed1Trans (mix match)\n numberOfSeed1SegmentToCutOff,\n newSeedBar, newMixBar,\n // Real bar duration (Seed2)\n // this one used to determine startBarIndex of Seed2 to Seed1, and seems it inter-dependent to whereToCutAtSeedBarPlaying\n // if this Seed2Bar = 8, BPM ratio is seed2 = seed1 x 2 that means 16 bars of seed1 is needed to fill this gap\n // if bar index playing at Seed1 is less than 16 bars before end then this will be problem\n // so this number when provided, should try to obey it because the fade In point is very important\n // if the Seed1 is allowed to loop when composing as transition segment then no matter how large this value is it won't be a problem\n seed2DurationBarCount,\n seedTrackStartingIndex_resolved, //seed2StartingBarIndexAdopted,\n );\n // resolve next mix\n AEV3Controller.getInstance().setNextSeedTrackObject(newSeedBar.trackData, false, -1, 'assign next mix v2');\n AEV3Controller.getInstance().setNextSeedTrackBarRanges(seedTrackStartingIndex_resolved, seedTrackEndingIndex);\n \n useNextMixTransitionStore_PROTOTYPE_ONLY.getState().updateNextSeedStartEndIndexNTransitionIfIdchanged(newSeedBar.trackData.trackId, seedTrackStartingIndex, seedTrackEndingIndex, configuredTransitionDuration_InSeed2BarCount);\n\n AEV3Controller.getInstance().setNextMixTrackObject(newMixBar.trackData, false, -1, 'assign next mix v2');\n AEV3Controller.getInstance().setNextMixTrackBarRanges(mixTrackStartingIndex, mixTrackEndingIndex);\n AEV3Controller.getInstance().setNextTrackOptionalParam({...AEV3Controller.getInstance().getNextTrackOptionalParam(), stationTrackId, stationId});\n // AEV3Controller.getInstance().setNextMixConfiguration(null);\n\n // todo : mark the segments before variant plays, and ban all action before head\n AEV3Controller.getInstance().setIsBusy(false, 'assign next mix finished');\n resolve();\n })\n .catch((error) => {\n if (processStart) {\n AEV3Controller.getInstance().setIsBusy(false, 'assign next mix error');\n }\n if (error.toString().includes('swapSeedMixAtRuntime is prohibited at Transition Zone')) {\n console.log('target segmentIdx fall into transition zone, maybe should retry with shorter duration.');\n }\n reject(error);\n });\n });\n};\n\n/**\n * some more factor when we do this at runtime\n * @param seedBarPlaying \n * @param seed2 \n * @param seed2StartingBarIndex \n * @param seed2TransitBarCounts \n * @returns {[number, number]} [seed2DurationBarCount, seed2SegmentStartBarIndex_Tunned, numberOfSeed1SegmentToCutOff]\n */\nconst calculateSeed2TransitBarCountsFeasible = (seedBarPlaying: BarSequence, seed2: ITrackForSequence, seed2SegmentStartingBarIndex: number, seed2TransitBarCounts: number) => {\n const seed2DurationBarCount = seed2TransitBarCounts;\n const seed2SegmentStartingBarIndex_origin = seed2SegmentStartingBarIndex;\n \n // this is seed2\n \n if (seed2SegmentStartingBarIndex - seed2DurationBarCount < 0) {\n // change seed2SegmentStartingBarIndex according to seed2DurationBarCount, IF WE WANT transition\n seed2SegmentStartingBarIndex = seed2DurationBarCount;\n } else {\n // seed2DurationBarCount safe for now\n }\n\n\n // if (isSequenceCreateForIntelliskip) {\n // seedTrackStartingIndex = getSeedTrackStartingIndexForIntelliskip(seedTrack, AEV3Controller.getInstance().getPlayMode());\n // if (seedTrackStartingIndex - seed2DurationBarCount < 0) {\n // // change seedTrackStartingIndex according to seed2DurationBarCount, IF WE WANT transition\n // seedTrackStartingIndex = ;// something\n // }\n // }\n\n const bpmInfo = getTargetTempoOrigSzAndBpmRatio(seed2, seedBarPlaying.trackData);\n const numberOfSeed1SegmentToCutOff = seed2DurationBarCount / bpmInfo.ratioWhenComposingBar;\n\n if ((seedBarPlaying.getBarsLength(0) ?? 0) - numberOfSeed1SegmentToCutOff >= seedBarPlaying.getMaximumPlayingIndex()+3) {\n // green to go\n console.log('green to go');\n } else {\n // shorten the seed2DurationBarCount\n if (seed2TransitBarCounts > 0) {\n return calculateSeed2TransitBarCountsFeasible(seedBarPlaying, seed2, seed2SegmentStartingBarIndex_origin, seed2TransitBarCounts - 1);\n } else {\n throw Error('cannot resolve a proper index');\n }\n }\n\n const seed2SegmentStartBarIndex_Tunned = seed2SegmentStartingBarIndex;\n return [seed2DurationBarCount, seed2SegmentStartBarIndex_Tunned, numberOfSeed1SegmentToCutOff];\n}","/**\n * Listen to the Event fired from AEV3Controller on assignment changed\n */\n\nimport { create } from \"zustand\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\n\nimport {\n AEV3Controller,\n} from \"../global-aev3-controller\";\n// import { IOptionalCurrentTrackInfo, ITrackForSequence } from \"../interface\";\n\n// Reset state shape (shared by reset() and refresh() when clearing)\nconst RESET_STATE = {\n seed1TrackId: '',\n seed2TrackId: '',\n\n seed1_Transition1Exists: false,\n seed1_Transition2Exists: false,\n\n // SegmentIdx\n seed1SegmentIdx_Transition1Start: 0,\n seed1SegmentIdx_Transition1End: 0,\n seed1SegmentIdx_ActualStart: 0,\n seed1SegmentIdx_Transition2Start: 0,\n seed1SegmentIdx_ActualEnd: 0,\n};\n\nconst RESET_BEAT_STATE = {\n // Beat index\n seed1BeatIdx_Transition1Start: 0,\n seed1BeatIdx_Transition1End: 0,\n seed1BeatIdx_ActualStart: 0,\n seed1BeatIdx_Transition2Start: 0,\n seed1BeatIdx_ActualEnd: 0,\n\n seed1Time_Transition1Start: 0,\n seed1Time_Transition1End: 0,\n seed1Time_ActualStart: 0,\n seed1Time_Transition2Start: 0,\n seed1Time_ActualEnd: 0,\n};\n\n// Zustand Store\nexport interface TransitionInfoStore {\n seed1TrackId: string,\n seed2TrackId: string,\n\n seed1_Transition1Exists: boolean,\n seed1_Transition2Exists: boolean,\n\n seed1SegmentIdx_Transition1Start: number, // before actual segment\n seed1SegmentIdx_Transition1End: number, // before actual segment\n seed1SegmentIdx_ActualStart: number, // actual segment\n seed1SegmentIdx_Transition2Start: number, // transiting into next mix\n seed1SegmentIdx_ActualEnd: number,\n\n seed1BeatIdx_Transition1Start: number,\n seed1BeatIdx_Transition1End: number,\n seed1BeatIdx_ActualStart: number,\n seed1BeatIdx_Transition2Start: number,\n seed1BeatIdx_ActualEnd: number,\n\n seed2BeatIdx_Transition2Start: number,\n seed2BeatIdx_Transition2End: number,\n\n seed1Time_Transition1Start: number,\n seed1Time_Transition1End: number,\n seed1Time_ActualStart: number,\n seed1Time_Transition2Start: number,\n seed1Time_ActualEnd: number,\n\n seed2Time_Transition2Start: number,\n seed2Time_Transition2End: number,\n \n refresh: (signature: string) => void,\n refreshV2: (signature: string, targetSegmentIdx: number) => void,\n reset: () => void,\n}\n\ntype TransitionBeatResolveSegmentInfo = Pick<\n TransitionInfoStore,\n | 'seed1_Transition1Exists'\n | 'seed1SegmentIdx_Transition1Start'\n | 'seed1SegmentIdx_Transition1End'\n | 'seed1SegmentIdx_ActualStart'\n | 'seed1SegmentIdx_Transition2Start'\n | 'seed1SegmentIdx_ActualEnd'\n>;\n\nconst getResolvedBeatIdxNTimeState = (signature: string, info: TransitionBeatResolveSegmentInfo) => {\n // console.log(`***useTransitionInfoStore.getResolvedBeatIdxNTimeState(${signature})`);\n const seedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n if (!(seedBar && mixBar)) {\n // console.log('useTransitionInfoStore.getResolvedBeatIdxNTimeState--skipped');\n return (RESET_BEAT_STATE);\n }\n try {\n const seed0 = seedBar.sequences?.[0];\n const mix0 = mixBar.sequences?.[0];\n const newState = {\n seed1BeatIdx_Transition1Start: (info.seed1_Transition1Exists && !!seed0?.segments?.[info.seed1SegmentIdx_Transition1Start]) ? (seed0.segments[info.seed1SegmentIdx_Transition1Start]?.originalBar?.beatIndex ?? -1) : -1,\n seed1BeatIdx_Transition1End: (info.seed1_Transition1Exists && !!seed0?.segments?.[info.seed1SegmentIdx_Transition1End]) ? (seed0.segments[info.seed1SegmentIdx_Transition1End]?.originalBar?.beatIndex ?? -1) : -1,\n seed1BeatIdx_ActualStart: (seed0?.segments?.[info.seed1SegmentIdx_ActualStart]) ? (seed0.segments[info.seed1SegmentIdx_ActualStart]?.originalBar?.beatIndex ?? -1) : -1,\n seed1BeatIdx_Transition2Start: (seed0?.segments?.[info.seed1SegmentIdx_Transition2Start]) ? (seed0.segments[info.seed1SegmentIdx_Transition2Start]?.originalBar?.beatIndex ?? -1) : -1,\n seed1BeatIdx_ActualEnd: (seed0?.segments?.[info.seed1SegmentIdx_ActualEnd]) ? (seed0.segments[info.seed1SegmentIdx_ActualEnd]?.originalBar?.beatIndex ?? -1) : -1,\n\n seed2BeatIdx_Transition2Start: (mix0?.segments?.[info.seed1SegmentIdx_Transition2Start]) ? (mix0.segments[info.seed1SegmentIdx_Transition2Start]?.originalBar?.beatIndex ?? -1) : -1,\n seed2BeatIdx_Transition2End: (mix0?.segments?.[info.seed1SegmentIdx_ActualEnd]) ? (mix0.segments[info.seed1SegmentIdx_ActualEnd]?.originalBar?.beatIndex ?? -1) : -1,\n\n seed1Time_Transition1Start: (info.seed1_Transition1Exists && !!seed0?.segments?.[info.seed1SegmentIdx_Transition1Start]) ? (seed0.segments[info.seed1SegmentIdx_Transition1Start]?.originalBar?.startTime ?? -1) : -1,\n seed1Time_Transition1End: (info.seed1_Transition1Exists && !!seed0?.segments?.[info.seed1SegmentIdx_Transition1End]) ? (seed0.segments[info.seed1SegmentIdx_Transition1End]?.originalBar?.endTime ?? -1) : -1,\n seed1Time_ActualStart: (seed0?.segments?.[info.seed1SegmentIdx_ActualStart]) ? (seed0.segments[info.seed1SegmentIdx_ActualStart]?.originalBar?.startTime ?? -1) : -1,\n seed1Time_Transition2Start: (seed0?.segments?.[info.seed1SegmentIdx_Transition2Start]) ? (seed0.segments[info.seed1SegmentIdx_Transition2Start]?.originalBar?.startTime ?? -1) : -1,\n seed1Time_ActualEnd: (seed0?.segments?.[info.seed1SegmentIdx_ActualEnd]) ? (seed0.segments[info.seed1SegmentIdx_ActualEnd]?.originalBar?.endTime ?? -1) : -1,\n\n seed2Time_Transition2Start: (mix0?.segments?.[info.seed1SegmentIdx_Transition2Start]) ? (mix0.segments[info.seed1SegmentIdx_Transition2Start]?.originalBar?.startTime ?? -1) : -1,\n seed2Time_Transition2End: (mix0?.segments?.[info.seed1SegmentIdx_ActualEnd]) ? (mix0.segments[info.seed1SegmentIdx_ActualEnd]?.originalBar?.endTime ?? -1) : -1,\n\n }\n // console.log('useTransitionInfoStore.getResolvedBeatIdxNTimeState--OK', newState);\n return newState;\n } catch (err) {\n console.error(err);\n // console.log('useTransitionInfoStore.getResolvedBeatIdxNTimeState--err');\n return (RESET_BEAT_STATE);\n }\n}\n\nconst getResolvedSegmentIdxState = (signature: string, targetSegmentIdx: number) => {\n // console.log(`***useTransitionInfoStore.getResolvedSegmentIdxState(${signature})`);\n const seedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n if (!(seedBar && mixBar)) {\n // console.log('useTransitionInfoStore.getResolvedSegmentIdxState--skipped');\n return (RESET_STATE);\n }\n\n const stemsPlaying = seedBar?.getChunkByIdx(0, targetSegmentIdx);\n const isTransitional = stemsPlaying?.isTransitionalBar;\n \n // NOTE: require special treatment if this function is called within tranistion\n\n // console.log(`getChunkIndexOfCurrentSegmentPlaying() triggered while it is ${isTransitional ? 'Transition' : 'NON-transition'}`);\n if (isTransitional) {\n console.log('%cavoided change the transition info while it is in tranistion', 'color: purple;');\n return null;\n }\n\n const info = seedBar?.getChunkIndexOfCurrentSegment(targetSegmentIdx);\n // if (info.t2_segmentIdxStart === -1 || info.t2_segmentIdxEnd === -1) return;\n\n // console.log(info);\n\n try {\n // let seed1StartTimeIdxToUse = info.startingSegmentIdx_fromSegmentConfig || 0;\n // if (info.s_segmentIdxStart !== -1 && !!seedBar.sequences[0].segments[info.s_segmentIdxStart]) {\n // seed1StartTimeIdxToUse = info.s_segmentIdxStart;\n // }\n // let seed1StartTime = 0;\n // if (seedBar.sequences[0].segments[seed1StartTimeIdxToUse]) {\n // seed1StartTime = seedBar.sequences[0].segments[seed1StartTimeIdxToUse]?.originalBar.sampleStart / 48000;\n // }\n \n const newState = {\n // seed1BeatRangeActualSegment: (seedBar && info.t2_exists \n // && info.s_segmentIdxStart!== -1 \n // && info.t2_segmentIdxEnd !== -1 \n // && !!seedBar.sequences[0].segments[info.s_segmentIdxStart] \n // && !!seedBar.sequences[0].segments[info.t2_segmentIdxEnd]\n // ) === false ? \n // 'nil' : `${seedBar.sequences[0].segments[info.s_segmentIdxStart].originalBar.beatIndex}-${seedBar.sequences[0].segments[info.t2_segmentIdxEnd].originalBar.beatIndex}`,\n\n // seed1BeatRangeAtTransitionOut: (seedBar && info.t2_exists \n // && info.t2_segmentIdxStart!== -1 \n // && info.t2_segmentIdxEnd !== -1 \n // && !!seedBar.sequences[0].segments[info.t2_segmentIdxStart] \n // && !!seedBar.sequences[0].segments[info.t2_segmentIdxEnd]\n // ) === false ? \n // 'nil' : `${seedBar.sequences[0].segments[info.t2_segmentIdxStart].originalBar.beatIndex}-${seedBar.sequences[0].segments[info.t2_segmentIdxEnd].originalBar.beatIndex}`,\n \n // how to find the start index for scrubber\n // seed1StartTime: seed1StartTime || 0,\n\n // seed1StartTime: (seedBar.sequences[0].segments[info.s_segmentIdxStart]?.originalBar.sampleStart / 48000).toFixed(2),\n // seed1TransitionStartTime: (info.t2_exists === false && info.t2_segmentIdxStart !== -1 && !!seedBar.sequences[0].segments[info.t2_segmentIdxStart]) ? 0 : (seedBar.sequences[0].segments[info.t2_segmentIdxStart]?.originalBar?.sampleStart / 48000 || 0),\n // seed1EndTime: (info.t2_segmentIdxEnd!== -1 && !!seedBar.sequences[0].segments[info.t2_segmentIdxEnd]) ? (seedBar.sequences[0].segments[info.t2_segmentIdxEnd]?.originalBar.sampleEnd / 48000) : 0,\n\n seed1_Transition1Exists: info.t1_exists,\n seed1SegmentIdx_Transition1Start: info.t1_segmentIdxStart,\n seed1SegmentIdx_Transition1End: info.t1_segmentIdxEnd,\n seed1SegmentIdx_ActualStart: info.s_segmentIdxStart,\n seed1SegmentIdx_ActualStart_According_ToSegmentInput: info.startingSegmentIdx_fromSegmentConfig, \n seed1SegmentIdx_Transition2Start: info.t2_segmentIdxStart,\n seed1_Transition2Exists: info.t2_exists,\n seed1SegmentIdx_ActualEnd: info.t2_segmentIdxEnd,\n\n // seed2BeatRangeAtTransitionIn: (mixBar && info.t2_exists \n // && info.t2_segmentIdxStart!== -1 \n // && info.t2_segmentIdxEnd !== -1 \n // && !!mixBar.sequences[0].segments[info.t2_segmentIdxStart] \n // && !!mixBar.sequences[0].segments[info.t2_segmentIdxEnd]\n // ) === false ? \n // 'nil' : `${mixBar.sequences[0].segments[info.t2_segmentIdxStart].originalBar.beatIndex}-${mixBar.sequences[0].segments[info.t2_segmentIdxEnd].originalBar.beatIndex}`,\n \n seed1TrackId: !!seedBar && info.t2_exists \n && info.t2_segmentIdxStart!== -1 && !!seedBar.sequences?.[0]?.segments?.[info.t2_segmentIdxStart] ? (seedBar.sequences[0].segments[info.t2_segmentIdxStart]?.originalBar?.trackId ?? '') : '',\n seed2TrackId: !!mixBar && info.t2_exists \n && info.t2_segmentIdxStart!== -1 && !!mixBar.sequences?.[0]?.segments?.[info.t2_segmentIdxStart] ? (mixBar.sequences[0].segments[info.t2_segmentIdxStart]?.originalBar?.trackId ?? '') : '',\n };\n // if (newState.seed1EndTime >= newState.seed1TransitionStartTime) {\n // debugger;\n // }\n // console.log('useTransitionInfoStore.getResolvedSegmentIdxState--OK', newState);\n return(newState);\n\n } catch (err) {\n console.error(err);\n // console.log('useTransitionInfoStore.getResolvedSegmentIdxState--err');\n return(RESET_STATE);\n }\n}\n\n/**\n * Beat/time snapshot for the current segment and its transition windows.\n * If the segment is transitional, segment index resolution is skipped and beat state resets are returned\n * (see `getResolvedSegmentIdxState` returning `null` β that value is not passed through to beat resolution).\n *\n * @param currentSegmentIdx segment index on the seed bar sequence\n */\nexport const getCurrentSeedBarTimeInfo = (currentSegmentIdx: number) => {\n const signature = 'getCurrentSeedBarTimeInfo';\n const segmentIdxState = getResolvedSegmentIdxState(signature, currentSegmentIdx);\n if (segmentIdxState === null) {\n return RESET_BEAT_STATE;\n }\n return getResolvedBeatIdxNTimeState(signature, segmentIdxState);\n}\n\n/**\n * Segment-index snapshot for transition UI / seek helpers.\n * @returns `null` when the chunk at `currentSegmentIdx` is a transitional bar (store refresh intentionally skips mutating transition metadata). Callers must branch on `null`.\n */\nexport const getCurrentSeedBarSegmentIdxInfo = (currentSegmentIdx: number) => {\n const signature = 'getCurrentSeedBarSegmentIdxInfo';\n return getResolvedSegmentIdxState(signature, currentSegmentIdx);\n}\n\nexport const useTransitionInfoStore = create<TransitionInfoStore>()(\n subscribeWithSelector((set) => ({\n\n seed1_Transition1Exists: false,\n seed1_Transition2Exists: false,\n\n // following are segmentIdx, not beatIndex\n seed1SegmentIdx_Transition1Start: 0,\n seed1SegmentIdx_Transition1End: 0,\n seed1SegmentIdx_ActualStart: 0,\n seed1SegmentIdx_Transition2Start: 0,\n seed1SegmentIdx_ActualEnd: 0,\n\n seed1BeatIdx_Transition1Start: 0,\n seed1BeatIdx_Transition1End: 0,\n seed1BeatIdx_ActualStart: 0,\n seed1BeatIdx_Transition2Start: 0,\n seed1BeatIdx_ActualEnd: 0,\n\n seed2BeatIdx_Transition2Start: 0,\n seed2BeatIdx_Transition2End: 0,\n\n seed1Time_Transition1Start: 0,\n seed1Time_Transition1End: 0,\n seed1Time_ActualStart: 0,\n seed1Time_Transition2Start: 0,\n seed1Time_ActualEnd: 0,\n \n seed2Time_Transition2Start: 0,\n seed2Time_Transition2End: 0,\n\n seed1TrackId: '',\n seed2TrackId: '',\n \n refresh: (signature: string) => {\n console.log(`useTransitionInfoStore.refresh(${signature})`);\n const seedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n if (!(seedBar && mixBar)) {\n console.log('useTransitionInfoStore.refresh--skipped');\n set(RESET_STATE);\n return;\n }\n\n const newSegmentIdxState = getResolvedSegmentIdxState('refresh', seedBar.getPlayingChunksInfo()[0].chunkIdx);\n if (newSegmentIdxState!==null) {\n const newBeatIdxState = newSegmentIdxState === RESET_STATE ? RESET_BEAT_STATE: getResolvedBeatIdxNTimeState('refresh', newSegmentIdxState);\n set({...newSegmentIdxState, ...newBeatIdxState});\n };\n },\n\n refreshV2: (signature: string, targetSegmentIdx: number) => {\n console.log(`useTransitionInfoStore.refreshV2(${signature})`);\n const seedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n if (!(seedBar && mixBar)) {\n console.log('useTransitionInfoStore.refresh--skipped');\n set(RESET_STATE);\n return;\n }\n const newSegmentIdxState = getResolvedSegmentIdxState('refreshV2', targetSegmentIdx);\n if (newSegmentIdxState!==null) {\n const newBeatIdxState = newSegmentIdxState === RESET_STATE ? RESET_BEAT_STATE: getResolvedBeatIdxNTimeState('refreshV2', newSegmentIdxState);\n set({...newSegmentIdxState, ...newBeatIdxState});\n };\n },\n\n reset: () => {\n set(RESET_STATE);\n },\n\n \n })),\n);\n\nexport default useTransitionInfoStore;\n\n","import { BarSequence } from \"../decode/bar-sequence\";\nimport { getCurrentSeedBarSegmentIdxInfo } from \"../store/use-transitional-info-store\";\n// import { lastIndexOfThisSegmentBeforeTransitionZone, lastIndexOfThisSegmentIncludeTransition, startIndexOfThisSegment } from \"../utils/bars\";\n\n // for seekTo specific\nexport const getSeekToSampleLocOfCurrentSegment = (seedBar: BarSequence, seekToTime: number): number => {\n const currentSegmentTimes = getCurrentSeedBarSegmentIdxInfo(seedBar.getPlayingChunksInfo()[0].chunkIdx);\n if (currentSegmentTimes === null) {\n return Math.round(seekToTime * 48000);\n }\n\n const chunkT2 = seedBar.getChunkByIdx(0, currentSegmentTimes.seed1SegmentIdx_Transition2Start - 3);\n const chunkActual = seedBar.getChunkByIdx(0, currentSegmentTimes.seed1SegmentIdx_ActualStart);\n const obT2 = chunkT2?.originalBar;\n const obActual = chunkActual?.originalBar;\n\n // if not bounded by 3 seems it acting bit funny\n if (obT2 && seekToTime >= obT2.startTime) {\n return obT2.sampleStart;\n }\n if (obActual && seekToTime <= obActual.startTime) {\n return obActual.sampleStart;\n }\n return Math.round(seekToTime * 48000);\n}\n\n\n/**\n * this is for startup playback only\n * if sample cannot be resolved, it will return 0\n * @param seedBar \n * @param sample \n * @returns \n */\nexport const findFirstChunkIdxWithSample = (seedBar: BarSequence, sample: number) => {\n try {\n const chunkIdx = seedBar?.sequences?.[0]?.segments?.findIndex((c)=>{\n const ob = c.originalBar;\n return ob != null && ob.sampleStart <= sample && sample < ob.sampleEnd;\n });\n if (chunkIdx==-1) {\n return 0;\n } else {\n return chunkIdx;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (err) {\n return 0;\n }\n}","/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { AEV3Context, initAudioContext, SILENT_BUFFER_SAMPLE_SIZE, TIMER_LOG_AUDIO_CONTEXT, USE_AUDIO_STREAM_DESTINATION } from '@/stem-audio-engine-v3/audio-context';\nimport { BarSequence } from '@/stem-audio-engine-v3/decode/bar-sequence';\nimport { EventEmitter } from '@/stem-audio-engine-v3/event-emitter';\nimport {\n AudioSourceSequenceEventLoadAllSequencesWithIndexRangeProvided,\n AudioSourceSequenceEventM3U8Created,\n AudioSourceSequence,\n AudioSourceSequenceEventM3U8Failed,\n GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR,\n} from './cache/mp4-sequence';\nimport { AudioEnginePlaybackState, IMixConfiguration, IMusicKey, IMusicTonality, IOptionalCurrentTrackInfo, ITrackForSequence, StemProfileString, TBACSEventData, TStemType } from './interface';\nimport { getTargetTempoOrigSzAndBpmRatio } from './utils/audio';\nimport { stemVolumeMixToClassic, stemVolumeClassicToMixVer2, stemVolumeMixToClassicMixtrack } from './features/stem-volume-on-playback';\nimport { resolveSampleLocOfDownbeatFromBarIndex, triggerDecodeBothBarSequencesBeforeStart } from './utils/bars';\nimport {\n alignBarCountsOfComposedSeedMix,\n alignSpeedOfMixToUnquantisedSeedOfComposedSeedMix,\n isValidRatioBetweenBarsOfSeedAndMix,\n RatioOfBarsAllowedBetweenSeedAndMix,\n alignSpeedOfSeedToUnquantisedMixOfComposedSeedMix,\n alignBarCountsOfComposedSeedMix_MakeSureMixTrackFullyCovered,\n trimBarSequenceSegments,\n} from './decode/parser';\nimport { GRAPHQL_FIELDS_TO_USE_FOR_AUDIO } from '@/components/prototype-panel-v2';\nimport isMobile from 'is-mobile';\nimport { composeTBACSEvent, getDefaultDJAction } from './utils/event-resolvers';\nimport { BarEventChunkDetails, IBarSequence, IBarSequenceChunk, StemSwitchingScheduler } from './decode/types-interfaces';\n\n// for starting up the stems enabled at playback triggerer\nimport { getCurrentStemProfileBasedOnStore, seedStemsToEnableWhenPlaybackStarts } from '@/stem-audio-engine-v3/store/stems-selection-store';\nimport { seedStemsVolumeToEnableWhenPlaybackStarts, trackVolumeToEnableWhenPlaybackStarts } from './store/seed-stems-volume-store';\nimport { mixStemsVolumeToEnableWhenPlaybackStarts } from './store/mix-stems-volume-store';\nimport { preloadMP4s_BasedOnBeatGridIndex } from './utils/preload';\nimport { PitchShiftStrategy } from './utils/seed-mix-utils';\nimport { aev3StemsMasterStateStore, invertStemProfile, randomiseStemsPlaying } from './store/stems-master-state-store';\nimport { setupMediaSessionModeAware } from './audio-context/media-session';\nimport {\n getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode,\n getRandomiseStemsAfterVarirantsStartPlaying,\n getRetainStemProfileExitingTransitionConfig,\n getSegmentIndiceFromPlayMode,\n} from './playmode-matrix';\nimport { consoleColorfulMessage, consoleColorfulMessage4Lawful } from './utils/colorConsole';\nimport { AEV3Config } from './aev3-env-config';\nimport { prepareAssignNextMixWithTransition } from './features/assign-next-mix-v2';\n\nimport useNextMixStore from './store/use-next-mix-store';\nimport useBarSequenceStore from './store/use-bar-sequence-store';\n\nimport useTransitionInfoStore from './store/use-transitional-info-store';\nimport { findFirstChunkIdxWithSample } from './features/seek-to-utils';\nimport { unknownThrownToString } from '@/utils/unknown-caught-error';\n\n// import { StemSelectedStateStore } from '..';\n\n// export const ServiceWorker = new Worker('/workers/service-router.js'); // Ensure the worker file is correctly referenced\n\nconst isDesktop = !isMobile();\n\nexport const LATENCY_HINT = isDesktop ? 'interactive' : 0.01;\nexport const LATENCY_HINT_DECODE = 0.2;\n\nexport const SAMPLE_RATE = 48000;\n\nexport type TrackLabelType = 'seed1' | 'mix1';\nexport type TrackIndexType = 0 | 1 | undefined; // where if a bar is undefined, it is just a Pseudo Bar Created no EventListeners should assign to it\n\nexport const FADE_OUT_DURATION_ON_PAUSE = 0.01;\n\nexport type StemSelection = {\n [sequenceIdx: number]: 'seed1' | 'mix1';\n};\n\nexport type StemsMuted = {\n [sequenceIdx: number]: boolean;\n};\nexport interface IEventUpdateStemVolumeStore {\n type: 'update_volume_store_because_vol_changed_not_init_from_store';\n detail: {\n trackType: TrackLabelType;\n sequenceIdx: number;\n expected: number;\n signature?: string;\n };\n}\nexport interface IEventUpdateStemMasterStore {\n type: 'update_master_store_because_vol_changed_not_init_from_there_toggle_selection_(only_seed)';\n detail: {\n trackType: TrackLabelType;\n sequenceIdx: number;\n newVolume: number;\n signature?: string;\n };\n}\n\nexport interface IEventBarSequenceAssignmentUpdated {\n type: 'bar_sequence_assigment_updated';\n detail: {\n trackType: TrackLabelType;\n };\n}\n\nexport interface INextMixMasterBarSegmentAssignmentUpdated {\n type: 'aev3_appended_s1s2_and_s2m2';\n detail: {\n infoChanged: 'nil';\n enforceUpdate: boolean;\n };\n}\n\nexport interface INextSeedMixTrackDataAssignmentUpdated {\n type: 'next_seed_or_mix_track_data_assigned';\n detail: {\n infoChanged: 'seed' | 'mix' | 'optionalParam';\n };\n}\n\nexport interface IEventBarSequenceDestroyed {\n type: 'bar_sequence_destroyed';\n detail: {\n trackType: TrackLabelType;\n };\n}\n\nexport const PLAY_MODE_CLASSIC = 'classic';\nexport const PLAY_MODE_CLASSIC_MIXTRACK = 'classic-mixtrack';\nexport const PLAY_MODE_MIX = 'mix';\nexport const PLAY_MODE_DJ_MIX = 'dj-mix';\nexport const PLAY_MODE_INFINITE_MIX = 'infinite-mix';\nexport const DEFAULT_PLAY_MODE = PLAY_MODE_MIX;\n\nexport type PlayModes = 'classic' | 'mix' | 'infinite-mix' | 'dj-mix' | 'classic-mixtrack';\n\nexport type AssignNextMixSkipReason =\n | 'busy'\n | 'remix'\n | 'cleanup'\n | 'no_token'\n | 'already_has_next'\n | 'no_current_mix_track';\n\nexport type AssignNextMixOutcome =\n | { status: 'assigned' }\n | { status: 'cancelled' }\n | { status: 'skipped'; reason: AssignNextMixSkipReason }\n | { status: 'failed'; error: unknown };\n\nexport interface IEventAEV3PlayModeChanged {\n type: 'aev3_playmode_changed';\n detail: {\n from: PlayModes;\n to: PlayModes;\n };\n}\n\nexport interface IEventAEV3CreatingAudioContext {\n type: 'aev3_creating_audio_context';\n detail: {\n from: boolean;\n to: boolean;\n };\n}\n\nexport interface IEventAEV3AudioContextStateChanged {\n type: 'aev3_audio_context_state_changed';\n detail: {\n from: AudioContextState | null | 'interrupted';\n to: AudioContextState | null | 'interrupted';\n };\n}\n\nexport interface IEventAEV3IsBusy {\n type: 'aev3_state_changed_is_busy';\n detail: {\n from: boolean;\n to: boolean;\n };\n}\n\nexport interface IEventAEV3RemixOnTheFly {\n type: 'aev3_state_changed_is_remix_on_the_fly';\n detail: {\n from: string;\n to: string;\n newRemixType: 'intelliskip' | 'seed-variant' | 'mix-variant' | 'regenerate' | 'skipping(no-trans)' | null;\n };\n}\n\nexport interface IEventAEV3PlaybackStateChanged {\n type: 'aev3_state_changed_playback_state';\n detail: {\n from: AudioEnginePlaybackState;\n to: AudioEnginePlaybackState;\n };\n}\n\nexport interface TBACSEvent {\n type: 'tbacs_bar_played';\n detail: TBACSEventData;\n}\n\nconst ENABLE_DEBUG_FADING = false;\n\n/** Parser align helpers require non-null `sequences`; composed bars satisfy this at those call sites */\ntype BarSequenceWithAlignSequences = BarSequence & { sequences: IBarSequence[] };\n\n/**\n * Note the direct usage of this class should be prohibited\n */\nexport class AEV3Controller extends EventEmitter {\n audioControl: HTMLAudioElement | null;\n streamOutput: HTMLAudioElement | null;\n streamOutputDebug: HTMLDivElement | null;\n audioControlDebug: HTMLDivElement | null;\n audioContextDebug: HTMLDivElement | null;\n aev3Context!: AEV3Context;\n\n barSequence1: BarSequence | null = null;\n barSequence2: BarSequence | null = null;\n barSequence3!: BarSequence;\n barSequence4!: BarSequence;\n\n seed: TrackIndexType;\n mix: TrackIndexType;\n seed2: TrackIndexType;\n mix2: TrackIndexType;\n\n isSeekToInAction: boolean = false;\n private cleanupMemoryInAction = false;\n\n colorful_debugging: boolean = false;\n\n private globalPlaybackRate: number;\n private playMode: PlayModes;\n private playMixAsQuantised: 'quantised' | 'seed' | 'mix';\n private isCreatingAudioContext: boolean;\n audioContextState: AudioContextState | null | 'interrupted';\n private isBusy: boolean;\n private isSettingAudioContext = false;\n private playbackState: AudioEnginePlaybackState;\n\n private pauseAtSeedBarIndex = 0;\n private audioContextAlias!: AudioContext;\n\n currentSeedTrackObject: ITrackForSequence | null;\n currentSeedTrackStartBarIndex = 0;\n currentSeedTrackEndBarIndex = 0;\n currentMixTrackObject: ITrackForSequence | null;\n currentMixTrackStartBarIndex = 0;\n currentMixTrackEndBarIndex = 0;\n currentMixTrackObjectBeforeTransitionHappen: ITrackForSequence | null; // used in playControl hooks for restarting playback, only update if it is not setting mixTrackObject from transition\n\n nextSeedTrackObject: ITrackForSequence | null;\n nextSeedTrackStartBarIndex = 0;\n nextSeedTrackEndBarIndex = 0;\n nextMixTrackObject: ITrackForSequence | null;\n nextMixTrackStartBarIndex = 0;\n nextMixTrackEndBarIndex = 0;\n nextMixConfiguration: IMixConfiguration | null;\n\n currentTrackOptionalParam: IOptionalCurrentTrackInfo = { stationTrackId: '', stationId: '' };\n nextTrackOptionalParam: IOptionalCurrentTrackInfo = { stationTrackId: '', stationId: '' };\n\n preloadedAudioSource: AudioSourceSequence[];\n barCreated: BarSequence[];\n\n static UPDATE_STEM_VOLUME_STORE = 'update_volume_store_because_vol_changed_not_init_from_store';\n static UPDATE_STEM_MASTER_STORE_ON_TOGGLING = 'update_master_store_because_vol_changed_not_init_from_there';\n\n static BAR_SEQUENCE_ASSIGNMENT_UPDATED = 'bar_sequence_assigment_updated';\n static NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED = 'next_seed_or_mix_track_data_assigned';\n static REMIX_ON_THE_ROAD = 'remix ahead... beware';\n static REMIX_SEGMENT_FULFILLED = 'remix playing... free to take next command';\n static BAR_SEQUENCE_DESTROYED = 'bar_sequence_destroyed';\n static TBACS_BAR_PLAYED_RECORD = 'tbacs_bar_played';\n static BAR_SEQUENCE_PLAY_ERROR_1 = 'bar_sequence_playback_error(sample not ready yet)';\n static BAR_SEQUENCE_PLAY_ERROR_SAMPLE_OUT_OF_RANGE = 'bar_sequence_playback_fatal_error(sample out of range)';\n static BAR_SEQUENCE_PLAY_FATAL_ERROR_BAD_MP4 = 'bar_sequence_playback_fatal_error(bad mp4)';\n static FIRST_BAR_STARTS_PLAYING_FOR_TEST = 'benchmark_test_first_sample_pass_on_pipeline';\n\n static PLAY_MODE_CHANGED = 'aev3_playmode_changed';\n static CREATING_AUDIO_CONTEXT = 'aev3_creating_audio_context';\n static AUDIO_CONTEXT_STATE_CHANGED = 'aev3_audio_context_state_changed';\n static STATE_CHANGE_IS_BUSY = 'aev3_state_changed_is_busy';\n static PLAYBACK_STATE_CHANGED = 'aev3_playback_state';\n\n static MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS = 'aev3_appended_s1s2_and_s2m2';\n\n static ACCESS_TOKEN_CHANGED = 'aev_access_token_change';\n\n private djAction: { trackId: string; sequenceIdx: number; vol: number; startTime: number }[];\n\n // Static variable to hold the single instance\n private static instance: AEV3Controller;\n\n private playPauseMultiplier: number = 1; // 1 = playing at normal speed, ~0 = paused\n private isVinylStopEnabled: boolean = true; // Can be toggled to enable/disable the vinyl stop effect\n private vinylStopTransitionDuration: number = 0.6; // Duration of the vinyl stop/start effect in seconds\n private vinylStopAnimationId: number | null = null; // For tracking the animation\n private originalMasterVolume: number = 1; // Store the original master volume before vinyl stop\n private useVolumeFade: boolean = true; // Whether to include volume fade with vinyl stop\n\n private _stemProfileBeforeTransition: StemProfileString;\n fieldToUseOnAutoplayNext: 'prevMixId' | 'nextMixId' = 'prevMixId';\n\n enableAutoMix: boolean = false; // make this a momentum later, if the mixing is not kick in - keep the momentum and increase it to hit a stem swtich\n\n constructor() {\n super();\n if (AEV3Controller.instance) {\n // If instance already exists, prevent new instance creation\n throw new Error('You can only create one instance of Singleton.');\n }\n AEV3Controller.instance = this;\n\n // this.managerWorker = new Worker('/workers/buffer-manager-processor.js');\n this.seed = 0;\n this.mix = 1;\n this.preloadedAudioSource = [];\n this.isCreatingAudioContext = false;\n this.audioContextState = null;\n this.playMode = DEFAULT_PLAY_MODE;\n this.playMixAsQuantised = getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode(DEFAULT_PLAY_MODE);\n this.isBusy = false;\n this.playbackState = AudioEnginePlaybackState.Stopped;\n this.currentSeedTrackObject = null;\n this.currentMixTrackObjectBeforeTransitionHappen = null;\n this.currentMixTrackObject = null;\n this._stemProfileBeforeTransition = '';\n this.djAction = [];\n this.barCreated = [];\n\n this.audioControl = null;\n this.streamOutput = null;\n this.streamOutputDebug = null;\n this.audioControlDebug = null;\n this.audioContextDebug = null;\n\n this.nextSeedTrackObject = null;\n this.nextMixTrackObject = null;\n this.nextMixConfiguration = null;\n\n this.globalPlaybackRate = 1;\n // Bind a debounced method directly in the constructor or use a decorator-like pattern.\n // this.changeStemVolumeDebounced = this._debounce(this.changeStemVolume.bind(this), 300);\n }\n\n static getInstance(): AEV3Controller {\n // If instance does not exist, create it\n if (!AEV3Controller.instance) {\n AEV3Controller.instance = new AEV3Controller();\n }\n return AEV3Controller.instance;\n }\n\n _log(...msg: unknown[]) {\n return;\n console.log(...msg);\n }\n _log_utils(...msg: unknown[]) {\n console.log(...msg);\n }\n _log_table(...msg: unknown[]) {\n return;\n console.table(...msg);\n }\n _time(label: string) {\n return;\n console.time(label);\n }\n _timeLog(label: string, ...data: unknown[]) {\n return;\n console.timeLog(label, ...data);\n }\n _timeEnd(label: string) {\n return;\n console.timeEnd(label);\n }\n\n destroy() {}\n\n // Playback Rate\n\n getGlobalPlaybackRate(): number {\n return this.globalPlaybackRate;\n }\n\n setGlobalPlaybackRate(rate: number) {\n this.globalPlaybackRate = rate;\n // Apply the multiplier effect when setting the rate\n this.applyPlaybackRateWithMultiplier();\n }\n\n setBarWithType(bar: BarSequence | null, trackType: TrackLabelType, trackIndex: TrackIndexType) {\n switch (trackIndex) {\n case 0:\n this.barSequence1 = bar;\n break;\n case 1:\n this.barSequence2 = bar;\n break;\n }\n switch (trackType) {\n case 'seed1':\n this.seed = trackIndex;\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED, { trackType: trackType });\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(bar as BarSequence);\n break;\n case 'mix1':\n this.mix = trackIndex;\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED, { trackType: trackType });\n useBarSequenceStore.getState().updateCurrentMixBarSequence(bar as BarSequence);\n break;\n }\n }\n\n getBarSequenceWithType(trackType: TrackLabelType) {\n switch (trackType) {\n case 'seed1':\n return this.getBarWithTrackIndex(this.seed);\n case 'mix1':\n return this.getBarWithTrackIndex(this.mix);\n }\n }\n\n isSwappingSeedMix = '';\n\n destroyBarWithType(trackType: TrackLabelType, applyFadeOut: boolean = false) {\n const id = this.getBarSequenceIdWithType(trackType);\n const bar = this.getBarWithTrackIndex(id);\n if (!bar) {\n this._log('%cdestroyBarWithType failed', 'color: red; background; yellow;', trackType);\n return;\n }\n\n this._log(`%cClean buffer's of ${trackType}, applyFadeOut: ${applyFadeOut ? 'true' : 'false'}`, 'color: red; background: yellow', bar);\n bar.cleanBuffersInBufferPlayerProcessor();\n\n // return;\n\n // remove the HLS/MP4 from preloadedAudioSource if it is there\n // const index = this.preloadedAudioSource.findIndex((s)=>(s===bar.getAudioSourceSequence()));\n // if (index>-1) {\n // this.preloadedAudioSource.splice(index, 1);\n // }\n const index = this.preloadedAudioSource.findIndex((s) => s === bar.getAudioSourceSequence());\n bar?.destroy();\n this.setBarWithType(null, trackType, id);\n if (trackType === 'seed1') {\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_DESTROYED, { trackType: trackType });\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(null as unknown as BarSequence);\n } else {\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_DESTROYED, { trackType: trackType });\n useBarSequenceStore.getState().updateCurrentMixBarSequence(null as unknown as BarSequence);\n }\n }\n\n destroyBar(bar: BarSequence, trackType: TrackLabelType, refreshMix: boolean = false) {\n if (!bar) {\n this._log('%cdestroyBarWithType failed', 'color: red; background; yellow;', trackType);\n return;\n }\n\n this._log(`%cClean buffer's of ${trackType}, refreshMix: ${refreshMix ? 'true' : 'false'}`, 'color: red; background: yellow', bar);\n if (!refreshMix) {\n bar.cleanBuffersInBufferPlayerProcessor();\n }\n\n // return;\n\n // remove the HLS/MP4 from preloadedAudioSource if it is there\n // const index = this.preloadedAudioSource.findIndex((s)=>(s===bar.getAudioSourceSequence()));\n // if (index>-1) {\n // this.preloadedAudioSource.splice(index, 1);\n // }\n const index = this.preloadedAudioSource.findIndex((s) => s === bar.getAudioSourceSequence());\n if (!refreshMix) {\n bar?.destroy();\n } else {\n bar?.destroyOnObsoleteRefreshMix();\n }\n\n // this.setBarWithType(null, trackType, id);\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_DESTROYED, { trackType: trackType });\n if (trackType === 'seed1') {\n useBarSequenceStore.getState().updateCurrentSeedBarSequence(null as unknown as BarSequence);\n } else {\n useBarSequenceStore.getState().updateCurrentMixBarSequence(null as unknown as BarSequence);\n }\n }\n\n getBarSequenceIdWithType(trackType: TrackLabelType) {\n switch (trackType) {\n case 'seed1':\n return this.seed;\n case 'mix1':\n return this.mix;\n }\n }\n\n private getBarSequenceIdWithTrackIndex(trackIndex: TrackIndexType | number): TrackLabelType {\n if (this.seed === trackIndex) {\n return 'seed1';\n } else if (this.mix === trackIndex) {\n return 'mix1';\n } else {\n throw Error(`trackIndex ${trackIndex} not recognised`);\n }\n }\n\n // private only\n private getBarWithTrackIndex(trackIndex: TrackIndexType) {\n switch (trackIndex) {\n case 0:\n return this.barSequence1;\n case 1:\n return this.barSequence2;\n }\n }\n\n // Set the reference to the audio element\n setAudioControl(ref: HTMLAudioElement | null) {\n // if (ref) {\n // this._log('setAudioControl', ref);\n // } else {\n // this._log('setAudioControl', 'null');\n // }\n this.audioControl = ref;\n }\n\n // Set the reference to the audio element\n setStreamOutput(ref: HTMLAudioElement | null) {\n // if (ref) {\n // this._log('setStreamOutput', ref);\n // } else {\n // this._log('setAudioControl', 'null');\n // }\n this.streamOutput = ref;\n }\n\n setStreamOutputDebug(ref: HTMLDivElement | null) {\n // if (ref) {\n // this._log('setStreamOutputDebug', ref);\n // } else {\n // this._log('setStreamOutputDebug', 'null');\n // }\n this.streamOutputDebug = ref;\n }\n\n setAudioControlDebug(ref: HTMLDivElement | null) {\n // if (ref) {\n // this._log('setAudioControlDEbug', ref);\n // } else {\n // this._log('setAudioControlDEbug', 'null');\n // }\n this.audioControlDebug = ref;\n }\n\n setAudioContextDebug(ref: HTMLDivElement | null) {\n // if (ref) {\n // this._log('setAudioContextDebug', ref);\n // } else {\n // this._log('setAudioContextDebug', 'null');\n // }\n this.audioContextDebug = ref;\n }\n\n setAEV3Context(context: AEV3Context) {\n this.aev3Context = context;\n this.setAudioContextAlias(context.audioContext);\n }\n\n setAudioContextAlias(context: AudioContext) {\n this.audioContextAlias = context;\n }\n\n getAudioContextAlias() {\n return this.audioContextAlias;\n }\n\n initAudioContextMain(audioContext: AudioContext, suspendPlayback = false): Promise<AEV3Context> {\n return new Promise((resolve) => {\n initAudioContext(audioContext, suspendPlayback).then((a) => {\n this.setAEV3Context(a);\n resolve(a);\n });\n });\n }\n\n // Play the audio if the reference is set and valid\n __play() {\n if (this.isVinylStopEnabled) {\n // Start the vinyl speedup animation (from current rate to full speed)\n this.animatePlaybackRate(1);\n } else {\n // Instantly set to full speed\n this.playPauseMultiplier = 1;\n this.applyPlaybackRateWithMultiplier();\n }\n\n // Update media session when play button is pressed\n this.updateMediaSessionForTrackChangeSimple(true); // Force update\n\n // Continue with regular play logic\n if (this.audioControl) {\n this.audioControl.play().catch((error) => {\n console.error('Error trying to play audio control:', error);\n });\n }\n\n if (this.streamOutput) {\n this.streamOutput.play().catch((error) => {\n console.error('Error trying to play stream output:', error);\n });\n }\n }\n\n // Pause the audio if the reference is set and valid\n __pause() {\n if (this.isVinylStopEnabled) {\n // Start the vinyl slowdown animation (from current rate to almost stopped)\n this.animatePlaybackRate(0.000001);\n } else {\n // Instantly set to near-zero speed\n this.playPauseMultiplier = 0.000001;\n this.applyPlaybackRateWithMultiplier();\n }\n\n // Continue with regular pause logic\n if (this.audioControl) {\n this.audioControl.pause();\n }\n\n if (this.streamOutput) {\n this.streamOutput.pause();\n }\n }\n\n /* GainNodes */\n\n private getStemGainNodesWithTrackId(trackIdx: TrackIndexType): undefined | GainNode[] {\n switch (trackIdx) {\n case 0:\n return this.aev3Context?.stemGainNodesTrack1;\n case 1:\n return this.aev3Context?.stemGainNodesTrack2;\n }\n }\n\n getStemGainNodesWithTrackType(trackType: TrackLabelType): undefined | GainNode[] {\n switch (trackType) {\n case 'seed1':\n return this.aev3Context?.stemGainNodesTrack1;\n case 'mix1':\n return this.aev3Context?.stemGainNodesTrack2;\n default:\n return undefined;\n }\n }\n\n private getTrackGainNodeWithTrackId(trackIdx: TrackIndexType): undefined | GainNode {\n switch (trackIdx) {\n case 0:\n return this.aev3Context?.trackGainNodes?.[0];\n case 1:\n return this.aev3Context?.trackGainNodes?.[1];\n default:\n return undefined;\n }\n }\n\n getTrackGainNodeWithTrackType(trackType: TrackLabelType): undefined | GainNode {\n switch (trackType) {\n case 'seed1':\n return this.aev3Context?.trackGainNodes?.[0];\n case 'mix1':\n return this.aev3Context?.trackGainNodes?.[1];\n default:\n return undefined;\n }\n }\n\n getMasterGainNode(): undefined | GainNode {\n return this.aev3Context?.masterGainNode;\n }\n\n /* Analyser Nodes */\n\n getStemAnalyserNodesWithTrackType(trackType: TrackLabelType): undefined | AnalyserNode[] {\n switch (trackType) {\n case 'seed1':\n return this.aev3Context?.stemAnalyserNodesTrack1;\n case 'mix1':\n return this.aev3Context?.stemAnalyserNodesTrack2;\n default:\n return undefined;\n }\n }\n\n /* Rubberband Worklet Nodes */\n\n getPitchShiftWorklet(trackType: TrackLabelType): undefined | AudioWorkletNode {\n switch (trackType) {\n case 'seed1':\n return this.aev3Context?.trackWorkletNodesCurrent?.[0];\n case 'mix1':\n return this.aev3Context?.trackWorkletNodesCurrent?.[1];\n default:\n return undefined;\n }\n }\n\n swapPlayBufferWorklets0and1() {}\n\n getAudioSourceSequenceInPreloadedQueued(trackId: string): AudioSourceSequence | undefined {\n // trackData will be null if it was destroy before removing from queue\n // hence make sure if we destroying a mp4 class, remove it from the array as first step\n const hls = this.preloadedAudioSource.find((t) => t.trackData?.trackId === trackId);\n return hls;\n }\n\n isAudioSourceSequenceInPreloadedQueued(trackId: string): boolean {\n return !!this.getAudioSourceSequenceInPreloadedQueued(trackId);\n }\n\n setCurrentTrackOptionalParam(optionalParam: IOptionalCurrentTrackInfo) {\n console.log(`%csetCurrentTrackOptionalParam(stationId: ${optionalParam?.stationId} stationTrackId: ${optionalParam?.stationTrackId})`, 'color: yellowgreen');\n this.currentTrackOptionalParam = optionalParam;\n useBarSequenceStore.getState().updateCurrentTrackOptionalParam(optionalParam);\n useTransitionInfoStore.getState().refresh('set current mix object info');\n }\n\n // return directly at useCurrentTrack\n getCurrentTrackOptionalParam(): IOptionalCurrentTrackInfo {\n return this.currentTrackOptionalParam;\n }\n\n setCurrentSeedTrackObject(track: ITrackForSequence, eventToFire: 'seed1' | 'seed2', triggerPreload: boolean, barToPreload: number, signature: string) {\n console.log(`%csetCurrentSeedTrackObject(${track?.trackId}...${signature})`, 'color: yellowgreen');\n track = trackDataStemsSafeGuarding(track);\n this.currentSeedTrackObject = track;\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED, { trackType: eventToFire });\n useBarSequenceStore.getState().updateCurrentSeedTrackData(track);\n // useTransitionInfoStore.getState().refresh('set current seed track');\n\n // Update media session when tracks change\n this.updateMediaSessionForTrackChangeSimple();\n\n if (!triggerPreload || barToPreload < 0) return;\n preloadMP4s_BasedOnBeatGridIndex([\n {\n track: track,\n beatStartIndex: barToPreload,\n beatEndIndex: barToPreload + 3,\n },\n ]);\n }\n\n setCurrentSeedTrackBarRanges(start: number, end: number) {\n this.currentSeedTrackStartBarIndex = start;\n this.currentSeedTrackEndBarIndex = end;\n useBarSequenceStore.getState().updateCurrentSeedTrackBarRanges(start, end);\n }\n\n resetCurrentSeedTrackObject() {\n this.currentSeedTrackObject = null;\n useBarSequenceStore.getState().updateCurrentSeedTrackData(null as unknown as ITrackForSequence);\n // useTransitionInfoStore.getState().refresh('reset current seed track');\n this.setCurrentSeedTrackBarRanges(-1, -1);\n }\n\n getCurrentSeedTrackObject(): Readonly<ITrackForSequence> | null {\n return this.currentSeedTrackObject;\n }\n\n setCurrentMixTrackObject(track: ITrackForSequence, eventToFire: 'mix1' | 'mix2', triggerPreload: boolean, memoriseMixTrackForSeekTo: boolean, barToPreload: number, signature: string) {\n console.log(`%csetCurrentMixTrackObject(${track?.trackId})...${signature}`, 'color: yellowgreen');\n track = trackDataStemsSafeGuarding(track);\n this.currentMixTrackObject = track;\n if (memoriseMixTrackForSeekTo) {\n this.currentMixTrackObjectBeforeTransitionHappen = track;\n }\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_ASSIGNMENT_UPDATED, { trackType: eventToFire });\n useBarSequenceStore.getState().updateCurrentMixTrackData(track);\n // useTransitionInfoStore.getState().refresh('set current mix track');\n\n // Update media session when tracks change\n this.updateMediaSessionForTrackChangeSimple();\n\n if (!triggerPreload || barToPreload < 0) return;\n preloadMP4s_BasedOnBeatGridIndex([\n {\n track: track,\n beatStartIndex: barToPreload,\n beatEndIndex: barToPreload + 3,\n },\n ]);\n }\n\n setCurrentMixTrackBarRanges(start: number, end: number) {\n this.currentMixTrackStartBarIndex = start;\n this.currentMixTrackEndBarIndex = end;\n useBarSequenceStore.getState().updateCurrentMixTrackBarRanges(start, end);\n }\n\n resetCurrentMixTrackObject() {\n this.currentMixTrackObject = null;\n this.currentMixTrackObjectBeforeTransitionHappen = null;\n useBarSequenceStore.getState().updateCurrentMixTrackData(null as unknown as ITrackForSequence);\n // useTransitionInfoStore.getState().refresh('reset current mix track');\n this.setCurrentMixTrackBarRanges(-1, -1);\n }\n\n refreshTransitionInfo(chunkIdx: number) {\n useTransitionInfoStore.getState().refreshV2('manual refresh', chunkIdx);\n }\n\n // Simple media session update for track changes only\n async updateMediaSessionForTrackChangeSimple(forceUpdate: boolean = false) {\n try {\n const seedTrack = this.getCurrentSeedTrackObject();\n const mixTrack = this.getCurrentMixTrackObject();\n\n if (seedTrack) {\n // Import the function dynamically to avoid circular imports\n const { setupMediaSessionModeAware } = await import('./audio-context/media-session');\n\n // Use current play mode without trying to change it\n const currentMode = this.getPlayMode();\n setupMediaSessionModeAware(seedTrack, mixTrack, currentMode, forceUpdate);\n }\n } catch (error) {\n console.error('[media-session] Simple track change update failed:', error);\n }\n }\n\n getCurrentMixTrackObject(): Readonly<ITrackForSequence> | null {\n return this.currentMixTrackObject;\n }\n\n getCurrentMixTrackObjectBeforeTransitionHappen(): Readonly<ITrackForSequence> | null {\n return this.currentMixTrackObjectBeforeTransitionHappen;\n }\n\n setNextMixConfiguration(mixConfig: IMixConfiguration) {\n this.nextMixConfiguration = mixConfig;\n }\n\n getNextMixConfiguration() {\n return this.nextMixConfiguration;\n }\n\n setNextSeedTrackObject(track: ITrackForSequence | null, triggerPreload: boolean, barToPreload: number, signature: string) {\n console.log(`%csetNextSeedTrackObject(${track?.trackId})...${signature}`, 'color: red');\n if (track === null) {\n this.nextSeedTrackObject = null;\n this.dispatchEvent(AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED, { infoChanged: 'seed' });\n useNextMixStore.getState().updateNextSeedTrackData(null as unknown as ITrackForSequence);\n return;\n }\n track = trackDataStemsSafeGuarding(track);\n this.nextSeedTrackObject = track;\n // make sure dispatch after private var is updated:\n this.dispatchEvent(AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED, { infoChanged: 'seed' });\n useNextMixStore.getState().updateNextSeedTrackData(track);\n if (!triggerPreload || barToPreload < 0) return;\n preloadMP4s_BasedOnBeatGridIndex([\n {\n track: track,\n beatStartIndex: barToPreload,\n beatEndIndex: barToPreload + 3,\n },\n ]);\n }\n\n setNextSeedTrackBarRanges(start: number, end: number) {\n this.nextSeedTrackStartBarIndex = start;\n this.nextSeedTrackEndBarIndex = end;\n useNextMixStore.getState().updateNextSeedTrackBarRanges(start, end);\n }\n\n getNextSeedTrackObject(): Readonly<ITrackForSequence> | null {\n return this.nextSeedTrackObject;\n }\n\n setNextMixTrackObject(track: ITrackForSequence | null, triggerPreload: boolean, barToPreload: number, signature: string) {\n console.log(`%csetNextMixTrackObject(${track?.trackId})...${signature}`, 'color: red');\n if (track === null) {\n this.nextMixTrackObject = null;\n this.dispatchEvent(AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED, { infoChanged: PLAY_MODE_MIX });\n useNextMixStore.getState().updateNextMixTrackData(null as unknown as ITrackForSequence);\n return;\n }\n track = trackDataStemsSafeGuarding(track);\n this.nextMixTrackObject = track;\n // make sure dispatch after private var is updated:\n this.dispatchEvent(AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED, { infoChanged: PLAY_MODE_MIX });\n useNextMixStore.getState().updateNextMixTrackData(track);\n if (!triggerPreload || barToPreload < 0) return;\n preloadMP4s_BasedOnBeatGridIndex([\n {\n track: track,\n beatStartIndex: barToPreload,\n beatEndIndex: barToPreload + 3,\n },\n ]);\n }\n\n setNextMixTrackBarRanges(start: number, end: number) {\n this.nextMixTrackStartBarIndex = start;\n this.nextMixTrackEndBarIndex = end;\n useNextMixStore.getState().updateNextMixTrackBarRanges(start, end);\n }\n\n getNextMixTrackObject(): Readonly<ITrackForSequence> | null {\n return this.nextMixTrackObject;\n }\n\n setNextTrackOptionalParam(optionalParam: IOptionalCurrentTrackInfo | null) {\n console.log(`%csetNextTrackOptionalParam(stationId: ${optionalParam?.stationId} stationTrackId: ${optionalParam?.stationTrackId})`, 'color: red');\n if (optionalParam === null) {\n this.nextTrackOptionalParam = { stationTrackId: '', stationId: '' };\n this.dispatchEvent(AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED, { infoChanged: 'optionalParam' });\n useNextMixStore.getState().updateNextTrackOptionalParam(null as unknown as IOptionalCurrentTrackInfo);\n useTransitionInfoStore.getState().refresh('set next mix object info');\n return;\n }\n this.nextTrackOptionalParam = optionalParam;\n // make sure dispatch after private var is updated:\n this.dispatchEvent(AEV3Controller.NEXT_SEED_OR_MIX_TRACK_DATA_ASSIGNED, { infoChanged: 'optionalParam' });\n useNextMixStore.getState().updateNextTrackOptionalParam(optionalParam);\n useTransitionInfoStore.getState().refresh('set next mix object info');\n }\n\n // return directly at useCurrentTrack\n getNextTrackOptionalParam(): IOptionalCurrentTrackInfo {\n return this.nextTrackOptionalParam;\n }\n\n private remixId: string = '';\n\n remixType: 'seed-variant' | 'mix-variant' | 'intelliskip' | 'skipping(no-trans)' | 'regenerate' | null = null;\n\n /**\n * update the current status of Controller - state that master bar ops in on-going, mark the expect incoming remixId\n * @param remixId\n * @param trackType\n */\n setIsRemixOnTheFly(remixId: string, trackType: 'seed-variant' | 'mix-variant' | 'intelliskip' | 'skipping(no-trans)' | 'regenerate' | null) {\n const event: IEventAEV3RemixOnTheFly = {\n type: 'aev3_state_changed_is_remix_on_the_fly',\n detail: { from: this.remixId, to: remixId, newRemixType: trackType },\n };\n this.remixId = remixId;\n this.remixType = trackType;\n\n this.dispatchEvent(AEV3Controller.REMIX_ON_THE_ROAD, event.detail);\n }\n setRemixIdJustPlayed(remixId: { type: 'intelliskip' | 'seed-variant' | 'mix-variant' | undefined; id: string }, stationId: string) {\n const originalRemixType = this.remixType;\n console.log(`setRemixIdJustPlayed ${JSON.stringify(remixId)}`);\n if (this.remixId === remixId.id) {\n const event: IEventAEV3RemixOnTheFly = {\n type: 'aev3_state_changed_is_remix_on_the_fly',\n detail: { from: this.remixId, to: '', newRemixType: null },\n };\n\n this.remixId = '';\n this.remixType = null;\n this.dispatchEvent(AEV3Controller.REMIX_ON_THE_ROAD, event.detail);\n\n consoleColorfulMessage4Lawful(\n `setRemixIdJustPlayed triggered correctly, reset remixId and fire event AEV3Controller.MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS`,\n '#4dc738ff',\n '#ffffff',\n 8,\n );\n consoleColorfulMessage4Lawful(`${JSON.stringify(this.barSequence1?.getChunkIndexOfCurrentSegmentPlaying())}`, '#4dc738ff', '#ffffff', 8);\n if (getRandomiseStemsAfterVarirantsStartPlaying()) {\n randomiseStemsPlaying();\n }\n } else {\n consoleColorfulMessage4Lawful(`setRemixIdJustPlayed triggered but there is already a value - current: ${this.remixId}, new: ${remixId}`, '#0000ff', '#ffffff', 8);\n }\n\n // fire the event no matter when above is called - trigger refresh of transition info\n this.dispatchEvent(AEV3Controller.MASTER_BAR_OPERATION_ASSIGNED_NEXT_MIX_SEGMENTS, {\n infoChanged: 'nil',\n enforceUpdate: true, // by constructing JS object\n });\n\n // should depreciate this\n const data = AEV3Controller.getInstance().getNextTrackOptionalParam();\n useNextMixStore.getState().updateLastestMixAppendedToMasterBar({ ...(data ?? { stationId: '', stationTrackId: '' }) }); // enforce update by constructing JS object\n\n if (!this.currentTrackOptionalParam) {\n console.error('currentTrackOptionalParam is null');\n // this.currentTrackOptionalParam = {stationId: '', stationTrackId: ''};\n throw Error('currentTrackOptionalParam is null');\n }\n\n switch (originalRemixType) {\n case 'seed-variant':\n this.setCurrentTrackOptionalParam({\n ...this.getCurrentTrackOptionalParam(),\n // stationId: stationId,\n // mixId: remixId,\n remixId: `to-depreciate ${remixId.id}`,\n isRemix: true,\n seedVariantSignature: remixId.id,\n });\n break;\n case 'mix-variant':\n this.setCurrentTrackOptionalParam({\n ...this.getCurrentTrackOptionalParam(),\n // stationId: stationId,\n // mixId: remixId,\n remixId: `to-depreciate ${remixId.id}`,\n isRemix: true,\n mixVariantSignature: remixId.id,\n });\n break;\n case 'intelliskip':\n case 'regenerate':\n // console.log(originalRemixType)\n // this.setCurrentTrackOptionalParam(\n // {...this.getNextTrackOptionalParam(),\n // stationId: stationId,\n // mixId: remixId,\n // remixId: '',\n // isRemix: false,\n // }\n // )\n // this.setNextTrackOptionalParam(null);\n break;\n case 'skipping(no-trans)':\n // wasn't in use before\n this.setCurrentTrackOptionalParam({\n ...this.getCurrentTrackOptionalParam(),\n // stationId: stationId,\n // mixId: remixId,\n remixId: `to-depreciate ${remixId.id}`,\n isRemix: false,\n });\n break;\n }\n\n // this one has to be careful among diff intelliskip related utils\n // it still best to resolve after master bar plays 0.5 bars inside of a segment\n // if (!this.getNextTrackOptionalParam()) {\n // this.assignNextMix();\n // }\n }\n\n // status ops\n\n setPlayMode(playMode: PlayModes, signature?: string) {\n // Mode change will trigger media session update\n this._log(`togglePlayMode (setPlayMode) ${signature}`, `current: ${this.playMode}, next: ${playMode}`);\n const before = this.playMode;\n this.playMode = playMode;\n const event: IEventAEV3PlayModeChanged = {\n type: 'aev3_playmode_changed',\n detail: { from: before, to: playMode },\n };\n this.dispatchEvent(AEV3Controller.PLAY_MODE_CHANGED, event.detail);\n\n // Update media session when mode changes\n this.updateMediaSessionForTrackChangeSimple();\n }\n\n getPlayMode() {\n return this.playMode;\n }\n\n setIsCreatingAudioContext(creating: boolean) {\n const before = this.isCreatingAudioContext;\n this.isCreatingAudioContext = creating;\n const event: IEventAEV3CreatingAudioContext = {\n type: 'aev3_creating_audio_context',\n detail: { from: before, to: creating },\n };\n this.dispatchEvent(AEV3Controller.CREATING_AUDIO_CONTEXT, event.detail);\n }\n\n setAudioContextStateChanged(newState: AudioContextState | null | 'interrupted') {\n const before = this.audioContextState;\n this.audioContextState = newState;\n const event: IEventAEV3AudioContextStateChanged = {\n type: 'aev3_audio_context_state_changed',\n detail: { from: before, to: newState },\n };\n this.dispatchEvent(AEV3Controller.AUDIO_CONTEXT_STATE_CHANGED, event.detail);\n }\n\n setIsBusy(isBusy: boolean, signature: string) {\n this._log(`AEV3 set isBusy: ${isBusy ? 'true' : false} [${signature}]`);\n const before = this.isBusy;\n this.isBusy = isBusy;\n const event: IEventAEV3IsBusy = {\n type: 'aev3_state_changed_is_busy',\n detail: { from: before, to: isBusy },\n };\n //this.dispatchEvent(AEV3Controller.STATE_CHANGE_IS_BUSY, {...event.detail, signature}); // for my debug\n this.dispatchEvent(AEV3Controller.STATE_CHANGE_IS_BUSY, event.detail);\n }\n\n getIsBusy(): boolean {\n return this.isBusy;\n }\n\n setPlaybackState(newState: AudioEnginePlaybackState) {\n const before = this.playbackState;\n this.playbackState = newState;\n const event: IEventAEV3PlaybackStateChanged = {\n type: 'aev3_state_changed_playback_state',\n detail: { from: before, to: newState },\n };\n this.dispatchEvent(AEV3Controller.PLAYBACK_STATE_CHANGED, event.detail);\n\n // Update media session when playback starts\n if (newState === AudioEnginePlaybackState.Playing) {\n // Update immediately\n this.updateMediaSessionForTrackChangeSimple(true); // Force update to refresh OS media controls\n\n // Also update after a short delay (essential for some browsers)\n setTimeout(() => {\n this.updateMediaSessionForTrackChangeSimple(true);\n }, 500);\n }\n }\n\n getPlaybackState(): AudioEnginePlaybackState {\n return this.playbackState;\n }\n\n // playmode ops\n\n createAudioSourceSequenceWithPreloadSampleLoc(\n // General\n trackData: ITrackForSequence,\n // hls\n preloadOnCreate: boolean,\n preloadStartAtSampleLoc: number,\n enableCacheController_depreciated: boolean,\n // Temp\n signature: string,\n diffETagDetected: boolean = false,\n ): Promise<AudioSourceSequence | false> {\n if (!trackData) return Promise.resolve(false);\n trackData = trackDataStemsSafeGuarding(trackData);\n // this._log(`createAudioSourceSequence:: ${signature}`);\n if (this.isAudioSourceSequenceInPreloadedQueued(trackData.trackId)) {\n // console.info(`%cAborted createAudioSourceSequence, ${trackData.trackId} was preloaded before. ${signature}`, 'color: black; background: magenta;');\n // this._log(this.preloadedAudioSource);\n return Promise.resolve(this.getAudioSourceSequenceInPreloadedQueued(trackData.trackId) ?? false);\n }\n // console.info(`%cCreating createAudioSourceSequence, ${trackData.trackId} ${signature}`, 'color: black; background: magenta;');\n const sequence = new AudioSourceSequence();\n\n // debugger;\n\n sequence.on(AudioSourceSequence.AUDIO_SOURCE_MANIFEST_PARSED_CREATED, (e: AudioSourceSequenceEventM3U8Created) => {\n const { trackId } = e.detail;\n // progressCallback();\n if (preloadOnCreate) {\n // CAUTION note this preloadStartAtBarIndex is in terms of barSequence, not actual AAC segment!!!\n const preloadStartAtIndex = sequence.getSegmentsIdxWithSampleLoc(0, preloadStartAtSampleLoc);\n const _index = preloadStartAtIndex < 0 ? 0 : preloadStartAtIndex;\n this._log(`${trackData.trackId} ${trackData.trackMixType} createAudioSourceSequenceWithPreloadSampleLoc... going to preload at ${_index}, ${preloadStartAtSampleLoc}`);\n sequence.preload(_index, true, 'createAudioSourceSequenceWithPreloadSampleLoc CB'); // MAYBE make this as current played time?\n }\n });\n\n sequence.on(AudioSourceSequence.AUDIO_SOURCE_MANIFEST_PARSED_FAILED, (e: AudioSourceSequenceEventM3U8Failed) => {\n const { trackId } = e.detail;\n console.error('autoplay - AudioSourceSequence.AUDIO_SOURCE_MANIFEST_PARSED_FAILED (2)', trackId);\n });\n\n sequence.on(AudioSourceSequence.LOADED_ALL_SEQUENCES_SEGMENTS_REQUESTED, (e: AudioSourceSequenceEventLoadAllSequencesWithIndexRangeProvided) => {\n // AudioSourceSequence.EVENT_LOGGER(e);\n if (e.detail.isPreloadCommand) {\n //\n }\n });\n\n // sequence.initialise(trackData, useQuantiseAAC ? 'hls': 'mp3_hls');\n\n this.preloadedAudioSource.push(sequence);\n return new Promise((resolve, reject) => {\n sequence\n .initialise(trackData, GRAPHQL_FIELDS_TO_USE_FOR_AUDIO, AEV3Config.getInstance().getAccessToken() ?? '', diffETagDetected)\n .then((success) => {\n if (!success) {\n // debugger;\n resolve(false);\n } else {\n resolve(sequence);\n }\n })\n .catch((err) => {\n // Reject the outer promise instead of throwing, so it can be caught by callers\n // console.error(err);\n reject(err);\n });\n // return sequence;\n });\n }\n\n createBarSequenceWithPreloadSampleLoc(\n trackData: ITrackForSequence,\n // hls\n preloadOnCreate: boolean,\n preloadStartAtSampleLocOfStartBarInsteadOfZero: boolean,\n enableCacheController: boolean,\n // bar\n startBar: number,\n endBar: number, // override by MAX duration, to be implement\n targetBarLength48000: number,\n ratioWhenComposingBar: RatioOfBarsAllowedBetweenSeedAndMix,\n targetKey: IMusicKey,\n targetTonality: IMusicTonality,\n expectedPitchShiftForDebugPurpose: number,\n\n // Finalised\n trackIndex: TrackIndexType,\n trackType: TrackLabelType,\n\n signature: string,\n\n preserveMixKey: PitchShiftStrategy = PitchShiftStrategy.DEFAULT,\n\n playQuantisedSpeedOnBarsByDefault: 'quantised' | 'seed' | 'mix',\n\n // delay Decoding - avoid spike of procedures\n delayTimeForDecoding: number = 0,\n // this should be pure sequence generation based on beats regardless of the Audio Source Sequence (MP4)\n avoidAnyLoadingActionSinceItIsPseudoBar: boolean = false,\n ) {\n if (!isValidRatioBetweenBarsOfSeedAndMix(ratioWhenComposingBar)) {\n throw Error('Unexpected error on generating bar, unexpected ratio submitted (code: 2501082125)');\n }\n\n trackData = trackDataStemsSafeGuarding(trackData);\n\n const preloadMP4AtSample = preloadStartAtSampleLocOfStartBarInsteadOfZero ? resolveSampleLocOfDownbeatFromBarIndex(trackData, startBar) : 0;\n\n // const expectedDurationPlayedAtDestination = (seedBarToPreload * seedBar.targetBarLength48000) / SAMPLE_RATE;\n // const speed = targetBarLength48000 / (trackData.tempoOrigSz / ratioWhenComposingBar);\n // this._log('speed of ', speed);\n\n // this._log(`${trackData.trackMixType} expect to start loading at sample: `, preloadMP4AtSample);\n\n if (this.isAudioSourceSequenceInPreloadedQueued(trackData.trackId)) {\n this.preloadedAudioSource.find((t) => t.trackData.trackId === trackData.trackId);\n } else {\n // only trigger this async function here since it doesn't bother to await it\n this.createAudioSourceSequenceWithPreloadSampleLoc(trackData, preloadOnCreate, preloadMP4AtSample - 1, true, `Create Bar Sequence:: ${signature}`)\n .then((e) => {\n if (!e) {\n // do not tend to do anything at this moment\n // just initialise the Sequence here\n consoleColorfulMessage4Lawful(`ERROR: createBarSequenceWithPreloadSampleLoc() ... failed to createAudioSource`);\n }\n })\n .catch((err: Error) => {\n // Catch promise rejections from initialise() to prevent uncaught promise errors\n // This can happen when isAudioFormatValid() throws an error for invalid MP4 format\n consoleColorfulMessage4Lawful(`ERROR: createBarSequenceWithPreloadSampleLoc() ... promise rejected: ${err.message}`);\n console.error('MP4 initialization error:', err);\n });\n }\n\n const bar = new BarSequence(this.getGlobalPlaybackRate());\n // const trackId: string = trackData.trackId;\n\n if (!avoidAnyLoadingActionSinceItIsPseudoBar) {\n bar.on(BarSequence.BAR_STARTS_PLAYING, (e: BarEventChunkDetails) => {\n // have some fun automix stems\n const { trackIndex, sequenceIdx, chunkIdx } = e.detail;\n if (trackIndex === 0 && chunkIdx % 2 == 0 && this.enableAutoMix) {\n const seedBarSeq = this.getBarSequenceWithType('seed1');\n const seg = seedBarSeq?.sequences?.[sequenceIdx]?.segments[chunkIdx];\n if (\n seg &&\n !seg.isTransitionalBar &&\n !seg.isFirstBarOfLiveEditSwap\n ) {\n if (Math.random() > 0.7) {\n aev3StemsMasterStateStore.getState().toggleStemSelection(sequenceIdx, 'normal-switch');\n }\n }\n }\n });\n\n // For benchmarking\n bar.on(BarSequence.BAR_PARTIALLY_PLAYED_ZERO_POINT_25, (e: BarEventChunkDetails) => {\n if (e.detail.trackIndex === 0 && e.detail.chunkIdx === 0 && e.detail.sequenceIdx === 0) {\n this.dispatchEvent(AEV3Controller.FIRST_BAR_STARTS_PLAYING_FOR_TEST, e?.detail || null);\n }\n });\n\n bar.on(BarSequence.BAR_PLAYED, (e: BarEventChunkDetails) => {\n // const AudioSourceSequence = bar.getAudioSourceSequence();\n // this._log('%cA buffer has finished playing, TBACS/Intelliskip/InfiniteFix event to be fired', 'color: blue', composeTBACSEvent(e.detail, this.djAction));\n const trackMixType = this.getBarSequenceIdWithTrackIndex(e.detail.trackIndex) === 'seed1' ? 'seed' : ('mix' as const);\n const event: TBACSEvent | null = composeTBACSEvent(e.detail, this.djAction, this.getCurrentTrackOptionalParam()?.stationTrackId, trackMixType);\n this.dispatchEvent(AEV3Controller.TBACS_BAR_PLAYED_RECORD, event?.detail || null);\n\n // no longer required\n // AudioSourceSequence.updateSampleLocJustPlayed(e.detail.sequenceIdx, e.detail.originalBar.sampleEnd, 'bar finished playing'); // MAYBE make this as current played time\n });\n\n bar.on(BarSequence.BAR_PARTIALLY_PLAYED_ZERO_POINT_25, (e: BarEventChunkDetails) => {\n // this._log('%cA buffer has finished playing 1/2 of it, time to setup AI Switching, Stem-Switching event to be fired', 'color: magenta', composeTBACSEvent(e.detail));\n if (e.detail.sequenceIdx === 0) {\n if (this.getBarSequenceIdWithTrackIndex(e.detail.trackIndex) === 'seed1') {\n this.assignNextMix();\n }\n }\n });\n\n bar.on(BarSequence.NEXT_BAR_AUDIO_DATA_NOT_READY_DURING_PLAYBACK, (e: BarEventChunkDetails) => {\n console.log(\n `%c****************************************************\\n* pause playback ${((this.aev3Context?.audioContext?.currentTime || 0) / 60).toFixed(2)}`,\n 'color: magenta; background: black;',\n e,\n );\n // this._log(this.barSequence1);\n // this._log(this.barSequence2);\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_PLAY_ERROR_1, {});\n\n consoleColorfulMessage(`seed: ${this.barSequence1?.trackData?.trackId}, mix: ${this.barSequence2?.trackData?.trackId}`);\n consoleColorfulMessage(`${JSON.stringify(e)}`);\n\n /*\n{\n \"type\": \"One-of-the-next-bar-chunk-is-not-ready-when-needed\",\n \"detail\":\n {\n \"chunkIdx\": 8,\n \"chunkId\": \"02eaa55a-c33c-4c4d-8104-c43df4b09a88_bass_bar_57\",\n \"trackIndex\": 1,\n \"timeStampMS\": 34307,\n \"originalBar\": null,\n \"trackId\": \"02eaa55a-c33c-4c4d-8104-c43df4b09a88\",\n \"contextTime\": 30.68\n }\n}\n*/\n\n console.log(`the next bar chunk's info: ...`);\n const { chunkIdx, originalBar, sequenceIdx } = e.detail;\n const nextChunkIdx = chunkIdx + 1;\n if (originalBar) {\n const _mp4 = this.getAudioSourceSequenceInPreloadedQueued(originalBar?.trackId);\n if (!_mp4) return;\n const [sequence, segments] = _mp4.getSegmentInfo(sequenceIdx, originalBar.sampleStart, originalBar.sampleEnd);\n segments.forEach((s) => {\n console.log(`trackId: sample: ${s.byteSampleSegment.sampleStart} - ${s.byteSampleSegment.sampleEnd}`);\n console.log(s.cached.cacheStartTime);\n console.log(s.cached.cacheTimeMS);\n console.log(s.cached.isDownloading);\n console.log(s.cached.firstError);\n });\n }\n\n consoleColorfulMessage(`seed: ${this.barSequence1?.trackData?.trackId}, mix: ${this.barSequence2?.trackData?.trackId}`);\n const seedBar = this.getBarSequenceWithType('seed1');\n this.pauseOnIOS(seedBar?.sourceJustPlayed?.[0]?.chunkIdx || 0, true);\n });\n\n bar.on(BarSequence.PLAYBACK_ERROR_FROM_BAR_SEQUENCE_INVALID_SAMPLE_RANGE, (e: BarEventChunkDetails) => {\n this._log('%c****************************************************\\n* pause playback - seeking for invalid sample range', 'color: magenta; background: black;', e);\n // this._log(this.barSequence1);\n // this._log(this.barSequence2);\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_PLAY_ERROR_SAMPLE_OUT_OF_RANGE, {});\n consoleColorfulMessage(`${JSON.stringify(e)}`);\n consoleColorfulMessage(`seed: ${this.barSequence1?.trackData?.trackId}, mix: ${this.barSequence2?.trackData?.trackId}`);\n this.pauseOnIOS(0, true);\n });\n\n bar.on(BarSequence.FATAL_PLAYBACK_ERROR_MP4_AND_STOP_DECODING_ITERATION, (e: BarEventChunkDetails) => {\n console.log('%c****************************************************\\n* Decoding Iteration stopped - fatal error', 'color: magenta; background: black;', e);\n // this._log(this.barSequence1);\n // this._log(this.barSequence2);\n this.dispatchEvent(AEV3Controller.BAR_SEQUENCE_PLAY_FATAL_ERROR_BAD_MP4, {});\n consoleColorfulMessage(`${JSON.stringify(e)}`);\n consoleColorfulMessage(`seed: ${this.barSequence1?.trackData?.trackId}, mix: ${this.barSequence2?.trackData?.trackId}`);\n if (bar.triggeredPlay) {\n console.log(`%cfatal playback error result from corrupted audio file: ${bar?.trackData?.trackId} [${bar?.trackData?.name}]`, 'color: yellowgreen');\n console.log(`%cplayback should stop and prevent resume option`, 'color: yellowgreen');\n this.pauseOnIOS(0, true);\n } else {\n console.log(`%cfatal playback error result from corrupted audio file: ${bar?.trackData?.trackId} [${bar?.trackData?.name}]`, 'color: yellowgreen');\n console.log(`%cplayback wasn't start yet should be at init stage`, 'color: yellowgreen');\n }\n });\n\n bar.on(BarSequence.LAST_BAR_ALMOST_FINISHED_PLAYING, (e: BarEventChunkDetails) => {\n if (this.getBarSequenceIdWithTrackIndex(e.detail.trackIndex) === 'seed1') {\n this._log('%c****************************************************\\n* TODO: last bar of SeedTrack played, play next', 'color: magenta; background: black;', e);\n\n // if next track already preloaded\n } else if (this.getBarSequenceIdWithTrackIndex(e.detail.trackIndex) === 'mix1') {\n this._log(\n '%c****************************************************\\n* TODO: last bar of MixTrack played, should consider sub procedure paused',\n 'color: magenta; background: black;',\n e,\n );\n }\n });\n }\n\n bar.createSequence(\n trackData,\n avoidAnyLoadingActionSinceItIsPseudoBar ? undefined : trackIndex, // put in undefined if this is meant for chunk concataneation\n startBar,\n endBar,\n targetBarLength48000,\n ratioWhenComposingBar,\n targetKey,\n targetTonality,\n expectedPitchShiftForDebugPurpose,\n preserveMixKey,\n playQuantisedSpeedOnBarsByDefault,\n );\n\n // this.setBarWithType(bar, trackType, trackIndex);\n if (!avoidAnyLoadingActionSinceItIsPseudoBar) {\n bar.setAudioSourceSequence(trackIndex); // only use if preload not started\n }\n\n this.barCreated.push(bar);\n\n if (!avoidAnyLoadingActionSinceItIsPseudoBar) {\n // setTimeout(()=>{\n bar.startDecoding('from aev3controller createBarSequence');\n bar.startEvicting('from aev3controller createBarSequence');\n // }, delayTimeForDecoding);\n } else {\n // debugger;\n }\n return bar;\n }\n\n composeMixTheDuoTracksWithBarDestination(\n seedTrack: ITrackForSequence,\n mixTrack: ITrackForSequence,\n enableCacheController: boolean,\n seedTrackStartBarIndex: number,\n seedTrackEndBarIndex: number,\n mixTrackStartBarIndex: number,\n mixTrackEndBarIndex: number,\n signature: string,\n pitchShiftStrategy: PitchShiftStrategy,\n alignMixTrackFrom: 'align-mix-segment-from-first-item' | 'align-mix-segment-from-last-item' = 'align-mix-segment-from-first-item',\n mixTrackStartBarIndexIfItNeedsToLoop: number,\n playQuantisedSpeedOnBarsByDefault: 'quantised' | 'seed' | 'mix',\n dropSeedMixLoadingActionSinceThisIsPseudoBar: boolean = false,\n matchMixTracksDuration: boolean = false,\n ): { seedBar: BarSequence; mixBar: BarSequence } {\n seedTrack = trackDataStemsSafeGuarding(seedTrack);\n mixTrack = trackDataStemsSafeGuarding(mixTrack);\n\n const preloadOnCreate = false;\n const preloadStartAtSampleLocOfStartBarInsteadOfZero = true;\n\n const bpmInfo = getTargetTempoOrigSzAndBpmRatio(seedTrack, mixTrack);\n const targetTempoSize = bpmInfo.seedTrackTargetBarLength48000; // note seedTrackTargetBarLength48000 also same as mixTrackTargetBarLength48000 returned from above utils\n try {\n const seedBar = this.createBarSequenceWithPreloadSampleLoc(\n seedTrack,\n // hls\n preloadOnCreate,\n preloadStartAtSampleLocOfStartBarInsteadOfZero,\n enableCacheController,\n // bar\n seedTrackStartBarIndex,\n seedTrackEndBarIndex,\n targetTempoSize,\n 1, // ratioWhenComposingBar\n seedTrack.key,\n seedTrack.tonality,\n 0, // expectedPitchShiftForDebugPurpose: no longer provided\n 0, // trackIndex to use, hardcoded\n 'seed1',\n Math.random().toFixed(4),\n pitchShiftStrategy,\n playQuantisedSpeedOnBarsByDefault,\n 300,\n dropSeedMixLoadingActionSinceThisIsPseudoBar,\n );\n\n const mixBar = this.createBarSequenceWithPreloadSampleLoc(\n mixTrack,\n // hls\n preloadOnCreate,\n preloadStartAtSampleLocOfStartBarInsteadOfZero,\n enableCacheController,\n // bar\n mixTrackStartBarIndex,\n mixTrackEndBarIndex,\n targetTempoSize,\n bpmInfo.ratioWhenComposingBar, // ratioWhenComposingBar\n seedTrack.key,\n seedTrack.tonality,\n 0, // expectedPitchShiftForDebugPurpose: no longer provided\n 1, // trackIndex to use, hardcoded\n 'mix1',\n Math.random().toFixed(4),\n pitchShiftStrategy,\n playQuantisedSpeedOnBarsByDefault,\n 700,\n dropSeedMixLoadingActionSinceThisIsPseudoBar,\n );\n\n // eq to above mixBar but starting from another index, this is required when aligning S2/M2 exit from transition zone on normal mode\n const mixBarForLoopingOnNormalMode = this.createBarSequenceWithPreloadSampleLoc(\n mixTrack,\n // hls\n preloadOnCreate,\n preloadStartAtSampleLocOfStartBarInsteadOfZero,\n enableCacheController,\n // bar\n mixTrackStartBarIndexIfItNeedsToLoop,\n mixTrackEndBarIndex,\n bpmInfo.mixTrackTargetBarLength48000,\n bpmInfo.ratioWhenComposingBar, // ratioWhenComposingBar\n seedTrack.key,\n seedTrack.tonality,\n 0, // expectedPitchShiftForDebugPurpose: no longer provided\n 1, // trackIndex to use, hardcoded\n 'mix1',\n Math.random().toFixed(4),\n pitchShiftStrategy,\n playQuantisedSpeedOnBarsByDefault,\n 700,\n true,\n );\n\n // Caution: following procedure had the bpm ratio taken care of\n\n // Align the length of Bars between Seed/Mix\n if (!matchMixTracksDuration) {\n // consoleColorfulMessage4Lawful(`[matchMixTracksDuration: ${matchMixTracksDuration}] Before: alignBarCountsOfComposedSeedMix ${seedBar.sequences[0].segments.length}, ${mixBar.sequences[0].segments.length}`);\n alignBarCountsOfComposedSeedMix(\n seedBar as BarSequenceWithAlignSequences,\n mixBar as BarSequenceWithAlignSequences,\n mixBarForLoopingOnNormalMode as BarSequenceWithAlignSequences,\n alignMixTrackFrom,\n );\n // consoleColorfulMessage4Lawful(`[matchMixTracksDuration: ${matchMixTracksDuration}] After: alignBarCountsOfComposedSeedMix ${seedBar.sequences[0].segments.length}, ${mixBar.sequences[0].segments.length}`);\n } else {\n // consoleColorfulMessage4Lawful(`[matchMixTracksDuration: ${matchMixTracksDuration}] Before: alignBarCountsOfComposedSeedMix_MakeSureMixTrackFullyCovered ${seedBar.sequences[0].segments.length}, ${mixBar.sequences[0].segments.length}`);\n // for use in seed variants\n // eq to above mixBar but starting from another index, this is required when aligning S2/M2 exit from transition zone on normal mode\n const seedBarForLoopingOnNormalMode = this.createBarSequenceWithPreloadSampleLoc(\n seedTrack,\n // hls\n preloadOnCreate,\n preloadStartAtSampleLocOfStartBarInsteadOfZero,\n enableCacheController,\n // bar\n seedTrackStartBarIndex,\n seedTrackEndBarIndex,\n targetTempoSize,\n 1, // ratioWhenComposingBar\n seedTrack.key,\n seedTrack.tonality,\n 0, // expectedPitchShiftForDebugPurpose: no longer provided\n 0, // trackIndex to use, hardcoded\n 'seed1',\n Math.random().toFixed(4),\n pitchShiftStrategy,\n playQuantisedSpeedOnBarsByDefault,\n 300,\n true,\n );\n alignBarCountsOfComposedSeedMix_MakeSureMixTrackFullyCovered(\n seedBar as BarSequenceWithAlignSequences,\n mixBar as BarSequenceWithAlignSequences,\n seedBarForLoopingOnNormalMode as BarSequenceWithAlignSequences,\n 'align-seed-segment-from-first-item',\n );\n // consoleColorfulMessage4Lawful(`[matchMixTracksDuration: ${matchMixTracksDuration}] After: alignBarCountsOfComposedSeedMix_MakeSureMixTrackFullyCovered ${seedBar.sequences[0].segments.length}, ${mixBar.sequences[0].segments.length}`);\n }\n\n // Apply alignment based on configuration\n // if (USE_NATURAL_TEMPO_MIXING_EXPORTED) {\n // Natural tempo mixing: seed=natural, mix=adaptive per bar\n // alignMixToNaturalSeedTempo(seedBar, mixBar);\n // Camus note: Above function should be combined with alignSpeedOfMixToUnquantisedSeedOfComposedSeedMix\n // } else {\n // Original quantized mixing: both tracks normalized to common tempo\n // (Original speedRatio_SeedMixMatching already set during bar sequence creation)\n // }\n\n // Always apply the classic mode alignment for backwards compatibility\n alignSpeedOfMixToUnquantisedSeedOfComposedSeedMix(seedBar as BarSequenceWithAlignSequences, mixBar as BarSequenceWithAlignSequences);\n alignSpeedOfSeedToUnquantisedMixOfComposedSeedMix(seedBar as BarSequenceWithAlignSequences, mixBar as BarSequenceWithAlignSequences);\n\n // avoid double decoding and callback from decode\n // mixBarForLoopingOnNormalMode.destroy(false);\n\n return { seedBar, mixBar };\n } catch (err) {\n console.error(err);\n this._log(seedTrack, mixTrack);\n throw err;\n }\n }\n\n applicationStart() {\n // console.table({\n // 'applicationStart': true,\n // isSettingAudioContext: this.isSettingAudioContext,\n // 'alias': this.getAudioContextAlias()\n // })\n if (this.isSettingAudioContext) return;\n if (this.getAudioContextAlias()) return;\n\n this.isSettingAudioContext = true;\n\n const audioContext: AudioContext = InitAndCreateNewAudioContext();\n AEV3Controller.getInstance().setAudioContextAlias(audioContext);\n audioContext.suspend();\n\n this.initAudioContextMain(audioContext, true)\n .then(async (e) => {\n this.isSettingAudioContext = false;\n return;\n })\n .catch((err) => {})\n .finally(() => {\n // this.setIsBusy(false);\n });\n }\n\n async playMixWithNewContext(\n seedTrack: ITrackForSequence,\n mixTrack: ITrackForSequence,\n stemProfile: StemProfileString,\n volumeProfile: number[],\n suspendTheAudioContext: boolean,\n enableTracks: 'seed' | 'mix' | 'both',\n modeToUse: PlayModes, // resolve the quantlise origin/base\n segmentStartBarOfSeed: number,\n segmentEndBarOfSeed: number,\n segmentStartBarOfMix: number,\n segmentEndBarOfMix: number,\n startAtSeedSampleLoc: number | -1, // if feeding -1, start on firstChunkIdx on this sequence\n signature: string,\n ) {\n // kill the next mix reasolver\n this.abortAssignNextMixResolution();\n \n const playQuantisedSpeedOnBarsByDefault: 'quantised' | 'seed' | 'mix' = getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode(modeToUse);\n\n this.setPlayMixAsQuantised(getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode(modeToUse));\n this.setPlayMode(modeToUse, 'playMixWithNewContext');\n this.setIsRemixOnTheFly('', null);\n\n this._log(`playMixWithNewContext ${modeToUse}`, seedTrack, mixTrack);\n\n seedTrack = trackDataStemsSafeGuarding(seedTrack);\n mixTrack = trackDataStemsSafeGuarding(mixTrack);\n this.djAction = getDefaultDJAction(seedTrack.trackId);\n\n // note this only affects the starting point of the Bar Sequence composed\n // const startBarOfSeed = 0;\n // const endBarOfSeed = 9999;\n // const startBarOfMix = 0;\n // const endBarOfMix = 9999;\n\n // this create the mp4 sequences but not await for it\n const { seedBar, mixBar } = this.composeMixTheDuoTracksWithBarDestination(\n seedTrack,\n mixTrack,\n true,\n segmentStartBarOfSeed,\n segmentEndBarOfSeed,\n segmentStartBarOfMix,\n segmentEndBarOfMix,\n signature,\n PitchShiftStrategy.DEFAULT,\n 'align-mix-segment-from-first-item',\n segmentStartBarOfMix,\n playQuantisedSpeedOnBarsByDefault,\n );\n\n // console.log('setting up bars')\n this.setBarWithType(seedBar, 'seed1', 0);\n this.setBarWithType(mixBar, 'mix1', 1);\n\n const audioControl = document.getElementById('audio-control') as HTMLAudioElement | null;\n const liveStream = document.getElementById('stream-output') as HTMLAudioElement | null;\n audioControl?.pause();\n if (USE_AUDIO_STREAM_DESTINATION) {\n liveStream?.pause();\n }\n\n if (this.aev3Context?.audioContext) {\n //\n this.aev3Context.audioContext.close();\n (this.aev3Context as unknown as { audioContext: AudioContext | null }).audioContext = null;\n this.audioContextState = null;\n }\n\n const audioContext: AudioContext = InitAndCreateNewAudioContext();\n AEV3Controller.getInstance().setAudioContextAlias(audioContext);\n this._log(TIMER_LOG_AUDIO_CONTEXT.PRINT_BASIC_LATENCY, TIMER_LOG_AUDIO_CONTEXT.LEVEL_ALERT, `${audioContext.baseLatency}/${audioContext.outputLatency}}`);\n if (suspendTheAudioContext) {\n audioContext.suspend();\n }\n\n // resolve this if there are already audio context\n // init audio context and suspend it\n\n this.setPlaybackState(AudioEnginePlaybackState.Stopped);\n this.setIsBusy(true, `context: ${suspendTheAudioContext ? 'playMixWithNewContextButPaused' : 'playMixWithNewContext'}`);\n\n return this.initAudioContextMain(audioContext, suspendTheAudioContext).then(async (e) => {\n setupMediaSessionModeAware(seedTrack, mixTrack, modeToUse);\n seedStemsToEnableWhenPlaybackStarts(stemProfile);\n trackVolumeToEnableWhenPlaybackStarts(enableTracks);\n seedStemsVolumeToEnableWhenPlaybackStarts(stemProfile, volumeProfile);\n mixStemsVolumeToEnableWhenPlaybackStarts(stemProfile, volumeProfile);\n\n if (suspendTheAudioContext) {\n this.setIsBusy(false, 'context: playMixWithNewContextButPaused AC initialised');\n this._log('suspended');\n return;\n }\n\n // if not Suspend\n this._time(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START);\n // return;\n // this startingBarIndex refer to the first element of the segemnts, bare in mind the Bar Queue created does not cover the area before startBarOfSeed\n const startingChunkIdx =\n (startAtSeedSampleLoc === -1 ? 0 : findFirstChunkIdxWithSample(seedBar, startAtSeedSampleLoc)) ?? 0;\n console.log('%cseekTo: startingChunkIdx -- this is chunkIdx index instead of Bar Index', 'color: red;', startingChunkIdx);\n const chunksDecodedBeforePlaying = 2;\n\n let bothBarsReadyWithinRequiredTime;\n const tolerance = 8;\n try {\n // const cacheStartTime = Date.now();\n bothBarsReadyWithinRequiredTime = await triggerDecodeBothBarSequencesBeforeStart(seedBar, mixBar, startingChunkIdx, startingChunkIdx + chunksDecodedBeforePlaying - 1, tolerance);\n } catch (err) {\n this.setIsBusy(false, 'context: playMixWithNewContext failed');\n audioContext?.suspend();\n // console.log(err);\n const errStr = unknownThrownToString(err);\n if (errStr.includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n throw new Error(`${errStr.split(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)[1]}`);\n } else {\n throw Error(`playMixWithNewContext - the two bars failed to load within ${tolerance * 1000}ms ... `, { cause: errStr });\n }\n }\n\n if (!bothBarsReadyWithinRequiredTime) {\n this.setIsBusy(false, 'context: playMixWithNewContext failed');\n audioContext?.suspend();\n throw Error(`playMixWithNewContext - the two bars failed to load within ${tolerance * 1000}ms ... `);\n }\n\n // note there is a preload callback as well\n\n this._timeLog(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n this._timeEnd(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START);\n const delay = SILENT_BUFFER_SAMPLE_SIZE / SAMPLE_RATE + 0.05;\n const startTime = this.aev3Context.audioContext.currentTime + delay;\n\n this._log(`${TIMER_LOG_AUDIO_CONTEXT.STARTS_PLAYBACK_IN} ${(delay * 1000).toFixed(2)}ms`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n\n seedBar.schedulePlay(this.aev3Context, startingChunkIdx, startTime);\n mixBar.schedulePlay(this.aev3Context, startingChunkIdx, startTime);\n\n this.setPlaybackState(AudioEnginePlaybackState.Playing);\n\n setTimeout(() => {\n this.setIsBusy(false, 'context: playMixWithNewContext AC initialised');\n }, delay * 1000);\n });\n }\n\n // note this function not responsible for the media destination\n async playMixWithCurrentContext(\n seedTrack: ITrackForSequence,\n mixTrack: ITrackForSequence,\n stemProfile: StemProfileString,\n volumeProfile: number[],\n enableTracks: 'seed' | 'mix' | 'both',\n modeToUse: PlayModes, // resolve the quantlise origin/base\n segmentStartBarOfSeed: number,\n segmentEndBarOfSeed: number,\n segmentStartBarOfMix: number,\n segmentEndBarOfMix: number,\n startAtSeedSampleLoc: number | -1, // if feeding -1, start on firstChunkIdx on this sequence\n triggerReassignNextMix: boolean,\n signature: string,\n ) {\n // kill the next mix reasolver\n this.abortAssignNextMixResolution();\n\n const playQuantisedSpeedOnBarsByDefault: 'quantised' | 'seed' | 'mix' = getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode(modeToUse);\n\n this.setPlayMixAsQuantised(getDefaultPlayQuantisedSpeedOnBarsBasedOnPlaymode(modeToUse));\n this.setPlayMode(modeToUse, 'playMixWithCurrentContext');\n this.setIsRemixOnTheFly('', null);\n\n this._log(`playMixWithCurrentContext ${modeToUse}`, seedTrack, mixTrack);\n\n seedTrack = trackDataStemsSafeGuarding(seedTrack);\n mixTrack = trackDataStemsSafeGuarding(mixTrack);\n this.djAction = getDefaultDJAction(seedTrack.trackId);\n\n // note this only affects the starting point of the Bar Sequence composed\n // const startBarOfSeed = 0;\n // const endBarOfSeed = 9999;\n // const startBarOfMix = 0;\n // const endBarOfMix = 9999;\n const { seedBar, mixBar } = this.composeMixTheDuoTracksWithBarDestination(\n seedTrack,\n mixTrack,\n true,\n segmentStartBarOfSeed,\n segmentEndBarOfSeed,\n segmentStartBarOfMix,\n segmentEndBarOfMix,\n signature,\n PitchShiftStrategy.DEFAULT,\n 'align-mix-segment-from-first-item',\n segmentStartBarOfMix,\n playQuantisedSpeedOnBarsByDefault,\n );\n\n // console.log('setting up bars')\n this.setBarWithType(seedBar, 'seed1', 0);\n this.setBarWithType(mixBar, 'mix1', 1);\n\n const audioContext: AudioContext = this.getAudioContextAlias();\n\n this._log(TIMER_LOG_AUDIO_CONTEXT.PRINT_BASIC_LATENCY, TIMER_LOG_AUDIO_CONTEXT.LEVEL_ALERT, `${audioContext.baseLatency}/${audioContext.outputLatency}}`);\n\n // resolve this if there are already audio context\n // init audio context and suspend it\n\n this.setPlaybackState(AudioEnginePlaybackState.Playing);\n this.setIsBusy(true, 'context: playMixWithCurrentContext');\n\n seedStemsToEnableWhenPlaybackStarts(stemProfile);\n trackVolumeToEnableWhenPlaybackStarts(enableTracks);\n seedStemsVolumeToEnableWhenPlaybackStarts(stemProfile, volumeProfile);\n mixStemsVolumeToEnableWhenPlaybackStarts(stemProfile, volumeProfile);\n if (audioContext.state === 'running') {\n return new Promise<void>(async (resolve, reject) => {\n try {\n // hard code this error for testing:\n /*\n this.setPlaybackState(AudioEnginePlaybackState.Stopped);\n this.setIsBusy(false, 'context: playMixWithCurrentContext failed');\n audioContext?.suspend();\n throw new Error(`playMixWithCurrentContext - the two bars failed to load within ${2*1000}ms (ac = running ...`, {cause: err.toString()});\n */\n\n this._time(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START);\n // this startingBarIndex refer to the first element of the segemnts, bare in mind the Bar Queue created does not cover the area before startBarOfSeed\n const startingChunkIdx =\n (startAtSeedSampleLoc === -1 ? 0 : findFirstChunkIdxWithSample(seedBar, startAtSeedSampleLoc)) ?? 0;\n\n console.log('%cseekTo: startingChunkIdx -- this is chunkIdx index instead of Bar Index', 'color: red;', startingChunkIdx);\n\n const chunksDecodedBeforePlaying = 2;\n let bothBarsReadyWithinRequiredTime;\n const tolerance = 8;\n try {\n // const cacheStartTime = Date.now();\n bothBarsReadyWithinRequiredTime = await triggerDecodeBothBarSequencesBeforeStart(\n seedBar,\n mixBar,\n startingChunkIdx,\n startingChunkIdx + chunksDecodedBeforePlaying - 1,\n tolerance,\n );\n } catch (err) {\n this.setPlaybackState(AudioEnginePlaybackState.Stopped);\n this.setIsBusy(false, 'context: playMixWithCurrentContext failed');\n audioContext?.suspend();\n // console.log(err);\n const errStrAcRunning = unknownThrownToString(err);\n if (errStrAcRunning.includes(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)) {\n reject(new Error(`${errStrAcRunning.split(GET_AUDIO_BUFFER_MESSAGE_MOOF_BOX_ERROR)[1]}`));\n } else {\n reject(new Error(`playMixWithCurrentContext - the two bars failed to load within ${tolerance * 1000}ms (ac = running) ... `, { cause: errStrAcRunning }));\n }\n return;\n }\n\n if (!bothBarsReadyWithinRequiredTime) {\n this.setPlaybackState(AudioEnginePlaybackState.Stopped);\n this.setIsBusy(false, 'context: playMixWithCurrentContext failed');\n audioContext?.suspend();\n reject(new Error(`playMixWithCurrentContext - the two bars failed to load within ${tolerance * 1000}ms (ac = running) ...`));\n return;\n }\n\n // note there is a preload callback as well\n\n this._timeLog(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n this._timeEnd(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START);\n const delay = SILENT_BUFFER_SAMPLE_SIZE / SAMPLE_RATE + 0.05;\n const startTime = this.aev3Context.audioContext.currentTime + delay;\n\n this._log(`${TIMER_LOG_AUDIO_CONTEXT.STARTS_PLAYBACK_IN} ${(delay * 1000).toFixed(2)}ms`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n seedBar.schedulePlay(this.aev3Context, startingChunkIdx, startTime);\n mixBar.schedulePlay(this.aev3Context, startingChunkIdx, startTime);\n\n setTimeout(() => {\n this.setIsBusy(false, 'context: playMixWithCurrentContext AC initialised');\n }, delay * 1000);\n this.setPlaybackState(AudioEnginePlaybackState.Playing);\n resolve();\n\n // setTimeout(()=>{this.setIsBusy(false, 'context: playMixWithCurrentContext AC initialised')}, delay*1000);\n } catch (err) {\n reject(err);\n }\n });\n } else {\n return audioContext.resume().then(async (e) => {\n this._time(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START);\n // this startingBarIndex refer to the first element of the segemnts, bare in mind the Bar Queue created does not cover the area before startBarOfSeed\n const startingChunkIdx =\n (startAtSeedSampleLoc === -1 ? 0 : findFirstChunkIdxWithSample(seedBar, startAtSeedSampleLoc)) ?? 0;\n\n console.log('%cseekTo: startingChunkIdx -- this is chunkIdx index instead of Bar Index', 'color: red;', startingChunkIdx);\n\n const chunksDecodedBeforePlaying = 2;\n\n let bothBarsReadyWithinRequiredTime;\n const tolerance = 8;\n try {\n // const cacheStartTime = Date.now();\n // console.log('playMixWithCurrentContext - triggerDecodeBothBarSequencesBeforeStart')\n bothBarsReadyWithinRequiredTime = await triggerDecodeBothBarSequencesBeforeStart(seedBar, mixBar, startingChunkIdx, startingChunkIdx + chunksDecodedBeforePlaying - 1, tolerance);\n } catch (err) {\n this.setPlaybackState(AudioEnginePlaybackState.Stopped);\n this.setIsBusy(false, 'context: playMixWithCurrentContext failed');\n audioContext?.suspend();\n console.log(err);\n throw Error(`playMixWithCurrentContext - the two bars failed to load within ${tolerance * 1000}ms (ac != running ... ${unknownThrownToString(err)})`);\n }\n\n if (!bothBarsReadyWithinRequiredTime) {\n this.setPlaybackState(AudioEnginePlaybackState.Stopped);\n this.setIsBusy(false, 'context: playMixWithCurrentContext failed(2)');\n audioContext?.suspend();\n throw Error(`playMixWithCurrentContext - the two bars failed to load within ${tolerance * 1000}ms (ac != running ...`);\n }\n\n // note there is a preload callback as well\n\n this._timeLog(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n this._timeEnd(TIMER_LOG_AUDIO_CONTEXT.PRELOADING_ENOUGH_CHUNKS_BEFORE_START);\n const delay = SILENT_BUFFER_SAMPLE_SIZE / SAMPLE_RATE + 0.05;\n const startTime = this.aev3Context.audioContext.currentTime + delay;\n\n // debugger;\n this._log(`${TIMER_LOG_AUDIO_CONTEXT.STARTS_PLAYBACK_IN} ${(delay * 1000).toFixed(2)}ms`, TIMER_LOG_AUDIO_CONTEXT.LEVEL_0);\n seedBar.schedulePlay(this.aev3Context, startingChunkIdx, startTime);\n mixBar.schedulePlay(this.aev3Context, startingChunkIdx, startTime);\n\n this.setPlaybackState(AudioEnginePlaybackState.Playing);\n\n setTimeout(() => {\n this.setIsBusy(false, 'context: playMixWithCurrentContext AC already up and running');\n }, delay * 1000);\n });\n }\n }\n\n private assignNextMixInAction = false;\n\n /** Aborts in-flight `getNextMixUtils` / station fetch when a new resolve starts or when calling `abortAssignNextMixResolution`. */\n private assignNextMixAbortController: AbortController | null = null;\n\n abortAssignNextMixResolution(): void {\n console.log('abortAssignNextMixResolution....');\n this.assignNextMixAbortController?.abort();\n }\n\n async assignNextMix(): Promise<AssignNextMixOutcome> {\n if (this.assignNextMixInAction === true) {\n console.log(`this.assignNextMixInAction`, this.assignNextMixInAction);\n this._log('autoplay assignNextMixInAction = true so skipping');\n return { status: 'skipped', reason: 'busy' };\n }\n\n if (this.remixType !== null) {\n console.log(`this.drop assign next mix [${this.remixType}]`, this.remixId);\n return { status: 'skipped', reason: 'remix' };\n }\n\n if (this.cleanupMemoryInAction) {\n console.log(`this.drop assign next mix [cleanupMemoryInAction]`, this.remixId);\n return { status: 'skipped', reason: 'cleanup' };\n }\n\n try {\n const token = AEV3Config.getInstance().getAccessToken();\n if (token === undefined || token === null) {\n this._log(`autoplay no token, so skip`);\n console.log(`autoplay no token, so skip`);\n return { status: 'skipped', reason: 'no_token' };\n }\n // this._log('autoplay', this.getCurrentTrackOptionalParam())\n // if (this.getCurrentTrackOptionalParam()?.[AUTOPLAY_NEXT_MIX_DIRECTION] === '' || this.getCurrentTrackOptionalParam()?.[AUTOPLAY_NEXT_MIX_DIRECTION] === undefined) {\n // debugger;\n // }\n\n // if (!mixObject || (mixObject && (!mixObject.prevMixId || !mixObject.nextStationTrackId) )) {\n // throw Error ('mixObject does not contain valid nextStationTrackId or prevMixId' + JSON.stringify(mixObject));\n // }\n\n const mixObject: IOptionalCurrentTrackInfo = this.getCurrentTrackOptionalParam();\n const currentSeedTrackId = this.getCurrentSeedTrackObject()?.trackId ?? '';\n const currentMixTrack = this.getCurrentMixTrackObject();\n const currentMixTrackId = currentMixTrack?.trackId ?? '';\n\n if (this.getNextTrackOptionalParam()?.stationId && this.getNextTrackOptionalParam()?.stationTrackId) {\n return { status: 'skipped', reason: 'already_has_next' };\n }\n\n this.assignNextMixAbortController?.abort();\n const assignNextMixAbortController = new AbortController();\n this.assignNextMixAbortController = assignNextMixAbortController;\n\n this.assignNextMixInAction = true;\n\n console.log(`%cπ getNextMixUtils() ${JSON.stringify({ ...mixObject, currentSeedTrackId, currentMixTrackId })}`, 'color: turquoise; background: black;');\n\n const getNextMixUtils = AEV3Config.getInstance().getNextTracksResolver();\n\n if (!getNextMixUtils) {\n throw Error('Next Mix resolver is not assigned, please assign a callback for AEV3 to get next 2tracks');\n }\n\n if (!currentMixTrack) {\n this.assignNextMixInAction = false;\n return { status: 'skipped', reason: 'no_current_mix_track' };\n }\n\n const result = await getNextMixUtils(\n this.fieldToUseOnAutoplayNext,\n mixObject,\n token,\n currentSeedTrackId,\n currentMixTrackId,\n { ...currentMixTrack },\n this.getPlayMode(),\n assignNextMixAbortController,\n );\n\n if (result.kind === 'cancelled') {\n this.assignNextMixInAction = false;\n return { status: 'cancelled' };\n }\n\n const {\n seedTrack,\n mixTrack,\n nextMixOptional,\n mixConfigShouldNotInUse,\n fieldToUseOnAutoplayNext,\n configuredTransitionDuration_InSeed2BarCount,\n seedTrackStartingIndex,\n seedTrackEndingIndex,\n mixTrackStartingIndex,\n mixTrackEndingIndex,\n } = result.bundle;\n\n if (this.fieldToUseOnAutoplayNext !== fieldToUseOnAutoplayNext) {\n console.log(`<del>changed the direction of resolving next mix as ${fieldToUseOnAutoplayNext}</del>`);\n }\n\n this.assignNextMixForAutoPlay(\n seedTrack,\n mixTrack,\n nextMixOptional,\n false,\n mixConfigShouldNotInUse,\n true,\n configuredTransitionDuration_InSeed2BarCount,\n seedTrackStartingIndex,\n seedTrackEndingIndex,\n mixTrackStartingIndex,\n mixTrackEndingIndex,\n );\n return { status: 'assigned' };\n } catch (err) {\n console.error(err);\n this.assignNextMixInAction = false;\n return { status: 'failed', error: err };\n }\n }\n\n // ok start the work here,\n // replacing this feature with intelliskip as reference\n\n /*\n 1. the next Mix is set\n 2. assignNextMixToMasterBarSequence will be triggered to append it to master bar sequence\n */\n assignNextMixForAutoPlay = (\n seedTrack2: ITrackForSequence,\n mixTrack2: ITrackForSequence,\n optionalParam: IOptionalCurrentTrackInfo,\n triggerPreload: boolean,\n mixConfig: IMixConfiguration,\n isPrototypePage: boolean,\n configuredTransitionDuration_InSeed2BarCount: number,\n seedTrackStartingIndex: number,\n seedTrackEndingIndex: number,\n mixTrackStartingIndex: number,\n mixTrackEndingIndex: number,\n ) => {\n const playMode: PlayModes = AEV3Controller.getInstance().getPlayMode();\n consoleColorfulMessage4Lawful(\n `assignNextMixForAutoPlay: ${this.currentTrackOptionalParam.stationId}/${this.currentTrackOptionalParam.stationTrackId} to ${optionalParam.stationId}/${optionalParam.stationTrackId}`,\n '#f427c1ff',\n '#ffffff',\n 8,\n );\n\n // const seedTracks: ITrackForSequence[] = tracks?.filter((t) => t.trackMixType === 'seed') as ITrackForSequence[];\n // const mixTracks: ITrackForSequence[] = tracks?.filter((t) => t.trackMixType === 'mix') as ITrackForSequence[];\n\n let isSeedTrackDifferent, isMixTrackDifferent;\n\n if (AEV3Controller.getInstance().getNextSeedTrackObject()?.trackId !== seedTrack2.trackId) {\n isSeedTrackDifferent = true;\n }\n\n if (AEV3Controller.getInstance().getNextMixTrackObject()?.trackId !== mixTrack2.trackId) {\n isMixTrackDifferent = true;\n }\n\n if (isPrototypePage) {\n // skip duplicate seed/mix Track only be used on prototype page\n isSeedTrackDifferent = true;\n isMixTrackDifferent = true;\n }\n\n if (isSeedTrackDifferent || isMixTrackDifferent) {\n // AEV3Controller.getInstance().setIsBusy(true, 'assignNextMixToMasterBarSequence');\n\n // this.assignNextMixInAction = true;\n\n prepareAssignNextMixWithTransition(\n seedTrack2,\n mixTrack2,\n optionalParam.stationId,\n optionalParam.stationTrackId,\n '',\n configuredTransitionDuration_InSeed2BarCount,\n seedTrackStartingIndex,\n seedTrackEndingIndex,\n mixTrackStartingIndex,\n mixTrackEndingIndex,\n )\n .then((e) => {\n this.assignNextMixInAction = false;\n })\n .catch((err) => {\n this.assignNextMixInAction = false;\n console.error(err);\n });\n\n return;\n } else {\n console.log('ERROR: seed mix δΈζ¨£');\n }\n };\n\n toggleTrackGainsOfMixToClassicSeedTrack() {\n // Alex decide to do it in simple way\n const destroyMixBar: boolean = false;\n // Enable this when loadAndPlayClassic is implemented\n // this.getBarSequenceWithType('seed1').setPlayQuantisedSpeedOnBars(false);\n // this.getBarSequenceWithType('mix1').setPlayQuantisedSpeedOnBars(false);\n if (destroyMixBar) {\n this.destroyBarWithType('mix1');\n } else {\n const updated = stemVolumeMixToClassic(this);\n if (updated) {\n if (this.playMode === PLAY_MODE_CLASSIC) {\n return;\n }\n this.setPlayMode(PLAY_MODE_CLASSIC, 'toggleTrackGainsOfMixToClassic');\n }\n }\n }\n\n toggleTrackGainsOfMixToClassicMixtrack() {\n // Alex decide to do it in simple way\n const destroyMixBar: boolean = false;\n // Enable this when loadAndPlayClassic is implemented\n // this.getBarSequenceWithType('seed1').setPlayQuantisedSpeedOnBars(false);\n // this.getBarSequenceWithType('mix1').setPlayQuantisedSpeedOnBars(false);\n if (destroyMixBar) {\n this.destroyBarWithType('mix1');\n } else {\n const updated = stemVolumeMixToClassicMixtrack(this);\n if (updated) {\n if (this.playMode === PLAY_MODE_CLASSIC_MIXTRACK) {\n return;\n }\n this.setPlayMode(PLAY_MODE_CLASSIC_MIXTRACK, 'toggleTrackGainsOfMixToClassicMixtrack');\n }\n }\n }\n\n getPlayMixAsQuantised(): 'quantised' | 'seed' | 'mix' {\n return this.playMixAsQuantised;\n }\n\n setPlayMixAsQuantised(flag: 'quantised' | 'seed' | 'mix') {\n this.playMixAsQuantised = flag;\n this.getBarSequenceWithType('seed1')?.setPlayQuantisedSpeedOnBars(flag);\n this.getBarSequenceWithType('mix1')?.setPlayQuantisedSpeedOnBars(flag);\n }\n\n toggleTrackGainsOfClassicToMix(stemProfile: StemProfileString = 'v', volumeProfile: number[] = [1, 1, 1, 1]) {\n // Enable this when loadAndPlayClassic is implemented\n // this.getBarSequenceWithType('seed1').setPlayQuantisedSpeedOnBars(true);\n // this.getBarSequenceWithType('mix1').setPlayQuantisedSpeedOnBars(true);\n const updated = stemVolumeClassicToMixVer2(this, this.playbackState, stemProfile, volumeProfile);\n if (updated) {\n if (this.playMode === PLAY_MODE_MIX) {\n return;\n }\n this.setPlayMode(PLAY_MODE_MIX, 'toggleTrackGainsOfClassicToMix');\n }\n }\n\n toggleTrackGainsToInfiniteMix(stemProfile: StemProfileString = 'v', volumeProfile: number[] = [1, 1, 1, 1]) {\n // Enable this when loadAndPlayClassic is implemented\n // this.getBarSequenceWithType('seed1').setPlayQuantisedSpeedOnBars(true);\n // this.getBarSequenceWithType('mix1').setPlayQuantisedSpeedOnBars(true);\n const updated = stemVolumeClassicToMixVer2(this, this.playbackState, stemProfile, volumeProfile);\n if (updated) {\n if (this.playMode === PLAY_MODE_INFINITE_MIX) {\n return;\n }\n this.setPlayMode(PLAY_MODE_INFINITE_MIX, 'toggleTrackGainsToInfiniteMix');\n }\n }\n\n toggleTrackGainsToDJMix(stemProfile: StemProfileString = 'v', volumeProfile: number[] = [1, 1, 1, 1]) {\n // Enable this when loadAndPlayClassic is implemented\n // this.getBarSequenceWithType('seed1').setPlayQuantisedSpeedOnBars(true);\n // this.getBarSequenceWithType('mix1').setPlayQuantisedSpeedOnBars(true);\n const updated = stemVolumeClassicToMixVer2(this, this.playbackState, stemProfile, volumeProfile);\n if (updated) {\n if (this.playMode === PLAY_MODE_DJ_MIX) {\n return;\n }\n this.setPlayMode(PLAY_MODE_DJ_MIX, 'toggleTrackGainsToDJMix');\n }\n }\n\n /**\n * Play/Pause\n * Note this one is tested ok on iOS, specific with this setup\n */\n pauseOnIOS(reseumeTarget: number = -1, pausingFromError: boolean = false, pauseFromMediaSession: boolean = false) {\n consoleColorfulMessage(`pauseOnIOS ${reseumeTarget}, pausing from internal procedure: ${pausingFromError}`, '#ff0000', '#00ff00');\n if (pausingFromError) {\n // debugger;\n // console.log(pausingFromError);\n }\n if (this.isBusy) {\n this._log('refuse to pause, busy!');\n return;\n }\n this._log('pausing....');\n this.setPlaybackState(AudioEnginePlaybackState.Paused);\n this.setIsBusy(true, 'pausing....');\n\n this._log(navigator.mediaSession.playbackState);\n const audioControl = document.getElementById('audio-control') as HTMLAudioElement | null;\n const liveStream: HTMLAudioElement | null = this.streamOutput; // this one is leaving it on\n\n audioControl?.pause();\n\n if (USE_AUDIO_STREAM_DESTINATION) {\n if (pauseFromMediaSession) {\n // not pausing the liveStream if it is iOS triggering from music control\n // can make this last as long as it could hence after 10+ minutes the music\n // control might still be able to resume it\n // update: I think should consider following\n // which one really mattered: audio context or the liveStream element or both\n } else {\n liveStream?.pause();\n }\n }\n\n this._log('%cAudio Control Paused', 'color: red;');\n navigator.mediaSession.playbackState = 'paused';\n\n const seedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n\n if (reseumeTarget === -1) {\n if (seedBar?.sourceJustPlayed?.[0]?.chunkIdx !== undefined) {\n this.pauseAtSeedBarIndex = seedBar.sourceJustPlayed[0].chunkIdx + 1 || 0;\n } else if (seedBar?.sourcePlaying?.[0]?.chunkIdx !== undefined) {\n this.pauseAtSeedBarIndex = seedBar.sourcePlaying[0].chunkIdx || 0;\n } else {\n this.pauseAtSeedBarIndex = 0;\n }\n } else {\n this.pauseAtSeedBarIndex = reseumeTarget || 0;\n }\n // AEV3Controller.getInstance().aev3Context.masterGainNode.gain.linearRampToValueAtTime(0, AEV3Controller.getInstance().aev3Context.audioContext.currentTime + FADE_OUT_DURATION_ON_PAUSE);\n // might need to pass this to controller\n seedBar?.cleanBuffersInBufferPlayerProcessor();\n mixBar?.cleanBuffersInBufferPlayerProcessor();\n\n setTimeout(() => {\n this.setIsBusy(false, 'paused....');\n }, 300);\n }\n\n resumeOnIOS() {\n if (this.isBusy) {\n this._log('refuse to resume, busy!');\n return;\n }\n // const audioElement: HTMLAudioElement = document.getElementById('stream-output') as HTMLAudioElement;\n // const audioControl: HTMLAudioElement = document.getElementById('audio-control') as HTMLAudioElement;\n\n this.setPlaybackState(AudioEnginePlaybackState.Playing);\n this.setIsBusy(true, 'resuming....');\n const liveStream: HTMLAudioElement | null = this.streamOutput;\n const audioControl: HTMLAudioElement | null = this.audioControl;\n\n this._log('%cMusic Control:: play', 'color: red;');\n this._log(audioControl);\n this._log(liveStream);\n this._log(navigator.mediaSession.playbackState);\n if (!audioControl || !liveStream || !this.aev3Context?.audioContext) {\n this.setIsBusy(false, 'resumed.... (missing audio elements or context)');\n return;\n }\n audioControl.play().then(() => {\n this._log('%cAudio Control Plays', 'color: red;');\n // this.setIsBusy(false, 'resumed....');\n if (USE_AUDIO_STREAM_DESTINATION) {\n liveStream.play();\n this._log('live stream resumed (did not await)');\n }\n });\n\n navigator.mediaSession.playbackState = 'playing';\n // audioElement.play().then(()=>{\n // this does not required if we cannot pause the audio at `PAUSE` handler\n // this._log('%cAudio Element Plays', 'color: red;');\n // });\n // AEV3Controller.getInstance().aev3Context.masterGainNode.gain.value = 1;\n\n setTimeout(() => {\n this.setIsBusy(false, 'resumed....');\n }, 300);\n\n // might need to pass this to controller\n const seedBar = AEV3Controller.getInstance().getBarSequenceWithType('seed1');\n const mixBar = AEV3Controller.getInstance().getBarSequenceWithType('mix1');\n const ctx = AEV3Controller.getInstance().aev3Context;\n if (!seedBar || !mixBar || !ctx?.audioContext) {\n return;\n }\n\n const delay = SILENT_BUFFER_SAMPLE_SIZE / SAMPLE_RATE + 0.05;\n const startTime = ctx.audioContext.currentTime + delay;\n const startingBarIdx = this.pauseAtSeedBarIndex;\n consoleColorfulMessage4Lawful(`resuming at ${startingBarIdx}`);\n for (let i = 0; i < 4; i++) {\n if (seedBar.sourcePlaying[i]) seedBar.sourcePlaying[i].barSequenceUUID = 'resume';\n if (mixBar.sourcePlaying[i]) mixBar.sourcePlaying[i].barSequenceUUID = 'resume';\n }\n seedBar.schedulePlay(ctx, startingBarIdx, startTime);\n mixBar.schedulePlay(ctx, startingBarIdx, startTime);\n\n this._log('%cResumeInMusicControl (note this is async so Audio Plays notice might issue later)', 'color: orange');\n }\n\n async resumeOnInterruption(): Promise<void> {\n // const audioElement: HTMLAudioElement = document.getElementById('stream-output') as HTMLAudioElement;\n // const audioControl: HTMLAudioElement = document.getElementById('audio-control') as HTMLAudioElement;\n\n const liveStream: HTMLAudioElement | null = this.streamOutput;\n const audioControl: HTMLAudioElement | null = this.audioControl;\n\n const audioControlDebug = document.getElementById('audio-control-debug');\n if (audioControlDebug) {\n audioControlDebug.textContent = '';\n }\n\n // Only resume if audio context is not already running\n const audioContext = AEV3Controller.getInstance().aev3Context.audioContext;\n if (audioContext && audioContext.state !== 'running') {\n await audioContext.resume();\n this._log('audio context resumed');\n } else {\n this._log('audio context already running, skipping resume');\n }\n\n // Check if audioControl exists before accessing its properties\n if (audioControl && audioControl.paused) {\n // if the audio context is suspended for some reason while audioControl(m3u8) keep on moving, following will never be resolved:\n await audioControl.play();\n }\n // navigator.mediaSession.playbackState = 'playing'; // Explicitly set playback state to 'playing'\n const audioControlDebug2 = document.getElementById('audio-control-debug');\n if (audioControlDebug2) {\n audioControlDebug2.textContent = '';\n }\n this._log('control resumed');\n // await pause(500);\n // setupMediaSession();\n\n if (USE_AUDIO_STREAM_DESTINATION && liveStream) {\n this._log('liveStream.paused', liveStream.paused);\n await liveStream.play();\n this._log('live stream resumed');\n }\n\n if (this.playbackState !== AudioEnginePlaybackState.Playing) {\n // further investigate what edge case this one fall into\n console.error('Interrupted/Suspended Audio Context resumed - reset playbackState as playing');\n }\n AEV3Controller.getInstance().setPlaybackState(AudioEnginePlaybackState.Playing);\n }\n\n /**\n * The volume change will be skipped if current Volume is exactly the same as target volume\n */\n changeStemVolumeWithFade(\n trackType: 'mix1' | 'seed1',\n sequenceIdx: number,\n volume: number,\n startTime: number,\n informMasterStore: boolean, // for those triggered not initialised from Master\n informStemVolumeStore: boolean,\n duration = 0.05,\n ) {\n const value = volume;\n const stemGainNode = this.getStemGainNodesWithTrackType(trackType)?.[sequenceIdx];\n if (!stemGainNode) {\n if (ENABLE_DEBUG_FADING) this._log(`[FADE-DEBUG-CONTROLLER] β No gain node found for ${trackType} stem ${sequenceIdx}`);\n return;\n }\n\n const currentValue = stemGainNode.gain.value;\n const currentTime = this.aev3Context.audioContext.currentTime;\n const scheduledTime = startTime + duration;\n const timeDiff = startTime - currentTime;\n\n if (ENABLE_DEBUG_FADING) this._log(`[FADE-DEBUG-CONTROLLER] ποΈ ${trackType} stem ${sequenceIdx}: ${currentValue.toFixed(3)} β ${volume.toFixed(3)} over ${duration}s`);\n if (ENABLE_DEBUG_FADING)\n this._log(`[FADE-DEBUG-CONTROLLER] β° Current: ${currentTime.toFixed(3)}, Start: ${startTime.toFixed(3)}, End: ${scheduledTime.toFixed(3)}, Diff: ${timeDiff.toFixed(3)}s`);\n if (ENABLE_DEBUG_FADING) this._log(`[FADE-DEBUG-CONTROLLER] π΅ Audio context state: ${this.aev3Context.audioContext.state}`);\n\n // REMOVED the early return that was preventing fades when current value equals target\n // This was causing fades to be skipped when stems were already at the target volume\n // if (stemGainNode.gain.value === volume) return;\n\n // Check if the scheduled time is in the past\n if (timeDiff < -0.001) {\n if (ENABLE_DEBUG_FADING) this._log(`[FADE-DEBUG-CONTROLLER] β οΈ Scheduled time is ${Math.abs(timeDiff).toFixed(3)}s in the past, adjusting to current time + 0.01s`);\n startTime = currentTime + 0.01;\n }\n\n // align the stem switching function as Audio Engine V2\n if (this.getAudioContextAlias().state !== 'running') {\n if (ENABLE_DEBUG_FADING) this._log(`[FADE-DEBUG-CONTROLLER] π Audio context not running, setting value directly`);\n stemGainNode.gain.value = value;\n } else {\n try {\n // Cancel any existing scheduled changes\n stemGainNode.gain.cancelScheduledValues(currentTime);\n\n // Set current value and ramp to target\n stemGainNode.gain.setValueAtTime(currentValue, startTime);\n stemGainNode.gain.linearRampToValueAtTime(volume, startTime + duration);\n\n if (ENABLE_DEBUG_FADING) this._log(`[FADE-DEBUG-CONTROLLER] β
Scheduled linearRampToValueAtTime(${volume}, ${(startTime + duration).toFixed(3)})`);\n\n // Verify the fade was scheduled\n setTimeout(\n () => {\n const finalValue = stemGainNode.gain.value;\n if (ENABLE_DEBUG_FADING)\n this._log(`[FADE-DEBUG-CONTROLLER] π Post-fade verification: ${trackType} stem ${sequenceIdx} = ${finalValue.toFixed(3)} (expected: ${volume.toFixed(3)})`);\n },\n duration * 1000 + 50,\n );\n } catch (error) {\n console.error(`[FADE-DEBUG-CONTROLLER] β Error scheduling fade:`, error);\n // Fallback to direct value setting\n stemGainNode.gain.value = value;\n }\n }\n setTimeout(\n () => {\n if (informStemVolumeStore) {\n // copy the event once for data check on this event\n const event: IEventUpdateStemVolumeStore = {\n type: 'update_volume_store_because_vol_changed_not_init_from_store',\n detail: { trackType, sequenceIdx, expected: value, signature: 'toggleStem' },\n };\n this.dispatchEvent(AEV3Controller.UPDATE_STEM_VOLUME_STORE, event.detail);\n }\n if (informMasterStore) {\n const event2: IEventUpdateStemMasterStore = {\n type: 'update_master_store_because_vol_changed_not_init_from_there_toggle_selection_(only_seed)',\n detail: { trackType, sequenceIdx, newVolume: value, signature: 'scheduleStemVolume' },\n };\n this.dispatchEvent(AEV3Controller.UPDATE_STEM_MASTER_STORE_ON_TOGGLING, event2.detail);\n }\n },\n duration * 1000 + 0.01,\n );\n }\n\n toggleStemSelectionBasedOnSeedFromStemSwitching(sequenceIdx: number, config: StemSwitchingScheduler, trackIndex: number, bar: IBarSequenceChunk) {\n if ([1].includes(trackIndex)) return;\n\n const barInUse = this.getBarWithTrackIndex(trackIndex as TrackIndexType);\n if (!barInUse) return;\n const stemSeq = barInUse.sequences?.[sequenceIdx];\n if (!stemSeq) return;\n const chunkIdx = stemSeq.segments.findIndex((c) => c.chunkId === bar.chunkId);\n\n if (chunkIdx !== -1) {\n const barAudibleDruation = barInUse.getChunkAudibleDuration(sequenceIdx, chunkIdx);\n aev3StemsMasterStateStore.getState().enforceStemSelectionOnSeed(sequenceIdx, config.enabled, config.profile?.profileName, barAudibleDruation);\n } else {\n console.error('toggleStemSelectionBasedOnSeedFromStemSwitching failed.', sequenceIdx, bar);\n }\n }\n\n invertStemSelectionBasedOnSeedForChannelSwapping(trackIndex: number, _bar: IBarSequenceChunk | null, signature: string) {\n if ([1].includes(trackIndex)) return;\n aev3StemsMasterStateStore.getState().invertStemSelectionOnSeedWithoutModifyVol(signature);\n }\n\n // only triggered when BarSequence's auto switch applied\n snapStemProfileBeforeTransition() {\n this._stemProfileBeforeTransition = getCurrentStemProfileBasedOnStore();\n this._log(`restoreStemProfileExitingTransition: this is a seed track triggering stem switching, maybe memorised what is current selection: [${this._stemProfileBeforeTransition}]`);\n }\n\n // Note this only viable if there is transition zone applied\n resumeStemProfileBeforeSwitching(invertStems: boolean) {\n // check based on signature or playMode, determine to resume it later\n if (!getRetainStemProfileExitingTransitionConfig(this.getPlayMode())) return;\n\n const stemProfile = invertStems ? invertStemProfile(this._stemProfileBeforeTransition) : this._stemProfileBeforeTransition;\n this._log(`restoreStemProfileExitingTransition: restore this profile: [${stemProfile}]`);\n aev3StemsMasterStateStore.getState().enforceStemSelectionOnSeedByRetainedStemProfile(stemProfile);\n return;\n }\n\n changeStemVolumeNow(\n trackType: 'mix1' | 'seed1',\n sequenceIdx: number,\n volume: number,\n informMasterStore: boolean, // for those triggered not initialised from Master\n informStemVolumeStore: boolean,\n ) {\n const stems = this.getStemGainNodesWithTrackType(trackType);\n const stemGainNode = stems?.[sequenceIdx];\n if (!stemGainNode) return;\n if (stemGainNode.gain.value !== volume) {\n stemGainNode.gain.value = volume;\n // change the muted layer\n\n if (informStemVolumeStore) {\n // copy the event once for data check on this event\n const event: IEventUpdateStemVolumeStore = {\n type: 'update_volume_store_because_vol_changed_not_init_from_store',\n detail: { trackType, sequenceIdx, expected: volume, signature: 'toggleStem' },\n };\n this.dispatchEvent(AEV3Controller.UPDATE_STEM_VOLUME_STORE, event.detail);\n }\n if (informMasterStore) {\n const event2: IEventUpdateStemMasterStore = {\n type: 'update_master_store_because_vol_changed_not_init_from_there_toggle_selection_(only_seed)',\n detail: { trackType, sequenceIdx, newVolume: volume, signature: 'scheduleStemVolume' },\n };\n this.dispatchEvent(AEV3Controller.UPDATE_STEM_MASTER_STORE_ON_TOGGLING, event2.detail);\n }\n }\n }\n\n logToggleStemVol(trackType: 'mix1' | 'seed1', sequenceIdx: number, volume: number, sharedStartTime: number) {\n // TBACS\n // this._log('%clog DJ action on changing stem vol', 'color: orange;');\n // console.table({\n // trackType, sequenceIdx, volume, sharedStartTime\n // });\n this.djAction.push({\n trackId: this.getBarSequenceWithType(trackType)?.trackData?.trackId ?? '',\n sequenceIdx,\n vol: volume,\n startTime: sharedStartTime,\n });\n }\n\n // changeStemVolumeDebounced(trackType: 'mix1' | 'seed1', sequenceIdx: number, volume: number) {}\n\n // sharp change with volume\n scheduleStemVolume(\n trackType: 'mix1' | 'seed1',\n sequenceIdx: number,\n isStemOn: boolean,\n toggleAtContextTime: number,\n expectedEventToFiredForDebug: number,\n informMasterStore: boolean, // for those triggered not initialised from Master\n informStemVolumeStore: boolean,\n ) {\n this._log('scheduleStemVolume', `${trackType} ${sequenceIdx} ${isStemOn} ${toggleAtContextTime}`);\n const value = isStemOn ? 1 : 0;\n const stems = this.getStemGainNodesWithTrackType(trackType);\n const stemGainNode = stems?.[sequenceIdx];\n const ac = this.aev3Context?.audioContext;\n if (!stemGainNode || !ac) return;\n stemGainNode.gain.setValueAtTime(value, toggleAtContextTime);\n const timeBeforeScheduleTriggered = toggleAtContextTime - ac.currentTime;\n if (Math.abs(expectedEventToFiredForDebug - timeBeforeScheduleTriggered) >= 0.01) {\n console.error(`ERROR timing is incorrect: ${timeBeforeScheduleTriggered} VS ${expectedEventToFiredForDebug}`);\n }\n setTimeout(\n () => {\n // copy the event once for data check on this event\n if (informStemVolumeStore) {\n const event: IEventUpdateStemVolumeStore = {\n type: 'update_volume_store_because_vol_changed_not_init_from_store',\n detail: { trackType, sequenceIdx, expected: value, signature: 'scheduleStemVolume' },\n };\n this.dispatchEvent(AEV3Controller.UPDATE_STEM_VOLUME_STORE, event.detail);\n }\n if (informMasterStore) {\n const event2: IEventUpdateStemMasterStore = {\n type: 'update_master_store_because_vol_changed_not_init_from_there_toggle_selection_(only_seed)',\n detail: { trackType, sequenceIdx, newVolume: value, signature: 'scheduleStemVolume' },\n };\n this.dispatchEvent(AEV3Controller.UPDATE_STEM_MASTER_STORE_ON_TOGGLING, event2.detail);\n }\n },\n timeBeforeScheduleTriggered * 1000 + 0.01,\n );\n }\n\n // Add this method for the vinyl stop effect\n /**\n * Vinyl Stop Effect - Smoothly transitions playback rate to create vinyl stop/start effect\n * @param targetMultiplier - 1 for playing, ~0 for paused\n */\n private animatePlaybackRate(targetMultiplier: number) {\n // Cancel any ongoing animation\n if (this.vinylStopAnimationId !== null) {\n cancelAnimationFrame(this.vinylStopAnimationId);\n this.vinylStopAnimationId = null;\n }\n\n // Store the current master volume before starting a slowdown\n if (targetMultiplier < 1 && this.useVolumeFade) {\n const masterGainNode = this.getMasterGainNode();\n if (masterGainNode) {\n this.originalMasterVolume = masterGainNode.gain.value;\n }\n }\n\n // Must match requestAnimationFrame's timestamp (DOMHighResTimeStamp); Date.now() is a different epoch and breaks easing math.\n const startTime = performance.now();\n const startValue = this.playPauseMultiplier;\n const endValue = targetMultiplier;\n const duration = this.vinylStopTransitionDuration * 1000; // Convert to milliseconds\n\n // Minimum value to avoid completely stopping (which can cause issues with Web Audio)\n const MIN_PLAYBACK_RATE = 0.000001;\n\n const animate = (currentTime: number) => {\n const elapsedTime = currentTime - startTime;\n const progress = Math.min(Math.max(elapsedTime / duration, 0), 1); // Linear progress 0-1\n\n // Apply easing function based on direction for more natural vinyl effect\n let easedProgress;\n if (targetMultiplier > startValue) {\n // SPEEDING UP: Use ease-out-cubic (fast start, slow end)\n // Gets to 50% speed quickly, then smoothly approaches 100%\n easedProgress = 1 - Math.pow(1 - progress, 3);\n } else {\n // SLOWING DOWN: Use ease-out-cubic (fast start, slow end)\n // Drops dramatically at first, then coasts to a stop - VERY noticeable!\n easedProgress = 1 - Math.pow(1 - progress, 3);\n }\n\n // Calculate current multiplier using EASED progress\n this.playPauseMultiplier = startValue + (endValue - startValue) * easedProgress;\n\n // Ensure we don't go below minimum value\n if (this.playPauseMultiplier < MIN_PLAYBACK_RATE) {\n this.playPauseMultiplier = MIN_PLAYBACK_RATE;\n }\n\n // Apply the multiplier to the global playback rate\n this.applyPlaybackRateWithMultiplier();\n\n // If volume fade is enabled, adjust the master volume\n if (this.useVolumeFade) {\n this.applyVolumeFadeWithProgress(progress, targetMultiplier);\n }\n\n // Continue animation if not complete\n if (progress < 1) {\n this.vinylStopAnimationId = requestAnimationFrame(animate);\n } else {\n this.vinylStopAnimationId = null;\n }\n };\n\n // Start the animation\n this.vinylStopAnimationId = requestAnimationFrame(animate);\n }\n\n /**\n * Applies volume fade based on animation progress\n * @param progress - Animation progress from 0 to 1\n * @param targetMultiplier - Target speed multiplier (1 for playing, near 0 for stopping)\n */\n private applyVolumeFadeWithProgress(progress: number, targetMultiplier: number) {\n const masterGainNode = this.getMasterGainNode();\n if (!masterGainNode) return;\n\n const startVolume = targetMultiplier < 1 ? this.originalMasterVolume : 0;\n const endVolume = targetMultiplier < 1 ? 0 : this.originalMasterVolume;\n\n // Calculate new volume using cubic ease-out for more natural vinyl sound\n let fadeProgress = progress;\n if (targetMultiplier < 1) {\n // When slowing down, use ease-out (faster at start, slower at end)\n fadeProgress = 1 - Math.pow(1 - progress, 3);\n } else {\n // When speeding up, use ease-in (slower at start, faster at end)\n fadeProgress = Math.pow(progress, 2);\n }\n\n const newVolume = startVolume + (endVolume - startVolume) * fadeProgress;\n\n // Apply the new volume\n const audioContext = this.aev3Context?.audioContext;\n if (audioContext) {\n masterGainNode.gain.setTargetAtTime(newVolume, audioContext.currentTime, 0.01);\n } else {\n masterGainNode.gain.value = newVolume;\n }\n }\n\n /**\n * Applies the current playback rate adjusted by the play/pause multiplier\n */\n private applyPlaybackRateWithMultiplier() {\n // Apply to all bar sequences with the multiplier\n const effectivePlaybackRate = this.globalPlaybackRate * this.playPauseMultiplier;\n\n try {\n // Apply to all sequences\n this.getBarSequenceWithType('seed1')?.setGlobalPlaybackRate(effectivePlaybackRate);\n this.getBarSequenceWithType('mix1')?.setGlobalPlaybackRate(effectivePlaybackRate);\n } catch (err) {\n console.error('Error applying playback rate:', err);\n }\n }\n\n // Add methods to control the vinyl stop feature\n enableVinylStop(enabled: boolean) {\n this.isVinylStopEnabled = enabled;\n }\n\n setVinylStopDuration(seconds: number) {\n this.vinylStopTransitionDuration = seconds;\n }\n\n // Add method to control the volume fade feature\n enableVolumeFade(enabled: boolean) {\n this.useVolumeFade = enabled;\n }\n\n /**\n * Memory clean up based on BarSequences' trackData.trackId\n */\n cleanupMemory() {\n if (this.isBusy) {\n console.log('%ccleanupMemory: skipped[busy]', 'color:yellow;');\n return;\n }\n if (this.assignNextMixInAction) {\n console.log('%ccleanupMemory: skipped[assignNextMixInAction]', 'color:yellow;');\n return;\n }\n if (this.cleanupMemoryInAction) {\n console.log('%ccleanupMemory: skipped[cleanupMemoryInAction]', 'color:yellow;');\n return;\n }\n\n console.log('%ccleanupMemory', 'color:yellow;');\n this.cleanupMemoryInAction = true;\n let trackIds: string[] = [];\n\n const seedBarSeq = this.getBarSequenceWithType('seed1');\n if (seedBarSeq) {\n trackIds = [...trackIds, ...seedBarSeq.getAllTrackIdsInSequencesWithThreshold()];\n }\n\n const mixBarSeq = this.getBarSequenceWithType('mix1');\n if (mixBarSeq) {\n trackIds = [...trackIds, ...mixBarSeq.getAllTrackIdsInSequencesWithThreshold()];\n }\n\n // if (this.getBarSequenceWithType('seed2')) {\n // trackIds = [\n // ...trackIds,\n // ...this.getBarSequenceWithType('seed2').getAllTrackIdsInSequencesWithThreshold(),\n // ]\n // }\n\n // if (this.getBarSequenceWithType('mix2')) {\n // trackIds = [\n // ...trackIds,\n // ...this.getBarSequenceWithType('mix2').getAllTrackIdsInSequencesWithThreshold(),\n // ]\n // }\n\n const trackIdsPreloaded = this.preloadedAudioSource.map((s) => s.trackData.trackId);\n const trackIdsNotInUse = trackIdsPreloaded.filter((id) => !trackIds.includes(id));\n\n const cleanMP4 = (trackIdsToRemove: string[]) => {\n for (let i = 0; i < trackIdsToRemove.length; i++) {\n const t = this.getAudioSourceSequenceInPreloadedQueued(trackIdsToRemove[i]);\n if (t) {\n const index = this.preloadedAudioSource.findIndex((s) => s === t);\n // make sure it detached from the array before carry on, because BarSequences might accessing those stuff via preloadedAudioSource() in some iterations, and if the MP4 is destoryed before that, all those function fails\n // make sure Bar Sequence created are destroyed\n if (this.preloadedAudioSource[index].getIsInitialised() !== 'NOT_YET') {\n // keep it if it is initialsing\n console.log('destroying mp4 : ', t.trackData.trackId);\n this.preloadedAudioSource.splice(index, 1);\n t?.destroy();\n }\n }\n }\n\n this._log_table({\n 'BarSequence Created': this.barCreated.length,\n 'AudioSource Created': this.preloadedAudioSource.length,\n });\n };\n\n const cleanBarSequencesFromMasterBarOps = () => {\n const before = this.barCreated?.length || 0;\n const a = this.barCreated.filter((b, index) => {\n return (\n // not the one playing\n b.uuid !== this.barSequence1?.uuid &&\n b.uuid !== this.barSequence2?.uuid &&\n b.uuid !== this.barSequence3?.uuid &&\n b.uuid !== this.barSequence4?.uuid &&\n // && b.trackData?.trackId!==this.barSequence1?.trackData?.trackId\n // && b.trackData?.trackId!==this.barSequence2?.trackData?.trackId\n // && b.trackData?.trackId!==this.barSequence3?.trackData?.trackId\n // && b.trackData?.trackId!==this.barSequence4?.trackData?.trackId\n // avoid remove those created by recent master bar ops\n index < this.barCreated.length - 10\n );\n });\n a.forEach((b) => {\n const idx = this.barCreated.findIndex((b2) => b2.uuid === b.uuid);\n b?.destroy(false);\n this.barCreated.splice(idx, 1);\n });\n const after = this.barCreated?.length || 0;\n console.log(`Cleaning Sequences from Master Bar Ops: ${before} -> ${after}`);\n };\n\n cleanMP4(trackIdsNotInUse);\n cleanBarSequencesFromMasterBarOps(); // seekTo break\n\n const trimBs1 = this.barSequence1;\n const trimBs2 = this.barSequence2;\n if (\n trimBs1?.sequences?.[0]?.segments &&\n trimBs1.sourceJustPlayed?.[0] !== undefined &&\n trimBs1.sourceJustPlayed[0].chunkIdx > 100 &&\n trimBs2?.sequences?.[0]?.segments &&\n trimBs2.sourceJustPlayed?.[0] !== undefined &&\n trimBs2.sourceJustPlayed[0].chunkIdx > 100\n ) {\n if (trimBs1?.trackData?.trackId === trimBs2?.trackData?.trackId) {\n console.log('two trackId the same, skip this attempt to clean Segments');\n } else if (trimBs1 && trimBs2) {\n // after seekTo, this might be over-cut?\n trimBarSequenceSegments(trimBs1, 30);\n trimBarSequenceSegments(trimBs2, 30);\n }\n }\n\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n const measures = performance.getEntriesByType('measure');\n // console.log('check Measures', performance.getEntriesByType('measure').length)\n if (measures.length > 2000) {\n // console.log('Before Clear Measures', performance.getEntriesByType('measure').length);\n performance.clearMarks();\n (performance as Performance & { clearMeasures?: () => void }).clearMeasures?.();\n // console.log('After Clear Measures', performance.getEntriesByType('measure').length);\n }\n }\n // window.performance.clearResourceTimings();\n this.cleanupMemoryInAction = false;\n }\n\n // CAUTION, edge case, if this trackId is used on other BarSequence, it might get evicted as well\n // so it should be better to handle it at Controller level since it have access to next TrackIds\n evictArrayBufferAccordingToSampleRange(trackId: string, sequenceIdx: number, sampleStart: number, sampleEnd: number, signature: string) {\n if (trackId === this.getNextSeedTrackObject()?.trackId || trackId === this.getNextMixTrackObject()?.trackId) {\n // console.log(`postpone the evicting frames in AudioSource because trackId ${trackId} is next track`)\n }\n\n const audioSource = AEV3Controller.getInstance().getAudioSourceSequenceInPreloadedQueued(trackId);\n audioSource?.evictArrayBufferAccordingToSampleRange(0, sampleStart, sampleEnd, 'evictAudioBufferOnAllSequencesWithBarIndex');\n }\n\n updateCurrentTrackWhenMasterBarSeqPlays = (currentChunk: IBarSequenceChunk, trackIndex: number) => {\n if (currentChunk.updateCurrentTrackIfThisMasterBarSegmentPlays === true) {\n const genetic = currentChunk.geneticSignatureForThisMasterBarSegment;\n if (!genetic) return;\n const trackData = genetic.trackData;\n const barIndexStart = genetic.barIndexStart;\n const barIndexEnd = genetic.barIndexEnd;\n this._log(`%cMasterBarSequence:: Editing of the genetic signature of Bar`, this);\n\n // if (currentChunk.geneticSignatureForThisMasterBarSegment.trackType==='seed') {\n if (this.getBarSequenceIdWithTrackIndex(trackIndex) === 'seed1') {\n // enforce update to currentTrack and render isTransitional status\n this.setCurrentSeedTrackObject(trackData, 'seed1', false, -1, 'Controller: updateCurrentTrackWhenMasterBarSeqPlays');\n this.setCurrentSeedTrackBarRanges(barIndexStart, barIndexEnd);\n } else if (genetic.trackType === 'mix') {\n const memoriseMixTrackForSeekTo = !currentChunk.isTransitionalBar;\n // enforce update to currentTrack and render isTransitional status\n this.setCurrentMixTrackObject(trackData, 'mix1', false, memoriseMixTrackForSeekTo, -1, 'Controller: updateCurrentTrackWhenMasterBarSeqPlays');\n this.setCurrentMixTrackBarRanges(barIndexStart, barIndexEnd);\n }\n }\n };\n\n updateCurrentOptionalTrackObjWhenMasterBarSeqPlays = (currentChunk: IBarSequenceChunk, trackIndex: number) => {\n\n if (currentChunk.updateCurrentMixMetaIfThisMasterBarSegmentPlays === true \n && this.getNextTrackOptionalParam().stationTrackId !== ''\n && this.getNextTrackOptionalParam().stationId !== ''\n ) {\n // propagate the OptionalParam of next track to current track\n // this can refresh the mixId\n\n this.setCurrentTrackOptionalParam(this.getNextTrackOptionalParam());\n this.setNextSeedTrackObject(null, false, -1, 'resetting next mix');\n this.setNextMixTrackObject(null, false, -1, 'resetting next mix');\n this.setNextTrackOptionalParam(null);\n }\n const liveEditRemix = currentChunk.isFirstBarOfLiveEditSwap_remixId;\n if (liveEditRemix && liveEditRemix.id !== '') {\n // only do this on seed track's pipeline since it is used to fire event and update transition info (based on seed track)\n\n // if (currentChunk.geneticSignatureForThisMasterBarSegment.trackType==='seed'){\n if (this.getBarSequenceIdWithTrackIndex(trackIndex) === 'seed1') {\n // consoleColorfulMessage4Lawful(`[updateAEV3ControllerCurrentOptionalTrackObjWhenMasterBarSeqPlays (trackIndex-${this.trackIndex}-${chunkIdx})] trigger setRemixIdJustPlayed`, '#18fef3ff', '#c6db08ff', 9, 'βΎοΈ');\n this.setRemixIdJustPlayed(liveEditRemix, currentChunk.isFirstBarOfLiveEditSwap_stationId);\n // consoleColorfulMessage('avoid update the mixId because it is locus swap', '#ff0000', '#f0f0f0', 8, 'π');\n } else {\n // consoleColorfulMessage4Lawful(`[updateAEV3ControllerCurrentOptionalTrackObjWhenMasterBarSeqPlays (trackIndex-${this.trackIndex}-${chunkIdx})] NOT trigger setRemixIdJustPlayed and let seed chunk do the job`, '#18fef3ff', '#c6db08ff', 9, 'βΎοΈ');\n }\n }\n };\n\n /**\n * DebugUtils\n */\n consoleAev3Volume() {\n this._log_utils(\n 'stemProfile',\n this.aev3Context?.trackGainNodes?.map((t) => t.gain.value),\n );\n this._log_utils(\n 'stemProfile',\n this.aev3Context?.stemGainNodesTrack1?.map((t) => t.gain.value),\n );\n this._log_utils(\n 'stemProfile',\n this.aev3Context?.stemGainNodesTrack2?.map((t) => t.gain.value),\n );\n }\n\n consoleBarSampleContinuity() {\n try {\n this.consoleBarSampleContinuity_singleBar('seed1');\n this.consoleBarSampleContinuity_singleBar('mix1');\n } catch (err) {\n this._log_utils(err);\n }\n }\n\n consoleAudibleDurationCheck() {\n function getAudibleDuration(segment: IBarSequenceChunk) {\n const { originalBar, speedRatio_SeedMixMatching, speedRatio_ManualScheduling } = segment;\n if (originalBar == null) return 0;\n return originalBar.duration / speedRatio_SeedMixMatching / speedRatio_ManualScheduling;\n }\n\n const audBs1 = this.barSequence1;\n const audBs2 = this.barSequence2;\n const audSeg0 = audBs1?.sequences?.[0];\n const audSeg1 = audBs2?.sequences?.[0];\n if (audSeg0 && audSeg1) {\n const totalChunks = audSeg0.segments.length;\n\n for (let chunkIdx = 0; chunkIdx < totalChunks; chunkIdx++) {\n const audibleDuration1 = getAudibleDuration(audSeg0.segments[chunkIdx]);\n const audibleDuration2 = getAudibleDuration(audSeg1.segments[chunkIdx]);\n const difference = audibleDuration1 - audibleDuration2;\n if (Math.abs(difference) > 0.00005) {\n this._log_utils('%cProblematic of chunk alignment can lead to out of sync', 'color: orangered;', {\n pipeline1: audSeg0.segments[chunkIdx],\n pipeline2: audSeg1.segments[chunkIdx],\n difference,\n audibleDuration1,\n audibleDuration2,\n });\n // this.consoleBarSampleContinuity();\n }\n }\n }\n }\n\n private consoleBarSampleContinuity_singleBar(trackMixType: TrackLabelType) {\n const _barSequence = this.getBarSequenceWithType(trackMixType);\n if (!_barSequence) return;\n const barSequenceLabel = trackMixType;\n const sequenceIdx = 0;\n const sequenceLabel = 'other';\n const seqList = _barSequence.sequences;\n if (!seqList?.[sequenceIdx]) return;\n const firstSeg = seqList[sequenceIdx]?.segments[0];\n const firstOb = firstSeg?.originalBar;\n if (!firstOb) return;\n let sampleStart = firstOb.sampleStart;\n let sampleEnd = firstOb.sampleEnd;\n let trackId = firstOb.trackId;\n let trackLabel = _barSequence.trackData.name;\n\n const printBarSequenceRange = (\n trackId: string,\n trackLabel: string,\n sequenceLabel: string,\n sampleStart: number,\n sampleEnd: number,\n ) => {\n this._log_utils(`[${barSequenceLabel}] ${trackId}, [${sequenceLabel}]: sampleStart: ${sampleStart} - sampleEnd: ${sampleEnd}`);\n };\n\n const singleStem = seqList[sequenceIdx];\n let previousSegment: IBarSequenceChunk;\n\n this._log_utils(`%c${Array(60).fill('*').join('')}\\n * ${barSequenceLabel} sequence's sample continuity check`, 'color: orange; background: black');\n\n singleStem.segments.forEach((c, segmentIdx) => {\n if (segmentIdx === 0) return;\n const ob = c.originalBar;\n if (!ob) return;\n\n if (sampleEnd + 1 !== ob.sampleStart && trackId === ob.trackId) {\n // if it is not a new track, could be self-repeated track\n previousSegment = singleStem.segments[segmentIdx - 1];\n // this._log(previousSegment);\n // this._log(c);\n printBarSequenceRange(trackId, trackLabel, sequenceLabel, sampleStart, sampleEnd);\n\n trackLabel = c.geneticSignatureForThisMasterBarSegment?.trackData?.name || '';\n trackId = ob.trackId;\n sampleStart = ob.sampleStart;\n sampleEnd = ob.sampleEnd;\n } else if (trackId !== ob.trackId) {\n printBarSequenceRange(trackId, trackLabel, sequenceLabel, sampleStart, sampleEnd);\n\n trackLabel = c.geneticSignatureForThisMasterBarSegment?.trackData?.name || '';\n trackId = ob.trackId;\n sampleStart = ob.sampleStart;\n sampleEnd = ob.sampleEnd;\n }\n sampleEnd = ob.sampleEnd;\n\n if (segmentIdx === singleStem.segments.length - 1) {\n printBarSequenceRange(trackId, trackLabel, sequenceLabel, sampleStart, sampleEnd);\n }\n });\n }\n}\n\nconst GlobalAEV3Controller = AEV3Controller.getInstance();\n\n// this console.log won't be printed but i need an entry point for dev injection\nif (Math.random() < 0) {\n console.log('u4F60u660Eu5C31u641Cu65B9u6CD5u806Fu7D61u6211');\n}\n\n// export default GlobalAEV3Controller;\n\nconst InitAndCreateNewAudioContext = () => {\n //@ts-expect-error - a fallback check of webkitAudioContext is used\n const audioContext: AudioContext = new (window.AudioContext || window.webkitAudioContext)({ latencyHint: LATENCY_HINT, sampleRate: SAMPLE_RATE });\n return audioContext;\n};\n\n// do nothing at this moment\nconst trackDataStemsSafeGuarding = (trackData: ITrackForSequence): ITrackForSequence => {\n return trackData;\n};\n\n// Add the functions to the window object\nif (typeof window !== 'undefined') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).GlobalAEV3Controller = GlobalAEV3Controller;\n}\n","import { AEV3Controller, PlayModes, PLAY_MODE_CLASSIC, PLAY_MODE_MIX, PLAY_MODE_INFINITE_MIX, PLAY_MODE_DJ_MIX } from \"../global-aev3-controller\";\nimport { ITrackForSequence } from \"../interface\";\nimport { consoleColorfulMessage } from \"../utils/colorConsole\";\n\n// Track last update to prevent duplicates\nlet lastUpdateSignature = '';\n\nexport function pauseInMusicControl() {\n consoleColorfulMessage(`pauseInMusicControl`, '#ff0000', '#00ff00');\n AEV3Controller.getInstance().pauseOnIOS(-1, false, true);\n /*\n console.log('pausing....')\n console.log(navigator.mediaSession.playbackState);\n const audioControl: HTMLAudioElement = document.getElementById('audio-control') as HTMLAudioElement;\n audioControl.pause();\n navigator.mediaSession.playbackState = 'paused';\n\n // might need to pass this to controller\n AEV3Controller.getInstance().getBarSequenceWithType('seed1')?.cleanBuffersInBufferPlayerProcessor();\n AEV3Controller.getInstance().getBarSequenceWithType('mix1')?.cleanBuffersInBufferPlayerProcessor();\n\n // play silent buffers for 5 mins?\n\n // after that stop all audio and resume at pausing time, leave audio context at suspend state\n \n console.log('%cpaused', 'color: orange');\n */\n}\n\nexport async function resumeInMusicControl() {\n AEV3Controller.getInstance().resumeOnIOS();\n /*\n const liveStream: HTMLAudioElement = document.getElementById('stream-output') as HTMLAudioElement;\n const audioControl: HTMLAudioElement = document.getElementById('audio-control') as HTMLAudioElement;\n\n console.log('%cMusic Control:: play', 'color: red;');\n console.log(audioControl);\n console.log(liveStream);\n console.log(navigator.mediaSession.playbackState);\n audioControl.play().then(()=>{\n console.log('%cAudio Control Plays', 'color: red;');\n })\n navigator.mediaSession.playbackState = 'playing';\n liveStream.play().then(()=>{\n // this does not required if we cannot pause the audio at `PAUSE` handler\n console.log('%cAudio Element Plays', 'color: red;');\n })\n \n AEV3Controller.getInstance().getBarSequenceWithType('seed1').play(AEV3Controller.getInstance().aev3Context);\n AEV3Controller.getInstance().getBarSequenceWithType('mix1').play(AEV3Controller.getInstance().aev3Context);\n \n console.log('%cResumeInMusicControl (note this is async so Audio Plays notice might issue later)', 'color: orange');\n */\n}\n\n/**\n * AEV3 not yet equip the solution to not relying on itself resolve previous and next track yet.\n * But Platform already had it loaded up, so exposing reference to platform, when prev/next function ref updated - the pointer here get updated as well\n * \n * and accessible via the handler\n */\nlet nextTrackRef: (() => void) | null = null;\nlet previousTrackRef: (() => void) | null = null;\n\nexport const updateMediaSessionPrevNextTrackRef = (func: ()=>void, id: 'prev' | 'next') => {\n if (id === 'prev') {\n previousTrackRef = func;\n } else {\n nextTrackRef = func;\n }\n}\n\nexport function setupMediaSession(\n titleName: string = 'Live Stream',\n albumName: string = 'Album Name',\n artistName: string = 'Artist Name',\n customArtworkUrl?: string,\n) {\n // Default STEM player artwork\n const AlbumArtSpLogo96 = './album-art/sp-logo/sp-logo-96.png';\n const AlbumArtSpLogo128 = './album-art/sp-logo/sp-logo-128.png';\n const AlbumArtSpLogo192 = './album-art/sp-logo/sp-logo-192.png';\n const AlbumArtSpLogo256 = './album-art/sp-logo/sp-logo-256.png';\n const AlbumArtSpLogo384 = './album-art/sp-logo/sp-logo-384.png';\n const AlbumArtSpLogo512 = './album-art/sp-logo/sp-logo-512.png';\n\n // Use custom artwork if provided, otherwise fallback to STEM player logos\n const GenericStemArtWork = customArtworkUrl ? [\n { src: customArtworkUrl, sizes: '512x512', type: 'image/jpeg' },\n { src: customArtworkUrl, sizes: '384x384', type: 'image/jpeg' },\n { src: customArtworkUrl, sizes: '256x256', type: 'image/jpeg' },\n { src: customArtworkUrl, sizes: '192x192', type: 'image/jpeg' },\n { src: customArtworkUrl, sizes: '128x128', type: 'image/jpeg' },\n { src: customArtworkUrl, sizes: '96x96', type: 'image/jpeg' },\n ] : [\n { src: AlbumArtSpLogo512, sizes: '512x512', type: 'image/png' },\n { src: AlbumArtSpLogo384, sizes: '384x384', type: 'image/png' },\n { src: AlbumArtSpLogo256, sizes: '256x256', type: 'image/png' },\n { src: AlbumArtSpLogo192, sizes: '192x192', type: 'image/png' },\n { src: AlbumArtSpLogo128, sizes: '128x128', type: 'image/png' },\n { src: AlbumArtSpLogo96, sizes: '96x96', type: 'image/png' },\n ];\n if ('mediaSession' in navigator) {\n // console.log('%csetup mediaSession', 'color: green;')\n navigator.mediaSession.metadata = new MediaMetadata({\n title: titleName,\n artist: artistName,\n album: albumName,\n artwork: GenericStemArtWork,\n });\n\n // Set up action handlers (optional, but useful for media session controls)\n navigator.mediaSession.setActionHandler('play', resumeInMusicControl);\n\n navigator.mediaSession.setActionHandler('pause', pauseInMusicControl);\n\n navigator.mediaSession.setActionHandler('seekbackward', function(details) {\n console.log(details);\n // audioElement.currentTime = Math.max(audioElement.currentTime - (details.seekOffset || 10), 0);\n });\n\n navigator.mediaSession.setActionHandler('seekforward', function(details) {\n console.log(details);\n // audioElement.currentTime = Math.min(audioElement.currentTime + (details.seekOffset || 10), audioElement.duration);\n });\n\n navigator.mediaSession.setActionHandler('previoustrack', function() {\n // Handle previous track action if needed\n });\n\n navigator.mediaSession.setActionHandler('nexttrack', function() {\n // Handle next track action if needed\n });\n \n }\n}\n\n// Helper function to get mode display name\n/*\nfunction getModeDisplayName(playMode: PlayModes): string {\n switch (playMode) {\n case PLAY_MODE_CLASSIC: return 'Classic';\n case PLAY_MODE_MIX: return 'Mix';\n case PLAY_MODE_INFINITE_MIX: return 'Infinite';\n case PLAY_MODE_DJ_MIX: return 'DJ';\n default: return 'Mix';\n }\n}\n*/\n\n// Helper function to get mode separator icon\nfunction getModeSeparator(playMode: PlayModes): string {\n switch (playMode) {\n case PLAY_MODE_MIX: return 'β';\n case PLAY_MODE_INFINITE_MIX: return 'β';\n case PLAY_MODE_DJ_MIX: return 'β';\n default: return 'β';\n }\n}\n\n// Helper function to construct title based on mode\nfunction constructTitle(seedTrack: ITrackForSequence, mixTrack: ITrackForSequence | null, playMode: PlayModes): string {\n if (playMode === PLAY_MODE_CLASSIC) {\n // Classic: Just \"Heartless\" (no separator, no brackets)\n return seedTrack.name;\n } else {\n // Mix modes: \"Heartless ββ SKELETONS\" (symbols tell the story)\n const separator = getModeSeparator(playMode);\n return mixTrack ? `${seedTrack.name} ${separator} ${mixTrack.name}` : seedTrack.name;\n }\n}\n\n// Helper function to construct artist based on mode\nfunction constructArtist(seedTrack: ITrackForSequence, mixTrack: ITrackForSequence | null, playMode: PlayModes): string {\n if (playMode === PLAY_MODE_CLASSIC) {\n // Classic: Just seed artist\n return seedTrack.artistDisplayName;\n } else {\n // Mix modes: Always show both artists with separator\n const separator = getModeSeparator(playMode);\n return mixTrack \n ? `${seedTrack.artistDisplayName} ${separator} ${mixTrack.artistDisplayName}`\n : seedTrack.artistDisplayName;\n }\n}\n\n// New mode-aware setupMediaSession function\nexport function setupMediaSessionModeAware(\n seedTrack: ITrackForSequence,\n mixTrack: ITrackForSequence | null = null,\n playMode: PlayModes = PLAY_MODE_MIX,\n forceUpdate: boolean = false\n) {\n if (!('mediaSession' in navigator)) {\n console.warn('[media-session] MediaSession API not available in this browser');\n return;\n }\n \n // Create signature to prevent duplicate updates\n const updateSignature = `${seedTrack.trackId}-${mixTrack?.trackId || 'none'}-${playMode}`;\n \n // Skip if exact same update (unless forced)\n if (lastUpdateSignature === updateSignature && !forceUpdate) {\n return;\n }\n \n const title = constructTitle(seedTrack, mixTrack, playMode);\n const artist = constructArtist(seedTrack, mixTrack, playMode);\n \n lastUpdateSignature = updateSignature;\n \n // Use seed track artwork, fallback to STEM logos\n const artworkUrl = seedTrack.artwork;\n const artwork = artworkUrl ? [\n { src: `${artworkUrl}?w=400`, sizes: '512x512', type: 'image/jpeg' },\n { src: `${artworkUrl}?w=400`, sizes: '384x384', type: 'image/jpeg' },\n { src: `${artworkUrl}?w=160`, sizes: '256x256', type: 'image/jpeg' },\n { src: `${artworkUrl}?w=160`, sizes: '192x192', type: 'image/jpeg' },\n { src: `${artworkUrl}?w=160`, sizes: '128x128', type: 'image/jpeg' },\n { src: `${artworkUrl}?w=160`, sizes: '96x96', type: 'image/jpeg' },\n ] : [\n { src: '/album-art/sp-logo/sp-logo-512.png', sizes: '512x512', type: 'image/png' },\n { src: '/album-art/sp-logo/sp-logo-384.png', sizes: '384x384', type: 'image/png' },\n { src: '/album-art/sp-logo/sp-logo-256.png', sizes: '256x256', type: 'image/png' },\n { src: '/album-art/sp-logo/sp-logo-192.png', sizes: '192x192', type: 'image/png' },\n { src: '/album-art/sp-logo/sp-logo-128.png', sizes: '128x128', type: 'image/png' },\n { src: '/album-art/sp-logo/sp-logo-96.png', sizes: '96x96', type: 'image/png' },\n ];\n\n // Set media session metadata directly\n navigator.mediaSession.playbackState = 'playing';\n \n // Create MediaMetadata object\n const metadata = new MediaMetadata({\n title: title,\n artist: artist,\n artwork: artwork,\n });\n \n navigator.mediaSession.metadata = metadata;\n \n // Force browser to process the update (essential for some browsers/OS)\n setTimeout(() => {\n try {\n navigator.mediaSession.setPositionState({\n duration: 180,\n playbackRate: 1.0,\n position: 0\n });\n } catch (e) {\n // Silently handle browsers that don't support position state\n }\n }, 100);\n\n // Set up action handlers\n navigator.mediaSession.setActionHandler('play', resumeInMusicControl);\n navigator.mediaSession.setActionHandler('pause', pauseInMusicControl);\n \n navigator.mediaSession.setActionHandler('seekbackward', function(details) {\n console.log('Seek backward:', details);\n });\n\n navigator.mediaSession.setActionHandler('seekforward', function(details) {\n console.log('Seek forward:', details);\n });\n\n navigator.mediaSession.setActionHandler('previoustrack', function() {\n if (previousTrackRef && typeof previousTrackRef === 'function') {\n console.log('Previous track requested');\n previousTrackRef();\n }\n });\n\n navigator.mediaSession.setActionHandler('nexttrack', function() {\n if (nextTrackRef && typeof nextTrackRef === 'function') {\n console.log('Next track requested');\n nextTrackRef();\n }\n });\n\n // Clean implementation - no extra logging needed\n}\n\n// Convenience function to update media session when mode changes\nexport function updateMediaSessionForModeChange(modeOverride?: PlayModes) {\n console.log('[media-session] updateMediaSessionForModeChange called');\n \n try {\n const controller = AEV3Controller.getInstance();\n const currentMode = modeOverride || controller.getPlayMode();\n console.log(`[media-session] Using mode: ${currentMode} (override: ${modeOverride ? 'yes' : 'no'}, passed: ${modeOverride})`);\n \n // First try to get track data from bar sequences\n const seedBar = controller.getBarSequenceWithType('seed1');\n const mixBar = controller.getBarSequenceWithType('mix1');\n \n if (seedBar?.trackData) {\n console.log(`[media-session] Using bar sequence data - seedTrack:`, seedBar.trackData.name, `mixTrack:`, mixBar?.trackData?.name || 'none');\n setupMediaSessionModeAware(\n seedBar.trackData, \n mixBar?.trackData || null, \n currentMode\n );\n } else {\n // Fallback: try current track objects (more reliable for mode changes)\n const seedTrack = controller.getCurrentSeedTrackObject();\n const mixTrack = controller.getCurrentMixTrackObject();\n \n if (seedTrack) {\n console.log(`[media-session] Using current track objects fallback - seedTrack:`, seedTrack.name, `mixTrack:`, mixTrack?.name || 'none');\n setupMediaSessionModeAware(seedTrack, mixTrack, currentMode);\n } else {\n console.warn('[media-session] Update skipped - no track data available in bar sequences or current objects');\n console.log(`[media-session] Debug - seedBar:`, seedBar, `mixBar:`, mixBar, `seedTrack:`, seedTrack, `mixTrack:`, mixTrack);\n }\n }\n } catch (error) {\n console.error('[media-session] Update failed:', error);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// (window as any).setupMediaSession = setupMediaSession;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(window as any).setupMediaSessionModeAware = setupMediaSessionModeAware;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(window as any).updateMediaSessionForModeChange = updateMediaSessionForModeChange;"]}
|