@omnimedia/omnitool 1.1.0-8 → 1.1.0-81

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 (436) hide show
  1. package/README.md +293 -76
  2. package/package.json +19 -17
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +104 -43
  5. package/s/demo/demo.css +244 -14
  6. package/s/demo/routines/export-test.ts +16 -0
  7. package/s/demo/routines/filmstrip-test.ts +22 -18
  8. package/s/demo/routines/load-video.ts +2 -3
  9. package/s/demo/routines/playback-test.ts +61 -0
  10. package/s/demo/routines/timeline-setup.ts +50 -0
  11. package/s/demo/routines/transcode-test.ts +19 -5
  12. package/s/demo/routines/transitions-test.ts +2 -2
  13. package/s/demo/routines/waveform-test.ts +35 -8
  14. package/s/driver/driver-worker.ts +9 -0
  15. package/s/driver/driver.test.ts +1 -1
  16. package/s/driver/driver.ts +43 -42
  17. package/s/driver/fns/schematic.ts +26 -6
  18. package/s/driver/fns/work.ts +65 -189
  19. package/s/driver/parts/compositor.ts +316 -0
  20. package/s/driver/parts/machina.ts +19 -20
  21. package/s/driver/utils/find-pixi-filter.ts +24 -0
  22. package/s/index.html.ts +103 -25
  23. package/s/index.ts +1 -0
  24. package/s/tests.bundle.ts +11 -0
  25. package/s/tests.html.ts +28 -0
  26. package/s/timeline/index.ts +8 -2
  27. package/s/timeline/parts/animations.ts +56 -0
  28. package/s/timeline/parts/filmstrip.ts +43 -16
  29. package/s/timeline/parts/filters.ts +453 -0
  30. package/s/timeline/parts/item.ts +70 -7
  31. package/s/timeline/parts/media.ts +12 -2
  32. package/s/timeline/parts/resource-pool.ts +8 -5
  33. package/s/timeline/parts/resource.ts +3 -0
  34. package/s/timeline/parts/waveform/parts/collect.ts +72 -0
  35. package/s/timeline/parts/waveform/parts/render.ts +45 -0
  36. package/s/timeline/parts/waveform/parts/types.ts +24 -0
  37. package/s/timeline/parts/waveform/waveform.ts +161 -0
  38. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  39. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  40. package/s/timeline/renderers/export/parts/cursor.ts +129 -0
  41. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  42. package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
  43. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  44. package/s/timeline/renderers/export/produce.ts +28 -0
  45. package/s/timeline/renderers/parts/handy.ts +377 -0
  46. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  47. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  48. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  49. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  50. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  51. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +16 -0
  52. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +69 -0
  53. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +111 -0
  54. package/s/timeline/renderers/parts/samplers/visual/parts/sink.ts +38 -0
  55. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  56. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +10 -0
  57. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +28 -0
  58. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  59. package/s/timeline/renderers/player/parts/playback.ts +159 -0
  60. package/s/timeline/renderers/player/player.ts +77 -0
  61. package/s/timeline/renderers/renderers.test.ts +403 -0
  62. package/s/timeline/sugar/helpers.ts +190 -0
  63. package/s/timeline/sugar/o.ts +271 -59
  64. package/s/timeline/sugar/omni.test.ts +210 -0
  65. package/s/timeline/sugar/omni.ts +35 -12
  66. package/s/timeline/types.ts +28 -3
  67. package/s/timeline/utils/anim.ts +72 -0
  68. package/s/timeline/utils/checksum.ts +3 -1
  69. package/s/timeline/utils/datafile.ts +15 -4
  70. package/s/timeline/utils/dummy-data.ts +3 -3
  71. package/s/timeline/utils/matrix.ts +21 -0
  72. package/s/timeline/utils/terps.ts +81 -0
  73. package/s/units/fps.ts +8 -0
  74. package/s/units/ms.ts +8 -0
  75. package/s/units/seconds.ts +8 -0
  76. package/x/WebGLRenderer-4CHIZDHY.js +2 -0
  77. package/x/WebGLRenderer-4CHIZDHY.js.map +7 -0
  78. package/x/WebGPURenderer-O6WXU2QR.js +2 -0
  79. package/x/WebGPURenderer-O6WXU2QR.js.map +7 -0
  80. package/x/browserAll-WNIOTNNP.js +2 -0
  81. package/x/browserAll-WNIOTNNP.js.map +7 -0
  82. package/x/chunk-23FOBGX6.js +2 -0
  83. package/x/chunk-23FOBGX6.js.map +7 -0
  84. package/x/chunk-73XOWA4F.js +393 -0
  85. package/x/chunk-73XOWA4F.js.map +7 -0
  86. package/x/chunk-IAWJKNX5.js +42 -0
  87. package/x/chunk-IAWJKNX5.js.map +7 -0
  88. package/x/chunk-KCMVLWBS.js +157 -0
  89. package/x/chunk-KCMVLWBS.js.map +7 -0
  90. package/x/chunk-MR32SQ27.js +2 -0
  91. package/x/chunk-MR32SQ27.js.map +7 -0
  92. package/x/chunk-VCUJJYRJ.js +327 -0
  93. package/x/chunk-VCUJJYRJ.js.map +7 -0
  94. package/x/chunk-XNIZ4L5W.js +269 -0
  95. package/x/chunk-XNIZ4L5W.js.map +7 -0
  96. package/x/chunk-ZLGNQFUI.js +15 -0
  97. package/x/chunk-ZLGNQFUI.js.map +7 -0
  98. package/x/context.d.ts +1 -4
  99. package/x/context.js +1 -5
  100. package/x/context.js.map +1 -1
  101. package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
  102. package/x/demo/WebGLRenderer-RSJAHIG2.js.map +7 -0
  103. package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
  104. package/x/demo/WebGPURenderer-MGFAJCYY.js.map +7 -0
  105. package/x/demo/browserAll-PTRBXBRP.js +2 -0
  106. package/x/demo/browserAll-PTRBXBRP.js.map +7 -0
  107. package/x/demo/chunk-CUYOGHWU.js +42 -0
  108. package/x/demo/chunk-CUYOGHWU.js.map +7 -0
  109. package/x/demo/chunk-DGTDNJ7W.js +2 -0
  110. package/x/demo/chunk-DGTDNJ7W.js.map +7 -0
  111. package/x/demo/chunk-FZ5BYF63.js +15 -0
  112. package/x/demo/chunk-FZ5BYF63.js.map +7 -0
  113. package/x/demo/chunk-KWN4NNES.js +269 -0
  114. package/x/demo/chunk-KWN4NNES.js.map +7 -0
  115. package/x/demo/chunk-OJ3FPXW7.js +157 -0
  116. package/x/demo/chunk-OJ3FPXW7.js.map +7 -0
  117. package/x/demo/chunk-PSLUOGTZ.js +393 -0
  118. package/x/demo/chunk-PSLUOGTZ.js.map +7 -0
  119. package/x/demo/chunk-VLCVEIFU.js +327 -0
  120. package/x/demo/chunk-VLCVEIFU.js.map +7 -0
  121. package/x/demo/chunk-ZWCPT5FR.js +2 -0
  122. package/x/demo/chunk-ZWCPT5FR.js.map +7 -0
  123. package/x/demo/demo.bundle.js +94 -40
  124. package/x/demo/demo.bundle.js.map +1 -1
  125. package/x/demo/demo.bundle.min.js +7340 -90
  126. package/x/demo/demo.bundle.min.js.map +4 -4
  127. package/x/demo/demo.css +244 -14
  128. package/x/demo/routines/export-test.d.ts +2 -0
  129. package/x/demo/routines/export-test.js +10 -0
  130. package/x/demo/routines/export-test.js.map +1 -0
  131. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  132. package/x/demo/routines/filmstrip-test.js +20 -17
  133. package/x/demo/routines/filmstrip-test.js.map +1 -1
  134. package/x/demo/routines/load-video.d.ts +1 -1
  135. package/x/demo/routines/load-video.js +1 -2
  136. package/x/demo/routines/load-video.js.map +1 -1
  137. package/x/demo/routines/playback-test.d.ts +2 -0
  138. package/x/demo/routines/playback-test.js +51 -0
  139. package/x/demo/routines/playback-test.js.map +1 -0
  140. package/x/demo/routines/timeline-setup.d.ts +6 -0
  141. package/x/demo/routines/timeline-setup.js +32 -0
  142. package/x/demo/routines/timeline-setup.js.map +1 -0
  143. package/x/demo/routines/transcode-test.js +15 -5
  144. package/x/demo/routines/transcode-test.js.map +1 -1
  145. package/x/demo/routines/transitions-test.js +2 -2
  146. package/x/demo/routines/transitions-test.js.map +1 -1
  147. package/x/demo/routines/waveform-test.d.ts +2 -1
  148. package/x/demo/routines/waveform-test.js +29 -8
  149. package/x/demo/routines/waveform-test.js.map +1 -1
  150. package/x/demo/webworkerAll-JENRT6BT.js +2 -0
  151. package/x/demo/webworkerAll-JENRT6BT.js.map +7 -0
  152. package/x/driver/driver-worker.d.ts +1 -0
  153. package/x/driver/driver-worker.js +6 -0
  154. package/x/driver/driver-worker.js.map +1 -0
  155. package/x/driver/driver.d.ts +25 -8
  156. package/x/driver/driver.js +43 -39
  157. package/x/driver/driver.js.map +1 -1
  158. package/x/driver/driver.test.js +1 -1
  159. package/x/driver/driver.test.js.map +1 -1
  160. package/x/driver/driver.worker.bundle.min.js +117 -3506
  161. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  162. package/x/driver/fns/host.d.ts +3 -2
  163. package/x/driver/fns/schematic.d.ts +25 -4
  164. package/x/driver/fns/work.d.ts +4 -4
  165. package/x/driver/fns/work.js +55 -155
  166. package/x/driver/fns/work.js.map +1 -1
  167. package/x/driver/parts/compositor.d.ts +39 -0
  168. package/x/driver/parts/compositor.js +261 -0
  169. package/x/driver/parts/compositor.js.map +1 -0
  170. package/x/driver/parts/machina.d.ts +0 -20
  171. package/x/driver/parts/machina.js +6 -10
  172. package/x/driver/parts/machina.js.map +1 -1
  173. package/x/driver/utils/find-pixi-filter.d.ts +5 -0
  174. package/x/driver/utils/find-pixi-filter.js +13 -0
  175. package/x/driver/utils/find-pixi-filter.js.map +1 -0
  176. package/x/features/speech/transcribe/parts/prep-audio.d.ts +1 -1
  177. package/x/features/speech/transcribe/worker.bundle.min.js +899 -899
  178. package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
  179. package/x/index.d.ts +1 -0
  180. package/x/index.html +347 -38
  181. package/x/index.html.js +103 -24
  182. package/x/index.html.js.map +1 -1
  183. package/x/index.js +1 -0
  184. package/x/index.js.map +1 -1
  185. package/x/tests.bundle.js +8 -0
  186. package/x/tests.bundle.js.map +1 -0
  187. package/x/tests.bundle.min.js +7374 -0
  188. package/x/tests.bundle.min.js.map +7 -0
  189. package/x/tests.html +316 -0
  190. package/x/tests.html.d.ts +2 -0
  191. package/x/tests.html.js +22 -0
  192. package/x/tests.html.js.map +1 -0
  193. package/x/timeline/index.d.ts +7 -1
  194. package/x/timeline/index.js +7 -1
  195. package/x/timeline/index.js.map +1 -1
  196. package/x/timeline/parts/animations.d.ts +105 -0
  197. package/x/timeline/parts/animations.js +28 -0
  198. package/x/timeline/parts/animations.js.map +1 -0
  199. package/x/timeline/parts/filmstrip.d.ts +4 -3
  200. package/x/timeline/parts/filmstrip.js +29 -10
  201. package/x/timeline/parts/filmstrip.js.map +1 -1
  202. package/x/timeline/parts/filters.d.ts +108 -0
  203. package/x/timeline/parts/filters.js +340 -0
  204. package/x/timeline/parts/filters.js.map +1 -0
  205. package/x/timeline/parts/item.d.ts +56 -4
  206. package/x/timeline/parts/item.js +5 -1
  207. package/x/timeline/parts/item.js.map +1 -1
  208. package/x/timeline/parts/media.d.ts +2 -0
  209. package/x/timeline/parts/media.js +11 -2
  210. package/x/timeline/parts/media.js.map +1 -1
  211. package/x/timeline/parts/resource-pool.d.ts +3 -0
  212. package/x/timeline/parts/resource-pool.js +7 -4
  213. package/x/timeline/parts/resource-pool.js.map +1 -1
  214. package/x/timeline/parts/resource.d.ts +3 -0
  215. package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
  216. package/x/timeline/parts/waveform/parts/collect.js +56 -0
  217. package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
  218. package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
  219. package/x/timeline/parts/waveform/parts/render.js +29 -0
  220. package/x/timeline/parts/waveform/parts/render.js.map +1 -0
  221. package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
  222. package/x/timeline/parts/waveform/parts/types.js.map +1 -0
  223. package/x/timeline/parts/waveform/waveform.d.ts +19 -0
  224. package/x/timeline/parts/waveform/waveform.js +133 -0
  225. package/x/timeline/parts/waveform/waveform.js.map +1 -0
  226. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  227. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  228. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  229. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  230. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  231. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  232. package/x/timeline/renderers/export/parts/cursor.d.ts +18 -0
  233. package/x/timeline/renderers/export/parts/cursor.js +99 -0
  234. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  235. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  236. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  237. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  238. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  239. package/x/timeline/renderers/export/parts/produce-video.js +26 -0
  240. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  241. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  242. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  243. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  244. package/x/timeline/renderers/export/produce.d.ts +13 -0
  245. package/x/timeline/renderers/export/produce.js +15 -0
  246. package/x/timeline/renderers/export/produce.js.map +1 -0
  247. package/x/timeline/renderers/parts/handy.d.ts +36 -0
  248. package/x/timeline/renderers/parts/handy.js +221 -0
  249. package/x/timeline/renderers/parts/handy.js.map +1 -0
  250. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  251. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  252. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  253. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  254. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  255. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  256. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  257. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  258. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  259. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  260. package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
  261. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  262. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  263. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  264. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  265. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +5 -0
  266. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +10 -0
  267. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  268. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +6 -0
  269. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +48 -0
  270. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  271. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +6 -0
  272. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +75 -0
  273. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  274. package/x/timeline/renderers/parts/samplers/visual/parts/sink.d.ts +8 -0
  275. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js +24 -0
  276. package/x/timeline/renderers/parts/samplers/visual/parts/sink.js.map +1 -0
  277. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  278. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  279. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  280. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +8 -0
  281. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  282. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  283. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  284. package/x/timeline/renderers/parts/samplers/visual/sampler.js +17 -0
  285. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  286. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  287. package/x/timeline/renderers/parts/schedulers.js +64 -0
  288. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  289. package/x/timeline/renderers/player/parts/playback.d.ts +36 -0
  290. package/x/timeline/renderers/player/parts/playback.js +113 -0
  291. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  292. package/x/timeline/renderers/player/player.d.ts +25 -0
  293. package/x/timeline/renderers/player/player.js +56 -0
  294. package/x/timeline/renderers/player/player.js.map +1 -0
  295. package/x/timeline/renderers/renderers.test.d.ts +33 -0
  296. package/x/timeline/renderers/renderers.test.js +321 -0
  297. package/x/timeline/renderers/renderers.test.js.map +1 -0
  298. package/x/timeline/sugar/helpers.d.ts +56 -0
  299. package/x/timeline/sugar/helpers.js +104 -0
  300. package/x/timeline/sugar/helpers.js.map +1 -0
  301. package/x/timeline/sugar/o.d.ts +48 -14
  302. package/x/timeline/sugar/o.js +213 -54
  303. package/x/timeline/sugar/o.js.map +1 -1
  304. package/x/timeline/sugar/omni.d.ts +11 -6
  305. package/x/timeline/sugar/omni.js +28 -8
  306. package/x/timeline/sugar/omni.js.map +1 -1
  307. package/x/timeline/sugar/omni.test.d.ts +27 -0
  308. package/x/timeline/sugar/omni.test.js +128 -0
  309. package/x/timeline/sugar/omni.test.js.map +1 -0
  310. package/x/timeline/types.d.ts +12 -2
  311. package/x/timeline/utils/anim.d.ts +5 -0
  312. package/x/timeline/utils/anim.js +44 -0
  313. package/x/timeline/utils/anim.js.map +1 -0
  314. package/x/timeline/utils/checksum.d.ts +3 -2
  315. package/x/timeline/utils/checksum.js.map +1 -1
  316. package/x/timeline/utils/datafile.d.ts +5 -3
  317. package/x/timeline/utils/datafile.js +18 -5
  318. package/x/timeline/utils/datafile.js.map +1 -1
  319. package/x/timeline/utils/dummy-data.d.ts +1 -2
  320. package/x/timeline/utils/dummy-data.js +4 -2
  321. package/x/timeline/utils/dummy-data.js.map +1 -1
  322. package/x/timeline/utils/matrix.d.ts +9 -0
  323. package/x/timeline/utils/matrix.js +10 -0
  324. package/x/timeline/utils/matrix.js.map +1 -1
  325. package/x/timeline/utils/terps.d.ts +11 -0
  326. package/x/timeline/utils/terps.js +57 -0
  327. package/x/timeline/utils/terps.js.map +1 -0
  328. package/x/units/fps.d.ts +6 -0
  329. package/x/units/fps.js +2 -0
  330. package/x/units/fps.js.map +1 -0
  331. package/x/units/ms.d.ts +6 -0
  332. package/x/units/ms.js +2 -0
  333. package/x/units/ms.js.map +1 -0
  334. package/x/units/seconds.d.ts +6 -0
  335. package/x/units/seconds.js +2 -0
  336. package/x/units/seconds.js.map +1 -0
  337. package/x/webworkerAll-RLCTMSDD.js +2 -0
  338. package/x/webworkerAll-RLCTMSDD.js.map +7 -0
  339. package/s/tests.test.ts +0 -8
  340. package/s/timeline/parts/compositor/export.ts +0 -77
  341. package/s/timeline/parts/compositor/parts/html-tree.ts +0 -37
  342. package/s/timeline/parts/compositor/parts/schedulers.ts +0 -85
  343. package/s/timeline/parts/compositor/parts/tree-builder.ts +0 -184
  344. package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +0 -30
  345. package/s/timeline/parts/compositor/playback.ts +0 -81
  346. package/s/timeline/parts/compositor/samplers/html.ts +0 -115
  347. package/s/timeline/parts/compositor/samplers/webcodecs.ts +0 -60
  348. package/s/timeline/parts/waveform.ts +0 -62
  349. package/s/timeline/sugar/builders.ts +0 -102
  350. package/s/timeline/sugar/omni-test.ts +0 -38
  351. package/s/timeline/timeline.ts +0 -22
  352. package/s/timeline/utils/audio-stream.ts +0 -15
  353. package/s/timeline/utils/video-cursor.ts +0 -40
  354. package/s/tools/common/loader.ts +0 -26
  355. package/s/tools/common/transformer-pipeline.ts +0 -26
  356. package/s/tools/speech-recognition/common/model.ts +0 -26
  357. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  358. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  359. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  360. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  361. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  362. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  363. package/x/tests.test.js +0 -6
  364. package/x/tests.test.js.map +0 -1
  365. package/x/timeline/parts/compositor/export.d.ts +0 -9
  366. package/x/timeline/parts/compositor/export.js +0 -64
  367. package/x/timeline/parts/compositor/export.js.map +0 -1
  368. package/x/timeline/parts/compositor/parts/html-tree.d.ts +0 -3
  369. package/x/timeline/parts/compositor/parts/html-tree.js +0 -40
  370. package/x/timeline/parts/compositor/parts/html-tree.js.map +0 -1
  371. package/x/timeline/parts/compositor/parts/schedulers.d.ts +0 -15
  372. package/x/timeline/parts/compositor/parts/schedulers.js +0 -64
  373. package/x/timeline/parts/compositor/parts/schedulers.js.map +0 -1
  374. package/x/timeline/parts/compositor/parts/tree-builder.d.ts +0 -37
  375. package/x/timeline/parts/compositor/parts/tree-builder.js +0 -147
  376. package/x/timeline/parts/compositor/parts/tree-builder.js.map +0 -1
  377. package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +0 -3
  378. package/x/timeline/parts/compositor/parts/webcodecs-tree.js +0 -28
  379. package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +0 -1
  380. package/x/timeline/parts/compositor/playback.d.ts +0 -19
  381. package/x/timeline/parts/compositor/playback.js +0 -71
  382. package/x/timeline/parts/compositor/playback.js.map +0 -1
  383. package/x/timeline/parts/compositor/samplers/html.d.ts +0 -3
  384. package/x/timeline/parts/compositor/samplers/html.js +0 -106
  385. package/x/timeline/parts/compositor/samplers/html.js.map +0 -1
  386. package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +0 -2
  387. package/x/timeline/parts/compositor/samplers/webcodecs.js +0 -55
  388. package/x/timeline/parts/compositor/samplers/webcodecs.js.map +0 -1
  389. package/x/timeline/parts/waveform.d.ts +0 -8
  390. package/x/timeline/parts/waveform.js +0 -51
  391. package/x/timeline/parts/waveform.js.map +0 -1
  392. package/x/timeline/sugar/builders.d.ts +0 -96
  393. package/x/timeline/sugar/builders.js +0 -108
  394. package/x/timeline/sugar/builders.js.map +0 -1
  395. package/x/timeline/sugar/omni-test.d.ts +0 -1
  396. package/x/timeline/sugar/omni-test.js +0 -22
  397. package/x/timeline/sugar/omni-test.js.map +0 -1
  398. package/x/timeline/timeline.d.ts +0 -9
  399. package/x/timeline/timeline.js +0 -22
  400. package/x/timeline/timeline.js.map +0 -1
  401. package/x/timeline/utils/audio-stream.d.ts +0 -6
  402. package/x/timeline/utils/audio-stream.js +0 -17
  403. package/x/timeline/utils/audio-stream.js.map +0 -1
  404. package/x/timeline/utils/video-cursor.d.ts +0 -10
  405. package/x/timeline/utils/video-cursor.js +0 -36
  406. package/x/timeline/utils/video-cursor.js.map +0 -1
  407. package/x/tools/common/loader.d.ts +0 -19
  408. package/x/tools/common/loader.js +0 -18
  409. package/x/tools/common/loader.js.map +0 -1
  410. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  411. package/x/tools/common/transformer-pipeline.js +0 -24
  412. package/x/tools/common/transformer-pipeline.js.map +0 -1
  413. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  414. package/x/tools/speech-recognition/common/model.js +0 -16
  415. package/x/tools/speech-recognition/common/model.js.map +0 -1
  416. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  417. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  418. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  419. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  420. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  421. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  422. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  423. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  424. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  425. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  426. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  427. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
  428. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  429. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  430. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  431. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  432. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  433. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  434. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
  435. /package/x/{tests.test.d.ts → tests.bundle.d.ts} +0 -0
  436. /package/x/{tools/speech-recognition/whisper → timeline/parts/waveform}/parts/types.js +0 -0
@@ -1,184 +0,0 @@
1
- import {Item, Kind} from "../../item.js"
2
- import {ImageLayer, Layer} from "../../../../driver/fns/schematic.js"
3
- import {I6, Mat6, mul6, transformToMat6} from "../../../utils/matrix.js"
4
-
5
- export type AudioStreamComponent = {
6
- getStream: () => AsyncGenerator<AudioData>
7
- }
8
- export type AudioPlaybackComponent = {
9
- onTimeUpdate: (time: number) => void
10
- }
11
- export type VisualComponent = {
12
- sampleAt: (time: number) => Promise<Layer[]>
13
- }
14
-
15
- export type Node<T> = {
16
- duration: number
17
- visuals?: VisualComponent
18
- audio?: T
19
- }
20
-
21
- interface Sampler<T> {
22
- video(item: Item.Video, parentMatrix: Mat6): Promise<Node<T>>
23
- audio(item: Item.Audio): Promise<Node<T>>
24
- dispose(): Promise<void>
25
- }
26
-
27
- const requireItem = (items: Map<number, Item.Any>, id: number) => items.get(id)!
28
- export const getWorldMat6 = (
29
- items: Map<number, Item.Any>,
30
- item: Item.Text | Item.Sequence | Item.Stack | Item.Video,
31
- parent?: Mat6
32
- ): Mat6 => {
33
- let world = parent ?? I6
34
- if (item.spatialId) {
35
- const spatial = requireItem(items, item.spatialId) as Item.Spatial
36
- const local = transformToMat6(spatial.transform)
37
- world = mul6(local, world)
38
- }
39
- return world
40
- }
41
-
42
- export type WebcodecsSampler = Sampler<AudioStreamComponent>
43
- export interface HTMLSampler extends Sampler<AudioPlaybackComponent> {
44
- setPaused(v: boolean): void
45
- }
46
-
47
- export abstract class TreeBuilder<T> {
48
- constructor(protected items: Map<number, Item.Any>, protected sampler: Sampler<T>) {}
49
-
50
- async build(root: Item.Any, parentMatrix?: Mat6): Promise<Node<T>> {
51
- switch (root.kind) {
52
- case Kind.Video: return this.sampler.video(root, getWorldMat6(this.items, root, parentMatrix))
53
- case Kind.Audio: return this.sampler.audio(root)
54
- case Kind.Text: {
55
- const matrix = getWorldMat6(this.items, root, parentMatrix)
56
- return {
57
- duration: Infinity,
58
- visuals: {
59
- sampleAt: async () => [{kind: "text", content: root.content, color: "white", fontSize: 48, matrix}]
60
- }
61
- }
62
- }
63
- case Kind.Gap: return {
64
- duration: root.duration,
65
- visuals: {
66
- sampleAt: async () => []
67
- }
68
- }
69
- case Kind.Stack: {
70
- const matrix = getWorldMat6(this.items, root, parentMatrix)
71
- const children = await Promise.all(root.childrenIds.map(id => this.build(requireItem(this.items, id), matrix)))
72
- return this.#composeStack(children)
73
- }
74
- case Kind.Sequence: {
75
- const matrix = getWorldMat6(this.items, root, parentMatrix)
76
- return this.#composeSequence(root, matrix)
77
- }
78
- default: return {duration: 0}
79
- }
80
- }
81
-
82
- abstract composeAudio_Stack(children: Node<T>[]): T | undefined
83
- abstract composeAudio_Sequence(children: Node<T>[]): T | undefined
84
-
85
- // Visual composition is the same for both builders, so it lives here.
86
- #composeVisuals_Stack(children: Node<T>[]): VisualComponent {
87
- return {
88
- sampleAt: async (time) => {
89
- const layers = await Promise.all(children.map(c => c.visuals ? c.visuals.sampleAt(time) : Promise.resolve([])))
90
- return layers.flat()
91
- }
92
- }
93
- }
94
-
95
- #composeVisuals_Sequence(children: Node<T>[]): VisualComponent {
96
- return {
97
- sampleAt: async (time) => {
98
- let localTime = time
99
- for (const child of children) {
100
- if (localTime < child.duration) return child.visuals ? child.visuals.sampleAt(localTime) : []
101
- localTime -= child.duration
102
- }
103
- return []
104
- }
105
- }
106
- }
107
-
108
- #composeStack(children: Node<T>[]): Node<T> {
109
- const duration = Math.max(0, ...children.map(k => (Number.isFinite(k.duration) ? k.duration : 0)))
110
- return {
111
- duration,
112
- visuals: this.#composeVisuals_Stack(children),
113
- audio: this.composeAudio_Stack(children),
114
- }
115
- }
116
-
117
- async #composeSequence(sequence: Item.Sequence, parentMatrix?: Mat6): Promise<Node<T>> {
118
- const childItems = sequence.childrenIds.map(id => requireItem(this.items, id))
119
- const children = await this.#processChildren(childItems, parentMatrix)
120
- const duration = children.reduce((a, k) => a + k.duration, 0)
121
- return {
122
- duration,
123
- visuals: this.#composeVisuals_Sequence(children),
124
- audio: this.composeAudio_Sequence(children),
125
- }
126
- }
127
-
128
- async #processChildren(childItems: Item.Any[], parentMatrix?: Mat6): Promise<Node<T>[]> {
129
- const processedNodes: Node<T>[] = []
130
- for (let i = 0; i < childItems.length; i++) {
131
- const item = childItems[i]
132
-
133
- if (item.kind !== Kind.Transition) {
134
- processedNodes.push(await this.build(item, parentMatrix))
135
- continue
136
- }
137
-
138
- const outgoingNode = processedNodes.pop()
139
- const incomingItem = childItems[i + 1]
140
-
141
- if (!outgoingNode || !incomingItem || incomingItem.kind === Kind.Transition) {
142
- if (outgoingNode) processedNodes.push(outgoingNode)
143
- continue
144
- }
145
-
146
- const incomingNode = await this.build(incomingItem, parentMatrix)
147
- const transitionNode = await this.#createTransitionNode(item, outgoingNode, incomingNode)
148
- processedNodes.push(transitionNode)
149
- i++
150
- }
151
- return processedNodes
152
- }
153
-
154
- async #createTransitionNode(transitionItem: Item.Transition, outgoingNode: Node<T>, incomingNode: Node<T>): Promise<Node<T>> {
155
- const overlap = Math.max(0, Math.min(transitionItem.duration, outgoingNode.duration, incomingNode.duration))
156
- const start = Math.max(0, outgoingNode.duration - overlap)
157
- const combinedDuration = outgoingNode.duration + incomingNode.duration - overlap
158
- return {
159
- duration: combinedDuration,
160
- visuals: {
161
- sampleAt: async (t) => {
162
- if (!outgoingNode.visuals || !incomingNode.visuals) return []
163
- if (t < start) return outgoingNode.visuals.sampleAt(t)
164
- if (t < outgoingNode.duration) {
165
- const localTime = t - start
166
- const progress = overlap > 0 ? (localTime / overlap) : 1
167
- const from = await outgoingNode.visuals.sampleAt(t) as ImageLayer[]
168
- const to = await incomingNode.visuals.sampleAt(localTime) as ImageLayer[]
169
- if(!from[0]?.frame || !to[0]?.frame) return []
170
- return [{
171
- kind: "transition",
172
- name: "circle",
173
- progress,
174
- from: from[0].frame,
175
- to: to[0].frame,
176
- }]
177
- }
178
- return incomingNode.visuals.sampleAt(t - outgoingNode.duration + overlap)
179
- }
180
- },
181
- audio: this.composeAudio_Sequence([outgoingNode, incomingNode])
182
- }
183
- }
184
- }
@@ -1,30 +0,0 @@
1
- import {Item} from "../../item.js"
2
- import {AudioStreamComponent, Node, WebcodecsSampler, TreeBuilder} from "./tree-builder.js"
3
-
4
- class WebCodecsNodeBuilder extends TreeBuilder<AudioStreamComponent> {
5
- composeAudio_Stack(children: Node<AudioStreamComponent>[]) {
6
- return {
7
- getStream: async function*() {
8
- for (const child of children) {
9
- if (child.audio)
10
- yield* child.audio.getStream()
11
- }
12
- }
13
- }
14
- }
15
- composeAudio_Sequence(children: Node<AudioStreamComponent>[]) {
16
- return {
17
- getStream: async function*() {
18
- for (const child of children) {
19
- if (child.audio)
20
- yield* child.audio.getStream()
21
- }
22
- }
23
- }
24
- }
25
- }
26
-
27
- export function buildWebCodecsNodeTree(root: Item.Any, items: Map<number, Item.Any>, sampler: WebcodecsSampler) {
28
- const builder = new WebCodecsNodeBuilder(items, sampler)
29
- return builder.build(root)
30
- }
@@ -1,81 +0,0 @@
1
- import {TimelineFile} from "../basics.js"
2
- import {context} from "../../../context.js"
3
- import {realtime} from "./parts/schedulers.js"
4
- import {makeHtmlSampler} from "./samplers/html.js"
5
- import {buildHTMLNodeTree} from "./parts/html-tree.js"
6
- import {DecoderSource} from "../../../driver/fns/schematic.js"
7
- import {AudioPlaybackComponent, HTMLSampler, Node} from "./parts/tree-builder.js"
8
-
9
- type ResolveMedia = (hash: string) => DecoderSource
10
-
11
- export class VideoPlayer {
12
- #controller = realtime(t => this.#tick(t))
13
-
14
- constructor(
15
- public canvas: HTMLCanvasElement,
16
- private root: Node<AudioPlaybackComponent>,
17
- private sampler: HTMLSampler,
18
- private resolveMedia: ResolveMedia = _hash => "/assets/temp/gl.mp4"
19
- ) {
20
- this.#controller.setFPS(30)
21
- }
22
-
23
- get context() {
24
- return this.canvas.getContext("2d")!
25
- }
26
-
27
- static async create(timeline: TimelineFile) {
28
- const rootItem = new Map(timeline.items.map(i => [i.id, i])).get(timeline.rootId)!
29
- const items = new Map(timeline.items.map(i => [i.id, i]))
30
- const sampler = makeHtmlSampler(() => "/assets/temp/gl.mp4")
31
- const root = await buildHTMLNodeTree(rootItem, items, sampler)
32
- const canvas = document.createElement("canvas")
33
- canvas.width = 1920
34
- canvas.height = 1080
35
- return new this(canvas, root, sampler)
36
- }
37
-
38
- async #tick(t: number) {
39
- const driver = await context.driver
40
- const dur = this.root.duration
41
- const tt = t > dur ? dur : t
42
- this.root.audio?.onTimeUpdate(tt)
43
- for (const layer of await this.root.visuals?.sampleAt(tt) ?? []) {
44
- const frame = await driver.composite(layer)
45
- this.context.drawImage(frame, 0, 0)
46
- frame.close()
47
- }
48
- if (t >= dur) this.pause()
49
- }
50
-
51
- async play() {
52
- if (!this.#controller.isPlaying()) {
53
- this.sampler.setPaused!(false)
54
- this.#controller.play()
55
- }
56
- }
57
-
58
- pause() {
59
- if(this.#controller.isPlaying()) {
60
- this.#controller.pause()
61
- this.sampler.setPaused!(true)
62
- }
63
- }
64
-
65
- async seek(time: number) {
66
- const driver = await context.driver
67
- this.pause()
68
- this.#controller.seek(time)
69
- this.root.audio?.onTimeUpdate(time)
70
- for (const draw of await this.root.visuals?.sampleAt(time) ?? []) {
71
- const frame = await driver.composite(draw)
72
- this.context.drawImage(frame, 0, 0)
73
- frame.close()
74
- }
75
- }
76
-
77
- setFPS(value: number) {
78
- this.#controller.setFPS(value)
79
- }
80
- }
81
-
@@ -1,115 +0,0 @@
1
- import {Item} from "../../item.js"
2
- import {HTMLSampler} from "../parts/tree-builder.js"
3
- import {DecoderSource} from "../../../../driver/fns/schematic.js"
4
-
5
- const toUrl = (src: DecoderSource) => (src instanceof Blob ? URL.createObjectURL(src) : String(src))
6
-
7
- export function makeHtmlSampler(resolveMedia: (hash: string) => DecoderSource): HTMLSampler {
8
- const videoElements = new Map<number, HTMLVideoElement>()
9
- const audioElements = new Map<number, HTMLAudioElement>()
10
-
11
- function getOrCreateVideoElement(clip: Item.Video) {
12
- let video = videoElements.get(clip.id)
13
- if (!video) {
14
- video = document.createElement("video")
15
- video.playsInline = true
16
- video.muted = true
17
- video.preload = "auto"
18
- video.crossOrigin = "anonymous"
19
- video.src = toUrl(resolveMedia(clip.mediaHash))
20
- videoElements.set(clip.id, video)
21
- }
22
- return video
23
- }
24
-
25
- function getOrCreateAudioElement(clip: Item.Audio) {
26
- let audio = audioElements.get(clip.id)
27
- if (!audio) {
28
- audio = document.createElement("audio")
29
- audio.preload = "auto"
30
- audio.crossOrigin = "anonymous"
31
- audio.src = toUrl(resolveMedia(clip.mediaHash))
32
- audio.volume = 0.2
33
- audioElements.set(clip.id, audio)
34
- }
35
- return audio
36
- }
37
-
38
- let paused = true
39
-
40
- return {
41
- async video(item, matrix) {
42
- const video = getOrCreateVideoElement(item)
43
- return {
44
- duration: item.duration,
45
- // if paused seek otherwise play
46
- visuals: {
47
- sampleAt: async (t) => {
48
- if (t < 0 || t >= item.duration)
49
- return []
50
-
51
- if(video.paused && paused) {
52
- await seek(video, t)
53
- }
54
-
55
- if(video.paused && !paused) {
56
- await video.play()
57
- }
58
-
59
- const frame = new VideoFrame(video)
60
- return frame ? [{kind: "image", frame, matrix}] : []
61
- }
62
- }
63
- }
64
- },
65
- async audio(item) {
66
- const audio = getOrCreateAudioElement(item)
67
- return {
68
- duration: item.duration,
69
- audio: {
70
- onTimeUpdate: async (time) => {
71
- const localTime = item.start + time
72
- if(audio.paused && paused) {
73
- await seek(audio, localTime)
74
- }
75
- if(audio.paused && !paused) {
76
- await audio.play()
77
- }
78
- return []
79
- }
80
- }
81
- }
82
- },
83
- async dispose() {
84
- const elements = [...videoElements.values(), ...audioElements.values()]
85
- for (const element of elements) {
86
- element.pause()
87
- if (element.src.startsWith("blob:"))
88
- URL.revokeObjectURL(element.src)
89
- element.remove()
90
- }
91
- videoElements.clear()
92
- audioElements.clear()
93
- },
94
- async setPaused(p) {
95
- paused = p
96
- const elements = [...videoElements.values(), ...audioElements.values()]
97
- for(const element of elements) {
98
- if(p) element.pause()
99
- }
100
- },
101
- }
102
- }
103
-
104
- function seek(media: HTMLVideoElement | HTMLAudioElement, time: number): Promise<void> {
105
- return new Promise((resolve) => {
106
- const onSeeked = () => {
107
- media.removeEventListener("seeked", onSeeked)
108
- resolve()
109
- }
110
- media.addEventListener("seeked", onSeeked)
111
- if(media.fastSeek) {
112
- media.fastSeek(time)
113
- } else media.currentTime = time
114
- })
115
- }
@@ -1,60 +0,0 @@
1
- import {Item} from "../../item.js"
2
- import {context} from "../../../../context.js"
3
- import {WebcodecsSampler} from "../parts/tree-builder.js"
4
- import {VideoCursor} from "../../../utils/video-cursor.js"
5
- import {AudioStream} from "../../../utils/audio-stream.js"
6
-
7
- const toUs = (seconds: number) => Math.round(seconds * 1_000_000)
8
-
9
- export function makeWebCodecsSampler(resolveMedia: (hash: string) => any): WebcodecsSampler {
10
- const videoCursors = new Map<number, VideoCursor>()
11
-
12
- async function getCursorForVideo(videoItem: Item.Video): Promise<VideoCursor> {
13
- const existing = videoCursors.get(videoItem.id)
14
- if (existing) return existing
15
- const driver = await context.driver
16
- const source = resolveMedia(videoItem.mediaHash)
17
- const video = driver.decodeVideo({source})
18
- const cursor = new VideoCursor(video.getReader())
19
- videoCursors.set(videoItem.id, cursor)
20
- return cursor
21
- }
22
-
23
- return {
24
- async video(item, matrix) {
25
- const cursor = await getCursorForVideo(item)
26
- const baseUs = toUs(item.start ?? 0)
27
- return {
28
- duration: item.duration,
29
- visuals: {
30
- sampleAt: async (time: number) => {
31
- const frame = await cursor.atOrNear(baseUs + toUs(time))
32
- return frame ? [{kind: "image", frame, matrix}] : []
33
- }
34
- }
35
- }
36
- },
37
- async audio(item) {
38
- return {
39
- duration: item.duration,
40
- audio: {
41
- getStream: async function*() {
42
- const driver = await context.driver
43
- const source = resolveMedia(item.mediaHash)
44
- const startUs = item.start
45
- const endUs = (item.start + item.duration)
46
- const audio = driver.decodeAudio({source, start: startUs, end: endUs})
47
- const audioStream = new AudioStream(audio.getReader())
48
- yield* audioStream.stream()
49
- },
50
- }
51
- }
52
- },
53
- async dispose() {
54
- const tasks = Array.from([...videoCursors.values()], c => c.cancel())
55
- videoCursors.clear()
56
- await Promise.all(tasks)
57
- }
58
- }
59
- }
60
-
@@ -1,62 +0,0 @@
1
- import WaveSurfer from "wavesurfer.js"
2
-
3
- import {context} from "../../context.js"
4
- import {DecoderSource} from "../../driver/fns/schematic.js"
5
-
6
- export class Waveform {
7
- wavesurfer: WaveSurfer
8
-
9
- constructor(peaks: number[], container: HTMLElement, duration: number) {
10
- this.wavesurfer = WaveSurfer.create({
11
- container,
12
- waveColor: 'rgb(200, 0, 200)',
13
- progressColor: 'rgb(100, 0, 100)',
14
- barWidth: 10,
15
- barRadius: 10,
16
- barGap: 2,
17
- peaks: [peaks],
18
- duration
19
- })
20
- }
21
-
22
- static async init(source: DecoderSource, container: HTMLElement) {
23
- const driver = await context.driver
24
- const reader = driver.decodeAudio({source}).getReader()
25
-
26
- const peaks: number[] = []
27
- let buffer: number[] = []
28
- const samplesPerPeak = 1024
29
- const duration = await driver.getAudioDuration(source)
30
-
31
- while (true) {
32
- const {done, value: audioData} = await reader.read()
33
- if (done) break
34
-
35
- const frames = audioData.numberOfFrames
36
- const plane = new Float32Array(frames)
37
- audioData.copyTo(plane, {planeIndex: 0}) // Use left channel only
38
-
39
- for (let i = 0; i < plane.length; i++) {
40
- buffer.push(plane[i])
41
- if (buffer.length >= samplesPerPeak) {
42
- const chunk = buffer.splice(0, samplesPerPeak)
43
- const min = Math.min(...chunk)
44
- const max = Math.max(...chunk)
45
- peaks.push(min, max)
46
- }
47
- }
48
-
49
- audioData.close()
50
- }
51
-
52
- return new Waveform(peaks, container, duration ?? 0)
53
- }
54
-
55
- // set zoom(value: number) {
56
- // this.wavesurfer.zoom(value)
57
- // }
58
-
59
- set width(value: number) {
60
- this.wavesurfer.setOptions({width: value})
61
- }
62
- }
@@ -1,102 +0,0 @@
1
- import {O} from "./o.js"
2
- import {Id} from "../parts/basics.js"
3
- import {Item} from "../parts/item.js"
4
-
5
- export class TimelineItem {
6
- public readonly id: Id
7
-
8
- constructor(public item: Item.Any) {
9
- this.id = item.id
10
- }
11
-
12
- toJSON() {
13
- return {
14
- ...this.item
15
- }
16
- }
17
- }
18
-
19
- abstract class VisualItem extends TimelineItem {
20
- abstract spatial(spatial: Spatial): TimelineItem
21
- }
22
-
23
- export class Stack extends VisualItem {
24
- constructor(private o: O, public item: Item.Stack) {
25
- super(item)
26
- }
27
-
28
- spatial(spatial: Spatial) {
29
- this.item.spatialId = spatial.item.id
30
- return this
31
- }
32
-
33
- addChildren(fn: (o: O) => TimelineItem | TimelineItem[]) {
34
- const result = fn(this.o)
35
- const items = Array.isArray(result) ? result : [result]
36
- this.item.childrenIds.push(...items.map(c => c.item.id))
37
- return this
38
- }
39
- }
40
-
41
- export class Spatial extends TimelineItem {
42
- constructor(public item: Item.Spatial) {super(item)}
43
- }
44
-
45
- export class Gap extends TimelineItem {
46
- constructor(public item: Item.Gap) {super(item)}
47
- }
48
-
49
- export class Audio extends TimelineItem {
50
- constructor(public item: Item.Audio) {super(item)}
51
- }
52
-
53
- export class Video extends VisualItem {
54
- constructor(public item: Item.Video) {
55
- super(item)
56
- }
57
-
58
- spatial(spatial: Spatial) {
59
- this.item.spatialId = spatial.item.id
60
- return this
61
- }
62
- }
63
-
64
- export class Text extends VisualItem {
65
- constructor(public item: Item.Text) {
66
- super(item)
67
- }
68
-
69
- color(color: string) {
70
- this.item.color = color
71
- return this
72
- }
73
-
74
- spatial(spatial: Spatial) {
75
- this.item.spatialId = spatial.item.id
76
- return this
77
- }
78
- }
79
-
80
- export class Sequence extends VisualItem {
81
- constructor(private o: O, public item: Item.Sequence) {
82
- super(item)
83
- }
84
-
85
- spatial(spatial: Spatial) {
86
- this.item.spatialId = spatial.item.id
87
- return this
88
- }
89
-
90
- addChildren(fn: (o: O) => TimelineItem | TimelineItem[]) {
91
- const result = fn(this.o)
92
- const items = Array.isArray(result) ? result : [result]
93
- this.item.childrenIds.push(...items.map(c => c.item.id))
94
- return this
95
- }
96
- }
97
-
98
- export class Transition extends TimelineItem {
99
- constructor(public item: Item.Transition) {
100
- super(item)
101
- }
102
- }
@@ -1,38 +0,0 @@
1
-
2
- import {Omni} from "./omni.js"
3
- import {dummyData} from "../utils/dummy-data.js"
4
-
5
- //
6
- // create an omni context
7
- //
8
-
9
- const omni = new Omni()
10
-
11
- //
12
- // load in some media resources
13
- //
14
-
15
- const {mediaA, mediaB} = await omni.load({
16
- mediaA: dummyData(),
17
- mediaB: dummyData(),
18
- })
19
-
20
- //
21
- // create a timeline
22
- //
23
-
24
- const timeline = omni.timeline(o => o.sequence(
25
- o.video(mediaA),
26
- o.transition.crossfade(600),
27
- o.stack(
28
- o.video(mediaB),
29
- o.text("hello world"),
30
- ),
31
- ))
32
-
33
- //
34
- // log the timeline
35
- //
36
-
37
- console.log(JSON.stringify(timeline, undefined, " "))
38
-
@@ -1,22 +0,0 @@
1
- import {TimelineItem} from "./sugar/builders.js"
2
- import {Id, TimelineFile} from "./parts/basics.js"
3
-
4
- export class Timeline {
5
- constructor(public root: TimelineItem, private items: Map<Id, TimelineItem>) {}
6
-
7
- require<T extends TimelineItem>(id: Id): T {
8
- const item = this.items.get(id)
9
- return item as T
10
- }
11
-
12
- toJSON(): TimelineFile {
13
- return {
14
- format: "timeline",
15
- info: "https://omniclip.app/",
16
- version: 0,
17
- rootId: this.root.item.id,
18
- items: Array.from(this.items.values()).map(item => item.toJSON())
19
- }
20
- }
21
- }
22
-