@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,239 @@
1
+ import { Signal } from '../lib/Signal';
2
+ /**
3
+ * Auditioner provides solo preview playback of audio sources.
4
+ *
5
+ * Ardour reference: libs/ardour/auditioner.cc
6
+ *
7
+ * Used to preview audio files before importing, or to audition
8
+ * regions/clips without affecting the main transport.
9
+ * Plays through a dedicated output path that bypasses the mixer.
10
+ */
11
+ export var AuditionerState;
12
+ (function (AuditionerState) {
13
+ AuditionerState["IDLE"] = "IDLE";
14
+ AuditionerState["LOADING"] = "LOADING";
15
+ AuditionerState["PLAYING"] = "PLAYING";
16
+ AuditionerState["PAUSED"] = "PAUSED";
17
+ })(AuditionerState || (AuditionerState = {}));
18
+ export class Auditioner {
19
+ constructor() {
20
+ this._state = AuditionerState.IDLE;
21
+ this._currentSourceId = null;
22
+ this._currentUrl = null;
23
+ this._position = 0;
24
+ this._duration = 0;
25
+ this._gain = 1.0;
26
+ this._looping = false;
27
+ // Region preview: play a specific portion of a source
28
+ this._regionStart = 0;
29
+ this._regionLength = 0;
30
+ this.stateChanged = new Signal();
31
+ this.positionChanged = new Signal();
32
+ this.finished = new Signal();
33
+ }
34
+ // ---------------------------------------------------------------
35
+ // Getters
36
+ // ---------------------------------------------------------------
37
+ get state() {
38
+ return this._state;
39
+ }
40
+ get isPlaying() {
41
+ return this._state === AuditionerState.PLAYING;
42
+ }
43
+ get position() {
44
+ return this._position;
45
+ }
46
+ get duration() {
47
+ return this._duration;
48
+ }
49
+ get currentSourceId() {
50
+ return this._currentSourceId;
51
+ }
52
+ // ---------------------------------------------------------------
53
+ // Audition API
54
+ // ---------------------------------------------------------------
55
+ /**
56
+ * Audition an entire source by URL.
57
+ *
58
+ * Cancels any currently active audition, then begins playback of the
59
+ * full source from the beginning.
60
+ */
61
+ auditSource(sourceId, url, duration) {
62
+ this.cancel();
63
+ this._currentSourceId = sourceId;
64
+ this._currentUrl = url;
65
+ this._duration = duration;
66
+ this._position = 0;
67
+ this._regionStart = 0;
68
+ this._regionLength = duration;
69
+ this.setState(AuditionerState.LOADING);
70
+ // Transition to PLAYING — in a real implementation this would wait for
71
+ // the audio backend to signal readiness, but for the domain model we
72
+ // treat the source as immediately available once loaded by the cache.
73
+ this.setState(AuditionerState.PLAYING);
74
+ }
75
+ /**
76
+ * Audition a specific region of a source.
77
+ *
78
+ * Useful for previewing a trimmed region or a clip without
79
+ * having to play the full underlying source.
80
+ */
81
+ auditRegion(sourceId, url, start, length) {
82
+ this.cancel();
83
+ this._currentSourceId = sourceId;
84
+ this._currentUrl = url;
85
+ this._duration = length;
86
+ this._position = 0;
87
+ this._regionStart = start;
88
+ this._regionLength = length;
89
+ this.setState(AuditionerState.LOADING);
90
+ this.setState(AuditionerState.PLAYING);
91
+ }
92
+ // ---------------------------------------------------------------
93
+ // Transport controls
94
+ // ---------------------------------------------------------------
95
+ /**
96
+ * Resume or start playback of the current audition.
97
+ */
98
+ play() {
99
+ if (this._state === AuditionerState.PAUSED ||
100
+ this._state === AuditionerState.LOADING) {
101
+ this.setState(AuditionerState.PLAYING);
102
+ }
103
+ }
104
+ /**
105
+ * Pause the current audition. Position is preserved so playback
106
+ * can be resumed with {@link play}.
107
+ */
108
+ pause() {
109
+ if (this._state === AuditionerState.PLAYING) {
110
+ this.setState(AuditionerState.PAUSED);
111
+ }
112
+ }
113
+ /**
114
+ * Stop playback and reset position to the beginning.
115
+ */
116
+ stop() {
117
+ if (this._state === AuditionerState.IDLE) {
118
+ return;
119
+ }
120
+ this._position = 0;
121
+ this.positionChanged.emit(this._position);
122
+ this.setState(AuditionerState.IDLE);
123
+ }
124
+ /**
125
+ * Seek to an absolute frame position within the auditioned region.
126
+ * The position is clamped to [0, duration).
127
+ */
128
+ seek(frame) {
129
+ if (this._currentSourceId === null) {
130
+ return;
131
+ }
132
+ this._position = Math.max(0, Math.min(frame, this._regionLength - 1));
133
+ this.positionChanged.emit(this._position);
134
+ }
135
+ // ---------------------------------------------------------------
136
+ // Settings
137
+ // ---------------------------------------------------------------
138
+ /**
139
+ * Set the auditioner output gain.
140
+ * @param gain Linear gain value (0.0 = silence, 1.0 = unity).
141
+ */
142
+ setGain(gain) {
143
+ this._gain = Math.max(0, gain);
144
+ }
145
+ /**
146
+ * Enable or disable looping for the current audition.
147
+ */
148
+ setLooping(loop) {
149
+ this._looping = loop;
150
+ }
151
+ // ---------------------------------------------------------------
152
+ // Audio processing
153
+ // ---------------------------------------------------------------
154
+ /**
155
+ * Called by the audio engine on each render cycle to advance the
156
+ * auditioner position and produce an output descriptor.
157
+ *
158
+ * Returns `null` when the auditioner is not actively playing.
159
+ * When playback reaches the end of the region and looping is
160
+ * disabled, emits the {@link finished} signal and transitions
161
+ * to IDLE.
162
+ *
163
+ * @param blockSize Number of frames in this render block.
164
+ * @param _sampleRate Current engine sample rate (reserved for
165
+ * future sample-rate conversion).
166
+ */
167
+ processBlock(blockSize, _sampleRate) {
168
+ if (this._state !== AuditionerState.PLAYING) {
169
+ return null;
170
+ }
171
+ if (this._currentSourceId === null || this._currentUrl === null) {
172
+ return null;
173
+ }
174
+ // Calculate how many frames we can actually render this block
175
+ const remaining = this._regionLength - this._position;
176
+ if (remaining <= 0) {
177
+ if (this._looping) {
178
+ this._position = 0;
179
+ }
180
+ else {
181
+ this.setState(AuditionerState.IDLE);
182
+ this._position = 0;
183
+ this.positionChanged.emit(this._position);
184
+ this.finished.emit(undefined);
185
+ return null;
186
+ }
187
+ }
188
+ const framesToRender = Math.min(blockSize, this._regionLength - this._position);
189
+ const output = {
190
+ sourceId: this._currentSourceId,
191
+ url: this._currentUrl,
192
+ startInSource: this._regionStart + this._position,
193
+ blockSize: framesToRender,
194
+ gain: this._gain,
195
+ };
196
+ this._position += framesToRender;
197
+ this.positionChanged.emit(this._position);
198
+ // Handle end-of-region
199
+ if (this._position >= this._regionLength) {
200
+ if (this._looping) {
201
+ this._position = 0;
202
+ }
203
+ else {
204
+ this.setState(AuditionerState.IDLE);
205
+ this._position = 0;
206
+ this.positionChanged.emit(this._position);
207
+ this.finished.emit(undefined);
208
+ }
209
+ }
210
+ return output;
211
+ }
212
+ // ---------------------------------------------------------------
213
+ // Cancel
214
+ // ---------------------------------------------------------------
215
+ /**
216
+ * Cancel the current audition and reset all state.
217
+ */
218
+ cancel() {
219
+ this._currentSourceId = null;
220
+ this._currentUrl = null;
221
+ this._position = 0;
222
+ this._duration = 0;
223
+ this._regionStart = 0;
224
+ this._regionLength = 0;
225
+ if (this._state !== AuditionerState.IDLE) {
226
+ this.setState(AuditionerState.IDLE);
227
+ }
228
+ }
229
+ // ---------------------------------------------------------------
230
+ // Private helpers
231
+ // ---------------------------------------------------------------
232
+ setState(state) {
233
+ if (this._state !== state) {
234
+ this._state = state;
235
+ this.stateChanged.emit(state);
236
+ }
237
+ }
238
+ }
239
+ //# sourceMappingURL=Auditioner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auditioner.js","sourceRoot":"","sources":["../../src/audio/Auditioner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * BWF (Broadcast Wave Format) metadata handler.
3
+ *
4
+ * Ardour reference: libs/ardour/broadcast_info.cc
5
+ *
6
+ * BWF extends standard WAV with a 'bext' chunk containing:
7
+ * - Description (256 chars)
8
+ * - Originator (32 chars)
9
+ * - OriginatorReference (32 chars)
10
+ * - OriginationDate (10 chars, YYYY-MM-DD)
11
+ * - OriginationTime (8 chars, HH:MM:SS)
12
+ * - TimeReference (64-bit sample count)
13
+ * - Version (2 bytes)
14
+ * - UMID (64 bytes)
15
+ * - LoudnessValue, LoudnessRange, MaxTruePeakLevel, etc.
16
+ * - CodingHistory (variable length)
17
+ *
18
+ * Specification: EBU Tech 3285 (v2)
19
+ */
20
+ export interface BWFData {
21
+ description: string;
22
+ originator: string;
23
+ originatorReference: string;
24
+ originationDate: string;
25
+ originationTime: string;
26
+ timeReference: bigint;
27
+ version: number;
28
+ umid: Uint8Array;
29
+ loudnessValue: number;
30
+ loudnessRange: number;
31
+ maxTruePeakLevel: number;
32
+ maxMomentaryLoudness: number;
33
+ maxShortTermLoudness: number;
34
+ codingHistory: string;
35
+ }
36
+ export declare class BWFMetadata {
37
+ /**
38
+ * Parse BWF metadata from a WAV file ArrayBuffer.
39
+ *
40
+ * Scans the RIFF/WAVE structure for a 'bext' chunk and decodes the
41
+ * fields according to EBU Tech 3285 v2. Returns `null` when no bext
42
+ * chunk is found.
43
+ */
44
+ static parse(wavData: ArrayBuffer): BWFData | null;
45
+ /**
46
+ * Serialise {@link BWFData} into a standalone bext chunk (including
47
+ * the 8-byte chunk header: 'bext' + uint32 size).
48
+ */
49
+ static createBextChunk(data: BWFData): ArrayBuffer;
50
+ /**
51
+ * Inject a bext chunk into an existing WAV file.
52
+ *
53
+ * If the WAV already contains a bext chunk it is replaced.
54
+ * The returned ArrayBuffer is a new, valid RIFF/WAVE file.
55
+ */
56
+ static injectBWF(wavData: ArrayBuffer, bwfData: BWFData): ArrayBuffer;
57
+ /**
58
+ * Create default BWF data suitable for a new recording.
59
+ *
60
+ * Populates the origination date/time from the current wall clock and
61
+ * sets all other fields to sensible defaults.
62
+ */
63
+ static createDefault(options?: {
64
+ description?: string;
65
+ originator?: string;
66
+ timeReference?: bigint;
67
+ sampleRate?: number;
68
+ }): BWFData;
69
+ /**
70
+ * Validate BWF data according to EBU Tech 3285 constraints.
71
+ *
72
+ * @returns An array of human-readable error strings (empty = valid).
73
+ */
74
+ static validate(data: BWFData): string[];
75
+ /**
76
+ * Read a fixed-length ASCII string from a DataView, trimming NUL
77
+ * padding from the right.
78
+ */
79
+ private static readFixedString;
80
+ /**
81
+ * Write a string into a fixed-length field, padding with NUL bytes.
82
+ */
83
+ private static writeFixedString;
84
+ /**
85
+ * Locate a RIFF chunk by its four-character ID.
86
+ *
87
+ * Returns the offset of the chunk *data* (after the 8-byte header)
88
+ * and the data size. Returns `null` if the chunk is not found.
89
+ */
90
+ private static findChunk;
91
+ /**
92
+ * Internal chunk finder that also returns the header offset (for
93
+ * replacement scenarios in {@link injectBWF}).
94
+ */
95
+ private static findChunkRaw;
96
+ /**
97
+ * Read a four-character chunk ID from a DataView.
98
+ */
99
+ private static readChunkId;
100
+ /**
101
+ * Write a four-character chunk ID into a DataView.
102
+ */
103
+ private static writeChunkId;
104
+ /**
105
+ * Encode a string to a Uint8Array using ASCII (Latin-1 subset).
106
+ */
107
+ private static encodeString;
108
+ /**
109
+ * Generate a unique originator reference string.
110
+ *
111
+ * EBU R99-1999 recommends a format based on country code, org code,
112
+ * and a serial number. We use a simplified random approach.
113
+ */
114
+ private static generateOriginatorReference;
115
+ }
116
+ //# sourceMappingURL=BWFMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BWFMetadata.d.ts","sourceRoot":"","sources":["../../src/audio/BWFMetadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,OAAO;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACzB;AA+CD,qBAAa,WAAW;IAKpB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI;IA0DlD;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW;IAuDlD;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW;IAwErE;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO;IA+BX;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE;IAmDxC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAU9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAMxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IA0B3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAS1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAQ3B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;CAK7C"}