@omnimedia/omnitool 1.1.0-1 → 1.1.0-100

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 (468) hide show
  1. package/README.md +556 -72
  2. package/package.json +20 -15
  3. package/s/context.ts +0 -7
  4. package/s/demo/demo.bundle.ts +104 -39
  5. package/s/demo/demo.css +246 -11
  6. package/s/demo/routines/export-test.ts +16 -0
  7. package/s/demo/routines/filmstrip-test.ts +23 -19
  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 +81 -0
  11. package/s/demo/routines/transcode-test.ts +21 -5
  12. package/s/demo/routines/transcriber-test.ts +34 -0
  13. package/s/demo/routines/transitions-test.ts +43 -0
  14. package/s/demo/routines/waveform-test.ts +35 -8
  15. package/s/driver/driver-worker.ts +9 -0
  16. package/s/driver/driver.test.ts +1 -1
  17. package/s/driver/driver.ts +52 -43
  18. package/s/driver/fns/host.ts +7 -6
  19. package/s/driver/fns/schematic.ts +69 -25
  20. package/s/driver/fns/work.ts +102 -214
  21. package/s/driver/parts/compositor.ts +319 -0
  22. package/s/driver/parts/machina.ts +19 -20
  23. package/s/driver/utils/find-pixi-filter.ts +24 -0
  24. package/s/driver/utils/load-decoder-source.ts +3 -4
  25. package/s/features/bg-remover/bg-remover.ts +26 -0
  26. package/s/features/bg-remover/default-spec.ts +11 -0
  27. package/s/features/bg-remover/types.ts +27 -0
  28. package/s/features/bg-remover/worker.bundle.ts +52 -0
  29. package/s/features/parts/expose-errors.ts +41 -0
  30. package/s/features/parts/load-pipe.ts +17 -0
  31. package/s/features/parts/types.ts +19 -0
  32. package/s/features/speech/transcribe/default-spec.ts +11 -0
  33. package/s/features/speech/transcribe/parts/prep-audio.ts +23 -0
  34. package/s/features/speech/transcribe/parts/transcribe.ts +70 -0
  35. package/s/features/speech/transcribe/transcriber.ts +46 -0
  36. package/s/features/speech/transcribe/types.ts +76 -0
  37. package/s/features/speech/transcribe/worker.bundle.ts +42 -0
  38. package/s/features/transition/parts/fragment.ts +24 -0
  39. package/s/features/transition/parts/types.ts +27 -0
  40. package/s/features/transition/parts/uniforms.ts +29 -0
  41. package/s/features/transition/parts/vertex.ts +31 -0
  42. package/s/features/transition/transition.ts +60 -0
  43. package/s/index.html.ts +103 -20
  44. package/s/index.ts +1 -0
  45. package/s/tests.bundle.ts +11 -0
  46. package/s/tests.html.ts +28 -0
  47. package/s/timeline/index.ts +17 -1
  48. package/s/timeline/parts/animations/make.ts +38 -0
  49. package/s/timeline/parts/animations/presets.ts +138 -0
  50. package/s/timeline/parts/animations/properties.ts +30 -0
  51. package/s/timeline/parts/animations/registry.ts +13 -0
  52. package/s/timeline/parts/animations/types.ts +80 -0
  53. package/s/timeline/parts/basics.ts +1 -1
  54. package/s/timeline/parts/captions.ts +91 -0
  55. package/s/timeline/parts/filmstrip.ts +43 -16
  56. package/s/timeline/parts/filters.ts +453 -0
  57. package/s/timeline/parts/item.ts +124 -11
  58. package/s/timeline/parts/media.ts +43 -1
  59. package/s/timeline/parts/resource-pool.ts +8 -5
  60. package/s/timeline/parts/resource.ts +3 -0
  61. package/s/timeline/parts/transitions.ts +102 -0
  62. package/s/timeline/parts/waveform/parts/collect.ts +72 -0
  63. package/s/timeline/parts/waveform/parts/render.ts +45 -0
  64. package/s/timeline/parts/waveform/parts/types.ts +24 -0
  65. package/s/timeline/parts/waveform/waveform.ts +161 -0
  66. package/s/timeline/renderers/export/parts/audio-gain.ts +17 -0
  67. package/s/timeline/renderers/export/parts/audio-mix.ts +133 -0
  68. package/s/timeline/renderers/export/parts/cursor.ts +291 -0
  69. package/s/timeline/renderers/export/parts/produce-audio.ts +64 -0
  70. package/s/timeline/renderers/export/parts/produce-video.ts +49 -0
  71. package/s/timeline/renderers/export/parts/resamplers.ts +48 -0
  72. package/s/timeline/renderers/export/produce.ts +28 -0
  73. package/s/timeline/renderers/parts/handy.ts +441 -0
  74. package/s/timeline/renderers/parts/samplers/audio/parts/find.ts +19 -0
  75. package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +60 -0
  76. package/s/timeline/renderers/parts/samplers/audio/parts/sink.ts +38 -0
  77. package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +16 -0
  78. package/s/timeline/renderers/parts/samplers/audio/sampler.ts +35 -0
  79. package/s/timeline/renderers/parts/samplers/visual/parts/defaults.ts +23 -0
  80. package/s/timeline/renderers/parts/samplers/visual/parts/image-sink.ts +51 -0
  81. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +99 -0
  82. package/s/timeline/renderers/parts/samplers/visual/parts/sequence.ts +97 -0
  83. package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +28 -0
  84. package/s/timeline/renderers/parts/samplers/visual/parts/types.ts +11 -0
  85. package/s/timeline/renderers/parts/samplers/visual/parts/video-sink.ts +38 -0
  86. package/s/timeline/renderers/parts/samplers/visual/sampler.ts +31 -0
  87. package/s/timeline/renderers/parts/schedulers.ts +96 -0
  88. package/s/timeline/renderers/player/parts/playback.ts +213 -0
  89. package/s/timeline/renderers/player/player.ts +86 -0
  90. package/s/timeline/renderers/renderers.test.ts +403 -0
  91. package/s/timeline/sugar/helpers.ts +239 -0
  92. package/s/timeline/sugar/o.ts +443 -48
  93. package/s/timeline/sugar/omni.test.ts +210 -0
  94. package/s/timeline/sugar/omni.ts +38 -12
  95. package/s/timeline/types.ts +62 -0
  96. package/s/timeline/utils/anim.ts +63 -0
  97. package/s/timeline/utils/checksum.ts +5 -2
  98. package/s/timeline/utils/datafile.ts +15 -4
  99. package/s/timeline/utils/dummy-data.ts +3 -3
  100. package/s/timeline/utils/matrix.ts +54 -0
  101. package/s/timeline/utils/terps.ts +81 -0
  102. package/s/units/fps.ts +8 -0
  103. package/s/units/ms.ts +8 -0
  104. package/s/units/seconds.ts +8 -0
  105. package/x/WebGLRenderer-4CHIZDHY.js +2 -0
  106. package/x/WebGLRenderer-4CHIZDHY.js.map +7 -0
  107. package/x/WebGPURenderer-O6WXU2QR.js +2 -0
  108. package/x/WebGPURenderer-O6WXU2QR.js.map +7 -0
  109. package/x/browserAll-WNIOTNNP.js +2 -0
  110. package/x/browserAll-WNIOTNNP.js.map +7 -0
  111. package/x/chunk-23FOBGX6.js +2 -0
  112. package/x/chunk-23FOBGX6.js.map +7 -0
  113. package/x/chunk-73XOWA4F.js +393 -0
  114. package/x/chunk-73XOWA4F.js.map +7 -0
  115. package/x/chunk-IAWJKNX5.js +42 -0
  116. package/x/chunk-IAWJKNX5.js.map +7 -0
  117. package/x/chunk-KCMVLWBS.js +157 -0
  118. package/x/chunk-KCMVLWBS.js.map +7 -0
  119. package/x/chunk-MR32SQ27.js +2 -0
  120. package/x/chunk-MR32SQ27.js.map +7 -0
  121. package/x/chunk-VCUJJYRJ.js +327 -0
  122. package/x/chunk-VCUJJYRJ.js.map +7 -0
  123. package/x/chunk-XNIZ4L5W.js +269 -0
  124. package/x/chunk-XNIZ4L5W.js.map +7 -0
  125. package/x/chunk-ZLGNQFUI.js +15 -0
  126. package/x/chunk-ZLGNQFUI.js.map +7 -0
  127. package/x/context.d.ts +1 -4
  128. package/x/context.js +1 -5
  129. package/x/context.js.map +1 -1
  130. package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
  131. package/x/demo/WebGLRenderer-RSJAHIG2.js.map +7 -0
  132. package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
  133. package/x/demo/WebGPURenderer-MGFAJCYY.js.map +7 -0
  134. package/x/demo/browserAll-PTRBXBRP.js +2 -0
  135. package/x/demo/browserAll-PTRBXBRP.js.map +7 -0
  136. package/x/demo/chunk-CUYOGHWU.js +42 -0
  137. package/x/demo/chunk-CUYOGHWU.js.map +7 -0
  138. package/x/demo/chunk-DGTDNJ7W.js +2 -0
  139. package/x/demo/chunk-DGTDNJ7W.js.map +7 -0
  140. package/x/demo/chunk-FZ5BYF63.js +15 -0
  141. package/x/demo/chunk-FZ5BYF63.js.map +7 -0
  142. package/x/demo/chunk-KWN4NNES.js +269 -0
  143. package/x/demo/chunk-KWN4NNES.js.map +7 -0
  144. package/x/demo/chunk-OJ3FPXW7.js +157 -0
  145. package/x/demo/chunk-OJ3FPXW7.js.map +7 -0
  146. package/x/demo/chunk-PSLUOGTZ.js +393 -0
  147. package/x/demo/chunk-PSLUOGTZ.js.map +7 -0
  148. package/x/demo/chunk-VLCVEIFU.js +327 -0
  149. package/x/demo/chunk-VLCVEIFU.js.map +7 -0
  150. package/x/demo/chunk-ZWCPT5FR.js +2 -0
  151. package/x/demo/chunk-ZWCPT5FR.js.map +7 -0
  152. package/x/demo/demo.bundle.js +94 -36
  153. package/x/demo/demo.bundle.js.map +1 -1
  154. package/x/demo/demo.bundle.min.js +7359 -107
  155. package/x/demo/demo.bundle.min.js.map +4 -4
  156. package/x/demo/demo.css +246 -11
  157. package/x/demo/routines/export-test.d.ts +2 -0
  158. package/x/demo/routines/export-test.js +10 -0
  159. package/x/demo/routines/export-test.js.map +1 -0
  160. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  161. package/x/demo/routines/filmstrip-test.js +21 -18
  162. package/x/demo/routines/filmstrip-test.js.map +1 -1
  163. package/x/demo/routines/load-video.d.ts +1 -1
  164. package/x/demo/routines/load-video.js +1 -2
  165. package/x/demo/routines/load-video.js.map +1 -1
  166. package/x/demo/routines/playback-test.d.ts +2 -0
  167. package/x/demo/routines/playback-test.js +51 -0
  168. package/x/demo/routines/playback-test.js.map +1 -0
  169. package/x/demo/routines/timeline-setup.d.ts +6 -0
  170. package/x/demo/routines/timeline-setup.js +59 -0
  171. package/x/demo/routines/timeline-setup.js.map +1 -0
  172. package/x/demo/routines/transcode-test.js +17 -5
  173. package/x/demo/routines/transcode-test.js.map +1 -1
  174. package/x/demo/routines/transcriber-test.d.ts +4 -0
  175. package/x/demo/routines/transcriber-test.js +33 -0
  176. package/x/demo/routines/transcriber-test.js.map +1 -0
  177. package/x/demo/routines/transitions-test.d.ts +5 -0
  178. package/x/demo/routines/transitions-test.js +35 -0
  179. package/x/demo/routines/transitions-test.js.map +1 -0
  180. package/x/demo/routines/waveform-test.d.ts +2 -1
  181. package/x/demo/routines/waveform-test.js +29 -8
  182. package/x/demo/routines/waveform-test.js.map +1 -1
  183. package/x/demo/webworkerAll-JENRT6BT.js +2 -0
  184. package/x/demo/webworkerAll-JENRT6BT.js.map +7 -0
  185. package/x/driver/driver-worker.d.ts +1 -0
  186. package/x/driver/driver-worker.js +6 -0
  187. package/x/driver/driver-worker.js.map +1 -0
  188. package/x/driver/driver.d.ts +24 -9
  189. package/x/driver/driver.js +51 -40
  190. package/x/driver/driver.js.map +1 -1
  191. package/x/driver/driver.test.js +1 -1
  192. package/x/driver/driver.test.js.map +1 -1
  193. package/x/driver/driver.worker.bundle.min.js +137 -1137
  194. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  195. package/x/driver/fns/host.d.ts +12 -4
  196. package/x/driver/fns/host.js +3 -3
  197. package/x/driver/fns/host.js.map +1 -1
  198. package/x/driver/fns/schematic.d.ts +65 -25
  199. package/x/driver/fns/work.d.ts +14 -7
  200. package/x/driver/fns/work.js +83 -174
  201. package/x/driver/fns/work.js.map +1 -1
  202. package/x/driver/parts/compositor.d.ts +39 -0
  203. package/x/driver/parts/compositor.js +264 -0
  204. package/x/driver/parts/compositor.js.map +1 -0
  205. package/x/driver/parts/machina.d.ts +0 -20
  206. package/x/driver/parts/machina.js +6 -10
  207. package/x/driver/parts/machina.js.map +1 -1
  208. package/x/driver/utils/find-pixi-filter.d.ts +5 -0
  209. package/x/driver/utils/find-pixi-filter.js +13 -0
  210. package/x/driver/utils/find-pixi-filter.js.map +1 -0
  211. package/x/driver/utils/load-decoder-source.d.ts +2 -1
  212. package/x/driver/utils/load-decoder-source.js +2 -3
  213. package/x/driver/utils/load-decoder-source.js.map +1 -1
  214. package/x/features/bg-remover/bg-remover.d.ts +5 -0
  215. package/x/features/bg-remover/bg-remover.js +18 -0
  216. package/x/features/bg-remover/bg-remover.js.map +1 -0
  217. package/x/features/bg-remover/default-spec.d.ts +2 -0
  218. package/x/features/bg-remover/default-spec.js +6 -0
  219. package/x/features/bg-remover/default-spec.js.map +1 -0
  220. package/x/features/bg-remover/types.d.ts +20 -0
  221. package/x/features/bg-remover/types.js +2 -0
  222. package/x/features/bg-remover/types.js.map +1 -0
  223. package/x/features/bg-remover/worker.bundle.js +39 -0
  224. package/x/features/bg-remover/worker.bundle.js.map +1 -0
  225. package/x/features/bg-remover/worker.bundle.min.js +2916 -0
  226. package/x/features/bg-remover/worker.bundle.min.js.map +7 -0
  227. package/x/features/parts/expose-errors.d.ts +3 -0
  228. package/x/features/parts/expose-errors.js +32 -0
  229. package/x/features/parts/expose-errors.js.map +1 -0
  230. package/x/features/parts/load-pipe.d.ts +2 -0
  231. package/x/features/parts/load-pipe.js +13 -0
  232. package/x/features/parts/load-pipe.js.map +1 -0
  233. package/x/features/parts/types.d.ts +15 -0
  234. package/x/features/parts/types.js +2 -0
  235. package/x/features/parts/types.js.map +1 -0
  236. package/x/features/speech/transcribe/default-spec.d.ts +2 -0
  237. package/x/features/speech/transcribe/default-spec.js +8 -0
  238. package/x/features/speech/transcribe/default-spec.js.map +1 -0
  239. package/x/features/speech/transcribe/parts/prep-audio.d.ts +5 -0
  240. package/x/features/speech/transcribe/parts/prep-audio.js +21 -0
  241. package/x/features/speech/transcribe/parts/prep-audio.js.map +1 -0
  242. package/x/features/speech/transcribe/parts/transcribe.d.ts +5 -0
  243. package/x/features/speech/transcribe/parts/transcribe.js +56 -0
  244. package/x/features/speech/transcribe/parts/transcribe.js.map +1 -0
  245. package/x/features/speech/transcribe/transcriber.d.ts +5 -0
  246. package/x/features/speech/transcribe/transcriber.js +33 -0
  247. package/x/features/speech/transcribe/transcriber.js.map +1 -0
  248. package/x/features/speech/transcribe/types.d.ts +59 -0
  249. package/x/features/speech/transcribe/types.js +2 -0
  250. package/x/features/speech/transcribe/types.js.map +1 -0
  251. package/x/features/speech/transcribe/worker.bundle.js +35 -0
  252. package/x/features/speech/transcribe/worker.bundle.js.map +1 -0
  253. package/x/features/speech/transcribe/worker.bundle.min.js +2916 -0
  254. package/x/features/speech/transcribe/worker.bundle.min.js.map +7 -0
  255. package/x/features/transition/parts/fragment.d.ts +1 -0
  256. package/x/features/transition/parts/fragment.js +25 -0
  257. package/x/features/transition/parts/fragment.js.map +1 -0
  258. package/x/features/transition/parts/types.d.ts +23 -0
  259. package/x/features/transition/parts/types.js +2 -0
  260. package/x/features/transition/parts/types.js.map +1 -0
  261. package/x/features/transition/parts/uniforms.d.ts +31 -0
  262. package/x/features/transition/parts/uniforms.js +27 -0
  263. package/x/features/transition/parts/uniforms.js.map +1 -0
  264. package/x/features/transition/parts/vertex.d.ts +1 -0
  265. package/x/features/transition/parts/vertex.js +32 -0
  266. package/x/features/transition/parts/vertex.js.map +1 -0
  267. package/x/features/transition/transition.d.ts +5 -0
  268. package/x/features/transition/transition.js +50 -0
  269. package/x/features/transition/transition.js.map +1 -0
  270. package/x/index.d.ts +1 -0
  271. package/x/index.html +349 -30
  272. package/x/index.html.js +103 -19
  273. package/x/index.html.js.map +1 -1
  274. package/x/index.js +1 -0
  275. package/x/index.js.map +1 -1
  276. package/x/tests.bundle.d.ts +1 -0
  277. package/x/tests.bundle.js +8 -0
  278. package/x/tests.bundle.js.map +1 -0
  279. package/x/tests.bundle.min.js +7374 -0
  280. package/x/tests.bundle.min.js.map +7 -0
  281. package/x/tests.html +316 -0
  282. package/x/tests.html.d.ts +2 -0
  283. package/x/tests.html.js +22 -0
  284. package/x/tests.html.js.map +1 -0
  285. package/x/timeline/index.d.ts +16 -0
  286. package/x/timeline/index.js +16 -0
  287. package/x/timeline/index.js.map +1 -1
  288. package/x/timeline/parts/animations/make.d.ts +3 -0
  289. package/x/timeline/parts/animations/make.js +29 -0
  290. package/x/timeline/parts/animations/make.js.map +1 -0
  291. package/x/timeline/parts/animations/presets.d.ts +170 -0
  292. package/x/timeline/parts/animations/presets.js +135 -0
  293. package/x/timeline/parts/animations/presets.js.map +1 -0
  294. package/x/timeline/parts/animations/properties.d.ts +84 -0
  295. package/x/timeline/parts/animations/properties.js +25 -0
  296. package/x/timeline/parts/animations/properties.js.map +1 -0
  297. package/x/timeline/parts/animations/registry.d.ts +218 -0
  298. package/x/timeline/parts/animations/registry.js +11 -0
  299. package/x/timeline/parts/animations/registry.js.map +1 -0
  300. package/x/timeline/parts/animations/types.d.ts +60 -0
  301. package/x/timeline/parts/animations/types.js +2 -0
  302. package/x/timeline/parts/animations/types.js.map +1 -0
  303. package/x/timeline/parts/basics.d.ts +1 -1
  304. package/x/timeline/parts/captions.d.ts +41 -0
  305. package/x/timeline/parts/captions.js +55 -0
  306. package/x/timeline/parts/captions.js.map +1 -0
  307. package/x/timeline/parts/filmstrip.d.ts +4 -3
  308. package/x/timeline/parts/filmstrip.js +29 -10
  309. package/x/timeline/parts/filmstrip.js.map +1 -1
  310. package/x/timeline/parts/filters.d.ts +108 -0
  311. package/x/timeline/parts/filters.js +340 -0
  312. package/x/timeline/parts/filters.js.map +1 -0
  313. package/x/timeline/parts/item.d.ts +106 -12
  314. package/x/timeline/parts/item.js +11 -7
  315. package/x/timeline/parts/item.js.map +1 -1
  316. package/x/timeline/parts/media.d.ts +6 -0
  317. package/x/timeline/parts/media.js +35 -1
  318. package/x/timeline/parts/media.js.map +1 -1
  319. package/x/timeline/parts/resource-pool.d.ts +3 -0
  320. package/x/timeline/parts/resource-pool.js +7 -4
  321. package/x/timeline/parts/resource-pool.js.map +1 -1
  322. package/x/timeline/parts/resource.d.ts +3 -0
  323. package/x/timeline/parts/transitions.d.ts +15 -0
  324. package/x/timeline/parts/transitions.js +81 -0
  325. package/x/timeline/parts/transitions.js.map +1 -0
  326. package/x/timeline/parts/waveform/parts/collect.d.ts +11 -0
  327. package/x/timeline/parts/waveform/parts/collect.js +56 -0
  328. package/x/timeline/parts/waveform/parts/collect.js.map +1 -0
  329. package/x/timeline/parts/waveform/parts/render.d.ts +5 -0
  330. package/x/timeline/parts/waveform/parts/render.js +29 -0
  331. package/x/timeline/parts/waveform/parts/render.js.map +1 -0
  332. package/x/timeline/parts/waveform/parts/types.d.ts +21 -0
  333. package/x/timeline/parts/waveform/parts/types.js +2 -0
  334. package/x/timeline/parts/waveform/parts/types.js.map +1 -0
  335. package/x/timeline/parts/waveform/waveform.d.ts +19 -0
  336. package/x/timeline/parts/waveform/waveform.js +133 -0
  337. package/x/timeline/parts/waveform/waveform.js.map +1 -0
  338. package/x/timeline/renderers/export/parts/audio-gain.d.ts +1 -0
  339. package/x/timeline/renderers/export/parts/audio-gain.js +13 -0
  340. package/x/timeline/renderers/export/parts/audio-gain.js.map +1 -0
  341. package/x/timeline/renderers/export/parts/audio-mix.d.ts +21 -0
  342. package/x/timeline/renderers/export/parts/audio-mix.js +89 -0
  343. package/x/timeline/renderers/export/parts/audio-mix.js.map +1 -0
  344. package/x/timeline/renderers/export/parts/cursor.d.ts +35 -0
  345. package/x/timeline/renderers/export/parts/cursor.js +236 -0
  346. package/x/timeline/renderers/export/parts/cursor.js.map +1 -0
  347. package/x/timeline/renderers/export/parts/produce-audio.d.ts +6 -0
  348. package/x/timeline/renderers/export/parts/produce-audio.js +41 -0
  349. package/x/timeline/renderers/export/parts/produce-audio.js.map +1 -0
  350. package/x/timeline/renderers/export/parts/produce-video.d.ts +10 -0
  351. package/x/timeline/renderers/export/parts/produce-video.js +26 -0
  352. package/x/timeline/renderers/export/parts/produce-video.js.map +1 -0
  353. package/x/timeline/renderers/export/parts/resamplers.d.ts +12 -0
  354. package/x/timeline/renderers/export/parts/resamplers.js +29 -0
  355. package/x/timeline/renderers/export/parts/resamplers.js.map +1 -0
  356. package/x/timeline/renderers/export/produce.d.ts +13 -0
  357. package/x/timeline/renderers/export/produce.js +15 -0
  358. package/x/timeline/renderers/export/produce.js.map +1 -0
  359. package/x/timeline/renderers/parts/handy.d.ts +38 -0
  360. package/x/timeline/renderers/parts/handy.js +263 -0
  361. package/x/timeline/renderers/parts/handy.js.map +1 -0
  362. package/x/timeline/renderers/parts/samplers/audio/parts/find.d.ts +6 -0
  363. package/x/timeline/renderers/parts/samplers/audio/parts/find.js +15 -0
  364. package/x/timeline/renderers/parts/samplers/audio/parts/find.js.map +1 -0
  365. package/x/timeline/renderers/parts/samplers/audio/parts/init.d.ts +5 -0
  366. package/x/timeline/renderers/parts/samplers/audio/parts/init.js +40 -0
  367. package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -0
  368. package/x/timeline/renderers/parts/samplers/audio/parts/sink.d.ts +8 -0
  369. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js +24 -0
  370. package/x/timeline/renderers/parts/samplers/audio/parts/sink.js.map +1 -0
  371. package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +14 -0
  372. package/x/timeline/renderers/parts/samplers/audio/parts/types.js +2 -0
  373. package/x/timeline/renderers/parts/samplers/audio/parts/types.js.map +1 -0
  374. package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +11 -0
  375. package/x/timeline/renderers/parts/samplers/audio/sampler.js +22 -0
  376. package/x/timeline/renderers/parts/samplers/audio/sampler.js.map +1 -0
  377. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.d.ts +8 -0
  378. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js +14 -0
  379. package/x/timeline/renderers/parts/samplers/visual/parts/defaults.js.map +1 -0
  380. package/x/timeline/renderers/parts/samplers/visual/parts/image-sink.d.ts +11 -0
  381. package/x/timeline/renderers/parts/samplers/visual/parts/image-sink.js +36 -0
  382. package/x/timeline/renderers/parts/samplers/visual/parts/image-sink.js.map +1 -0
  383. package/x/timeline/renderers/parts/samplers/visual/parts/sample.d.ts +9 -0
  384. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +70 -0
  385. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -0
  386. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.d.ts +6 -0
  387. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js +63 -0
  388. package/x/timeline/renderers/parts/samplers/visual/parts/sequence.js.map +1 -0
  389. package/x/timeline/renderers/parts/samplers/visual/parts/transition.d.ts +3 -0
  390. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +18 -0
  391. package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -0
  392. package/x/timeline/renderers/parts/samplers/visual/parts/types.d.ts +9 -0
  393. package/x/timeline/renderers/parts/samplers/visual/parts/types.js +2 -0
  394. package/x/timeline/renderers/parts/samplers/visual/parts/types.js.map +1 -0
  395. package/x/timeline/renderers/parts/samplers/visual/parts/video-sink.d.ts +8 -0
  396. package/x/timeline/renderers/parts/samplers/visual/parts/video-sink.js +24 -0
  397. package/x/timeline/renderers/parts/samplers/visual/parts/video-sink.js.map +1 -0
  398. package/x/timeline/renderers/parts/samplers/visual/sampler.d.ts +7 -0
  399. package/x/timeline/renderers/parts/samplers/visual/sampler.js +20 -0
  400. package/x/timeline/renderers/parts/samplers/visual/sampler.js.map +1 -0
  401. package/x/timeline/renderers/parts/schedulers.d.ts +17 -0
  402. package/x/timeline/renderers/parts/schedulers.js +64 -0
  403. package/x/timeline/renderers/parts/schedulers.js.map +1 -0
  404. package/x/timeline/renderers/player/parts/playback.d.ts +39 -0
  405. package/x/timeline/renderers/player/parts/playback.js +160 -0
  406. package/x/timeline/renderers/player/parts/playback.js.map +1 -0
  407. package/x/timeline/renderers/player/player.d.ts +27 -0
  408. package/x/timeline/renderers/player/player.js +64 -0
  409. package/x/timeline/renderers/player/player.js.map +1 -0
  410. package/x/timeline/renderers/renderers.test.d.ts +33 -0
  411. package/x/timeline/renderers/renderers.test.js +321 -0
  412. package/x/timeline/renderers/renderers.test.js.map +1 -0
  413. package/x/timeline/sugar/helpers.d.ts +72 -0
  414. package/x/timeline/sugar/helpers.js +122 -0
  415. package/x/timeline/sugar/helpers.js.map +1 -0
  416. package/x/timeline/sugar/o.d.ts +59 -8
  417. package/x/timeline/sugar/o.js +326 -40
  418. package/x/timeline/sugar/o.js.map +1 -1
  419. package/x/timeline/sugar/omni.d.ts +11 -2
  420. package/x/timeline/sugar/omni.js +30 -9
  421. package/x/timeline/sugar/omni.js.map +1 -1
  422. package/x/timeline/sugar/omni.test.d.ts +27 -0
  423. package/x/timeline/sugar/omni.test.js +128 -0
  424. package/x/timeline/sugar/omni.test.js.map +1 -0
  425. package/x/timeline/types.d.ts +37 -0
  426. package/x/timeline/types.js +2 -0
  427. package/x/timeline/types.js.map +1 -0
  428. package/x/timeline/utils/anim.d.ts +3 -0
  429. package/x/timeline/utils/anim.js +40 -0
  430. package/x/timeline/utils/anim.js.map +1 -0
  431. package/x/timeline/utils/checksum.d.ts +3 -2
  432. package/x/timeline/utils/checksum.js +2 -1
  433. package/x/timeline/utils/checksum.js.map +1 -1
  434. package/x/timeline/utils/datafile.d.ts +5 -3
  435. package/x/timeline/utils/datafile.js +18 -5
  436. package/x/timeline/utils/datafile.js.map +1 -1
  437. package/x/timeline/utils/dummy-data.d.ts +1 -2
  438. package/x/timeline/utils/dummy-data.js +4 -2
  439. package/x/timeline/utils/dummy-data.js.map +1 -1
  440. package/x/timeline/utils/matrix.d.ts +17 -0
  441. package/x/timeline/utils/matrix.js +36 -0
  442. package/x/timeline/utils/matrix.js.map +1 -0
  443. package/x/timeline/utils/terps.d.ts +11 -0
  444. package/x/timeline/utils/terps.js +57 -0
  445. package/x/timeline/utils/terps.js.map +1 -0
  446. package/x/units/fps.d.ts +6 -0
  447. package/x/units/fps.js +2 -0
  448. package/x/units/fps.js.map +1 -0
  449. package/x/units/ms.d.ts +6 -0
  450. package/x/units/ms.js +2 -0
  451. package/x/units/ms.js.map +1 -0
  452. package/x/units/seconds.d.ts +6 -0
  453. package/x/units/seconds.js +2 -0
  454. package/x/units/seconds.js.map +1 -0
  455. package/x/webworkerAll-RLCTMSDD.js +2 -0
  456. package/x/webworkerAll-RLCTMSDD.js.map +7 -0
  457. package/s/tests.test.ts +0 -8
  458. package/s/timeline/parts/waveform.ts +0 -62
  459. package/s/timeline/sugar/omni-test.ts +0 -38
  460. package/x/tests.test.js +0 -6
  461. package/x/tests.test.js.map +0 -1
  462. package/x/timeline/parts/waveform.d.ts +0 -8
  463. package/x/timeline/parts/waveform.js +0 -51
  464. package/x/timeline/parts/waveform.js.map +0 -1
  465. package/x/timeline/sugar/omni-test.js +0 -22
  466. package/x/timeline/sugar/omni-test.js.map +0 -1
  467. /package/x/{tests.test.d.ts → features/bg-remover/worker.bundle.d.ts} +0 -0
  468. /package/x/{timeline/sugar/omni-test.d.ts → features/speech/transcribe/worker.bundle.d.ts} +0 -0
@@ -1,58 +1,171 @@
1
1
 
2
+ import {TextStyleOptions} from "pixi.js"
3
+
2
4
  import {Id, Hash} from "./basics.js"
5
+ import {Ms} from "../../units/ms.js"
6
+ import type {TransitionName} from "./transitions.js"
7
+ import {Transform, VisualAnimations} from "../types.js"
8
+ import type {FilterParams, FilterType} from "./filters.js"
9
+ import type {Transcription} from "../../features/speech/transcribe/types.js"
10
+
11
+ export type Crop = [top: number, right: number, bottom: number, left: number]
3
12
 
4
13
  export enum Kind {
5
14
  Sequence,
6
15
  Stack,
7
- Clip,
16
+ Video,
17
+ Audio,
8
18
  Text,
19
+ Gap,
20
+ Spatial,
21
+ Animation,
9
22
  Transition,
10
- }
11
-
12
- export enum Effect {
13
- Crossfade,
23
+ TextStyle,
24
+ Filter,
25
+ Caption,
26
+ Image
14
27
  }
15
28
 
16
29
  export namespace Item {
30
+ export type TextStyle = {
31
+ id: Id
32
+ kind: Kind.TextStyle
33
+ style: TextStyleOptions
34
+ }
35
+
36
+ export type Spatial = {
37
+ id: Id
38
+ kind: Kind.Spatial
39
+ transform: Transform
40
+ crop?: Crop
41
+ enabled: boolean
42
+ }
43
+
44
+ export type Animation = {
45
+ id: Id
46
+ kind: Kind.Animation
47
+ anims: VisualAnimations
48
+ enabled: boolean
49
+ }
50
+
51
+ export type Filter<T extends FilterType = FilterType> = {
52
+ id: Id
53
+ kind: Kind.Filter
54
+ type: T
55
+ params?: FilterParams<T>
56
+ enabled: boolean
57
+ }
58
+
59
+ export type Gap = {
60
+ id: Id
61
+ kind: Kind.Gap
62
+ duration: number
63
+ }
64
+
17
65
  export type Sequence = {
18
66
  id: Id
19
67
  kind: Kind.Sequence
20
- children: Id[]
68
+ childrenIds: Id[]
69
+ spatialId?: Id
70
+ filterIds?: Id[]
21
71
  }
22
72
 
23
73
  export type Stack = {
24
74
  id: Id
25
75
  kind: Kind.Stack
26
- children: Id[]
76
+ childrenIds: Id[]
77
+ spatialId?: Id
78
+ filterIds?: Id[]
27
79
  }
28
80
 
29
- export type Clip = {
81
+ export type Video = {
30
82
  id: Id
31
- kind: Kind.Clip
83
+ kind: Kind.Video
32
84
  mediaHash: Hash
33
85
  start: number
34
86
  duration: number
87
+ spatialId?: Id
88
+ animationIds?: Id[]
89
+ filterIds?: Id[]
90
+ }
91
+
92
+ export type Image = {
93
+ id: Id
94
+ kind: Kind.Image
95
+ mediaHash: Hash
96
+ duration: number
97
+ spatialId?: Id
98
+ animationIds?: Id[]
99
+ filterIds?: Id[]
100
+ }
101
+
102
+ export type Audio = {
103
+ id: Id
104
+ kind: Kind.Audio
105
+ mediaHash: Hash
106
+ start: number
107
+ duration: number
108
+ gain?: number
35
109
  }
36
110
 
37
111
  export type Text = {
38
112
  id: Id
39
113
  kind: Kind.Text
40
114
  content: string
115
+ duration: number
116
+ spatialId?: Id
117
+ animationIds?: Id[]
118
+ styleId?: Id
119
+ filterIds?: Id[]
120
+ }
121
+
122
+
123
+ export type Caption = {
124
+ id: Id
125
+ kind: Kind.Caption
126
+ transcript: Transcription
127
+ itemId?: Id
128
+ start: number
129
+ duration: number
130
+ maxChars?: number
131
+ maxDuration?: number
132
+ maxSilence?: number
133
+ spatialId?: Id
134
+ animationIds?: Id[]
135
+ styleId?: Id
136
+ filterIds?: Id[]
41
137
  }
42
138
 
43
139
  export type Transition = {
44
140
  id: Id
45
141
  kind: Kind.Transition
46
- effect: Effect.Crossfade
142
+ name: TransitionName
47
143
  duration: number
48
144
  }
49
145
 
50
146
  export type Any = (
51
147
  | Sequence
52
148
  | Stack
53
- | Clip
149
+ | Video
150
+ | Image
151
+ | Audio
54
152
  | Text
153
+ | Caption
154
+ | Gap
55
155
  | Transition
156
+ | Spatial
157
+ | Animation
158
+ | TextStyle
159
+ | Filter
56
160
  )
57
161
  }
58
162
 
163
+ export type ContainerItem = Item.Sequence | Item.Stack
164
+ export type NonContainerItem = Exclude<Item.Any, ContainerItem>
165
+ export type FilterableItem = Item.Sequence | Item.Stack | Item.Video | Item.Image | Item.Text | Item.Caption
166
+ export type VisualAnimatableItem = Item.Video | Item.Image | Item.Text | Item.Caption
167
+
168
+ export type PlayableItem = Item.Any & {
169
+ start: Ms
170
+ duration: Ms
171
+ }
@@ -1,14 +1,56 @@
1
1
 
2
+ import {ALL_FORMATS, Input} from "mediabunny"
3
+
2
4
  import {Datafile} from "../utils/datafile.js"
5
+ import {DecoderSource} from "../../driver/fns/schematic.js"
6
+ import {loadDecoderSource} from "../../driver/utils/load-decoder-source.js"
3
7
 
4
8
  export class Media {
5
9
  duration = 0
10
+ isImage = false
11
+ hasVideo = false
12
+ hasAudio = false
13
+
6
14
  constructor(public datafile: Datafile) {}
7
15
 
8
16
  static async analyze(datafile: Datafile) {
9
17
  const media = new this(datafile)
10
- media.duration = 10
18
+
19
+ if (this.#isImage(datafile)) {
20
+ media.isImage = true
21
+ return media
22
+ }
23
+
24
+ const duration = (await this.duration(datafile.url)) * 1000
25
+ media.duration = duration
26
+ const {video, audio} = await this.#has(datafile.url)
27
+ media.hasAudio = audio
28
+ media.hasVideo = video
11
29
  return media
12
30
  }
31
+
32
+ static #isImage(datafile: Datafile) {
33
+ return datafile.blob.type.startsWith("image/")
34
+ }
35
+
36
+ static async duration(source: DecoderSource) {
37
+ const input = new Input({
38
+ formats: ALL_FORMATS,
39
+ source: await loadDecoderSource(source)
40
+ })
41
+ const duration = await input.computeDuration()
42
+ return Number(duration.toFixed(5)) // fix weird floating points
43
+ }
44
+
45
+ static async #has(source: DecoderSource) {
46
+ const input = new Input({
47
+ formats: ALL_FORMATS,
48
+ source: await loadDecoderSource(source)
49
+ })
50
+ return {
51
+ audio: !!(await input.getPrimaryAudioTrack()),
52
+ video: !!(await input.getPrimaryVideoTrack())
53
+ }
54
+ }
13
55
  }
14
56
 
@@ -1,27 +1,30 @@
1
1
 
2
- import {MapG} from "@e280/stz"
2
+ import {GMap} from "@e280/stz"
3
3
  import {Hash} from "./basics.js"
4
4
  import {Media} from "./media.js"
5
5
  import {Resource} from "./resource.js"
6
6
  import {Datafile} from "../utils/datafile.js"
7
7
 
8
8
  export class ResourcePool {
9
- #map = new MapG<Hash, Resource.Any>
9
+ #map = new GMap<Hash, Resource.Any>
10
10
 
11
11
  /** store a media file (avoids duplicates via hash) */
12
12
  async store(datafile: Datafile) {
13
13
  const media = await Media.analyze(datafile)
14
14
  const {hash} = media.datafile.checksum
15
- const {filename, bytes} = media.datafile
15
+ const {filename, bytes, url, blob} = media.datafile
16
16
 
17
17
  if (this.#map.has(hash)) {
18
18
  const alreadyExists = this.#map.require(hash)
19
19
  alreadyExists.filename = filename
20
20
  }
21
21
  else
22
- this.#map.set(hash, {kind: "media", filename, bytes})
22
+ this.#map.set(hash, {kind: "media", filename, bytes, url, blob, duration: media.duration})
23
23
 
24
24
  return media
25
25
  }
26
- }
27
26
 
27
+ require(hash: Hash) {
28
+ return this.#map.require(hash)
29
+ }
30
+ }
@@ -4,6 +4,9 @@ export namespace Resource {
4
4
  kind: "media"
5
5
  filename: string
6
6
  bytes: Uint8Array
7
+ blob: Blob
8
+ url: string
9
+ duration: number
7
10
  }
8
11
 
9
12
  export type Any = Media
@@ -0,0 +1,102 @@
1
+ import type {Item} from "./item.js"
2
+
3
+ export const transitionNames = [
4
+ "Bounce",
5
+ "BowTieHorizontal",
6
+ "BowTieVertical",
7
+ "ButterflyWaveScrawler",
8
+ "CircleCrop",
9
+ "ColourDistance",
10
+ "CrazyParametricFun",
11
+ "CrossZoom",
12
+ "Directional",
13
+ "DoomScreenTransition",
14
+ "Dreamy",
15
+ "DreamyZoom",
16
+ "GlitchDisplace",
17
+ "GlitchMemories",
18
+ "GridFlip",
19
+ "InvertedPageCurl",
20
+ "LinearBlur",
21
+ "Mosaic",
22
+ "PolkaDotsCurtain",
23
+ "Radial",
24
+ "SimpleZoom",
25
+ "StereoViewer",
26
+ "Swirl",
27
+ "WaterDrop",
28
+ "ZoomInCircles",
29
+ "angular",
30
+ "burn",
31
+ "cannabisleaf",
32
+ "circle",
33
+ "circleopen",
34
+ "colorphase",
35
+ "crosshatch",
36
+ "crosswarp",
37
+ "cube",
38
+ "directionalwarp",
39
+ "directionalwipe",
40
+ "displacement",
41
+ "doorway",
42
+ "fade",
43
+ "fadecolor",
44
+ "fadegrayscale",
45
+ "flyeye",
46
+ "heart",
47
+ "hexagonalize",
48
+ "kaleidoscope",
49
+ "luma",
50
+ "luminance_melt",
51
+ "morph",
52
+ "multiply_blend",
53
+ "perlin",
54
+ "pinwheel",
55
+ "pixelize",
56
+ "polar_function",
57
+ "randomsquares",
58
+ "ripple",
59
+ "rotate_scale_fade",
60
+ "squareswire",
61
+ "squeeze",
62
+ "swap",
63
+ "undulatingBurnOut",
64
+ "wind",
65
+ "windowblinds",
66
+ "windowslice",
67
+ "wipeDown",
68
+ "wipeLeft",
69
+ "wipeRight",
70
+ "wipeUp",
71
+ ] as const
72
+
73
+ export type TransitionName = typeof transitionNames[number]
74
+
75
+ export type Transition = {
76
+ name: TransitionName
77
+ label: string
78
+ }
79
+
80
+ export interface TransitionAction {
81
+ (duration: number): Item.Transition
82
+ }
83
+
84
+ export type TransitionActions = {
85
+ [TName in TransitionName]: TransitionAction
86
+ }
87
+
88
+ export const transitionRegistry = Object.fromEntries(
89
+ transitionNames.map(name => [name, {
90
+ name,
91
+ label: labelizeTransitionName(name),
92
+ }])
93
+ ) as Record<TransitionName, Transition>
94
+
95
+ export const transitions = transitionRegistry
96
+
97
+ function labelizeTransitionName(name: string) {
98
+ return name
99
+ .replace(/_/g, " ")
100
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
101
+ .replace(/\b\w/g, letter => letter.toUpperCase())
102
+ }
@@ -0,0 +1,72 @@
1
+
2
+ import {Driver} from "../../../../driver/driver.js"
3
+ import {DecoderSource} from "../../../../driver/fns/schematic.js"
4
+
5
+ export const PEAK_LEVELS = [2048, 1024, 512, 256, 128, 64, 32] as const
6
+
7
+ export async function collectPeakLevels(driver: Driver, source: DecoderSource) {
8
+ const duration = (await driver.getAudioDuration(source)) ?? 0
9
+ const readable = driver.decodeAudio({source}).readable
10
+ const finestSamplesPerPeak = PEAK_LEVELS[PEAK_LEVELS.length - 1]
11
+ const finestPeaks: number[] = []
12
+
13
+ let currentMax = 0
14
+ let sampleCount = 0
15
+ let sampleRate = 0
16
+
17
+ for await (const audioData of readable) {
18
+ sampleRate ||= audioData.sampleRate
19
+
20
+ const frames = audioData.numberOfFrames
21
+ const plane = new Float32Array(frames)
22
+ audioData.copyTo(plane, {planeIndex: 0})
23
+
24
+ for (let i = 0; i < plane.length; i++) {
25
+ const amplitude = Math.abs(plane[i]!)
26
+ if (amplitude > currentMax) currentMax = amplitude
27
+
28
+ sampleCount++
29
+ if (sampleCount >= finestSamplesPerPeak) {
30
+ finestPeaks.push(currentMax)
31
+ currentMax = 0
32
+ sampleCount = 0
33
+ }
34
+ }
35
+
36
+ audioData.close()
37
+ }
38
+
39
+ if (sampleCount > 0) finestPeaks.push(currentMax)
40
+
41
+ const base = new Float32Array(finestPeaks)
42
+ const levels = PEAK_LEVELS.map(samplesPerPeak => {
43
+ const factor = Math.max(1, Math.round(samplesPerPeak / finestSamplesPerPeak))
44
+ const peaks = factor === 1 ? base : downsampleMax(base, factor)
45
+ return {
46
+ samplesPerPeak,
47
+ peaks,
48
+ peaksPerSecond: sampleRate > 0 ? sampleRate / samplesPerPeak : 0,
49
+ }
50
+ })
51
+
52
+ return {duration, levels}
53
+ }
54
+
55
+ function downsampleMax(peaks: Float32Array, factor: number) {
56
+ const downsampled = new Float32Array(Math.ceil(peaks.length / factor))
57
+
58
+ for (let i = 0; i < downsampled.length; i++) {
59
+ let maxPeak = 0
60
+ const start = i * factor
61
+ const end = Math.min(start + factor, peaks.length)
62
+
63
+ for (let j = start; j < end; j++) {
64
+ if (peaks[j]! > maxPeak) maxPeak = peaks[j]!
65
+ }
66
+
67
+ downsampled[i] = maxPeak
68
+ }
69
+
70
+ return downsampled
71
+ }
72
+
@@ -0,0 +1,45 @@
1
+
2
+ export function renderTile(
3
+ peaks: Float32Array,
4
+ opts: {
5
+ width: number
6
+ height: number
7
+ color: string
8
+ }
9
+ ) {
10
+ const dpr = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1
11
+ const canvas = document.createElement("canvas")
12
+ canvas.width = opts.width * dpr
13
+ canvas.height = opts.height * dpr
14
+ canvas.style.width = `${opts.width}px`
15
+ canvas.style.height = `${opts.height}px`
16
+
17
+ const ctx = canvas.getContext("2d")
18
+ if (!ctx) return canvas
19
+
20
+ ctx.scale(dpr, dpr)
21
+ ctx.fillStyle = opts.color
22
+
23
+ const centerY = opts.height / 2
24
+ const columns = Math.max(1, opts.width)
25
+ const peaksPerPixel = peaks.length / columns
26
+
27
+ for (let px = 0; px < columns; px++) {
28
+ const startIndex = Math.floor(px * peaksPerPixel)
29
+ const endIndex = Math.max(
30
+ startIndex + 1,
31
+ Math.floor((px + 1) * peaksPerPixel)
32
+ )
33
+
34
+ let maxPeak = 0
35
+ for (let i = startIndex; i < endIndex && i < peaks.length; i++) {
36
+ if (peaks[i]! > maxPeak) maxPeak = peaks[i]!
37
+ }
38
+
39
+ const barHeight = maxPeak * opts.height
40
+ ctx.fillRect(px, centerY - barHeight / 2, 1, barHeight)
41
+ }
42
+
43
+ return canvas
44
+ }
45
+
@@ -0,0 +1,24 @@
1
+ export interface WaveformTileData {
2
+ startTime: number
3
+ endTime: number
4
+ peaks: Float32Array
5
+ canvas: HTMLCanvasElement
6
+ }
7
+
8
+ export interface WaveformOptions {
9
+ tileSize?: number
10
+ zoom?: number
11
+ tileWidth?: number
12
+ tileHeight?: number
13
+ preloadMargin?: number
14
+ color?: string
15
+ onChange?: (tiles: WaveformTileData[]) => void
16
+ }
17
+
18
+ export type WaveformTimeRange = [start: number, end: number]
19
+
20
+ export type WaveformPeakLevel = {
21
+ samplesPerPeak: number
22
+ peaks: Float32Array
23
+ peaksPerSecond: number
24
+ }
@@ -0,0 +1,161 @@
1
+
2
+ import {renderTile} from "./parts/render.js"
3
+ import {Driver} from "../../../driver/driver.js"
4
+ import {collectPeakLevels} from "./parts/collect.js"
5
+ import {DecoderSource} from "../../../driver/fns/schematic.js"
6
+ import {WaveformOptions, WaveformPeakLevel, WaveformTileData, WaveformTimeRange} from "./parts/types.js"
7
+
8
+ const MAX_TILE_WIDTH = 4096
9
+
10
+ export class Waveform {
11
+ #tiles = new Map<number, WaveformTileData>()
12
+ #activeRange: WaveformTimeRange = [0, 0]
13
+ #visibleRange: WaveformTimeRange = [0, 0]
14
+
15
+ #zoom
16
+ #levels
17
+ #onChange
18
+ #updateQueued = false
19
+
20
+ readonly color
21
+ readonly duration
22
+ readonly tileSize
23
+ readonly tileHeight
24
+ readonly preloadMargin
25
+
26
+ private constructor(levels: WaveformPeakLevel[], duration: number, options: WaveformOptions) {
27
+ this.#levels = levels
28
+ this.duration = duration
29
+ this.tileSize = options.tileSize ?? 1
30
+ this.#zoom = options.zoom ?? ((options.tileWidth ?? 256) / this.tileSize)
31
+ this.tileHeight = options.tileHeight ?? 96
32
+ this.preloadMargin = options.preloadMargin ?? 2
33
+ this.color = options.color ?? "rgb(3, 148, 129)"
34
+ this.#onChange = options.onChange
35
+ }
36
+
37
+ static async init(driver: Driver, source: DecoderSource, options: WaveformOptions = {}) {
38
+ const {duration, levels} = await collectPeakLevels(driver, source)
39
+ return new Waveform(levels, duration, options)
40
+ }
41
+
42
+ /** Waveform render density in pixels per second. */
43
+ set zoom(pixelsPerSecond: number) {
44
+ const next = Math.max(1, pixelsPerSecond)
45
+ if (next === this.#zoom)
46
+ return
47
+
48
+ this.#zoom = next
49
+ this.#tiles.clear()
50
+ this.#queueUpdate()
51
+ }
52
+
53
+ get zoom() {
54
+ return this.#zoom
55
+ }
56
+
57
+ get range() {
58
+ return this.#visibleRange
59
+ }
60
+
61
+ #computeActiveRange([start, end]: WaveformTimeRange, margin = 1): WaveformTimeRange {
62
+ const visibleSize = end - start
63
+ return [
64
+ Math.max(0, start - visibleSize * margin),
65
+ Math.min(this.duration, end + visibleSize * margin),
66
+ ]
67
+ }
68
+
69
+ set range(visibleRange: WaveformTimeRange) {
70
+ this.#visibleRange = visibleRange
71
+
72
+ const [visibleStart, visibleEnd] = visibleRange
73
+ const visibleSize = visibleEnd - visibleStart
74
+ const [activeStart, activeEnd] = this.#activeRange
75
+
76
+ const leftBuffered = activeStart > 0
77
+ const rightBuffered = activeEnd < this.duration
78
+ const leftSettled = !leftBuffered || visibleStart >= activeStart + visibleSize
79
+ const rightSettled = !rightBuffered || visibleEnd <= activeEnd - visibleSize
80
+
81
+ if (leftSettled && rightSettled) return
82
+
83
+ this.#activeRange = this.#computeActiveRange(visibleRange, this.preloadMargin)
84
+ this.#queueUpdate()
85
+ }
86
+
87
+ #queueUpdate() {
88
+ if (this.#updateQueued) return
89
+ this.#updateQueued = true
90
+
91
+ queueMicrotask(() => {
92
+ this.#updateQueued = false
93
+ this.#generateTiles()
94
+ })
95
+ }
96
+
97
+ #generateTiles() {
98
+ const [rangeStart, rangeEnd] = this.#activeRange
99
+ const neededStarts = new Set<number>()
100
+ const level = this.#levelForZoom()
101
+
102
+ const firstStart = Math.max(0, Math.floor(rangeStart / this.tileSize) * this.tileSize)
103
+ const lastStart = Math.min(this.duration, rangeEnd)
104
+
105
+ for (let startTime = firstStart; startTime <= lastStart; startTime += this.tileSize) {
106
+ neededStarts.add(startTime)
107
+ }
108
+
109
+ for (const startTime of neededStarts) {
110
+ if (!this.#tiles.has(startTime)) {
111
+ const endTime = Math.min(startTime + this.tileSize, this.duration)
112
+ this.#tiles.set(startTime, this.#buildTileData(startTime, endTime, level))
113
+ }
114
+ }
115
+
116
+ for (const startTime of this.#tiles.keys()) {
117
+ if (!neededStarts.has(startTime)) this.#tiles.delete(startTime)
118
+ }
119
+
120
+ this.#emit()
121
+ }
122
+
123
+ #buildTileData(startTime: number, endTime: number, level: WaveformPeakLevel): WaveformTileData {
124
+ const peaks = this.#slicePeaks(level, startTime, endTime)
125
+ return {
126
+ startTime,
127
+ endTime,
128
+ peaks,
129
+ canvas: renderTile(peaks, {
130
+ width: this.#tilePixelWidth(startTime, endTime),
131
+ height: this.tileHeight,
132
+ color: this.color,
133
+ }),
134
+ }
135
+ }
136
+
137
+ #levelForZoom() {
138
+ return this.#levels.find(level => level.peaksPerSecond >= this.#zoom)
139
+ ?? this.#levels[this.#levels.length - 1]!
140
+ }
141
+
142
+ #slicePeaks(level: WaveformPeakLevel, startTime: number, endTime: number) {
143
+ if (!level.peaksPerSecond) return new Float32Array()
144
+ const from = Math.max(0, Math.floor(startTime * level.peaksPerSecond))
145
+ const to = Math.max(from + 1, Math.min(level.peaks.length, Math.ceil(endTime * level.peaksPerSecond)))
146
+ return level.peaks.slice(from, to)
147
+ }
148
+
149
+ #tilePixelWidth(startTime: number, endTime: number) {
150
+ return Math.min(MAX_TILE_WIDTH, Math.max(1, Math.ceil((endTime - startTime) * this.#zoom)))
151
+ }
152
+
153
+ #emit() {
154
+ if (!this.#onChange) return
155
+ this.#onChange([...this.#tiles.values()].sort((a, b) => a.startTime - b.startTime))
156
+ }
157
+
158
+ getTiles() {
159
+ return this.#tiles
160
+ }
161
+ }
@@ -0,0 +1,17 @@
1
+ // this is mutating fn
2
+ export const applyGainToPlanar = (
3
+ planes: Float32Array[],
4
+ gain: number
5
+ ) => {
6
+ if (gain === 1)
7
+ return
8
+ // planes
9
+
10
+ for (const plane of planes) {
11
+ for (let i = 0; i < plane.length; i++) {
12
+ plane[i] *= gain
13
+ }
14
+ }
15
+
16
+ // return planes
17
+ }