framefields 2.0.2
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/LICENCE +202 -0
- package/README.md +740 -0
- package/dist/audio/index.d.mts +5 -0
- package/dist/audio/index.mjs +14 -0
- package/dist/audio-Dvwwz8xU.d.mts +37 -0
- package/dist/audio-Dvwwz8xU.d.mts.map +1 -0
- package/dist/audio-TAvPwzLR.mjs +214 -0
- package/dist/audio-TAvPwzLR.mjs.map +1 -0
- package/dist/audio-x28ZgQBP.mjs +85 -0
- package/dist/audio-x28ZgQBP.mjs.map +1 -0
- package/dist/chunk-GMkBE123.mjs +47 -0
- package/dist/client-C74hb7fy.mjs +66 -0
- package/dist/client-C74hb7fy.mjs.map +1 -0
- package/dist/dist-1iUYuPct.mjs +1859 -0
- package/dist/dist-1iUYuPct.mjs.map +1 -0
- package/dist/dist-Bx6J0VcM.mjs +1859 -0
- package/dist/dist-Bx6J0VcM.mjs.map +1 -0
- package/dist/dist-C_hjvkdN.mjs +2220 -0
- package/dist/dist-C_hjvkdN.mjs.map +1 -0
- package/dist/dist-DKm2IyEJ.mjs +94 -0
- package/dist/dist-DKm2IyEJ.mjs.map +1 -0
- package/dist/dist-cjs-B5EVqDFp.mjs +85 -0
- package/dist/dist-cjs-B5EVqDFp.mjs.map +1 -0
- package/dist/dist-cjs-BGJkdexX.mjs +437 -0
- package/dist/dist-cjs-BGJkdexX.mjs.map +1 -0
- package/dist/dist-cjs-BKmGCgtm.mjs +9069 -0
- package/dist/dist-cjs-BKmGCgtm.mjs.map +1 -0
- package/dist/dist-cjs-BUc0_kg-.mjs +1091 -0
- package/dist/dist-cjs-BUc0_kg-.mjs.map +1 -0
- package/dist/dist-cjs-BUwe2XhR.mjs +153 -0
- package/dist/dist-cjs-BUwe2XhR.mjs.map +1 -0
- package/dist/dist-cjs-BWgoUCXJ.mjs +137 -0
- package/dist/dist-cjs-BWgoUCXJ.mjs.map +1 -0
- package/dist/dist-cjs-CmZEMtO6.mjs +6 -0
- package/dist/dist-cjs-D7kEM-Mj.mjs +181 -0
- package/dist/dist-cjs-D7kEM-Mj.mjs.map +1 -0
- package/dist/dist-cjs-DFUmy89O.mjs +48 -0
- package/dist/dist-cjs-DFUmy89O.mjs.map +1 -0
- package/dist/dist-cjs-Df7144zM.mjs +209 -0
- package/dist/dist-cjs-Df7144zM.mjs.map +1 -0
- package/dist/dist-cjs-DgxjcvBN.mjs +98 -0
- package/dist/dist-cjs-DgxjcvBN.mjs.map +1 -0
- package/dist/dist-cjs-DsMdld8l.mjs +5015 -0
- package/dist/dist-cjs-DsMdld8l.mjs.map +1 -0
- package/dist/dist-cjs-Dzs5P3K0.mjs +51 -0
- package/dist/dist-cjs-Dzs5P3K0.mjs.map +1 -0
- package/dist/dist-cjs-ECMuIF57.mjs +323 -0
- package/dist/dist-cjs-ECMuIF57.mjs.map +1 -0
- package/dist/dist-cjs-lYvO8aDo.mjs +64 -0
- package/dist/dist-cjs-lYvO8aDo.mjs.map +1 -0
- package/dist/dist-cjs-qEJrwjGk.mjs +66 -0
- package/dist/dist-cjs-qEJrwjGk.mjs.map +1 -0
- package/dist/dist-cjs-x5cwlqA5.mjs +43 -0
- package/dist/dist-cjs-x5cwlqA5.mjs.map +1 -0
- package/dist/dist-gjHmorxL.mjs +27479 -0
- package/dist/dist-gjHmorxL.mjs.map +1 -0
- package/dist/effects/index.d.mts +5 -0
- package/dist/effects/index.mjs +35 -0
- package/dist/effects-CHWORCYd.mjs +811 -0
- package/dist/effects-CHWORCYd.mjs.map +1 -0
- package/dist/event-streams-D-APZ7Ke.mjs +204 -0
- package/dist/event-streams-D-APZ7Ke.mjs.map +1 -0
- package/dist/fonts/index.d.mts +2 -0
- package/dist/fonts/index.mjs +3 -0
- package/dist/fonts-DrGTBJJk.mjs +188 -0
- package/dist/fonts-DrGTBJJk.mjs.map +1 -0
- package/dist/index-B0BNPEoH.d.mts +2117 -0
- package/dist/index-B0BNPEoH.d.mts.map +1 -0
- package/dist/index-BMVVmc4G.d.mts +72 -0
- package/dist/index-BMVVmc4G.d.mts.map +1 -0
- package/dist/index-D1ZsMpke.d.mts +264 -0
- package/dist/index-D1ZsMpke.d.mts.map +1 -0
- package/dist/index-D2jDC7O5.d.mts +3643 -0
- package/dist/index-D2jDC7O5.d.mts.map +1 -0
- package/dist/index-D2wJqSl5.d.mts +114 -0
- package/dist/index-D2wJqSl5.d.mts.map +1 -0
- package/dist/index-DKFGNyMB.d.mts +309 -0
- package/dist/index-DKFGNyMB.d.mts.map +1 -0
- package/dist/index-DiSKzDGR.d.mts +65 -0
- package/dist/index-DiSKzDGR.d.mts.map +1 -0
- package/dist/index.d.mts +4425 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2623 -0
- package/dist/index.mjs.map +1 -0
- package/dist/package-C58KmGKw.mjs +6 -0
- package/dist/package-C58KmGKw.mjs.map +1 -0
- package/dist/preview/index.d.mts +90 -0
- package/dist/preview/index.d.mts.map +1 -0
- package/dist/preview/index.mjs +15 -0
- package/dist/preview-engine/audio.mjs +1 -0
- package/dist/preview-engine/child_process-AIL2NBWS.mjs +1 -0
- package/dist/preview-engine/chunk-24P6DAB3.mjs +1 -0
- package/dist/preview-engine/chunk-37EFVZWT.mjs +1 -0
- package/dist/preview-engine/chunk-3O5OKR6D.mjs +223 -0
- package/dist/preview-engine/chunk-47VT677S.mjs +8 -0
- package/dist/preview-engine/chunk-4BEJJKEU.mjs +315 -0
- package/dist/preview-engine/chunk-4GEWSUX5.mjs +1 -0
- package/dist/preview-engine/chunk-55CCFPUX.mjs +237 -0
- package/dist/preview-engine/chunk-5JD65JSJ.mjs +110 -0
- package/dist/preview-engine/chunk-5UP7FSGT.mjs +294 -0
- package/dist/preview-engine/chunk-5XDHHOF2.mjs +367 -0
- package/dist/preview-engine/chunk-6YJP57MZ.mjs +729 -0
- package/dist/preview-engine/chunk-6ZOXGAYA.mjs +112 -0
- package/dist/preview-engine/chunk-AOLAHYVV.mjs +529 -0
- package/dist/preview-engine/chunk-B6PLCMBM.mjs +1 -0
- package/dist/preview-engine/chunk-BJKH76OM.mjs +264 -0
- package/dist/preview-engine/chunk-BUIQ5TUH.mjs +104 -0
- package/dist/preview-engine/chunk-BVF64D6H.mjs +1 -0
- package/dist/preview-engine/chunk-CA5N7JRZ.mjs +138 -0
- package/dist/preview-engine/chunk-CNSHAFEA.mjs +1 -0
- package/dist/preview-engine/chunk-CURR5X7D.mjs +1 -0
- package/dist/preview-engine/chunk-CVGM2U4J.mjs +47 -0
- package/dist/preview-engine/chunk-CYY366IE.mjs +1 -0
- package/dist/preview-engine/chunk-D5PHI6ET.mjs +109 -0
- package/dist/preview-engine/chunk-D7MZHP2Y.mjs +275 -0
- package/dist/preview-engine/chunk-DPPH3NK2.mjs +182 -0
- package/dist/preview-engine/chunk-DPST2XLC.mjs +418 -0
- package/dist/preview-engine/chunk-DRLEOHN5.mjs +1 -0
- package/dist/preview-engine/chunk-EDIZNO3P.mjs +1 -0
- package/dist/preview-engine/chunk-EHIIT4ZR.mjs +52 -0
- package/dist/preview-engine/chunk-FKZ4XXPE.mjs +1 -0
- package/dist/preview-engine/chunk-G3HW4VER.mjs +60 -0
- package/dist/preview-engine/chunk-G76HSKOS.mjs +184 -0
- package/dist/preview-engine/chunk-GYG2IIBR.mjs +1 -0
- package/dist/preview-engine/chunk-H2F5NVQ6.mjs +63 -0
- package/dist/preview-engine/chunk-H5BPCY7N.mjs +188 -0
- package/dist/preview-engine/chunk-HAXK42HG.mjs +997 -0
- package/dist/preview-engine/chunk-HXMDPMLB.mjs +1 -0
- package/dist/preview-engine/chunk-HYBAPT6I.mjs +1 -0
- package/dist/preview-engine/chunk-I4FH6HYU.mjs +73 -0
- package/dist/preview-engine/chunk-IYVN2QEL.mjs +1 -0
- package/dist/preview-engine/chunk-JPXQPP6J.mjs +1 -0
- package/dist/preview-engine/chunk-JWNHTRED.mjs +164 -0
- package/dist/preview-engine/chunk-KZOLCZIV.mjs +103 -0
- package/dist/preview-engine/chunk-L62MRHGZ.mjs +89 -0
- package/dist/preview-engine/chunk-LEEZXHQO.mjs +117 -0
- package/dist/preview-engine/chunk-LKYN3BM2.mjs +1 -0
- package/dist/preview-engine/chunk-LP3EP33S.mjs +610 -0
- package/dist/preview-engine/chunk-M2GRYRLM.mjs +111 -0
- package/dist/preview-engine/chunk-MC7TZZLD.mjs +134 -0
- package/dist/preview-engine/chunk-MT2DZQHO.mjs +1 -0
- package/dist/preview-engine/chunk-MTJHQATU.mjs +1 -0
- package/dist/preview-engine/chunk-N4LHIPHZ.mjs +340 -0
- package/dist/preview-engine/chunk-N4PWLBZ7.mjs +5 -0
- package/dist/preview-engine/chunk-NQZKBFC6.mjs +40 -0
- package/dist/preview-engine/chunk-NWRSVVTF.mjs +186 -0
- package/dist/preview-engine/chunk-P3HBP725.mjs +1 -0
- package/dist/preview-engine/chunk-PIAJWALT.mjs +1 -0
- package/dist/preview-engine/chunk-PJ3DVG45.mjs +1 -0
- package/dist/preview-engine/chunk-QP2NI4XD.mjs +82 -0
- package/dist/preview-engine/chunk-SA3JUR6D.mjs +52 -0
- package/dist/preview-engine/chunk-SRT2OCQW.mjs +1 -0
- package/dist/preview-engine/chunk-SWD76532.mjs +98 -0
- package/dist/preview-engine/chunk-SXX7HX34.mjs +191 -0
- package/dist/preview-engine/chunk-SZ7YRPKO.mjs +3 -0
- package/dist/preview-engine/chunk-TMRLZV5X.mjs +1 -0
- package/dist/preview-engine/chunk-U446SQP3.mjs +292 -0
- package/dist/preview-engine/chunk-UDNCEHUI.mjs +141 -0
- package/dist/preview-engine/chunk-V3H7WWOT.mjs +271 -0
- package/dist/preview-engine/chunk-V7ZVVUQU.mjs +108 -0
- package/dist/preview-engine/chunk-VJGK7MLJ.mjs +3 -0
- package/dist/preview-engine/chunk-VSSB73UU.mjs +58 -0
- package/dist/preview-engine/chunk-VXUJWPIK.mjs +1 -0
- package/dist/preview-engine/chunk-XD4GKD6H.mjs +5 -0
- package/dist/preview-engine/chunk-XKO4RYKN.mjs +3 -0
- package/dist/preview-engine/chunk-XOEEGC4Z.mjs +1 -0
- package/dist/preview-engine/chunk-YAQFFQPG.mjs +1 -0
- package/dist/preview-engine/chunk-YKMBRUAE.mjs +1 -0
- package/dist/preview-engine/chunk-YSTLMWCG.mjs +1 -0
- package/dist/preview-engine/chunk-Z4ERCLNF.mjs +1 -0
- package/dist/preview-engine/chunk-ZEYUXJIV.mjs +1 -0
- package/dist/preview-engine/chunk-ZX6APG6E.mjs +117 -0
- package/dist/preview-engine/effects.mjs +1 -0
- package/dist/preview-engine/esbuild-GWV7CM7D.mjs +1 -0
- package/dist/preview-engine/fonts.mjs +1 -0
- package/dist/preview-engine/framefields.mjs +1959 -0
- package/dist/preview-engine/onnxruntime-node-56GSZEH3.mjs +1 -0
- package/dist/preview-engine/player.mjs +155 -0
- package/dist/preview-engine/renderers-2AUSIYZN.mjs +1 -0
- package/dist/preview-engine/renderers-2QN6KZJP.mjs +1 -0
- package/dist/preview-engine/renderers-32SKW7ML.mjs +1 -0
- package/dist/preview-engine/renderers-5QYK6766.mjs +1 -0
- package/dist/preview-engine/renderers-6BJA6MSU.mjs +251 -0
- package/dist/preview-engine/renderers-6QAF3LQ2.mjs +1 -0
- package/dist/preview-engine/renderers-7AO5746S.mjs +296 -0
- package/dist/preview-engine/renderers-AFYKNM6N.mjs +1 -0
- package/dist/preview-engine/renderers-AGMH5CRH.mjs +1 -0
- package/dist/preview-engine/renderers-AHSGP6LY.mjs +126 -0
- package/dist/preview-engine/renderers-ASTBICLA.mjs +1 -0
- package/dist/preview-engine/renderers-BHVPLYNN.mjs +1 -0
- package/dist/preview-engine/renderers-D7PVQFVU.mjs +1 -0
- package/dist/preview-engine/renderers-DB4ABTNA.mjs +1 -0
- package/dist/preview-engine/renderers-F2NFJI5L.mjs +1 -0
- package/dist/preview-engine/renderers-FI7YHNLY.mjs +1 -0
- package/dist/preview-engine/renderers-GBHULMPH.mjs +1 -0
- package/dist/preview-engine/renderers-GUKQUMGG.mjs +55 -0
- package/dist/preview-engine/renderers-HGT7QDY3.mjs +1 -0
- package/dist/preview-engine/renderers-HOYLA7ZK.mjs +1 -0
- package/dist/preview-engine/renderers-KKI2D3MZ.mjs +1 -0
- package/dist/preview-engine/renderers-KRAJNV4E.mjs +1 -0
- package/dist/preview-engine/renderers-KUGZKSVE.mjs +1 -0
- package/dist/preview-engine/renderers-L2EQQIOC.mjs +1 -0
- package/dist/preview-engine/renderers-LK3NRMGR.mjs +1 -0
- package/dist/preview-engine/renderers-LX654SZ3.mjs +1 -0
- package/dist/preview-engine/renderers-MCFQFYEL.mjs +1 -0
- package/dist/preview-engine/renderers-O6HOYIPS.mjs +1 -0
- package/dist/preview-engine/renderers-OEVXCGE2.mjs +1 -0
- package/dist/preview-engine/renderers-QVD6C4CS.mjs +1 -0
- package/dist/preview-engine/renderers-R3XEYD5V.mjs +248 -0
- package/dist/preview-engine/renderers-RBFWJWVM.mjs +1 -0
- package/dist/preview-engine/renderers-RX3VLVLO.mjs +1 -0
- package/dist/preview-engine/renderers-SM6JP64K.mjs +1 -0
- package/dist/preview-engine/renderers-TKMAATVS.mjs +1 -0
- package/dist/preview-engine/renderers-UGZUPONY.mjs +1 -0
- package/dist/preview-engine/renderers-UTFXZE3G.mjs +1 -0
- package/dist/preview-engine/renderers-UWPH7HBH.mjs +1 -0
- package/dist/preview-engine/renderers-UZGECFVO.mjs +1 -0
- package/dist/preview-engine/renderers-VGU3LNLT.mjs +1 -0
- package/dist/preview-engine/renderers-W3VVM5HB.mjs +1 -0
- package/dist/preview-engine/renderers-WJUTT5BB.mjs +1 -0
- package/dist/preview-engine/renderers-XA2M4YXK.mjs +1 -0
- package/dist/preview-engine/renderers-XIHRFEFQ.mjs +1 -0
- package/dist/preview-engine/renderers-XJTA5MFG.mjs +1 -0
- package/dist/preview-engine/renderers-XLTY5APF.mjs +1 -0
- package/dist/preview-engine/renderers-XZ3VXFGZ.mjs +1 -0
- package/dist/preview-engine/renderers-YKUQUCTO.mjs +124 -0
- package/dist/preview-engine/renderers-YVN3EIOP.mjs +1 -0
- package/dist/preview-engine/renderers-YWRP23SZ.mjs +125 -0
- package/dist/preview-engine/renderers-ZPWOUWZJ.mjs +120 -0
- package/dist/preview-engine/resvg-js-VMU4A77S.mjs +1 -0
- package/dist/preview-engine/server-utils-2FAIV45N.mjs +1 -0
- package/dist/preview-engine/sharp-V6ZTBNDW.mjs +1 -0
- package/dist/preview-engine/shims/fs-promises.mjs +1 -0
- package/dist/preview-engine/shims/fs.mjs +1 -0
- package/dist/preview-engine/shims/module.mjs +1 -0
- package/dist/preview-engine/shims/os.mjs +1 -0
- package/dist/preview-engine/shims/path.mjs +1 -0
- package/dist/preview-engine/shims/url.mjs +1 -0
- package/dist/preview-engine/signals.mjs +1 -0
- package/dist/preview-engine/webgpu-NSSANM4F.mjs +1 -0
- package/dist/preview-uQM210iy.mjs +2149 -0
- package/dist/preview-uQM210iy.mjs.map +1 -0
- package/dist/program-Dl510wmI.mjs +5183 -0
- package/dist/program-Dl510wmI.mjs.map +1 -0
- package/dist/renderer/index.d.mts +3 -0
- package/dist/renderer/index.mjs +6 -0
- package/dist/renderer-3BNskNuJ.mjs +3 -0
- package/dist/renderer-7DOcIxFG.mjs +288 -0
- package/dist/renderer-7DOcIxFG.mjs.map +1 -0
- package/dist/renderer-9dHlMQGX.mjs +3 -0
- package/dist/renderer-B1CvhW4p.mjs +677 -0
- package/dist/renderer-B1CvhW4p.mjs.map +1 -0
- package/dist/renderer-B2XzjK0z.mjs +3 -0
- package/dist/renderer-B80s47yo.mjs +166 -0
- package/dist/renderer-B80s47yo.mjs.map +1 -0
- package/dist/renderer-B9-QSJcG.mjs +479 -0
- package/dist/renderer-B9-QSJcG.mjs.map +1 -0
- package/dist/renderer-BAQmR0Zo.mjs +3 -0
- package/dist/renderer-BDLnExoP.mjs +127 -0
- package/dist/renderer-BDLnExoP.mjs.map +1 -0
- package/dist/renderer-BGXU6vcW.mjs +270 -0
- package/dist/renderer-BGXU6vcW.mjs.map +1 -0
- package/dist/renderer-BGvORwkQ.mjs +3 -0
- package/dist/renderer-BLikd6BK.mjs +3 -0
- package/dist/renderer-BMovYRoR.mjs +3 -0
- package/dist/renderer-BQHbp-Sp.mjs +243 -0
- package/dist/renderer-BQHbp-Sp.mjs.map +1 -0
- package/dist/renderer-BREIjsUU.mjs +252 -0
- package/dist/renderer-BREIjsUU.mjs.map +1 -0
- package/dist/renderer-BSbTJBWc.mjs +3 -0
- package/dist/renderer-BTu2EVhF.mjs +3 -0
- package/dist/renderer-BU1rwNRT.mjs +3 -0
- package/dist/renderer-BXMmISWG.mjs +499 -0
- package/dist/renderer-BXMmISWG.mjs.map +1 -0
- package/dist/renderer-BZJm3m4f.mjs +3 -0
- package/dist/renderer-B_NuVaIP.mjs +744 -0
- package/dist/renderer-B_NuVaIP.mjs.map +1 -0
- package/dist/renderer-BfJSUjPN.mjs +3 -0
- package/dist/renderer-BqyAgNt3.mjs +3 -0
- package/dist/renderer-BryTM2g7.mjs +3 -0
- package/dist/renderer-BsgIcBKH.mjs +391 -0
- package/dist/renderer-BsgIcBKH.mjs.map +1 -0
- package/dist/renderer-ByDhfrPE.mjs +422 -0
- package/dist/renderer-ByDhfrPE.mjs.map +1 -0
- package/dist/renderer-C-H680_l.mjs +3 -0
- package/dist/renderer-C17wL9QX.mjs +181 -0
- package/dist/renderer-C17wL9QX.mjs.map +1 -0
- package/dist/renderer-C2n-EHxg.mjs +1 -0
- package/dist/renderer-CB5aWAaf.mjs +343 -0
- package/dist/renderer-CB5aWAaf.mjs.map +1 -0
- package/dist/renderer-CB7lH5K8.mjs +3 -0
- package/dist/renderer-CDLrNgfo.mjs +3 -0
- package/dist/renderer-CDOUAN7X.mjs +454 -0
- package/dist/renderer-CDOUAN7X.mjs.map +1 -0
- package/dist/renderer-CH8sdfYX.mjs +387 -0
- package/dist/renderer-CH8sdfYX.mjs.map +1 -0
- package/dist/renderer-CIvaRnP_.mjs +261 -0
- package/dist/renderer-CIvaRnP_.mjs.map +1 -0
- package/dist/renderer-CMzEjdzi.mjs +369 -0
- package/dist/renderer-CMzEjdzi.mjs.map +1 -0
- package/dist/renderer-COkcU3db.mjs +3302 -0
- package/dist/renderer-COkcU3db.mjs.map +1 -0
- package/dist/renderer-CQCoggIa.mjs +3 -0
- package/dist/renderer-CQdVj2JS.mjs +3 -0
- package/dist/renderer-CQiTodg9.mjs +337 -0
- package/dist/renderer-CQiTodg9.mjs.map +1 -0
- package/dist/renderer-CV2m6k1V.mjs +3 -0
- package/dist/renderer-CYY-poLe.mjs +3 -0
- package/dist/renderer-CZgB5st8.mjs +3 -0
- package/dist/renderer-C_Ki91kc.mjs +3 -0
- package/dist/renderer-CclIvsLO.mjs +3 -0
- package/dist/renderer-Cj-whdVr.mjs +655 -0
- package/dist/renderer-Cj-whdVr.mjs.map +1 -0
- package/dist/renderer-CkykdR_D.mjs +3 -0
- package/dist/renderer-Cl1oUXMi.mjs +1143 -0
- package/dist/renderer-Cl1oUXMi.mjs.map +1 -0
- package/dist/renderer-CmApuKjS.mjs +3 -0
- package/dist/renderer-CpkiHRhh.mjs +269 -0
- package/dist/renderer-CpkiHRhh.mjs.map +1 -0
- package/dist/renderer-CszOjcRW.mjs +3 -0
- package/dist/renderer-CtVkU_GA.mjs +44 -0
- package/dist/renderer-CtVkU_GA.mjs.map +1 -0
- package/dist/renderer-Cu074POw.mjs +3 -0
- package/dist/renderer-CwQhzcUn.mjs +644 -0
- package/dist/renderer-CwQhzcUn.mjs.map +1 -0
- package/dist/renderer-CzPWB0Ss.mjs +273 -0
- package/dist/renderer-CzPWB0Ss.mjs.map +1 -0
- package/dist/renderer-D4qLmox-.mjs +3 -0
- package/dist/renderer-D6bWQtr-.mjs +3 -0
- package/dist/renderer-D6cJ6MSq.mjs +3 -0
- package/dist/renderer-D7EX8IjU.mjs +240 -0
- package/dist/renderer-D7EX8IjU.mjs.map +1 -0
- package/dist/renderer-DDp7_TUi.d.mts +10 -0
- package/dist/renderer-DDp7_TUi.d.mts.map +1 -0
- package/dist/renderer-DFKsLrUs.mjs +256 -0
- package/dist/renderer-DFKsLrUs.mjs.map +1 -0
- package/dist/renderer-DPSsf8-t.mjs +3 -0
- package/dist/renderer-DQLGnEFc.mjs +3 -0
- package/dist/renderer-DY2SVYUW.mjs +3 -0
- package/dist/renderer-DZGtBUCx.mjs +792 -0
- package/dist/renderer-DZGtBUCx.mjs.map +1 -0
- package/dist/renderer-DabG62XS.mjs +406 -0
- package/dist/renderer-DabG62XS.mjs.map +1 -0
- package/dist/renderer-DbaQLI4z.mjs +771 -0
- package/dist/renderer-DbaQLI4z.mjs.map +1 -0
- package/dist/renderer-DjI45OYC.mjs +71 -0
- package/dist/renderer-DjI45OYC.mjs.map +1 -0
- package/dist/renderer-Dm08-hAU.mjs +323 -0
- package/dist/renderer-Dm08-hAU.mjs.map +1 -0
- package/dist/renderer-DoAY5JbB.mjs +4 -0
- package/dist/renderer-Dp_FfvF-.mjs +401 -0
- package/dist/renderer-Dp_FfvF-.mjs.map +1 -0
- package/dist/renderer-Dt6fzgX5.mjs +756 -0
- package/dist/renderer-Dt6fzgX5.mjs.map +1 -0
- package/dist/renderer-DuplLRbp.mjs +3 -0
- package/dist/renderer-DvfUbZ31.mjs +3 -0
- package/dist/renderer-DxjVQV6f.mjs +311 -0
- package/dist/renderer-DxjVQV6f.mjs.map +1 -0
- package/dist/renderer-Fco4EmAu.mjs +23868 -0
- package/dist/renderer-Fco4EmAu.mjs.map +1 -0
- package/dist/renderer-HFfcJlmR.mjs +981 -0
- package/dist/renderer-HFfcJlmR.mjs.map +1 -0
- package/dist/renderer-I-Sw3JBB.mjs +145 -0
- package/dist/renderer-I-Sw3JBB.mjs.map +1 -0
- package/dist/renderer-OWQmmg4Z.mjs +697 -0
- package/dist/renderer-OWQmmg4Z.mjs.map +1 -0
- package/dist/renderer-Q_uUQipO.mjs +3 -0
- package/dist/renderer-Ryo2CEFD.mjs +586 -0
- package/dist/renderer-Ryo2CEFD.mjs.map +1 -0
- package/dist/renderer-Tp6OXWNZ.mjs +257 -0
- package/dist/renderer-Tp6OXWNZ.mjs.map +1 -0
- package/dist/renderer-UQFCgeNx.mjs +3 -0
- package/dist/renderer-WkVrkCVA.mjs +83 -0
- package/dist/renderer-WkVrkCVA.mjs.map +1 -0
- package/dist/renderer-XcmYTd6P.mjs +3818 -0
- package/dist/renderer-XcmYTd6P.mjs.map +1 -0
- package/dist/renderer-_uvdg48N.mjs +333 -0
- package/dist/renderer-_uvdg48N.mjs.map +1 -0
- package/dist/renderer-bZU_ndxf.mjs +8 -0
- package/dist/renderer-bZU_ndxf.mjs.map +1 -0
- package/dist/renderer-eMsnzJg9.mjs +3 -0
- package/dist/renderer-ho_jXJ0H.mjs +254 -0
- package/dist/renderer-ho_jXJ0H.mjs.map +1 -0
- package/dist/renderer-k2JL79kM.mjs +306 -0
- package/dist/renderer-k2JL79kM.mjs.map +1 -0
- package/dist/renderer-pHiz78e0.mjs +3 -0
- package/dist/renderer-pxXf9dvk.mjs +394 -0
- package/dist/renderer-pxXf9dvk.mjs.map +1 -0
- package/dist/renderer-vCFTm0oe.mjs +226 -0
- package/dist/renderer-vCFTm0oe.mjs.map +1 -0
- package/dist/renderer-vvpdx1vk.mjs +379 -0
- package/dist/renderer-vvpdx1vk.mjs.map +1 -0
- package/dist/renderer-x2s9LmVL.mjs +1121 -0
- package/dist/renderer-x2s9LmVL.mjs.map +1 -0
- package/dist/renderers-BWg16W-V-BXG_cjhM.mjs +49 -0
- package/dist/renderers-BWg16W-V-BXG_cjhM.mjs.map +1 -0
- package/dist/signals/index.d.mts +7 -0
- package/dist/signals/index.mjs +10 -0
- package/dist/signals-BwbdO3AN.mjs +224 -0
- package/dist/signals-BwbdO3AN.mjs.map +1 -0
- package/dist/signin-CZj4Oc5s.mjs +865 -0
- package/dist/signin-CZj4Oc5s.mjs.map +1 -0
- package/dist/sso-oidc-C0_31ThY.mjs +1051 -0
- package/dist/sso-oidc-C0_31ThY.mjs.map +1 -0
- package/dist/sts-DD4ggEXC.mjs +6 -0
- package/dist/sts-nXw8RDJI.mjs +1395 -0
- package/dist/sts-nXw8RDJI.mjs.map +1 -0
- package/package.json +173 -0
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
import{e as O}from"./chunk-BVF64D6H.mjs";O();var _e=`
|
|
2
|
+
struct BiquadUniforms {
|
|
3
|
+
b0 : f32,
|
|
4
|
+
b1 : f32,
|
|
5
|
+
b2 : f32,
|
|
6
|
+
a1 : f32,
|
|
7
|
+
a2 : f32,
|
|
8
|
+
numSamples : u32,
|
|
9
|
+
pad1 : f32,
|
|
10
|
+
pad2 : f32,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
@group(0) @binding(0) var<uniform> u : BiquadUniforms;
|
|
14
|
+
@group(0) @binding(1) var<storage, read> inAudio : array<f32>;
|
|
15
|
+
@group(0) @binding(2) var<storage, read_write> outAudio : array<f32>;
|
|
16
|
+
|
|
17
|
+
@compute @workgroup_size(1)
|
|
18
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
19
|
+
if (gid.x != 0u) { return; }
|
|
20
|
+
|
|
21
|
+
var x1 = 0.0f;
|
|
22
|
+
var x2 = 0.0f;
|
|
23
|
+
var y1 = 0.0f;
|
|
24
|
+
var y2 = 0.0f;
|
|
25
|
+
|
|
26
|
+
let total = u.numSamples;
|
|
27
|
+
for (var i = 0u; i < total; i = i + 1u) {
|
|
28
|
+
let x0 = inAudio[i];
|
|
29
|
+
let y0 = u.b0 * x0 + u.b1 * x1 + u.b2 * x2 - u.a1 * y1 - u.a2 * y2;
|
|
30
|
+
|
|
31
|
+
x2 = x1;
|
|
32
|
+
x1 = x0;
|
|
33
|
+
y2 = y1;
|
|
34
|
+
y1 = y0;
|
|
35
|
+
|
|
36
|
+
outAudio[i] = y0;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
`,ye=`
|
|
40
|
+
struct FeatureUniforms {
|
|
41
|
+
sampleRate : f32,
|
|
42
|
+
numSamples : u32,
|
|
43
|
+
numFrames : u32,
|
|
44
|
+
hopSize : u32,
|
|
45
|
+
windowSize : u32,
|
|
46
|
+
attackAlpha : f32,
|
|
47
|
+
releaseAlpha : f32,
|
|
48
|
+
sensitivity : f32,
|
|
49
|
+
noiseFloorDb : f32,
|
|
50
|
+
dynamicRangeDb : f32,
|
|
51
|
+
curveType : u32, // 0=linear, 1=exp, 2=log, 3=sqr, 4=smoothstep
|
|
52
|
+
beatThreshold : f32,
|
|
53
|
+
beatDecayAlpha : f32,
|
|
54
|
+
extractionMode : u32, // 0=rms, 1=beat, 2=bass, 3=energy, etc.
|
|
55
|
+
pad0 : f32,
|
|
56
|
+
pad1 : f32,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
@group(0) @binding(0) var<uniform> u : FeatureUniforms;
|
|
60
|
+
@group(0) @binding(1) var<storage, read> rawAudio : array<f32>;
|
|
61
|
+
@group(0) @binding(2) var<storage, read> bassAudio : array<f32>;
|
|
62
|
+
@group(0) @binding(3) var<storage, read_write> outPrimary : array<f32>;
|
|
63
|
+
@group(0) @binding(4) var<storage, read_write> outBeat : array<f32>;
|
|
64
|
+
@group(0) @binding(5) var<storage, read_write> outBass : array<f32>;
|
|
65
|
+
@group(0) @binding(6) var<storage, read_write> outEnergy : array<f32>;
|
|
66
|
+
@group(0) @binding(7) var<storage, read_write> outStats : array<f32>;
|
|
67
|
+
|
|
68
|
+
fn applyCurve(v: f32, curve: u32) -> f32 {
|
|
69
|
+
let cv = clamp(v, 0.0f, 1.0f);
|
|
70
|
+
if (curve == 1u) { // Exponential
|
|
71
|
+
return cv * cv;
|
|
72
|
+
}
|
|
73
|
+
if (curve == 2u) { // Logarithmic
|
|
74
|
+
return log(1.0f + 9.0f * cv) / log(10.0f);
|
|
75
|
+
}
|
|
76
|
+
if (curve == 3u) { // Square
|
|
77
|
+
return cv * cv * cv;
|
|
78
|
+
}
|
|
79
|
+
if (curve == 4u) { // Smoothstep
|
|
80
|
+
return cv * cv * (3.0f - 2.0f * cv);
|
|
81
|
+
}
|
|
82
|
+
return cv; // Linear
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn scaleDbToNormalized(rms: f32) -> f32 {
|
|
86
|
+
let eps = 1e-6f;
|
|
87
|
+
let safeRms = max(rms * u.sensitivity, eps);
|
|
88
|
+
let db = 20.0f * log(safeRms) / log(10.0f);
|
|
89
|
+
let minDb = u.noiseFloorDb;
|
|
90
|
+
let maxDb = u.noiseFloorDb + u.dynamicRangeDb;
|
|
91
|
+
let norm = clamp((db - minDb) / (maxDb - minDb), 0.0f, 1.0f);
|
|
92
|
+
return norm;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@compute @workgroup_size(1)
|
|
96
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
97
|
+
if (gid.x != 0u) { return; }
|
|
98
|
+
|
|
99
|
+
var envFollower = 0.0f;
|
|
100
|
+
var bassFollower = 0.0f;
|
|
101
|
+
var prevBassEnergy = 0.0f;
|
|
102
|
+
var beatEnvelope = 0.0f;
|
|
103
|
+
|
|
104
|
+
let numFrames = u.numFrames;
|
|
105
|
+
let numSamples = u.numSamples;
|
|
106
|
+
let halfWin = u.windowSize / 2u;
|
|
107
|
+
|
|
108
|
+
var minEnergy = 1e6f;
|
|
109
|
+
var maxEnergy = -1e6f;
|
|
110
|
+
var minBass = 1e6f;
|
|
111
|
+
var maxBass = -1e6f;
|
|
112
|
+
var minBeat = 1e6f;
|
|
113
|
+
var maxBeat = -1e6f;
|
|
114
|
+
var minPrimary = 1e6f;
|
|
115
|
+
var maxPrimary = -1e6f;
|
|
116
|
+
|
|
117
|
+
for (var f = 0u; f < numFrames; f = f + 1u) {
|
|
118
|
+
let centerSample = f * u.hopSize;
|
|
119
|
+
let startSample = select(0u, centerSample - halfWin, centerSample >= halfWin);
|
|
120
|
+
let endSample = min(numSamples, centerSample + halfWin);
|
|
121
|
+
|
|
122
|
+
var sumSq = 0.0f;
|
|
123
|
+
var sumBassSq = 0.0f;
|
|
124
|
+
var count = 0.0f;
|
|
125
|
+
|
|
126
|
+
for (var s = startSample; s < endSample; s = s + 1u) {
|
|
127
|
+
let val = rawAudio[s];
|
|
128
|
+
let bVal = bassAudio[s];
|
|
129
|
+
sumSq = sumSq + val * val;
|
|
130
|
+
sumBassSq = sumBassSq + bVal * bVal;
|
|
131
|
+
count = count + 1.0f;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
let effectiveCount = max(count, 1.0f);
|
|
135
|
+
let rms = sqrt(sumSq / effectiveCount);
|
|
136
|
+
let bassRms = sqrt(sumBassSq / effectiveCount);
|
|
137
|
+
|
|
138
|
+
let normRms = scaleDbToNormalized(rms);
|
|
139
|
+
let normBass = scaleDbToNormalized(bassRms);
|
|
140
|
+
|
|
141
|
+
// Ballistics envelope follower (Attack / Release)
|
|
142
|
+
let alpha = select(u.releaseAlpha, u.attackAlpha, normRms > envFollower);
|
|
143
|
+
envFollower = envFollower + alpha * (normRms - envFollower);
|
|
144
|
+
|
|
145
|
+
let bassAlpha = select(u.releaseAlpha, u.attackAlpha, normBass > bassFollower);
|
|
146
|
+
bassFollower = bassFollower + bassAlpha * (normBass - bassFollower);
|
|
147
|
+
|
|
148
|
+
// Spectral flux / Onset detection on bass energy
|
|
149
|
+
let flux = max(0.0f, bassFollower - prevBassEnergy);
|
|
150
|
+
prevBassEnergy = bassFollower;
|
|
151
|
+
|
|
152
|
+
// Beat pulse triggering and exponential decay
|
|
153
|
+
beatEnvelope = beatEnvelope * u.beatDecayAlpha;
|
|
154
|
+
if (flux > u.beatThreshold) {
|
|
155
|
+
let hit = clamp((flux - u.beatThreshold) / max(0.01f, 0.15f - u.beatThreshold), 0.6f, 1.0f);
|
|
156
|
+
beatEnvelope = max(beatEnvelope, hit);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let finalEnergy = applyCurve(envFollower, u.curveType);
|
|
160
|
+
let finalBass = applyCurve(bassFollower, u.curveType);
|
|
161
|
+
let finalBeat = applyCurve(beatEnvelope, u.curveType);
|
|
162
|
+
|
|
163
|
+
var finalPrimary = finalEnergy;
|
|
164
|
+
if (u.extractionMode == 1u) { // transient_beat
|
|
165
|
+
finalPrimary = finalBeat;
|
|
166
|
+
} else if (u.extractionMode == 2u || u.extractionMode == 3u) { // sub_bass or bass
|
|
167
|
+
finalPrimary = finalBass;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
minEnergy = min(minEnergy, finalEnergy);
|
|
171
|
+
maxEnergy = max(maxEnergy, finalEnergy);
|
|
172
|
+
minBass = min(minBass, finalBass);
|
|
173
|
+
maxBass = max(maxBass, finalBass);
|
|
174
|
+
minBeat = min(minBeat, finalBeat);
|
|
175
|
+
maxBeat = max(maxBeat, finalBeat);
|
|
176
|
+
minPrimary = min(minPrimary, finalPrimary);
|
|
177
|
+
maxPrimary = max(maxPrimary, finalPrimary);
|
|
178
|
+
|
|
179
|
+
outPrimary[f] = finalPrimary;
|
|
180
|
+
outBeat[f] = finalBeat;
|
|
181
|
+
outBass[f] = finalBass;
|
|
182
|
+
outEnergy[f] = finalEnergy;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (numFrames > 0u) {
|
|
186
|
+
outStats[0] = minPrimary;
|
|
187
|
+
outStats[1] = select(maxPrimary, minPrimary + 1.0f, maxPrimary <= minPrimary + 1e-5f);
|
|
188
|
+
outStats[2] = minBeat;
|
|
189
|
+
outStats[3] = select(maxBeat, minBeat + 1.0f, maxBeat <= minBeat + 1e-5f);
|
|
190
|
+
outStats[4] = minBass;
|
|
191
|
+
outStats[5] = select(maxBass, minBass + 1.0f, maxBass <= minBass + 1e-5f);
|
|
192
|
+
outStats[6] = minEnergy;
|
|
193
|
+
outStats[7] = select(maxEnergy, minEnergy + 1.0f, maxEnergy <= minEnergy + 1e-5f);
|
|
194
|
+
} else {
|
|
195
|
+
outStats[0] = 0.0f;
|
|
196
|
+
outStats[1] = 1.0f;
|
|
197
|
+
outStats[2] = 0.0f;
|
|
198
|
+
outStats[3] = 1.0f;
|
|
199
|
+
outStats[4] = 0.0f;
|
|
200
|
+
outStats[5] = 1.0f;
|
|
201
|
+
outStats[6] = 0.0f;
|
|
202
|
+
outStats[7] = 1.0f;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
`,ve=`
|
|
206
|
+
struct TexturePackUniforms {
|
|
207
|
+
numFrames : u32,
|
|
208
|
+
texWidth : u32,
|
|
209
|
+
pad1 : f32,
|
|
210
|
+
pad2 : f32,
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
@group(0) @binding(0) var<uniform> u : TexturePackUniforms;
|
|
214
|
+
@group(0) @binding(1) var<storage, read> inPrimary : array<f32>;
|
|
215
|
+
@group(0) @binding(2) var<storage, read> inBeat : array<f32>;
|
|
216
|
+
@group(0) @binding(3) var<storage, read> inBass : array<f32>;
|
|
217
|
+
@group(0) @binding(4) var<storage, read> inEnergy : array<f32>;
|
|
218
|
+
@group(0) @binding(5) var outTex : texture_storage_2d<rgba16float, write>;
|
|
219
|
+
|
|
220
|
+
@compute @workgroup_size(64)
|
|
221
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
222
|
+
let x = gid.x;
|
|
223
|
+
if (x >= u.texWidth) { return; }
|
|
224
|
+
|
|
225
|
+
let progress = f32(x) / f32(u.texWidth - 1u);
|
|
226
|
+
let frameFloat = progress * f32(u.numFrames - 1u);
|
|
227
|
+
let f0 = u32(clamp(floor(frameFloat), 0.0f, f32(u.numFrames - 1u)));
|
|
228
|
+
let f1 = u32(clamp(ceil(frameFloat), 0.0f, f32(u.numFrames - 1u)));
|
|
229
|
+
let weight = fract(frameFloat);
|
|
230
|
+
|
|
231
|
+
let prim = mix(inPrimary[f0], inPrimary[f1], weight);
|
|
232
|
+
let beat = mix(inBeat[f0], inBeat[f1], weight);
|
|
233
|
+
let bass = mix(inBass[f0], inBass[f1], weight);
|
|
234
|
+
let nrg = mix(inEnergy[f0], inEnergy[f1], weight);
|
|
235
|
+
|
|
236
|
+
textureStore(outTex, vec2<i32>(i32(x), 0), vec4<f32>(prim, beat, bass, nrg));
|
|
237
|
+
}
|
|
238
|
+
`,Pe=`
|
|
239
|
+
struct PaceUniforms {
|
|
240
|
+
baseSpeed : f32,
|
|
241
|
+
gain : f32,
|
|
242
|
+
dt : f32,
|
|
243
|
+
numFrames : u32,
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
@group(0) @binding(0) var<uniform> u : PaceUniforms;
|
|
247
|
+
@group(0) @binding(1) var<storage, read> inSignal : array<f32>;
|
|
248
|
+
@group(0) @binding(2) var<storage, read_write> outSourceTimestamps : array<f32>;
|
|
249
|
+
|
|
250
|
+
@compute @workgroup_size(1)
|
|
251
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
252
|
+
if (gid.x != 0u) { return; }
|
|
253
|
+
|
|
254
|
+
var accumulatedTime = 0.0f;
|
|
255
|
+
let total = u.numFrames;
|
|
256
|
+
|
|
257
|
+
for (var f = 0u; f < total; f = f + 1u) {
|
|
258
|
+
let sig = inSignal[f];
|
|
259
|
+
let instantaneousSpeed = max(0.01f, u.baseSpeed + u.gain * sig);
|
|
260
|
+
accumulatedTime = accumulatedTime + instantaneousSpeed * u.dt;
|
|
261
|
+
outSourceTimestamps[f] = accumulatedTime;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
`;function Be(f,e,a){let t=2*Math.PI*e/f,r=Math.sin(t)/(2*a),n=Math.cos(t),s=r,u=0,o=-r,p=1+r,g=-2*n,d=1-r;return{b0:s/p,b1:u/p,b2:o/p,a1:g/p,a2:d/p}}var Se=f=>{switch(f){case"exponential":return 1;case"logarithmic":return 2;case"square":return 3;case"smoothstep":return 4;default:return 0}},we=f=>{switch(f){case"transient_beat":return 1;case"sub_bass":return 2;case"bass":return 3;case"mid":return 4;case"high":return 5;case"spectral_flux":return 6;default:return 0}},Z=class f{static pipelineCache=new WeakMap;static getPipeline(e,a,t){let r=f.pipelineCache.get(e);r||(r=new Map,f.pipelineCache.set(e,r));let n=r.get(a);if(!n){let s=e.createShaderModule({label:`${a}.wgsl`,code:t});n=e.createComputePipeline({label:a,layout:"auto",compute:{module:s,entryPoint:"main"}}),r.set(a,n)}return n}static async extractFeatures(e,a,t,r,n={},s=512){let u=a.length;if(u===0||a[0].length===0)throw new Error("Empty audio buffer supplied to AudioSignalComputePipeline.");let o=a[0].length,p=o/t,g=Math.max(1,Math.ceil(p*r)),d=Math.max(1,Math.round(t/r)),i=Math.max(32,Math.round(d*2)),_=new Float32Array(o);for(let ae=0;ae<u;ae++){let xe=a[ae];for(let Q=0;Q<o;Q++)_[Q]+=xe[Q]/u}let S=e.createBuffer({size:o*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,label:"audio_raw_pcm_buffer"});e.queue.writeBuffer(S,0,_);let l=e.createBuffer({size:o*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,label:"audio_bass_filtered_buffer"}),h=e.createBuffer({size:g*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,label:"audio_primary_signal_buffer"}),y=e.createBuffer({size:g*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,label:"audio_beat_signal_buffer"}),B=e.createBuffer({size:g*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,label:"audio_bass_signal_buffer"}),v=e.createBuffer({size:g*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,label:"audio_energy_signal_buffer"}),b=f.getPipeline(e,"AudioBiquadFilterPipeline",_e),m=Be(t,120,1.2),c=new Float32Array([m.b0,m.b1,m.b2,m.a1,m.a2,0,0,0]);new Uint32Array(c.buffer)[5]=o;let x=e.createBuffer({size:c.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"audio_biquad_uniform_buffer"});e.queue.writeBuffer(x,0,c);let M=e.createBindGroup({layout:b.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:x}},{binding:1,resource:{buffer:S}},{binding:2,resource:{buffer:l}}]}),P=f.getPipeline(e,"AudioFeatureExtractionPipeline",ye),U=n.attackMs??10,A=n.releaseMs??120,$=1-Math.exp(-1/(U/1e3*r)),G=1-Math.exp(-1/(A/1e3*r)),w=n.beatDecayMs??80,F=Math.exp(-1/(w/1e3*r)),T=n.noiseFloorDb??-48,R=n.dynamicRangeDb??48,D=new ArrayBuffer(64),E=new Float32Array(D),k=new Uint32Array(D);E[0]=t,k[1]=o,k[2]=g,k[3]=d,k[4]=i,E[5]=$,E[6]=G,E[7]=n.sensitivity??1,E[8]=T,E[9]=R,k[10]=Se(n.curve),E[11]=n.beatThreshold??.08,E[12]=F,k[13]=we(n.extractionMode),E[14]=0,E[15]=0;let q=e.createBuffer({size:D.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"audio_feature_uniform_buffer"});e.queue.writeBuffer(q,0,D);let N=e.createBuffer({size:32,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,label:"audio_feature_stats_buffer"}),W=e.createBuffer({size:32,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST,label:"audio_feature_stats_read_buffer"}),pe=e.createBindGroup({layout:P.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:q}},{binding:1,resource:{buffer:S}},{binding:2,resource:{buffer:l}},{binding:3,resource:{buffer:h}},{binding:4,resource:{buffer:y}},{binding:5,resource:{buffer:B}},{binding:6,resource:{buffer:v}},{binding:7,resource:{buffer:N}}]}),ee=Math.max(s,128),te=e.createTexture({size:[ee,1,1],format:"rgba16float",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST,label:"audio_extracted_signal_texture"}),oe=f.getPipeline(e,"AudioTexturePackPipeline",ve),le=new Uint32Array([g,ee,0,0]),re=e.createBuffer({size:le.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"audio_pack_uniform_buffer"});e.queue.writeBuffer(re,0,le);let be=e.createBindGroup({layout:oe.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:re}},{binding:1,resource:{buffer:h}},{binding:2,resource:{buffer:y}},{binding:3,resource:{buffer:B}},{binding:4,resource:{buffer:v}},{binding:5,resource:te.createView()}]}),C=e.createCommandEncoder({label:"audio_signal_extractor_encoder"}),H=C.beginComputePass({label:"audio_biquad_pass"});H.setPipeline(b),H.setBindGroup(0,M),H.dispatchWorkgroups(1),H.end();let X=C.beginComputePass({label:"audio_feature_pass"});X.setPipeline(P),X.setBindGroup(0,pe),X.dispatchWorkgroups(1),X.end(),C.copyBufferToBuffer(N,0,W,0,32);let z=e.createBuffer({size:g*4,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST,label:"audio_primary_readback"}),Y=e.createBuffer({size:g*4,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST,label:"audio_beat_readback"}),I=e.createBuffer({size:g*4,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST,label:"audio_bass_readback"}),j=e.createBuffer({size:g*4,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST,label:"audio_energy_readback"});C.copyBufferToBuffer(h,0,z,0,g*4),C.copyBufferToBuffer(y,0,Y,0,g*4),C.copyBufferToBuffer(B,0,I,0,g*4),C.copyBufferToBuffer(v,0,j,0,g*4);let J=C.beginComputePass({label:"audio_pack_pass"});J.setPipeline(oe),J.setBindGroup(0,be),J.dispatchWorkgroups(Math.ceil(ee/64)),J.end(),e.queue.submit([C.finish()]),await Promise.all([W.mapAsync(GPUMapMode.READ),z.mapAsync(GPUMapMode.READ),Y.mapAsync(GPUMapMode.READ),I.mapAsync(GPUMapMode.READ),j.mapAsync(GPUMapMode.READ)]);let V=new Float32Array(W.getMappedRange().slice(0)),de={primary:new Float32Array(z.getMappedRange().slice(0)),beat:new Float32Array(Y.getMappedRange().slice(0)),bass:new Float32Array(I.getMappedRange().slice(0)),energy:new Float32Array(j.getMappedRange().slice(0))};W.unmap(),W.destroy(),N.destroy(),z.unmap(),z.destroy(),Y.unmap(),Y.destroy(),I.unmap(),I.destroy(),j.unmap(),j.destroy();let he={primary:{min:V[0],max:V[1]},beat:{min:V[2],max:V[3]},bass:{min:V[4],max:V[5]},energy:{min:V[6],max:V[7]}};return x.destroy(),q.destroy(),re.destroy(),S.destroy(),l.destroy(),{primaryBuffer:h,beatBuffer:y,bassBuffer:B,energyBuffer:v,texture:te,textureView:te.createView(),numFrames:g,durationSec:p,stats:he,channelSamples:de}}static computePaceTimestamps(e,a,t,r,n=1,s=1){let u=e.createBuffer({size:t*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,label:"audio_pace_timestamps_buffer"}),o=f.getPipeline(e,"AudioPaceIntegralPipeline",Pe),p=1/r,g=new Float32Array([n,s,p,0]);new Uint32Array(g.buffer)[3]=t;let d=e.createBuffer({size:g.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"audio_pace_uniform_buffer"});e.queue.writeBuffer(d,0,g);let i=e.createBindGroup({layout:o.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:d}},{binding:1,resource:{buffer:a}},{binding:2,resource:{buffer:u}}]}),_=e.createCommandEncoder({label:"audio_pace_integral_encoder"}),S=_.beginComputePass({label:"audio_pace_pass"});return S.setPipeline(o),S.setBindGroup(0,i),S.dispatchWorkgroups(1),S.end(),e.queue.submit([_.finish()]),d.destroy(),u}};O();var Ue=`const PI: f32 = ${Math.PI}f;
|
|
265
|
+
const TAU: f32 = ${Math.PI*2}f;
|
|
266
|
+
const E: f32 = ${Math.E}f;`,$e=["t: f32","x: f32","y: f32","z: f32","i: u32","n: u32","frame: u32","color: vec4f","t_elapsed: f32","duration: f32"];function se(f,e){let a=Te(e),t=f.fnOutputType||"f32",r=f.fnParams??[],n=r.map(l=>`${l.name}: ${l.type}`),s=[...$e,...n].join(", "),u=`fn ${a}(${s}) -> ${t}`,o=f.fnBody??"",p={...f};if(!f.baseType||f.baseType==="custom"){let l=Fe(f.fnBody??"",f);l.baseType&&(p={...f,...l})}p.baseType&&p.baseType!=="custom"&&(o=Me(p));let g=o.split(`
|
|
267
|
+
`).map(l=>` ${l}`).join(`
|
|
268
|
+
`),{valid:d,validationWarning:i}=Ee(g,t),_=g;!d&&i==="Function body has no return statement."&&(t==="vec2f"?_+=`
|
|
269
|
+
return vec2<f32>(0.0);`:t==="vec3f"?_+=`
|
|
270
|
+
return vec3<f32>(0.0);`:t==="vec4f"?_+=`
|
|
271
|
+
return vec4<f32>(0.0);`:_+=`
|
|
272
|
+
return 0.0;`);let S=[Ue,"",`${u} {`,_,"}"].join(`
|
|
273
|
+
`);return{name:a,wgsl:S,signature:u,outputType:t,params:r,valid:d,validationWarning:i}}function Ge(f,e){return[` let ${e}_n1: f32 = 7.5625;`,` let ${e}_d1: f32 = 2.75;`,` let ${e}_r1: f32 = ${e}_n1 * (${f}) * (${f});`,` let ${e}_x2: f32 = (${f}) - 1.5 / ${e}_d1;`,` let ${e}_r2: f32 = ${e}_n1 * ${e}_x2 * ${e}_x2 + 0.75;`,` let ${e}_x3: f32 = (${f}) - 2.25 / ${e}_d1;`,` let ${e}_r3: f32 = ${e}_n1 * ${e}_x3 * ${e}_x3 + 0.9375;`,` let ${e}_x4: f32 = (${f}) - 2.625 / ${e}_d1;`,` let ${e}_r4: f32 = ${e}_n1 * ${e}_x4 * ${e}_x4 + 0.984375;`,` let ${e}_s1: f32 = select(${e}_r4, ${e}_r3, (${f}) < 2.5 / ${e}_d1);`,` let ${e}_s2: f32 = select(${e}_s1, ${e}_r2, (${f}) < 2.0 / ${e}_d1);`,` let ${e}: f32 = select(${e}_s2, ${e}_r1, (${f}) < 1.0 / ${e}_d1);`].join(`
|
|
274
|
+
`)}function K(f,e,a){switch(f){case"linear":return` let ${a}: f32 = ${e};`;case"smoothstep":return` let ${a}: f32 = (${e}) * (${e}) * (3.0 - 2.0 * (${e}));`;case"smootherstep":return` let ${a}: f32 = (${e}) * (${e}) * (${e}) * ((${e}) * ((${e}) * 6.0 - 15.0) + 10.0);`;case"sine":return` let ${a}: f32 = 1.0 - cos((${e}) * PI * 0.5);`;case"quad":return` let ${a}: f32 = (${e}) * (${e});`;case"cubic":return` let ${a}: f32 = (${e}) * (${e}) * (${e});`;case"quart":return` let ${a}: f32 = pow(${e}, 4.0);`;case"quint":return` let ${a}: f32 = pow(${e}, 5.0);`;case"expo":return` let ${a}: f32 = select(pow(2.0, 10.0 * (${e}) - 10.0), 0.0, (${e}) <= 0.0001);`;case"circ":return` let ${a}: f32 = 1.0 - sqrt(clamp(1.0 - (${e}) * (${e}), 0.0, 1.0));`;case"back":return[` let ${a}_c1: f32 = 1.70158;`,` let ${a}_c3: f32 = ${a}_c1 + 1.0;`,` let ${a}: f32 = ${a}_c3 * (${e}) * (${e}) * (${e}) - ${a}_c1 * (${e}) * (${e});`].join(`
|
|
275
|
+
`);case"elastic":return[` let ${a}_c4: f32 = (2.0 * PI) / 3.0;`,` let ${a}_raw: f32 = -pow(2.0, 10.0 * (${e}) - 10.0) * sin(((${e}) * 10.0 - 10.75) * ${a}_c4);`,` let ${a}_lo: f32 = select(${a}_raw, 0.0, (${e}) <= 0.0001);`,` let ${a}: f32 = select(${a}_lo, 1.0, (${e}) >= 0.9999);`].join(`
|
|
276
|
+
`);case"bounce":{let t=`${a}_bx`,r=`${a}_bo`;return[` let ${t}: f32 = 1.0 - (${e});`,Ge(t,r),` let ${a}: f32 = 1.0 - ${r};`].join(`
|
|
277
|
+
`)}}}function fe(f,e,a,t){if(f==="linear"||f==="smoothstep"||f==="smootherstep"||e==="in")return K(f,a,t);if(e==="out"){let s=`${t}_src`;return[K(f,`1.0 - (${a})`,s),` let ${t}: f32 = 1.0 - ${s};`].join(`
|
|
278
|
+
`)}let r=`${t}_in`,n=`${t}_out`;return[K(f,`(${a}) * 2.0`,r),K(f,`2.0 - (${a}) * 2.0`,n),` let ${t}: f32 = select(1.0 - ${n} * 0.5, ${r} * 0.5, (${a}) < 0.5);`].join(`
|
|
279
|
+
`)}function Me(f){let e=[],a=f.baseEnabled??!0,t=f.fmEnabled??!1;if(a&&t){let s=(f.fmAmplitude??1).toFixed(5),u=(f.fmFrequency??.5).toFixed(5);e.push(" // Frequency Modulation"),e.push(` let modulator = sin(t * ${u} * TAU) * ${s};`),e.push(" let t_mod = t + modulator;")}else e.push(" let t_mod = t;");if(e.push(" // Base Waveform"),!a)e.push(" var val: f32 = 0.0;");else{let s=f.baseType??"sine";s==="noise_smooth"?(e.push(" let noise_t = t_mod * u.frequency + u.phase;"),e.push(" let noise_i = floor(noise_t);"),e.push(" let noise_f = fract(noise_t);"),e.push(" let noise_u = noise_f * noise_f * (3.0 - 2.0 * noise_f);"),e.push(" let n0 = fract(sin(noise_i * 12.9898) * 43758.5453);"),e.push(" let n1 = fract(sin((noise_i + 1.0) * 12.9898) * 43758.5453);"),e.push(" let noise_val = mix(n0, n1, noise_u) * 2.0 - 1.0;")):s==="noise_white"?e.push(" let noise_val = fract(sin(t_mod * 12.9898 + u.phase) * 43758.5453) * 2.0 - 1.0;"):s==="pulse"?(e.push(" let pulse_duty = select(clamp(u.phase, 0.01, 0.99), 0.5, u.phase == 0.0);"),e.push(" let pulse_val = select(-1.0, 1.0, fract(t_mod * u.frequency) < pulse_duty);")):s==="bounce"?e.push(" let bounce_val = abs(sin(t_mod * u.frequency * PI + u.phase));"):s==="staircase"&&e.push(" let stair_val = floor(fract(t_mod * u.frequency + u.phase / TAU) * 8.0) / 7.0 * 2.0 - 1.0;");let u="";switch(s){case"sine":u="u.amplitude * sin(t_mod * u.frequency * TAU + u.phase) + u.offset";break;case"triangle":u="u.amplitude * (2.0 * abs(2.0 * fract(t_mod * u.frequency + u.phase / TAU) - 1.0) - 1.0) + u.offset";break;case"sawtooth":u="u.amplitude * (2.0 * (t_mod * u.frequency + u.phase / TAU - floor(t_mod * u.frequency + u.phase / TAU + 0.5))) + u.offset";break;case"square":u="u.amplitude * sign(sin(t_mod * u.frequency * TAU + u.phase)) + u.offset";break;case"constant":u="u.offset";break;case"noise_smooth":u="u.amplitude * noise_val + u.offset";break;case"noise_white":u="u.amplitude * noise_val + u.offset";break;case"pulse":u="u.amplitude * pulse_val + u.offset";break;case"bounce":u="u.amplitude * bounce_val + u.offset";break;case"staircase":u="u.amplitude * stair_val + u.offset";break;default:u="u.amplitude * sin(t_mod * u.frequency * TAU + u.phase) + u.offset";break}e.push(` var val: f32 = ${u};`)}let r=f.envelopeEnabled??!1,n=f.gateEnabled??!1;if(r){e.push(" // Time Envelope");let s=f.gateStartFrame??0,u=f.gateEndFrame??100;(f.envelopeUseFrame??!0)&&n?e.push(` let progress = select(0.0, clamp((f32(frame) - ${s.toFixed(1)}) / (${u.toFixed(1)} - ${s.toFixed(1)}), 0.0, 1.0), ${u}u > ${s}u);`):e.push(" let progress = select(0.0, clamp(t_elapsed / duration, 0.0, 1.0), duration > 0.0);");let p=f.envelopeFamily??"sine",g=f.envelopeMode??"in_out",d=f.envelopePattern??"ramp_up",i=f.envelopeCycles??2;if(d==="bell"||d==="loop"){if(d==="loop"){let _=Math.max(1,i).toFixed(1);e.push(` let env_loop: f32 = fract(progress * ${_});`),e.push(" let env_folded: f32 = 1.0 - abs(env_loop * 2.0 - 1.0);")}else e.push(" let env_folded: f32 = 1.0 - abs(progress * 2.0 - 1.0);");e.push(fe(p,g,"env_folded","env_eased")),e.push(" let env_factor: f32 = env_eased;")}else e.push(fe(p,g,"progress","env_eased")),e.push(d==="ramp_up"?" let env_factor: f32 = env_eased;":" let env_factor: f32 = 1.0 - env_eased;");e.push(" val = mix(u.offset - u.amplitude, val, env_factor);")}if(n){let s=f.gateStartFrame??0,u=f.gateEndFrame??100,o=f.gateIdleValue??0;e.push(" // Time Gate"),e.push(` if (frame < ${s}u || frame > ${u}u) {`),e.push(` val = ${o.toFixed(5)};`),e.push(" }")}return e.push(""),e.push(" return val;"),e.join(`
|
|
280
|
+
`)}var ce={fade_in:{family:"linear",mode:"in",pattern:"ramp_up"},fade_out:{family:"linear",mode:"in",pattern:"ramp_down"},ping_pong:{family:"linear",mode:"in",pattern:"bell"},expo_decay:{family:"expo",mode:"in",pattern:"ramp_down"},smooth_in:{family:"smoothstep",mode:"in",pattern:"ramp_up"},smooth_out:{family:"smoothstep",mode:"in",pattern:"ramp_down"},sine_bell:{family:"sine",mode:"in",pattern:"bell"},spring:{family:"elastic",mode:"out",pattern:"ramp_up"}};function Ae(f){return f&&f in ce?ce[f]:{family:"sine",mode:"in_out",pattern:"ramp_up"}}function Fe(f,e){let a=f.match(/\/\* SIGNAL_BUILDER_STATE:\s*([\s\S]*?)\s*\*\//);if(a)try{let t=JSON.parse(a[1]),r=!!t.envelope?.family,n=r?{family:t.envelope.family,mode:t.envelope.mode??"in",pattern:t.envelope.pattern??"ramp_up"}:Ae(t.envelope?.type);return{baseEnabled:t.base?.enabled??!0,baseType:t.base?.type??"sine",fmEnabled:t.fm?.enabled??!1,fmAmplitude:e?.fmAmplitude??t.fm?.amplitude??1,fmFrequency:e?.fmFrequency??t.fm?.frequency??.5,envelopeEnabled:t.envelope?.enabled??!1,envelopeFamily:n.family,envelopeMode:n.mode,envelopePattern:n.pattern,envelopeCycles:r?t.envelope?.cycles??2:2,envelopeUseFrame:e?.envelopeUseFrame??t.envelope?.useFrame??!0,gateEnabled:e?.gateEnabled??t.gate?.enabled??!1,gateStartFrame:e?.gateStartFrame??t.gate?.startFrame??0,gateEndFrame:e?.gateEndFrame??t.gate?.endFrame??100,gateIdleValue:e?.gateIdleValue??t.gate?.idleValue??0}}catch{}return{}}function Te(f){return`signal_${f.replace(/[^a-zA-Z0-9]/g,"_")}`}function Ee(f,e){if(!/\breturn\b/.test(f))return{valid:!1,validationWarning:"Function body has no return statement."};let t=/\breturn\s+vec(\d)f?\(/.exec(f);if(t){let r=parseInt(t[1],10);if(e==="f32")return{valid:!1,validationWarning:`Returning vec${r}f but output type is f32.`}}return{valid:!0}}O();O();function De(f){let e=new Float32Array([f]),a=new Uint32Array(e.buffer)[0],t=a>>>16&32768,r=(a>>>23&255)-127+15,n=a&8388607;return r<=0?r<-10?t:(n=(n|8388608)>>1-r,t|n+4096>>13):r>=31?t|31744:t|r<<10|n+4096>>13}function ie(f){if(typeof Float16Array<"u")return new Uint16Array(new Float16Array(f).buffer);let e=f.length,a=new Uint16Array(e);for(let t=0;t<e;t++)a[t]=De(f[t]);return a}function me(f){return Array.isArray(f)||ArrayBuffer.isView(f)&&!(f instanceof DataView)}var ue=class{deviceCache=new WeakMap;statsMap=new Map;statsListeners=new Map;setStats(e,a){this.statsMap.set(e,a);let t=this.statsListeners.get(e);if(t)for(let r of t)r(a)}getStats(e){return this.statsMap.get(e)}onStats(e,a){let t=this.statsListeners.get(e);t||(t=new Set,this.statsListeners.set(e,t)),t.add(a);let r=this.statsMap.get(e);return r&&a(r),()=>{t?.delete(a),t?.size===0&&this.statsListeners.delete(e)}}computeSignalFingerprint(e,a=0,t=new Set){if(e==null)return"";if(typeof e=="number")return`num:${e}`;if(typeof e=="string")return`str:${e}`;if(typeof e=="boolean")return`bool:${e}`;if(typeof e!="object")return"";if(t.has(e)||a>8){let d=e;return`ref:${d.nodeId||d.virtualMedia?.operation?.nodeId||"seen"}`}t.add(e);let r=e,n=r.samples??r.data?.samples,s=(typeof r.nodeId=="string"?r.nodeId:void 0)||(typeof r.virtualMedia?.operation?.nodeId=="string"?r.virtualMedia.operation?.nodeId:void 0),u;a>0&&s&&(u=this.getStats(s));let o=r.signalConfig,p=r.operation??o?.operation??r.config?.operation??r.data?.operation,g={type:r.type,op:r.op,operation:p,bValue:r.bValue??o?.bValue??r.config?.bValue??r.data?.bValue,value:r.value,inMin:r.inMin??o?.inMin,inMax:r.inMax??o?.inMax,outMin:r.outMin??o?.outMin,outMax:r.outMax??o?.outMax,clampMin:r.clampMin??o?.clampMin,clampMax:r.clampMax??o?.clampMax,exponent:r.exponent??o?.exponent,edge0:r.edge0??o?.edge0,edge1:r.edge1??o?.edge1,customWGSL:r.customWGSL||r.fnBody||r.wgsl||o?.customWGSL||o?.fnBody,amplitude:r.amplitude,frequency:r.frequency,phase:r.phase,offset:r.offset,fnParams:r.fnParams,sourceUrl:r.sourceUrl??r.url,extractionMode:r.extractionMode,channel:r.channel,nodeId:s,samplesLen:n?.length,sample0:n?.[0],sampleMid:n&&n.length>1?n[Math.floor(n.length/2)]:void 0,sampleLast:n&&n.length>2?n[n.length-1]:void 0,upstreamStats:u?`${u.min}:${u.max}`:void 0,sigA:r.signalA?this.computeSignalFingerprint(r.signalA,a+1,t):void 0,sigB:r.signalB?this.computeSignalFingerprint(r.signalB,a+1,t):void 0};return JSON.stringify(g)}getDeviceResources(e){let a=this.deviceCache.get(e);return a||(a={resources:new Map,masterAudioTextures:new Map,dummy1x1TextureView:null,dummyBuffer:null,pipelineCache:new Map,defaultSampler:null},this.deviceCache.set(e,a)),a}getSampler(e){let a=this.getDeviceResources(e);return a.defaultSampler||(a.defaultSampler=e.createSampler({magFilter:"linear",minFilter:"linear"})),a.defaultSampler}clear(e,a){if(!a)return;let t=this.deviceCache.get(a);if(!t)return;let r=`${e}:`;for(let[n,s]of t.resources.entries())n.startsWith(r)&&(s.buffer?.destroy(),s.texture?.destroy(),s.uniformBuffer?.destroy(),t.resources.delete(n));for(let[n,s]of t.masterAudioTextures.entries())n.startsWith(r)&&(s.texture.destroy(),t.masterAudioTextures.delete(n))}getDummy1x1TextureView(e){let a=this.getDeviceResources(e);if(a.dummy1x1TextureView)return a.dummy1x1TextureView;let t=e.createTexture({size:[1,1,1],format:"rgba16float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST,label:"dummy_1x1_signal_texture"});return e.queue.writeTexture({texture:t},new Uint16Array([0,0,0,15360]),{bytesPerRow:8,rowsPerImage:1},[1,1,1]),a.dummy1x1TextureView=t.createView(),a.dummy1x1TextureView}getDummyBuffer(e){let a=this.getDeviceResources(e);return a.dummyBuffer||(a.dummyBuffer=e.createBuffer({size:256,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,label:"dummy_signal_buffer"})),a.dummyBuffer}registerBuffer(e,a,t,r){let n=this.getDeviceResources(e),s=`${r??"global"}:${a}`,u=n.resources.get(s)??n.resources.get(`global:${a}`),o={...u,type:u?.texture?"combined":"1d-buffer",buffer:t,lastProcessedFrame:-1,isExternal:!0};n.resources.set(s,o),r&&n.resources.set(`global:${a}`,o)}registerTexture(e,a,t,r,n,s){let u=this.getDeviceResources(e),o=`${n??"global"}:${a}`,p=u.resources.get(o)??u.resources.get(`global:${a}`),g={...p,type:p?.buffer?"combined":"2d-texture",texture:t,textureView:r,lastProcessedFrame:-1,isExternal:!0,duration:s!==void 0?s:p?.duration};u.resources.set(o,g),n&&u.resources.set(`global:${a}`,g)}getMasterTextureView(e,a,t){let r=this.getDeviceResources(e),n=`${t??"global"}:${a}`,s=a.replace(/_(beat|bass|energy)$/,"");return r.masterAudioTextures.get(n)?.textureView??r.masterAudioTextures.get(`global:${a}`)?.textureView??r.masterAudioTextures.get(`${t??"global"}:${s}`)?.textureView??r.masterAudioTextures.get(`global:${s}`)?.textureView??r.resources.get(n)?.textureView??r.resources.get(`global:${a}`)?.textureView??r.resources.get(`${t??"global"}:${s}`)?.textureView??r.resources.get(`global:${s}`)?.textureView}getMasterTexture(e,a,t){let r=this.getDeviceResources(e),n=`${t??"global"}:${a}`,s=a.replace(/_(beat|bass|energy)$/,"");return r.masterAudioTextures.get(n)?.texture??r.masterAudioTextures.get(`global:${a}`)?.texture??r.masterAudioTextures.get(`${t??"global"}:${s}`)?.texture??r.masterAudioTextures.get(`global:${s}`)?.texture??r.resources.get(n)?.texture??r.resources.get(`global:${a}`)?.texture??r.resources.get(`${t??"global"}:${s}`)?.texture??r.resources.get(`global:${s}`)?.texture}channelSamplesMap=new Map;setChannelSamples(e,a,t){let r=`${t??"global"}:${e}`,n=e.replace(/_(beat|bass|energy)$/,"");this.channelSamplesMap.set(r,a),this.channelSamplesMap.set(`global:${e}`,a),n!==e&&(this.channelSamplesMap.set(`${t??"global"}:${n}`,a),this.channelSamplesMap.set(`global:${n}`,a))}getChannelSamples(e,a="primary",t){let r=`${t??"global"}:${e}`,n=e.replace(/_(beat|bass|energy)$/,""),s=this.channelSamplesMap.get(r)??this.channelSamplesMap.get(`global:${e}`)??this.channelSamplesMap.get(`${t??"global"}:${n}`)??this.channelSamplesMap.get(`global:${n}`);return s?s[a]??s.primary:void 0}getDuration(e,a,t){let r=this.getDeviceResources(e),n=`${t??"global"}:${a}`,s=r.resources.get(n)??r.resources.get(`global:${a}`);if(s?.duration!==void 0)return s.duration;let u=a.replace(/_(beat|bass|energy)$/,"");return(r.masterAudioTextures.get(n)??r.masterAudioTextures.get(`global:${a}`)??r.masterAudioTextures.get(`${t??"global"}:${u}`)??r.masterAudioTextures.get(`global:${u}`))?.durationSec}extractionPromises=new Map;has(e,a,t){let r=this.getDeviceResources(e),n=`${t??"global"}:${a}`,s=a.replace(/_(beat|bass|energy)$/,"");return r.resources.has(n)||r.resources.has(`global:${a}`)||r.masterAudioTextures.has(n)||r.masterAudioTextures.has(`global:${a}`)||r.masterAudioTextures.has(`${t??"global"}:${s}`)||r.masterAudioTextures.has(`global:${s}`)}async ensureAudioSourcesExtracted(e,a,t=24,r,n=new Set){if(!a||typeof a!="object"||n.has(a))return;n.add(a);let s=a;if(s.signalA&&await this.ensureAudioSourcesExtracted(e,s.signalA,t,r,n),s.signalB&&typeof s.signalB=="object"&&await this.ensureAudioSourcesExtracted(e,s.signalB,t,r,n),!!(s.extractionMode||s.op==="AudioSignalExtractor"||s.virtualMedia?.operation?.op==="AudioSignalExtractor")){let o=s.sourceUrl||s.virtualMedia?.operation?.sourceUrl;if(!o&&s.virtualMedia){let g=s.virtualMedia;o=g.operation?.sourceUrl||g.operation?.url||g.children?.[0]?.operation?.sourceUrl||g.children?.[0]?.operation?.url}let p=s.nodeId||s.virtualMedia?.operation?.nodeId;o&&p&&await this.extractFromAudioSource(e,o,s,p,t,r)}}async extractFromAudioSource(e,a,t={},r,n=24,s){let u=this.getDeviceResources(e),o=`${s??"global"}:${r}`,p=JSON.stringify({sourceUrl:a,mode:t.extractionMode,sens:t.sensitivity,att:t.attackMs,rel:t.releaseMs,smooth:t.smoothing,curve:t.curve,beatThresh:t.beatThreshold,noiseFloor:t.noiseFloorDb,dynRange:t.dynamicRangeDb,beatDecay:t.beatDecayMs,fps:n});if((u.masterAudioTextures.get(o)??u.masterAudioTextures.get(`global:${r}`))?.lastFingerprint===p)return;if(this.extractionPromises.has(o)){await this.extractionPromises.get(o);return}let d=(async()=>{try{let i=[],_=44100;if(typeof window<"u"){let b=window.AudioContext||window.webkitAudioContext;if(b){let m=a;m.startsWith("file://")&&(m=m.replace(/^file:\/\//,"")),m.startsWith("/")&&!m.startsWith("/@fs/")&&!m.startsWith("/api/")&&(m=`/@fs${m}`);let c=new b;try{let x=await fetch(m);if(!x.ok)throw new Error(`HTTP ${x.status}`);let M=await x.arrayBuffer(),P=await c.decodeAudioData(M);_=P.sampleRate;for(let U=0;U<P.numberOfChannels;U++)i.push(new Float32Array(P.getChannelData(U)))}finally{c.close()}}}else try{let b=await import("./shims/fs.mjs"),m=a.replace(/^file:\/\//,"");if(b.existsSync(m)){let c=b.readFileSync(m),x=c.readUInt16LE(22);_=c.readUInt32LE(24);let M=c.readUInt16LE(34),P=12;for(;P<c.length-8;){let $=c.toString("ascii",P,P+4),G=c.readUInt32LE(P+4);if($==="data"){P+=8;break}P+=8+G}let U=Math.max(1,Math.floor(M/8)),A=Math.floor((c.length-P)/(x*U));i=[];for(let $=0;$<x;$++)i.push(new Float32Array(A));if(M===16)for(let $=0;$<A;$++)for(let G=0;G<x;G++){let w=P+($*x+G)*2;w+2<=c.length&&(i[G][$]=c.readInt16LE(w)/32768)}else if(M===32)for(let $=0;$<A;$++)for(let G=0;G<x;G++){let w=P+($*x+G)*4;w+4<=c.length&&(i[G][$]=c.readFloatLE(w))}}}catch{}if(i.length===0||i[0].length===0)return;let l=i[0].length/_,h=await Z.extractFeatures(e,i,_,n,t,512),y=new Set;r&&y.add(r);let B=t?.nodeId;B&&y.add(B);for(let b of y){let m=b.replace(/_(beat|bass|energy)$/,""),c={texture:h.texture,textureView:h.textureView,durationSec:l,stats:h.stats.primary,lastFingerprint:p};u.masterAudioTextures.set(`${s??"global"}:${m}`,c),u.masterAudioTextures.set(`global:${m}`,c),u.masterAudioTextures.set(`${s??"global"}:${m}_beat`,{...c,stats:h.stats.beat}),u.masterAudioTextures.set(`global:${m}_beat`,{...c,stats:h.stats.beat}),u.masterAudioTextures.set(`${s??"global"}:${m}_bass`,{...c,stats:h.stats.bass}),u.masterAudioTextures.set(`global:${m}_bass`,{...c,stats:h.stats.bass}),u.masterAudioTextures.set(`${s??"global"}:${m}_energy`,{...c,stats:h.stats.energy}),u.masterAudioTextures.set(`global:${m}_energy`,{...c,stats:h.stats.energy}),b!==m&&(u.masterAudioTextures.set(`${s??"global"}:${b}`,c),u.masterAudioTextures.set(`global:${b}`,c)),this.registerBuffer(e,m,h.primaryBuffer,s),this.setStats(m,h.stats.primary),this.registerBuffer(e,`${m}_beat`,h.beatBuffer,s),this.setStats(`${m}_beat`,h.stats.beat),this.registerBuffer(e,`${m}_bass`,h.bassBuffer,s),this.setStats(`${m}_bass`,h.stats.bass),this.registerBuffer(e,`${m}_energy`,h.energyBuffer,s),this.setStats(`${m}_energy`,h.stats.energy),h.channelSamples&&this.setChannelSamples(m,h.channelSamples,s)}let v=u.resources.get(o)??u.resources.get(`global:${r}`);v&&(v.lastFingerprint=p)}catch(i){console.warn(`[SignalRegistry] Failed to extract audio signal from ${a}:`,i)}finally{this.extractionPromises.delete(o)}})();this.extractionPromises.set(o,d),await d}getOrCreate1DBuffer(e,a,t,r,n,s,u,o,p,g,d){let i=s;if(s&&!s.customWGSL&&!s.wgsl&&s.fnBody){let b=se(s,t);i={...s,customWGSL:b.wgsl,signalFnName:b.name,fnOutputType:b.outputType,outputType:b.outputType}}let _=this.getDeviceResources(e),S=`${p??"global"}:${t}`,l=_.resources.get(S)??_.resources.get(`global:${t}`),h=u*4;if(l?.isExternal&&l.buffer&&l.buffer.size===h)return l.buffer;if(!l||!l.buffer||l.buffer.size<h){l?.buffer&&!l.isExternal&&l.buffer.destroy();let b=e.createBuffer({size:h,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,label:`signal_1d_buffer_${t}`});l={...l,type:l?.texture?"combined":"1d-buffer",buffer:b,lastProcessedFrame:-1},_.resources.set(S,l)}let y=i?.samples??i?.data?.samples,B=i?this.computeSignalFingerprint(i):"",v=g!==void 0?g:r;if(l.lastProcessedFrame===v&&l.lastFingerprint===B)return l.buffer;if(l.lastFingerprint!==B&&(l.bindGroup=void 0),l.lastProcessedFrame=v,l.lastFingerprint=B,me(y)&&y.length>0){let b=new Float32Array(u),m=y.length,c=Number(i?.fps)||24;for(let x=0;x<u;x++){let M=r+x/o,P=Math.min(m-1,Math.max(0,Math.round(M*c)));b[x]=Number(y[P])||0}e.queue.writeBuffer(l.buffer,0,b)}else if(i?.type==="generator"&&(i.customWGSL||i.fnBody)){let b=e.createCommandEncoder({label:`signal_1d_encoder_${t}`});this.dispatch1DGenerator(e,b,l,r,n,i,u,o,g,d),e.queue.submit([b.finish()])}else if(i?.type==="audio_extractor"||i?.extractionMode!==void 0){let b=this.getMasterTexture(e,t,p);if(b){let m=i.channel==="beat"||t.endsWith("_beat")?1:i.channel==="bass"||t.endsWith("_bass")?2:i.channel==="energy"||t.endsWith("_energy")?3:0,c=this.getDuration(e,t,p)??(typeof i.durationMs=="number"?i.durationMs/1e3:n),x=e.createCommandEncoder({label:`signal_1d_audio_encoder_${t}`});this.dispatch1DAudioSignal(e,x,l,b,m,r,c,u,o),e.queue.submit([x.finish()])}else{let m=Number(i?.offset??0),c=new Float32Array(u).fill(m);e.queue.writeBuffer(l.buffer,0,c)}}else if(i?.type==="signal_math"){let b=i.signalA?.nodeId??`${t}_a`,m=this.getOrCreate1DBuffer(e,a,b,r,n,i.signalA,u,o,p,g,d),c=i.signalB&&typeof i.signalB=="object"&&i.signalB.type!==void 0,x=c?i.signalB.nodeId??`${t}_b`:`${t}_b_dummy`,M=c?this.getOrCreate1DBuffer(e,a,x,r,n,i.signalB,u,o,p,g,d):this.getDummyBuffer(e),P=L(i),U=e.createCommandEncoder({label:`signal_1d_math_encoder_${t}`});this.dispatch1DMathSignal(e,U,l,m,M,!!c,P,i,r,n,u,o,g,d),e.queue.submit([U.finish()])}else if(i?.type==="gate"||i?.op==="SignalGate"||i?.signalConfig?.type==="gate"||i?.signalConfig?.op==="SignalGate"){let b=i.sourceSignal??i.signalConfig?.sourceSignal??i.signal,m=b?.nodeId??`${t}_in`,c=this.getOrCreate1DBuffer(e,a,m,r,n,b,u,o,p,g,d),x=e.createCommandEncoder({label:`signal_1d_gate_encoder_${t}`});this.dispatch1DGateSignal(e,x,l,c,i,r,n,u,o,g,d),e.queue.submit([x.finish()])}else{let b=Number(i?.offset??0),m=new Float32Array(u).fill(b);e.queue.writeBuffer(l.buffer,0,m)}return l.buffer}getOrCreate2DTextureView(e,a,t,r,n,s,u,o,p,g,d){let i=s;if(s&&!s.customWGSL&&!s.wgsl&&s.fnBody){let c=se(s,t);i={...s,customWGSL:c.wgsl,signalFnName:c.name,fnOutputType:c.outputType,outputType:c.outputType}}let _=this.getDeviceResources(e),S=`${p??"global"}:${t}`,l=_.resources.get(S)??_.resources.get(`global:${t}`),h=_.masterAudioTextures.get(S)??_.masterAudioTextures.get(`global:${t}`)??_.masterAudioTextures.get(`${p??"global"}:${t.replace(/_(beat|bass|energy)$/,"")}`)??_.masterAudioTextures.get(`global:${t.replace(/_(beat|bass|energy)$/,"")}`);if(l?.isExternal&&l.textureView&&!h)return l.textureView;let y=l?.texture?l.texture.width:Math.max(16,u>0?u:256),B=1;if(!l||!l.texture){let c=e.createTexture({size:[y,B,1],format:"rgba16float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_DST,label:`signal_2d_texture_${t}`});l={...l,type:l?.buffer?"combined":"2d-texture",texture:c,textureView:c.createView(),lastProcessedFrame:-1},_.resources.set(S,l),p&&_.resources.set(`global:${t}`,l)}let v=i?.samples??i?.data?.samples,b=i?this.computeSignalFingerprint(i):"",m=g!==void 0?g:r;if(l.lastProcessedFrame===m&&l.lastFingerprint===b)return l.textureView;if(l.lastFingerprint!==b&&(l.bindGroup=void 0),l.lastProcessedFrame=m,l.lastFingerprint=b,h){let c=0;typeof i?.channel=="number"?c=i.channel:t.endsWith("_beat")?c=1:t.endsWith("_bass")?c=2:t.endsWith("_energy")&&(c=3);let x=e.createCommandEncoder({label:`audio_signal_2d_encoder_${t}`});return this.dispatch2DAudioSignal(e,x,l,h,c,r,n>0?n:h.durationSec,g,d),e.queue.submit([x.finish()]),l.textureView}else if(me(v)&&v.length>0){let c=new Float32Array(y*B*4),x=v.length,M=g!==void 0&&d!==void 0&&d>0?g/d:r;for(let U=0;U<y;U++){let A=y>1?U/(y-1):.5,$=M+(A-.5)*2,G=n>0?Math.min(1,Math.max(0,$/n)):.5,w=Math.min(x-1,Math.max(0,Math.round(G*(x-1)))),F=Number(v[w])||0;for(let T=0;T<B;T++){let R=(T*y+U)*4;c[R]=F,c[R+1]=F,c[R+2]=F,c[R+3]=F}}let P=ie(c);return e.queue.writeTexture({texture:l.texture},P,{bytesPerRow:y*8,rowsPerImage:B},[y,B,1]),l.textureView}else if(i&&(i.type==="signal_math"||i.op==="SignalMath"||i.operation||i.signalConfig?.operation)){let c=e.createCommandEncoder({label:`signal_math_2d_encoder_${t}`});return this.dispatch2DSignalMath(e,c,l,t,i,r,n,y,g,d,p),e.queue.submit([c.finish()]),l.textureView}else if(i&&(i.type==="gate"||i.op==="SignalGate"||i.signalConfig?.type==="gate"||i.signalConfig?.op==="SignalGate")){let c=e.createCommandEncoder({label:`signal_gate_2d_encoder_${t}`});return this.dispatch2DSignalGate(e,c,l,t,i,r,n,y,g,d,p),e.queue.submit([c.finish()]),l.textureView}else if(i&&i.type==="generator"&&(i.customWGSL||i.fnBody)){let c=e.createCommandEncoder({label:`signal_2d_encoder_${t}`});this.dispatch2DGenerator(e,c,l,r,n,i,y,B,g,d),e.queue.submit([c.finish()])}else{let c=Number(i?.offset??0),x=new Float32Array(y*B*4);for(let P=0;P<y*B;P++)x[P*4]=c,x[P*4+1]=c,x[P*4+2]=c,x[P*4+3]=1;let M=ie(x);e.queue.writeTexture({texture:l.texture},M,{bytesPerRow:y*8,rowsPerImage:B},[y,B,1])}return l.textureView}dispatch1DGenerator(e,a,t,r,n,s,u,o,p,g){let d=s.customWGSL??s.wgsl??"",i=s.signalFnName??s.name??"signal_fn",_=s.fnOutputType??s.outputType??"f32",S=this.getDeviceResources(e),l=`1d_${s.nodeId}_${d}`,h=S.pipelineCache.get(l);if(!h){let M=s.fnParams??[],P=[];for(let w of M){let F=w.defaultValue;P.push(F%1===0?`${F.toFixed(1)}f`:`${F}f`)}let U=["t","progress","0.0","0.0","idx","u.numSamples","u.frame","vec4<f32>(progress, 0.5, 0.5, 1.0)","u.t_elapsed","u.duration",...P],A=`${i}(${U.join(", ")})`;(_==="vec2f"||_==="vec3f"||_==="vec4f")&&(A=`${A}.x`);let $=`
|
|
281
|
+
struct GeneratorUniforms {
|
|
282
|
+
sampleRate : f32,
|
|
283
|
+
baseTime : f32,
|
|
284
|
+
frame : u32,
|
|
285
|
+
numSamples : u32,
|
|
286
|
+
amplitude : f32,
|
|
287
|
+
frequency : f32,
|
|
288
|
+
phase : f32,
|
|
289
|
+
offset : f32,
|
|
290
|
+
t_elapsed : f32,
|
|
291
|
+
duration : f32,
|
|
292
|
+
pad1 : f32,
|
|
293
|
+
pad2 : f32,
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
@group(0) @binding(0) var<uniform> u : GeneratorUniforms;
|
|
297
|
+
@group(0) @binding(1) var<storage, read_write> outSignal : array<f32>;
|
|
298
|
+
|
|
299
|
+
${d}
|
|
300
|
+
|
|
301
|
+
@compute @workgroup_size(64)
|
|
302
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
303
|
+
let idx = gid.x;
|
|
304
|
+
if (idx >= u.numSamples) { return; }
|
|
305
|
+
|
|
306
|
+
let progress = f32(idx) / f32(u.numSamples - 1u);
|
|
307
|
+
let t = u.baseTime + f32(idx) / u.sampleRate;
|
|
308
|
+
|
|
309
|
+
// Evaluate custom signal
|
|
310
|
+
let val = ${A};
|
|
311
|
+
outSignal[idx] = val;
|
|
312
|
+
}
|
|
313
|
+
`,G=e.createShaderModule({label:`signal_1d_generator_${s.nodeId}.wgsl`,code:$});h=e.createComputePipeline({label:`Signal1DComputePipeline_${s.nodeId}`,layout:"auto",compute:{module:G,entryPoint:"main"}}),S.pipelineCache.set(l,h)}let y=p!==void 0&&g!==void 0&&g>0?p/g:r,B=p!==void 0?p:0,v=new ArrayBuffer(48),b=new Float32Array(v),m=new Uint32Array(v);b[0]=o,b[1]=y,m[2]=B,m[3]=u,b[4]=s.amplitude??1,b[5]=s.frequency??1,b[6]=s.phase??0,b[7]=s.offset??0,b[8]=r,b[9]=n,b[10]=0,b[11]=0,t.uniformBuffer||(t.uniformBuffer=e.createBuffer({size:v.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:`signal_1d_uniform_buffer_${s.nodeId}`})),e.queue.writeBuffer(t.uniformBuffer,0,v),t.bindGroup||(t.bindGroup=e.createBindGroup({layout:h.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t.uniformBuffer}},{binding:1,resource:{buffer:t.buffer}}]}));let c=a.beginComputePass({label:`signal_1d_compute_pass_${s.nodeId}`});c.setPipeline(h),c.setBindGroup(0,t.bindGroup);let x=Math.ceil(u/64);c.dispatchWorkgroups(x),c.end()}dispatch1DAudioSignal(e,a,t,r,n,s,u,o,p){let g=this.getDeviceResources(e),d="audio_signal_1d",i=g.pipelineCache.get(d),_=this.getSampler(e);if(!i){let m=e.createShaderModule({code:`
|
|
314
|
+
struct Audio1DUniforms {
|
|
315
|
+
sampleRate : f32,
|
|
316
|
+
baseTime : f32,
|
|
317
|
+
duration : f32,
|
|
318
|
+
numSamples : u32,
|
|
319
|
+
channel : u32,
|
|
320
|
+
pad1 : f32,
|
|
321
|
+
pad2 : f32,
|
|
322
|
+
pad3 : f32,
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
@group(0) @binding(0) var<uniform> u : Audio1DUniforms;
|
|
326
|
+
@group(0) @binding(1) var masterTex : texture_2d<f32>;
|
|
327
|
+
@group(0) @binding(2) var samp : sampler;
|
|
328
|
+
@group(0) @binding(3) var<storage, read_write> outSignal : array<f32>;
|
|
329
|
+
|
|
330
|
+
@compute @workgroup_size(64)
|
|
331
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
332
|
+
let idx = gid.x;
|
|
333
|
+
if (idx >= u.numSamples) { return; }
|
|
334
|
+
|
|
335
|
+
let t = u.baseTime + f32(idx) / u.sampleRate;
|
|
336
|
+
var t_norm = 0.5f;
|
|
337
|
+
if (u.duration > 0.0f) {
|
|
338
|
+
t_norm = clamp(t / u.duration, 0.0f, 1.0f);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
let s = textureSampleLevel(masterTex, samp, vec2<f32>(t_norm, 0.5f), 0.0f);
|
|
342
|
+
var val = s.r;
|
|
343
|
+
if (u.channel == 1u) {
|
|
344
|
+
val = s.g;
|
|
345
|
+
} else if (u.channel == 2u) {
|
|
346
|
+
val = s.b;
|
|
347
|
+
} else if (u.channel == 3u) {
|
|
348
|
+
val = s.a;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
outSignal[idx] = val;
|
|
352
|
+
}
|
|
353
|
+
`,label:"dispatch1DAudioSignal_module"});i=e.createComputePipeline({label:"dispatch1DAudioSignal_pipeline",layout:"auto",compute:{module:m,entryPoint:"main"}}),g.pipelineCache.set(d,i)}let S=new ArrayBuffer(32),l=new Float32Array(S),h=new Uint32Array(S);l[0]=p,l[1]=s,l[2]=u>0?u:1,h[3]=o,h[4]=n;let y=e.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"audio_1d_uniform_buffer"});e.queue.writeBuffer(y,0,S);let B=e.createBindGroup({layout:i.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:y}},{binding:1,resource:r.createView()},{binding:2,resource:_},{binding:3,resource:{buffer:t.buffer}}]}),v=a.beginComputePass({label:"audio_1d_compute_pass"});v.setPipeline(i),v.setBindGroup(0,B),v.dispatchWorkgroups(Math.ceil(o/64)),v.end()}dispatch1DMathSignal(e,a,t,r,n,s,u,o,p,g,d,i,_,S){let l=this.getDeviceResources(e),h=o.operation??"add",y=o.customWGSL??o.wgsl??"",B=`1d_math_${h}_${s}_${y}`,v=l.pipelineCache.get(B);if(!v){let{evalExpr:U,extraFn:A}=ge(h,y),$=`
|
|
354
|
+
struct MathUniforms {
|
|
355
|
+
bValue : f32,
|
|
356
|
+
inMin : f32,
|
|
357
|
+
inMax : f32,
|
|
358
|
+
outMin : f32,
|
|
359
|
+
outMax : f32,
|
|
360
|
+
clampMin : f32,
|
|
361
|
+
clampMax : f32,
|
|
362
|
+
exponent : f32,
|
|
363
|
+
edge0 : f32,
|
|
364
|
+
edge1 : f32,
|
|
365
|
+
a_min : f32,
|
|
366
|
+
a_max : f32,
|
|
367
|
+
baseTime : f32,
|
|
368
|
+
duration : f32,
|
|
369
|
+
sampleRate: f32,
|
|
370
|
+
numSamples: u32,
|
|
371
|
+
hasB : f32,
|
|
372
|
+
frame : u32,
|
|
373
|
+
pad1 : f32,
|
|
374
|
+
pad2 : f32,
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
@group(0) @binding(0) var<uniform> u : MathUniforms;
|
|
378
|
+
@group(0) @binding(1) var<storage, read> bufA : array<f32>;
|
|
379
|
+
@group(0) @binding(2) var<storage, read> bufB : array<f32>;
|
|
380
|
+
@group(0) @binding(3) var<storage, read_write> outSignal : array<f32>;
|
|
381
|
+
|
|
382
|
+
const PI: f32 = ${Math.PI}f;
|
|
383
|
+
const TAU: f32 = ${Math.PI*2}f;
|
|
384
|
+
const E: f32 = ${Math.E}f;
|
|
385
|
+
|
|
386
|
+
${A}
|
|
387
|
+
|
|
388
|
+
@compute @workgroup_size(64)
|
|
389
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
390
|
+
let idx = gid.x;
|
|
391
|
+
if (idx >= u.numSamples) { return; }
|
|
392
|
+
|
|
393
|
+
let a = bufA[idx];
|
|
394
|
+
var b = u.bValue;
|
|
395
|
+
if (u.hasB > 0.5f) {
|
|
396
|
+
b = bufB[idx];
|
|
397
|
+
}
|
|
398
|
+
let a_min = u.a_min;
|
|
399
|
+
let a_max = u.a_max;
|
|
400
|
+
let inMin = u.inMin;
|
|
401
|
+
let inMax = u.inMax;
|
|
402
|
+
let outMin = u.outMin;
|
|
403
|
+
let outMax = u.outMax;
|
|
404
|
+
let clampMin = u.clampMin;
|
|
405
|
+
let clampMax = u.clampMax;
|
|
406
|
+
let exponent = u.exponent;
|
|
407
|
+
let edge0 = u.edge0;
|
|
408
|
+
let edge1 = u.edge1;
|
|
409
|
+
let t = u.baseTime + f32(idx) / u.sampleRate;
|
|
410
|
+
var t_norm = 0.5f;
|
|
411
|
+
if (u.duration > 0.0f) {
|
|
412
|
+
t_norm = clamp(t / u.duration, 0.0f, 1.0f);
|
|
413
|
+
}
|
|
414
|
+
let frame = u.frame;
|
|
415
|
+
|
|
416
|
+
let val = ${U};
|
|
417
|
+
outSignal[idx] = val;
|
|
418
|
+
}
|
|
419
|
+
`,G=e.createShaderModule({label:`signal_1d_math_${h}.wgsl`,code:$});v=e.createComputePipeline({label:`Signal1DMathPipeline_${h}`,layout:"auto",compute:{module:G,entryPoint:"main"}}),l.pipelineCache.set(B,v)}let b=new ArrayBuffer(Math.max(80,256)),m=new Float32Array(b),c=new Uint32Array(b);m[0]=u,m[1]=Number(o.inMin)||0,m[2]=Number(o.inMax)||1,m[3]=Number(o.outMin)||0,m[4]=Number(o.outMax)||1,m[5]=Number(o.clampMin)||0,m[6]=Number(o.clampMax)||1,m[7]=Number(o.exponent)||2,m[8]=Number(o.edge0)||0,m[9]=Number(o.edge1)||1,m[10]=Number(o.aMin??o.inMin)||0,m[11]=Number(o.aMax??o.inMax)||1,m[12]=p,m[13]=g>0?g:1,m[14]=i,c[15]=d,m[16]=s?1:0,c[17]=_!==void 0?Math.max(0,Math.floor(_)):0;let x=e.createBuffer({size:Math.max(80,256),usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"math_1d_uniform_buffer"});e.queue.writeBuffer(x,0,b);let M=e.createBindGroup({layout:v.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:x}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:n}},{binding:3,resource:{buffer:t.buffer}}]}),P=a.beginComputePass({label:"math_1d_compute_pass"});P.setPipeline(v),P.setBindGroup(0,M),P.dispatchWorkgroups(Math.ceil(d/64)),P.end()}dispatch2DGenerator(e,a,t,r,n,s,u,o,p,g){let d=s.customWGSL??s.wgsl??"",i=s.signalFnName??s.name??"signal_fn",_=this.getDeviceResources(e),S=`2d_${s.nodeId}_${d}`,l=_.pipelineCache.get(S);if(!l){let c=s.fnParams??[],x=[];for(let F of c){let T=F.defaultValue;x.push(T%1===0?`${T.toFixed(1)}f`:`${T}f`)}let U=["u.baseTime + (in.uv.x - 0.5) * 2.0","in.uv.x","1.0 - in.uv.y","0.0","0u","1u","u.frame","vec4<f32>(in.uv.x, 1.0 - in.uv.y, 0.5, 1.0)","u.t_elapsed + (in.uv.x - 0.5) * 2.0","u.duration",...x],$=`let val = f32(${`${i}(${U.join(", ")})`}); return vec4<f32>(val, val, val, val);`,G=`
|
|
420
|
+
struct VSOut {
|
|
421
|
+
@builtin(position) pos : vec4<f32>,
|
|
422
|
+
@location(0) uv : vec2<f32>,
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
struct GeneratorUniforms {
|
|
426
|
+
baseTime : f32,
|
|
427
|
+
frame : u32,
|
|
428
|
+
amplitude : f32,
|
|
429
|
+
frequency : f32,
|
|
430
|
+
phase : f32,
|
|
431
|
+
offset : f32,
|
|
432
|
+
t_elapsed : f32,
|
|
433
|
+
duration : f32,
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
@group(0) @binding(0) var<uniform> u : GeneratorUniforms;
|
|
437
|
+
|
|
438
|
+
${d}
|
|
439
|
+
|
|
440
|
+
@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
|
|
441
|
+
var pos = array<vec2<f32>, 4>(
|
|
442
|
+
vec2<f32>(-1.0, 1.0),
|
|
443
|
+
vec2<f32>( 1.0, 1.0),
|
|
444
|
+
vec2<f32>(-1.0, -1.0),
|
|
445
|
+
vec2<f32>( 1.0, -1.0)
|
|
446
|
+
);
|
|
447
|
+
var uv = array<vec2<f32>, 4>(
|
|
448
|
+
vec2<f32>(0.0, 0.0),
|
|
449
|
+
vec2<f32>(1.0, 0.0),
|
|
450
|
+
vec2<f32>(0.0, 1.0),
|
|
451
|
+
vec2<f32>(1.0, 1.0)
|
|
452
|
+
);
|
|
453
|
+
return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
|
|
457
|
+
${$}
|
|
458
|
+
}
|
|
459
|
+
`,w=e.createShaderModule({label:`signal_2d_generator_${s.nodeId}.wgsl`,code:G});l=e.createRenderPipeline({label:`Signal2DPipeline_${s.nodeId}`,layout:"auto",vertex:{module:w,entryPoint:"vs"},fragment:{module:w,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-strip"}}),_.pipelineCache.set(S,l)}let h=p!==void 0&&g!==void 0&&g>0?p/g:r,y=p!==void 0?p:0,B=new ArrayBuffer(32),v=new Float32Array(B),b=new Uint32Array(B);v[0]=h,b[1]=y,v[2]=s.amplitude??1,v[3]=s.frequency??1,v[4]=s.phase??0,v[5]=s.offset??0,v[6]=r,v[7]=n,(!t.uniformBuffer||t.uniformBuffer.size<256)&&(t.uniformBuffer=e.createBuffer({size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:`signal_2d_uniform_buffer_${s.nodeId}`}),t.bindGroup=void 0),e.queue.writeBuffer(t.uniformBuffer,0,B),t.bindGroup||(t.bindGroup=e.createBindGroup({layout:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t.uniformBuffer}}]}));let m=a.beginRenderPass({label:`signal_2d_render_pass_${s.nodeId}`,colorAttachments:[{view:t.textureView,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});m.setPipeline(l),m.setBindGroup(0,t.bindGroup),m.draw(4),m.end()}dispatch2DAudioSignal(e,a,t,r,n,s,u,o,p){let g=this.getDeviceResources(e),d="audio_signal_2d",i=g.pipelineCache.get(d),_=this.getSampler(e);if(!i){let c=e.createShaderModule({code:`
|
|
460
|
+
struct VSOut {
|
|
461
|
+
@builtin(position) pos : vec4<f32>,
|
|
462
|
+
@location(0) uv : vec2<f32>,
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
struct AudioUniforms {
|
|
466
|
+
baseTime : f32,
|
|
467
|
+
duration : f32,
|
|
468
|
+
channel : u32,
|
|
469
|
+
pad : f32,
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
@group(0) @binding(0) var<uniform> u : AudioUniforms;
|
|
473
|
+
@group(0) @binding(1) var masterTex : texture_2d<f32>;
|
|
474
|
+
@group(0) @binding(2) var samp : sampler;
|
|
475
|
+
|
|
476
|
+
@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
|
|
477
|
+
var pos = array<vec2<f32>, 4>(
|
|
478
|
+
vec2<f32>(-1.0, 1.0),
|
|
479
|
+
vec2<f32>( 1.0, 1.0),
|
|
480
|
+
vec2<f32>(-1.0, -1.0),
|
|
481
|
+
vec2<f32>( 1.0, -1.0)
|
|
482
|
+
);
|
|
483
|
+
var uv = array<vec2<f32>, 4>(
|
|
484
|
+
vec2<f32>(0.0, 0.0),
|
|
485
|
+
vec2<f32>(1.0, 0.0),
|
|
486
|
+
vec2<f32>(0.0, 1.0),
|
|
487
|
+
vec2<f32>(1.0, 1.0)
|
|
488
|
+
);
|
|
489
|
+
return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
|
|
493
|
+
let t = u.baseTime + (in.uv.x - 0.5) * 2.0;
|
|
494
|
+
var t_norm = 0.5;
|
|
495
|
+
if (u.duration > 0.0) {
|
|
496
|
+
t_norm = clamp(t / u.duration, 0.0, 1.0);
|
|
497
|
+
}
|
|
498
|
+
let s = textureSampleLevel(masterTex, samp, vec2<f32>(t_norm, 0.5), 0.0);
|
|
499
|
+
if (u.channel == 1u) {
|
|
500
|
+
return vec4<f32>(s.g, s.g, s.g, s.g);
|
|
501
|
+
} else if (u.channel == 2u) {
|
|
502
|
+
return vec4<f32>(s.b, s.b, s.b, s.b);
|
|
503
|
+
} else if (u.channel == 3u) {
|
|
504
|
+
return vec4<f32>(s.a, s.a, s.a, s.a);
|
|
505
|
+
}
|
|
506
|
+
return s;
|
|
507
|
+
}
|
|
508
|
+
`,label:"dispatch2DAudioSignal_module"});i=e.createRenderPipeline({label:"dispatch2DAudioSignal_pipeline",layout:"auto",vertex:{module:c,entryPoint:"vs"},fragment:{module:c,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-strip"}}),g.pipelineCache.set(d,i)}let S=o!==void 0&&p!==void 0&&p>0?o/p:s,l=u>0?u:r.durationSec??0,h=new ArrayBuffer(16),y=new Float32Array(h),B=new Uint32Array(h);y[0]=S,y[1]=l,B[2]=n,y[3]=0,(!t.uniformBuffer||t.uniformBuffer.size<256)&&(t.uniformBuffer=e.createBuffer({size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"audio_signal_2d_uniform_buffer"}),t.bindGroup=void 0),e.queue.writeBuffer(t.uniformBuffer,0,h);let v=e.createBindGroup({layout:i.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t.uniformBuffer}},{binding:1,resource:r.textureView},{binding:2,resource:_}]}),b=a.beginRenderPass({label:"audio_signal_2d_render_pass",colorAttachments:[{view:t.textureView,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});b.setPipeline(i),b.setBindGroup(0,v),b.draw(4),b.end()}dispatch2DSignalMath(e,a,t,r,n,s,u,o,p,g,d){let i=n.signalConfig,_=n.operation??i?.operation??"remap",S=n.customWGSL??i?.customWGSL??"",l=this.getDeviceResources(e),h=`math_${r}_${_}_${S}`,y=l.pipelineCache.get(h),B=n.signalA?.nodeId||n.signalA?.virtualMedia?.operation?.nodeId,v=n.signalB&&typeof n.signalB=="object"?n.signalB.nodeId||n.signalB.virtualMedia?.operation?.nodeId:void 0,b=!!v,m=B?this.getOrCreate2DTextureView(e,a,B,s,u,n.signalA,o,1,d,p,g):this.getDummy1x1TextureView(e),c=v?this.getOrCreate2DTextureView(e,a,v,s,u,n.signalB,o,1,d,p,g):this.getDummy1x1TextureView(e),x=this.getSampler(e);if(!y){let{evalExpr:E,extraFn:k}=ge(_,S),q=`
|
|
509
|
+
struct VSOut {
|
|
510
|
+
@builtin(position) pos : vec4<f32>,
|
|
511
|
+
@location(0) uv : vec2<f32>,
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
struct MathUniforms {
|
|
515
|
+
bValue : f32,
|
|
516
|
+
inMin : f32,
|
|
517
|
+
inMax : f32,
|
|
518
|
+
outMin : f32,
|
|
519
|
+
outMax : f32,
|
|
520
|
+
clampMin : f32,
|
|
521
|
+
clampMax : f32,
|
|
522
|
+
exponent : f32,
|
|
523
|
+
edge0 : f32,
|
|
524
|
+
edge1 : f32,
|
|
525
|
+
a_min : f32,
|
|
526
|
+
a_max : f32,
|
|
527
|
+
t : f32,
|
|
528
|
+
t_norm : f32,
|
|
529
|
+
frame : u32,
|
|
530
|
+
hasB : f32,
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
@group(0) @binding(0) var<uniform> u : MathUniforms;
|
|
534
|
+
@group(0) @binding(1) var texA : texture_2d<f32>;
|
|
535
|
+
@group(0) @binding(2) var texB : texture_2d<f32>;
|
|
536
|
+
@group(0) @binding(3) var samp : sampler;
|
|
537
|
+
|
|
538
|
+
const PI: f32 = ${Math.PI}f;
|
|
539
|
+
const TAU: f32 = ${Math.PI*2}f;
|
|
540
|
+
const E: f32 = ${Math.E}f;
|
|
541
|
+
|
|
542
|
+
${k}
|
|
543
|
+
|
|
544
|
+
@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
|
|
545
|
+
var pos = array<vec2<f32>, 4>(
|
|
546
|
+
vec2<f32>(-1.0, 1.0),
|
|
547
|
+
vec2<f32>( 1.0, 1.0),
|
|
548
|
+
vec2<f32>(-1.0, -1.0),
|
|
549
|
+
vec2<f32>( 1.0, -1.0)
|
|
550
|
+
);
|
|
551
|
+
var uv = array<vec2<f32>, 4>(
|
|
552
|
+
vec2<f32>(0.0, 0.0),
|
|
553
|
+
vec2<f32>(1.0, 0.0),
|
|
554
|
+
vec2<f32>(0.0, 1.0),
|
|
555
|
+
vec2<f32>(1.0, 1.0)
|
|
556
|
+
);
|
|
557
|
+
return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
|
|
561
|
+
let a = textureSampleLevel(texA, samp, in.uv, 0.0).r;
|
|
562
|
+
var b = u.bValue;
|
|
563
|
+
if (u.hasB > 0.5) {
|
|
564
|
+
b = textureSampleLevel(texB, samp, in.uv, 0.0).r;
|
|
565
|
+
}
|
|
566
|
+
let a_min = u.a_min;
|
|
567
|
+
let a_max = u.a_max;
|
|
568
|
+
let inMin = u.inMin;
|
|
569
|
+
let inMax = u.inMax;
|
|
570
|
+
let outMin = u.outMin;
|
|
571
|
+
let outMax = u.outMax;
|
|
572
|
+
let clampMin = u.clampMin;
|
|
573
|
+
let clampMax = u.clampMax;
|
|
574
|
+
let exponent = u.exponent;
|
|
575
|
+
let edge0 = u.edge0;
|
|
576
|
+
let edge1 = u.edge1;
|
|
577
|
+
let t = u.t;
|
|
578
|
+
let t_norm = u.t_norm;
|
|
579
|
+
let frame = u.frame;
|
|
580
|
+
|
|
581
|
+
var val: f32 = ${E};
|
|
582
|
+
return vec4<f32>(val, val, val, val);
|
|
583
|
+
}
|
|
584
|
+
`,N=e.createShaderModule({label:`signal_math_${r}.wgsl`,code:q});y=e.createRenderPipeline({label:`SignalMathPipeline_${r}`,layout:"auto",vertex:{module:N,entryPoint:"vs"},fragment:{module:N,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-strip"}}),l.pipelineCache.set(h,y)}let M=B?this.getStats(B):void 0,P=M?.min??0,U=M?.max??1,A=v?this.getStats(v):void 0,$=Ce(_,P,U,n,b,A);this.setStats(r,$),n.nodeId&&n.nodeId!==r&&this.setStats(n.nodeId,$);let G=new ArrayBuffer(64),w=new Float32Array(G),F=new Uint32Array(G),T=p!==void 0&&g!==void 0&&g>0?p/g:s;w[0]=L(n),w[1]=n.inMin??i?.inMin??0,w[2]=n.inMax??i?.inMax??1,w[3]=n.outMin??i?.outMin??0,w[4]=n.outMax??i?.outMax??1,w[5]=n.clampMin??i?.clampMin??0,w[6]=n.clampMax??i?.clampMax??1,w[7]=n.exponent??i?.exponent??2,w[8]=n.edge0??i?.edge0??0,w[9]=n.edge1??i?.edge1??1,w[10]=P,w[11]=U,w[12]=T,w[13]=u>0?T/u:0,F[14]=p??0,w[15]=b?1:0,(!t.uniformBuffer||t.uniformBuffer.size<256)&&(t.uniformBuffer=e.createBuffer({size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:`signal_math_uniform_${r}`}),t.bindGroup=void 0),e.queue.writeBuffer(t.uniformBuffer,0,G);let R=e.createBindGroup({layout:y.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t.uniformBuffer}},{binding:1,resource:m},{binding:2,resource:c},{binding:3,resource:x}]}),D=a.beginRenderPass({label:`signal_math_pass_${r}`,colorAttachments:[{view:t.textureView,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});D.setPipeline(y),D.setBindGroup(0,R),D.draw(4),D.end()}dispatch2DSignalGate(e,a,t,r,n,s,u,o,p,g,d){let i=n.signalConfig,_=Number(n.threshold??i?.threshold??.5),S=n.mode??i?.mode??"gate",l=!!(n.invert??i?.invert??!1),h=Math.max(1,Number(n.holdFrames??i?.holdFrames??4)),y=n.sourceSignal??i?.sourceSignal??n.signal,v=y?.virtualMedia?.operation,b=y?.nodeId||v?.nodeId,m=b?this.getOrCreate2DTextureView(e,a,b,s,u,y,o,1,d,p,g):this.getDummy1x1TextureView(e),c=this.getSampler(e),x=this.getDeviceResources(e),M=`gate_2d_${S}_${l}`,P=x.pipelineCache.get(M);if(!P){let T=e.createShaderModule({label:`signal_gate_${r}.wgsl`,code:`
|
|
585
|
+
struct VSOut {
|
|
586
|
+
@builtin(position) pos : vec4<f32>,
|
|
587
|
+
@location(0) uv : vec2<f32>,
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
struct GateUniforms {
|
|
591
|
+
threshold : f32,
|
|
592
|
+
mode : u32,
|
|
593
|
+
invert : f32,
|
|
594
|
+
holdFrames : u32,
|
|
595
|
+
dx : f32,
|
|
596
|
+
pad0 : f32,
|
|
597
|
+
pad1 : f32,
|
|
598
|
+
pad2 : f32,
|
|
599
|
+
};
|
|
600
|
+
|
|
601
|
+
@group(0) @binding(0) var<uniform> u : GateUniforms;
|
|
602
|
+
@group(0) @binding(1) var texIn : texture_2d<f32>;
|
|
603
|
+
@group(0) @binding(2) var samp : sampler;
|
|
604
|
+
|
|
605
|
+
@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {
|
|
606
|
+
var pos = array<vec2<f32>, 4>(
|
|
607
|
+
vec2<f32>(-1.0, 1.0),
|
|
608
|
+
vec2<f32>( 1.0, 1.0),
|
|
609
|
+
vec2<f32>(-1.0, -1.0),
|
|
610
|
+
vec2<f32>( 1.0, -1.0)
|
|
611
|
+
);
|
|
612
|
+
var uv = array<vec2<f32>, 4>(
|
|
613
|
+
vec2<f32>(0.0, 0.0),
|
|
614
|
+
vec2<f32>(1.0, 0.0),
|
|
615
|
+
vec2<f32>(0.0, 1.0),
|
|
616
|
+
vec2<f32>(1.0, 1.0)
|
|
617
|
+
);
|
|
618
|
+
return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
|
|
622
|
+
var high: f32 = 0.0f;
|
|
623
|
+
|
|
624
|
+
if (u.mode == 0u) {
|
|
625
|
+
let a = textureSampleLevel(texIn, samp, in.uv, 0.0).r;
|
|
626
|
+
high = select(0.0f, 1.0f, a >= u.threshold);
|
|
627
|
+
} else if (u.mode == 1u) {
|
|
628
|
+
let steps = min(u.holdFrames, 32u);
|
|
629
|
+
for (var i = 0u; i < steps; i = i + 1u) {
|
|
630
|
+
let uv_cur = in.uv.x - f32(i) * u.dx;
|
|
631
|
+
if (uv_cur >= 0.0f) {
|
|
632
|
+
let cur = textureSampleLevel(texIn, samp, vec2<f32>(uv_cur, in.uv.y), 0.0).r;
|
|
633
|
+
let prev = textureSampleLevel(texIn, samp, vec2<f32>(max(0.0f, uv_cur - u.dx), in.uv.y), 0.0).r;
|
|
634
|
+
if (cur >= u.threshold && prev < u.threshold) {
|
|
635
|
+
high = 1.0f;
|
|
636
|
+
break;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
} else {
|
|
641
|
+
var count = 0u;
|
|
642
|
+
let max_scan = 128u;
|
|
643
|
+
for (var i = 0u; i < max_scan; i = i + 1u) {
|
|
644
|
+
let uv_cur = in.uv.x - f32(i) * u.dx;
|
|
645
|
+
if (uv_cur < 0.0f) { break; }
|
|
646
|
+
let cur = textureSampleLevel(texIn, samp, vec2<f32>(uv_cur, in.uv.y), 0.0).r;
|
|
647
|
+
let prev = textureSampleLevel(texIn, samp, vec2<f32>(max(0.0f, uv_cur - u.dx), in.uv.y), 0.0).r;
|
|
648
|
+
if (cur >= u.threshold && prev < u.threshold) {
|
|
649
|
+
count = count + 1u;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
high = select(0.0f, 1.0f, (count % 2u) == 1u);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (u.invert > 0.5f) {
|
|
656
|
+
high = 1.0f - high;
|
|
657
|
+
}
|
|
658
|
+
return vec4<f32>(high, high, high, 1.0f);
|
|
659
|
+
}
|
|
660
|
+
`});P=e.createRenderPipeline({label:`SignalGatePipeline_${r}`,layout:"auto",vertex:{module:T,entryPoint:"vs"},fragment:{module:T,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-strip"}}),x.pipelineCache.set(M,P)}let U=new ArrayBuffer(256),A=new Float32Array(U),$=new Uint32Array(U);A[0]=_,$[1]=S==="trigger"?1:S==="toggle"?2:0,A[2]=l?1:0,$[3]=h,A[4]=1/Math.max(1,o),(!t.uniformBuffer||t.uniformBuffer.size<256)&&(t.uniformBuffer=e.createBuffer({size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:`signal_gate_uniform_${r}`}),t.bindGroup=void 0),e.queue.writeBuffer(t.uniformBuffer,0,U);let G=e.createBindGroup({layout:P.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t.uniformBuffer}},{binding:1,resource:m},{binding:2,resource:c}]}),w=a.beginRenderPass({label:`signal_gate_pass_${r}`,colorAttachments:[{view:t.textureView,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});w.setPipeline(P),w.setBindGroup(0,G),w.draw(4),w.end(),this.setStats(r,{min:0,max:1})}dispatch1DGateSignal(e,a,t,r,n,s,u,o,p,g,d){let i=this.getDeviceResources(e),_=n.signalConfig,S=Number(n.threshold??_?.threshold??.5),l=n.mode??_?.mode??"gate",h=!!(n.invert??_?.invert??!1),y=Math.max(1,Number(n.holdFrames??_?.holdFrames??4)),B=Number(n.debounceMs??_?.debounceMs??100),v=Math.max(1,Math.round(B/1e3*p)),m=Math.max(1,Math.round(y/(d??24)*p)),c=`1d_gate_${l}_${S}_${h}`,x=i.pipelineCache.get(c);if(!x){let F=e.createShaderModule({label:"signal_1d_gate.wgsl",code:`
|
|
661
|
+
struct Gate1DUniforms {
|
|
662
|
+
threshold : f32,
|
|
663
|
+
mode : u32,
|
|
664
|
+
invert : f32,
|
|
665
|
+
holdSamples : u32,
|
|
666
|
+
debounceSamples : u32,
|
|
667
|
+
numSamples : u32,
|
|
668
|
+
pad0 : f32,
|
|
669
|
+
pad1 : f32,
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
@group(0) @binding(0) var<uniform> u : Gate1DUniforms;
|
|
673
|
+
@group(0) @binding(1) var<storage, read> bufIn : array<f32>;
|
|
674
|
+
@group(0) @binding(2) var<storage, read_write> outSignal : array<f32>;
|
|
675
|
+
|
|
676
|
+
@compute @workgroup_size(64)
|
|
677
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
678
|
+
let idx = gid.x;
|
|
679
|
+
if (idx >= u.numSamples) { return; }
|
|
680
|
+
|
|
681
|
+
var high: f32 = 0.0f;
|
|
682
|
+
if (u.mode == 0u) {
|
|
683
|
+
let cur = bufIn[idx];
|
|
684
|
+
high = select(0.0f, 1.0f, cur >= u.threshold);
|
|
685
|
+
} else if (u.mode == 1u) {
|
|
686
|
+
let max_scan = min(idx, u.holdSamples);
|
|
687
|
+
for (var i = 0u; i <= max_scan; i = i + 1u) {
|
|
688
|
+
let cur_idx = idx - i;
|
|
689
|
+
let cur = bufIn[cur_idx];
|
|
690
|
+
var prev = 0.0f;
|
|
691
|
+
if (cur_idx > 0u) {
|
|
692
|
+
prev = bufIn[cur_idx - 1u];
|
|
693
|
+
}
|
|
694
|
+
if (cur >= u.threshold && prev < u.threshold) {
|
|
695
|
+
high = 1.0f;
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
} else {
|
|
700
|
+
var count = 0u;
|
|
701
|
+
var last_trigger = 0u;
|
|
702
|
+
var has_triggered = false;
|
|
703
|
+
for (var i = 0u; i <= idx; i = i + 1u) {
|
|
704
|
+
let cur = bufIn[i];
|
|
705
|
+
var prev = 0.0f;
|
|
706
|
+
if (i > 0u) {
|
|
707
|
+
prev = bufIn[i - 1u];
|
|
708
|
+
}
|
|
709
|
+
if (cur >= u.threshold && prev < u.threshold) {
|
|
710
|
+
if (!has_triggered || (i - last_trigger) >= u.debounceSamples) {
|
|
711
|
+
count = count + 1u;
|
|
712
|
+
last_trigger = i;
|
|
713
|
+
has_triggered = true;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
high = select(0.0f, 1.0f, (count % 2u) == 1u);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
if (u.invert > 0.5f) {
|
|
721
|
+
high = 1.0f - high;
|
|
722
|
+
}
|
|
723
|
+
outSignal[idx] = high;
|
|
724
|
+
}
|
|
725
|
+
`});x=e.createComputePipeline({label:`Signal1DGatePipeline_${l}`,layout:"auto",compute:{module:F,entryPoint:"main"}}),i.pipelineCache.set(c,x)}let M=new ArrayBuffer(256),P=new Float32Array(M),U=new Uint32Array(M);P[0]=S,U[1]=l==="trigger"?1:l==="toggle"?2:0,P[2]=h?1:0,U[3]=m,U[4]=v,U[5]=o;let A=e.createBuffer({size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"gate_1d_uniform"});e.queue.writeBuffer(A,0,M);let $=e.createBindGroup({layout:x.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:A}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:t.buffer}}]}),G=a.beginComputePass({label:"gate_1d_compute_pass"});G.setPipeline(x),G.setBindGroup(0,$),G.dispatchWorkgroups(Math.ceil(o/64)),G.end()}};function ge(f,e){switch(f){case"remap":return{evalExpr:"mix(u.outMin, u.outMax, clamp((a - u.inMin) / max(1e-5, u.inMax - u.inMin), 0.0, 1.0))",extraFn:""};case"normalize":return{evalExpr:"clamp((a - u.a_min) / max(1e-5, u.a_max - u.a_min), 0.0, 1.0)",extraFn:""};case"add":return{evalExpr:"a + b",extraFn:""};case"subtract":return{evalExpr:"a - b",extraFn:""};case"multiply":return{evalExpr:"a * b",extraFn:""};case"divide":return{evalExpr:"a / select(b, 1e-5, abs(b) < 1e-5)",extraFn:""};case"invert":return{evalExpr:"1.0 - a",extraFn:""};case"clamp":return{evalExpr:"clamp(a, u.clampMin, u.clampMax)",extraFn:""};case"power":return{evalExpr:"pow(max(0.0, a), u.exponent)",extraFn:""};case"smoothstep":return{evalExpr:"smoothstep(u.edge0, u.edge1, a)",extraFn:""};case"custom":return{extraFn:`
|
|
726
|
+
fn user_signal_calc(a: f32, b: f32, a_min: f32, a_max: f32, t: f32, t_norm: f32, frame: u32) -> f32 {
|
|
727
|
+
${e}
|
|
728
|
+
}
|
|
729
|
+
`,evalExpr:"user_signal_calc(a, b, a_min, a_max, t, t_norm, frame)"};default:return{evalExpr:"a",extraFn:""}}}function L(f){if(typeof f.signalB=="number"&&!Number.isNaN(f.signalB))return f.signalB;if(f.signalB&&typeof f.signalB=="object"&&typeof f.signalB.value=="number"&&!Number.isNaN(f.signalB.value))return f.signalB.value;if(typeof f.bValue=="number"&&!Number.isNaN(f.bValue))return f.bValue;let e=f.signalConfig;return typeof e?.bValue=="number"&&!Number.isNaN(e.bValue)?e.bValue:1}function Ce(f,e,a,t,r,n){let s=t.signalConfig;switch(f){case"remap":{let u=Number(t.outMin??s?.outMin??0),o=Number(t.outMax??s?.outMax??1);return{min:Math.min(u,o),max:Math.max(u,o)}}case"normalize":return{min:0,max:1};case"invert":return{min:1-a,max:1-e};case"clamp":{let u=Number(t.clampMin??s?.clampMin??0),o=Number(t.clampMax??s?.clampMax??1);return{min:u,max:o}}case"power":{let u=Number(t.exponent??s?.exponent??2);return{min:Math.max(0,e)**u,max:Math.max(0,a)**u}}case"add":{if(r&&n)return{min:e+n.min,max:a+n.max};let u=r?0:L(t);return{min:e+u,max:a+u}}case"subtract":{if(r&&n)return{min:e-n.max,max:a-n.min};let u=r?0:L(t);return{min:e-u,max:a-u}}case"multiply":{if(r&&n){let o=[e*n.min,e*n.max,a*n.min,a*n.max];return{min:Math.min(...o),max:Math.max(...o)}}let u=r?1:L(t);return{min:Math.min(e*u,a*u),max:Math.max(e*u,a*u)}}case"divide":{if(r&&n){let p=Math.abs(n.min)<1e-5?1e-5:n.min,g=Math.abs(n.max)<1e-5?1e-5:n.max,d=[e/p,e/g,a/p,a/g];return{min:Math.min(...d),max:Math.max(...d)}}let u=r?1:L(t),o=Math.abs(u)<1e-5?1e-5:u;return{min:Math.min(e/o,a/o),max:Math.max(e/o,a/o)}}default:return{min:0,max:1}}}var Ye=new ue;export{Z as a,se as b,ue as c,Ye as d};
|