@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,84 @@
1
+ /**
2
+ * Sample Rate Converter
3
+ * Ardour reference: libs/ardour/resampled_source.cc
4
+ *
5
+ * Uses OfflineAudioContext for high-quality resampling.
6
+ * Falls back to linear interpolation in non-browser environments.
7
+ */
8
+ /**
9
+ * Resample an AudioBuffer to a target sample rate.
10
+ * Uses OfflineAudioContext (native resampler) when available.
11
+ *
12
+ * @param buffer Source audio buffer
13
+ * @param targetSampleRate Desired sample rate
14
+ * @returns Resampled AudioBuffer
15
+ */
16
+ export async function resampleAudio(buffer, targetSampleRate) {
17
+ if (buffer.sampleRate === targetSampleRate) {
18
+ return buffer; // No conversion needed
19
+ }
20
+ // Use OfflineAudioContext for native high-quality resampling
21
+ if (typeof OfflineAudioContext !== 'undefined') {
22
+ return resampleWithOfflineContext(buffer, targetSampleRate);
23
+ }
24
+ // Fallback: linear interpolation
25
+ return resampleLinear(buffer, targetSampleRate);
26
+ }
27
+ /**
28
+ * Native resampling using OfflineAudioContext.
29
+ */
30
+ async function resampleWithOfflineContext(buffer, targetSampleRate) {
31
+ const ratio = targetSampleRate / buffer.sampleRate;
32
+ const newLength = Math.ceil(buffer.length * ratio);
33
+ const offlineCtx = new OfflineAudioContext(buffer.numberOfChannels, newLength, targetSampleRate);
34
+ const source = offlineCtx.createBufferSource();
35
+ source.buffer = buffer;
36
+ source.connect(offlineCtx.destination);
37
+ source.start(0);
38
+ return await offlineCtx.startRendering();
39
+ }
40
+ /**
41
+ * Linear interpolation resampling (fallback for non-browser environments).
42
+ */
43
+ function resampleLinear(buffer, targetSampleRate) {
44
+ const ratio = buffer.sampleRate / targetSampleRate;
45
+ const newLength = Math.ceil(buffer.length / ratio);
46
+ const numChannels = buffer.numberOfChannels;
47
+ // Create output channel data
48
+ const outputChannels = [];
49
+ for (let ch = 0; ch < numChannels; ch++) {
50
+ const input = buffer.getChannelData(ch);
51
+ const output = new Float32Array(newLength);
52
+ for (let i = 0; i < newLength; i++) {
53
+ const srcPos = i * ratio;
54
+ const srcIdx = Math.floor(srcPos);
55
+ const frac = srcPos - srcIdx;
56
+ if (srcIdx + 1 < input.length) {
57
+ output[i] = input[srcIdx] * (1 - frac) + input[srcIdx + 1] * frac;
58
+ }
59
+ else if (srcIdx < input.length) {
60
+ output[i] = input[srcIdx];
61
+ }
62
+ }
63
+ outputChannels.push(output);
64
+ }
65
+ // Return as a mock AudioBuffer-like object (for non-browser env)
66
+ return {
67
+ numberOfChannels: numChannels,
68
+ length: newLength,
69
+ sampleRate: targetSampleRate,
70
+ duration: newLength / targetSampleRate,
71
+ getChannelData(channel) {
72
+ return outputChannels[channel];
73
+ },
74
+ copyFromChannel() { },
75
+ copyToChannel() { },
76
+ };
77
+ }
78
+ /**
79
+ * Check if sample rate conversion is needed.
80
+ */
81
+ export function needsResampling(sourceSampleRate, sessionSampleRate) {
82
+ return sourceSampleRate !== sessionSampleRate;
83
+ }
84
+ //# sourceMappingURL=SampleRateConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleRateConverter.js","sourceRoot":"","sources":["../../src/audio/SampleRateConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Silence Padding & Trimming
3
+ * Ardour reference: libs/ardour/export_format_specification.h
4
+ * (silence_beginning, silence_end fields)
5
+ *
6
+ * Adds or removes silence at the start/end of audio buffers.
7
+ */
8
+ /**
9
+ * Add silence padding to start and/or end of audio data.
10
+ *
11
+ * @param channelData Array of channel data (modified in place via return)
12
+ * @param startFrames Number of silence frames to prepend
13
+ * @param endFrames Number of silence frames to append
14
+ * @returns New channel data arrays with padding
15
+ */
16
+ export declare function addSilencePadding(channelData: Float32Array[], startFrames: number, endFrames: number): Float32Array[];
17
+ /**
18
+ * Trim silence from start and/or end of audio data.
19
+ *
20
+ * @param channelData Array of channel data
21
+ * @param threshold Amplitude threshold below which is considered silence (default: 0.001)
22
+ * @returns Trimmed channel data and the number of frames trimmed from each end
23
+ */
24
+ export declare function trimSilence(channelData: Float32Array[], threshold?: number): {
25
+ data: Float32Array[];
26
+ trimmedStart: number;
27
+ trimmedEnd: number;
28
+ };
29
+ //# sourceMappingURL=SilencePadding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SilencePadding.d.ts","sourceRoot":"","sources":["../../src/audio/SilencePadding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,WAAW,EAAE,YAAY,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAClB,YAAY,EAAE,CAchB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACvB,WAAW,EAAE,YAAY,EAAE,EAC3B,SAAS,GAAE,MAAc,GAC1B;IAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAsDpE"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Silence Padding & Trimming
3
+ * Ardour reference: libs/ardour/export_format_specification.h
4
+ * (silence_beginning, silence_end fields)
5
+ *
6
+ * Adds or removes silence at the start/end of audio buffers.
7
+ */
8
+ /**
9
+ * Add silence padding to start and/or end of audio data.
10
+ *
11
+ * @param channelData Array of channel data (modified in place via return)
12
+ * @param startFrames Number of silence frames to prepend
13
+ * @param endFrames Number of silence frames to append
14
+ * @returns New channel data arrays with padding
15
+ */
16
+ export function addSilencePadding(channelData, startFrames, endFrames) {
17
+ if (startFrames <= 0 && endFrames <= 0) {
18
+ return channelData;
19
+ }
20
+ const originalLength = channelData[0].length;
21
+ const newLength = startFrames + originalLength + endFrames;
22
+ return channelData.map(data => {
23
+ const result = new Float32Array(newLength);
24
+ // Copy original data after start padding
25
+ result.set(data, startFrames);
26
+ return result;
27
+ });
28
+ }
29
+ /**
30
+ * Trim silence from start and/or end of audio data.
31
+ *
32
+ * @param channelData Array of channel data
33
+ * @param threshold Amplitude threshold below which is considered silence (default: 0.001)
34
+ * @returns Trimmed channel data and the number of frames trimmed from each end
35
+ */
36
+ export function trimSilence(channelData, threshold = 0.001) {
37
+ if (channelData.length === 0 || channelData[0].length === 0) {
38
+ return { data: channelData, trimmedStart: 0, trimmedEnd: 0 };
39
+ }
40
+ const length = channelData[0].length;
41
+ // Find first non-silent sample (across all channels)
42
+ let startIdx = 0;
43
+ for (let i = 0; i < length; i++) {
44
+ let isSilent = true;
45
+ for (const data of channelData) {
46
+ if (Math.abs(data[i]) > threshold) {
47
+ isSilent = false;
48
+ break;
49
+ }
50
+ }
51
+ if (!isSilent) {
52
+ startIdx = i;
53
+ break;
54
+ }
55
+ if (i === length - 1) {
56
+ // Entire buffer is silence
57
+ return {
58
+ data: channelData.map(() => new Float32Array(0)),
59
+ trimmedStart: length,
60
+ trimmedEnd: 0,
61
+ };
62
+ }
63
+ }
64
+ // Find last non-silent sample
65
+ let endIdx = length - 1;
66
+ for (let i = length - 1; i >= startIdx; i--) {
67
+ let isSilent = true;
68
+ for (const data of channelData) {
69
+ if (Math.abs(data[i]) > threshold) {
70
+ isSilent = false;
71
+ break;
72
+ }
73
+ }
74
+ if (!isSilent) {
75
+ endIdx = i;
76
+ break;
77
+ }
78
+ }
79
+ const trimmedLength = endIdx - startIdx + 1;
80
+ return {
81
+ data: channelData.map(data => data.slice(startIdx, endIdx + 1)),
82
+ trimmedStart: startIdx,
83
+ trimmedEnd: length - endIdx - 1,
84
+ };
85
+ }
86
+ //# sourceMappingURL=SilencePadding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SilencePadding.js","sourceRoot":"","sources":["../../src/audio/SilencePadding.ts"],"names":[],"mappings":"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"}
@@ -10,18 +10,10 @@
10
10
  * configurable memory limit and evicting least-recently-used entries when
11
11
  * the limit is exceeded.
12
12
  *
13
- * This class has **no** external dependencies (no audio framework imports)
14
- * and can be unit-tested in isolation.
15
- *
16
- * @example
17
- * ```ts
18
- * const cache = new SourceCache(256); // 256 MB limit
19
- *
20
- * cache.set('kick.wav', decodedBuffer);
21
- *
22
- * const buf = cache.get('kick.wav'); // cache hit
23
- * console.log(cache.getCacheHitRate()); // 1.0
24
- * ```
13
+ * Uses JavaScript `Map` insertion-order semantics for O(1) LRU eviction:
14
+ * on every access the entry is deleted and re-inserted so it moves to the
15
+ * tail (most-recently-used), while eviction always removes from the head
16
+ * (least-recently-used).
25
17
  *
26
18
  * @module SourceCache
27
19
  */
@@ -30,7 +22,11 @@
30
22
  * {@link AudioBuffer} instances, bounded by a configurable memory limit.
31
23
  */
32
24
  export declare class SourceCache {
33
- /** Map of source id to cache entry. */
25
+ /**
26
+ * Map of source id to cache entry.
27
+ * Iteration order = insertion order (oldest first).
28
+ * On access we delete + re-insert to move the entry to the tail.
29
+ */
34
30
  private cache;
35
31
  /** Maximum allowed memory usage in bytes. */
36
32
  private maxMemoryBytes;
@@ -48,8 +44,8 @@ export declare class SourceCache {
48
44
  /**
49
45
  * Retrieve a cached {@link AudioBuffer} by source id.
50
46
  *
51
- * On a hit the entry's `lastAccess` timestamp is refreshed so it is less
52
- * likely to be evicted.
47
+ * On a hit the entry is moved to the tail of the Map (most-recently-used)
48
+ * so it is less likely to be evicted.
53
49
  *
54
50
  * @param sourceId - Unique identifier for the audio source.
55
51
  * @returns The cached buffer, or `null` on a miss.
@@ -89,7 +85,8 @@ export declare class SourceCache {
89
85
  */
90
86
  evict(): void;
91
87
  /**
92
- * Evict the single least-recently-used entry.
88
+ * Evict the single least-recently-used entry — O(1) using Map
89
+ * iteration order (head = oldest).
93
90
  */
94
91
  private evictOne;
95
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SourceCache.d.ts","sourceRoot":"","sources":["../../src/audio/SourceCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAcH;;;GAGG;AACH,qBAAa,WAAW;IACpB,uCAAuC;IACvC,OAAO,CAAC,KAAK,CAAsC;IAEnD,6CAA6C;IAC7C,OAAO,CAAC,cAAc,CAAS;IAE/B,+CAA+C;IAC/C,OAAO,CAAC,kBAAkB,CAAK;IAI/B,0CAA0C;IAC1C,OAAO,CAAC,IAAI,CAAK;IACjB,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAK;IAEnB;;;OAGG;gBACS,WAAW,GAAE,MAAY;IAQrC;;;;;;;;OAQG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAWzC;;;;;;;;;;OAUG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IA0BhD;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY9B;;;;;;OAMG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACH,eAAe,IAAI,MAAM;IAKzB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAG7B"}
1
+ {"version":3,"file":"SourceCache.d.ts","sourceRoot":"","sources":["../../src/audio/SourceCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH;;;GAGG;AACH,qBAAa,WAAW;IACpB;;;;OAIG;IACH,OAAO,CAAC,KAAK,CAAsC;IAEnD,6CAA6C;IAC7C,OAAO,CAAC,cAAc,CAAS;IAE/B,+CAA+C;IAC/C,OAAO,CAAC,kBAAkB,CAAK;IAI/B,0CAA0C;IAC1C,OAAO,CAAC,IAAI,CAAK;IACjB,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAK;IAEnB;;;OAGG;gBACS,WAAW,GAAE,MAAY;IAQrC;;;;;;;;OAQG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAazC;;;;;;;;;;OAUG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAsBhD;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY9B;;;;;;OAMG;IACH,KAAK,IAAI,IAAI;IASb;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAWhB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACH,eAAe,IAAI,MAAM;IAKzB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAG7B"}
@@ -10,18 +10,10 @@
10
10
  * configurable memory limit and evicting least-recently-used entries when
11
11
  * the limit is exceeded.
12
12
  *
13
- * This class has **no** external dependencies (no audio framework imports)
14
- * and can be unit-tested in isolation.
15
- *
16
- * @example
17
- * ```ts
18
- * const cache = new SourceCache(256); // 256 MB limit
19
- *
20
- * cache.set('kick.wav', decodedBuffer);
21
- *
22
- * const buf = cache.get('kick.wav'); // cache hit
23
- * console.log(cache.getCacheHitRate()); // 1.0
24
- * ```
13
+ * Uses JavaScript `Map` insertion-order semantics for O(1) LRU eviction:
14
+ * on every access the entry is deleted and re-inserted so it moves to the
15
+ * tail (most-recently-used), while eviction always removes from the head
16
+ * (least-recently-used).
25
17
  *
26
18
  * @module SourceCache
27
19
  */
@@ -35,7 +27,11 @@ export class SourceCache {
35
27
  * 512 MB.
36
28
  */
37
29
  constructor(maxMemoryMB = 512) {
38
- /** Map of source id to cache entry. */
30
+ /**
31
+ * Map of source id to cache entry.
32
+ * Iteration order = insertion order (oldest first).
33
+ * On access we delete + re-insert to move the entry to the tail.
34
+ */
39
35
  this.cache = new Map();
40
36
  /** Running total of cached memory in bytes. */
41
37
  this.currentMemoryBytes = 0;
@@ -52,8 +48,8 @@ export class SourceCache {
52
48
  /**
53
49
  * Retrieve a cached {@link AudioBuffer} by source id.
54
50
  *
55
- * On a hit the entry's `lastAccess` timestamp is refreshed so it is less
56
- * likely to be evicted.
51
+ * On a hit the entry is moved to the tail of the Map (most-recently-used)
52
+ * so it is less likely to be evicted.
57
53
  *
58
54
  * @param sourceId - Unique identifier for the audio source.
59
55
  * @returns The cached buffer, or `null` on a miss.
@@ -61,7 +57,9 @@ export class SourceCache {
61
57
  get(sourceId) {
62
58
  const entry = this.cache.get(sourceId);
63
59
  if (entry) {
64
- entry.lastAccess = Date.now();
60
+ // Move to tail (most-recently-used) — O(1)
61
+ this.cache.delete(sourceId);
62
+ this.cache.set(sourceId, entry);
65
63
  this.hits++;
66
64
  return entry.buffer;
67
65
  }
@@ -85,16 +83,12 @@ export class SourceCache {
85
83
  this.remove(sourceId);
86
84
  }
87
85
  const sizeBytes = this.estimateBufferSize(buffer);
88
- // Evict until there is room (or the cache is empty)
86
+ // Evict LRU entries until there is room (or the cache is empty)
89
87
  while (this.cache.size > 0 &&
90
88
  this.currentMemoryBytes + sizeBytes > this.maxMemoryBytes) {
91
89
  this.evictOne();
92
90
  }
93
- const entry = {
94
- buffer,
95
- lastAccess: Date.now(),
96
- sizeBytes,
97
- };
91
+ const entry = { buffer, sizeBytes };
98
92
  this.cache.set(sourceId, entry);
99
93
  this.currentMemoryBytes += sizeBytes;
100
94
  }
@@ -136,19 +130,13 @@ export class SourceCache {
136
130
  }
137
131
  }
138
132
  /**
139
- * Evict the single least-recently-used entry.
133
+ * Evict the single least-recently-used entry — O(1) using Map
134
+ * iteration order (head = oldest).
140
135
  */
141
136
  evictOne() {
142
- let oldestId = null;
143
- let oldestAccess = Infinity;
144
- for (const [id, entry] of this.cache) {
145
- if (entry.lastAccess < oldestAccess) {
146
- oldestAccess = entry.lastAccess;
147
- oldestId = id;
148
- }
149
- }
150
- if (oldestId !== null) {
151
- this.remove(oldestId);
137
+ const first = this.cache.keys().next();
138
+ if (!first.done) {
139
+ this.remove(first.value);
152
140
  }
153
141
  }
154
142
  // ---------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"SourceCache.js","sourceRoot":"","sources":["../../src/audio/SourceCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SourceCache.js","sourceRoot":"","sources":["../../src/audio/SourceCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Declick (DeclickAmp) - Provides smooth amplitude transitions
3
+ * to avoid clicks/pops at record start/stop and region boundaries.
4
+ * Inspired by Ardour's DeclickAmp.
5
+ */
6
+ export declare class DeclickAmp {
7
+ private _targetGain;
8
+ private _currentGain;
9
+ private _sampleRate;
10
+ private _rampLength;
11
+ private _rampIncrement;
12
+ /**
13
+ * @param sampleRate - The audio sample rate (e.g. 44100, 48000)
14
+ * @param rampLengthMs - Duration of a full 0->1 or 1->0 ramp in ms. Defaults to ~1.5ms (~64 samples at 44100).
15
+ */
16
+ constructor(sampleRate: number, rampLengthMs?: number);
17
+ /**
18
+ * Set target gain (0 for fade out, 1 for fade in).
19
+ */
20
+ setTarget(gain: number): void;
21
+ /**
22
+ * Apply declick ramp to a buffer in-place.
23
+ * Uses linear ramping from _currentGain toward _targetGain.
24
+ * @returns true if ramp is still in progress after processing
25
+ */
26
+ applyToBuffer(buffer: Float32Array, offset: number, count: number): boolean;
27
+ /**
28
+ * Apply declick ramp to multi-channel buffers in-place.
29
+ * All channels share the same gain trajectory.
30
+ * @returns true if ramp is still in progress after processing
31
+ */
32
+ applyToBuffers(buffers: Float32Array[], offset: number, count: number): boolean;
33
+ /**
34
+ * Check if currently ramping (current gain has not yet reached target).
35
+ */
36
+ isRamping(): boolean;
37
+ /**
38
+ * Reset to initial state.
39
+ * @param initialGain - Starting gain value (default 0.0)
40
+ */
41
+ reset(initialGain?: number): void;
42
+ /**
43
+ * Get current gain value.
44
+ */
45
+ getCurrentGain(): number;
46
+ }
47
+ /**
48
+ * Declicker - Provides crossfade curves for loop boundaries.
49
+ * Used to create smooth transitions at loop points.
50
+ * Uses raised cosine (Hann) curves for perceptually smooth fades.
51
+ */
52
+ export declare class Declicker {
53
+ private _fadeIn;
54
+ private _fadeOut;
55
+ private _length;
56
+ /**
57
+ * @param lengthSamples - Number of samples for the fade region
58
+ */
59
+ constructor(lengthSamples: number);
60
+ /**
61
+ * Pre-compute fade curves using a raised cosine (Hann window).
62
+ * fade_in[i] = 0.5 * (1 - cos(pi * i / (N-1)))
63
+ * fade_out[i] = 0.5 * (1 + cos(pi * i / (N-1)))
64
+ * This ensures fade_in + fade_out = 1.0 at every sample (constant power crossfade).
65
+ */
66
+ computeCurves(): void;
67
+ /**
68
+ * Apply fade-in curve to the start of a buffer.
69
+ * @param buffer - The audio buffer to modify in-place
70
+ * @param offset - Optional offset into the buffer (default 0)
71
+ */
72
+ applyFadeIn(buffer: Float32Array, offset?: number): void;
73
+ /**
74
+ * Apply fade-out curve to the end of a buffer.
75
+ * @param offset - Optional: the sample index where the fade-out begins.
76
+ * Defaults to buffer.length - fadeLength.
77
+ */
78
+ applyFadeOut(buffer: Float32Array, offset?: number): void;
79
+ /**
80
+ * Apply crossfade between two buffers, writing result into output.
81
+ * output[i] = outgoing[i] * fadeOut[i] + incoming[i] * fadeIn[i]
82
+ * All three buffers must be at least _length samples long.
83
+ */
84
+ applyCrossfade(outgoing: Float32Array, incoming: Float32Array, output: Float32Array): void;
85
+ /**
86
+ * Get the pre-computed fade-in curve.
87
+ */
88
+ getFadeIn(): Float32Array;
89
+ /**
90
+ * Get the pre-computed fade-out curve.
91
+ */
92
+ getFadeOut(): Float32Array;
93
+ /**
94
+ * Get the length of the fade region in samples.
95
+ */
96
+ getLength(): number;
97
+ }
98
+ //# sourceMappingURL=Declick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Declick.d.ts","sourceRoot":"","sources":["../../../src/audio/engine/Declick.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;IAE/B;;;OAGG;gBACS,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAOrD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAgC3E;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAsC/E;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAKjC;;OAEG;IACH,cAAc,IAAI,MAAM;CAG3B;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAClB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAS;IAExB;;OAEG;gBACS,aAAa,EAAE,MAAM;IAOjC;;;;;OAKG;IACH,aAAa,IAAI,IAAI;IAgBrB;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAO3D;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAQzD;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAO1F;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;IACH,UAAU,IAAI,YAAY;IAI1B;;OAEG;IACH,SAAS,IAAI,MAAM;CAGtB"}