{"_id":"treslib","_rev":"31-4abf9dd3afb285bdb16baec3bf66cc1f","name":"treslib","dist-tags":{"latest":"1.11.0"},"versions":{"1.0.0":{"name":"treslib","version":"1.0.0","author":"","license":"ISC","_id":"treslib@1.0.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"5099999f24cee1c07ab241b78d778b6ee4112b81","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.0.0.tgz","fileCount":6,"integrity":"sha512-gPCqRLCvjyN8X0sxWxNexR+bP748GaRLWh/iP8XSKVRXIc70RmlZKL5REm2ysnOrkjNLrrG0CaTWnF9mqTd5Xw==","signatures":[{"sig":"MEUCIQCnOQ43ztXNqMn4Zy64DQLxlr7Z7m5I4MhMGZ4+Z9H0cgIgH4j983pF9uK+PYirI7oa3Y0N6uKbSmMWl+pKX+dZIj8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15531},"main":"index.js","gitHead":"b2a02287067199cf2d5a4b8588f63379772f8e6e","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencia con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.0.0_1727210817119_0.0995340147548105","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"treslib","version":"1.1.0","author":"","license":"ISC","_id":"treslib@1.1.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"bf1b4bfb3f4f482055a9ab508fbc51d4c1728b54","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.1.0.tgz","fileCount":6,"integrity":"sha512-bZP6bmCd/8qIzW/MBZQ1+RB16Yk3p5pmlJxzke6wIqsRXIcG3vOn9Iz1bvBrcn7foKsrQahY3lsDHJL7dQ+P4Q==","signatures":[{"sig":"MEYCIQC8mSAgI1JU28IiKvJavyr/W69p3N7MJFTqmIPG8fZn5AIhAKMDdZnFqpEcGrNbM7RPb8t26gz/aVMPw6UwSYHUe7le","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15537},"main":"./src/index.js","gitHead":"0ae44308165dd422e4745f2a2fdf925d02c1c9e0","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencia con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.1.0_1727833398393_0.7763278291277262","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"treslib","version":"1.1.1","author":"","license":"ISC","_id":"treslib@1.1.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"844abe1aeaadced2a0b0e51a1723968655a23dc2","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.1.1.tgz","fileCount":6,"integrity":"sha512-oL5QET8cx6FhZgyojLlQohLU7r8+WbrGXHurXnIr7hoY3B1X5zw4n+7RbC4ZGE+/Zyp9Q4a4Aw5U7aApJOrwpg==","signatures":[{"sig":"MEUCIF9fRb2o//YXfIp04Pqft6ldDsOqyM7OMbimELrtNh/PAiEAn2bRyuBYJliXav49Q20ILP6r6SVd4hVtNrdrcgL5GHA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15535},"main":"./src/index.js","gitHead":"cdc9a991e6027c898a4884bbf7bb426ae3a800fd","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencia con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.1.1_1727833584244_0.9514608778839222","host":"s3://npm-registry-packages"}},"1.1.2":{"name":"treslib","version":"1.1.2","author":"","license":"ISC","_id":"treslib@1.1.2","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"8c91020ae850eb5d7c7eb24e052bbcf92b5bed2d","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.1.2.tgz","fileCount":17,"integrity":"sha512-OnFX9KVTbsnXbqkyynGal/0ruPM9LQ1jdl/uxhXTYn/y9WyrjpAt7jg6jGnkBE5V2lx0KnwFHUQJ45KuvHsGNg==","signatures":[{"sig":"MEYCIQDGRHf42e5db56K1Nc/PLFjDFRzQUcjarwByxY3k4lT9AIhAINcxPFpXY+/qWjHGwtS2MRcGM1dm//s8s/M6QnciiPz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":141886},"main":"./src/index.js","gitHead":"a0ff679bb15d64511a3cb20b034fcaa4ac8b4891","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencias con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.1.2_1727926799953_0.5084247656523009","host":"s3://npm-registry-packages"}},"1.1.3":{"name":"treslib","version":"1.1.3","author":"","license":"ISC","_id":"treslib@1.1.3","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"a8a0f669b9b4d179648d4848176c6eb776fb30a7","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.1.3.tgz","fileCount":17,"integrity":"sha512-eiwFtgxDIDajMfPhbdmzprgWvIxEywAX6qzjERgAybXy6PwxRqhOe4ekDQBjh+AOZ+vD/YnBAVGDE0sZC9Iqug==","signatures":[{"sig":"MEQCICUe4nUk09jLOs3JeHrYmDX8o8JZnmBX/urqkzut1qVfAiA2+1sO/TNdEkoOInr1HKydFTrrY2jSQBodXdZiR55ZVQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":141896},"main":"./src/index.js","gitHead":"65f59a551d66315b5d528e4e7ea93dffce8c9fdd","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencias con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.1.3_1727985342611_0.8937688365051986","host":"s3://npm-registry-packages"}},"1.1.4":{"name":"treslib","version":"1.1.4","author":"","license":"ISC","_id":"treslib@1.1.4","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"66304bedad9a6f77316e75b2f22ce71d833d2172","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.1.4.tgz","fileCount":17,"integrity":"sha512-d5F+FROaMOcFwK8GZiSQTIu+13iwDiCMHdeIcP62wh3ExpfWmasivCLhU2UN5OVE8dE0CPULgAqiVgejp30DXQ==","signatures":[{"sig":"MEUCIBSoH+37bYeGPZ8RZqFCFydHoKEn5g1g8RvJ3i4h3J27AiEAoXaYDAiDB+iauhKefUNw+iWHFoYyMhmbvSmOTlLxCv4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":142184},"main":"./src/index.js","gitHead":"3f751120308d4d062d738ca4f891040ca76c22bb","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencias con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.1.4_1728004492267_0.12292720146917491","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"treslib","version":"1.2.0","author":"","license":"ISC","_id":"treslib@1.2.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"7cc81ec5af99a85a84e68d5a319fd872e813b629","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.2.0.tgz","fileCount":17,"integrity":"sha512-1+Y0GxezLOYrJF3xfgyRoa7LUP/Myi5tINEP715OWbTn7WDMxpPiZL6s2Ra9GdKTMpnIudvNZzBM4EQJRR9NMA==","signatures":[{"sig":"MEQCIA9LgJ0MBC0XBhByeFCgPHlPqVclSaBAg9rxk1wNNNtrAiA4GCEDpxtRz3OV+pTf4mJf/LP/KYAW3SDMgZSv3U77Hw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":142189},"main":"./src/index.js","gitHead":"2111a98bec96d011e41e9da553977403aa473fc3","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y secuencias con WebAudioAPI.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.2.0_1728004942384_0.856370513400124","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"treslib","version":"1.2.1","author":"","license":"ISC","_id":"treslib@1.2.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"c326828ae3837f4ed2ec01de2c0e57d60a56ecad","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.2.1.tgz","fileCount":17,"integrity":"sha512-xQioao0XVfsNQKEmMKq9Q/RJqXSTDmH5wdRQFCTx18XvkFNU98m5UbKRjwMn2bjE4/7I6XHINAMsBxPWAvdOFw==","signatures":[{"sig":"MEUCIQDPZ23TKnzlDbAR53WR04cTjuVY0GHOYO3G/2vatLZw1gIgPDyNEQ63bGXsspYSxNIftylyJ1soAEJGE5ij/Ss5PYE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143105},"main":"./src/index.js","gitHead":"29d74b15e54d5d781f61b5302d28ead30463b107","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y grabación con WebAudioAPI. También se incluyen algunas clases adicionales para buscar y descargar archivos de freesound.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.2.1_1728090215304_0.20583562394344757","host":"s3://npm-registry-packages"}},"1.2.2":{"name":"treslib","version":"1.2.2","author":"","license":"ISC","_id":"treslib@1.2.2","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"3647915eef72017eedf1601f3995c39ddd2537d8","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.2.2.tgz","fileCount":17,"integrity":"sha512-n5Aqs0urUIFgo4jDnbxI+DFgeNNog6WMTV2datAWdMEPMXvwMDrZ79q+qg2T5PbhGMegCQm4pYKCtPhDCxyxkw==","signatures":[{"sig":"MEQCIChYUxbCITtf7pCiLONm9BpiSQySF/N1kVI2Oc46Ui4yAiBscAf03cASPmh5q3KA2GAwMHXIFzTQY/TIPwxOaM5c4w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143287},"main":"./src/index.js","gitHead":"0c89b651e89c33421ece916d29d1834815f9ef02","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y grabación con WebAudioAPI. También se incluyen algunas clases adicionales para buscar y descargar archivos de freesound.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.2.2_1728282753060_0.8411755515131063","host":"s3://npm-registry-packages"}},"1.2.3":{"name":"treslib","version":"1.2.3","author":"","license":"ISC","_id":"treslib@1.2.3","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"c225663c4d79550b3fc641db406b3515b2b121bc","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.2.3.tgz","fileCount":17,"integrity":"sha512-4wJyGkCnlJe1v+gA+u4wuY9Z0rCd04pFRucTcUPlYmJioUj0MrE5y/2a6qObsET82cp8/mFezXO8Bz+JJxUTnA==","signatures":[{"sig":"MEUCIA9ImJ9J4tYW0lpugOXmfkyv6SvUf9nDqwQPlmxx8w3iAiEA0Z+AAwQ5366nq58iuGmXAwWFMft7dbVTjbzFRZXrwy0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":144114},"main":"./src/index.js","gitHead":"d33f89b45fe8e4d97e823b365cd85e7107d5be65","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y grabación con WebAudioAPI. También se incluyen algunas clases adicionales para buscar y descargar archivos de freesound.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.2.3_1728283547458_0.5509880483272978","host":"s3://npm-registry-packages"}},"1.2.4":{"name":"treslib","version":"1.2.4","author":"","license":"ISC","_id":"treslib@1.2.4","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"be0e2d755d3320f3b3687c4fb438c21257282894","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.2.4.tgz","fileCount":17,"integrity":"sha512-Pq6X0nWgZURZStu1vlVakmRG2nwWYSLxDOOPz5n94vVjXvvGsCEMdnIUznG+QEr75D2HdhUQDRToLwIuahCFUg==","signatures":[{"sig":"MEUCIQC1Se3WS0OCNcZtlh9+RNYStV87F6zuPu3tUBHWndcCnQIgO7vyW1lACJl1GM8UhMpze3qv//9M13PQjaFeb1w1Z+4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":148774},"main":"./src/index.js","gitHead":"d34c14180774223b7aebe5e13b974515c6af3169","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"10.8.2","description":"Granulación y grabación con WebAudioAPI. También se incluyen algunas clases adicionales para buscar y descargar archivos de freesound.","directories":{},"_nodeVersion":"20.18.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.2.4_1729046094266_0.7594816554229591","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"treslib","version":"1.3.0","author":"","license":"ISC","_id":"treslib@1.3.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"fa569d08ed172f2ad8771b3adb10883a00d71e09","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.3.0.tgz","fileCount":17,"integrity":"sha512-hUZeX5SWVKO2OYuMYoluGTDD0GsTODsMPoz9dRa4+6TXA0RnIjytrQOhLmcS+qRzcxbmElgyoCK7pV2PJY6GAA==","signatures":[{"sig":"MEUCIQCVUpGTdgaYYsXfj/u6HdLsyBOvWB5VBvQx76hNNmFU+QIgXUTioqeee0+zvE/zmJY3f4M+SZ76ksr2YxE4TJNOnPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145768},"main":"./src/index.js","gitHead":"6ec1a9e9edc09845d59bb383996703da552943dc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y grabación con WebAudioAPI. También se incluyen algunas clases adicionales para buscar y descargar archivos de freesound.","directories":{},"_nodeVersion":"20.19.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.3.0_1746231511983_0.5747990431643888","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"treslib","version":"1.3.1","author":"","license":"ISC","_id":"treslib@1.3.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"766a3b5fee35f8e4d5da653509aa5befab52de3d","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.3.1.tgz","fileCount":17,"integrity":"sha512-P8foFLD2ceHBGCMoYsRtv/yO9BvbOzzNPWgALL7J+RMlaunxGLLcbvG5chTVv+qyRRdS7RGLrXPcVq6g9DjCRg==","signatures":[{"sig":"MEQCIFm6U3674vZvdMe8wPCURGYKsk5JLUqhhuX5Ke4SHBOjAiBeXHr43uAD/ohNLzlL6wWd/YwZwWRSt14wJDiqAzLVBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146340},"main":"./src/index.js","gitHead":"6bf6943f97fa1213c0dec79b3a28c21250410c2a","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y grabación con WebAudioAPI. También se incluyen algunas clases adicionales para buscar y descargar archivos de freesound.","directories":{},"_nodeVersion":"20.19.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.3.1_1746231865542_0.6710704202391096","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"treslib","version":"1.3.2","author":"","license":"ISC","_id":"treslib@1.3.2","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"edb85697f361f5be27fb50746e22e9bef413b9b0","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.3.2.tgz","fileCount":20,"integrity":"sha512-UpJF1xohQzxuGlnS4pphpUmWI/mrY2FFxmHE03WsYTQlO4R8vUeAnzfD/QnwzbOZiv6HZyf8m9Lw4Ih2P/IHRQ==","signatures":[{"sig":"MEUCIH2b66Q4YDduslgZuxBrSU0DYAUs3DmFzjpm+vKwO3OfAiEAyQP+PMVTDlR/By+gDjkpipkbjmXKOoMDDFYYebyz7Cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157326},"main":"./src/index.js","gitHead":"d1a7aff42ffb84e3536ffcc3eff1f2320ea6fed8","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Granulación y grabación con WebAudioAPI, buscar y descargar archivos de freesound y detección de onsets.","directories":{},"_nodeVersion":"20.19.2","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.3.2_1753981643169_0.7830015911515862","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"treslib","version":"1.3.3","author":"","license":"ISC","_id":"treslib@1.3.3","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"7c9910bcc52d36a5a3fc92d907d007d3a40ead94","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.3.3.tgz","fileCount":24,"integrity":"sha512-bPNGquv9JNQvOnY3MW6WDM9ElSkyH+jtFjgLgaRCoRYO+SDDEkDIzAKcggjAlGblZTMibwKm0JBKG+wOcJy8KQ==","signatures":[{"sig":"MEYCIQCLPuvL3MyMFgCz92lTWX+GlnpeeLx9/t8qt3c3v4UAiwIhAMpfqL89xCvW1BRYEQe+wh/fnQ55LPvDKo1ZrmGHcTwF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165620},"main":"./src/index.js","gitHead":"a6886ce059b6e54d45ddf5e2bb66f52d18ee6f5d","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.2","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.3.3_1754074373740_0.45399959864155615","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"treslib","version":"1.3.4","author":"","license":"ISC","_id":"treslib@1.3.4","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"1aab3fdf28fae964acb89e2df4f48d702f65f9d2","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.3.4.tgz","fileCount":24,"integrity":"sha512-ND5G9HEcl0ZR/67cc1mQDLmL5vsxL6cAvyX3TdmOhdyKjCyF5Hpvwtf5/Pbem+Oez+uAE5VWjUcbQNoBBGpESw==","signatures":[{"sig":"MEYCIQCizDXQ/1Jo50wUgOryibJR8eQFXFfFdj0rymy6usBKKwIhAMgqg3XMe+C8RErjXysT3NDbbrW2R69/gxTJ01x1NRVO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165597},"main":"./src/index.js","gitHead":"fcf5c97849d90a39948fd15778b6685dc8ea42fe","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.2","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.3.4_1754077387414_0.415241673625679","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"treslib","version":"1.3.5","author":"","license":"ISC","_id":"treslib@1.3.5","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"15a5aafbe03fbb29dd92b74e762b3e6c35f03227","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.3.5.tgz","fileCount":26,"integrity":"sha512-ENXHrMPz4knZMWB/rW339jEXQ75Lsp4PedUJAK3ylgl9JlAgr9RQDZWD/WxHKHHFq8tioDtOCQdWbwpEvPgvQQ==","signatures":[{"sig":"MEUCICa456OTpY7rfhAkshl6o5JSkNOCtTZQHpqzPqVKNyjWAiEAkQ0x6PHvEW4Ycz9JNFCOCjFDIvxVp3w8MXt6Wzctbi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177290},"main":"./src/index.js","gitHead":"9a87990f74bc3ddf10ff50ac37b9a111c6b93bd7","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.2","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.3.5_1755139252151_0.9418521251585592","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"treslib","version":"1.4.0","author":"","license":"ISC","_id":"treslib@1.4.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"1a9eebc61d830e9e18bb20a5f8ad6083f1591735","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.4.0.tgz","fileCount":30,"integrity":"sha512-oP9d7RHL6WoEX5QIAR8076OvfQPWG9mo7iGQZ+wviyUvQHPkFUpzNtKONSar9+eIfJaXDccH7Hmmek0JX99ICA==","signatures":[{"sig":"MEUCIBCgMXJXVqkapyZwDinyrEpZSCrt1khVizKJzpkqXz8iAiEA3TCpvpI7zP9OiL/MnSSdftXBjjBkL+B9HJqMMrw0HNU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208207},"main":"./src/index.js","gitHead":"34dda7a57c2177780e51ef78da940f982a4c83f2","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.4.0_1763335785471_0.8118804879880062","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"treslib","version":"1.4.1","author":"","license":"ISC","_id":"treslib@1.4.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"e787416594bec67a90333a53251710daf90bab0d","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.4.1.tgz","fileCount":30,"integrity":"sha512-CZAM192Xibe77bfhDtBC+Gk6qtF9XqqHr+vE4JD/isOYJPurAeDIMWLxNO50uXiW8835Pebq6rw59SRo2gBUTw==","signatures":[{"sig":"MEQCIFKWwcE04/DPEPY6dMdt1afzFMXsugfgQAJI9P9ndHSQAiB7T6BS+eqXIlRRhN6UHX7stVuFu5ZdwDvfiZVj4BoCJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208307},"main":"./src/index.js","gitHead":"5c5bf2c97ad9ed96a21611aff40e0871b1d33625","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.4.1_1763336627329_0.26101214792330185","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"treslib","version":"1.5.0","author":"","license":"ISC","_id":"treslib@1.5.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"4d6a522d2cf2c406bf474aea4bd25e0c2a2a8b5e","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.5.0.tgz","fileCount":34,"integrity":"sha512-kfwtBPRAB0kfFUU0+ZstTaCP53CH9B/P40Z+5PjkYDs2CIWFOQfpv9yj4ddSRu7j8A8qVmqKFCC9c+NPH9ercw==","signatures":[{"sig":"MEUCIQCmdez2FGnd/+Plgq4WQCQOyszl/Y8HgiD38OKdFGYO3AIgNXUw1bx2/wjcw8lbH9K0IJ8AUP8tAnoYrKv0W1lNC2Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":250367},"main":"./src/index.js","gitHead":"4ac96f0fb701e8c0b08632e6aed57f7dd238af8b","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.5.0_1763578626161_0.08877055315753957","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"treslib","version":"1.5.1","author":"","license":"ISC","_id":"treslib@1.5.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"386cf2dc85e4f4f1198ec0dbb74a8938f04e42d7","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.5.1.tgz","fileCount":34,"integrity":"sha512-bI/0R/0aMS8pDmUoccoJDj+0xbt1ga126l5QB6EMYGB3LLEI1MNo9GnkF0AYa7zO5ws3vDkfqX9HEiQQqzYWXg==","signatures":[{"sig":"MEYCIQCl+o57o57AzgsdO0BZ8QrkFPFFkH7+iesMtEwzTpyVJAIhAJDX7LFzc5qpATLEzgJ2GdH+h29PZ5nUL0fiT310RV6f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":250367},"main":"./src/index.js","gitHead":"0a2a9fe8f31cbbc822afabd64c66006b1e6c3452","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.5.1_1763579205791_0.18637785106872706","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"treslib","version":"1.5.2","author":"","license":"ISC","_id":"treslib@1.5.2","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"e30bc3d7ebe1c300746525b38ca0eebd60072af4","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.5.2.tgz","fileCount":34,"integrity":"sha512-X5h8z0je2fZvRF1OIb/iDOU0sIV+5R/x3CX0rHyqd0d0ppfqRKMMO1YTDcTpPUhIpXtswLsXZobyTtlg7+y1tg==","signatures":[{"sig":"MEQCIA/q2McA6ELhBj3uExyS86/eViONNpnCjoFWRvKqFcM+AiBpWEW65pD3NZ7cqRx3db0jUmQMzP+mJ9726blUh38pBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":250411},"main":"./src/index.js","gitHead":"e7e57a0e11a22db9c904df0da30f236ab52e3b23","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"Esta librería proporciona un conjunto de clases diseñadas para controlar el tiempo y la manipulación de audio en proyectos creativos con JavaScript, especialmente en entornos que utilizan Web Audio API. Ideal para arte generativo, música algorítmica, inst","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.5.2_1763579687893_0.6198672918144088","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"treslib","version":"1.6.0","author":"","license":"ISC","_id":"treslib@1.6.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"df8c55f3c61aae9aac9c0cd182440b8792577563","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.6.0.tgz","fileCount":37,"integrity":"sha512-x8l90OZdBbQ7FsFvaiOKy+FAMpJ5/QSQQeEoBGORfabSCC/r8PbBTgfzM7DdiETZwAzqxi/PzGkfSNnO4rdg8w==","signatures":[{"sig":"MEYCIQDxXEIQsJt3Fbv3idDDOhi0cAqyPQNiM3km7YmU5T22WgIhAMssgyawxaCfHoyl1zwnorsfu17yAcfoPhSw3u912fPs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281984},"main":"./src/index.js","gitHead":"30c71d1f7b6b50171b6e0a85f9ce6749c7828d14","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.6.0_1763914035705_0.650083508809163","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"treslib","version":"1.6.1","author":"","license":"ISC","_id":"treslib@1.6.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"fb49853af41c347eea3093273976db8a669d9e3c","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.6.1.tgz","fileCount":37,"integrity":"sha512-DY/AsjkVqPxsDaT1dXQv0fN3a64XyLWVNFKsbWOnLe38D8cw/0tkoxlFn8pItnX2cuqSHZmaW2lMdHNiUeM8tw==","signatures":[{"sig":"MEQCIDEKlRhmK9QEzX4Lx673f75/DyeAp2c9w02kdTMmMOF8AiBl/qvahrK+ygNLWpsZRrUu8dSEs1q9e2c0iO0TY5ZHnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":283839},"main":"./src/index.js","gitHead":"2fa240b5130014130a22c9c62dbf3466332fc5d2","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"20.19.4","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.6.1_1763915354548_0.6343205960795866","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"treslib","version":"1.7.0","author":"","license":"ISC","_id":"treslib@1.7.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"0e73bf11a23436cc4c17752b5c2134af06c3dc9b","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.7.0.tgz","fileCount":42,"integrity":"sha512-Z2BPPNUKSW5iuu2hLj/JGedjxHsSGF7Xbk29TlP03TzXcQOQYZ6gLsR99eHn/Rfbsbr9gvL1oIlE12RNyEMaYA==","signatures":[{"sig":"MEUCIC8YRPX5KQPJYEGO1364Mvy4Hq3kCtH5mUPbJ9e9h6jvAiEAgWnK9ONurWVYVgA4oCGSrbKW1DwfnwTeVD0aNv53HA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335947},"main":"./src/index.js","gitHead":"1ff8fdaf1ed77b5b7b4c7c769966998d38b37242","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"20.19.5","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/treslib_1.7.0_1764890156982_0.8687230403618669","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"treslib","version":"1.8.0","author":"","license":"ISC","_id":"treslib@1.8.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"51faffed3666f0b2ba2c6ebc7d9e35eb8de645bd","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.8.0.tgz","fileCount":45,"integrity":"sha512-oofDJH/9DaobUAaqcE13hD6HPCqeV8j3W2Cp9gGZCAx1KBY4NO464QJ6ZLzPAS4rOSg0lV/fxn136pbVKnwTMw==","signatures":[{"sig":"MEUCICkjfv+TOW6ftNVV1qbifwatKNSFhwlVISXt8JbJUyNAAiEAgMejhy+QYSnrvq4rk5W9w6B+rET91Y8pjIjRkOOXnoo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":306772},"main":"./src/index.js","gitHead":"cbe2f6668d777283c092f34efa8f65b4b1c4a91f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"22.22.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.132.2","hydra-synth":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/treslib_1.8.0_1775703907305_0.16085378742523782","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"treslib","version":"1.9.0","author":"","license":"ISC","_id":"treslib@1.9.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"6318c7bb1f8762d296b826a0a5856ed203ea66ea","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.9.0.tgz","fileCount":23,"integrity":"sha512-mLRRUAySm/MfHeABJvba8grCkCIONutOy3hZSy08v+WQK9+tgt4QqUwsasPTOnnt2i42EAQ4+psXZ/yuFYfBQg==","signatures":[{"sig":"MEUCIB9ybAedUPzr1dfIplpRJmh16V6SkRiFAa/zQVdaCUSMAiEAzwASjY/0W0xej3IaOX0oO7XVuJNc3Mj4pR+oDPuh2fk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165912},"main":"./src/index.js","gitHead":"584296c6343c849a389540b94164dcf7ec9ab110","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build:strudel":"esbuild docs/examples/snap-strudel/strudel-entry.js --bundle --format=esm --outfile=docs/examples/snap-strudel/strudel.bundle.js"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"9.2.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"22.22.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@strudel/core":"^1.2.6","@strudel/mini":"^1.2.6","@kabelsalat/web":"^0.4.1","@strudel/webaudio":"^1.2.6"},"peerDependencies":{"three":">=0.132.2","hydra-synth":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/treslib_1.9.0_1778186199709_0.3326673092052963","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"treslib","version":"1.10.0","author":"","license":"ISC","_id":"treslib@1.10.0","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"a4259103ef18a6584dcc24f3832767d8e92a0577","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.10.0.tgz","fileCount":23,"integrity":"sha512-EUKpsXPcCGA6hp7+Gp8kNeG8oLydEDi9rgsJFHLO4GRCU6V+jZ7NA0qSzdBJ54OWTe4R1/CCyKwqAW7+yBirYw==","signatures":[{"sig":"MEQCIG46Ad1ZT3P84yJqOkL7ym0BV9N4vFTp00uz/Vr5dm3kAiBcB4Rt7Qx3IcPpjHskWM9LGc37IHzyCs8lVHTBjxNryQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166509},"main":"./src/index.js","gitHead":"5d656e86de3ab3d6629cd92307dbbede2ae9a7d2","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build:strudel":"esbuild docs/examples/snap-strudel/strudel-entry.js --bundle --format=esm --outfile=docs/examples/snap-strudel/strudel.bundle.js"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"11.16.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"22.22.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@strudel/core":"^1.2.6","@strudel/mini":"^1.2.6","@kabelsalat/web":"^0.4.1","@strudel/webaudio":"^1.2.6"},"peerDependencies":{"three":">=0.132.2","hydra-synth":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/treslib_1.10.0_1782954286919_0.9537121171201455","host":"s3://npm-registry-packages-npm-production"}},"1.10.1":{"name":"treslib","version":"1.10.1","author":"","license":"ISC","_id":"treslib@1.10.1","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"7b62d3f22489b400801058dc242f8f82fd2b1737","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.10.1.tgz","fileCount":23,"integrity":"sha512-0HZ7m3ZnD6GHbjAakWv2vMKOn2xM13KSdxGvWJL+spp+hk7WOkAULYJue5DIvGajAq4rN+dKA+5Rvfw5K5QC7A==","signatures":[{"sig":"MEUCIQCNiwtz6RRSAHVB7Obzouo6DNaccbVMmg0De3c+mor4lwIgKiCIRKIwFgte/FXLV7V+7/vqatyHs1u/CXxii9LpTc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166876},"main":"./src/index.js","gitHead":"9b1619ada6d53047e91565476caba0fd35fb9a96","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build:strudel":"esbuild docs/examples/snap-strudel/strudel-entry.js --bundle --format=esm --outfile=docs/examples/snap-strudel/strudel.bundle.js"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"11.16.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"22.22.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@strudel/core":"^1.2.6","@strudel/mini":"^1.2.6","@kabelsalat/web":"^0.4.1","@strudel/webaudio":"^1.2.6"},"peerDependencies":{"three":">=0.132.2","hydra-synth":">=1.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"hydra-synth":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/treslib_1.10.1_1783632920046_0.21021637255082792","host":"s3://npm-registry-packages-npm-production"}},"1.10.2":{"name":"treslib","version":"1.10.2","author":"","license":"ISC","_id":"treslib@1.10.2","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"dist":{"shasum":"fde8c50a4a7d0fae077f88e50967694263bda468","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.10.2.tgz","fileCount":23,"integrity":"sha512-LujEAAP5EmK/vQJL38O/qcLhXmmw1CJm2haCWzjkuEsMHEthwcr4f9eT0f6BOTOx67FvBG3TPz60+IVkEWOWYA==","signatures":[{"sig":"MEUCIQDnQ7dE37hqO9KAZG5tVFAFb5/OZ/nR5wIkqSpliworEwIgMiNWib2D16w4v1qkHx4tAvItOhuzsihzCGRfZisjxdY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166876},"main":"./src/index.js","gitHead":"3b3c4d5673253390aec55c30fbf417b1405bb691","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build:strudel":"esbuild docs/examples/snap-strudel/strudel-entry.js --bundle --format=esm --outfile=docs/examples/snap-strudel/strudel.bundle.js"},"_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"11.16.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"_nodeVersion":"22.22.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@strudel/core":"^1.2.6","@strudel/mini":"^1.2.6","@kabelsalat/web":"^0.4.1","@strudel/webaudio":"^1.2.6"},"peerDependencies":{"three":">=0.131.0","hydra-synth":">=1.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"hydra-synth":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/treslib_1.10.2_1783633500366_0.8721727287668368","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"_id":"treslib@1.11.0","dist":{"shasum":"62861376804f225b5cc5eb9a70cb09d073ec709c","tarball":"https://registry.npmjs.org/treslib/-/treslib-1.11.0.tgz","fileCount":23,"integrity":"sha512-0/zff4gOzK1Ma3KgyQND1yuNYyj0RCpeeiY68qFtANSG8OtcDB1FxP2yGmcXDPRXDtOQH+u2vJuNhD13WhTDeQ==","signatures":[{"sig":"MEUCIA/K8kraRf5TzazU3PtlglSvmZNsS5dRHQdY6u8khwV6AiEA3hqK8qf+Uf/iICFzAIeJ51raqHkCwHtgw0yus5egkJY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCCIn3WdgBTsPVolCYLwuCACgkzLc0DAYOvsXhnV6mGTgIgAyJQpdddIaSLqUhV+nI9jcuYTkgP1G4p7cu8OoLXR/I="}],"unpackedSize":169185},"main":"./src/index.js","name":"treslib","author":"","gitHead":"4cdd338295a488a64924cb98593c63f7b773a2ed","license":"ISC","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build:strudel":"esbuild docs/examples/snap-strudel/strudel-entry.js --bundle --format=esm --outfile=docs/examples/snap-strudel/strudel.bundle.js"},"version":"1.11.0","_npmUser":{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"},"_npmVersion":"11.19.0","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","directories":{},"maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"tween":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@strudel/core":"^1.2.6","@strudel/mini":"^1.2.6","@kabelsalat/web":"^0.4.1","@strudel/webaudio":"^1.2.6"},"peerDependencies":{"three":">=0.131.0","hydra-synth":">=1.0.0"},"peerDependenciesMeta":{"three":{"optional":true},"hydra-synth":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/treslib_1.11.0_1790036652670_0.7579198462327215"}}},"time":{"created":"2024-09-24T20:46:57.118Z","modified":"2026-09-22T00:24:12.911Z","1.0.0":"2024-09-24T20:46:57.259Z","1.1.0":"2024-10-02T01:43:18.559Z","1.1.1":"2024-10-02T01:46:24.480Z","1.1.2":"2024-10-03T03:40:00.178Z","1.1.3":"2024-10-03T19:55:42.811Z","1.1.4":"2024-10-04T01:14:52.514Z","1.2.0":"2024-10-04T01:22:22.622Z","1.2.1":"2024-10-05T01:03:35.507Z","1.2.2":"2024-10-07T06:32:33.265Z","1.2.3":"2024-10-07T06:45:47.688Z","1.2.4":"2024-10-16T02:34:54.438Z","1.3.0":"2025-05-03T00:18:32.289Z","1.3.1":"2025-05-03T00:24:25.721Z","1.3.2":"2025-07-31T17:07:23.393Z","1.3.3":"2025-08-01T18:52:53.924Z","1.3.4":"2025-08-01T19:43:07.597Z","1.3.5":"2025-08-14T02:40:52.342Z","1.4.0":"2025-11-16T23:29:45.698Z","1.4.1":"2025-11-16T23:43:47.526Z","1.5.0":"2025-11-19T18:57:06.337Z","1.5.1":"2025-11-19T19:06:45.999Z","1.5.2":"2025-11-19T19:14:48.079Z","1.6.0":"2025-11-23T16:07:15.902Z","1.6.1":"2025-11-23T16:29:14.759Z","1.7.0":"2025-12-04T23:15:57.178Z","1.8.0":"2026-04-09T03:05:07.450Z","1.9.0":"2026-05-07T20:36:39.855Z","1.10.0":"2026-07-02T01:04:47.068Z","1.10.1":"2026-07-09T21:35:20.199Z","1.10.2":"2026-07-09T21:45:00.502Z","1.11.0":"2026-09-22T00:24:12.749Z"},"license":"ISC","description":"treslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, ","maintainers":[{"name":"emilioocelotl","email":"emilio.ocelotl@gmail.com"}],"readme":"# treslib\n\ntreslib es una librería escrita en JavaScript para creación audiovisual generativa que integra síntesis granular, visuales en tiempo real y procesamiento de audio en un entorno unificado. Proporciona herramientas para generar texturas visuales con Hydra, transformarlas en geometrías 3D animadas, capturar snapshots comprimidos de visuales, y sincronizarlas con motores de sonido granular y detección de eventos musicales.\n\n## GrainEngine\n\nMotor de síntesis granular inspirado en Warp1 de SuperCollider. Gestiona múltiples granos de audio simultáneamente con control independiente de densidad y pitch: `overlaps` determina cuántos granos suenan en paralelo, mientras que `rate` controla exclusivamente la velocidad de reproducción de cada grano. Implementa scheduling de audio con look-ahead sobre el reloj del hardware (`AudioContext`), pooling de nodos de ganancia para eficiencia, e interpolación suave de parámetros.\n\nEjemplo de uso: \n\n```\nimport { GrainEngine } from 'treslib';\n\n// Configurar motor granular\nconst audioCtx = new AudioContext();\nconst engine = new GrainEngine(audioCtx, audioBuffer, {\n    pointer: 0.2,\n    rate: 1.5,\n    overlaps: 8,\n    windowSize: 0.08,\n    randomPosition: 0.1\n});\n\n// Conectar a salida\nengine.connect(audioCtx.destination);\n\n// Control en tiempo real\nengine.start();\nengine.setPointer(0.5); // Navegar por el buffer\nengine.setRate(0.8); // Bajar pitch de los granos\nengine.setParamAtTime(\"randomPitch\", 0.15); // Añadir variación tonal\n```\n\n## GrainSequencer \n\nSecuenciador de parámetros especializado para controlar múltiples instancias de GrainEngine en tiempo. Permite crear patrones de parámetros granulares como posición, pitch y amplitud, sincronizados con un tempo musical. Soporta modos absoluto y relativo para cambios paramétricos.\n\nEjemplo: \n\n```\nimport { GrainSequencer, GrainEngine } from 'treslib';\n\nconst audioCtx = new AudioContext();\nconst sequencer = new GrainSequencer(audioCtx, 120, 4); // 120 BPM, 4 steps por beat\n\n// Crear motor granular\nconst granular = new GrainEngine(audioCtx, audioBuffer);\n\n// Secuenciar parámetros del granular\nsequencer.addPointerSequence(\n  [0.1, 0.3, 0.7, 0.9, 0.5, 0.2, 0.8, 0.4], \n  granular\n);\n\nsequencer.addRateSequence(\n  [1.0, 1.2, 0.8, 1.5, 2.0, 1.0, 0.5, 1.8],\n  granular\n);\n\nsequencer.addAmpSequence(\n  [0.3, 0.7, 1.0, 0.8, 0.5, 0.9, 0.6, 0.4],\n  granular\n);\n\n// Opcional: callback para visualización\nsequencer.onStepChange = (step, values) => {\n  console.log(`Step ${step}:`, values);\n};\n\n// Iniciar secuenciador y motor\ngranular.start();\nsequencer.start();\n```\n\n## HydraTextureManager\n\nGestor de texturas generativas que conecta Hydra (síntesis visual en WebGL) con Three.js. Genera texturas animadas en tiempo real usando código de shaders y las convierte en texturas de Three.js para materiales 3D.\n\nEjemplo: \n\n```\nimport { HydraTextureManager } from 'treslib';\n\n// Configurar canvas para Hydra\nconst hydraCanvas = document.createElement('canvas');\nhydraCanvas.width = 800;\nhydraCanvas.height = 600;\n\n// Crear gestor de texturas\nconst textureManager = new HydraTextureManager(hydraCanvas, {\n  maxTextures: 8, // Límite de texturas\n  textureNames: ['VORTEX', 'WAVES', 'NOISE', 'GEOMETRY'] // Nombres personalizados\n});\n\n// Usar en Three.js\nconst geometry = new THREE.PlaneGeometry(10, 10);\nconst material = new THREE.MeshBasicMaterial({\n  map: textureManager.getThreeJSTexture()\n});\nconst mesh = new THREE.Mesh(geometry, material);\nscene.add(mesh);\n\n// Cambiar texturas dinámicamente\ntextureManager.setTexture(0); // OSC azul-cian\ntextureManager.setTexture(1); // OSC verde-púrpura\ntextureManager.setTexture(2); // OSC naranja-roja\ntextureManager.setTexture(3); // Voronoi rojo-azul\n\n// Añadir nueva textura personalizada\ntextureManager.addTexture(() => {\n  shape(5, 0.5)\n    .repeat(3, 2)\n    .rotate(0.1)\n    .color(1, 0.2, 0.8)\n    .out();\n}, 'CUSTOM_SHAPES');\n\n// Actualizar en bucle de animación\nfunction animate() {\n  textureManager.update();\n  requestAnimationFrame(animate);\n}\nanimate();\n```\n\n## ClothMeshManager\n\nGestor de mallas deformables que transforma texturas Hydra en geometrías 3D animadas. Crea superficies tipo \"tela\" que se deforman en tiempo real basándose en los colores y patrones de las texturas generativas, combinando análisis de imagen con funciones de onda para efectos orgánicos.\n\nEjemplo: \n\n```\nimport { ClothMeshManager } from 'treslib';\n\n// Crear gestor de tela con texturas Hydra\nconst clothManager = new ClothMeshManager(hydraTextureManager, {\n  width: 4,           // Ancho de la malla\n  height: 2,          // Alto de la malla\n  segments: 150,      // Resolución de la geometría\n  colorInfluence: 0.25, // Cuánto afectan los colores a la deformación\n  smoothingRadius: 1,   // Radio de suavizado en píxeles (entero; 0 = sin suavizado)\n  waveParams: {\n    amplitude1: 0.3,\n    frequency1: 4.0,\n    amplitude2: 0.2,\n    frequency2: 3.5,\n  }\n});\n\n// Obtener la malla para Three.js\nconst clothMesh = clothManager.getMesh();\nscene.add(clothMesh);\n\n// Cambiar materiales dinámicamente\nclothManager.setMaterial('standard'); // Material con textura Hydra\nclothManager.setMaterial('sobel');    // Material con efecto de bordes\n\n// Controlar parámetros de deformación en tiempo real\nclothManager.setDeformationParams({\n  colorInfluence: 0.5,\n  waveParams: {\n    amplitude1: 0.5,  // Onda 1 más intensa\n    frequency1: 3.0,\n    amplitude2: 0.3,  // Onda 2 más intensa\n    frequency2: 6.0,\n  }\n});\n\n// Actualizar en el bucle de animación\nfunction animate() {\n  clothManager.update(0.01); // Avanzar tiempo interno\n  renderer.render(scene, camera);\n  requestAnimationFrame(animate);\n}\n```\n\n### Integración HydraTextureManager + ClothMeshManager\n\nCombinación para crear visuales 3D generativos donde las texturas animadas deforman geometrías en tiempo real.\n\nEjemplo: \n\n```\nimport { HydraTextureManager, ClothMeshManager } from 'treslib';\n\n// 1. Configurar canvas para Hydra\nconst hydraCanvas = document.createElement('canvas');\nhydraCanvas.width = 800;\nhydraCanvas.height = 600;\n\n// 2. Crear gestor de texturas Hydra\nconst textureManager = new HydraTextureManager(hydraCanvas);\n\n// 3. Crear gestor de malla deformable\nconst clothManager = new ClothMeshManager(textureManager, {\n  width: 4,\n  height: 2,\n  segments: 150,\n  colorInfluence: 0.25,\n  waveParams: {\n    amplitude1: 0.3,\n    frequency1: 4.0,\n    amplitude2: 0.2,\n    frequency2: 3.5,\n  }\n});\n\n// 4. Añadir a escena Three.js\nscene.add(clothManager.getMesh());\n\n// 5. Cambiar textura activa (0–3)\ntextureManager.setTexture(2);\nconsole.log(textureManager.getTextureName()); // 'OSC_ORANGE_RED'\n\n// 6. Bucle de animación\nfunction animate() {\n  textureManager.update();     // Actualizar textura Hydra\n  clothManager.update(0.01);   // Avanzar deformaciones 3D\n  renderer.render(scene, camera);\n  requestAnimationFrame(animate);\n}\nanimate();\n```\n## SnapshotCompressor\n\nCompresor de imágenes especializado para capturar y comprimir frames de visuales generativos en formato de 2 bits por píxel (4 niveles de gris). Incluye dithering ordenado para mantener detalles y extracción de paletas de colores estilo RISO. Ideal para guardar snapshots de arte generativo en poco espacio.\n\nEjemplo: \n\n```\nimport { SnapshotCompressor } from 'treslib';\n\n// Crear compresor con resolución personalizada\nconst compressor = new SnapshotCompressor(64, 64); // 64x64 píxeles\n\n// Capturar y comprimir frame de Hydra\nconst hydraCanvas = document.querySelector('canvas');\nconst compressedHex = compressor.captureHydraFrame(hydraCanvas);\nconsole.log('Snapshot comprimido:', compressedHex); // Ej: \"A3F2C45B...\"\n\n// Extraer paleta de colores estilo RISO\nconst risoPalette = compressor.extractRisoPalette(hydraCanvas);\nconsole.log('Paleta RISO:', risoPalette);\n// Ej: [{r: 255, g: 0, b: 64}, {r: 0, g: 192, b: 255}, ...]\n\n// Descomprimir para visualización\nconst compressedBytes = compressor.hexToBytes(compressedHex);\nconst decompressedPixels = compressor.decompress2bpp(compressedBytes);\nconst imageData = compressor.ditheredToImageData(decompressedPixels);\n\n// Mostrar en canvas\nconst displayCanvas = document.createElement('canvas');\nconst ctx = displayCanvas.getContext('2d');\nctx.putImageData(imageData, 0, 0);\ndocument.body.appendChild(displayCanvas);\n\n// Guardar en localStorage\nlocalStorage.setItem('lastSnapshot', compressedHex);\n```\n## SnapToGrains\n\nPuente entre `SnapshotCompressor` y `GrainEngine`. Analiza un snapshot comprimido (hex 2bpp) y mapea sus características visuales a parámetros de síntesis granular: brillo → amplitud, contraste → densidad, entropía → complejidad, distribución espacial → posición en buffer. Incluye un recorrido automático suave de `pointer` y variación aleatoria configurable por paso.\n\n```js\nimport { SnapToGrains } from 'treslib';\n```\n\nEjemplo básico — un snapshot controla el engine:\n\n```js\nimport SnapshotCompressor from './src/SnapshotCompressor.js';\nimport { GrainEngine }    from './src/GrainEngine.js';\nimport { SnapToGrains }   from './src/SnapToGrains.js';\n\nconst audioCtx   = new AudioContext();\nconst compressor = new SnapshotCompressor(60, 60);\n\nconst engine = new GrainEngine(audioCtx, audioBuffer, { overlaps: 4 });\nengine.connect(audioCtx.destination);\n\nconst snapToGrains = new SnapToGrains(audioCtx, engine, {\n    compressor,           // activa análisis real de píxeles\n    smoothingTime: 0.3,   // segundos de transición entre parámetros\n    jitter: 0.06,         // ±6% de variación aleatoria en rate y amp por paso\n    pointerTransitionTime: 1.0,\n});\n\n// Capturar un canvas y aplicarlo al engine\nconst hex = compressor.captureHydraFrame(hydraCanvas);\nsnapToGrains.start();\nsnapToGrains.applySnapshot(hex);\n```\n\n### Mapeo configurable\n\n`mapSnapshotToAudioParams` recorre un rango por eje, y cada rango es una opción. Los defaults son los valores históricos, así que omitirlos no cambia nada:\n\n```js\nconst snapToGrains = new SnapToGrains(audioCtx, engine, {\n    rateRange:     [0.3, 2.0],   // brightness  → rate\n    ampRange:      [0.6, 1.8],   // contrast    → amp\n    overlapsRange: [4, 14],      // complexity  → overlaps (se trunca a entero)\n    ampCeiling:    2.0,          // tope final de amp, después del darkBoost\n});\n```\n\n`darkBoost` compensa los snapshots oscuros: por debajo del umbral sube la amplitud y la densidad, porque un cuadro oscuro capturado de Hydra tiene poca varianza y suena flojo. Es una corrección de **captura**, y sólo tiene sentido cuando el brillo viene de una imagen:\n\n```js\ndarkBoost: false                                          // apagado\ndarkBoost: { threshold: 0.3, ampFactor: 1.5, extraOverlaps: 2 }  // default\n```\n\nSi el `brightness` no viene de una imagen sino de una medida que significa algo por sí misma, conviene apagarlo: el umbral parte el corpus en dos poblaciones que no se traslapan y el salto se oye entre dos valores casi iguales.\n\nEjemplo como secuenciador — un mosaico de snapshots como pasos:\n\n```js\nconst snapshots = [hexA, hexB, hexC, hexD]; // hexes capturados previamente\nlet step = 0;\n\nsnapToGrains.start();\n\nsetInterval(() => {\n    snapToGrains.applySnapshot(snapshots[step]);\n    step = (step + 1) % snapshots.length;\n}, 1000); // un paso por segundo\n```\n\nEl método `applySnapshot` analiza la imagen y genera una secuencia interna de valores de `pointer` que se recorre con `requestAnimationFrame`, independiente del intervalo del secuenciador.\n\nParámetros del constructor:\n\n| opción | default | descripción |\n|---|---|---|\n| `compressor` | `null` | instancia de `SnapshotCompressor`; activa análisis pixel a pixel |\n| `smoothingTime` | `1.0` | segundos de fade entre parámetros del engine |\n| `jitter` | `0` | fracción de variación aleatoria por paso (ej. `0.06` = ±6%) |\n| `pointerTransitionTime` | `3.0` | segundos entre puntos de la secuencia interna de pointer |\n| `transitionCurve` | `'easeInOut'` | curva de easing: `'easeInOut'`, `'linear'`, `'exponential'` |\n| `maxRandomPitch` | `0.3` | rango máximo de `randomPitch` derivado del análisis |\n| `maxRandomPosition` | `0.01` | rango máximo de `randomPosition` derivado del análisis |\n\n## StrudelSync\n\nGestiona el cambio ciclo-alineado de patrones de percusión en [Strudel](https://strudel.cc). Encapsula el state machine de `currentVariant` / `pendingVariant` y el timer que espera al próximo límite de ciclo antes de evaluar un nuevo patrón — evitando cortes a mitad de compás. Acepta un modificador de CPM por variante para patrones que corren a distinta velocidad (p.ej. mitad de tempo para secciones lentas).\n\nNo importa Strudel directamente; recibe el REPL ya inicializado como argumento.\n\n```js\nimport { StrudelSync } from 'treslib';\nimport { webaudioRepl, initAudio, samples, getAudioContext,\n         evalScope, corePrelude, miniPrelude } from './strudel.bundle.js';\n\nconst PATTERNS = {\n  SPARSE: `stack(\n    s(mini(\"bd ~ ~ ~ ~ ~ ~ ~ ~ ~ bd ~ ~ ~ ~ ~\")),\n    s(mini(\"hh ~ hh ~ hh ~ hh ~ hh ~ hh ~ hh ~ hh ~\")).gain(0.15)\n  )`,\n  DENSE: `stack(\n    s(mini(\"bd ~ bd ~ bd ~ ~ bd bd ~ ~ bd ~ bd ~ ~\")),\n    s(mini(\"~ ~ ~ ~ sd ~ ~ ~ ~ ~ sd ~ ~ sd ~ ~\")),\n    s(mini(\"hh*16\")).gain(0.10)\n  )`,\n};\n\nlet CPM = 60;\n\n// Inicializar Strudel una sola vez (primer gesto del usuario)\nawait initAudio();\nawait evalScope(corePrelude, miniPrelude);\nawait samples({ bd: ['kick.wav'], sd: ['snare.wav'], hh: ['hh.wav'] });\n\nconst repl = webaudioRepl();\nconst sync = new StrudelSync(repl, getAudioContext, {\n  getCPM:     () => CPM,\n  patterns:   PATTERNS,\n  patternCPM: { SPARSE: cpm => cpm / 2 },  // SPARSE corre a la mitad de velocidad\n  gain:       2,\n});\n\n// Cambiar variante — espera al próximo límite de ciclo antes de evaluar\nsync.request('DENSE');\n\n// Re-evaluar la variante actual tras un cambio de tempo\nCPM = 90;\nsync.reapply();\n\n// Detener\nsync.stop();\n\n// Leer estado\nconsole.log(sync.currentVariant); // 'DENSE'\nconsole.log(sync.pendingVariant);  // null\n```\n\nParámetros del constructor:\n\n| opción | default | descripción |\n|---|---|---|\n| `getCPM` | `() => 120` | función que devuelve el CPM actual |\n| `patterns` | `{}` | mapa `{ nombre: código_strudel }` |\n| `patternCPM` | `{}` | modificadores de CPM por variante: `{ nombre: cpm => cpm / 2 }` |\n| `gain` | `2` | ganancia aplicada a todos los patrones vía `.gain()` |\n\n## OnsetDetector\n\nDetector de onsets (ataques sonoros) basado en el algoritmo psicoacústico de Nick Collins utilizado en MIREX. Implementa 40 bandas ERB (Equivalent Rectangular Bandwidth) y modelado de loudness espectral para una detección musicalmente relevante de transientes en señales de audio. Soporta dos modos: reproducción de buffer con detección simultánea, o análisis de fuente externa (micrófono, MediaStreamSource) sin reproducción.\n\n```\nimport { OnsetDetector } from 'treslib';\n\nconst audioCtx = new AudioContext();\n\n// Modo 1: buffer de audio (reproduce y detecta)\nconst detector = new OnsetDetector(audioCtx, audioBuffer, 0.015);\n\ndetector.start((flux) => {\n  console.log(`Onset detectado! Intensidad: ${flux.toFixed(3)}`);\n  granularEngine.setPointer(Math.random());\n});\n\n// Modo 2: micrófono (solo detección, sin reproducción)\nnavigator.mediaDevices.getUserMedia({ audio: true })\n  .then(stream => {\n    const micSource = audioCtx.createMediaStreamSource(stream);\n    const detector = new OnsetDetector(audioCtx, null, 0.015);\n    detector.connectSource(micSource);\n    detector.start((flux) => {\n      console.log(`Onset en vivo: ${flux.toFixed(3)}`);\n    }, false); // false = no conectar a la salida de audio\n  });\n\n// Detener\ndetector.stop();\n```\n\n## AudioBufferRecorder\n\nGrabador de audio en búfer circular que captura entrada de micrófono en tiempo real y mantiene los últimos segundos de audio disponibles para procesamiento inmediato. Ideal para efectos granulares, análisis en tiempo real y captura de audio reactiva.\n\n```\nimport { AudioBufferRecorder, GrainEngine } from 'treslib';\n\nconst audioCtx = new AudioContext();\nconst stream = await navigator.mediaDevices.getUserMedia({ audio: true });\nconst micSource = audioCtx.createMediaStreamSource(stream);\n\n// Crear grabador con búfer circular de 8 segundos (sin escuchar el micrófono)\nconst recorder = new AudioBufferRecorder(audioCtx, micSource, 8);\nrecorder.startRecording();\n\n// Capturar el audio reciente ante una interacción y usarlo con GrainEngine\ndocument.addEventListener('click', () => {\n  const recentAudio = recorder.getRecordedBuffer();\n  const granular = new GrainEngine(audioCtx, recentAudio);\n  granular.connect(audioCtx.destination);\n  granular.start();\n});\n\n// Detener grabación\nrecorder.stopRecording();\n\n// Cambiar duración del búfer (tiene efecto en el próximo startRecording)\nrecorder.setBufferDuration(15);\nrecorder.startRecording();\n```\n\n## FreeSoundSearcher\n\nCliente para buscar sonidos en la base de datos de Freesound.org mediante su API REST. Permite explorar y acceder a miles de samples de audio con filtros por relevancia y paginación.\n\nEjemplo: \n\n```\nimport { FreeSoundSearcher } from 'treslib';\n\n// Inicializar con API key de Freesound\nconst searcher = new FreeSoundSearcher('tu-api-key-de-freesound');\n\n// Búsqueda básica\nconst resultados = await searcher.buscar('ambient pad', 1, 20);\nconsole.log(`${resultados.total} sonidos encontrados:`);\nresultados.resultados.forEach(sound => {\n  console.log(`- ${sound.name} (${sound.username})`);\n});\n\n// Navegación por páginas\nconst pagina2 = await searcher.buscar('glitch', 2, 15);\n\n// Integración con cargador de audio\nimport { FreeSoundAudioLoader } from 'treslib';\nresultados.resultados.forEach(async (sound) => {\n  const loader = new FreeSoundAudioLoader(searcher.apiKey);\n  const audioBuffer = await loader.loadAudio(sound.id);\n  // Usar con GrainEngine u otros procesadores\n});\n```\n## FreeSoundAudioLoader\n\nCargador especializado para descargar y decodificar samples de audio desde Freesound.org directamente a AudioBuffers listos para usar en Web Audio API. Maneja autenticación API, formato de previsualización y decodificación automática.\n\nEjemplo: \n\n```\nimport { FreeSoundAudioLoader, FreeSoundSearcher } from 'treslib';\n\n// Configurar cargador con API key\nconst loader = new FreeSoundAudioLoader('tu-api-key-de-freesound');\n\n// Buscar y cargar samples automáticamente\nconst searcher = new FreeSoundSearcher('tu-api-key-de-freesound');\nconst resultados = await searcher.buscar('granular texture', 1, 5);\n\n// Cargar el primer resultado\nconst primerSonido = resultados.resultados[0];\nconst audioBuffer = await loader.loadAudio(primerSonido.id);\n\n// Usar inmediatamente con GrainEngine\nconst granular = new GrainEngine(audioCtx, audioBuffer);\ngranular.connect(audioCtx.destination);\ngranular.start();\n\n// O cargar múltiples samples para banco de sonidos\nconst buffers = [];\nfor (const sound of resultados.resultados.slice(0, 3)) {\n    try {\n        const buffer = await loader.loadAudio(sound.id);\n        buffers.push(buffer);\n        console.log(`✅ ${sound.name} cargado`);\n    } catch (error) {\n        console.log(`❌ Error cargando ${sound.name}:`, error);\n    }\n}\n\n// Crear secuenciador con samples cargados\nbuffers.forEach((buffer, index) => {\n    const engine = new GrainEngine(audioCtx, buffer);\n    // Configurar parámetros únicos por sample...\n});\n```\n\n## Proyectos\n\n### [Ciudad Monstruo](https://0xacab.org/ocelotl/ciudad-monstruo)\n\nPartitura gráfica interactiva y motor de render de audio multicanal. Los trazos dibujados sobre un campo circular definen trayectorias espaciales que se renderizan como WAV multicanal (2/4/8 canales) vía DBAP offline.\n\ntreslib se usa en la **interfaz radionauta**, una página separada que los intérpretes abren desde sus dispositivos en red local durante la performance. Al tocar una alcaldía del mapa de CDMX, un `GrainEngine` arranca con parámetros derivados de dos fuentes: densidad poblacional INEGI (hab/km²) y análisis visual de la región del SVG correspondiente via `SnapshotCompressor`. `SnapToGrains` mantiene la modulación continua del engine a partir del snapshot recortado de cada alcaldía.\n\n---\n\n## Dependencias externas\n\n- **[Hydra](https://hydra.ojack.xyz)** — síntesis visual en WebGL. Usada por `HydraTextureManager` y `ClothMeshManager`. Repositorio: [hydra-synth/hydra-synth](https://github.com/hydra-synth/hydra-synth).\n- **[Strudel](https://strudel.cc)** — live coding musical basado en TidalCycles para el navegador. Usada por `StrudelSync`. Repositorio: [uzu/strudel](https://codeberg.org/uzu/strudel).\n\n## Referencias\n\n- Collins, N. (2005). \"A Comparison of Sound Onset Detection Algorithms with Emphasis on Psychoacoustically Motivated Detection Functions\". Proceedings of the AES 118th Convention. Barcelona, España.\n\n- https://doc.sccode.org/Classes/Warp1.html","readmeFilename":"README.md"}