@drop-ai/core 0.2.0 → 0.3.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 (301) hide show
  1. package/README.md +655 -237
  2. package/dist/actions/ActionRegistry.d.ts.map +1 -1
  3. package/dist/actions/ActionRegistry.js +7 -2
  4. package/dist/actions/ActionRegistry.js.map +1 -1
  5. package/dist/actions/types.d.ts +7 -1
  6. package/dist/actions/types.d.ts.map +1 -1
  7. package/dist/analysis/AudioAnalyzer.d.ts +71 -0
  8. package/dist/analysis/AudioAnalyzer.d.ts.map +1 -0
  9. package/dist/analysis/AudioAnalyzer.js +569 -0
  10. package/dist/analysis/AudioAnalyzer.js.map +1 -0
  11. package/dist/audio/AudioEngine.d.ts +14 -1
  12. package/dist/audio/AudioEngine.d.ts.map +1 -1
  13. package/dist/audio/AudioEngine.js +115 -35
  14. package/dist/audio/AudioEngine.js.map +1 -1
  15. package/dist/audio/Auditioner.d.ts +104 -0
  16. package/dist/audio/Auditioner.d.ts.map +1 -0
  17. package/dist/audio/Auditioner.js +239 -0
  18. package/dist/audio/Auditioner.js.map +1 -0
  19. package/dist/audio/BWFMetadata.d.ts +116 -0
  20. package/dist/audio/BWFMetadata.d.ts.map +1 -0
  21. package/dist/audio/BWFMetadata.js +394 -0
  22. package/dist/audio/BWFMetadata.js.map +1 -0
  23. package/dist/audio/ChannelSplitter.d.ts +37 -0
  24. package/dist/audio/ChannelSplitter.d.ts.map +1 -0
  25. package/dist/audio/ChannelSplitter.js +82 -0
  26. package/dist/audio/ChannelSplitter.js.map +1 -0
  27. package/dist/audio/ExportAnalyzer.d.ts +39 -0
  28. package/dist/audio/ExportAnalyzer.d.ts.map +1 -0
  29. package/dist/audio/ExportAnalyzer.js +76 -0
  30. package/dist/audio/ExportAnalyzer.js.map +1 -0
  31. package/dist/audio/LufsNormalizer.d.ts +37 -0
  32. package/dist/audio/LufsNormalizer.d.ts.map +1 -0
  33. package/dist/audio/LufsNormalizer.js +217 -0
  34. package/dist/audio/LufsNormalizer.js.map +1 -0
  35. package/dist/audio/OfflineExporter.d.ts +1 -6
  36. package/dist/audio/OfflineExporter.d.ts.map +1 -1
  37. package/dist/audio/OfflineExporter.js +31 -10
  38. package/dist/audio/OfflineExporter.js.map +1 -1
  39. package/dist/audio/RoutingGraph.d.ts +134 -0
  40. package/dist/audio/RoutingGraph.d.ts.map +1 -0
  41. package/dist/audio/RoutingGraph.js +547 -0
  42. package/dist/audio/RoutingGraph.js.map +1 -0
  43. package/dist/audio/SampleRateConverter.d.ts +21 -0
  44. package/dist/audio/SampleRateConverter.d.ts.map +1 -0
  45. package/dist/audio/SampleRateConverter.js +84 -0
  46. package/dist/audio/SampleRateConverter.js.map +1 -0
  47. package/dist/audio/SilencePadding.d.ts +29 -0
  48. package/dist/audio/SilencePadding.d.ts.map +1 -0
  49. package/dist/audio/SilencePadding.js +86 -0
  50. package/dist/audio/SilencePadding.js.map +1 -0
  51. package/dist/audio/SourceCache.d.ts +13 -16
  52. package/dist/audio/SourceCache.d.ts.map +1 -1
  53. package/dist/audio/SourceCache.js +21 -33
  54. package/dist/audio/SourceCache.js.map +1 -1
  55. package/dist/audio/engine/Declick.d.ts +98 -0
  56. package/dist/audio/engine/Declick.d.ts.map +1 -0
  57. package/dist/audio/engine/Declick.js +204 -0
  58. package/dist/audio/engine/Declick.js.map +1 -0
  59. package/dist/audio/engine/DiskIO.d.ts +172 -0
  60. package/dist/audio/engine/DiskIO.d.ts.map +1 -0
  61. package/dist/audio/engine/DiskIO.js +384 -0
  62. package/dist/audio/engine/DiskIO.js.map +1 -0
  63. package/dist/audio/engine/LatencyCompensator.d.ts +46 -0
  64. package/dist/audio/engine/LatencyCompensator.d.ts.map +1 -0
  65. package/dist/audio/engine/LatencyCompensator.js +84 -0
  66. package/dist/audio/engine/LatencyCompensator.js.map +1 -0
  67. package/dist/audio/engine/MultiTrackRecorder.d.ts +146 -0
  68. package/dist/audio/engine/MultiTrackRecorder.d.ts.map +1 -0
  69. package/dist/audio/engine/MultiTrackRecorder.js +359 -0
  70. package/dist/audio/engine/MultiTrackRecorder.js.map +1 -0
  71. package/dist/audio/engine/PlaylistEngine.d.ts.map +1 -1
  72. package/dist/audio/engine/PlaylistEngine.js +9 -2
  73. package/dist/audio/engine/PlaylistEngine.js.map +1 -1
  74. package/dist/audio/engine/PunchRecordManager.d.ts +113 -0
  75. package/dist/audio/engine/PunchRecordManager.d.ts.map +1 -0
  76. package/dist/audio/engine/PunchRecordManager.js +191 -0
  77. package/dist/audio/engine/PunchRecordManager.js.map +1 -0
  78. package/dist/audio/engine/RoutingGraph.d.ts +135 -0
  79. package/dist/audio/engine/RoutingGraph.d.ts.map +1 -0
  80. package/dist/audio/engine/RoutingGraph.js +436 -0
  81. package/dist/audio/engine/RoutingGraph.js.map +1 -0
  82. package/dist/audio/engine/SidechainRouter.d.ts +139 -0
  83. package/dist/audio/engine/SidechainRouter.d.ts.map +1 -0
  84. package/dist/audio/engine/SidechainRouter.js +292 -0
  85. package/dist/audio/engine/SidechainRouter.js.map +1 -0
  86. package/dist/audio/engine/XrunTracker.d.ts +71 -0
  87. package/dist/audio/engine/XrunTracker.d.ts.map +1 -0
  88. package/dist/audio/engine/XrunTracker.js +118 -0
  89. package/dist/audio/engine/XrunTracker.js.map +1 -0
  90. package/dist/audio/export/CDMarkerExporter.d.ts +62 -0
  91. package/dist/audio/export/CDMarkerExporter.d.ts.map +1 -0
  92. package/dist/audio/export/CDMarkerExporter.js +164 -0
  93. package/dist/audio/export/CDMarkerExporter.js.map +1 -0
  94. package/dist/audio/export/ExportGraphBuilder.d.ts +121 -0
  95. package/dist/audio/export/ExportGraphBuilder.d.ts.map +1 -0
  96. package/dist/audio/export/ExportGraphBuilder.js +522 -0
  97. package/dist/audio/export/ExportGraphBuilder.js.map +1 -0
  98. package/dist/audio/export/ExportPresetManager.d.ts +87 -0
  99. package/dist/audio/export/ExportPresetManager.d.ts.map +1 -0
  100. package/dist/audio/export/ExportPresetManager.js +306 -0
  101. package/dist/audio/export/ExportPresetManager.js.map +1 -0
  102. package/dist/commands/handlers/RegionHandler.d.ts.map +1 -1
  103. package/dist/commands/handlers/RegionHandler.js +25 -1
  104. package/dist/commands/handlers/RegionHandler.js.map +1 -1
  105. package/dist/commands/handlers/TrackHandler.js +1 -1
  106. package/dist/commands/handlers/TrackHandler.js.map +1 -1
  107. package/dist/commands/impl/FreezeTrackCommand.d.ts.map +1 -1
  108. package/dist/commands/impl/FreezeTrackCommand.js +37 -36
  109. package/dist/commands/impl/FreezeTrackCommand.js.map +1 -1
  110. package/dist/commands/impl/SetRegionTimeDomainCommand.d.ts.map +1 -1
  111. package/dist/commands/impl/SetRegionTimeDomainCommand.js +3 -3
  112. package/dist/commands/impl/SetRegionTimeDomainCommand.js.map +1 -1
  113. package/dist/commands/impl/ToggleLoopCommand.d.ts +1 -0
  114. package/dist/commands/impl/ToggleLoopCommand.d.ts.map +1 -1
  115. package/dist/commands/impl/ToggleLoopCommand.js +10 -0
  116. package/dist/commands/impl/ToggleLoopCommand.js.map +1 -1
  117. package/dist/commands/impl/TrimRegionCommand.d.ts +14 -1
  118. package/dist/commands/impl/TrimRegionCommand.d.ts.map +1 -1
  119. package/dist/commands/impl/TrimRegionCommand.js +138 -33
  120. package/dist/commands/impl/TrimRegionCommand.js.map +1 -1
  121. package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts +27 -0
  122. package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts.map +1 -0
  123. package/dist/commands/impl/TrimRegionToPlayheadCommand.js +69 -0
  124. package/dist/commands/impl/TrimRegionToPlayheadCommand.js.map +1 -0
  125. package/dist/commands/impl/TrimRegionToRangeCommand.d.ts +28 -0
  126. package/dist/commands/impl/TrimRegionToRangeCommand.d.ts.map +1 -0
  127. package/dist/commands/impl/TrimRegionToRangeCommand.js +69 -0
  128. package/dist/commands/impl/TrimRegionToRangeCommand.js.map +1 -0
  129. package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts +27 -0
  130. package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts.map +1 -0
  131. package/dist/commands/impl/TrimToAdjacentRegionCommand.js +77 -0
  132. package/dist/commands/impl/TrimToAdjacentRegionCommand.js.map +1 -0
  133. package/dist/commands/types.d.ts +19 -0
  134. package/dist/commands/types.d.ts.map +1 -1
  135. package/dist/commands/types.js +21 -0
  136. package/dist/commands/types.js.map +1 -1
  137. package/dist/domain/Crossfade.d.ts +78 -0
  138. package/dist/domain/Crossfade.d.ts.map +1 -0
  139. package/dist/domain/Crossfade.js +216 -0
  140. package/dist/domain/Crossfade.js.map +1 -0
  141. package/dist/domain/ExportConfig.d.ts +98 -1
  142. package/dist/domain/ExportConfig.d.ts.map +1 -1
  143. package/dist/domain/ExportConfig.js +154 -1
  144. package/dist/domain/ExportConfig.js.map +1 -1
  145. package/dist/domain/ExportPreset.d.ts +62 -0
  146. package/dist/domain/ExportPreset.d.ts.map +1 -0
  147. package/dist/domain/ExportPreset.js +79 -0
  148. package/dist/domain/ExportPreset.js.map +1 -0
  149. package/dist/domain/ImportStatus.d.ts +40 -0
  150. package/dist/domain/ImportStatus.d.ts.map +1 -0
  151. package/dist/domain/ImportStatus.js +86 -0
  152. package/dist/domain/ImportStatus.js.map +1 -0
  153. package/dist/domain/Playlist.d.ts +72 -0
  154. package/dist/domain/Playlist.d.ts.map +1 -1
  155. package/dist/domain/Playlist.js +231 -6
  156. package/dist/domain/Playlist.js.map +1 -1
  157. package/dist/domain/Region.d.ts +76 -0
  158. package/dist/domain/Region.d.ts.map +1 -1
  159. package/dist/domain/Region.js +234 -1
  160. package/dist/domain/Region.js.map +1 -1
  161. package/dist/domain/Route.d.ts +43 -3
  162. package/dist/domain/Route.d.ts.map +1 -1
  163. package/dist/domain/Route.js +92 -6
  164. package/dist/domain/Route.js.map +1 -1
  165. package/dist/domain/Session.d.ts +31 -0
  166. package/dist/domain/Session.d.ts.map +1 -1
  167. package/dist/domain/Session.js +70 -0
  168. package/dist/domain/Session.js.map +1 -1
  169. package/dist/domain/Source.d.ts +145 -1
  170. package/dist/domain/Source.d.ts.map +1 -1
  171. package/dist/domain/Source.js +144 -1
  172. package/dist/domain/Source.js.map +1 -1
  173. package/dist/domain/ThawList.d.ts +37 -0
  174. package/dist/domain/ThawList.d.ts.map +1 -0
  175. package/dist/domain/ThawList.js +73 -0
  176. package/dist/domain/ThawList.js.map +1 -0
  177. package/dist/domain/Track.d.ts +93 -1
  178. package/dist/domain/Track.d.ts.map +1 -1
  179. package/dist/domain/Track.js +136 -0
  180. package/dist/domain/Track.js.map +1 -1
  181. package/dist/domain/TriggerBox.d.ts +123 -0
  182. package/dist/domain/TriggerBox.d.ts.map +1 -0
  183. package/dist/domain/TriggerBox.js +430 -0
  184. package/dist/domain/TriggerBox.js.map +1 -0
  185. package/dist/domain/VCATrack.d.ts +64 -1
  186. package/dist/domain/VCATrack.d.ts.map +1 -1
  187. package/dist/domain/VCATrack.js +128 -1
  188. package/dist/domain/VCATrack.js.map +1 -1
  189. package/dist/domain/VideoExportConfig.d.ts +117 -0
  190. package/dist/domain/VideoExportConfig.d.ts.map +1 -0
  191. package/dist/domain/VideoExportConfig.js +244 -0
  192. package/dist/domain/VideoExportConfig.js.map +1 -0
  193. package/dist/domain/VideoExportStatus.d.ts +89 -0
  194. package/dist/domain/VideoExportStatus.d.ts.map +1 -0
  195. package/dist/domain/VideoExportStatus.js +192 -0
  196. package/dist/domain/VideoExportStatus.js.map +1 -0
  197. package/dist/domain/VideoMetadata.d.ts +46 -0
  198. package/dist/domain/VideoMetadata.d.ts.map +1 -0
  199. package/dist/domain/VideoMetadata.js +2 -0
  200. package/dist/domain/VideoMetadata.js.map +1 -0
  201. package/dist/domain/index.d.ts +5 -0
  202. package/dist/domain/index.d.ts.map +1 -1
  203. package/dist/domain/index.js +5 -0
  204. package/dist/domain/index.js.map +1 -1
  205. package/dist/domain/temporal/TempoMap.d.ts +199 -2
  206. package/dist/domain/temporal/TempoMap.d.ts.map +1 -1
  207. package/dist/domain/temporal/TempoMap.js +464 -30
  208. package/dist/domain/temporal/TempoMap.js.map +1 -1
  209. package/dist/index.d.ts +43 -1
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +32 -1
  212. package/dist/index.js.map +1 -1
  213. package/dist/lib/ThawList.d.ts +100 -0
  214. package/dist/lib/ThawList.d.ts.map +1 -0
  215. package/dist/lib/ThawList.js +153 -0
  216. package/dist/lib/ThawList.js.map +1 -0
  217. package/dist/midi/MidiFileParser.d.ts +33 -0
  218. package/dist/midi/MidiFileParser.d.ts.map +1 -0
  219. package/dist/midi/MidiFileParser.js +246 -0
  220. package/dist/midi/MidiFileParser.js.map +1 -0
  221. package/dist/midi/MidiFileWriter.d.ts +31 -0
  222. package/dist/midi/MidiFileWriter.d.ts.map +1 -0
  223. package/dist/midi/MidiFileWriter.js +160 -0
  224. package/dist/midi/MidiFileWriter.js.map +1 -0
  225. package/dist/midi/MidiImporter.d.ts +37 -0
  226. package/dist/midi/MidiImporter.d.ts.map +1 -0
  227. package/dist/midi/MidiImporter.js +62 -0
  228. package/dist/midi/MidiImporter.js.map +1 -0
  229. package/dist/plugins/PluginPresetManager.d.ts +86 -0
  230. package/dist/plugins/PluginPresetManager.d.ts.map +1 -0
  231. package/dist/plugins/PluginPresetManager.js +140 -0
  232. package/dist/plugins/PluginPresetManager.js.map +1 -0
  233. package/dist/processing/IO.d.ts +15 -1
  234. package/dist/processing/IO.d.ts.map +1 -1
  235. package/dist/processing/IO.js +29 -1
  236. package/dist/processing/IO.js.map +1 -1
  237. package/dist/processing/InternalSend.d.ts +104 -0
  238. package/dist/processing/InternalSend.d.ts.map +1 -0
  239. package/dist/processing/InternalSend.js +175 -0
  240. package/dist/processing/InternalSend.js.map +1 -0
  241. package/dist/processing/MeterDSP.d.ts +166 -0
  242. package/dist/processing/MeterDSP.d.ts.map +1 -0
  243. package/dist/processing/MeterDSP.js +754 -0
  244. package/dist/processing/MeterDSP.js.map +1 -0
  245. package/dist/processing/Panner.d.ts +145 -0
  246. package/dist/processing/Panner.d.ts.map +1 -0
  247. package/dist/processing/Panner.js +281 -0
  248. package/dist/processing/Panner.js.map +1 -0
  249. package/dist/processing/PluginInsert.d.ts +56 -1
  250. package/dist/processing/PluginInsert.d.ts.map +1 -1
  251. package/dist/processing/PluginInsert.js +180 -2
  252. package/dist/processing/PluginInsert.js.map +1 -1
  253. package/dist/processing/Processor.d.ts +38 -0
  254. package/dist/processing/Processor.d.ts.map +1 -1
  255. package/dist/processing/Processor.js +60 -1
  256. package/dist/processing/Processor.js.map +1 -1
  257. package/dist/processing/SurroundPanner.d.ts +122 -0
  258. package/dist/processing/SurroundPanner.d.ts.map +1 -0
  259. package/dist/processing/SurroundPanner.js +376 -0
  260. package/dist/processing/SurroundPanner.js.map +1 -0
  261. package/dist/processing/TruePeakLimiter.d.ts +34 -0
  262. package/dist/processing/TruePeakLimiter.d.ts.map +1 -0
  263. package/dist/processing/TruePeakLimiter.js +144 -0
  264. package/dist/processing/TruePeakLimiter.js.map +1 -0
  265. package/dist/storage/ExportPresetStorage.d.ts +33 -0
  266. package/dist/storage/ExportPresetStorage.d.ts.map +1 -0
  267. package/dist/storage/ExportPresetStorage.js +121 -0
  268. package/dist/storage/ExportPresetStorage.js.map +1 -0
  269. package/dist/storage/SessionArchive.d.ts +73 -0
  270. package/dist/storage/SessionArchive.d.ts.map +1 -0
  271. package/dist/storage/SessionArchive.js +211 -0
  272. package/dist/storage/SessionArchive.js.map +1 -0
  273. package/dist/storage/SessionTemplate.d.ts +74 -5
  274. package/dist/storage/SessionTemplate.d.ts.map +1 -1
  275. package/dist/storage/SessionTemplate.js +247 -53
  276. package/dist/storage/SessionTemplate.js.map +1 -1
  277. package/dist/utils/BwfMetadataWriter.d.ts +42 -0
  278. package/dist/utils/BwfMetadataWriter.d.ts.map +1 -0
  279. package/dist/utils/BwfMetadataWriter.js +131 -0
  280. package/dist/utils/BwfMetadataWriter.js.map +1 -0
  281. package/dist/utils/FilenameTemplate.d.ts +40 -0
  282. package/dist/utils/FilenameTemplate.d.ts.map +1 -0
  283. package/dist/utils/FilenameTemplate.js +78 -0
  284. package/dist/utils/FilenameTemplate.js.map +1 -0
  285. package/dist/utils/Logger.d.ts +28 -0
  286. package/dist/utils/Logger.d.ts.map +1 -0
  287. package/dist/utils/Logger.js +46 -0
  288. package/dist/utils/Logger.js.map +1 -0
  289. package/dist/utils/Mp4ChapterGenerator.d.ts +17 -0
  290. package/dist/utils/Mp4ChapterGenerator.d.ts.map +1 -0
  291. package/dist/utils/Mp4ChapterGenerator.js +33 -0
  292. package/dist/utils/Mp4ChapterGenerator.js.map +1 -0
  293. package/dist/utils/OggEncoder.d.ts +20 -20
  294. package/dist/utils/OggEncoder.d.ts.map +1 -1
  295. package/dist/utils/OggEncoder.js +114 -50
  296. package/dist/utils/OggEncoder.js.map +1 -1
  297. package/dist/utils/TocGenerator.d.ts +17 -0
  298. package/dist/utils/TocGenerator.d.ts.map +1 -0
  299. package/dist/utils/TocGenerator.js +47 -0
  300. package/dist/utils/TocGenerator.js.map +1 -0
  301. package/package.json +7 -8
@@ -0,0 +1,569 @@
1
+ /**
2
+ * AudioAnalyzer provides audio analysis algorithms.
3
+ *
4
+ * Ardour reference: libs/ardour/audioanalyser.cc, libs/qm-dsp/
5
+ *
6
+ * Algorithms:
7
+ * - Transient detection: Find percussive onsets in audio
8
+ * - Onset detection: Find note beginnings
9
+ * - BPM detection: Estimate tempo from audio
10
+ * - Peak analysis: Find loudest points
11
+ * - RMS analysis: Compute loudness over time
12
+ * - Zero-crossing rate: Tonal vs percussive analysis
13
+ *
14
+ * All DSP is implemented in pure TypeScript with no external dependencies.
15
+ * FFT uses a radix-2 Cooley-Tukey implementation.
16
+ */
17
+ // ─── Constants ─────────────────────────────────────────────────────────────
18
+ const DEFAULT_FFT_SIZE = 2048;
19
+ const DEFAULT_HOP_SIZE = 512;
20
+ const DEFAULT_TRANSIENT_THRESHOLD = 1.4;
21
+ const DEFAULT_ONSET_THRESHOLD = 1.3;
22
+ const MEDIAN_FILTER_SIZE = 11;
23
+ const MIN_ONSET_SPACING_MS = 50; // Minimum ms between detected onsets
24
+ export class AudioAnalyzer {
25
+ constructor(sampleRate = 44100) {
26
+ this.sampleRate = sampleRate;
27
+ }
28
+ // ════════════════════════════════════════════════════════════════════════
29
+ // Transient Detection — spectral flux with adaptive threshold
30
+ // ════════════════════════════════════════════════════════════════════════
31
+ detectTransients(audioData, options = {}) {
32
+ var _a, _b;
33
+ const windowSize = (_a = options.windowSize) !== null && _a !== void 0 ? _a : 1024;
34
+ const fftSize = this.nextPow2(windowSize);
35
+ const hopSize = windowSize >>> 1;
36
+ const threshold = (_b = options.threshold) !== null && _b !== void 0 ? _b : DEFAULT_TRANSIENT_THRESHOLD;
37
+ if (audioData.length < fftSize) {
38
+ return { positions: [], strengths: [] };
39
+ }
40
+ const hannWin = this.hannWindow(fftSize);
41
+ const numFrames = Math.floor((audioData.length - fftSize) / hopSize) + 1;
42
+ const fluxValues = new Float32Array(numFrames);
43
+ let prevMag = new Float32Array(fftSize / 2 + 1);
44
+ // Pass 1: compute spectral flux for each frame
45
+ for (let f = 0; f < numFrames; f++) {
46
+ const offset = f * hopSize;
47
+ const windowed = new Float32Array(fftSize);
48
+ for (let i = 0; i < fftSize; i++) {
49
+ windowed[i] = (offset + i < audioData.length)
50
+ ? audioData[offset + i] * hannWin[i]
51
+ : 0;
52
+ }
53
+ const { magnitude } = this.computeFFT(windowed, fftSize);
54
+ // Spectral flux = sum of positive magnitude differences
55
+ let flux = 0;
56
+ for (let k = 0; k <= fftSize / 2; k++) {
57
+ const diff = magnitude[k] - prevMag[k];
58
+ if (diff > 0)
59
+ flux += diff;
60
+ }
61
+ fluxValues[f] = flux;
62
+ prevMag = magnitude;
63
+ }
64
+ // Pass 2: adaptive peak-picking with median threshold
65
+ const positions = [];
66
+ const strengths = [];
67
+ const halfMedian = (MEDIAN_FILTER_SIZE - 1) >>> 1;
68
+ const minSpacingFrames = Math.floor((MIN_ONSET_SPACING_MS / 1000) * this.sampleRate / hopSize);
69
+ // Find maximum flux for normalisation
70
+ let maxFlux = 0;
71
+ for (let f = 0; f < numFrames; f++) {
72
+ if (fluxValues[f] > maxFlux)
73
+ maxFlux = fluxValues[f];
74
+ }
75
+ if (maxFlux === 0)
76
+ return { positions: [], strengths: [] };
77
+ let lastPickedFrame = -minSpacingFrames - 1;
78
+ for (let f = 0; f < numFrames; f++) {
79
+ // Gather neighbourhood for median
80
+ const start = Math.max(0, f - halfMedian);
81
+ const end = Math.min(numFrames - 1, f + halfMedian);
82
+ const neighbourhood = [];
83
+ for (let j = start; j <= end; j++) {
84
+ neighbourhood.push(fluxValues[j]);
85
+ }
86
+ neighbourhood.sort((a, b) => a - b);
87
+ const median = neighbourhood[neighbourhood.length >>> 1];
88
+ if (fluxValues[f] > median * threshold &&
89
+ fluxValues[f] > 0 &&
90
+ (f - lastPickedFrame) >= minSpacingFrames) {
91
+ const samplePos = f * hopSize + (fftSize >>> 1);
92
+ positions.push(samplePos);
93
+ strengths.push(fluxValues[f] / maxFlux);
94
+ lastPickedFrame = f;
95
+ }
96
+ }
97
+ return { positions, strengths };
98
+ }
99
+ // ════════════════════════════════════════════════════════════════════════
100
+ // Onset Detection — high-frequency content + spectral flux
101
+ // ════════════════════════════════════════════════════════════════════════
102
+ detectOnsets(audioData, options = {}) {
103
+ var _a, _b;
104
+ const windowSize = (_a = options.windowSize) !== null && _a !== void 0 ? _a : 1024;
105
+ const fftSize = this.nextPow2(windowSize);
106
+ const hopSize = windowSize >>> 1;
107
+ const threshold = (_b = options.threshold) !== null && _b !== void 0 ? _b : DEFAULT_ONSET_THRESHOLD;
108
+ if (audioData.length < fftSize) {
109
+ return { positions: [], types: [] };
110
+ }
111
+ const hannWin = this.hannWindow(fftSize);
112
+ const numFrames = Math.floor((audioData.length - fftSize) / hopSize) + 1;
113
+ const hfcValues = new Float32Array(numFrames); // High-frequency content
114
+ const fluxValues = new Float32Array(numFrames); // Spectral flux
115
+ const zcrValues = new Float32Array(numFrames); // Zero-crossing rate per frame
116
+ let prevMag = new Float32Array(fftSize / 2 + 1);
117
+ const halfSpec = fftSize / 2;
118
+ for (let f = 0; f < numFrames; f++) {
119
+ const offset = f * hopSize;
120
+ // Windowed frame for FFT
121
+ const windowed = new Float32Array(fftSize);
122
+ for (let i = 0; i < fftSize; i++) {
123
+ windowed[i] = (offset + i < audioData.length)
124
+ ? audioData[offset + i] * hannWin[i]
125
+ : 0;
126
+ }
127
+ const { magnitude } = this.computeFFT(windowed, fftSize);
128
+ // HFC = sum(k * |X[k]|^2) — emphasises high-frequency energy
129
+ let hfc = 0;
130
+ let flux = 0;
131
+ for (let k = 0; k <= halfSpec; k++) {
132
+ hfc += k * magnitude[k] * magnitude[k];
133
+ const diff = magnitude[k] - prevMag[k];
134
+ if (diff > 0)
135
+ flux += diff;
136
+ }
137
+ hfcValues[f] = hfc;
138
+ fluxValues[f] = flux;
139
+ prevMag = magnitude;
140
+ // Per-frame ZCR (in the time domain)
141
+ let zcr = 0;
142
+ for (let i = 1; i < fftSize && (offset + i) < audioData.length; i++) {
143
+ if ((audioData[offset + i] >= 0) !== (audioData[offset + i - 1] >= 0)) {
144
+ zcr++;
145
+ }
146
+ }
147
+ zcrValues[f] = zcr / fftSize;
148
+ }
149
+ // Combine HFC and spectral flux into a single onset detection function
150
+ // Normalise each to 0-1 range
151
+ let maxHfc = 0;
152
+ let maxFlux = 0;
153
+ for (let f = 0; f < numFrames; f++) {
154
+ if (hfcValues[f] > maxHfc)
155
+ maxHfc = hfcValues[f];
156
+ if (fluxValues[f] > maxFlux)
157
+ maxFlux = fluxValues[f];
158
+ }
159
+ if (maxHfc === 0 && maxFlux === 0) {
160
+ return { positions: [], types: [] };
161
+ }
162
+ const odf = new Float32Array(numFrames);
163
+ for (let f = 0; f < numFrames; f++) {
164
+ const normHfc = maxHfc > 0 ? hfcValues[f] / maxHfc : 0;
165
+ const normFlux = maxFlux > 0 ? fluxValues[f] / maxFlux : 0;
166
+ odf[f] = 0.5 * normHfc + 0.5 * normFlux;
167
+ }
168
+ // Adaptive peak-picking
169
+ const positions = [];
170
+ const types = [];
171
+ const halfMedian = (MEDIAN_FILTER_SIZE - 1) >>> 1;
172
+ const minSpacingFrames = Math.floor((MIN_ONSET_SPACING_MS / 1000) * this.sampleRate / hopSize);
173
+ let lastPicked = -minSpacingFrames - 1;
174
+ for (let f = 0; f < numFrames; f++) {
175
+ const start = Math.max(0, f - halfMedian);
176
+ const end = Math.min(numFrames - 1, f + halfMedian);
177
+ const neighbourhood = [];
178
+ for (let j = start; j <= end; j++) {
179
+ neighbourhood.push(odf[j]);
180
+ }
181
+ neighbourhood.sort((a, b) => a - b);
182
+ const median = neighbourhood[neighbourhood.length >>> 1];
183
+ if (odf[f] > median * threshold && odf[f] > 0.01 && (f - lastPicked) >= minSpacingFrames) {
184
+ const samplePos = f * hopSize + (fftSize >>> 1);
185
+ positions.push(samplePos);
186
+ // Classify onset type using ZCR:
187
+ // High ZCR => percussive, Low ZCR => tonal
188
+ const zcr = zcrValues[f];
189
+ if (zcr > 0.15) {
190
+ types.push('percussive');
191
+ }
192
+ else if (zcr < 0.05) {
193
+ types.push('tonal');
194
+ }
195
+ else {
196
+ types.push('mixed');
197
+ }
198
+ lastPicked = f;
199
+ }
200
+ }
201
+ return { positions, types };
202
+ }
203
+ // ════════════════════════════════════════════════════════════════════════
204
+ // BPM Detection — onset autocorrelation
205
+ // ════════════════════════════════════════════════════════════════════════
206
+ detectBPM(audioData, options = {}) {
207
+ var _a, _b;
208
+ const minBPM = (_a = options.minBPM) !== null && _a !== void 0 ? _a : 60;
209
+ const maxBPM = (_b = options.maxBPM) !== null && _b !== void 0 ? _b : 200;
210
+ // Step 1: Build an onset strength envelope
211
+ const windowSize = 1024;
212
+ const fftSize = this.nextPow2(windowSize);
213
+ const hopSize = windowSize >>> 1;
214
+ const hannWin = this.hannWindow(fftSize);
215
+ const numFrames = Math.floor((audioData.length - fftSize) / hopSize) + 1;
216
+ if (numFrames < 4) {
217
+ return { bpm: 0, confidence: 0, alternatives: [] };
218
+ }
219
+ const onsetEnvelope = new Float32Array(numFrames);
220
+ let prevMag = new Float32Array(fftSize / 2 + 1);
221
+ for (let f = 0; f < numFrames; f++) {
222
+ const offset = f * hopSize;
223
+ const windowed = new Float32Array(fftSize);
224
+ for (let i = 0; i < fftSize; i++) {
225
+ windowed[i] = (offset + i < audioData.length)
226
+ ? audioData[offset + i] * hannWin[i]
227
+ : 0;
228
+ }
229
+ const { magnitude } = this.computeFFT(windowed, fftSize);
230
+ let flux = 0;
231
+ for (let k = 0; k <= fftSize / 2; k++) {
232
+ const diff = magnitude[k] - prevMag[k];
233
+ if (diff > 0)
234
+ flux += diff;
235
+ }
236
+ onsetEnvelope[f] = flux;
237
+ prevMag = magnitude;
238
+ }
239
+ // Step 2: Convert BPM range to lag range (in onset-envelope frames)
240
+ // lag = (60 / bpm) * (sampleRate / hopSize)
241
+ const framesPerSecond = this.sampleRate / hopSize;
242
+ const minLag = Math.floor((60 / maxBPM) * framesPerSecond);
243
+ const maxLag = Math.ceil((60 / minBPM) * framesPerSecond);
244
+ if (maxLag >= numFrames) {
245
+ // Not enough audio for the requested BPM range
246
+ return { bpm: 0, confidence: 0, alternatives: [] };
247
+ }
248
+ // Step 3: Autocorrelation of onset envelope
249
+ const acf = this.autocorrelate(onsetEnvelope, minLag, maxLag);
250
+ // Step 4: Find peaks in the autocorrelation function
251
+ const candidates = [];
252
+ let acfMax = 0;
253
+ for (let i = 0; i < acf.length; i++) {
254
+ if (acf[i] > acfMax)
255
+ acfMax = acf[i];
256
+ }
257
+ if (acfMax === 0) {
258
+ return { bpm: 0, confidence: 0, alternatives: [] };
259
+ }
260
+ // Local maxima detection
261
+ for (let i = 1; i < acf.length - 1; i++) {
262
+ if (acf[i] > acf[i - 1] && acf[i] > acf[i + 1] && acf[i] > acfMax * 0.1) {
263
+ const lag = minLag + i;
264
+ candidates.push({ lag, value: acf[i] / acfMax });
265
+ }
266
+ }
267
+ if (candidates.length === 0) {
268
+ // Fallback: use the global maximum
269
+ let bestIdx = 0;
270
+ for (let i = 1; i < acf.length; i++) {
271
+ if (acf[i] > acf[bestIdx])
272
+ bestIdx = i;
273
+ }
274
+ const lag = minLag + bestIdx;
275
+ const bpm = (60 * framesPerSecond) / lag;
276
+ return {
277
+ bpm: Math.round(bpm * 10) / 10,
278
+ confidence: acf[bestIdx] / acfMax,
279
+ alternatives: [],
280
+ };
281
+ }
282
+ // Sort by strength descending
283
+ candidates.sort((a, b) => b.value - a.value);
284
+ // Convert lag to BPM
285
+ const results = candidates.map(c => ({
286
+ bpm: Math.round(((60 * framesPerSecond) / c.lag) * 10) / 10,
287
+ confidence: c.value,
288
+ }));
289
+ // Deduplicate near-identical BPMs (within 1 BPM)
290
+ const deduped = [];
291
+ for (const r of results) {
292
+ const hasSimilar = deduped.some(d => Math.abs(d.bpm - r.bpm) < 1);
293
+ if (!hasSimilar)
294
+ deduped.push(r);
295
+ }
296
+ return {
297
+ bpm: deduped[0].bpm,
298
+ confidence: deduped[0].confidence,
299
+ alternatives: deduped.slice(1, 5),
300
+ };
301
+ }
302
+ // ════════════════════════════════════════════════════════════════════════
303
+ // Peak Analysis
304
+ // ════════════════════════════════════════════════════════════════════════
305
+ analyzePeaks(audioData, count = 10) {
306
+ if (audioData.length === 0) {
307
+ return { peaks: [], truePeak: 0, peakFrame: 0 };
308
+ }
309
+ // Find true peak
310
+ let truePeak = 0;
311
+ let peakFrame = 0;
312
+ for (let i = 0; i < audioData.length; i++) {
313
+ const abs = Math.abs(audioData[i]);
314
+ if (abs > truePeak) {
315
+ truePeak = abs;
316
+ peakFrame = i;
317
+ }
318
+ }
319
+ if (truePeak === 0) {
320
+ return { peaks: [], truePeak: 0, peakFrame: 0 };
321
+ }
322
+ // Find local maxima using a window-based approach
323
+ // Window size: ~10ms worth of samples
324
+ const windowSamples = Math.max(Math.floor(this.sampleRate * 0.01), 16);
325
+ const localPeaks = [];
326
+ for (let i = windowSamples; i < audioData.length - windowSamples; i++) {
327
+ const abs = Math.abs(audioData[i]);
328
+ // Must be above a minimum level (1% of true peak)
329
+ if (abs < truePeak * 0.01)
330
+ continue;
331
+ // Check if this is a local maximum
332
+ let isMax = true;
333
+ for (let j = -windowSamples; j <= windowSamples; j++) {
334
+ if (j === 0)
335
+ continue;
336
+ if (Math.abs(audioData[i + j]) > abs) {
337
+ isMax = false;
338
+ break;
339
+ }
340
+ }
341
+ if (isMax) {
342
+ localPeaks.push({ frame: i, amplitude: abs });
343
+ }
344
+ }
345
+ // Sort by amplitude descending and take top N
346
+ localPeaks.sort((a, b) => b.amplitude - a.amplitude);
347
+ const topPeaks = localPeaks.slice(0, count);
348
+ // Sort final result by frame position for chronological order
349
+ topPeaks.sort((a, b) => a.frame - b.frame);
350
+ return {
351
+ peaks: topPeaks,
352
+ truePeak,
353
+ peakFrame,
354
+ };
355
+ }
356
+ // ════════════════════════════════════════════════════════════════════════
357
+ // Loudness Profile (RMS + integrated LUFS)
358
+ // ════════════════════════════════════════════════════════════════════════
359
+ analyzeLoudness(audioData, windowSize) {
360
+ const winSize = windowSize !== null && windowSize !== void 0 ? windowSize : Math.floor(this.sampleRate * 0.4); // 400ms default (EBU R128)
361
+ const hopSize = winSize >>> 1;
362
+ const numWindows = Math.max(1, Math.floor((audioData.length - winSize) / hopSize) + 1);
363
+ const rms = new Float32Array(numWindows);
364
+ // Also accumulate total mean square for integrated loudness
365
+ let totalMeanSquare = 0;
366
+ let totalSamples = 0;
367
+ for (let w = 0; w < numWindows; w++) {
368
+ const offset = w * hopSize;
369
+ let sumOfSquares = 0;
370
+ let count = 0;
371
+ for (let i = 0; i < winSize && (offset + i) < audioData.length; i++) {
372
+ const sample = audioData[offset + i];
373
+ sumOfSquares += sample * sample;
374
+ count++;
375
+ }
376
+ const windowRms = count > 0 ? Math.sqrt(sumOfSquares / count) : 0;
377
+ rms[w] = windowRms;
378
+ totalMeanSquare += sumOfSquares;
379
+ totalSamples += count;
380
+ }
381
+ // Integrated LUFS approximation
382
+ // True LUFS uses K-weighting and gating; this is a simplified version
383
+ // using the mean square across the entire signal.
384
+ // LUFS ~= -0.691 + 10 * log10(mean_square)
385
+ const globalMeanSquare = totalSamples > 0 ? totalMeanSquare / totalSamples : 0;
386
+ const integratedLUFS = globalMeanSquare > 0
387
+ ? -0.691 + 10 * Math.log10(globalMeanSquare)
388
+ : -Infinity;
389
+ return {
390
+ rms,
391
+ windowSize: winSize,
392
+ hopSize,
393
+ integratedLUFS,
394
+ };
395
+ }
396
+ // ════════════════════════════════════════════════════════════════════════
397
+ // Zero-Crossing Rate
398
+ // ════════════════════════════════════════════════════════════════════════
399
+ computeZeroCrossingRate(audioData, windowSize) {
400
+ const winSize = windowSize !== null && windowSize !== void 0 ? windowSize : 1024;
401
+ const hopSize = winSize >>> 1;
402
+ const numWindows = Math.max(1, Math.floor((audioData.length - winSize) / hopSize) + 1);
403
+ const zcr = new Float32Array(numWindows);
404
+ for (let w = 0; w < numWindows; w++) {
405
+ const offset = w * hopSize;
406
+ let crossings = 0;
407
+ for (let i = 1; i < winSize && (offset + i) < audioData.length; i++) {
408
+ if ((audioData[offset + i] >= 0) !== (audioData[offset + i - 1] >= 0)) {
409
+ crossings++;
410
+ }
411
+ }
412
+ // Normalise: crossings per sample
413
+ zcr[w] = crossings / (winSize - 1);
414
+ }
415
+ return zcr;
416
+ }
417
+ // ════════════════════════════════════════════════════════════════════════
418
+ // Spectral Centroid
419
+ // ════════════════════════════════════════════════════════════════════════
420
+ computeSpectralCentroid(audioData, fftSize) {
421
+ const fft = fftSize !== null && fftSize !== void 0 ? fftSize : DEFAULT_FFT_SIZE;
422
+ const actualFftSize = this.nextPow2(fft);
423
+ const hopSize = actualFftSize >>> 1;
424
+ const hannWin = this.hannWindow(actualFftSize);
425
+ const numFrames = Math.max(1, Math.floor((audioData.length - actualFftSize) / hopSize) + 1);
426
+ const centroids = new Float32Array(numFrames);
427
+ const freqPerBin = this.sampleRate / actualFftSize;
428
+ for (let f = 0; f < numFrames; f++) {
429
+ const offset = f * hopSize;
430
+ const windowed = new Float32Array(actualFftSize);
431
+ for (let i = 0; i < actualFftSize; i++) {
432
+ windowed[i] = (offset + i < audioData.length)
433
+ ? audioData[offset + i] * hannWin[i]
434
+ : 0;
435
+ }
436
+ const { magnitude } = this.computeFFT(windowed, actualFftSize);
437
+ // Spectral centroid = sum(f_k * |X_k|) / sum(|X_k|)
438
+ let numerator = 0;
439
+ let denominator = 0;
440
+ for (let k = 0; k <= actualFftSize / 2; k++) {
441
+ const freq = k * freqPerBin;
442
+ numerator += freq * magnitude[k];
443
+ denominator += magnitude[k];
444
+ }
445
+ centroids[f] = denominator > 0 ? numerator / denominator : 0;
446
+ }
447
+ return centroids;
448
+ }
449
+ // ════════════════════════════════════════════════════════════════════════
450
+ // FFT — Radix-2 Cooley-Tukey (in-place, decimation-in-time)
451
+ // ════════════════════════════════════════════════════════════════════════
452
+ computeFFT(data, fftSize) {
453
+ const n = fftSize;
454
+ // Copy real input into interleaved complex arrays
455
+ const real = new Float32Array(n);
456
+ const imag = new Float32Array(n);
457
+ for (let i = 0; i < n; i++) {
458
+ real[i] = data[i];
459
+ // imag[i] is already 0
460
+ }
461
+ // Bit-reversal permutation
462
+ let j = 0;
463
+ for (let i = 0; i < n - 1; i++) {
464
+ if (i < j) {
465
+ // Swap real
466
+ let tmp = real[i];
467
+ real[i] = real[j];
468
+ real[j] = tmp;
469
+ // Swap imag
470
+ tmp = imag[i];
471
+ imag[i] = imag[j];
472
+ imag[j] = tmp;
473
+ }
474
+ let k = n >>> 1;
475
+ while (k <= j) {
476
+ j -= k;
477
+ k >>>= 1;
478
+ }
479
+ j += k;
480
+ }
481
+ // Cooley-Tukey butterfly stages
482
+ for (let stage = 1; stage < n; stage <<= 1) {
483
+ const halfStage = stage;
484
+ const fullStage = stage << 1;
485
+ const angleIncrement = -Math.PI / halfStage;
486
+ // Twiddle factors for this stage
487
+ let twiddleReal = 1;
488
+ let twiddleImag = 0;
489
+ const wReal = Math.cos(angleIncrement);
490
+ const wImag = Math.sin(angleIncrement);
491
+ for (let k = 0; k < halfStage; k++) {
492
+ for (let i = k; i < n; i += fullStage) {
493
+ const partner = i + halfStage;
494
+ // Butterfly
495
+ const tReal = twiddleReal * real[partner] - twiddleImag * imag[partner];
496
+ const tImag = twiddleReal * imag[partner] + twiddleImag * real[partner];
497
+ real[partner] = real[i] - tReal;
498
+ imag[partner] = imag[i] - tImag;
499
+ real[i] += tReal;
500
+ imag[i] += tImag;
501
+ }
502
+ // Rotate twiddle factor
503
+ const nextTwiddleReal = twiddleReal * wReal - twiddleImag * wImag;
504
+ const nextTwiddleImag = twiddleReal * wImag + twiddleImag * wReal;
505
+ twiddleReal = nextTwiddleReal;
506
+ twiddleImag = nextTwiddleImag;
507
+ }
508
+ }
509
+ // Compute magnitude and phase for bins 0..N/2
510
+ const halfN = n / 2;
511
+ const magnitude = new Float32Array(halfN + 1);
512
+ const phase = new Float32Array(halfN + 1);
513
+ for (let k = 0; k <= halfN; k++) {
514
+ magnitude[k] = Math.sqrt(real[k] * real[k] + imag[k] * imag[k]);
515
+ phase[k] = Math.atan2(imag[k], real[k]);
516
+ }
517
+ return { magnitude, phase };
518
+ }
519
+ // ════════════════════════════════════════════════════════════════════════
520
+ // Hann Window
521
+ // ════════════════════════════════════════════════════════════════════════
522
+ hannWindow(size) {
523
+ const window = new Float32Array(size);
524
+ for (let i = 0; i < size; i++) {
525
+ window[i] = 0.5 * (1 - Math.cos((2 * Math.PI * i) / (size - 1)));
526
+ }
527
+ return window;
528
+ }
529
+ // ════════════════════════════════════════════════════════════════════════
530
+ // Autocorrelation
531
+ // ════════════════════════════════════════════════════════════════════════
532
+ autocorrelate(data, minLag, maxLag) {
533
+ const n = data.length;
534
+ const resultLength = maxLag - minLag + 1;
535
+ const result = new Float32Array(resultLength);
536
+ // Subtract mean for better autocorrelation
537
+ let mean = 0;
538
+ for (let i = 0; i < n; i++)
539
+ mean += data[i];
540
+ mean /= n;
541
+ // Compute unnormalised autocorrelation for each lag
542
+ // R(lag) = sum_i( (x[i] - mean) * (x[i + lag] - mean) )
543
+ let normFactor = 0;
544
+ for (let i = 0; i < n; i++) {
545
+ const centered = data[i] - mean;
546
+ normFactor += centered * centered;
547
+ }
548
+ for (let lagIdx = 0; lagIdx < resultLength; lagIdx++) {
549
+ const lag = minLag + lagIdx;
550
+ let sum = 0;
551
+ for (let i = 0; i < n - lag; i++) {
552
+ sum += (data[i] - mean) * (data[i + lag] - mean);
553
+ }
554
+ // Normalise to [0,1]
555
+ result[lagIdx] = normFactor > 0 ? sum / normFactor : 0;
556
+ }
557
+ return result;
558
+ }
559
+ // ════════════════════════════════════════════════════════════════════════
560
+ // Utility
561
+ // ════════════════════════════════════════════════════════════════════════
562
+ nextPow2(v) {
563
+ let p = 1;
564
+ while (p < v)
565
+ p <<= 1;
566
+ return p;
567
+ }
568
+ }
569
+ //# sourceMappingURL=AudioAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnalyzer.js","sourceRoot":"","sources":["../../src/analysis/AudioAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -16,10 +16,14 @@ export declare class AudioEngine {
16
16
  private midiRecordedNotes;
17
17
  private midiNoteOnSub;
18
18
  private midiNoteOffSub;
19
+ /** Signal disconnect handles for cleanup on dispose */
20
+ private signalDisposers;
19
21
  private constructor();
20
22
  static getInstance(backend?: AudioProvider): AudioEngine;
21
23
  /** Reset the singleton instance. For testing only. */
22
24
  static resetInstance(): void;
25
+ /** Dispose all listeners and internal state to prevent memory leaks. */
26
+ private dispose;
23
27
  setBackend(backend: AudioProvider): void;
24
28
  /**
25
29
  * Pre-cache a decoded AudioBuffer so subsequent addSource/getAudioBuffer
@@ -31,7 +35,13 @@ export declare class AudioEngine {
31
35
  getCurrentTime(): number;
32
36
  getCurrentFrame(): number;
33
37
  seek(time: number): void;
34
- updateRegion(trackId: string, region: RegionDTO | Region): void;
38
+ /**
39
+ * Convert a Region domain object to a plain RegionDTO safe for postMessage.
40
+ * Only copies the properties defined in the RegionDTO interface, avoiding
41
+ * non-serialisable fields like Signal instances that would cause DataCloneError.
42
+ */
43
+ private static toRegionDTO;
44
+ updateRegion(trackId: string, _region: RegionDTO | Region): void;
35
45
  private setupSessionListeners;
36
46
  private bindTrackSignals;
37
47
  private getProcessorType;
@@ -39,6 +49,9 @@ export declare class AudioEngine {
39
49
  private connectProcessorSignals;
40
50
  private bindAutomationList;
41
51
  initialize(): Promise<void>;
52
+ private preRollTargetFrame;
53
+ private preRollArmedTracks;
54
+ private preRollWasMetronomeEnabled;
42
55
  start(): Promise<void>;
43
56
  private syncId;
44
57
  private requestFrame;