@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.
Files changed (67) hide show
  1. package/README.md +253 -0
  2. package/dist/chat-actions-54Z6URC4.js +7 -0
  3. package/dist/chat-actions-54Z6URC4.js.map +1 -0
  4. package/dist/chunk-56PWIP7O.js +1029 -0
  5. package/dist/chunk-56PWIP7O.js.map +1 -0
  6. package/dist/chunk-AAVC7KUW.js +145 -0
  7. package/dist/chunk-AAVC7KUW.js.map +1 -0
  8. package/dist/chunk-KCOOE2OP.js +1764 -0
  9. package/dist/chunk-KCOOE2OP.js.map +1 -0
  10. package/dist/chunk-LO74ZJ4H.js +23923 -0
  11. package/dist/chunk-LO74ZJ4H.js.map +1 -0
  12. package/dist/chunk-OFGZURP6.js +247 -0
  13. package/dist/chunk-OFGZURP6.js.map +1 -0
  14. package/dist/chunk-OYNES5W3.js +3085 -0
  15. package/dist/chunk-OYNES5W3.js.map +1 -0
  16. package/dist/chunk-QQ5NZTHT.js +336 -0
  17. package/dist/chunk-QQ5NZTHT.js.map +1 -0
  18. package/dist/chunk-TBXCZFAY.js +13713 -0
  19. package/dist/chunk-TBXCZFAY.js.map +1 -0
  20. package/dist/chunk-U44X6QP5.js +281 -0
  21. package/dist/chunk-U44X6QP5.js.map +1 -0
  22. package/dist/chunk-UKMELGZL.js +27 -0
  23. package/dist/chunk-UKMELGZL.js.map +1 -0
  24. package/dist/components/DAWView.d.ts +19 -0
  25. package/dist/components/DAWView.js +11 -0
  26. package/dist/components/DAWView.js.map +1 -0
  27. package/dist/daw-controller-BjRWcTol.d.ts +339 -0
  28. package/dist/engine/daw-controller.d.ts +3 -0
  29. package/dist/engine/daw-controller.js +5 -0
  30. package/dist/engine/daw-controller.js.map +1 -0
  31. package/dist/engine/daw-import-stem-fm-config.d.ts +224 -0
  32. package/dist/engine/daw-import-stem-fm-config.js +7 -0
  33. package/dist/engine/daw-import-stem-fm-config.js.map +1 -0
  34. package/dist/fetchStationTracks-SKFT4V3U.js +3 -0
  35. package/dist/fetchStationTracks-SKFT4V3U.js.map +1 -0
  36. package/dist/index.d.ts +308 -0
  37. package/dist/index.js +332 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/interface-DaRj7RkY.d.ts +66 -0
  40. package/dist/interfaces-5ZlG0Y4Y.d.ts +549 -0
  41. package/dist/media-session-XTP6PP7Q.js +3 -0
  42. package/dist/media-session-XTP6PP7Q.js.map +1 -0
  43. package/dist/note-detection-PPLM7R2H.js +148 -0
  44. package/dist/note-detection-PPLM7R2H.js.map +1 -0
  45. package/dist/sampler-audio-B7MBG3YN.js +3 -0
  46. package/dist/sampler-audio-B7MBG3YN.js.map +1 -0
  47. package/dist/sampler-store-QPHANXYP.js +3 -0
  48. package/dist/sampler-store-QPHANXYP.js.map +1 -0
  49. package/dist/services/track-search-api.d.ts +152 -0
  50. package/dist/services/track-search-api.js +4 -0
  51. package/dist/services/track-search-api.js.map +1 -0
  52. package/dist/store/daw-auth-store.d.ts +31 -0
  53. package/dist/store/daw-auth-store.js +3 -0
  54. package/dist/store/daw-auth-store.js.map +1 -0
  55. package/dist/store/daw-session-store.d.ts +255 -0
  56. package/dist/store/daw-session-store.js +3 -0
  57. package/dist/store/daw-session-store.js.map +1 -0
  58. package/dist/vite/index.d.ts +46 -0
  59. package/dist/vite/index.js +94 -0
  60. package/dist/vite/index.js.map +1 -0
  61. package/dist/workers/analysis-worker.js +379 -0
  62. package/dist/workers/buffer-player-processor-202602.lavv8e32-ts.js +1 -0
  63. package/dist/workers/daw-stem-processor.js +228 -0
  64. package/dist/workers/manifest.json +10 -0
  65. package/dist/workers/phase-vocoder3.js +920 -0
  66. package/dist/workers/realtime-pitch-shift-processor.js +2 -0
  67. package/package.json +151 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daw/primitives/audio-buffer-bridge.ts","../src/daw/components/DAWTrackHeader.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Bridge between AudioSourceSequence (cache layer) and the DAW decode pipeline.\n * Decoupled from AEV3Controller - takes the AudioSourceSequence directly.\n */\n\nimport type { AudioSourceSequence } from '@/stem-audio-engine-v3/cache/mp4-sequence';\n\nexport const GET_AUDIO_BUFFER_MESSAGE_NOT_INIT = 'audio_source_not_initialised';\nexport const GET_AUDIO_BUFFER_MESSAGE_NOT_CACHED = 'moof_not_cached_yet';\nexport const GET_AUDIO_BUFFER_MESSAGE_ERROR = 'moof_box_error';\n\nexport interface AudioBufferResult {\n audioBuffer: AudioBuffer | null;\n totalTimeElapsed: number;\n error: string | null;\n message: string;\n signature: string;\n}\n\n/**\n * Request an AudioBuffer for a specific sample range from a given AudioSourceSequence.\n * This is the decoupled equivalent of getAudioBufferUtil from the streaming engine.\n */\nexport const getAudioBufferFromSource = async (\n audioSourceSequence: AudioSourceSequence | null,\n sequenceIdx: number,\n sampleStart: number,\n sampleEnd: number,\n decodingQueueIndex: number,\n signature: string,\n): Promise<AudioBufferResult> => {\n if (!audioSourceSequence) {\n return {\n audioBuffer: null,\n totalTimeElapsed: -1,\n error: 'AudioSourceSequence not provided',\n message: GET_AUDIO_BUFFER_MESSAGE_NOT_INIT,\n signature,\n };\n }\n\n try {\n const result = await audioSourceSequence.getAudioBuffer(\n sequenceIdx,\n sampleStart,\n sampleEnd,\n decodingQueueIndex,\n signature\n );\n\n const [audioBuffer, totalTimeElapsed, , , , , resultSignature, message] = result;\n return {\n audioBuffer,\n totalTimeElapsed,\n error: audioBuffer === null ? GET_AUDIO_BUFFER_MESSAGE_NOT_CACHED : null,\n message,\n signature: resultSignature,\n };\n } catch (err) {\n if (err?.toString().includes('sequence is not initialised yet')) {\n return {\n audioBuffer: null,\n totalTimeElapsed: -1,\n error: GET_AUDIO_BUFFER_MESSAGE_NOT_INIT,\n message: GET_AUDIO_BUFFER_MESSAGE_NOT_INIT,\n signature,\n };\n }\n return {\n audioBuffer: null,\n totalTimeElapsed: -1,\n error: err?.toString() ?? 'unknown error',\n message: GET_AUDIO_BUFFER_MESSAGE_ERROR,\n signature,\n };\n }\n};\n","/**\n * DAWTrackHeader – Compact sidebar panel for a single track.\n * Each stem has its own volume slider — that's the primary control.\n * No track-level master volume; stem volumes ARE the mix.\n */\n\nimport React, { useCallback, useRef, useState } from 'react';\nimport { useDAWSessionStore } from '../store/daw-session-store';\nimport { STEM_COLORS, type DAWTrack } from '../interfaces';\nimport { DAWController } from '../engine/daw-controller';\nimport { theme, useThemeMode } from '../theme/variables';\n\nconst STEM_ICONS = ['♪', '🎤', '🎵', '⬡'];\n\ninterface DAWTrackHeaderProps {\n track: DAWTrack;\n}\n\nexport const DAWTrackHeader: React.FC<DAWTrackHeaderProps> = ({ track }) => {\n useThemeMode();\n const [showBeatNudge, setShowBeatNudge] = useState(false);\n const handleRemove = useCallback(() => {\n DAWController.getInstance().removeTrack(track.id);\n }, [track.id]);\n\n return (\n <div className=\"border-b px-3 py-2\" style={{ borderColor: 'rgba(255,255,255,0.04)' }}>\n {/* Track info */}\n <div className=\"flex items-center gap-2 mb-2\">\n {track.artwork && (\n <img src={track.artwork} alt=\"\" className=\"w-5 h-5 rounded-sm object-cover\" />\n )}\n <span className=\"text-[11px] font-medium text-white truncate flex-1\">{track.displayName}</span>\n <span className=\"text-[9px]\" style={{ color: 'rgba(255,255,255,0.3)' }}>{Math.round(track.nativeBpm)}</span>\n <button\n onClick={() => setShowBeatNudge((v) => !v)}\n className=\"text-[8px] font-medium rounded transition-all\"\n style={{\n padding: '1px 4px',\n background: showBeatNudge ? 'rgba(255,214,0,0.12)' : 'rgba(255,255,255,0.04)',\n color: showBeatNudge ? '#FFD600' : 'rgba(255,255,255,0.25)',\n border: showBeatNudge ? '1px solid rgba(255,214,0,0.2)' : '1px solid transparent',\n }}\n title=\"Beat grid nudge\"\n >\n Grid\n </button>\n <button\n onClick={handleRemove}\n className=\"text-[9px] transition-colors ml-1\"\n style={{ color: 'rgba(255,255,255,0.25)' }}\n >\n ✕\n </button>\n </div>\n\n {/* Beat grid nudge controls */}\n {showBeatNudge && (\n <BeatGridNudge trackId={track.id} currentOffset={track.beatGridOffsetBeats} />\n )}\n\n {/* Per-stem channel strips */}\n <div className=\"space-y-1\">\n {track.channels.map((ch) => (\n <StemStrip\n key={ch.stemIndex}\n trackId={track.id}\n stemIndex={ch.stemIndex}\n label={ch.label}\n volume={ch.volume}\n muted={ch.muted}\n visible={ch.visible}\n />\n ))}\n </div>\n </div>\n );\n};\n\n// ── Beat Grid Nudge ─────────────────────────────────────────────────\n\nconst NUDGE_AMOUNTS = [\n { label: '-1', value: -1, title: 'Shift grid back 1 beat' },\n { label: '-½', value: -0.5, title: 'Shift grid back half a beat' },\n { label: '-¼', value: -0.25, title: 'Shift grid back a quarter beat' },\n { label: '+¼', value: 0.25, title: 'Shift grid forward a quarter beat' },\n { label: '+½', value: 0.5, title: 'Shift grid forward half a beat' },\n { label: '+1', value: 1, title: 'Shift grid forward 1 beat' },\n];\n\nconst BeatGridNudge: React.FC<{ trackId: string; currentOffset: number }> = ({ trackId, currentOffset }) => {\n const setBeatGridOffset = useDAWSessionStore((s) => s.setTrackBeatGridOffset);\n\n const handleNudge = useCallback((delta: number) => {\n const newOffset = currentOffset + delta;\n setBeatGridOffset(trackId, newOffset);\n DAWController.getInstance().reloadTrackBarMap(trackId);\n }, [trackId, currentOffset, setBeatGridOffset]);\n\n const handleReset = useCallback(() => {\n setBeatGridOffset(trackId, 0);\n DAWController.getInstance().reloadTrackBarMap(trackId);\n }, [trackId, setBeatGridOffset]);\n\n const displayOffset = currentOffset === 0\n ? '0'\n : `${currentOffset > 0 ? '+' : ''}${currentOffset % 1 === 0 ? currentOffset : currentOffset.toFixed(2)} beat${Math.abs(currentOffset) !== 1 ? 's' : ''}`;\n\n return (\n <div\n className=\"mb-2 rounded-lg\"\n style={{\n padding: '6px 8px',\n background: 'rgba(255,255,255,0.02)',\n border: '1px solid rgba(255,255,255,0.04)',\n }}\n >\n <div className=\"flex items-center gap-1.5 mb-1.5\">\n <span className=\"text-[7px] font-semibold tracking-wider uppercase\" style={{ color: 'rgba(255,255,255,0.25)' }}>\n Beat Grid\n </span>\n <span className=\"text-[8px] font-mono flex-1\" style={{ color: currentOffset !== 0 ? '#FFD600' : 'rgba(255,255,255,0.2)' }}>\n {displayOffset}\n </span>\n {currentOffset !== 0 && (\n <button\n onClick={handleReset}\n className=\"text-[7px] font-semibold rounded transition-all\"\n style={{\n padding: '1px 5px',\n background: 'rgba(239,68,68,0.08)',\n color: 'rgba(251,113,133,0.7)',\n border: '1px solid rgba(239,68,68,0.15)',\n }}\n >\n Reset\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n {NUDGE_AMOUNTS.map((nudge) => (\n <button\n key={nudge.value}\n onClick={() => handleNudge(nudge.value)}\n title={nudge.title}\n className=\"flex-1 text-[8px] font-semibold rounded transition-all\"\n style={{\n padding: '3px 0',\n background: 'rgba(255,255,255,0.04)',\n color: 'rgba(255,255,255,0.4)',\n border: '1px solid rgba(255,255,255,0.06)',\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = 'rgba(255,255,255,0.08)'; e.currentTarget.style.color = 'rgba(255,255,255,0.7)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = 'rgba(255,255,255,0.04)'; e.currentTarget.style.color = 'rgba(255,255,255,0.4)'; }}\n >\n {nudge.label}\n </button>\n ))}\n </div>\n </div>\n );\n};\n\n// ──────────────────────────────────────────────────────────────────────\n\ninterface StemStripProps {\n trackId: string;\n stemIndex: number;\n label: string;\n volume: number;\n muted: boolean;\n visible: boolean;\n}\n\nconst StemStrip: React.FC<StemStripProps> = ({\n trackId, stemIndex, label, volume, muted, visible,\n}) => {\n const store = useDAWSessionStore();\n const color = STEM_COLORS[stemIndex];\n const icon = STEM_ICONS[stemIndex];\n const volPercent = Math.round(volume * 100);\n\n const toggleVisible = useCallback(() => {\n store.setChannelVisible(trackId, stemIndex, !visible);\n if (visible) store.setChannelMuted(trackId, stemIndex, true);\n else store.setChannelMuted(trackId, stemIndex, false);\n DAWController.getInstance().syncGainsForTrack(trackId);\n }, [trackId, stemIndex, visible]);\n\n const toggleMute = useCallback(() => {\n store.setChannelMuted(trackId, stemIndex, !muted);\n DAWController.getInstance().syncGainsForTrack(trackId);\n }, [trackId, stemIndex, muted]);\n\n const handleVolume = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n store.setChannelVolume(trackId, stemIndex, parseFloat(e.target.value));\n DAWController.getInstance().syncGainsForTrack(trackId);\n }, [trackId, stemIndex]);\n\n return (\n <div\n className=\"flex items-center gap-1.5 rounded py-0.5 transition-opacity\"\n style={{ opacity: visible ? 1 : 0.25 }}\n >\n <button\n onClick={toggleVisible}\n className=\"w-5 h-5 flex items-center justify-center rounded flex-shrink-0 text-[10px] transition-all\"\n style={{\n backgroundColor: visible ? color : 'transparent',\n border: visible ? 'none' : `1px solid ${color}33`,\n color: visible ? '#000' : color + '66',\n }}\n title={visible ? `Remove ${label}` : `Add ${label}`}\n >\n {icon}\n </button>\n\n {visible ? (\n <>\n <VolumeFader color={color} volume={volume} onChange={handleVolume} />\n <span className=\"text-[8px] w-5 text-right tabular-nums flex-shrink-0 font-mono\" style={{ color: 'rgba(255,255,255,0.3)' }}>\n {volPercent}\n </span>\n <button\n onClick={toggleMute}\n className=\"text-[7px] font-semibold w-4 h-4 flex items-center justify-center flex-shrink-0 transition-all\"\n style={{\n backgroundColor: muted ? 'rgba(255,69,58,0.1)' : 'rgba(255,255,255,0.04)',\n color: muted ? 'rgba(255,105,97,0.85)' : 'rgba(255,255,255,0.3)',\n borderRadius: 6,\n }}\n title={muted ? `Unmute ${label}` : `Mute ${label}`}\n >M</button>\n </>\n ) : (\n <span className=\"text-[9px] truncate\" style={{ color: 'rgba(255,255,255,0.4)' }}>{label}</span>\n )}\n </div>\n );\n};\n\n// ──────────────────────────────────────────────────────────────────────\n// VolumeFader — same Braun-fader contract as the inspector's\n// `FaderParam`: a thin, fully-rounded ink rail with a small accent\n// pill for the thumb. No tick row, no glow. The pill sits at\n// `volume × trackWidth` and the rail to its left is filled in the\n// stem colour so the channel still reads as \"this much is on\" at a\n// glance. Designed for the dense per-stem strips in the track\n// header (height: 14 px, sliders ~80 px wide).\n\ninterface VolumeFaderProps {\n color: string;\n volume: number;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\nconst VolumeFader: React.FC<VolumeFaderProps> = ({ color, volume, onChange }) => {\n useThemeMode();\n const trackRef = useRef<HTMLDivElement>(null);\n const pct = Math.max(0, Math.min(1, volume));\n\n const updateFromPointer = (clientX: number) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return;\n const p = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n onChange({ target: { value: String(Math.round(p * 100) / 100) } } as React.ChangeEvent<HTMLInputElement>);\n };\n\n return (\n <div\n ref={trackRef}\n style={{\n flex: 1, height: 14, position: 'relative',\n display: 'flex', alignItems: 'center',\n cursor: 'pointer',\n }}\n onPointerDown={(e) => { e.preventDefault(); (e.target as HTMLElement).setPointerCapture(e.pointerId); updateFromPointer(e.clientX); }}\n onPointerMove={(e) => { if (e.buttons > 0) updateFromPointer(e.clientX); }}\n >\n {/* Rail — full-width faint ink, fully rounded. */}\n <div style={{\n position: 'absolute',\n left: 0, right: 0,\n top: '50%', transform: 'translateY(-50%)',\n height: 2,\n background: theme.border.default,\n borderRadius: 1,\n }} />\n {/* Filled portion — stem colour from rail-start to thumb. */}\n <div style={{\n position: 'absolute',\n left: 0,\n width: `${pct * 100}%`,\n top: '50%', transform: 'translateY(-50%)',\n height: 2,\n background: color,\n opacity: 0.9,\n borderRadius: 1,\n }} />\n {/* Thumb — fully-rounded accent pill. */}\n <div style={{\n position: 'absolute',\n left: `${pct * 100}%`,\n top: '50%', transform: 'translate(-50%, -50%)',\n width: 3, height: 12,\n borderRadius: 1.5,\n background: color,\n zIndex: 2,\n }} />\n </div>\n );\n};\n"]}
@@ -0,0 +1,66 @@
1
+ type SegmentDetails = {
2
+ 'infinite-quick': {
3
+ startingIndex: number;
4
+ endingIndex: number;
5
+ totalBarCountsRecognisedAtAEV3Parser: number;
6
+ barExepctedFromIndicesReturned: number;
7
+ recommendedTransitionLength: number;
8
+ };
9
+ 'infinite-dj': {
10
+ startingIndex: number;
11
+ endingIndex: number;
12
+ totalBarCountsRecognisedAtAEV3Parser: number;
13
+ barExepctedFromIndicesReturned: number;
14
+ recommendedTransitionLength: number;
15
+ };
16
+ normal: {
17
+ startingIndex: number;
18
+ endingIndex: number;
19
+ totalBarCountsRecognisedAtAEV3Parser: number;
20
+ barExepctedFromIndicesReturned: number;
21
+ recommendedTransitionLength: number;
22
+ };
23
+ };
24
+
25
+ type UUID = `${string}-${string}-${string}-${string}-${string}`;
26
+ type TStemType = '0_other' | '1_vocals' | '2_bass' | '3_drums';
27
+ interface ITrackForSequenceNoBeats {
28
+ artistDisplayName: string;
29
+ trackDisplayName: string;
30
+ colors: string[];
31
+ name: string;
32
+ trackId: UUID;
33
+ url: string;
34
+ tempoOrigSz: number;
35
+ trackMixType: 'seed' | 'mix' | null;
36
+ webMixChunkUrl: string;
37
+ webMixChunkCount: number;
38
+ duration: number;
39
+ trackStatus: string;
40
+ switchInTimes: number[];
41
+ color1Hex: string;
42
+ color2Hex: string;
43
+ isClaimed: boolean;
44
+ artwork: string;
45
+ artworkGlowColor: string;
46
+ key: IMusicKey;
47
+ bpm: number;
48
+ tonality: IMusicTonality;
49
+ beatSource: number;
50
+ __falseTrack: boolean;
51
+ }
52
+ interface ITrackForSequence extends ITrackForSequenceNoBeats {
53
+ beats: {
54
+ frame: number;
55
+ number: number;
56
+ timestamp: number;
57
+ }[];
58
+ indices: SegmentDetails;
59
+ segmentInfo: [number, number, number][];
60
+ __durationForValidation1: number;
61
+ __durationForValidation2: number;
62
+ }
63
+ type IMusicKey = 'A' | 'A#' | 'B' | 'C' | 'C#' | 'D' | 'D#' | 'E' | 'F' | 'F#' | 'G' | 'G#';
64
+ type IMusicTonality = 'minor' | 'major';
65
+
66
+ export type { ITrackForSequence as I, TStemType as T, IMusicKey as a, IMusicTonality as b };
@@ -0,0 +1,549 @@
1
+ import { a as IMusicKey, b as IMusicTonality, I as ITrackForSequence, T as TStemType } from './interface-DaRj7RkY.js';
2
+
3
+ /**
4
+ * StemEffectChain — Per-stem real-time effect chain using Web Audio API.
5
+ *
6
+ * Signal path: input → EQ → Compressor → Reverb → Delay → output
7
+ *
8
+ * Each effect can be bypassed independently. When bypassed, the signal
9
+ * routes through a dry path. All nodes are pre-created so toggling
10
+ * is glitch-free (just reconnect, no allocation).
11
+ */
12
+ interface EQParams {
13
+ enabled: boolean;
14
+ lowGain: number;
15
+ midGain: number;
16
+ highGain: number;
17
+ lowFreq: number;
18
+ highFreq: number;
19
+ }
20
+ interface CompressorParams {
21
+ enabled: boolean;
22
+ threshold: number;
23
+ ratio: number;
24
+ attack: number;
25
+ release: number;
26
+ knee: number;
27
+ }
28
+ interface ReverbParams {
29
+ enabled: boolean;
30
+ mix: number;
31
+ decay: number;
32
+ }
33
+ interface DelayParams {
34
+ enabled: boolean;
35
+ time: number;
36
+ feedback: number;
37
+ mix: number;
38
+ }
39
+ interface StemEffects {
40
+ eq: EQParams;
41
+ compressor: CompressorParams;
42
+ reverb: ReverbParams;
43
+ delay: DelayParams;
44
+ }
45
+ declare class StemEffectChain {
46
+ private ctx;
47
+ readonly input: GainNode;
48
+ readonly output: GainNode;
49
+ private eqLow;
50
+ private eqMid;
51
+ private eqHigh;
52
+ private compressor;
53
+ private reverbDry;
54
+ private reverbWet;
55
+ private convolver;
56
+ private delayNode;
57
+ private delayFeedback;
58
+ private delayDry;
59
+ private delayWet;
60
+ private eqBypass;
61
+ private compBypass;
62
+ private reverbBypass;
63
+ private delayBypass;
64
+ private postEq;
65
+ private postComp;
66
+ private postReverb;
67
+ private _params;
68
+ constructor(ctx: AudioContext);
69
+ /**
70
+ * Rebuild the full routing graph based on current bypass states.
71
+ * Uses disconnect-all then reconnect to avoid orphaned connections.
72
+ */
73
+ private rebuildRouting;
74
+ /** Generate a synthetic impulse response for reverb */
75
+ private generateImpulse;
76
+ get params(): StemEffects;
77
+ updateEQ(p: Partial<EQParams>): void;
78
+ updateCompressor(p: Partial<CompressorParams>): void;
79
+ updateReverb(p: Partial<ReverbParams>): void;
80
+ updateDelay(p: Partial<DelayParams>): void;
81
+ applyAll(fx: StemEffects): void;
82
+ dispose(): void;
83
+ }
84
+
85
+ /**
86
+ * Extracted bar composition primitives - decoupled from AEV3Controller.
87
+ * These are pure functions for converting beat grids to bar boundaries
88
+ * and computing speed ratios for tempo matching.
89
+ */
90
+ interface IBeat {
91
+ frame: number;
92
+ number: number;
93
+ timestamp: number;
94
+ }
95
+ interface IBarMapping {
96
+ sampleStart: number;
97
+ sampleEnd: number;
98
+ duration: number;
99
+ }
100
+ /**
101
+ * Convert a fractional bar position to a sample offset in the source buffer,
102
+ * respecting per-bar tempo variation encoded in `barMapping`.
103
+ *
104
+ * Each `IBarMapping` entry has its own `(sampleStart, duration)`, so this is
105
+ * piecewise-linear — bar N starts at `barMapping[N].sampleStart` and bar
106
+ * N + frac sits `frac × duration` samples into that entry.
107
+ *
108
+ * IMPORTANT: this is the canonical bar→sample function. The audio scheduler
109
+ * (DAWController) uses it to schedule playback, and the timeline waveform
110
+ * renderer uses it to slice the mipmap. If the renderer used a linear
111
+ * `bar / totalBars × totalSamples` formula instead, the drawn waveform
112
+ * would drift away from the actual audio whenever bars have unequal
113
+ * durations (i.e. for any non-click-track content) — making peaks appear
114
+ * at the wrong position relative to the playhead.
115
+ *
116
+ * Supports beat-level precision (e.g. `2.25` = beat 2 of bar 2).
117
+ */
118
+ declare function barToSample(bar: number, barMapping: IBarMapping[]): number;
119
+ declare const composeBarsFromBeats: (beats: IBeat[]) => IBarMapping[];
120
+ declare const composeBarsFromBeatsSmoothed: (beats: IBeat[], sampleRate?: number, threshold?: number) => IBarMapping[];
121
+ declare const resolveTimeOfDownbeatFromBarIndex: (beats: IBeat[], barIndex: number) => number;
122
+ declare const resolveSampleLocOfDownbeatFromBarIndex: (beats: IBeat[], barIndex: number) => number;
123
+ /**
124
+ * Compute the median bar duration from a set of bar mappings, in samples.
125
+ */
126
+ declare const medianBarDuration: (bars: IBarMapping[]) => number;
127
+ /**
128
+ * Convert bar duration in samples (at 48 kHz) to BPM, assuming 4/4 time.
129
+ */
130
+ declare const barDurationToBpm: (barDurationSamples: number) => number;
131
+ /**
132
+ * Convert BPM to bar duration in samples (at 48 kHz), assuming 4/4 time.
133
+ */
134
+ declare const bpmToBarDuration: (bpm: number) => number;
135
+
136
+ /**
137
+ * Extracted tempo matching and pitch shift primitives.
138
+ * Pure functions for computing speed ratios and pitch corrections
139
+ * when matching a track to a master tempo.
140
+ */
141
+
142
+ type TempoRatio = 0.5 | 1 | 2;
143
+ interface ITempoMatch {
144
+ targetBarLength: number;
145
+ playbackRate: number;
146
+ ratio: TempoRatio;
147
+ }
148
+ /**
149
+ * Given a master bar length and a track's native bar length (both in samples at 48 kHz),
150
+ * find the best tempo match (half, same, or double speed).
151
+ */
152
+ declare const calculateTempoMatch: (masterBarLength: number, trackBarLength: number) => ITempoMatch;
153
+ /**
154
+ * Compute the speed ratio for a single bar to match the master tempo.
155
+ * speedRatio > 1 means the bar must play faster, < 1 means slower.
156
+ */
157
+ declare const computeBarSpeedRatio: (barDurationSamples: number, targetBarLengthSamples: number, ratio: TempoRatio) => number;
158
+ /**
159
+ * Convert a playback rate (speed ratio) to the pitch change in semitones.
160
+ */
161
+ declare const playbackRateToSemitones: (playbackRate: number) => number;
162
+ /**
163
+ * Convert a semitone offset to a pitch shift multiplier suitable for worklets.
164
+ */
165
+ declare const semitonesToPitchFactor: (semitones: number) => number;
166
+ declare const keyToSemitones: Record<IMusicKey, number>;
167
+ declare const semitonesToKey: Record<number, IMusicKey>;
168
+ declare enum PitchShiftStrategy {
169
+ DEFAULT = "DEFAULT",
170
+ PRESERVE_MIX_KEY = "PRESERVE_MIX_KEY",
171
+ MATCH_SEED_KEY = "MATCH_SEED_KEY",
172
+ NO_SHIFT = "NO_SHIFT",
173
+ KEY_PRESERVE = "KEY_PRESERVE"
174
+ }
175
+ /**
176
+ * Compute the pitch shift (in semitones) needed to harmonically match a track
177
+ * to a reference key, accounting for tempo-induced pitch drift.
178
+ */
179
+ declare const computePitchShift: (refKey: IMusicKey, refTonality: IMusicTonality, refBarLength: number, trackKey: IMusicKey, trackTonality: IMusicTonality, trackBarLength: number, strategy?: PitchShiftStrategy) => number;
180
+
181
+ interface CamelotKey {
182
+ number: number;
183
+ letter: 'A' | 'B';
184
+ label: string;
185
+ }
186
+ declare const toCamelot: (key: IMusicKey, tonality: IMusicTonality) => CamelotKey | null;
187
+ type CamelotMatchType = 'exact' | 'adjacent' | 'relative' | 'diagonal' | 'none';
188
+ /**
189
+ * Camelot wheel compatibility rules. The 6 compatible positions around any
190
+ * reference X (e.g. 8A) are:
191
+ * • exact: X itself (8A)
192
+ * • adjacent: same letter, ±1 (7A, 9A)
193
+ * • relative: same number, opposite letter (8B)
194
+ * • diagonal: opposite letter, ±1 (energy/mood) (7B, 9B)
195
+ * This yields 6 compatible options regardless of tonality.
196
+ */
197
+ declare const camelotMatchType: (a: CamelotKey, b: CamelotKey) => CamelotMatchType;
198
+ /**
199
+ * Transpose a key by a number of semitones.
200
+ * Returns the new key and tonality (tonality is preserved).
201
+ */
202
+ declare const transposeKey: (key: IMusicKey, tonality: IMusicTonality, semitones: number) => {
203
+ key: IMusicKey;
204
+ tonality: IMusicTonality;
205
+ };
206
+ interface TransposeSuggestion {
207
+ semitones: number;
208
+ resultKey: IMusicKey;
209
+ resultTonality: IMusicTonality;
210
+ resultCamelot: CamelotKey;
211
+ matchType: CamelotMatchType;
212
+ label: string;
213
+ }
214
+ /**
215
+ * Compute suggested transpose values for a track relative to other tracks.
216
+ * Returns suggestions sorted by match quality (exact first) then minimal semitone shift.
217
+ */
218
+ declare const computeTransposeSuggestions: (trackKey: IMusicKey, trackTonality: IMusicTonality, otherTrackKeys: {
219
+ key: IMusicKey;
220
+ tonality: IMusicTonality;
221
+ }[]) => TransposeSuggestion[];
222
+
223
+ interface PitchEngineSettings {
224
+ formantOption: 'preserved' | 'shifted';
225
+ pitchOption: 'highSpeed' | 'highQuality' | 'highConsistency';
226
+ engineOption: 'faster' | 'finer';
227
+ /** Pitch delay (ms) inside the Rubberband worklet — controls alignment between
228
+ * instant speed changes and delayed pitch changes. Higher = pitch applies later. */
229
+ pitchDelayMs: number;
230
+ }
231
+ declare const DEFAULT_PITCH_SETTINGS: PitchEngineSettings;
232
+ /** Active tool in the DAW toolbar. */
233
+ type DAWToolMode = 'pointer' | 'hand' | 'knife' | 'eraser' | 'resample';
234
+ /** Identifies a single stem lane on the timeline. */
235
+ interface StemId {
236
+ trackId: string;
237
+ stemIndex: number;
238
+ }
239
+ declare const stemIdKey: (s: StemId) => string;
240
+ /** A selected bar range on a stem (supports sub-bar / beat-level precision). */
241
+ interface StemSelectionRange {
242
+ trackId: string;
243
+ stemIndex: number;
244
+ /** Start in local bars (fractional — 0.25 = beat 2 of bar 0) */
245
+ startBar: number;
246
+ /** End in local bars (fractional) */
247
+ endBar: number;
248
+ }
249
+ /**
250
+ * Compute the union bar range of a set of selections (all expected to be on
251
+ * the same track). Returns null if the array is empty.
252
+ */
253
+ declare function getSelectionBoundsBars(selections: StemSelectionRange[]): {
254
+ trackId: string;
255
+ startBar: number;
256
+ endBar: number;
257
+ stemIndexes: number[];
258
+ } | null;
259
+ declare const parseStemIdKey: (key: string) => StemId | null;
260
+ interface DAWSession {
261
+ id: string;
262
+ /** User-editable mix/project name */
263
+ mixName: string;
264
+ /** BPM - set by first track, adjustable via metronome */
265
+ masterTempo: number;
266
+ /** The native BPM of the first track — used as the 1x reference */
267
+ originalTempo: number;
268
+ /** Samples per bar at master tempo (48 kHz) */
269
+ masterBarLength48000: number;
270
+ /** Time signature numerator / denominator */
271
+ timeSignature: [number, number];
272
+ /** Ordered list of tracks in the session */
273
+ tracks: DAWTrack[];
274
+ /** Current playhead position in bars (fractional for sub-bar precision) */
275
+ playheadBar: number;
276
+ /** Transport state */
277
+ isPlaying: boolean;
278
+ /** Global speed multiplier (1.0 = normal, set via metronome dial) */
279
+ globalPlaybackRate: number;
280
+ /** Loop region, if enabled */
281
+ loopRegion: {
282
+ startBar: number;
283
+ endBar: number;
284
+ } | null;
285
+ /** Bar subdivision factor: 1 = bars only (default), 4 = quarter-note grid, etc.
286
+ * Each bar is split into N equal sub-bars before building the speed/pitch maps. */
287
+ barSubdivisions: number;
288
+ /**
289
+ * Session-level notes / markers placed against the timeline. They sit
290
+ * above the ruler as small emoji + label pills and are purely visual —
291
+ * they have no effect on playback. A note with `endBar === startBar`
292
+ * is a point marker; otherwise it covers the bar range as a section
293
+ * marker.
294
+ */
295
+ notes: SessionNote[];
296
+ }
297
+ /** Curated palette of accent colors used by the note pill chrome. */
298
+ declare const NOTE_COLORS: string[];
299
+ /** Default emoji palette shown in the note editor. Order matters — the
300
+ * first one is the default selection when opening a fresh editor. */
301
+ declare const NOTE_EMOJI_PALETTE: string[];
302
+ /** A timeline annotation. Pure visual — never feeds the audio engine. */
303
+ interface SessionNote {
304
+ id: string;
305
+ /** Bar position (point note) or start of section (range note). */
306
+ startBar: number;
307
+ /** End bar. Equal to `startBar` for point markers. */
308
+ endBar: number;
309
+ /** Emoji shown in the pill. Single grapheme. */
310
+ emoji: string;
311
+ /** Short user-facing label ("drop hits", "best part", …). */
312
+ label: string;
313
+ /** Hex accent color for the pill chrome. */
314
+ color: string;
315
+ /** Creation timestamp (ms since epoch). */
316
+ createdAt: number;
317
+ }
318
+ interface DAWTrack {
319
+ /** Unique identifier for this track instance */
320
+ id: string;
321
+ /** Original track metadata from the API */
322
+ trackData: ITrackForSequence;
323
+ /** Reference to the MP4 cache layer instance (set at runtime, not in store) */
324
+ audioSourceSequenceId: string;
325
+ /** Bar boundaries computed from the track's beat grid */
326
+ barMapping: IBarMapping[];
327
+ /** Inclusive bar index window for stem composition (defaults: 0 … last bar) */
328
+ trimStartBar?: number;
329
+ trimEndBar?: number;
330
+ /** Musical sections: [startTime, endTime, segmentType] */
331
+ segmentInfo: [number, number, number][];
332
+ /**
333
+ * User-adjustable beat grid offset in beats (fractional).
334
+ * Shifts where the downbeat falls in the audio.
335
+ * +1 = the grid shifts forward by one beat (downbeat is 1 beat later in audio).
336
+ * -0.5 = the grid shifts backward by half a beat.
337
+ * Default 0.
338
+ */
339
+ beatGridOffsetBeats: number;
340
+ /** Track's native bar length in samples */
341
+ nativeBarLength: number;
342
+ /** Native BPM */
343
+ nativeBpm: number;
344
+ /** The speed ratio this track needs to match the master tempo */
345
+ speedRatioToMaster: number;
346
+ /** Tempo ratio bucket (0.5 | 1 | 2) for half/double time handling */
347
+ tempoRatio: TempoRatio;
348
+ /** Pitch correction in semitones to compensate for speed change */
349
+ pitchCorrectionSemitones: number;
350
+ /** Key of the track */
351
+ key: IMusicKey;
352
+ /** Tonality (major/minor) */
353
+ tonality: IMusicTonality;
354
+ /** Always 4: other, vocals, bass, drums */
355
+ channels: DAWChannel[];
356
+ /** 0.0 to 1.0 */
357
+ volume: number;
358
+ muted: boolean;
359
+ soloed: boolean;
360
+ /** Primary colour from artwork for UI theming */
361
+ color: string;
362
+ /** Artwork URL */
363
+ artwork: string;
364
+ /** Display name */
365
+ displayName: string;
366
+ /** Artist */
367
+ artistName: string;
368
+ /** User-set transpose offset in semitones (on top of pitchCorrectionSemitones) */
369
+ transposeSemitones: number;
370
+ /** Rubberband/Phaze engine settings for this track's pitch worklet */
371
+ pitchSettings: PitchEngineSettings;
372
+ /** When true, pitch correction varies per bar to compensate per-bar speed changes */
373
+ perBarPitchCompensation: boolean;
374
+ /** Whether the track's stem channels are expanded in the timeline */
375
+ expanded: boolean;
376
+ }
377
+ /** A silenced region within a stem, in bars relative to the track's barMapping. */
378
+ interface MuteRegion {
379
+ startBar: number;
380
+ endBar: number;
381
+ }
382
+ /** Reason an edge of a {@link StemClip} exists. Lets the renderer use sharp
383
+ * inner corners against split edges to make freshly-sliced clips read as
384
+ * "cut" rather than "two regular clips". */
385
+ type ClipEdge = 'trim' | 'mute' | 'split';
386
+ /** A computed visible clip — the non-muted section between mute regions. */
387
+ interface StemClip {
388
+ /** Source bar range (relative to barMapping) */
389
+ sourceStartBar: number;
390
+ sourceEndBar: number;
391
+ /** Where this clip sits on the global timeline */
392
+ timelineBar: number;
393
+ /** What produced the start edge of this clip. */
394
+ leftEdge: ClipEdge;
395
+ /** What produced the end edge of this clip. */
396
+ rightEdge: ClipEdge;
397
+ }
398
+ /** Clipboard entry for copy/paste. */
399
+ interface ClipboardEntry {
400
+ trackId: string;
401
+ stemIndex: number;
402
+ sourceStartBar: number;
403
+ sourceEndBar: number;
404
+ }
405
+ /**
406
+ * Compute the visible clips from a channel's trim bounds, mute regions, and
407
+ * split points.
408
+ *
409
+ * SSOT: clip positions are derived deterministically from
410
+ * muteRegions + splitPoints + trim bounds. The audio engine uses the same
411
+ * muteRegions (sent as sample ranges to the worklet), so visuals and playback
412
+ * always agree on what plays where. Split points are PURELY visual/logical —
413
+ * they break a clip into independently-movable pieces but produce no silence.
414
+ */
415
+ declare function computeClips(ch: DAWChannel): StemClip[];
416
+ interface DAWChannel {
417
+ /** 0 = other, 1 = vocals, 2 = bass, 3 = drums */
418
+ stemIndex: number;
419
+ stemType: TStemType;
420
+ /** Display label */
421
+ label: string;
422
+ /** 0.0 to 1.0 */
423
+ volume: number;
424
+ muted: boolean;
425
+ soloed: boolean;
426
+ /** Whether this stem lane is shown in the timeline (false = "removed") */
427
+ visible: boolean;
428
+ /** Where this stem starts on the global DAW timeline */
429
+ timelineStartBar: number;
430
+ /** First bar index from the source to play (trim in-point, relative to track barMapping) */
431
+ trimStartBar: number;
432
+ /** Last bar index from the source to play (trim out-point, relative to track barMapping) */
433
+ trimEndBar: number;
434
+ /** Silenced bar ranges within this stem (relative to track barMapping) */
435
+ muteRegions: MuteRegion[];
436
+ /**
437
+ * Logical split points in local bars (relative to track barMapping).
438
+ * Splits break the stem visually into independently-movable clips
439
+ * without any audio side effect — the audio engine ignores them
440
+ * entirely. Each value must lie strictly between trimStartBar and
441
+ * trimEndBar (other values are filtered out by `computeClips`).
442
+ */
443
+ splitPoints?: number[];
444
+ /** Bar ranges that have been resampled via the Bar Sampler */
445
+ resampledRegions?: ResampledRegion[];
446
+ /** Per-stem effects state (EQ, Compressor, Reverb, Delay) */
447
+ effects?: StemEffects;
448
+ }
449
+ /** Tracks a bar range that was resampled via the Bar Sampler. */
450
+ interface ResampledRegion {
451
+ startBar: number;
452
+ endBar: number;
453
+ sliceCount: number;
454
+ }
455
+ interface SamplerRegion {
456
+ trackId: string;
457
+ stemIndex: number;
458
+ startBar: number;
459
+ endBar: number;
460
+ }
461
+ interface SamplerSlice {
462
+ id: string;
463
+ /** Start sample relative to the extracted region buffer */
464
+ sampleStart: number;
465
+ /** End sample relative to the extracted region buffer */
466
+ sampleEnd: number;
467
+ label?: string;
468
+ /** Detected root note via Basic Pitch (MIDI number, e.g. 60 = C4) */
469
+ rootPitchMidi?: number;
470
+ /** Visual colour for pad grid */
471
+ color?: string;
472
+ }
473
+ interface SamplerSequenceEntry {
474
+ sliceId: string;
475
+ /** Per-hit pitch offset in semitones (-24 to +24) */
476
+ pitchSemitones?: number;
477
+ /** Per-hit gain multiplier (0..2, default 1) */
478
+ gain?: number;
479
+ /** Play slice in reverse */
480
+ reverse?: boolean;
481
+ /** Trim start within slice (0..1 fraction) */
482
+ startOffset?: number;
483
+ /** Trim end within slice (0..1 fraction) */
484
+ endOffset?: number;
485
+ }
486
+ /** A single note placed on the Ableton-style piano roll grid. */
487
+ interface PianoRollNote {
488
+ id: string;
489
+ /** MIDI pitch (0–127) */
490
+ pitch: number;
491
+ /** Start position in grid steps (0-based, step size depends on grid resolution) */
492
+ startStep: number;
493
+ /** Duration in grid steps (min 1) */
494
+ durationSteps: number;
495
+ /** Velocity 0–127 (default 100) */
496
+ velocity: number;
497
+ }
498
+ interface DAWBarChunk {
499
+ /** Index within the track's bar mapping array */
500
+ barIndex: number;
501
+ /** Sample-accurate bar boundaries from the beat grid */
502
+ originalBar: IBarMapping;
503
+ /** Speed ratio required to match master tempo for this specific bar */
504
+ speedRatio: number;
505
+ /** Decoded audio state */
506
+ decoded: {
507
+ audioBuffer: AudioBuffer | null;
508
+ isDecoding: boolean;
509
+ };
510
+ }
511
+ declare const SEGMENT_TYPE: {
512
+ readonly START: 0;
513
+ readonly END: 1;
514
+ readonly INTRO: 2;
515
+ readonly OUTRO: 3;
516
+ readonly BREAK: 4;
517
+ readonly BRIDGE: 5;
518
+ readonly INST: 6;
519
+ readonly SOLO: 7;
520
+ readonly VERSE: 8;
521
+ readonly CHORUS: 9;
522
+ };
523
+ type SegmentTypeValue = (typeof SEGMENT_TYPE)[keyof typeof SEGMENT_TYPE];
524
+ declare const SEGMENT_LABELS: Record<number, string>;
525
+ declare const SEGMENT_COLORS: Record<number, string>;
526
+ interface DAWTrackAudioNodes {
527
+ stemBufferNodes: AudioWorkletNode[];
528
+ stemGainNodes: GainNode[];
529
+ stemAnalyserNodes: AnalyserNode[];
530
+ trackGainNode: GainNode;
531
+ pitchWorkletNode: AudioWorkletNode | null;
532
+ }
533
+ declare const STEM_LABELS: string[];
534
+ declare const STEM_TYPES: TStemType[];
535
+ declare const STEM_COLORS: string[];
536
+ declare const STEM_BUFFER_KEYS: string[];
537
+ declare const createDefaultChannels: (timelineStartBar?: number, trimStartBar?: number, trimEndBar?: number) => DAWChannel[];
538
+ interface SectionRange {
539
+ type: number;
540
+ label: string;
541
+ startBar: number;
542
+ endBar: number;
543
+ }
544
+ /** Convert segmentInfo timestamps to bar-based section ranges using barMapping. */
545
+ declare function segmentInfoToSections(segmentInfo: [number, number, number][], barMapping: IBarMapping[]): SectionRange[];
546
+ /** Find the first section of a given type, or fall back through preferred types. */
547
+ declare function findFirstSectionOfType(sections: SectionRange[], preferredTypes?: number[]): SectionRange | null;
548
+
549
+ export { computeBarSpeedRatio as $, STEM_BUFFER_KEYS as A, createDefaultChannels as B, type ClipEdge as C, type DAWTrack as D, type SectionRange as E, segmentInfoToSections as F, findFirstSectionOfType as G, type IBarMapping as H, type IBeat as I, barToSample as J, composeBarsFromBeats as K, composeBarsFromBeatsSmoothed as L, type MuteRegion as M, NOTE_COLORS as N, resolveTimeOfDownbeatFromBarIndex as O, type PitchEngineSettings as P, resolveSampleLocOfDownbeatFromBarIndex as Q, type ResampledRegion as R, type StemId as S, medianBarDuration as T, barDurationToBpm as U, bpmToBarDuration as V, keyToSemitones as W, semitonesToKey as X, type TempoRatio as Y, type ITempoMatch as Z, calculateTempoMatch as _, DEFAULT_PITCH_SETTINGS as a, playbackRateToSemitones as a0, semitonesToPitchFactor as a1, PitchShiftStrategy as a2, computePitchShift as a3, type CamelotKey as a4, toCamelot as a5, type CamelotMatchType as a6, camelotMatchType as a7, transposeKey as a8, type TransposeSuggestion as a9, computeTransposeSuggestions as aa, StemEffectChain as ab, type StemEffects as ac, type DAWToolMode as b, type StemSelectionRange as c, type DAWSession as d, NOTE_EMOJI_PALETTE as e, type SessionNote as f, getSelectionBoundsBars as g, type StemClip as h, type ClipboardEntry as i, computeClips as j, type DAWChannel as k, type SamplerRegion as l, type SamplerSlice as m, type SamplerSequenceEntry as n, type PianoRollNote as o, parseStemIdKey as p, type DAWBarChunk as q, SEGMENT_TYPE as r, stemIdKey as s, type SegmentTypeValue as t, SEGMENT_LABELS as u, SEGMENT_COLORS as v, type DAWTrackAudioNodes as w, STEM_LABELS as x, STEM_TYPES as y, STEM_COLORS as z };