framefields 2.10.0-canary.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +0 -4
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-YpBRdI7r.mjs → audio-BuCVk1IQ.mjs} +31 -5
- package/dist/audio-BuCVk1IQ.mjs.map +1 -0
- package/dist/audio-CYZkDwae.d.mts +62 -0
- package/dist/audio-CYZkDwae.d.mts.map +1 -0
- package/dist/cli/check-worker.mjs +45 -45
- package/dist/cloud/index.d.mts.map +1 -1
- package/dist/components/index.d.mts +10 -10
- package/dist/components/index.mjs +44 -44
- package/dist/{dist-BwtxciN4.mjs → dist-CNGv-JTX.mjs} +1 -1
- package/dist/{dist-C4Vxgm0Q.mjs → dist-CWLLnigL.mjs} +447 -284
- package/dist/dist-CWLLnigL.mjs.map +1 -0
- package/dist/dist-CySGkG54.mjs.map +1 -1
- package/dist/{dist-2_lT3Dwc.mjs → dist-Dg9LMWoX.mjs} +2 -2
- package/dist/{dist-2_lT3Dwc.mjs.map → dist-Dg9LMWoX.mjs.map} +1 -1
- package/dist/{dist-Cu1fZ9Uy.mjs → dist-EQX3TUUl.mjs} +3 -3
- package/dist/{dist-Cu1fZ9Uy.mjs.map → dist-EQX3TUUl.mjs.map} +1 -1
- package/dist/effects/index.d.mts +5 -5
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-DiWYouOK.mjs → effects-DKLbLXF7.mjs} +2 -2
- package/dist/{effects-DiWYouOK.mjs.map → effects-DKLbLXF7.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-BnV-GB1o.mjs → fonts-gPbGbShD.mjs} +2 -2
- package/dist/{fonts-BnV-GB1o.mjs.map → fonts-gPbGbShD.mjs.map} +1 -1
- package/dist/{gpu-Bw35AMwY.mjs → gpu-CpkJJLQP.mjs} +3 -11
- package/dist/gpu-CpkJJLQP.mjs.map +1 -0
- package/dist/{index-h7m8QgcL.d.mts → index-Bly-7YM1.d.mts} +2 -2
- package/dist/{index-h7m8QgcL.d.mts.map → index-Bly-7YM1.d.mts.map} +1 -1
- package/dist/{index-B7WqFBZA.d.mts → index-BuiZzc6i.d.mts} +22 -33
- package/dist/index-BuiZzc6i.d.mts.map +1 -0
- package/dist/{index-DQa7mhzq.d.mts → index-C8YwZ6k1.d.mts} +2 -2
- package/dist/{index-DQa7mhzq.d.mts.map → index-C8YwZ6k1.d.mts.map} +1 -1
- package/dist/{index-WwuuX8ZJ.d.mts → index-CEU_Zsb9.d.mts} +22 -24
- package/dist/index-CEU_Zsb9.d.mts.map +1 -0
- package/dist/index-COYNQ_mf.d.mts.map +1 -1
- package/dist/{index-Dyt4yS-x.d.mts → index-Cro-818i.d.mts} +10 -84
- package/dist/index-Cro-818i.d.mts.map +1 -0
- package/dist/{index-CDQrdZ0J.d.mts → index-D2i9J9Zq.d.mts} +2 -2
- package/dist/{index-CDQrdZ0J.d.mts.map → index-D2i9J9Zq.d.mts.map} +1 -1
- package/dist/{index-Bbv0VtxJ.d.mts → index-jSDEM-uE.d.mts} +5 -5
- package/dist/{index-Bbv0VtxJ.d.mts.map → index-jSDEM-uE.d.mts.map} +1 -1
- package/dist/index.d.mts +11 -11
- package/dist/index.mjs +52 -52
- package/dist/preview/index.d.mts +1 -1
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-BW7ilNWk.mjs → preview-BToKUTtZ.mjs} +2 -2
- package/dist/{preview-BW7ilNWk.mjs.map → preview-BToKUTtZ.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-LBP7E7SJ.mjs → chunk-26XWIHW3.mjs} +1 -1
- package/dist/preview-engine/{chunk-ZA5LWHRM.mjs → chunk-4AGQN53P.mjs} +1 -1
- package/dist/preview-engine/chunk-4FY4TNST.mjs +1 -0
- package/dist/preview-engine/{chunk-6O55UROD.mjs → chunk-54Q5CKSV.mjs} +2 -2
- package/dist/preview-engine/{chunk-6BE3IL7L.mjs → chunk-5KSBS3AL.mjs} +1 -1
- package/dist/preview-engine/{chunk-RAW2I27S.mjs → chunk-65NANVQL.mjs} +1 -1
- package/dist/preview-engine/{chunk-HKYENGC5.mjs → chunk-6LTINEA4.mjs} +1 -1
- package/dist/preview-engine/{chunk-6SLCECHG.mjs → chunk-7GMHSTRP.mjs} +1 -1
- package/dist/preview-engine/chunk-7LDSMOO3.mjs +1 -0
- package/dist/preview-engine/{chunk-4DSOZ5QG.mjs → chunk-ACBBBOUM.mjs} +1 -1
- package/dist/preview-engine/chunk-AGAZJZWI.mjs +1 -0
- package/dist/preview-engine/{chunk-64L4GUOF.mjs → chunk-BJXNKMSY.mjs} +6 -20
- package/dist/preview-engine/{chunk-HO7FXISJ.mjs → chunk-BRV7TQDV.mjs} +1 -1
- package/dist/preview-engine/chunk-BXPM5SJ3.mjs +1 -0
- package/dist/preview-engine/{chunk-5SLBE2FX.mjs → chunk-C4M3B2Q2.mjs} +1 -1
- package/dist/preview-engine/{chunk-Y2SWIWIU.mjs → chunk-CCORQLMR.mjs} +1 -1
- package/dist/preview-engine/{chunk-4BWBX2HM.mjs → chunk-CIVEZJYF.mjs} +1 -1
- package/dist/preview-engine/chunk-CIVJXFWH.mjs +4 -0
- package/dist/preview-engine/{chunk-JIPMF42Z.mjs → chunk-D6LM7DTJ.mjs} +2 -2
- package/dist/preview-engine/chunk-D73ZKPFN.mjs +138 -0
- package/dist/preview-engine/{chunk-6LBFSGCI.mjs → chunk-DNNGWS2C.mjs} +1 -1
- package/dist/preview-engine/{chunk-IVAA5X5H.mjs → chunk-EAWJXW4J.mjs} +1 -1
- package/dist/preview-engine/{chunk-HGWT3RVQ.mjs → chunk-EPRINA4V.mjs} +10 -10
- package/dist/preview-engine/{chunk-ML7WO27M.mjs → chunk-EXEO245X.mjs} +1 -1
- package/dist/preview-engine/{chunk-VRJBOFFY.mjs → chunk-FQL4IJZN.mjs} +1 -1
- package/dist/preview-engine/{chunk-7A3BNAWY.mjs → chunk-GHTG5XV6.mjs} +25 -84
- package/dist/preview-engine/{chunk-NCQHOGZK.mjs → chunk-GN3NDRLI.mjs} +1 -1
- package/dist/preview-engine/{chunk-VVY4PG5E.mjs → chunk-GXFYRMJZ.mjs} +25 -25
- package/dist/preview-engine/{chunk-OOUDE4XL.mjs → chunk-IBPYV6HF.mjs} +1 -1
- package/dist/preview-engine/{chunk-5Y7SO37Q.mjs → chunk-IKVJ4MW5.mjs} +1 -1
- package/dist/preview-engine/{chunk-L2NTIWW5.mjs → chunk-JDB7PMRI.mjs} +1 -1
- package/dist/preview-engine/{chunk-D7OMXGIZ.mjs → chunk-JSYG6OWZ.mjs} +1 -1
- package/dist/preview-engine/chunk-KOVN277Z.mjs +1 -0
- package/dist/preview-engine/{chunk-57WXGYEV.mjs → chunk-KVOFO273.mjs} +1 -1
- package/dist/preview-engine/{chunk-EKEKYGXE.mjs → chunk-LFNCWMKS.mjs} +1 -1
- package/dist/preview-engine/{chunk-4RLKHFV6.mjs → chunk-LMXMBX4J.mjs} +1 -1
- package/dist/preview-engine/chunk-M4QANUJI.mjs +480 -0
- package/dist/preview-engine/{chunk-4FACCLLE.mjs → chunk-NOKPBMIP.mjs} +1 -1
- package/dist/preview-engine/{chunk-FW2UDDUT.mjs → chunk-O63FLYWC.mjs} +1 -1
- package/dist/preview-engine/chunk-OELPPLML.mjs +107 -0
- package/dist/preview-engine/{chunk-JSKEVYKD.mjs → chunk-OLB4TQLQ.mjs} +1 -1
- package/dist/preview-engine/{chunk-7HW7GA76.mjs → chunk-PKNUTHPI.mjs} +1 -1
- package/dist/preview-engine/{chunk-OD4CSXZL.mjs → chunk-QF4JWVO3.mjs} +15 -15
- package/dist/preview-engine/{chunk-K3TJJXVC.mjs → chunk-RDWLLITE.mjs} +1 -1
- package/dist/preview-engine/{chunk-K3C6GUQD.mjs → chunk-SE2C623Z.mjs} +1 -1
- package/dist/preview-engine/{chunk-LTR5FXGU.mjs → chunk-TEWRQKX3.mjs} +1 -1
- package/dist/preview-engine/{chunk-YS3ROS25.mjs → chunk-UGB6JKVS.mjs} +1 -1
- package/dist/preview-engine/{chunk-RMHL4XZ3.mjs → chunk-UI3VH33L.mjs} +1 -1
- package/dist/preview-engine/{chunk-JFBSNFN6.mjs → chunk-UMJ3VGKN.mjs} +1 -1
- package/dist/preview-engine/{chunk-YXCTOCQ2.mjs → chunk-VFQH5KVS.mjs} +1 -1
- package/dist/preview-engine/{chunk-HPQDCC4S.mjs → chunk-VQA4DYZU.mjs} +1 -1
- package/dist/preview-engine/{chunk-C2GX5L5S.mjs → chunk-VZLIRYAL.mjs} +1 -1
- package/dist/preview-engine/{chunk-CHXR5XZK.mjs → chunk-WFMUDL55.mjs} +1 -1
- package/dist/preview-engine/chunk-XF6DYP6B.mjs +1974 -0
- package/dist/preview-engine/chunk-XYGDTPO7.mjs +39 -0
- package/dist/preview-engine/chunk-YGKO4NIU.mjs +1 -0
- package/dist/preview-engine/{chunk-XCQ7KN4S.mjs → chunk-YHMBGJP6.mjs} +1 -1
- package/dist/preview-engine/{chunk-4N25ZU43.mjs → chunk-YKM7JDQY.mjs} +1 -1
- package/dist/preview-engine/{chunk-WVIDORLK.mjs → chunk-YVZTRH4Y.mjs} +1 -1
- package/dist/preview-engine/{chunk-FH72KTSM.mjs → chunk-Z24UEN4P.mjs} +1 -1
- package/dist/preview-engine/{chunk-V5HU6NIW.mjs → chunk-ZF2MEFKO.mjs} +1 -1
- package/dist/preview-engine/{chunk-NTTEGJD6.mjs → chunk-ZIXPWP2B.mjs} +1 -1
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/renderers-2NGIILMI.mjs +1 -0
- package/dist/preview-engine/{renderers-4MW4NW6O.mjs → renderers-33FCFHDR.mjs} +1 -1
- package/dist/preview-engine/renderers-466Z77BH.mjs +1 -0
- package/dist/preview-engine/{renderers-Q5YCUPYE.mjs → renderers-4IBFDW2S.mjs} +1 -1
- package/dist/preview-engine/renderers-4KRENGZA.mjs +1 -0
- package/dist/preview-engine/renderers-4W52BQEU.mjs +1 -0
- package/dist/preview-engine/{renderers-36P2TKPC.mjs → renderers-53EI26GL.mjs} +1 -1
- package/dist/preview-engine/renderers-55PRAS7G.mjs +1 -0
- package/dist/preview-engine/renderers-5LLYINHW.mjs +1 -0
- package/dist/preview-engine/{renderers-U4S577ON.mjs → renderers-5XLGCEOA.mjs} +1 -1
- package/dist/preview-engine/renderers-63N3Y2XO.mjs +1 -0
- package/dist/preview-engine/{renderers-PGZDFDSC.mjs → renderers-6LNDAO4B.mjs} +1 -1
- package/dist/preview-engine/renderers-6ROVFDIN.mjs +1 -0
- package/dist/preview-engine/{renderers-JZYHX4XI.mjs → renderers-6YVZUQOH.mjs} +1 -1
- package/dist/preview-engine/{renderers-HXNSDJBY.mjs → renderers-77PDUMYI.mjs} +1 -1
- package/dist/preview-engine/renderers-7CAHX35U.mjs +1 -0
- package/dist/preview-engine/renderers-A4RVLPMG.mjs +1 -0
- package/dist/preview-engine/renderers-A53P4J6O.mjs +1 -0
- package/dist/preview-engine/{renderers-LF6U4MR5.mjs → renderers-ACUJMDEK.mjs} +1 -1
- package/dist/preview-engine/renderers-AFJ3373L.mjs +1 -0
- package/dist/preview-engine/renderers-ATFWTA3U.mjs +1 -0
- package/dist/preview-engine/{renderers-37Y5LR2S.mjs → renderers-BOBVXYAA.mjs} +1 -1
- package/dist/preview-engine/renderers-BPYJXHBU.mjs +1 -0
- package/dist/preview-engine/{renderers-G2FL3IFD.mjs → renderers-C7SI3NIE.mjs} +1 -1
- package/dist/preview-engine/{renderers-CMBI4JOC.mjs → renderers-CCRZNGVK.mjs} +1 -1
- package/dist/preview-engine/{renderers-6RRWA33X.mjs → renderers-CYJAVWHT.mjs} +1 -1
- package/dist/preview-engine/renderers-D3ZF7FXT.mjs +1 -0
- package/dist/preview-engine/renderers-D7YN6B4B.mjs +1 -0
- package/dist/preview-engine/renderers-DBLASKF5.mjs +1 -0
- package/dist/preview-engine/renderers-DC5ZYYHM.mjs +1 -0
- package/dist/preview-engine/{renderers-OPRXVIGT.mjs → renderers-EN7LXJLG.mjs} +1 -1
- package/dist/preview-engine/{renderers-ZQVKE5AO.mjs → renderers-FY2HOQCS.mjs} +1 -1
- package/dist/preview-engine/{renderers-CQIPHCIW.mjs → renderers-GQM3KMV3.mjs} +1 -1
- package/dist/preview-engine/{renderers-TKHQRERE.mjs → renderers-H6PBHEYU.mjs} +1 -1
- package/dist/preview-engine/{renderers-YJ4PJEPG.mjs → renderers-HKLCB4U6.mjs} +1 -1
- package/dist/preview-engine/{renderers-JALV3B3A.mjs → renderers-HSFQIILN.mjs} +1 -1
- package/dist/preview-engine/{renderers-OZKPOUMW.mjs → renderers-I6QKZ7CH.mjs} +1 -1
- package/dist/preview-engine/{renderers-JMSAW7VY.mjs → renderers-IHGAWLUF.mjs} +1 -1
- package/dist/preview-engine/renderers-J6ZEXW5L.mjs +1 -0
- package/dist/preview-engine/renderers-JV4MF46Q.mjs +1 -0
- package/dist/preview-engine/{renderers-RQ3JZE3L.mjs → renderers-KCGK33Y2.mjs} +1 -1
- package/dist/preview-engine/renderers-KQKH4ZIX.mjs +1 -0
- package/dist/preview-engine/renderers-MDHPQY6D.mjs +1 -0
- package/dist/preview-engine/renderers-MEITHN4N.mjs +1 -0
- package/dist/preview-engine/renderers-MN3HSBTJ.mjs +1 -0
- package/dist/preview-engine/{renderers-EILFSWSJ.mjs → renderers-MOEC2XZZ.mjs} +1 -1
- package/dist/preview-engine/renderers-NTG3QGNH.mjs +1 -0
- package/dist/preview-engine/{renderers-UBIFSF37.mjs → renderers-OGOW3NA4.mjs} +1 -1
- package/dist/preview-engine/renderers-OU4SFMB2.mjs +1 -0
- package/dist/preview-engine/{renderers-4SNAK77B.mjs → renderers-P2HORBZ6.mjs} +1 -1
- package/dist/preview-engine/renderers-P6TIBJIG.mjs +1 -0
- package/dist/preview-engine/renderers-POJWQ7L3.mjs +1 -0
- package/dist/preview-engine/{renderers-NQC4DPX4.mjs → renderers-PPZK6VEW.mjs} +1 -1
- package/dist/preview-engine/renderers-RJ7S6VHD.mjs +1 -0
- package/dist/preview-engine/renderers-RJJAJZYN.mjs +1 -0
- package/dist/preview-engine/{renderers-KICDB5Y6.mjs → renderers-RN2MHIFK.mjs} +1 -1
- package/dist/preview-engine/renderers-UEQ733VK.mjs +1 -0
- package/dist/preview-engine/{renderers-XZ3XDQIN.mjs → renderers-UG2C3C7T.mjs} +1 -1
- package/dist/preview-engine/renderers-ULO2AW2U.mjs +1 -0
- package/dist/preview-engine/renderers-UPVHGHCK.mjs +1 -0
- package/dist/preview-engine/renderers-UZHSNNIM.mjs +1 -0
- package/dist/preview-engine/renderers-V5KWZL2C.mjs +1 -0
- package/dist/preview-engine/{renderers-5K3BSBI6.mjs → renderers-VIGZYJYX.mjs} +1 -1
- package/dist/preview-engine/{renderers-6RYIPQ7W.mjs → renderers-VVP5WQOY.mjs} +1 -1
- package/dist/preview-engine/renderers-WL372W36.mjs +228 -0
- package/dist/preview-engine/{renderers-AUYCQNSS.mjs → renderers-WSABL3QO.mjs} +1 -1
- package/dist/preview-engine/{renderers-4WFRXGMR.mjs → renderers-X6CORAES.mjs} +1 -1
- package/dist/preview-engine/renderers-YMXKYOHQ.mjs +1 -0
- package/dist/preview-engine/renderers-YWDAZ2NZ.mjs +1 -0
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/preview-engine/{src-GPF7RIBU.mjs → src-4IUYUKIZ.mjs} +1 -1
- package/dist/{program-BUjUTdxq.mjs → program-Bc860ko5.mjs} +15 -42
- package/dist/program-Bc860ko5.mjs.map +1 -0
- package/dist/renderer/index.d.mts +1 -1
- package/dist/renderer/index.mjs +2 -2
- package/dist/renderer--Ymc_4XJ.mjs +5 -0
- package/dist/{renderer-BvRaVByi.mjs → renderer-1uoKiILq.mjs} +3 -3
- package/dist/{renderer-BvRaVByi.mjs.map → renderer-1uoKiILq.mjs.map} +1 -1
- package/dist/{renderer-muB4slsV.mjs → renderer-4ZUv3X1I.mjs} +4 -4
- package/dist/{renderer-muB4slsV.mjs.map → renderer-4ZUv3X1I.mjs.map} +1 -1
- package/dist/{renderer-BT4im6c0.mjs → renderer-50JEMaVo.mjs} +4 -4
- package/dist/{renderer-BT4im6c0.mjs.map → renderer-50JEMaVo.mjs.map} +1 -1
- package/dist/{renderer-CsRuEpR2.mjs → renderer-7ow5Acsg.mjs} +3 -3
- package/dist/{renderer-CsRuEpR2.mjs.map → renderer-7ow5Acsg.mjs.map} +1 -1
- package/dist/{renderer-DJuVX3c5.d.mts → renderer-88C3QpKL.d.mts} +2 -2
- package/dist/{renderer-DJuVX3c5.d.mts.map → renderer-88C3QpKL.d.mts.map} +1 -1
- package/dist/{renderer-jBKpX3Xg.mjs → renderer-B-CMRUag.mjs} +3 -3
- package/dist/{renderer-jBKpX3Xg.mjs.map → renderer-B-CMRUag.mjs.map} +1 -1
- package/dist/renderer-B-OdV-eq.mjs +5 -0
- package/dist/{renderer-CeNAgCE2.mjs → renderer-B1LD29TV.mjs} +3 -3
- package/dist/{renderer-CeNAgCE2.mjs.map → renderer-B1LD29TV.mjs.map} +1 -1
- package/dist/{renderer-BFmVDdVs.mjs → renderer-B1esRxGy.mjs} +4 -4
- package/dist/{renderer-BFmVDdVs.mjs.map → renderer-B1esRxGy.mjs.map} +1 -1
- package/dist/{renderer-Chfo4G9t.mjs → renderer-B3Dme2es.mjs} +4 -4
- package/dist/{renderer-Chfo4G9t.mjs.map → renderer-B3Dme2es.mjs.map} +1 -1
- package/dist/renderer-B65fwoA2.mjs +5 -0
- package/dist/{renderer-B3WHDQeB.mjs → renderer-B6Oeahe_.mjs} +3 -3
- package/dist/{renderer-B3WHDQeB.mjs.map → renderer-B6Oeahe_.mjs.map} +1 -1
- package/dist/renderer-B92Ahkcv.mjs +5 -0
- package/dist/renderer-B9z2AK31.mjs +5 -0
- package/dist/{renderer-Bm91Xv6l.mjs → renderer-BDZC3o3N.mjs} +4 -4
- package/dist/{renderer-Bm91Xv6l.mjs.map → renderer-BDZC3o3N.mjs.map} +1 -1
- package/dist/renderer-BIF3Dg3Z.mjs +5 -0
- package/dist/{renderer-D7lApyWZ.mjs → renderer-BJ-7WRgO.mjs} +3 -3
- package/dist/{renderer-D7lApyWZ.mjs.map → renderer-BJ-7WRgO.mjs.map} +1 -1
- package/dist/renderer-BJUVaIAT.mjs +5 -0
- package/dist/renderer-BKRDMbI-.mjs +5 -0
- package/dist/{renderer-BSW4CGZF.mjs → renderer-BNHcwxw9.mjs} +3 -3
- package/dist/{renderer-BSW4CGZF.mjs.map → renderer-BNHcwxw9.mjs.map} +1 -1
- package/dist/{renderer-7w9PZmWJ.mjs → renderer-BNJ6Jk7-.mjs} +3 -3
- package/dist/{renderer-7w9PZmWJ.mjs.map → renderer-BNJ6Jk7-.mjs.map} +1 -1
- package/dist/{renderer-DsPLMzy1.mjs → renderer-BOrMBwQS.mjs} +2 -2
- package/dist/{renderer-DsPLMzy1.mjs.map → renderer-BOrMBwQS.mjs.map} +1 -1
- package/dist/{renderer-Br_aJ_b7.mjs → renderer-BQetXCcZ.mjs} +3 -3
- package/dist/{renderer-Br_aJ_b7.mjs.map → renderer-BQetXCcZ.mjs.map} +1 -1
- package/dist/{renderer-CtulmkqT.mjs → renderer-BSELd5vU.mjs} +3 -3
- package/dist/{renderer-CtulmkqT.mjs.map → renderer-BSELd5vU.mjs.map} +1 -1
- package/dist/renderer-BSwhyVWa.mjs +5 -0
- package/dist/{renderer-Ch1qZ2PT.mjs → renderer-BURhYcpA.mjs} +3 -3
- package/dist/{renderer-Ch1qZ2PT.mjs.map → renderer-BURhYcpA.mjs.map} +1 -1
- package/dist/renderer-BUqSZn2X.mjs +5 -0
- package/dist/{renderer-tcypOFaB.d.mts → renderer-BVKOQarx.d.mts} +4 -22
- package/dist/renderer-BVKOQarx.d.mts.map +1 -0
- package/dist/{renderer-BG_cnGbF.mjs → renderer-BaIJIfJ6.mjs} +4 -4
- package/dist/{renderer-BG_cnGbF.mjs.map → renderer-BaIJIfJ6.mjs.map} +1 -1
- package/dist/renderer-BbmvjqK9.mjs +3 -0
- package/dist/{renderer-CybBR8AL.mjs → renderer-Bbxh4N8Y.mjs} +73 -73
- package/dist/{renderer-CybBR8AL.mjs.map → renderer-Bbxh4N8Y.mjs.map} +1 -1
- package/dist/{renderer-B84T5I98.mjs → renderer-Bf4-N7k7.mjs} +4 -4
- package/dist/{renderer-B84T5I98.mjs.map → renderer-Bf4-N7k7.mjs.map} +1 -1
- package/dist/{renderer-7c0ecb-L.mjs → renderer-BhsrlGKp.mjs} +21 -74
- package/dist/renderer-BhsrlGKp.mjs.map +1 -0
- package/dist/{renderer-BhNZn2DU.mjs → renderer-Bo7shNdU.mjs} +4 -4
- package/dist/{renderer-BhNZn2DU.mjs.map → renderer-Bo7shNdU.mjs.map} +1 -1
- package/dist/renderer-Bpe4k_x6.mjs +5 -0
- package/dist/{renderer-Dswrn-yi.mjs → renderer-BwrfKKqw.mjs} +3 -3
- package/dist/{renderer-Dswrn-yi.mjs.map → renderer-BwrfKKqw.mjs.map} +1 -1
- package/dist/{renderer-DCMoBppL.mjs → renderer-Bx14Wnxl.mjs} +4 -58
- package/dist/renderer-Bx14Wnxl.mjs.map +1 -0
- package/dist/{renderer-DxkvDAA6.mjs → renderer-Bxjb0HYU.mjs} +3 -3
- package/dist/{renderer-DxkvDAA6.mjs.map → renderer-Bxjb0HYU.mjs.map} +1 -1
- package/dist/{renderer-D7DlNOVi.mjs → renderer-ByjaseAo.mjs} +4 -4
- package/dist/{renderer-D7DlNOVi.mjs.map → renderer-ByjaseAo.mjs.map} +1 -1
- package/dist/renderer-C1NjG0CJ.mjs +5 -0
- package/dist/renderer-C7Puyst9.mjs +5 -0
- package/dist/{renderer-DrExCXnp.mjs → renderer-C9BSXyrq.mjs} +3 -3
- package/dist/{renderer-DrExCXnp.mjs.map → renderer-C9BSXyrq.mjs.map} +1 -1
- package/dist/{renderer-Bb_HHUQ0.mjs → renderer-CAWnCsQc.mjs} +4 -4
- package/dist/{renderer-Bb_HHUQ0.mjs.map → renderer-CAWnCsQc.mjs.map} +1 -1
- package/dist/renderer-CGA_7320.mjs +5 -0
- package/dist/{renderer-CO1PwItH.mjs → renderer-CLAvn9c6.mjs} +3 -3
- package/dist/{renderer-CO1PwItH.mjs.map → renderer-CLAvn9c6.mjs.map} +1 -1
- package/dist/renderer-CLnFkXO7.mjs +5 -0
- package/dist/renderer-CMQIT1Kh.mjs +5 -0
- package/dist/{renderer-CTSvHf6g.mjs → renderer-COcKhouz.mjs} +4 -4
- package/dist/{renderer-CTSvHf6g.mjs.map → renderer-COcKhouz.mjs.map} +1 -1
- package/dist/renderer-CQ1rwjIh.mjs +5 -0
- package/dist/{renderer-H4CZt3Z5.mjs → renderer-CR0mDPYY.mjs} +2 -2
- package/dist/renderer-CT8h0boY.mjs +5 -0
- package/dist/{renderer-D_rEtJAH.mjs → renderer-CU8v-LxD.mjs} +4 -4
- package/dist/{renderer-D_rEtJAH.mjs.map → renderer-CU8v-LxD.mjs.map} +1 -1
- package/dist/renderer-Cb0lszt3.mjs +5 -0
- package/dist/renderer-Ci7oLye9.mjs +5 -0
- package/dist/renderer-CjqXB3CZ.mjs +5 -0
- package/dist/{renderer-BeJoW-nG.mjs → renderer-Co6UFbZB.mjs} +4 -4
- package/dist/{renderer-BeJoW-nG.mjs.map → renderer-Co6UFbZB.mjs.map} +1 -1
- package/dist/renderer-CqTV04zQ.mjs +5 -0
- package/dist/{renderer-DKptrHeL.mjs → renderer-CrR8Mpxq.mjs} +4 -4
- package/dist/{renderer-DKptrHeL.mjs.map → renderer-CrR8Mpxq.mjs.map} +1 -1
- package/dist/renderer-CtWeRtHK.mjs +5 -0
- package/dist/{renderer-CDfCaqV4.mjs → renderer-CxGx1Lhi.mjs} +3 -3
- package/dist/{renderer-CDfCaqV4.mjs.map → renderer-CxGx1Lhi.mjs.map} +1 -1
- package/dist/{renderer-DlbSqOJR.mjs → renderer-Cz-n883J.mjs} +4 -4
- package/dist/{renderer-DlbSqOJR.mjs.map → renderer-Cz-n883J.mjs.map} +1 -1
- package/dist/renderer-CzolnwCo.mjs +5 -0
- package/dist/{renderer-DtCmG-tT.mjs → renderer-D-QVGphn.mjs} +4 -4
- package/dist/{renderer-DtCmG-tT.mjs.map → renderer-D-QVGphn.mjs.map} +1 -1
- package/dist/{renderer-oiDoNzhv.mjs → renderer-D06HxSXO.mjs} +2 -2
- package/dist/{renderer-B8i4d1Rc.mjs → renderer-D0aAZHC7.mjs} +3 -3
- package/dist/{renderer-B8i4d1Rc.mjs.map → renderer-D0aAZHC7.mjs.map} +1 -1
- package/dist/{renderer-JASAZUyY.mjs → renderer-D4f8f66C.mjs} +4 -4
- package/dist/{renderer-JASAZUyY.mjs.map → renderer-D4f8f66C.mjs.map} +1 -1
- package/dist/renderer-D6qhcx_C.mjs +5 -0
- package/dist/{renderer-BdRwbLLV.mjs → renderer-DAn9xiQT.mjs} +4 -4
- package/dist/{renderer-BdRwbLLV.mjs.map → renderer-DAn9xiQT.mjs.map} +1 -1
- package/dist/renderer-DDfEf0jt.mjs +5 -0
- package/dist/renderer-DDpa8ztp.mjs +5 -0
- package/dist/{renderer-DjiebKHO.mjs → renderer-DE9Jik9K.mjs} +3 -3
- package/dist/{renderer-DjiebKHO.mjs.map → renderer-DE9Jik9K.mjs.map} +1 -1
- package/dist/{renderer-kFx1_MmK.mjs → renderer-DFJWPqOJ.mjs} +3 -3
- package/dist/{renderer-kFx1_MmK.mjs.map → renderer-DFJWPqOJ.mjs.map} +1 -1
- package/dist/{renderer-R2kLaNuR.mjs → renderer-DLPhfwbR.mjs} +3 -3
- package/dist/{renderer-R2kLaNuR.mjs.map → renderer-DLPhfwbR.mjs.map} +1 -1
- package/dist/{renderer-CLRrcT_3.mjs → renderer-DOkbn1ot.mjs} +4 -4
- package/dist/{renderer-CLRrcT_3.mjs.map → renderer-DOkbn1ot.mjs.map} +1 -1
- package/dist/{renderer-1KgHl_ls.mjs → renderer-DaXQgGg3.mjs} +4 -4
- package/dist/{renderer-1KgHl_ls.mjs.map → renderer-DaXQgGg3.mjs.map} +1 -1
- package/dist/renderer-DbQBqzmx.mjs +5 -0
- package/dist/{renderer-BOg8i8eF.mjs → renderer-DcvjSolU.mjs} +2 -11
- package/dist/{renderer-BOg8i8eF.mjs.map → renderer-DcvjSolU.mjs.map} +1 -1
- package/dist/renderer-DfUcwMKa.mjs +5 -0
- package/dist/renderer-DgIjNANM.mjs +6 -0
- package/dist/{renderer-Dd2XrdqA.mjs → renderer-DgPn_SOC.mjs} +3 -3
- package/dist/{renderer-Dd2XrdqA.mjs.map → renderer-DgPn_SOC.mjs.map} +1 -1
- package/dist/{renderer-BTLZBD63.mjs → renderer-DkqZmfm8.mjs} +4 -4
- package/dist/{renderer-BTLZBD63.mjs.map → renderer-DkqZmfm8.mjs.map} +1 -1
- package/dist/{renderer-Dak_wVh9.mjs → renderer-Dpl6poqD.mjs} +2 -2
- package/dist/{renderer-Dak_wVh9.mjs.map → renderer-Dpl6poqD.mjs.map} +1 -1
- package/dist/renderer-Dsh6Tgu0.mjs +3 -0
- package/dist/renderer-DuIwR9GT.mjs +5 -0
- package/dist/renderer-Dv4u2c14.mjs +5 -0
- package/dist/{renderer-DxiF4O6X.mjs → renderer-DwK9jsER.mjs} +4 -4
- package/dist/{renderer-DxiF4O6X.mjs.map → renderer-DwK9jsER.mjs.map} +1 -1
- package/dist/{renderer-BnN3JH9u.mjs → renderer-HDj9Zb-O.mjs} +6 -19
- package/dist/renderer-HDj9Zb-O.mjs.map +1 -0
- package/dist/renderer-IE1yu3lZ.mjs +5 -0
- package/dist/{renderer-BIToh0CA.mjs → renderer-JHByuUNb.mjs} +3 -3
- package/dist/{renderer-BIToh0CA.mjs.map → renderer-JHByuUNb.mjs.map} +1 -1
- package/dist/{renderer--f8JHHyT.mjs → renderer-KKk7myX1.mjs} +4 -4
- package/dist/{renderer--f8JHHyT.mjs.map → renderer-KKk7myX1.mjs.map} +1 -1
- package/dist/renderer-PY_wnEN0.mjs +5 -0
- package/dist/{renderer-Bif8bwCq.mjs → renderer-Ros7XQg2.mjs} +3 -3
- package/dist/{renderer-Bif8bwCq.mjs.map → renderer-Ros7XQg2.mjs.map} +1 -1
- package/dist/{renderer-DkAFIpzB.mjs → renderer-RvI3qRUI.mjs} +4 -4
- package/dist/{renderer-DkAFIpzB.mjs.map → renderer-RvI3qRUI.mjs.map} +1 -1
- package/dist/{renderer-FFLnACY-.mjs → renderer-Rw87u1Cr.mjs} +4 -4
- package/dist/{renderer-FFLnACY-.mjs.map → renderer-Rw87u1Cr.mjs.map} +1 -1
- package/dist/{renderer-DMtzPqYo.mjs → renderer-TKZCA0B9.mjs} +69 -208
- package/dist/renderer-TKZCA0B9.mjs.map +1 -0
- package/dist/{renderer-Bo5GwErU.mjs → renderer-V4dhrf_h.mjs} +4 -4
- package/dist/{renderer-Bo5GwErU.mjs.map → renderer-V4dhrf_h.mjs.map} +1 -1
- package/dist/{renderer-CWmlfdLb.mjs → renderer-_9gbYS-3.mjs} +4 -4
- package/dist/{renderer-CWmlfdLb.mjs.map → renderer-_9gbYS-3.mjs.map} +1 -1
- package/dist/{renderer-Dih1rtT6.mjs → renderer-celhuAL7.mjs} +3 -3
- package/dist/{renderer-Dih1rtT6.mjs.map → renderer-celhuAL7.mjs.map} +1 -1
- package/dist/{renderer-Ck-NLzz0.mjs → renderer-eMCTAa9e.mjs} +3 -3
- package/dist/{renderer-Ck-NLzz0.mjs.map → renderer-eMCTAa9e.mjs.map} +1 -1
- package/dist/{renderer-D1tDMuD0.mjs → renderer-fs8f1QeE.mjs} +4 -4
- package/dist/{renderer-D1tDMuD0.mjs.map → renderer-fs8f1QeE.mjs.map} +1 -1
- package/dist/{renderer-DAfCcnCz.mjs → renderer-fwKnV9zs.mjs} +4 -4
- package/dist/{renderer-DAfCcnCz.mjs.map → renderer-fwKnV9zs.mjs.map} +1 -1
- package/dist/{renderer-DBfx6QX1.mjs → renderer-g_1t2je9.mjs} +2 -2
- package/dist/renderer-gv24VyzO.mjs +5 -0
- package/dist/{renderer-DAug14gu.mjs → renderer-h62QaJYz.mjs} +3 -3
- package/dist/{renderer-DAug14gu.mjs.map → renderer-h62QaJYz.mjs.map} +1 -1
- package/dist/{renderer-CKlNHDKI.mjs → renderer-jnAIhWn_.mjs} +4 -4
- package/dist/{renderer-CKlNHDKI.mjs.map → renderer-jnAIhWn_.mjs.map} +1 -1
- package/dist/{renderer-CwAuWLWm.mjs → renderer-lHNTgiOM.mjs} +3 -3
- package/dist/{renderer-CwAuWLWm.mjs.map → renderer-lHNTgiOM.mjs.map} +1 -1
- package/dist/renderer-nN6lPZf9.mjs +5 -0
- package/dist/{renderer-CanNjQuL.mjs → renderer-o68mVeyk.mjs} +3 -3
- package/dist/{renderer-CanNjQuL.mjs.map → renderer-o68mVeyk.mjs.map} +1 -1
- package/dist/{renderer-vPxMXiv8.mjs → renderer-pNmI-A9o.mjs} +4 -4
- package/dist/{renderer-vPxMXiv8.mjs.map → renderer-pNmI-A9o.mjs.map} +1 -1
- package/dist/{renderer-CxabOSkk.mjs → renderer-q7q6k_cD.mjs} +3 -3
- package/dist/{renderer-CxabOSkk.mjs.map → renderer-q7q6k_cD.mjs.map} +1 -1
- package/dist/{renderer-vpsU_4XW.mjs → renderer-riIFosX6.mjs} +4 -4
- package/dist/{renderer-vpsU_4XW.mjs.map → renderer-riIFosX6.mjs.map} +1 -1
- package/dist/{renderer-w7mlMSC-.mjs → renderer-sfqZK6L5.mjs} +4 -4
- package/dist/{renderer-w7mlMSC-.mjs.map → renderer-sfqZK6L5.mjs.map} +1 -1
- package/dist/{renderer-fWW0bsVl.mjs → renderer-ynFRJh7G.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-OgyUiyrr.mjs → renderers-CP8CFWDs-DRoslK4F.mjs} +3 -3
- package/dist/{renderers-CP8CFWDs-OgyUiyrr.mjs.map → renderers-CP8CFWDs-DRoslK4F.mjs.map} +1 -1
- package/dist/sam/index.d.mts +2 -2
- package/dist/sam/index.mjs +1 -1
- package/dist/signals/index.d.mts +6 -6
- package/dist/signals/index.mjs +5 -5
- package/dist/{src-C3f3zXYg.mjs → src-BYp6r-cS.mjs} +28 -248
- package/dist/src-BYp6r-cS.mjs.map +1 -0
- package/dist/{src-BU6vm9sP-DFJ3phW0.mjs → src-Bnr8DUC--BRDqRF6I.mjs} +9 -74
- package/dist/src-Bnr8DUC--BRDqRF6I.mjs.map +1 -0
- package/package.json +59 -59
- package/dist/audio-1X5qNNmk.d.mts +0 -38
- package/dist/audio-1X5qNNmk.d.mts.map +0 -1
- package/dist/audio-YpBRdI7r.mjs.map +0 -1
- package/dist/dist-C4Vxgm0Q.mjs.map +0 -1
- package/dist/gpu-Bw35AMwY.mjs.map +0 -1
- package/dist/index-B7WqFBZA.d.mts.map +0 -1
- package/dist/index-Dyt4yS-x.d.mts.map +0 -1
- package/dist/index-WwuuX8ZJ.d.mts.map +0 -1
- package/dist/preview-engine/chunk-44V4V5LD.mjs +0 -1
- package/dist/preview-engine/chunk-4TPXZNVR.mjs +0 -483
- package/dist/preview-engine/chunk-4YT5YJIF.mjs +0 -1
- package/dist/preview-engine/chunk-77MT33VR.mjs +0 -1
- package/dist/preview-engine/chunk-A6OAPDIA.mjs +0 -1
- package/dist/preview-engine/chunk-ADLIF544.mjs +0 -39
- package/dist/preview-engine/chunk-CSLSWUUT.mjs +0 -1
- package/dist/preview-engine/chunk-GTMZOMAN.mjs +0 -1
- package/dist/preview-engine/chunk-JAAFSVAG.mjs +0 -1
- package/dist/preview-engine/chunk-PH3UUX6A.mjs +0 -138
- package/dist/preview-engine/chunk-PIHG6HJO.mjs +0 -1
- package/dist/preview-engine/chunk-T6L3DO3H.mjs +0 -1
- package/dist/preview-engine/chunk-ZGEKF34E.mjs +0 -1974
- package/dist/preview-engine/renderers-33PIDDZC.mjs +0 -1
- package/dist/preview-engine/renderers-3AZ3HY53.mjs +0 -1
- package/dist/preview-engine/renderers-3FGKW52B.mjs +0 -1
- package/dist/preview-engine/renderers-4A2FBS3Y.mjs +0 -1
- package/dist/preview-engine/renderers-65DU2F5W.mjs +0 -1
- package/dist/preview-engine/renderers-6CTPYQR6.mjs +0 -1
- package/dist/preview-engine/renderers-AWODRI3B.mjs +0 -1
- package/dist/preview-engine/renderers-BO6HHGMZ.mjs +0 -1
- package/dist/preview-engine/renderers-BSXYDEV7.mjs +0 -1
- package/dist/preview-engine/renderers-DU7KPFVV.mjs +0 -1
- package/dist/preview-engine/renderers-ECW2CGNU.mjs +0 -1
- package/dist/preview-engine/renderers-EEX22FUO.mjs +0 -1
- package/dist/preview-engine/renderers-GCQKGJ7W.mjs +0 -1
- package/dist/preview-engine/renderers-HZBXLDKG.mjs +0 -1
- package/dist/preview-engine/renderers-IOXNQPQK.mjs +0 -1
- package/dist/preview-engine/renderers-IR44E4ZZ.mjs +0 -1
- package/dist/preview-engine/renderers-JZZ3ODOZ.mjs +0 -1
- package/dist/preview-engine/renderers-K37YL3Z7.mjs +0 -1
- package/dist/preview-engine/renderers-KUJQV3K6.mjs +0 -1
- package/dist/preview-engine/renderers-KXVKLSSX.mjs +0 -1
- package/dist/preview-engine/renderers-N4RVFX3G.mjs +0 -1
- package/dist/preview-engine/renderers-NZWWEAYA.mjs +0 -1
- package/dist/preview-engine/renderers-P4JJEDZB.mjs +0 -1
- package/dist/preview-engine/renderers-Q4572F5C.mjs +0 -1
- package/dist/preview-engine/renderers-QAX2QWWQ.mjs +0 -1
- package/dist/preview-engine/renderers-SRFIEVWL.mjs +0 -1
- package/dist/preview-engine/renderers-SYC6WFTM.mjs +0 -1
- package/dist/preview-engine/renderers-UH4WN3QN.mjs +0 -1
- package/dist/preview-engine/renderers-V4FFCAS7.mjs +0 -1
- package/dist/preview-engine/renderers-VGDEOZUU.mjs +0 -1
- package/dist/preview-engine/renderers-VJJKBX5K.mjs +0 -1
- package/dist/preview-engine/renderers-VJOKVDYW.mjs +0 -1
- package/dist/preview-engine/renderers-VUUWZUOH.mjs +0 -1
- package/dist/preview-engine/renderers-WG756VF3.mjs +0 -228
- package/dist/preview-engine/renderers-WOP5GOZP.mjs +0 -1
- package/dist/preview-engine/renderers-Y4MGN2FR.mjs +0 -1
- package/dist/preview-engine/renderers-YAMYH7IK.mjs +0 -1
- package/dist/preview-engine/renderers-ZNLSAWW3.mjs +0 -1
- package/dist/program-BUjUTdxq.mjs.map +0 -1
- package/dist/renderer-6sNr6ZRJ.mjs +0 -6
- package/dist/renderer-7c0ecb-L.mjs.map +0 -1
- package/dist/renderer-BDHGxD6p.mjs +0 -5
- package/dist/renderer-BT9dvpk2.mjs +0 -5
- package/dist/renderer-Bd-NuU3M.mjs +0 -3
- package/dist/renderer-BfaRh0qy.mjs +0 -5
- package/dist/renderer-BlwXKV7Y.mjs +0 -5
- package/dist/renderer-BnN3JH9u.mjs.map +0 -1
- package/dist/renderer-C40yZK3x.mjs +0 -5
- package/dist/renderer-C5MjQ7L8.mjs +0 -5
- package/dist/renderer-C8LjKYnS.mjs +0 -5
- package/dist/renderer-C9q9H_qa.mjs +0 -5
- package/dist/renderer-CC4fhNup.mjs +0 -3
- package/dist/renderer-CF9ta9Rm.mjs +0 -5
- package/dist/renderer-CO205Gr9.mjs +0 -5
- package/dist/renderer-CSm8UXLP.mjs +0 -5
- package/dist/renderer-CSy8HRtF.mjs +0 -5
- package/dist/renderer-CdNRWDsA.mjs +0 -5
- package/dist/renderer-CkAjiGRB.mjs +0 -5
- package/dist/renderer-CmryuPBm.mjs +0 -5
- package/dist/renderer-CnEwne4L.mjs +0 -5
- package/dist/renderer-D4QDoqOG.mjs +0 -5
- package/dist/renderer-D7cS2a8z.mjs +0 -5
- package/dist/renderer-D85CNC-b.mjs +0 -5
- package/dist/renderer-DC9IoJNz.mjs +0 -5
- package/dist/renderer-DCMoBppL.mjs.map +0 -1
- package/dist/renderer-DIDh0gFm.mjs +0 -5
- package/dist/renderer-DLmJ9GWE.mjs +0 -5
- package/dist/renderer-DM7PUWP9.mjs +0 -5
- package/dist/renderer-DMtzPqYo.mjs.map +0 -1
- package/dist/renderer-DPWFDxIO.mjs +0 -5
- package/dist/renderer-DUCByhAk.mjs +0 -5
- package/dist/renderer-DVOtnCKH.mjs +0 -5
- package/dist/renderer-DVrN2bW8.mjs +0 -5
- package/dist/renderer-DdOVwfG4.mjs +0 -5
- package/dist/renderer-DtCe9ouu.mjs +0 -5
- package/dist/renderer-Mg0kr9Fm.mjs +0 -5
- package/dist/renderer-T35PsSw5.mjs +0 -5
- package/dist/renderer-iSZ5NT-J.mjs +0 -5
- package/dist/renderer-nEmMjQ1a.mjs +0 -5
- package/dist/renderer-pG1nyfjE.mjs +0 -5
- package/dist/renderer-tcypOFaB.d.mts.map +0 -1
- package/dist/renderer-vbb9e3E3.mjs +0 -5
- package/dist/src-BU6vm9sP-DFJ3phW0.mjs.map +0 -1
- package/dist/src-C3f3zXYg.mjs.map +0 -1
|
@@ -10,7 +10,7 @@ import { DotLottie } from "@lottiefiles/dotlottie-web";
|
|
|
10
10
|
import earcut from "earcut";
|
|
11
11
|
import { Path2D } from "skia-canvas";
|
|
12
12
|
|
|
13
|
-
//#region ../webgpu-renderers/dist/text-animations-
|
|
13
|
+
//#region ../webgpu-renderers/dist/text-animations-COSsiLBc.mjs
|
|
14
14
|
/**
|
|
15
15
|
* 1. Biquad IIR Filter Bank Compute Shader
|
|
16
16
|
* Applies resonant bandpass/lowpass/highpass filtering on PCM audio buffer.
|
|
@@ -293,6 +293,12 @@ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
|
293
293
|
}
|
|
294
294
|
}
|
|
295
295
|
`;
|
|
296
|
+
/** Averages every channel into one mono buffer for storage buffer upload. */
|
|
297
|
+
function downmixToMono(channels) {
|
|
298
|
+
const mono = new Float32Array(channels[0]?.length ?? 0);
|
|
299
|
+
for (const ch of channels) for (let i = 0; i < mono.length; i++) mono[i] += ch[i] / channels.length;
|
|
300
|
+
return mono;
|
|
301
|
+
}
|
|
296
302
|
function calculateBiquadBandpassCoeffs(sampleRate, centerFreq, Q) {
|
|
297
303
|
const w0 = 2 * Math.PI * centerFreq / sampleRate;
|
|
298
304
|
const alpha = Math.sin(w0) / (2 * Q);
|
|
@@ -363,18 +369,13 @@ var AudioSignalComputePipeline = class AudioSignalComputePipeline$1 {
|
|
|
363
369
|
* Processes raw PCM audio channels on the GPU and outputs extracted feature buffers and textures.
|
|
364
370
|
*/
|
|
365
371
|
static async extractFeatures(device, audioChannels, sampleRate, fps, config$1 = {}, targetWidth = 512) {
|
|
366
|
-
|
|
367
|
-
if (numChannels === 0 || audioChannels[0].length === 0) throw new Error("Empty audio buffer supplied to AudioSignalComputePipeline.");
|
|
372
|
+
if (audioChannels.length === 0 || audioChannels[0].length === 0) throw new Error("Empty audio buffer supplied to AudioSignalComputePipeline.");
|
|
368
373
|
const numAudioSamples = audioChannels[0].length;
|
|
369
374
|
const durationSec = numAudioSamples / sampleRate;
|
|
370
375
|
const numFrames = Math.max(1, Math.ceil(durationSec * fps));
|
|
371
376
|
const hopSize = Math.max(1, Math.round(sampleRate / fps));
|
|
372
377
|
const windowSize = Math.max(32, Math.round(hopSize * 2));
|
|
373
|
-
const monoPcm =
|
|
374
|
-
for (let c = 0; c < numChannels; c++) {
|
|
375
|
-
const ch = audioChannels[c];
|
|
376
|
-
for (let i = 0; i < numAudioSamples; i++) monoPcm[i] += ch[i] / numChannels;
|
|
377
|
-
}
|
|
378
|
+
const monoPcm = downmixToMono(audioChannels);
|
|
378
379
|
const rawAudioBuffer = device.createBuffer({
|
|
379
380
|
size: numAudioSamples * 4,
|
|
380
381
|
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
@@ -16642,10 +16643,6 @@ async function acquireDevice(opts) {
|
|
|
16642
16643
|
if (adapter.limits && Number.isInteger(adapter.limits.maxTextureDimension2D)) requiredLimits.maxTextureDimension2D = Math.min(8192, adapter.limits.maxTextureDimension2D);
|
|
16643
16644
|
if (adapter.limits && Number.isInteger(adapter.limits.maxStorageBuffersPerShaderStage)) requiredLimits.maxStorageBuffersPerShaderStage = Math.min(16, adapter.limits.maxStorageBuffersPerShaderStage);
|
|
16644
16645
|
if (adapter.limits && Number.isInteger(adapter.limits.maxStorageBuffersPerPipelineLayout)) requiredLimits.maxStorageBuffersPerPipelineLayout = Math.min(16, adapter.limits.maxStorageBuffersPerPipelineLayout);
|
|
16645
|
-
for (const limit of ["maxStorageBufferBindingSize", "maxBufferSize"]) {
|
|
16646
|
-
const max = adapter.limits?.[limit];
|
|
16647
|
-
if (Number.isFinite(max)) requiredLimits[limit] = max;
|
|
16648
|
-
}
|
|
16649
16646
|
return adapter.requestDevice({
|
|
16650
16647
|
requiredFeatures,
|
|
16651
16648
|
requiredLimits
|
|
@@ -26447,9 +26444,9 @@ async function drawSignalNode(ctx, encoder, pass, props) {
|
|
|
26447
26444
|
const elapsedTimeSec = elapsedMs / 1e3;
|
|
26448
26445
|
await signalRegistry.ensureAudioSourcesExtracted(ctx.device, config$1, fps, props.renderId);
|
|
26449
26446
|
const signalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, nodeId, elapsedTimeSec, durationSec, config$1, width, height, props.renderId, frame, fps);
|
|
26450
|
-
const pipelines = getDevicePipelines(ctx.device);
|
|
26447
|
+
const pipelines$1 = getDevicePipelines(ctx.device);
|
|
26451
26448
|
const cacheKey = `preview_${ctx.renderer.format}`;
|
|
26452
|
-
let pipeline = pipelines.get(cacheKey);
|
|
26449
|
+
let pipeline = pipelines$1.get(cacheKey);
|
|
26453
26450
|
if (!pipeline) {
|
|
26454
26451
|
const shaderModule = ctx.device.createShaderModule({
|
|
26455
26452
|
label: `signal_preview_static.wgsl`,
|
|
@@ -26469,7 +26466,7 @@ async function drawSignalNode(ctx, encoder, pass, props) {
|
|
|
26469
26466
|
},
|
|
26470
26467
|
primitive: { topology: "triangle-strip" }
|
|
26471
26468
|
});
|
|
26472
|
-
pipelines.set(cacheKey, pipeline);
|
|
26469
|
+
pipelines$1.set(cacheKey, pipeline);
|
|
26473
26470
|
}
|
|
26474
26471
|
let previewModeInt = 0;
|
|
26475
26472
|
if (!isMathNode && !isGateNode) {
|
|
@@ -26514,50 +26511,6 @@ async function drawSignalNode(ctx, encoder, pass, props) {
|
|
|
26514
26511
|
pass.setBindGroup(1, bindGroup1);
|
|
26515
26512
|
pass.draw(4);
|
|
26516
26513
|
}
|
|
26517
|
-
/**
|
|
26518
|
-
* Target pixels per local unit along the axis `m` stretches most: what a
|
|
26519
|
-
* raster drawn under `m` needs per unit to stay sharp, and what one target
|
|
26520
|
-
* pixel is in local units (its inverse).
|
|
26521
|
-
*/
|
|
26522
|
-
function transformScale(m) {
|
|
26523
|
-
return Math.max(Math.hypot(m.a, m.b), Math.hypot(m.c, m.d));
|
|
26524
|
-
}
|
|
26525
|
-
var TransformStack = class {
|
|
26526
|
-
stack = [new DOMMatrix()];
|
|
26527
|
-
push(matrix) {
|
|
26528
|
-
const next = this.stack[this.stack.length - 1].multiply(matrix);
|
|
26529
|
-
this.stack.push(next);
|
|
26530
|
-
}
|
|
26531
|
-
pop() {
|
|
26532
|
-
if (this.stack.length > 1) this.stack.pop();
|
|
26533
|
-
}
|
|
26534
|
-
getCurrent() {
|
|
26535
|
-
return this.stack[this.stack.length - 1];
|
|
26536
|
-
}
|
|
26537
|
-
packIntoBuffer(bufferData, opacity, surfaceWidth, surfaceHeight, localOverride, customParam) {
|
|
26538
|
-
let m = this.getCurrent();
|
|
26539
|
-
if (localOverride) m = m.multiply(localOverride);
|
|
26540
|
-
bufferData[0] = m.a;
|
|
26541
|
-
bufferData[1] = m.b;
|
|
26542
|
-
bufferData[2] = 0;
|
|
26543
|
-
bufferData[3] = 0;
|
|
26544
|
-
bufferData[4] = m.c;
|
|
26545
|
-
bufferData[5] = m.d;
|
|
26546
|
-
bufferData[6] = 0;
|
|
26547
|
-
bufferData[7] = 0;
|
|
26548
|
-
bufferData[8] = m.e;
|
|
26549
|
-
bufferData[9] = m.f;
|
|
26550
|
-
bufferData[10] = 1;
|
|
26551
|
-
bufferData[11] = 0;
|
|
26552
|
-
bufferData[12] = opacity;
|
|
26553
|
-
bufferData[13] = surfaceWidth;
|
|
26554
|
-
bufferData[14] = surfaceHeight;
|
|
26555
|
-
bufferData[15] = customParam ?? 0;
|
|
26556
|
-
}
|
|
26557
|
-
destroy() {
|
|
26558
|
-
this.stack = [new DOMMatrix()];
|
|
26559
|
-
}
|
|
26560
|
-
};
|
|
26561
26514
|
var SvgLoader = class {
|
|
26562
26515
|
cache = /* @__PURE__ */ new Map();
|
|
26563
26516
|
async load(src, width, height, isHeadless) {
|
|
@@ -26630,10 +26583,8 @@ var SvgLoader = class {
|
|
|
26630
26583
|
};
|
|
26631
26584
|
const svgLoader = new SvgLoader();
|
|
26632
26585
|
async function drawSvgNode(ctx, pass, props) {
|
|
26633
|
-
const
|
|
26634
|
-
const
|
|
26635
|
-
const resolvedWidth = Math.max(1, Math.ceil(props.dstRect.width * k));
|
|
26636
|
-
const resolvedHeight = Math.max(1, Math.ceil(props.dstRect.height * k));
|
|
26586
|
+
const resolvedWidth = Math.max(1, Math.ceil(props.dstRect.width));
|
|
26587
|
+
const resolvedHeight = Math.max(1, Math.ceil(props.dstRect.height));
|
|
26637
26588
|
const cacheKey = `${props.src}-${resolvedWidth}-${resolvedHeight}`;
|
|
26638
26589
|
let tex = textureCache.acquire(cacheKey);
|
|
26639
26590
|
if (!tex) try {
|
|
@@ -27438,8 +27389,6 @@ fn sampleSlugCoverage(sampleUV: vec2<f32>, g: SlugGlyph, pixelsPerEm: vec2<f32>)
|
|
|
27438
27389
|
// pixel footprint in glyph uv, |d/dx| + |d/dy| (fwidth): the caller takes it in
|
|
27439
27390
|
// uniform control flow. On a turned or foreshortened glyph it is wider than one
|
|
27440
27391
|
// pixel along an axis, so that axis gets the soft ramp a box filter gives.
|
|
27441
|
-
// A blur of blurAmount px averages coverage over a grid reaching 0.3 of it
|
|
27442
|
-
// each way, blurTaps taps per side past the centre.
|
|
27443
27392
|
fn shadeSlugGlyph(
|
|
27444
27393
|
uv: vec2<f32>,
|
|
27445
27394
|
fw: vec2<f32>,
|
|
@@ -27448,7 +27397,6 @@ fn shadeSlugGlyph(
|
|
|
27448
27397
|
color: vec4<f32>,
|
|
27449
27398
|
opacity: f32,
|
|
27450
27399
|
blurAmount: f32,
|
|
27451
|
-
blurTaps: f32,
|
|
27452
27400
|
chromaticShift: f32,
|
|
27453
27401
|
dissolveProgress: f32,
|
|
27454
27402
|
) -> vec4<f32> {
|
|
@@ -27481,15 +27429,14 @@ fn shadeSlugGlyph(
|
|
|
27481
27429
|
|
|
27482
27430
|
var slugAlpha = 0.0;
|
|
27483
27431
|
if (blurAmount > 0.01) {
|
|
27484
|
-
let step = fw * blurAmount * 0.3
|
|
27485
|
-
for (var y_offset = -
|
|
27486
|
-
for (var x_offset = -
|
|
27432
|
+
let step = fw * blurAmount * 0.3;
|
|
27433
|
+
for (var y_offset = -1.0; y_offset <= 1.0; y_offset = y_offset + 1.0) {
|
|
27434
|
+
for (var x_offset = -1.0; x_offset <= 1.0; x_offset = x_offset + 1.0) {
|
|
27487
27435
|
let offset = vec2<f32>(x_offset, y_offset) * step;
|
|
27488
27436
|
slugAlpha = slugAlpha + sampleSlugCoverage(uv + offset, g, pixelsPerEm);
|
|
27489
27437
|
}
|
|
27490
27438
|
}
|
|
27491
|
-
|
|
27492
|
-
slugAlpha = slugAlpha / (side * side);
|
|
27439
|
+
slugAlpha = slugAlpha / 9.0;
|
|
27493
27440
|
} else {
|
|
27494
27441
|
slugAlpha = sampleSlugCoverage(uv, g, pixelsPerEm);
|
|
27495
27442
|
}
|
|
@@ -27525,7 +27472,6 @@ struct VSOut {
|
|
|
27525
27472
|
@location(7) @interpolate(flat) chromaticShift : f32,
|
|
27526
27473
|
@location(8) @interpolate(flat) dissolveProgress : f32,
|
|
27527
27474
|
@location(9) @interpolate(flat) vfxParam : f32,
|
|
27528
|
-
@location(10) @interpolate(flat) blurTaps : f32,
|
|
27529
27475
|
};
|
|
27530
27476
|
|
|
27531
27477
|
var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
|
|
@@ -27559,11 +27505,7 @@ var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
|
|
|
27559
27505
|
let transform2 = mat2x2<f32>(u.transformCol0.xy, u.transformCol1.xy);
|
|
27560
27506
|
let pixelsPerUnit = sqrt(max(abs(determinant(transform2)), 1e-8));
|
|
27561
27507
|
let halfSize = max(abs(aScaleBias.xy * scale_mult), vec2<f32>(1e-4));
|
|
27562
|
-
|
|
27563
|
-
// spans: its blur spills that far at one pixel per unit.
|
|
27564
|
-
let blurred = aExtraParams.x > 0.01;
|
|
27565
|
-
let dilation = select(1.0, max(1.0, pixelsPerUnit), blurred) / pixelsPerUnit;
|
|
27566
|
-
let grow = vec2<f32>(1.0) + dilation / halfSize;
|
|
27508
|
+
let grow = vec2<f32>(1.0) + (1.0 / pixelsPerUnit) / halfSize;
|
|
27567
27509
|
let uv = vec2<f32>(
|
|
27568
27510
|
quad_pos.x * grow.x * 0.5 + 0.5,
|
|
27569
27511
|
1.0 - (quad_pos.y * grow.y * 0.5 + 0.5),
|
|
@@ -27597,11 +27539,7 @@ var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
|
|
|
27597
27539
|
out.bandMax = vec2<u32>(aBandMaxTexCoords.xy);
|
|
27598
27540
|
out.bandsTexCoords = vec2<u32>(aBandMaxTexCoords.zw);
|
|
27599
27541
|
out.color = aColor;
|
|
27600
|
-
|
|
27601
|
-
// stage spreads its taps in pixels, as far apart as at one pixel per
|
|
27602
|
-
// unit (more of them as a unit spans more pixels, up to 4).
|
|
27603
|
-
out.blurAmount = aExtraParams.x * pixelsPerUnit;
|
|
27604
|
-
out.blurTaps = clamp(ceil(pixelsPerUnit - 1e-3), 1.0, 4.0);
|
|
27542
|
+
out.blurAmount = aExtraParams.x;
|
|
27605
27543
|
out.chromaticShift = aExtraParams.y;
|
|
27606
27544
|
out.dissolveProgress = aExtraParams.z;
|
|
27607
27545
|
out.vfxParam = aExtraParams.w;
|
|
@@ -27620,7 +27558,6 @@ var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
|
|
|
27620
27558
|
in.color,
|
|
27621
27559
|
u.params.x,
|
|
27622
27560
|
in.blurAmount,
|
|
27623
|
-
in.blurTaps,
|
|
27624
27561
|
in.chromaticShift,
|
|
27625
27562
|
in.dissolveProgress,
|
|
27626
27563
|
);
|
|
@@ -29673,6 +29610,42 @@ var SolidPipeline = class {
|
|
|
29673
29610
|
this.uniformBindGroupCache.destroy();
|
|
29674
29611
|
}
|
|
29675
29612
|
};
|
|
29613
|
+
var TransformStack = class {
|
|
29614
|
+
stack = [new DOMMatrix()];
|
|
29615
|
+
push(matrix) {
|
|
29616
|
+
const next = this.stack[this.stack.length - 1].multiply(matrix);
|
|
29617
|
+
this.stack.push(next);
|
|
29618
|
+
}
|
|
29619
|
+
pop() {
|
|
29620
|
+
if (this.stack.length > 1) this.stack.pop();
|
|
29621
|
+
}
|
|
29622
|
+
getCurrent() {
|
|
29623
|
+
return this.stack[this.stack.length - 1];
|
|
29624
|
+
}
|
|
29625
|
+
packIntoBuffer(bufferData, opacity, surfaceWidth, surfaceHeight, localOverride, customParam) {
|
|
29626
|
+
let m = this.getCurrent();
|
|
29627
|
+
if (localOverride) m = m.multiply(localOverride);
|
|
29628
|
+
bufferData[0] = m.a;
|
|
29629
|
+
bufferData[1] = m.b;
|
|
29630
|
+
bufferData[2] = 0;
|
|
29631
|
+
bufferData[3] = 0;
|
|
29632
|
+
bufferData[4] = m.c;
|
|
29633
|
+
bufferData[5] = m.d;
|
|
29634
|
+
bufferData[6] = 0;
|
|
29635
|
+
bufferData[7] = 0;
|
|
29636
|
+
bufferData[8] = m.e;
|
|
29637
|
+
bufferData[9] = m.f;
|
|
29638
|
+
bufferData[10] = 1;
|
|
29639
|
+
bufferData[11] = 0;
|
|
29640
|
+
bufferData[12] = opacity;
|
|
29641
|
+
bufferData[13] = surfaceWidth;
|
|
29642
|
+
bufferData[14] = surfaceHeight;
|
|
29643
|
+
bufferData[15] = customParam ?? 0;
|
|
29644
|
+
}
|
|
29645
|
+
destroy() {
|
|
29646
|
+
this.stack = [new DOMMatrix()];
|
|
29647
|
+
}
|
|
29648
|
+
};
|
|
29676
29649
|
function premultiplyClearColor(color) {
|
|
29677
29650
|
if (Array.isArray(color)) {
|
|
29678
29651
|
const a$1 = color[3] ?? 1;
|
|
@@ -29823,14 +29796,10 @@ var Renderer2D = class {
|
|
|
29823
29796
|
this.drawShapeFill(pass, tris, fill, bounds, opts);
|
|
29824
29797
|
if ((!stroke || !stroke.width || stroke.width <= 0) && (fill.type ?? "solid") === "solid" && fill.color) {
|
|
29825
29798
|
const svgPath = buildShapeSvgPath(config$1);
|
|
29826
|
-
if (svgPath) {
|
|
29827
|
-
|
|
29828
|
-
|
|
29829
|
-
|
|
29830
|
-
...opts,
|
|
29831
|
-
strokeLineCap: "round"
|
|
29832
|
-
});
|
|
29833
|
-
}
|
|
29799
|
+
if (svgPath) this.drawPath(pass, svgPath, fill.color, 1, {
|
|
29800
|
+
...opts,
|
|
29801
|
+
strokeLineCap: "round"
|
|
29802
|
+
});
|
|
29834
29803
|
}
|
|
29835
29804
|
}
|
|
29836
29805
|
}
|
|
@@ -32879,9 +32848,6 @@ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBl
|
|
|
32879
32848
|
*/
|
|
32880
32849
|
const quad3dWgsl = `
|
|
32881
32850
|
${lighting3dWgsl}
|
|
32882
|
-
// Grid cells either side a relief's normals span.
|
|
32883
|
-
const RELIEF_NORMAL_CELLS : f32 = 4.0;
|
|
32884
|
-
|
|
32885
32851
|
struct ModelUniforms {
|
|
32886
32852
|
modelMatrix : mat4x4<f32>,
|
|
32887
32853
|
normalMatrix : mat4x4<f32>,
|
|
@@ -32892,15 +32858,11 @@ struct ModelUniforms {
|
|
|
32892
32858
|
materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
|
|
32893
32859
|
pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
|
|
32894
32860
|
emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
|
|
32895
|
-
relief : vec4<f32>, // x = amount (px), y = on, w = grid cells per side
|
|
32896
|
-
reliefRect : vec4<f32>, // xy = where the layer's box starts in reliefTex (0..1), zw = its size
|
|
32897
|
-
reliefEye : vec4<f32>, // xyz = the eye the surface keeps its look from (the default camera)
|
|
32898
32861
|
};
|
|
32899
32862
|
|
|
32900
32863
|
@group(0) @binding(0) var<uniform> cam : CameraUniforms;
|
|
32901
32864
|
@group(1) @binding(0) var<uniform> model : ModelUniforms;
|
|
32902
|
-
${matte3dWgsl(1, 1)}@group(
|
|
32903
|
-
@group(2) @binding(0) var texSampler : sampler;
|
|
32865
|
+
${matte3dWgsl(1, 1)}@group(2) @binding(0) var texSampler : sampler;
|
|
32904
32866
|
@group(2) @binding(1) var mainTex : texture_2d<f32>;
|
|
32905
32867
|
${lightsBindingsWgsl}
|
|
32906
32868
|
|
|
@@ -32919,48 +32881,13 @@ struct VertexOutput {
|
|
|
32919
32881
|
@location(4) localPos : vec2<f32>,
|
|
32920
32882
|
};
|
|
32921
32883
|
|
|
32922
|
-
// Relief: the layer's plane pushed toward the eye by the brightness of a
|
|
32923
|
-
// second picture, so a flat quad becomes a surface (see DrawQuad3DOpts.relief).
|
|
32924
|
-
fn reliefAt(uv: vec2<f32>) -> f32 {
|
|
32925
|
-
let dims = vec2<f32>(textureDimensions(reliefTex));
|
|
32926
|
-
let p = (model.reliefRect.xy + clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)) * model.reliefRect.zw) * dims - 0.5;
|
|
32927
|
-
let i = floor(p);
|
|
32928
|
-
let f = p - i;
|
|
32929
|
-
// Texels of the layer's own box only: past its edge the relief was never drawn.
|
|
32930
|
-
let lo = max(floor(model.reliefRect.xy * dims), vec2<f32>(0.0));
|
|
32931
|
-
let hi = min(ceil((model.reliefRect.xy + model.reliefRect.zw) * dims) - 1.0, dims - 1.0);
|
|
32932
|
-
let a = textureLoad(reliefTex, vec2<i32>(clamp(i, lo, hi)), 0).rgb;
|
|
32933
|
-
let b = textureLoad(reliefTex, vec2<i32>(clamp(i + vec2<f32>(1.0, 0.0), lo, hi)), 0).rgb;
|
|
32934
|
-
let c = textureLoad(reliefTex, vec2<i32>(clamp(i + vec2<f32>(0.0, 1.0), lo, hi)), 0).rgb;
|
|
32935
|
-
let d = textureLoad(reliefTex, vec2<i32>(clamp(i + vec2<f32>(1.0, 1.0), lo, hi)), 0).rgb;
|
|
32936
|
-
let rgb = mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
32937
|
-
return dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));
|
|
32938
|
-
}
|
|
32939
|
-
|
|
32940
|
-
// The plane's front: the side the default camera sees.
|
|
32941
|
-
fn reliefFront() -> vec3<f32> {
|
|
32942
|
-
return normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
|
|
32943
|
-
}
|
|
32944
|
-
|
|
32945
|
-
// A point of the plane lifted by its relief along the ray to the eye, so from
|
|
32946
|
-
// the eye it lands on the same pixel as the flat picture.
|
|
32947
|
-
fn reliefPoint(local: vec2<f32>, uv: vec2<f32>) -> vec3<f32> {
|
|
32948
|
-
let flat = (model.modelMatrix * vec4<f32>(local, 0.0, 1.0)).xyz;
|
|
32949
|
-
let n = reliefFront();
|
|
32950
|
-
let h = model.relief.x * reliefAt(uv);
|
|
32951
|
-
let toEye = model.reliefEye.xyz - flat;
|
|
32952
|
-
let along = dot(toEye, n);
|
|
32953
|
-
return select(flat + n * h, flat + toEye * (h / along), along > 1.0);
|
|
32954
|
-
}
|
|
32955
|
-
|
|
32956
32884
|
@vertex
|
|
32957
32885
|
fn vs_main(in: VertexInput) -> VertexOutput {
|
|
32958
32886
|
var out: VertexOutput;
|
|
32959
32887
|
|
|
32960
32888
|
let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
|
|
32961
|
-
let hasRelief = model.relief.y > 0.5;
|
|
32962
32889
|
var pad = 0.0;
|
|
32963
|
-
if (hasDimensions
|
|
32890
|
+
if (hasDimensions) {
|
|
32964
32891
|
let viewPos = cam.viewMatrix * model.modelMatrix * vec4<f32>(0.0, 0.0, 0.0, 1.0);
|
|
32965
32892
|
let viewDepth = max(abs(viewPos.z), 0.1);
|
|
32966
32893
|
let projScale = max(cam.projMatrix[1][1], 0.001);
|
|
@@ -32970,28 +32897,12 @@ fn vs_main(in: VertexInput) -> VertexOutput {
|
|
|
32970
32897
|
let scalePad = select(vec2<f32>(1.0), 1.0 + vec2<f32>(2.0 * pad) / model.dimensions.xy, hasDimensions);
|
|
32971
32898
|
|
|
32972
32899
|
let paddedPos = vec3<f32>(in.position.xy * scalePad, in.position.z);
|
|
32973
|
-
|
|
32900
|
+
let worldPos4 = model.modelMatrix * vec4<f32>(paddedPos, 1.0);
|
|
32901
|
+
out.worldPos = worldPos4.xyz;
|
|
32974
32902
|
|
|
32975
32903
|
// Normal transformed by 3x3 normal matrix
|
|
32976
32904
|
let norm4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
|
|
32977
32905
|
out.worldNormal = normalize(norm4.xyz);
|
|
32978
|
-
if (hasRelief) {
|
|
32979
|
-
let p = reliefPoint(in.position.xy, in.uv);
|
|
32980
|
-
// Central differences a few cells wide: an 8-bit height map steps every
|
|
32981
|
-
// level, and normals from adjacent cells would light those steps as rings.
|
|
32982
|
-
let e = RELIEF_NORMAL_CELLS / max(model.relief.w, 1.0);
|
|
32983
|
-
let dx = vec2<f32>(e, 0.0);
|
|
32984
|
-
let dy = vec2<f32>(0.0, e);
|
|
32985
|
-
let tx = reliefPoint(in.position.xy + dx, in.uv + dx) - reliefPoint(in.position.xy - dx, in.uv - dx);
|
|
32986
|
-
let ty = reliefPoint(in.position.xy + dy, in.uv + dy) - reliefPoint(in.position.xy - dy, in.uv - dy);
|
|
32987
|
-
var nrm = normalize(cross(tx, ty));
|
|
32988
|
-
if (dot(nrm, reliefFront()) < 0.0) {
|
|
32989
|
-
nrm = -nrm;
|
|
32990
|
-
}
|
|
32991
|
-
worldPos4 = vec4<f32>(p, 1.0);
|
|
32992
|
-
out.worldNormal = nrm;
|
|
32993
|
-
}
|
|
32994
|
-
out.worldPos = worldPos4.xyz;
|
|
32995
32906
|
|
|
32996
32907
|
out.clipPos = cam.viewProjMatrix * worldPos4;
|
|
32997
32908
|
|
|
@@ -33227,10 +33138,6 @@ function createLightsLayout(device, label = "Lights3DLayout") {
|
|
|
33227
33138
|
]
|
|
33228
33139
|
});
|
|
33229
33140
|
}
|
|
33230
|
-
/** Grid cells per side of a relief surface. */
|
|
33231
|
-
const RELIEF_GRID = 512;
|
|
33232
|
-
/** Floats in the quad's model uniform: transform, colors, params, material, surface, then relief. */
|
|
33233
|
-
const MODEL_FLOATS = 52 + SURFACE_PARAMS_FLOATS + 12;
|
|
33234
33141
|
/** [shininess, specularIntensity, ambientIntensity, materialMode] as the 3D shaders' lighting reads them. */
|
|
33235
33142
|
function packMaterialParams(data) {
|
|
33236
33143
|
return [
|
|
@@ -33254,12 +33161,10 @@ var Quad3DPipeline = class {
|
|
|
33254
33161
|
modelPool;
|
|
33255
33162
|
vertexBuffer;
|
|
33256
33163
|
indexBuffer;
|
|
33257
|
-
|
|
33258
|
-
reliefGrid;
|
|
33259
|
-
modelData = new Float32Array(MODEL_FLOATS);
|
|
33164
|
+
modelData = new Float32Array(52 + SURFACE_PARAMS_FLOATS);
|
|
33260
33165
|
constructor(device, format, depthFormat = "depth24plus", sampleCount = 1) {
|
|
33261
33166
|
this.device = device;
|
|
33262
|
-
this.modelPool = new BufferPool(
|
|
33167
|
+
this.modelPool = new BufferPool((52 + SURFACE_PARAMS_FLOATS) * 4, GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST);
|
|
33263
33168
|
const module$1 = device.createShaderModule({
|
|
33264
33169
|
label: "quad3d.wgsl",
|
|
33265
33170
|
code: quad3dWgsl
|
|
@@ -33274,19 +33179,11 @@ var Quad3DPipeline = class {
|
|
|
33274
33179
|
});
|
|
33275
33180
|
this.modelLayout = device.createBindGroupLayout({
|
|
33276
33181
|
label: "Quad3DModelLayout",
|
|
33277
|
-
entries: [
|
|
33278
|
-
|
|
33279
|
-
|
|
33280
|
-
|
|
33281
|
-
|
|
33282
|
-
},
|
|
33283
|
-
matteLayoutEntry(1),
|
|
33284
|
-
{
|
|
33285
|
-
binding: 2,
|
|
33286
|
-
visibility: GPUShaderStage.VERTEX,
|
|
33287
|
-
texture: { sampleType: "float" }
|
|
33288
|
-
}
|
|
33289
|
-
]
|
|
33182
|
+
entries: [{
|
|
33183
|
+
binding: 0,
|
|
33184
|
+
visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
|
|
33185
|
+
buffer: { type: "uniform" }
|
|
33186
|
+
}, matteLayoutEntry(1)]
|
|
33290
33187
|
});
|
|
33291
33188
|
this.textureLayout = device.createBindGroupLayout({
|
|
33292
33189
|
label: "Quad3DTextureLayout",
|
|
@@ -33453,110 +33350,18 @@ var Quad3DPipeline = class {
|
|
|
33453
33350
|
this.modelData[47] = data.textureExtent?.[1] ?? 0;
|
|
33454
33351
|
this.modelData.set(packMaterialParams(data), 48);
|
|
33455
33352
|
packSurfaceParams(data, this.modelData, 52);
|
|
33456
|
-
const relief = data.relief;
|
|
33457
|
-
const r = 52 + SURFACE_PARAMS_FLOATS;
|
|
33458
|
-
this.modelData.set(relief ? [
|
|
33459
|
-
relief.amount,
|
|
33460
|
-
1,
|
|
33461
|
-
0,
|
|
33462
|
-
RELIEF_GRID
|
|
33463
|
-
] : [
|
|
33464
|
-
0,
|
|
33465
|
-
0,
|
|
33466
|
-
0,
|
|
33467
|
-
0
|
|
33468
|
-
], r);
|
|
33469
|
-
this.modelData.set(relief?.uvRect ?? [
|
|
33470
|
-
0,
|
|
33471
|
-
0,
|
|
33472
|
-
1,
|
|
33473
|
-
1
|
|
33474
|
-
], r + 4);
|
|
33475
|
-
this.modelData.set([...relief?.eye ?? [
|
|
33476
|
-
0,
|
|
33477
|
-
0,
|
|
33478
|
-
0
|
|
33479
|
-
], 0], r + 8);
|
|
33480
33353
|
const modelBuffer = this.modelPool.getBuffer(this.device, this.modelData);
|
|
33481
33354
|
return this.device.createBindGroup({
|
|
33482
33355
|
layout: this.modelLayout,
|
|
33483
|
-
entries: [
|
|
33484
|
-
|
|
33485
|
-
|
|
33486
|
-
|
|
33487
|
-
|
|
33488
|
-
|
|
33489
|
-
|
|
33490
|
-
resource: data.matte?.createView() ?? fullCoverageView(this.device)
|
|
33491
|
-
},
|
|
33492
|
-
{
|
|
33493
|
-
binding: 2,
|
|
33494
|
-
resource: data.relief?.texture.createView() ?? fullCoverageView(this.device)
|
|
33495
|
-
}
|
|
33496
|
-
]
|
|
33356
|
+
entries: [{
|
|
33357
|
+
binding: 0,
|
|
33358
|
+
resource: { buffer: modelBuffer }
|
|
33359
|
+
}, {
|
|
33360
|
+
binding: 1,
|
|
33361
|
+
resource: data.matte?.createView() ?? fullCoverageView(this.device)
|
|
33362
|
+
}]
|
|
33497
33363
|
});
|
|
33498
33364
|
}
|
|
33499
|
-
/** Binds the geometry for `data` and draws it: the quad, or the relief grid. */
|
|
33500
|
-
drawGeometry(pass, data) {
|
|
33501
|
-
if (!data.relief) {
|
|
33502
|
-
pass.setVertexBuffer(0, this.vertexBuffer);
|
|
33503
|
-
pass.setIndexBuffer(this.indexBuffer, "uint16");
|
|
33504
|
-
pass.drawIndexed(6);
|
|
33505
|
-
return;
|
|
33506
|
-
}
|
|
33507
|
-
this.reliefGrid ??= this.createReliefGrid();
|
|
33508
|
-
pass.setVertexBuffer(0, this.reliefGrid.vertices);
|
|
33509
|
-
pass.setIndexBuffer(this.reliefGrid.indices, "uint32");
|
|
33510
|
-
pass.drawIndexed(this.reliefGrid.count);
|
|
33511
|
-
}
|
|
33512
|
-
/** A RELIEF_GRID² grid over the unit quad, laid out like the quad's vertices. */
|
|
33513
|
-
createReliefGrid() {
|
|
33514
|
-
const side = RELIEF_GRID + 1;
|
|
33515
|
-
const vertices = new Float32Array(side * side * 8);
|
|
33516
|
-
for (let j = 0; j < side; j++) for (let i = 0; i < side; i++) {
|
|
33517
|
-
const u = i / RELIEF_GRID;
|
|
33518
|
-
const v = j / RELIEF_GRID;
|
|
33519
|
-
vertices.set([
|
|
33520
|
-
u - .5,
|
|
33521
|
-
v - .5,
|
|
33522
|
-
0,
|
|
33523
|
-
u,
|
|
33524
|
-
v,
|
|
33525
|
-
0,
|
|
33526
|
-
0,
|
|
33527
|
-
-1
|
|
33528
|
-
], (j * side + i) * 8);
|
|
33529
|
-
}
|
|
33530
|
-
const indices = new Uint32Array(RELIEF_GRID * RELIEF_GRID * 6);
|
|
33531
|
-
let k = 0;
|
|
33532
|
-
for (let j = 0; j < RELIEF_GRID; j++) for (let i = 0; i < RELIEF_GRID; i++) {
|
|
33533
|
-
const a = j * side + i;
|
|
33534
|
-
indices.set([
|
|
33535
|
-
a,
|
|
33536
|
-
a + 1,
|
|
33537
|
-
a + side + 1,
|
|
33538
|
-
a,
|
|
33539
|
-
a + side + 1,
|
|
33540
|
-
a + side
|
|
33541
|
-
], k);
|
|
33542
|
-
k += 6;
|
|
33543
|
-
}
|
|
33544
|
-
const upload = (data, usage) => {
|
|
33545
|
-
const buffer = this.device.createBuffer({
|
|
33546
|
-
size: data.byteLength,
|
|
33547
|
-
usage: usage | GPUBufferUsage.COPY_DST,
|
|
33548
|
-
mappedAtCreation: true
|
|
33549
|
-
});
|
|
33550
|
-
new data.constructor(buffer.getMappedRange()).set(data);
|
|
33551
|
-
buffer.unmap();
|
|
33552
|
-
return buffer;
|
|
33553
|
-
};
|
|
33554
|
-
return {
|
|
33555
|
-
vertices: upload(vertices, GPUBufferUsage.VERTEX),
|
|
33556
|
-
indices: upload(indices, GPUBufferUsage.INDEX),
|
|
33557
|
-
count: indices.length
|
|
33558
|
-
};
|
|
33559
|
-
}
|
|
33560
33365
|
textureBindGroup(texture, sampler) {
|
|
33561
33366
|
return this.device.createBindGroup({
|
|
33562
33367
|
layout: this.textureLayout,
|
|
@@ -33577,7 +33382,9 @@ var Quad3DPipeline = class {
|
|
|
33577
33382
|
pass.setBindGroup(1, modelBindGroup);
|
|
33578
33383
|
pass.setBindGroup(2, textureBindGroup);
|
|
33579
33384
|
pass.setBindGroup(3, lightsBindGroup);
|
|
33580
|
-
|
|
33385
|
+
pass.setVertexBuffer(0, this.vertexBuffer);
|
|
33386
|
+
pass.setIndexBuffer(this.indexBuffer, "uint16");
|
|
33387
|
+
pass.drawIndexed(6);
|
|
33581
33388
|
}
|
|
33582
33389
|
/** Draws the quad into a shadow map (`lightCameraBindGroup` holds the light's view-projection). */
|
|
33583
33390
|
drawShadow(pass, lightCameraBindGroup, texture, sampler, data) {
|
|
@@ -33585,14 +33392,14 @@ var Quad3DPipeline = class {
|
|
|
33585
33392
|
pass.setBindGroup(0, lightCameraBindGroup);
|
|
33586
33393
|
pass.setBindGroup(1, this.packModel(data));
|
|
33587
33394
|
pass.setBindGroup(2, this.textureBindGroup(texture, sampler));
|
|
33588
|
-
|
|
33395
|
+
pass.setVertexBuffer(0, this.vertexBuffer);
|
|
33396
|
+
pass.setIndexBuffer(this.indexBuffer, "uint16");
|
|
33397
|
+
pass.drawIndexed(6);
|
|
33589
33398
|
}
|
|
33590
33399
|
destroy() {
|
|
33591
33400
|
this.modelPool.destroy();
|
|
33592
33401
|
this.vertexBuffer.destroy();
|
|
33593
33402
|
this.indexBuffer.destroy();
|
|
33594
|
-
this.reliefGrid?.vertices.destroy();
|
|
33595
|
-
this.reliefGrid?.indices.destroy();
|
|
33596
33403
|
}
|
|
33597
33404
|
};
|
|
33598
33405
|
var Mesh3DPipeline = class {
|
|
@@ -38240,7 +38047,6 @@ fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
|
|
|
38240
38047
|
in.color,
|
|
38241
38048
|
model.params.x,
|
|
38242
38049
|
in.fx.x,
|
|
38243
|
-
1.0,
|
|
38244
38050
|
in.fx.y,
|
|
38245
38051
|
in.fx.z,
|
|
38246
38052
|
);
|
|
@@ -39828,8 +39634,7 @@ var Renderer3D = class {
|
|
|
39828
39634
|
height: c.opts.height,
|
|
39829
39635
|
textureExtent: c.opts.textureExtent,
|
|
39830
39636
|
opacity: c.opts.opacity,
|
|
39831
|
-
colorTint: c.opts.colorTint
|
|
39832
|
-
relief: c.opts.relief
|
|
39637
|
+
colorTint: c.opts.colorTint
|
|
39833
39638
|
});
|
|
39834
39639
|
}
|
|
39835
39640
|
pass.end();
|
|
@@ -40093,8 +39898,7 @@ var Renderer3D = class {
|
|
|
40093
39898
|
metallic,
|
|
40094
39899
|
emissive: opts.emissive,
|
|
40095
39900
|
emissiveIntensity: opts.emissiveIntensity,
|
|
40096
|
-
matte: opts.matte
|
|
40097
|
-
relief: opts.relief
|
|
39901
|
+
matte: opts.matte
|
|
40098
39902
|
}, useMrt, this.passWritesHdr);
|
|
40099
39903
|
}
|
|
40100
39904
|
/** T(pos) * Rz * Ry * Rx * S, or the draw's precomputed model matrix. */
|
|
@@ -41147,6 +40951,365 @@ struct VSOut {
|
|
|
41147
40951
|
return vec4<f32>(outRgb, outAlpha);
|
|
41148
40952
|
}
|
|
41149
40953
|
`;
|
|
40954
|
+
const MAX_PITCH_LAG = 2048;
|
|
40955
|
+
const PITCH_CANDIDATES = 8;
|
|
40956
|
+
const EMPTY_CANDIDATE = 2;
|
|
40957
|
+
/** Cost of switching between voiced and unvoiced from one frame to the next. */
|
|
40958
|
+
const VOICING_SWITCH_COST = .6;
|
|
40959
|
+
/** Extra cost of a dip that echoes a shorter candidate's period. */
|
|
40960
|
+
const SUBHARMONIC_COST = .5;
|
|
40961
|
+
/** How many times shallower the shorter dip may be and still explain a longer one. */
|
|
40962
|
+
const SUBHARMONIC_DEPTH_RATIO = 1.25;
|
|
40963
|
+
/** Relative lag error allowed when matching a period multiple. */
|
|
40964
|
+
const PERIOD_MULTIPLE_TOLERANCE = .03;
|
|
40965
|
+
/** Relative lag distance under which two local minima are one noisy dip. */
|
|
40966
|
+
const RIPPLE_MERGE = .03;
|
|
40967
|
+
const WORKGROUP_SIZE = 128;
|
|
40968
|
+
const MAX_GRID_X = 65535;
|
|
40969
|
+
const AUDIO_PITCH_CANDIDATES_SHADER = `
|
|
40970
|
+
struct PitchUniforms {
|
|
40971
|
+
sampleRate : f32,
|
|
40972
|
+
numSamples : u32,
|
|
40973
|
+
numFrames : u32,
|
|
40974
|
+
windowSize : u32,
|
|
40975
|
+
lagMin : u32,
|
|
40976
|
+
lagMax : u32,
|
|
40977
|
+
gridX : u32,
|
|
40978
|
+
fps : f32,
|
|
40979
|
+
};
|
|
40980
|
+
|
|
40981
|
+
const K : u32 = ${PITCH_CANDIDATES}u;
|
|
40982
|
+
const WG : u32 = ${WORKGROUP_SIZE}u;
|
|
40983
|
+
const EMPTY : f32 = ${EMPTY_CANDIDATE}.0f;
|
|
40984
|
+
const MERGE : f32 = ${RIPPLE_MERGE}f;
|
|
40985
|
+
|
|
40986
|
+
@group(0) @binding(0) var<uniform> u : PitchUniforms;
|
|
40987
|
+
@group(0) @binding(1) var<storage, read> pcm : array<f32>;
|
|
40988
|
+
@group(0) @binding(2) var<storage, read_write> candidates : array<vec2f>;
|
|
40989
|
+
|
|
40990
|
+
var<workgroup> yin : array<f32, ${MAX_PITCH_LAG + 1}>;
|
|
40991
|
+
|
|
40992
|
+
fn sampleAt(i : u32) -> f32 {
|
|
40993
|
+
if (i >= u.numSamples) { return 0.0f; }
|
|
40994
|
+
return pcm[i];
|
|
40995
|
+
}
|
|
40996
|
+
|
|
40997
|
+
// Keeps the K deepest dips sorted by value, shallowest last. A dip within
|
|
40998
|
+
// MERGE of an existing candidate's lag is the same broad dip: only the
|
|
40999
|
+
// deeper of the two survives.
|
|
41000
|
+
fn insertCandidate(lags : ptr<function, array<f32, K>>, vals : ptr<function, array<f32, K>>, lag : f32, val : f32) {
|
|
41001
|
+
var slot = K - 1u;
|
|
41002
|
+
for (var k = 0u; k < K; k = k + 1u) {
|
|
41003
|
+
if ((*vals)[k] < EMPTY && abs((*lags)[k] - lag) <= MERGE * lag) {
|
|
41004
|
+
if ((*vals)[k] <= val) { return; }
|
|
41005
|
+
slot = k;
|
|
41006
|
+
break;
|
|
41007
|
+
}
|
|
41008
|
+
}
|
|
41009
|
+
if ((*vals)[slot] <= val) { return; }
|
|
41010
|
+
var i = slot;
|
|
41011
|
+
loop {
|
|
41012
|
+
if (i == 0u || (*vals)[i - 1u] <= val) { break; }
|
|
41013
|
+
(*vals)[i] = (*vals)[i - 1u];
|
|
41014
|
+
(*lags)[i] = (*lags)[i - 1u];
|
|
41015
|
+
i = i - 1u;
|
|
41016
|
+
}
|
|
41017
|
+
(*vals)[i] = val;
|
|
41018
|
+
(*lags)[i] = lag;
|
|
41019
|
+
}
|
|
41020
|
+
|
|
41021
|
+
@compute @workgroup_size(${WORKGROUP_SIZE})
|
|
41022
|
+
fn main(@builtin(workgroup_id) wid : vec3<u32>, @builtin(local_invocation_index) lid : u32) {
|
|
41023
|
+
let frame = wid.x + wid.y * u.gridX;
|
|
41024
|
+
if (frame >= u.numFrames) { return; }
|
|
41025
|
+
|
|
41026
|
+
// Center the analysed span (window + longest lag) on the frame time.
|
|
41027
|
+
let span = u.windowSize + u.lagMax;
|
|
41028
|
+
let center = i32(round(f32(frame) * u.sampleRate / u.fps));
|
|
41029
|
+
let maxStart = max(i32(u.numSamples) - i32(span), 0);
|
|
41030
|
+
let start = u32(clamp(center - i32(span / 2u), 0, maxStart));
|
|
41031
|
+
|
|
41032
|
+
// YIN difference function, one lag per invocation per stride.
|
|
41033
|
+
for (var tau = lid; tau <= u.lagMax; tau = tau + WG) {
|
|
41034
|
+
var acc = 0.0f;
|
|
41035
|
+
for (var j = 0u; j < u.windowSize; j = j + 1u) {
|
|
41036
|
+
let d = sampleAt(start + j) - sampleAt(start + j + tau);
|
|
41037
|
+
acc = acc + d * d;
|
|
41038
|
+
}
|
|
41039
|
+
yin[tau] = acc;
|
|
41040
|
+
}
|
|
41041
|
+
workgroupBarrier();
|
|
41042
|
+
if (lid != 0u) { return; }
|
|
41043
|
+
|
|
41044
|
+
// Cumulative mean normalized difference, in place.
|
|
41045
|
+
var running = 0.0f;
|
|
41046
|
+
yin[0] = 1.0f;
|
|
41047
|
+
for (var tau = 1u; tau <= u.lagMax; tau = tau + 1u) {
|
|
41048
|
+
running = running + yin[tau];
|
|
41049
|
+
yin[tau] = select(1.0f, yin[tau] * f32(tau) / running, running > 0.0f);
|
|
41050
|
+
}
|
|
41051
|
+
|
|
41052
|
+
var lags : array<f32, K>;
|
|
41053
|
+
var vals : array<f32, K>;
|
|
41054
|
+
for (var k = 0u; k < K; k = k + 1u) {
|
|
41055
|
+
lags[k] = 0.0f;
|
|
41056
|
+
vals[k] = EMPTY;
|
|
41057
|
+
}
|
|
41058
|
+
for (var tau = max(u.lagMin, 1u); tau < u.lagMax; tau = tau + 1u) {
|
|
41059
|
+
let prev = yin[tau - 1u];
|
|
41060
|
+
let cur = yin[tau];
|
|
41061
|
+
let next = yin[tau + 1u];
|
|
41062
|
+
if (cur < prev && cur <= next) {
|
|
41063
|
+
// Parabolic interpolation of the dip for sub-sample period.
|
|
41064
|
+
let den = prev - 2.0f * cur + next;
|
|
41065
|
+
let offset = select(0.0f, 0.5f * (prev - next) / den, den > 0.0f);
|
|
41066
|
+
insertCandidate(&lags, &vals, f32(tau) + offset, cur);
|
|
41067
|
+
}
|
|
41068
|
+
}
|
|
41069
|
+
|
|
41070
|
+
let base = frame * K;
|
|
41071
|
+
for (var k = 0u; k < K; k = k + 1u) {
|
|
41072
|
+
candidates[base + k] = vec2f(lags[k], vals[k]);
|
|
41073
|
+
}
|
|
41074
|
+
}
|
|
41075
|
+
`;
|
|
41076
|
+
function resolvePitchConfig(sampleRate, config$1) {
|
|
41077
|
+
const minHz = config$1.minHz ?? 50;
|
|
41078
|
+
const maxHz = config$1.maxHz ?? 1e3;
|
|
41079
|
+
if (!(minHz > 0 && maxHz > minHz)) throw new Error(`Pitch range needs 0 < minHz < maxHz (got ${minHz}..${maxHz}).`);
|
|
41080
|
+
const lagMax = Math.ceil(sampleRate / minHz) + 1;
|
|
41081
|
+
if (lagMax > MAX_PITCH_LAG) throw new Error(`minHz ${minHz} needs a ${lagMax}-sample period at ${sampleRate} Hz; the limit is ${MAX_PITCH_LAG} (minHz >= ${Math.ceil(sampleRate / (MAX_PITCH_LAG - 1))}).`);
|
|
41082
|
+
const lagMin = Math.max(2, Math.floor(sampleRate / maxHz));
|
|
41083
|
+
const windowMs = config$1.windowMs ?? 45;
|
|
41084
|
+
return {
|
|
41085
|
+
lagMin,
|
|
41086
|
+
lagMax,
|
|
41087
|
+
windowSize: Math.max(lagMax, Math.round(windowMs / 1e3 * sampleRate)),
|
|
41088
|
+
voicingThreshold: config$1.voicingThreshold ?? .8,
|
|
41089
|
+
octaveJumpCost: config$1.octaveJumpCost ?? 8
|
|
41090
|
+
};
|
|
41091
|
+
}
|
|
41092
|
+
function transitionCost(prevLag, lag, octaveJumpCost) {
|
|
41093
|
+
const prevVoiced = prevLag > 0;
|
|
41094
|
+
const voiced = lag > 0;
|
|
41095
|
+
if (prevVoiced !== voiced) return VOICING_SWITCH_COST;
|
|
41096
|
+
if (!voiced) return 0;
|
|
41097
|
+
return octaveJumpCost * Math.abs(Math.log2(lag / prevLag));
|
|
41098
|
+
}
|
|
41099
|
+
/**
|
|
41100
|
+
* True when `lag` is an integer multiple (2x, 3x, ...) of a shorter candidate
|
|
41101
|
+
* that is about as deep. YIN's normalized difference dips at every multiple
|
|
41102
|
+
* of the true period, often slightly deeper, so such a dip is an echo.
|
|
41103
|
+
*/
|
|
41104
|
+
function isPeriodMultiple(data, base, lag, depth) {
|
|
41105
|
+
for (let j = 0; j < PITCH_CANDIDATES; j++) {
|
|
41106
|
+
const shorter = data[(base + j) * 2];
|
|
41107
|
+
const shorterDepth = data[(base + j) * 2 + 1];
|
|
41108
|
+
if (shorterDepth >= EMPTY_CANDIDATE || shorter <= 0 || shorter >= lag) continue;
|
|
41109
|
+
const m = Math.round(lag / shorter);
|
|
41110
|
+
if (m >= 2 && Math.abs(lag - m * shorter) <= PERIOD_MULTIPLE_TOLERANCE * lag && shorterDepth <= depth * SUBHARMONIC_DEPTH_RATIO) return true;
|
|
41111
|
+
}
|
|
41112
|
+
return false;
|
|
41113
|
+
}
|
|
41114
|
+
/**
|
|
41115
|
+
* Writes each state's lag and emission cost for frame `f`. A candidate costs
|
|
41116
|
+
* its YIN dip depth, plus `SUBHARMONIC_COST` when it is a period multiple;
|
|
41117
|
+
* the unvoiced state (index K, lag 0) costs the voicing threshold.
|
|
41118
|
+
*/
|
|
41119
|
+
function observeFrame(data, f, voicingThreshold, lags, costs) {
|
|
41120
|
+
const K = PITCH_CANDIDATES;
|
|
41121
|
+
const base = f * K;
|
|
41122
|
+
const row = f * (K + 1);
|
|
41123
|
+
for (let k = 0; k < K; k++) {
|
|
41124
|
+
const lag = data[(base + k) * 2];
|
|
41125
|
+
const depth = data[(base + k) * 2 + 1];
|
|
41126
|
+
const valid = depth < EMPTY_CANDIDATE && lag > 0;
|
|
41127
|
+
lags[row + k] = valid ? lag : 0;
|
|
41128
|
+
costs[row + k] = !valid ? Number.POSITIVE_INFINITY : depth + (isPeriodMultiple(data, base, lag, depth) ? SUBHARMONIC_COST : 0);
|
|
41129
|
+
}
|
|
41130
|
+
lags[row + K] = 0;
|
|
41131
|
+
costs[row + K] = voicingThreshold;
|
|
41132
|
+
}
|
|
41133
|
+
/** Most likely state per frame given per-state lags and -log emission costs. */
|
|
41134
|
+
function viterbi(lags, costs, numFrames, octaveJumpCost) {
|
|
41135
|
+
const S = PITCH_CANDIDATES + 1;
|
|
41136
|
+
const back = new Uint8Array(numFrames * S);
|
|
41137
|
+
let total = costs.slice(0, S);
|
|
41138
|
+
for (let f = 1; f < numFrames; f++) {
|
|
41139
|
+
const next = new Float64Array(S);
|
|
41140
|
+
for (let s = 0; s < S; s++) {
|
|
41141
|
+
let best = Number.POSITIVE_INFINITY;
|
|
41142
|
+
for (let p = 0; p < S; p++) {
|
|
41143
|
+
const c = total[p] + transitionCost(lags[(f - 1) * S + p], lags[f * S + s], octaveJumpCost);
|
|
41144
|
+
if (c < best) {
|
|
41145
|
+
best = c;
|
|
41146
|
+
back[f * S + s] = p;
|
|
41147
|
+
}
|
|
41148
|
+
}
|
|
41149
|
+
next[s] = best + costs[f * S + s];
|
|
41150
|
+
}
|
|
41151
|
+
total = next;
|
|
41152
|
+
}
|
|
41153
|
+
const path$1 = new Uint8Array(numFrames);
|
|
41154
|
+
let state = total.indexOf(Math.min(...total));
|
|
41155
|
+
for (let f = numFrames - 1; f >= 0; f--) {
|
|
41156
|
+
path$1[f] = state;
|
|
41157
|
+
state = back[f * S + state];
|
|
41158
|
+
}
|
|
41159
|
+
return path$1;
|
|
41160
|
+
}
|
|
41161
|
+
/**
|
|
41162
|
+
* Viterbi decode over each frame's period candidates plus one unvoiced state,
|
|
41163
|
+
* emissions from `observeFrame`, transitions costing `octaveJumpCost` per
|
|
41164
|
+
* octave and a fixed voicing switch.
|
|
41165
|
+
*/
|
|
41166
|
+
function decodePitchTrack(candidates, config$1) {
|
|
41167
|
+
const { data, numFrames, sampleRate } = candidates;
|
|
41168
|
+
const K = PITCH_CANDIDATES;
|
|
41169
|
+
const S = K + 1;
|
|
41170
|
+
const lags = new Float64Array(numFrames * S);
|
|
41171
|
+
const costs = new Float64Array(numFrames * S);
|
|
41172
|
+
for (let f = 0; f < numFrames; f++) observeFrame(data, f, config$1.voicingThreshold ?? .8, lags, costs);
|
|
41173
|
+
const path$1 = viterbi(lags, costs, numFrames, config$1.octaveJumpCost ?? 8);
|
|
41174
|
+
const hz = new Float32Array(numFrames);
|
|
41175
|
+
const confidence = new Float32Array(numFrames);
|
|
41176
|
+
const voiced = new Float32Array(numFrames);
|
|
41177
|
+
for (let f = 0; f < numFrames; f++) {
|
|
41178
|
+
const s = path$1[f];
|
|
41179
|
+
if (lags[f * S + s] === 0) continue;
|
|
41180
|
+
hz[f] = sampleRate / lags[f * S + s];
|
|
41181
|
+
confidence[f] = Math.min(1, Math.max(0, 1 - data[(f * K + s) * 2 + 1]));
|
|
41182
|
+
voiced[f] = 1;
|
|
41183
|
+
}
|
|
41184
|
+
fillUnvoiced(hz, voiced);
|
|
41185
|
+
return {
|
|
41186
|
+
hz,
|
|
41187
|
+
confidence,
|
|
41188
|
+
voiced,
|
|
41189
|
+
numFrames
|
|
41190
|
+
};
|
|
41191
|
+
}
|
|
41192
|
+
/** Linearly interpolates `hz` across unvoiced runs; holds the nearest voiced value at the ends. */
|
|
41193
|
+
function fillUnvoiced(hz, voiced) {
|
|
41194
|
+
let prev = -1;
|
|
41195
|
+
for (let f = 0; f <= hz.length; f++) {
|
|
41196
|
+
if (f < hz.length && voiced[f] === 0) continue;
|
|
41197
|
+
const from = prev >= 0 ? hz[prev] : f < hz.length ? hz[f] : 0;
|
|
41198
|
+
const to = f < hz.length ? hz[f] : from;
|
|
41199
|
+
for (let g$1 = prev + 1; g$1 < f; g$1++) {
|
|
41200
|
+
const t = prev >= 0 && f < hz.length ? (g$1 - prev) / (f - prev) : 0;
|
|
41201
|
+
hz[g$1] = from + (to - from) * t;
|
|
41202
|
+
}
|
|
41203
|
+
prev = f;
|
|
41204
|
+
}
|
|
41205
|
+
}
|
|
41206
|
+
const pipelines = /* @__PURE__ */ new WeakMap();
|
|
41207
|
+
function getPipeline(device) {
|
|
41208
|
+
let pipeline = pipelines.get(device);
|
|
41209
|
+
if (!pipeline) {
|
|
41210
|
+
pipeline = device.createComputePipeline({
|
|
41211
|
+
label: "AudioPitchCandidatesPipeline",
|
|
41212
|
+
layout: "auto",
|
|
41213
|
+
compute: {
|
|
41214
|
+
module: device.createShaderModule({
|
|
41215
|
+
label: "AudioPitchCandidatesPipeline.wgsl",
|
|
41216
|
+
code: AUDIO_PITCH_CANDIDATES_SHADER
|
|
41217
|
+
}),
|
|
41218
|
+
entryPoint: "main"
|
|
41219
|
+
}
|
|
41220
|
+
});
|
|
41221
|
+
pipelines.set(device, pipeline);
|
|
41222
|
+
}
|
|
41223
|
+
return pipeline;
|
|
41224
|
+
}
|
|
41225
|
+
/** Runs the YIN candidate pass on the GPU: `PITCH_CANDIDATES` periods per frame. */
|
|
41226
|
+
async function extractPitchCandidates(device, audioChannels, sampleRate, fps, config$1 = {}) {
|
|
41227
|
+
if (audioChannels.length === 0 || audioChannels[0].length === 0) throw new Error("Empty audio buffer supplied to the pitch tracker.");
|
|
41228
|
+
const { lagMin, lagMax, windowSize } = resolvePitchConfig(sampleRate, config$1);
|
|
41229
|
+
const mono = downmixToMono(audioChannels);
|
|
41230
|
+
const numFrames = Math.max(1, Math.ceil(mono.length / sampleRate * fps));
|
|
41231
|
+
const gridX = Math.min(numFrames, MAX_GRID_X);
|
|
41232
|
+
const outBytes = numFrames * PITCH_CANDIDATES * 2 * 4;
|
|
41233
|
+
const uniforms = /* @__PURE__ */ new ArrayBuffer(32);
|
|
41234
|
+
const f32 = new Float32Array(uniforms);
|
|
41235
|
+
const u32 = new Uint32Array(uniforms);
|
|
41236
|
+
f32[0] = sampleRate;
|
|
41237
|
+
u32[1] = mono.length;
|
|
41238
|
+
u32[2] = numFrames;
|
|
41239
|
+
u32[3] = windowSize;
|
|
41240
|
+
u32[4] = lagMin;
|
|
41241
|
+
u32[5] = lagMax;
|
|
41242
|
+
u32[6] = gridX;
|
|
41243
|
+
f32[7] = fps;
|
|
41244
|
+
const uniformBuffer = device.createBuffer({
|
|
41245
|
+
size: uniforms.byteLength,
|
|
41246
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
41247
|
+
label: "audio_pitch_uniforms"
|
|
41248
|
+
});
|
|
41249
|
+
device.queue.writeBuffer(uniformBuffer, 0, uniforms);
|
|
41250
|
+
const pcmBuffer = device.createBuffer({
|
|
41251
|
+
size: mono.byteLength,
|
|
41252
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
41253
|
+
label: "audio_pitch_pcm"
|
|
41254
|
+
});
|
|
41255
|
+
device.queue.writeBuffer(pcmBuffer, 0, mono);
|
|
41256
|
+
const candidateBuffer = device.createBuffer({
|
|
41257
|
+
size: outBytes,
|
|
41258
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
41259
|
+
label: "audio_pitch_candidates"
|
|
41260
|
+
});
|
|
41261
|
+
const readback = device.createBuffer({
|
|
41262
|
+
size: outBytes,
|
|
41263
|
+
usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
|
|
41264
|
+
label: "audio_pitch_candidates_readback"
|
|
41265
|
+
});
|
|
41266
|
+
const pipeline = getPipeline(device);
|
|
41267
|
+
const encoder = device.createCommandEncoder({ label: "audio_pitch_encoder" });
|
|
41268
|
+
const pass = encoder.beginComputePass({ label: "audio_pitch_candidates_pass" });
|
|
41269
|
+
pass.setPipeline(pipeline);
|
|
41270
|
+
pass.setBindGroup(0, device.createBindGroup({
|
|
41271
|
+
layout: pipeline.getBindGroupLayout(0),
|
|
41272
|
+
entries: [
|
|
41273
|
+
{
|
|
41274
|
+
binding: 0,
|
|
41275
|
+
resource: { buffer: uniformBuffer }
|
|
41276
|
+
},
|
|
41277
|
+
{
|
|
41278
|
+
binding: 1,
|
|
41279
|
+
resource: { buffer: pcmBuffer }
|
|
41280
|
+
},
|
|
41281
|
+
{
|
|
41282
|
+
binding: 2,
|
|
41283
|
+
resource: { buffer: candidateBuffer }
|
|
41284
|
+
}
|
|
41285
|
+
]
|
|
41286
|
+
}));
|
|
41287
|
+
pass.dispatchWorkgroups(gridX, Math.ceil(numFrames / gridX));
|
|
41288
|
+
pass.end();
|
|
41289
|
+
encoder.copyBufferToBuffer(candidateBuffer, 0, readback, 0, outBytes);
|
|
41290
|
+
device.queue.submit([encoder.finish()]);
|
|
41291
|
+
await readback.mapAsync(GPUMapMode.READ);
|
|
41292
|
+
const data = new Float32Array(readback.getMappedRange().slice(0));
|
|
41293
|
+
readback.unmap();
|
|
41294
|
+
for (const b of [
|
|
41295
|
+
readback,
|
|
41296
|
+
candidateBuffer,
|
|
41297
|
+
pcmBuffer,
|
|
41298
|
+
uniformBuffer
|
|
41299
|
+
]) b.destroy();
|
|
41300
|
+
return {
|
|
41301
|
+
data,
|
|
41302
|
+
numFrames,
|
|
41303
|
+
sampleRate
|
|
41304
|
+
};
|
|
41305
|
+
}
|
|
41306
|
+
/** Tracks the fundamental frequency of the downmixed channels at `fps` frames per second. */
|
|
41307
|
+
async function trackAudioPitch(device, audioChannels, sampleRate, fps, config$1 = {}) {
|
|
41308
|
+
return {
|
|
41309
|
+
...decodePitchTrack(await extractPitchCandidates(device, audioChannels, sampleRate, fps, config$1), config$1),
|
|
41310
|
+
durationSec: audioChannels[0].length / sampleRate
|
|
41311
|
+
};
|
|
41312
|
+
}
|
|
41150
41313
|
const GLOBAL_WEBGPU_REGISTRY_KEY = Symbol.for("gatewai.webgpuRegistry");
|
|
41151
41314
|
const GLOBAL_ANALYSIS_STORE_KEY = Symbol.for("gatewai.videoAnalysisStore");
|
|
41152
41315
|
var NodeSurfaceProvider = class {
|
|
@@ -41214,5 +41377,5 @@ var NodeSurfaceProvider = class {
|
|
|
41214
41377
|
if (typeof globalThis !== "undefined") globalThis.__GATEWAI_DELAYS__ = globalThis.__GATEWAI_DELAYS__ || /* @__PURE__ */ new Set();
|
|
41215
41378
|
|
|
41216
41379
|
//#endregion
|
|
41217
|
-
export { probeVideoSize as $, TextCursorStyleSchema as $t, emojiGraphemes as A, evaluateVolumetricFormation as An, ChromaticGlitchConfigSchema as At, jointMatrices as B, waveToCubicBeziers as Bn, LongShadowConfigSchema as Bt, drawGifNode as C, evaluateCubicBezierDerivative as Cn, AdvancedTextAnimatorBuilder as Ct, drawSignalNode as D, evaluateSkewMatrix as Dn, AnimatableGlyphPropsSchema as Dt, drawParagraphNode as E, evaluateSelectorCombination as En, AnchorPresetSchema as Et, getPrimitiveGeometry as F, parseSvgPathToCubicBeziers as Fn, ExtendedGlyphPropertiesSchema as Ft, measureMaxCaptionHeight as G, SelectorUnitsSchema as Gt, loadModel3D as H, SelectorBasedOnSchema as Ht, getRegisteredFontSource as I, sampleAudioSpectrumScale as In, GlyphAnchorGroupingSchema as It, parseFBX as J, Spatial3DPropertiesSchema as Jt, mediaDecoderCache as K, SignalRegistry as Kt, getRenderer2D as L, sampleCurveGeometry as Ln, GlyphAnchorPointSchema as Lt, fitSpansToText as M, generatePathSegments as Mn, DynamicStrokePropertiesSchema as Mt, generateExtrudedTextGeometry as N, getScramblePool as Nn, EnhancedTextNodeSchema as Nt, drawSvgNode as O, evaluateSpringProgress as On, AudioSignalComputePipeline as Ot, getHeadlessFontPath as P, getShuffledOrder as Pn, ExpressionSelectorSchema as Pt, poseNodes as Q, TextCursorConfigSchema as Qt, initHeadlessWebGPU as R, samplePathChainGeometry as Rn, KineticMarqueeConfigSchema as Rt, drawCaptionNode as S, evaluateCubicBezier as Sn, AETextAnimatorSchema as St, drawLottieNode as T, evaluateMarqueeOffset as Tn, AnchorGroupingSchema as Tt, loadOBJ as U, SelectorModeSchema as Ut, loadFBX as V, ParticleDissolveConfigSchema as Vt, lutStore as W, SelectorShapeSchema as Wt, parseOBJ as X, TextAnchorConfigSchema as Xt, parseMTL as Y, SpringPhysicsSchema as Yt, parseSvgPathToSegments as Z, TextAnimatorBuilder as Zt, buildShapeSvgPath as _, computeLineLeadingDisplacement as _n, Path3D as _t, GlassPipeline as a, TextSelectorSchema as an, spansText as at, colorMatrixWgsl as b, distanceToCurveParameter as bn, parseColorToRgb as bt, Renderer2D as c, TypewriterAnimatorSchema as cn,
|
|
41218
|
-
//# sourceMappingURL=dist-
|
|
41380
|
+
export { probeVideoSize as $, TextCursorStyleSchema as $t, emojiGraphemes as A, evaluateVolumetricFormation as An, ChromaticGlitchConfigSchema as At, jointMatrices as B, waveToCubicBeziers as Bn, LongShadowConfigSchema as Bt, drawGifNode as C, evaluateCubicBezierDerivative as Cn, AdvancedTextAnimatorBuilder as Ct, drawSignalNode as D, evaluateSkewMatrix as Dn, AnimatableGlyphPropsSchema as Dt, drawParagraphNode as E, evaluateSelectorCombination as En, AnchorPresetSchema as Et, getPrimitiveGeometry as F, parseSvgPathToCubicBeziers as Fn, ExtendedGlyphPropertiesSchema as Ft, measureMaxCaptionHeight as G, SelectorUnitsSchema as Gt, loadModel3D as H, SelectorBasedOnSchema as Ht, getRegisteredFontSource as I, sampleAudioSpectrumScale as In, GlyphAnchorGroupingSchema as It, parseFBX as J, Spatial3DPropertiesSchema as Jt, mediaDecoderCache as K, SignalRegistry as Kt, getRenderer2D as L, sampleCurveGeometry as Ln, GlyphAnchorPointSchema as Lt, fitSpansToText as M, generatePathSegments as Mn, DynamicStrokePropertiesSchema as Mt, generateExtrudedTextGeometry as N, getScramblePool as Nn, EnhancedTextNodeSchema as Nt, drawSvgNode as O, evaluateSpringProgress as On, AudioSignalComputePipeline as Ot, getHeadlessFontPath as P, getShuffledOrder as Pn, ExpressionSelectorSchema as Pt, poseNodes as Q, TextCursorConfigSchema as Qt, initHeadlessWebGPU as R, samplePathChainGeometry as Rn, KineticMarqueeConfigSchema as Rt, drawCaptionNode as S, evaluateCubicBezier as Sn, AETextAnimatorSchema as St, drawLottieNode as T, evaluateMarqueeOffset as Tn, AnchorGroupingSchema as Tt, loadOBJ as U, SelectorModeSchema as Ut, loadFBX as V, ParticleDissolveConfigSchema as Vt, lutStore as W, SelectorShapeSchema as Wt, parseOBJ as X, TextAnchorConfigSchema as Xt, parseMTL as Y, SpringPhysicsSchema as Yt, parseSvgPathToSegments as Z, TextAnimatorBuilder as Zt, buildShapeSvgPath as _, computeLineLeadingDisplacement as _n, Path3D as _t, GlassPipeline as a, TextSelectorSchema as an, spansText as at, colorMatrixWgsl as b, distanceToCurveParameter as bn, parseColorToRgb as bt, Renderer2D as c, TypewriterAnimatorSchema as cn, trackAudioPitch as ct, ScreenSpaceRelightPipeline as d, Vec2Schema as dn, Camera3D as dt, TextPathBuilder as en, registerHeadlessFont as et, ShadowPipeline as f, VolumetricFormationConfigSchema as fn, ENVIRONMENT_PRESETS as ft, WebGPUAudioProcessor as g, computeAnchorPivotOffset as gn, Matrix4Math as gt, SlugPipeline as h, buildWGSLSignalFn as hn, MAX_LIGHTS as ht, EffectPipeline as i, TextScrambleConfigSchema as in, shaderStore as it, ensureDevice as j, generateArcLengthLUT as jn, CubicBezierSegmentSchema as jt, drawVideoNode as k, evaluateTypewriterState as kn, AudioSpectrumTypographySchema as kt, Renderer3D as l, TypingCadenceSchema as ln, GetFontAssetUrl as lt, SlugGeometry as m, buildPathLUT as mn, Light3D as mt, AudioLatentTrackCache as n, TextPathSourceSchema as nn, sampleMorphWeights as nt, MotionBlurPipeline as o, TextSignalSelectorSchema as on, srtLoader as ot, SlugFontCache as p, VolumetricFormationModeSchema as pn, LIGHT_UNIFORM_SIZE_BYTES as pt, parseColor as q, SkewPropertiesSchema as qt, AudioMeshDeformPipeline as r, TextRangeSelectorSchema as rn, setRegisteredFontSource as rt, NodeSurfaceProvider as s, TextWigglySelectorSchema as sn, textureCache as st, AudioLatentEngine as t, TextPathOptionsSchema as tn, resolveTextSpans as tt, SSAOPipeline as u, VariableFontAxesSchema as un, resolveMediaSourceUrl as ut, clearAllVideoCache as v, computeRangeSelectorWeight as vn, Vector3Math as vt, drawImageNode as w, evaluateExpressionSelector as wn, AdvancedTextAnimatorSchema as wt, describeGpu as x, ellipseToCubicBeziers as xn, resolveEnvironment as xt, clearHeadlessFonts as y, deterministicWigglyNoise as yn, linearRgb as yt, inputStore as z, signalRegistry as zn, LineSpacingDynamicsSchema as zt };
|
|
41381
|
+
//# sourceMappingURL=dist-CWLLnigL.mjs.map
|