@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,164 @@
1
+ /**
2
+ * CD Marker Exporter
3
+ *
4
+ * Generates industry-standard marker/chapter files from CDMarker data.
5
+ * Supports CUE sheets, cdrdao TOC files, and Nero-style MP4 chapter files.
6
+ *
7
+ * Ardour reference: libs/ardour/export_handler.cc
8
+ */
9
+ export class CDMarkerExporter {
10
+ /**
11
+ * Generate a CUE sheet from CD markers.
12
+ *
13
+ * CUE format reference: https://en.wikipedia.org/wiki/Cue_sheet_(computing)
14
+ * Time format: MM:SS:FF where FF = CD frames (75 fps)
15
+ *
16
+ * @param markers Array of CDMarker instances
17
+ * @param filename Audio filename referenced in the CUE sheet
18
+ * @param sampleRate Sample rate of the audio
19
+ * @param albumTitle Optional album title
20
+ * @param albumPerformer Optional album performer
21
+ */
22
+ static generateCUE(markers, filename, sampleRate, albumTitle = 'Untitled', albumPerformer = '') {
23
+ const sorted = [...markers].sort((a, b) => a.index - b.index);
24
+ const lines = [];
25
+ // Global header
26
+ lines.push(`REM COMMENT "Generated by drop.ai"`);
27
+ if (albumPerformer) {
28
+ lines.push(`PERFORMER "${albumPerformer}"`);
29
+ }
30
+ lines.push(`TITLE "${albumTitle}"`);
31
+ lines.push(`FILE "${filename}" WAVE`);
32
+ for (const marker of sorted) {
33
+ const trackNum = String(marker.index).padStart(2, '0');
34
+ lines.push(` TRACK ${trackNum} AUDIO`);
35
+ if (marker.title) {
36
+ lines.push(` TITLE "${marker.title}"`);
37
+ }
38
+ if (marker.performer) {
39
+ lines.push(` PERFORMER "${marker.performer}"`);
40
+ }
41
+ if (marker.isrc) {
42
+ lines.push(` ISRC ${marker.isrc}`);
43
+ }
44
+ const cdTime = CDMarkerExporter.framesToCDTime(marker.position, sampleRate);
45
+ lines.push(` INDEX 01 ${cdTime}`);
46
+ }
47
+ return lines.join('\n') + '\n';
48
+ }
49
+ /**
50
+ * Generate a cdrdao-compatible TOC (Table of Contents) file.
51
+ *
52
+ * TOC format reference: cdrdao(1) man page
53
+ *
54
+ * @param markers Array of CDMarker instances
55
+ * @param filename Audio filename
56
+ * @param sampleRate Sample rate of the audio
57
+ */
58
+ static generateTOC(markers, filename, sampleRate) {
59
+ const sorted = [...markers].sort((a, b) => a.index - b.index);
60
+ const lines = [];
61
+ lines.push('CD_DA');
62
+ lines.push('');
63
+ lines.push('// Generated by drop.ai');
64
+ lines.push('');
65
+ for (let i = 0; i < sorted.length; i++) {
66
+ const marker = sorted[i];
67
+ lines.push(`// Track ${marker.index}`);
68
+ lines.push('TRACK AUDIO');
69
+ // CD-TEXT block
70
+ if (marker.title || marker.performer) {
71
+ lines.push('CD_TEXT {');
72
+ lines.push(' LANGUAGE 0 {');
73
+ if (marker.title) {
74
+ lines.push(` TITLE "${marker.title}"`);
75
+ }
76
+ if (marker.performer) {
77
+ lines.push(` PERFORMER "${marker.performer}"`);
78
+ }
79
+ lines.push(' }');
80
+ lines.push('}');
81
+ }
82
+ // ISRC
83
+ if (marker.isrc) {
84
+ lines.push(`ISRC "${marker.isrc}"`);
85
+ }
86
+ // Pregap for first track (standard 2-second pregap)
87
+ if (i === 0 && marker.position === 0) {
88
+ lines.push('PREGAP 00:02:00');
89
+ }
90
+ // File reference with start time
91
+ const cdTime = CDMarkerExporter.framesToCDTime(marker.position, sampleRate);
92
+ // Calculate length if next marker exists
93
+ if (i + 1 < sorted.length) {
94
+ const nextMarker = sorted[i + 1];
95
+ const lengthFrames = nextMarker.position - marker.position;
96
+ const lengthCdTime = CDMarkerExporter.framesToCDTime(lengthFrames, sampleRate);
97
+ lines.push(`FILE "${filename}" ${cdTime} ${lengthCdTime}`);
98
+ }
99
+ else {
100
+ // Last track: let cdrdao figure out the remaining length
101
+ lines.push(`FILE "${filename}" ${cdTime}`);
102
+ }
103
+ lines.push('');
104
+ }
105
+ return lines.join('\n');
106
+ }
107
+ /**
108
+ * Generate Nero-style MP4 chapter metadata.
109
+ *
110
+ * Format: CHAPTERXX=HH:MM:SS.mmm / CHAPTERXXNAME=Title
111
+ * This format is understood by ffmpeg via -i chapters.txt.
112
+ *
113
+ * @param markers Array of CDMarker instances
114
+ * @param sampleRate Sample rate of the audio
115
+ */
116
+ static generateMP4Chapters(markers, sampleRate) {
117
+ const sorted = [...markers].sort((a, b) => a.index - b.index);
118
+ const lines = [];
119
+ for (let i = 0; i < sorted.length; i++) {
120
+ const marker = sorted[i];
121
+ const chapterNum = String(i + 1).padStart(2, '0');
122
+ const timestamp = CDMarkerExporter.framesToTimestamp(marker.position, sampleRate);
123
+ lines.push(`CHAPTER${chapterNum}=${timestamp}`);
124
+ lines.push(`CHAPTER${chapterNum}NAME=${marker.title || `Chapter ${i + 1}`}`);
125
+ }
126
+ return lines.join('\n');
127
+ }
128
+ /**
129
+ * Convert a sample-frame position to CD time format MM:SS:FF.
130
+ * CD frames run at 75 fps (Red Book standard).
131
+ *
132
+ * @param frames Position in audio sample frames
133
+ * @param sampleRate Audio sample rate (e.g. 44100)
134
+ * @returns Time string in MM:SS:FF format
135
+ */
136
+ static framesToCDTime(frames, sampleRate) {
137
+ const totalSeconds = frames / sampleRate;
138
+ const minutes = Math.floor(totalSeconds / 60);
139
+ const seconds = Math.floor(totalSeconds % 60);
140
+ const cdFrames = Math.floor((totalSeconds % 1) * 75);
141
+ return (String(minutes).padStart(2, '0') + ':' +
142
+ String(seconds).padStart(2, '0') + ':' +
143
+ String(cdFrames).padStart(2, '0'));
144
+ }
145
+ /**
146
+ * Convert a sample-frame position to HH:MM:SS.mmm timestamp.
147
+ *
148
+ * @param frames Position in audio sample frames
149
+ * @param sampleRate Audio sample rate
150
+ * @returns Time string in HH:MM:SS.mmm format
151
+ */
152
+ static framesToTimestamp(frames, sampleRate) {
153
+ const totalSeconds = frames / sampleRate;
154
+ const hours = Math.floor(totalSeconds / 3600);
155
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
156
+ const seconds = Math.floor(totalSeconds % 60);
157
+ const millis = Math.floor((totalSeconds % 1) * 1000);
158
+ return (String(hours).padStart(2, '0') + ':' +
159
+ String(minutes).padStart(2, '0') + ':' +
160
+ String(seconds).padStart(2, '0') + '.' +
161
+ String(millis).padStart(3, '0'));
162
+ }
163
+ }
164
+ //# sourceMappingURL=CDMarkerExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CDMarkerExporter.js","sourceRoot":"","sources":["../../../src/audio/export/CDMarkerExporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { ExportConfig } from '../../domain/ExportConfig';
2
+ /**
3
+ * Analysis results from the analyzer node.
4
+ */
5
+ export interface ExportAnalysis {
6
+ peakDb: number;
7
+ rmsDb: number;
8
+ lufs: number;
9
+ truePeakDb: number;
10
+ dcOffset: number;
11
+ clippedSamples: number;
12
+ }
13
+ /**
14
+ * A single processing node in the export graph.
15
+ * Each node receives multi-channel audio (Float32Array[]) and returns processed arrays.
16
+ */
17
+ export interface ExportNode {
18
+ id: string;
19
+ type: 'source' | 'normalize' | 'limiter' | 'dither' | 'encoder' | 'analyzer' | 'silence_trim' | 'gain' | 'sample_rate_convert';
20
+ process(buffer: Float32Array[], sampleRate: number): Float32Array[] | Promise<Float32Array[]>;
21
+ }
22
+ /**
23
+ * Builds a dynamic processing chain for audio export.
24
+ *
25
+ * Instead of a fixed pipeline (as in OfflineExporter), ExportGraphBuilder
26
+ * assembles an ordered sequence of ExportNode instances based on the
27
+ * ExportConfig. Custom nodes can be inserted at any position to extend
28
+ * the chain without modifying the core logic.
29
+ *
30
+ * Ardour reference: libs/ardour/export_graph_builder.cc
31
+ */
32
+ export declare class ExportGraphBuilder {
33
+ private _nodes;
34
+ private _sampleRate;
35
+ private _channelCount;
36
+ private _config;
37
+ constructor(config: ExportConfig);
38
+ /**
39
+ * Build the processing graph from an ExportConfig.
40
+ * Clears any existing nodes and re-creates the chain.
41
+ */
42
+ buildFromConfig(config: ExportConfig): void;
43
+ /**
44
+ * Add a node to the graph.
45
+ * @param node The node to insert.
46
+ * @param position Optional zero-based index. Appends if omitted.
47
+ */
48
+ addNode(node: ExportNode, position?: number): void;
49
+ /**
50
+ * Remove a node by id.
51
+ */
52
+ removeNode(id: string): void;
53
+ /**
54
+ * Get the current ordered list of nodes (read-only copy).
55
+ */
56
+ getNodes(): ReadonlyArray<ExportNode>;
57
+ /**
58
+ * Process multi-channel audio through every node in sequence.
59
+ */
60
+ processBuffer(inputBuffer: Float32Array[]): Promise<Float32Array[]>;
61
+ /**
62
+ * Encode the processed buffer into a Blob according to the config format.
63
+ * This is a lightweight wrapper that delegates to format-specific logic.
64
+ */
65
+ encode(buffer: Float32Array[]): Promise<Blob>;
66
+ /**
67
+ * Create a normalization node.
68
+ * @param mode 'peak' or 'lufs'
69
+ * @param targetLevel Target level in dB (peak) or LUFS
70
+ */
71
+ static createNormalizeNode(mode: 'peak' | 'lufs', targetLevel: number): ExportNode;
72
+ /**
73
+ * Create a true-peak limiter node.
74
+ * @param ceiling Maximum true-peak level in dBTP (e.g. -1.0)
75
+ */
76
+ static createTruePeakLimiterNode(ceiling: number): ExportNode;
77
+ /**
78
+ * Create a dither node.
79
+ * @param type 'none', 'triangular', or 'shaped'
80
+ * @param bitDepth Target bit depth (16 or 24)
81
+ */
82
+ static createDitherNode(type: 'none' | 'triangular' | 'shaped', bitDepth: number): ExportNode;
83
+ /**
84
+ * Create a silence-trimming node.
85
+ * Removes leading and trailing silence below a threshold.
86
+ * @param thresholdDb Silence threshold in dBFS (e.g. -60)
87
+ */
88
+ static createSilenceTrimNode(thresholdDb: number): ExportNode;
89
+ /**
90
+ * Create a gain node.
91
+ * @param gainDb Gain in decibels
92
+ */
93
+ static createGainNode(gainDb: number): ExportNode;
94
+ /**
95
+ * Create a sample-rate conversion node.
96
+ * Uses linear interpolation for simplicity; a production implementation
97
+ * would use windowed sinc interpolation.
98
+ * @param fromRate Source sample rate
99
+ * @param toRate Target sample rate
100
+ */
101
+ static createSampleRateConverter(fromRate: number, toRate: number): ExportNode;
102
+ /**
103
+ * Create an analyzer node that measures audio characteristics
104
+ * without modifying the signal (pass-through).
105
+ */
106
+ static createAnalyzerNode(): ExportNode & {
107
+ getAnalysis(): ExportAnalysis;
108
+ };
109
+ /**
110
+ * Encode multi-channel Float32Array[] as a WAV Blob.
111
+ * Supports int16, int24, and float32.
112
+ */
113
+ private _encodeWav;
114
+ /**
115
+ * Wrap raw Float32 data in a generic Blob (placeholder for formats
116
+ * that require external encoders such as MP3, OGG, FLAC).
117
+ */
118
+ private _encodeRaw;
119
+ private _writeString;
120
+ }
121
+ //# sourceMappingURL=ExportGraphBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportGraphBuilder.d.ts","sourceRoot":"","sources":["../../../src/audio/export/ExportGraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,2BAA2B,CAAC;AAG3F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,MAAM,GAAG,qBAAqB,CAAC;IAC/H,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACjG;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAe;gBAElB,MAAM,EAAE,YAAY;IAQhC;;;OAGG;IACI,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAmDlD;;;;OAIG;IACI,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAQzD;;OAEG;IACI,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACI,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAC;IAK5C;;OAEG;IACU,aAAa,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQhF;;;OAGG;IACU,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1D;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU;IAqDlF;;;OAGG;IACH,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IA+B7D;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;IAkC7F;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU;IA6C7D;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;IAgBjD;;;;;;OAMG;IACH,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IAgC9E;;;OAGG;IACH,MAAM,CAAC,kBAAkB,IAAI,UAAU,GAAG;QAAE,WAAW,IAAI,cAAc,CAAA;KAAE;IAwE3E;;;OAGG;IACH,OAAO,CAAC,UAAU;IAqFlB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,YAAY;CAKvB"}