@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 @@
1
+ {"version":3,"file":"PluginPresetManager.d.ts","sourceRoot":"","sources":["../../src/plugins/PluginPresetManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;+BAC2B;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACrB;AAWD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAC5B,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAA0C;IAE1D;;;OAGG;IACH,SAAgB,cAAc,iBAAwB;IAItD;;;;OAIG;IACH,UAAU,CACN,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,aAAa,CAAC,EAAE,MAAM,GACvB,YAAY;IAoBf;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAkBvC;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE;IAIrD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAUrD;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAYnD;;;;;OAKG;IACH,sBAAsB,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,EAAE,GAChE,IAAI;IAqBP;;OAEG;IACH,SAAS,IAAI,MAAM;IAYnB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;CAaxD"}
@@ -0,0 +1,140 @@
1
+ import { Signal } from '../lib/Signal';
2
+ // ─── PluginPresetManager ─────────────────────────────────────────────────────
3
+ /**
4
+ * Manages plugin presets across all plugin types.
5
+ *
6
+ * Presets are organized by `pluginId` so they can be quickly looked up when
7
+ * a user opens a plugin UI. The manager distinguishes between factory
8
+ * presets (read-only, shipped with the application) and user presets.
9
+ *
10
+ * Signal-based notification is provided via `presetsChanged`, which emits
11
+ * the affected `pluginId` whenever presets are added, removed, or updated.
12
+ */
13
+ export class PluginPresetManager {
14
+ constructor() {
15
+ /** pluginId -> ordered array of presets */
16
+ this._presets = new Map();
17
+ /**
18
+ * Emitted whenever presets change for a given plugin. The payload is the
19
+ * affected `pluginId`.
20
+ */
21
+ this.presetsChanged = new Signal();
22
+ }
23
+ // ─── CRUD ─────────────────────────────────────────────────────────────
24
+ /**
25
+ * Save a new user preset for the specified plugin.
26
+ *
27
+ * @returns The newly created preset (with generated `id` and timestamp).
28
+ */
29
+ savePreset(pluginId, name, parameters, metadata, pluginVersion) {
30
+ const preset = {
31
+ id: crypto.randomUUID(),
32
+ name,
33
+ pluginId,
34
+ pluginVersion,
35
+ parameters: Object.assign({}, parameters),
36
+ metadata: metadata ? Object.assign({}, metadata) : undefined,
37
+ isFactory: false,
38
+ createdAt: new Date().toISOString(),
39
+ };
40
+ if (!this._presets.has(pluginId)) {
41
+ this._presets.set(pluginId, []);
42
+ }
43
+ this._presets.get(pluginId).push(preset);
44
+ this.presetsChanged.emit(pluginId);
45
+ return preset;
46
+ }
47
+ /**
48
+ * Delete a preset by its unique ID. Factory presets cannot be deleted.
49
+ *
50
+ * @returns `true` if the preset was found and deleted.
51
+ */
52
+ deletePreset(presetId) {
53
+ for (const [pluginId, presets] of this._presets) {
54
+ const index = presets.findIndex(p => p.id === presetId);
55
+ if (index === -1)
56
+ continue;
57
+ if (presets[index].isFactory) {
58
+ throw new Error(`Cannot delete factory preset: ${presets[index].name}`);
59
+ }
60
+ presets.splice(index, 1);
61
+ this.presetsChanged.emit(pluginId);
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ /**
67
+ * Get all presets (factory + user) for a given plugin type.
68
+ */
69
+ getPresetsForPlugin(pluginId) {
70
+ var _a;
71
+ return [...((_a = this._presets.get(pluginId)) !== null && _a !== void 0 ? _a : [])];
72
+ }
73
+ /**
74
+ * Get a single preset by its unique ID, searching across all plugins.
75
+ */
76
+ getPreset(presetId) {
77
+ for (const presets of this._presets.values()) {
78
+ const found = presets.find(p => p.id === presetId);
79
+ if (found)
80
+ return found;
81
+ }
82
+ return undefined;
83
+ }
84
+ // ─── Apply ────────────────────────────────────────────────────────────
85
+ /**
86
+ * Apply a preset to a live Plugin instance by calling `setParameter()`
87
+ * for each stored parameter value.
88
+ */
89
+ applyPreset(presetId, plugin) {
90
+ const preset = this.getPreset(presetId);
91
+ if (!preset) {
92
+ throw new Error(`Preset not found: ${presetId}`);
93
+ }
94
+ // Use the plugin's setState if available (bulk update)
95
+ plugin.setState(preset.parameters);
96
+ }
97
+ // ─── Factory presets ──────────────────────────────────────────────────
98
+ /**
99
+ * Register one or more factory presets for a plugin type.
100
+ *
101
+ * Factory presets are read-only and are prepended to the preset list so
102
+ * they appear before user presets in UIs.
103
+ */
104
+ registerFactoryPresets(pluginId, presets) {
105
+ if (!this._presets.has(pluginId)) {
106
+ this._presets.set(pluginId, []);
107
+ }
108
+ const list = this._presets.get(pluginId);
109
+ const factoryPresets = presets.map(p => (Object.assign(Object.assign({}, p), { id: `factory-${pluginId}-${crypto.randomUUID()}`, isFactory: true, createdAt: new Date().toISOString() })));
110
+ // Prepend factory presets so they appear first
111
+ list.unshift(...factoryPresets);
112
+ this.presetsChanged.emit(pluginId);
113
+ }
114
+ // ─── Serialization ────────────────────────────────────────────────────
115
+ /**
116
+ * Serialize all presets (factory + user) to a JSON string.
117
+ */
118
+ serialize() {
119
+ const snapshot = {
120
+ presets: {},
121
+ };
122
+ for (const [pluginId, presets] of this._presets) {
123
+ snapshot.presets[pluginId] = presets.map(p => (Object.assign({}, p)));
124
+ }
125
+ return JSON.stringify(snapshot, null, 2);
126
+ }
127
+ /**
128
+ * Restore a PluginPresetManager from a JSON string produced by
129
+ * `serialize()`.
130
+ */
131
+ static deserialize(json) {
132
+ const snapshot = JSON.parse(json);
133
+ const manager = new PluginPresetManager();
134
+ for (const [pluginId, presets] of Object.entries(snapshot.presets)) {
135
+ manager._presets.set(pluginId, presets.map(p => (Object.assign({}, p))));
136
+ }
137
+ return manager;
138
+ }
139
+ }
140
+ //# sourceMappingURL=PluginPresetManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginPresetManager.js","sourceRoot":"","sources":["../../src/plugins/PluginPresetManager.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,26 @@
1
1
  import { Signal } from '../lib/Signal';
2
2
  export type IOId = string;
3
+ export type IODataType = 'audio' | 'midi';
3
4
  export declare class IO {
4
5
  readonly id: IOId;
5
6
  name: string;
7
+ dataType: IODataType;
6
8
  private _connections;
9
+ private _latency;
10
+ private _bundleName?;
7
11
  readonly connected: Signal<string>;
8
12
  readonly disconnected: Signal<string>;
9
- constructor(id: IOId, name: string);
13
+ readonly latencyChanged: Signal<number>;
14
+ constructor(id: IOId, name: string, dataType?: IODataType);
15
+ get latency(): number;
16
+ set latency(value: number);
17
+ get bundleName(): string | undefined;
18
+ set bundleName(value: string | undefined);
19
+ /**
20
+ * Returns the maximum latency across all connected IOs.
21
+ * Accepts a resolver function that maps an IOId to its latency value.
22
+ */
23
+ getConnectedLatency(resolveLatency: (id: IOId) => number): number;
10
24
  connect(targetId: IOId): void;
11
25
  disconnect(targetId: IOId): void;
12
26
  get connections(): ReadonlyArray<IOId>;
@@ -1 +1 @@
1
- {"version":3,"file":"IO.d.ts","sourceRoot":"","sources":["../../src/processing/IO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAE1B,qBAAa,EAAE;IACX,SAAgB,EAAE,EAAE,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IAMpB,OAAO,CAAC,YAAY,CAAc;IAElC,SAAgB,SAAS,iBAAsB;IAC/C,SAAgB,YAAY,iBAAsB;gBAEtC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;IAK3B,OAAO,CAAC,QAAQ,EAAE,IAAI;IAOtB,UAAU,CAAC,QAAQ,EAAE,IAAI;IAQhC,IAAW,WAAW,IAAI,aAAa,CAAC,IAAI,CAAC,CAE5C;IAEM,aAAa,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO;CAGhD"}
1
+ {"version":3,"file":"IO.d.ts","sourceRoot":"","sources":["../../src/processing/IO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAE1B,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,qBAAa,EAAE;IACX,SAAgB,EAAE,EAAE,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IAM5B,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B,SAAgB,SAAS,iBAAsB;IAC/C,SAAgB,YAAY,iBAAsB;IAClD,SAAgB,cAAc,iBAAwB;gBAE1C,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAoB;IAMlE,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,OAAO,CAAC,KAAK,EAAE,MAAM,EAK/B;IAED,IAAW,UAAU,IAAI,MAAM,GAAG,SAAS,CAE1C;IAED,IAAW,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAE9C;IAED;;;OAGG;IACI,mBAAmB,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,MAAM,GAAG,MAAM;IAOjE,OAAO,CAAC,QAAQ,EAAE,IAAI;IAOtB,UAAU,CAAC,QAAQ,EAAE,IAAI;IAQhC,IAAW,WAAW,IAAI,aAAa,CAAC,IAAI,CAAC,CAE5C;IAEM,aAAa,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO;CAGhD"}
@@ -1,15 +1,43 @@
1
1
  import { Signal } from '../lib/Signal';
2
2
  export class IO {
3
- constructor(id, name) {
3
+ constructor(id, name, dataType = 'audio') {
4
4
  // Connected IOs (Output -> Input)
5
5
  // If this is an Output, `connections` lists the Inputs it feeds.
6
6
  // If this is an Input, `connections` implies source Outputs (though usually tracked by Output).
7
7
  // For simplicity, we model: Output knows its destinations.
8
8
  this._connections = [];
9
+ this._latency = 0;
9
10
  this.connected = new Signal();
10
11
  this.disconnected = new Signal();
12
+ this.latencyChanged = new Signal();
11
13
  this.id = id;
12
14
  this.name = name;
15
+ this.dataType = dataType;
16
+ }
17
+ get latency() {
18
+ return this._latency;
19
+ }
20
+ set latency(value) {
21
+ if (this._latency !== value) {
22
+ this._latency = value;
23
+ this.latencyChanged.emit(value);
24
+ }
25
+ }
26
+ get bundleName() {
27
+ return this._bundleName;
28
+ }
29
+ set bundleName(value) {
30
+ this._bundleName = value;
31
+ }
32
+ /**
33
+ * Returns the maximum latency across all connected IOs.
34
+ * Accepts a resolver function that maps an IOId to its latency value.
35
+ */
36
+ getConnectedLatency(resolveLatency) {
37
+ if (this._connections.length === 0) {
38
+ return 0;
39
+ }
40
+ return Math.max(...this._connections.map(resolveLatency));
13
41
  }
14
42
  connect(targetId) {
15
43
  if (!this._connections.includes(targetId)) {
@@ -1 +1 @@
1
- {"version":3,"file":"IO.js","sourceRoot":"","sources":["../../src/processing/IO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvC,MAAM,OAAO,EAAE;IAaX,YAAY,EAAQ,EAAE,IAAY;QATlC,kCAAkC;QAClC,iEAAiE;QACjE,gGAAgG;QAChG,2DAA2D;QACnD,iBAAY,GAAW,EAAE,CAAC;QAElB,cAAS,GAAG,IAAI,MAAM,EAAQ,CAAC;QAC/B,iBAAY,GAAG,IAAI,MAAM,EAAQ,CAAC;QAG9C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAEM,OAAO,CAAC,QAAc;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAEM,UAAU,CAAC,QAAc;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IAED,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,QAAc;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;CACJ"}
1
+ {"version":3,"file":"IO.js","sourceRoot":"","sources":["../../src/processing/IO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAMvC,MAAM,OAAO,EAAE;IAkBX,YAAY,EAAQ,EAAE,IAAY,EAAE,WAAuB,OAAO;QAblE,kCAAkC;QAClC,iEAAiE;QACjE,gGAAgG;QAChG,2DAA2D;QACnD,iBAAY,GAAW,EAAE,CAAC;QAE1B,aAAQ,GAAW,CAAC,CAAC;QAGb,cAAS,GAAG,IAAI,MAAM,EAAQ,CAAC;QAC/B,iBAAY,GAAG,IAAI,MAAM,EAAQ,CAAC;QAClC,mBAAc,GAAG,IAAI,MAAM,EAAU,CAAC;QAGlD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,OAAO,CAAC,KAAa;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,KAAyB;QAC3C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,mBAAmB,CAAC,cAAoC;QAC3D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEM,OAAO,CAAC,QAAc;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAEM,UAAU,CAAC,QAAc;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IAED,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,QAAc;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;CACJ"}
@@ -0,0 +1,104 @@
1
+ import { Processor, ProcessorId } from './Processor';
2
+ import { Signal } from '../lib/Signal';
3
+ import { TrackId } from '../domain/types';
4
+ /**
5
+ * InternalSend routes audio from one route to another internally.
6
+ * Unlike regular sends that go to a send bus, internal sends
7
+ * create a direct connection between two routes.
8
+ *
9
+ * Ardour reference: libs/ardour/internal_send.cc
10
+ */
11
+ export interface InternalSendSnapshot {
12
+ id: ProcessorId;
13
+ name: string;
14
+ targetTrackId: string;
15
+ sendLevel: number;
16
+ preFader: boolean;
17
+ muted: boolean;
18
+ active: boolean;
19
+ }
20
+ export interface InternalReturnSnapshot {
21
+ id: ProcessorId;
22
+ name: string;
23
+ sourceTrackIds: string[];
24
+ active: boolean;
25
+ }
26
+ export declare class InternalSend extends Processor {
27
+ private _targetTrackId;
28
+ private _sendLevel;
29
+ private _preFader;
30
+ private _muted;
31
+ readonly targetChanged: Signal<string>;
32
+ readonly levelChanged: Signal<number>;
33
+ constructor(id: ProcessorId, name: string, targetTrackId: TrackId);
34
+ /** The ID of the target track that receives audio from this send. */
35
+ get targetTrackId(): TrackId;
36
+ /**
37
+ * Change the target track.
38
+ * @param trackId The new target track ID.
39
+ */
40
+ setTarget(trackId: TrackId): void;
41
+ /** Send level in dB. 0 dB = unity gain. */
42
+ get sendLevel(): number;
43
+ /**
44
+ * Set the send level in dB.
45
+ * @param db Level in decibels. -Infinity = silence, 0 = unity.
46
+ */
47
+ setSendLevel(db: number): void;
48
+ /** Whether this send taps the signal before the channel fader. */
49
+ get preFader(): boolean;
50
+ /**
51
+ * Set whether this send is pre-fader or post-fader.
52
+ * @param pre true for pre-fader, false for post-fader.
53
+ */
54
+ setPreFader(pre: boolean): void;
55
+ /** Whether this send is muted. */
56
+ get muted(): boolean;
57
+ /**
58
+ * Set the mute state of this send.
59
+ * @param muted true to mute, false to unmute.
60
+ */
61
+ setMuted(muted: boolean): void;
62
+ /**
63
+ * Compute the linear gain to apply to audio routed through this send.
64
+ * Takes into account the send level (dB) and mute state.
65
+ *
66
+ * @returns Linear gain (0.0 if muted or inactive).
67
+ */
68
+ getLinearGain(): number;
69
+ toJSON(): InternalSendSnapshot;
70
+ static fromJSON(data: InternalSendSnapshot): InternalSend;
71
+ }
72
+ /**
73
+ * InternalReturn receives audio from InternalSend(s).
74
+ *
75
+ * An InternalReturn is placed in the processor chain of the receiving track.
76
+ * It collects audio from any number of InternalSend processors that target
77
+ * the track containing this return.
78
+ */
79
+ export declare class InternalReturn extends Processor {
80
+ private _sourceTrackIds;
81
+ readonly sourceAdded: Signal<string>;
82
+ readonly sourceRemoved: Signal<string>;
83
+ constructor(id: ProcessorId, name: string);
84
+ /**
85
+ * Register a source track that is sending audio to this return.
86
+ * @param trackId The source track ID.
87
+ */
88
+ addSource(trackId: TrackId): void;
89
+ /**
90
+ * Remove a source track from this return.
91
+ * @param trackId The source track ID to remove.
92
+ */
93
+ removeSource(trackId: TrackId): void;
94
+ /** List of all source track IDs sending audio to this return. */
95
+ get sourceTrackIds(): ReadonlyArray<TrackId>;
96
+ /**
97
+ * Check if a specific track is registered as a source.
98
+ * @param trackId The track ID to check.
99
+ */
100
+ hasSource(trackId: TrackId): boolean;
101
+ toJSON(): InternalReturnSnapshot;
102
+ static fromJSON(data: InternalReturnSnapshot): InternalReturn;
103
+ }
104
+ //# sourceMappingURL=InternalSend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalSend.d.ts","sourceRoot":"","sources":["../../src/processing/InternalSend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;;;GAMG;AAEH,MAAM,WAAW,oBAAoB;IACjC,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACnC,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,YAAa,SAAQ,SAAS;IACvC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,MAAM,CAAkB;IAEhC,SAAgB,aAAa,iBAAyB;IACtD,SAAgB,YAAY,iBAAwB;gBAExC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO;IAOjE,qEAAqE;IACrE,IAAW,aAAa,IAAI,OAAO,CAElC;IAED;;;OAGG;IACI,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAUxC,2CAA2C;IAC3C,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;OAGG;IACI,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAUrC,kEAAkE;IAClE,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED;;;OAGG;IACI,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAStC,kCAAkC;IAClC,IAAW,KAAK,IAAI,OAAO,CAE1B;IAED;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IASrC;;;;;OAKG;IACI,aAAa,IAAI,MAAM;IAUvB,MAAM,IAAI,oBAAoB;WAYvB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,YAAY;CAYnE;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,SAAS;IACzC,OAAO,CAAC,eAAe,CAA2B;IAElD,SAAgB,WAAW,iBAAyB;IACpD,SAAgB,aAAa,iBAAyB;gBAE1C,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;IAIzC;;;OAGG;IACI,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQxC;;;OAGG;IACI,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQ3C,iEAAiE;IACjE,IAAW,cAAc,IAAI,aAAa,CAAC,OAAO,CAAC,CAElD;IAED;;;OAGG;IACI,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAMpC,MAAM,IAAI,sBAAsB;WASzB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,GAAG,cAAc;CAQvE"}
@@ -0,0 +1,175 @@
1
+ import { Processor } from './Processor';
2
+ import { Signal } from '../lib/Signal';
3
+ export class InternalSend extends Processor {
4
+ constructor(id, name, targetTrackId) {
5
+ super(id, name);
6
+ this._sendLevel = 0; // dB
7
+ this._preFader = false;
8
+ this._muted = false;
9
+ this.targetChanged = new Signal();
10
+ this.levelChanged = new Signal();
11
+ this._targetTrackId = targetTrackId;
12
+ }
13
+ // ── Target ──────────────────────────────────────────────────────────────
14
+ /** The ID of the target track that receives audio from this send. */
15
+ get targetTrackId() {
16
+ return this._targetTrackId;
17
+ }
18
+ /**
19
+ * Change the target track.
20
+ * @param trackId The new target track ID.
21
+ */
22
+ setTarget(trackId) {
23
+ if (this._targetTrackId !== trackId) {
24
+ this._targetTrackId = trackId;
25
+ this.targetChanged.emit(trackId);
26
+ this.stateChanged.emit();
27
+ }
28
+ }
29
+ // ── Send Level ──────────────────────────────────────────────────────────
30
+ /** Send level in dB. 0 dB = unity gain. */
31
+ get sendLevel() {
32
+ return this._sendLevel;
33
+ }
34
+ /**
35
+ * Set the send level in dB.
36
+ * @param db Level in decibels. -Infinity = silence, 0 = unity.
37
+ */
38
+ setSendLevel(db) {
39
+ if (this._sendLevel !== db) {
40
+ this._sendLevel = db;
41
+ this.levelChanged.emit(db);
42
+ this.stateChanged.emit();
43
+ }
44
+ }
45
+ // ── Pre/Post Fader ──────────────────────────────────────────────────────
46
+ /** Whether this send taps the signal before the channel fader. */
47
+ get preFader() {
48
+ return this._preFader;
49
+ }
50
+ /**
51
+ * Set whether this send is pre-fader or post-fader.
52
+ * @param pre true for pre-fader, false for post-fader.
53
+ */
54
+ setPreFader(pre) {
55
+ if (this._preFader !== pre) {
56
+ this._preFader = pre;
57
+ this.stateChanged.emit();
58
+ }
59
+ }
60
+ // ── Mute ────────────────────────────────────────────────────────────────
61
+ /** Whether this send is muted. */
62
+ get muted() {
63
+ return this._muted;
64
+ }
65
+ /**
66
+ * Set the mute state of this send.
67
+ * @param muted true to mute, false to unmute.
68
+ */
69
+ setMuted(muted) {
70
+ if (this._muted !== muted) {
71
+ this._muted = muted;
72
+ this.stateChanged.emit();
73
+ }
74
+ }
75
+ // ── Gain computation ────────────────────────────────────────────────────
76
+ /**
77
+ * Compute the linear gain to apply to audio routed through this send.
78
+ * Takes into account the send level (dB) and mute state.
79
+ *
80
+ * @returns Linear gain (0.0 if muted or inactive).
81
+ */
82
+ getLinearGain() {
83
+ if (this._muted || !this.active) {
84
+ return 0;
85
+ }
86
+ // Convert dB to linear: gain = 10^(dB/20)
87
+ return Math.pow(10, this._sendLevel / 20);
88
+ }
89
+ // ── Serialization ───────────────────────────────────────────────────────
90
+ toJSON() {
91
+ return {
92
+ id: this.id,
93
+ name: this.name,
94
+ targetTrackId: this._targetTrackId,
95
+ sendLevel: this._sendLevel,
96
+ preFader: this._preFader,
97
+ muted: this._muted,
98
+ active: this.active,
99
+ };
100
+ }
101
+ static fromJSON(data) {
102
+ const send = new InternalSend(data.id, data.name, data.targetTrackId);
103
+ send._sendLevel = data.sendLevel;
104
+ send._preFader = data.preFader;
105
+ send._muted = data.muted;
106
+ send.active = data.active;
107
+ return send;
108
+ }
109
+ }
110
+ /**
111
+ * InternalReturn receives audio from InternalSend(s).
112
+ *
113
+ * An InternalReturn is placed in the processor chain of the receiving track.
114
+ * It collects audio from any number of InternalSend processors that target
115
+ * the track containing this return.
116
+ */
117
+ export class InternalReturn extends Processor {
118
+ constructor(id, name) {
119
+ super(id, name);
120
+ this._sourceTrackIds = new Set();
121
+ this.sourceAdded = new Signal();
122
+ this.sourceRemoved = new Signal();
123
+ }
124
+ /**
125
+ * Register a source track that is sending audio to this return.
126
+ * @param trackId The source track ID.
127
+ */
128
+ addSource(trackId) {
129
+ if (!this._sourceTrackIds.has(trackId)) {
130
+ this._sourceTrackIds.add(trackId);
131
+ this.sourceAdded.emit(trackId);
132
+ this.stateChanged.emit();
133
+ }
134
+ }
135
+ /**
136
+ * Remove a source track from this return.
137
+ * @param trackId The source track ID to remove.
138
+ */
139
+ removeSource(trackId) {
140
+ if (this._sourceTrackIds.has(trackId)) {
141
+ this._sourceTrackIds.delete(trackId);
142
+ this.sourceRemoved.emit(trackId);
143
+ this.stateChanged.emit();
144
+ }
145
+ }
146
+ /** List of all source track IDs sending audio to this return. */
147
+ get sourceTrackIds() {
148
+ return Array.from(this._sourceTrackIds);
149
+ }
150
+ /**
151
+ * Check if a specific track is registered as a source.
152
+ * @param trackId The track ID to check.
153
+ */
154
+ hasSource(trackId) {
155
+ return this._sourceTrackIds.has(trackId);
156
+ }
157
+ // ── Serialization ───────────────────────────────────────────────────────
158
+ toJSON() {
159
+ return {
160
+ id: this.id,
161
+ name: this.name,
162
+ sourceTrackIds: Array.from(this._sourceTrackIds),
163
+ active: this.active,
164
+ };
165
+ }
166
+ static fromJSON(data) {
167
+ const ret = new InternalReturn(data.id, data.name);
168
+ for (const id of data.sourceTrackIds) {
169
+ ret._sourceTrackIds.add(id);
170
+ }
171
+ ret.active = data.active;
172
+ return ret;
173
+ }
174
+ }
175
+ //# sourceMappingURL=InternalSend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalSend.js","sourceRoot":"","sources":["../../src/processing/InternalSend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AA4BvC,MAAM,OAAO,YAAa,SAAQ,SAAS;IASvC,YAAY,EAAe,EAAE,IAAY,EAAE,aAAsB;QAC7D,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QARZ,eAAU,GAAW,CAAC,CAAC,CAAE,KAAK;QAC9B,cAAS,GAAY,KAAK,CAAC;QAC3B,WAAM,GAAY,KAAK,CAAC;QAEhB,kBAAa,GAAG,IAAI,MAAM,EAAW,CAAC;QACtC,iBAAY,GAAG,IAAI,MAAM,EAAU,CAAC;QAIhD,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAED,2EAA2E;IAE3E,qEAAqE;IACrE,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,OAAgB;QAC7B,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,2EAA2E;IAE3E,2CAA2C;IAC3C,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,EAAU;QAC1B,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,2EAA2E;IAE3E,kEAAkE;IAClE,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,GAAY;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,2EAA2E;IAE3E,kCAAkC;IAClC,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,KAAc;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,2EAA2E;IAE3E;;;;;OAKG;IACI,aAAa;QAChB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC;QACb,CAAC;QACD,0CAA0C;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,2EAA2E;IAEpE,MAAM;QACT,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,CAAC,cAAc;YAClC,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,IAA0B;QAC7C,MAAM,IAAI,GAAG,IAAI,YAAY,CACzB,IAAI,CAAC,EAAiB,EACtB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,aAAwB,CAChC,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED;;;;;;GAMG;AACH,MAAM,OAAO,cAAe,SAAQ,SAAS;IAMzC,YAAY,EAAe,EAAE,IAAY;QACrC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QANZ,oBAAe,GAAiB,IAAI,GAAG,EAAE,CAAC;QAElC,gBAAW,GAAG,IAAI,MAAM,EAAW,CAAC;QACpC,kBAAa,GAAG,IAAI,MAAM,EAAW,CAAC;IAItD,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,OAAgB;QAC7B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,OAAgB;QAChC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,IAAW,cAAc;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,OAAgB;QAC7B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,2EAA2E;IAEpE,MAAM;QACT,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,IAA4B;QAC/C,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,EAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAa,CAAC,CAAC;QAC3C,CAAC;QACD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}