@jadujoel/web-audio-clip-node 0.1.6 → 0.1.8
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/README.md +77 -32
- package/dist/App.d.ts +6 -0
- package/dist/App.js +179 -0
- package/dist/audio/ClipNode.d.ts +2 -0
- package/dist/audio/ClipNode.js +6 -1
- package/dist/audio/processor-code.d.ts +1 -1
- package/dist/audio/processor-code.js +1 -1
- package/dist/audio/processor-kernel.js +26 -9
- package/dist/audio/processor.js +9 -0
- package/dist/audio/version.d.ts +1 -1
- package/dist/audio/version.js +1 -1
- package/dist/lib.bundle.js +3 -3
- package/dist/lib.bundle.js.map +3 -3
- package/dist/processor.js +2 -2
- package/dist/processor.js.map +4 -4
- package/dist/streaming.d.ts +6 -0
- package/dist/streaming.js +32 -0
- package/dist/workers/framed-raw-opus.d.ts +13 -0
- package/dist/workers/framed-raw-opus.js +68 -0
- package/dist/workers/mp3-decode-worker.d.ts +1 -0
- package/dist/workers/mp3-decode-worker.js +254 -0
- package/dist/workers/mp3-decode-worker.min.js +1 -0
- package/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
- package/dist/workers/ogg-opus-decode-worker.js +398 -0
- package/dist/workers/ogg-opus-decode-worker.min.js +1 -0
- package/dist/workers/opus-worker-common.d.ts +45 -0
- package/dist/workers/opus-worker-common.js +226 -0
- package/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
- package/dist/workers/raw-opus-framed-decode-worker.js +119 -0
- package/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
- package/dist/workers/webm-opus-decode-worker.d.ts +1 -0
- package/dist/workers/webm-opus-decode-worker.js +97 -0
- package/dist/workers/webm-opus-decode-worker.min.js +1 -0
- package/dist/workers/webm-opus-parser.d.ts +49 -0
- package/dist/workers/webm-opus-parser.js +369 -0
- package/dist/workers/worker-utils.d.ts +11 -0
- package/dist/workers/worker-utils.js +55 -0
- package/examples/README.md +12 -4
- package/examples/cdn-vanilla/README.md +10 -6
- package/examples/cdn-vanilla/index.html +1065 -33
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
- package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
- package/examples/index.html +253 -7
- package/examples/playground/README.md +9 -0
- package/examples/playground/index.html +14 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
- package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
- package/examples/playground/package.json +19 -0
- package/examples/playground/src/App.tsx +442 -0
- package/examples/playground/src/main.tsx +9 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
- package/examples/react/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
- package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
- package/examples/self-hosted/public/processor.js +2 -2
- package/examples/streaming/README.md +25 -0
- package/examples/streaming/build-worker.ts +49 -0
- package/examples/streaming/framed-raw-opus.ts +95 -0
- package/examples/streaming/index.html +16 -0
- package/examples/streaming/mp3-decode-worker.ts +326 -0
- package/examples/streaming/ogg-opus-decode-worker.ts +479 -0
- package/examples/streaming/opus-worker-common.ts +278 -0
- package/examples/streaming/package.json +20 -0
- package/examples/streaming/raw-opus-framed-decode-worker.ts +148 -0
- package/examples/streaming/src/App.tsx +726 -0
- package/examples/streaming/src/clip-node-lib.ts +33 -0
- package/examples/streaming/src/framedRawOpus.test.ts +74 -0
- package/examples/streaming/src/main.tsx +6 -0
- package/examples/streaming/src/react-dom-runtime.d.ts +1 -0
- package/examples/streaming/src/react-dom-runtime.js +1 -0
- package/examples/streaming/src/react-runtime.d.ts +2 -0
- package/examples/streaming/src/react-runtime.js +7 -0
- package/examples/streaming/src/streamFormat.test.ts +13 -0
- package/examples/streaming/src/streamFormat.ts +14 -0
- package/examples/streaming/src/streamTimeline.test.ts +74 -0
- package/examples/streaming/src/streamTimeline.ts +76 -0
- package/examples/streaming/src/useStreamingClipNode.ts +540 -0
- package/examples/streaming/src/webmOpusParser.test.ts +153 -0
- package/examples/streaming/tsconfig.json +19 -0
- package/examples/streaming/webm-opus-decode-worker.ts +123 -0
- package/examples/streaming/webm-opus-parser.ts +461 -0
- package/examples/streaming/worker-utils.ts +45 -0
- package/package.json +13 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function concat(a: Uint8Array, b: Uint8Array): Uint8Array;
|
|
2
|
+
interface EstimateTotalSamplesInput {
|
|
3
|
+
totalBytes: number | null;
|
|
4
|
+
bitrate: number | null;
|
|
5
|
+
sourceSampleRate: number;
|
|
6
|
+
targetSampleRate: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function estimateTotalSamplesFromContentLength({ totalBytes, bitrate, sourceSampleRate, targetSampleRate, }: EstimateTotalSamplesInput): number | null;
|
|
9
|
+
export declare function resampleChannel(src: Float32Array, srcRate: number, dstRate: number): Float32Array;
|
|
10
|
+
export declare function createThrottleStream(bytesPerSec: number): TransformStream<Uint8Array, Uint8Array>;
|
|
11
|
+
export {};
|
package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function concat(a, b) {
|
|
2
|
+
const out = new Uint8Array(a.length + b.length);
|
|
3
|
+
out.set(a);
|
|
4
|
+
out.set(b, a.length);
|
|
5
|
+
return out;
|
|
6
|
+
}
|
|
7
|
+
const FALLBACK_BITRATE_BPS = 128_000;
|
|
8
|
+
export function estimateTotalSamplesFromContentLength({ totalBytes, bitrate, sourceSampleRate, targetSampleRate, }) {
|
|
9
|
+
if (totalBytes == null || totalBytes <= 0)
|
|
10
|
+
return null;
|
|
11
|
+
if (sourceSampleRate <= 0 || targetSampleRate <= 0)
|
|
12
|
+
return null;
|
|
13
|
+
const safeBitrate = bitrate != null && Number.isFinite(bitrate) && bitrate > 0
|
|
14
|
+
? bitrate
|
|
15
|
+
: FALLBACK_BITRATE_BPS;
|
|
16
|
+
const durationSeconds = (totalBytes * 8) / safeBitrate;
|
|
17
|
+
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0)
|
|
18
|
+
return null;
|
|
19
|
+
const totalSamples = Math.ceil(durationSeconds * targetSampleRate);
|
|
20
|
+
return Number.isFinite(totalSamples) && totalSamples > 0
|
|
21
|
+
? totalSamples
|
|
22
|
+
: null;
|
|
23
|
+
}
|
|
24
|
+
export function resampleChannel(src, srcRate, dstRate) {
|
|
25
|
+
if (srcRate === dstRate)
|
|
26
|
+
return src;
|
|
27
|
+
const ratio = srcRate / dstRate;
|
|
28
|
+
const dstLen = Math.round(src.length / ratio);
|
|
29
|
+
const dst = new Float32Array(dstLen);
|
|
30
|
+
for (let i = 0; i < dstLen; i++) {
|
|
31
|
+
const srcPos = i * ratio;
|
|
32
|
+
const idx = Math.floor(srcPos);
|
|
33
|
+
const frac = srcPos - idx;
|
|
34
|
+
const a = src[idx] ?? 0;
|
|
35
|
+
const b = src[Math.min(idx + 1, src.length - 1)] ?? 0;
|
|
36
|
+
dst[i] = a + frac * (b - a);
|
|
37
|
+
}
|
|
38
|
+
return dst;
|
|
39
|
+
}
|
|
40
|
+
export function createThrottleStream(bytesPerSec) {
|
|
41
|
+
let totalBytes = 0;
|
|
42
|
+
const startTime = performance.now();
|
|
43
|
+
return new TransformStream({
|
|
44
|
+
async transform(chunk, controller) {
|
|
45
|
+
totalBytes += chunk.length;
|
|
46
|
+
const elapsed = (performance.now() - startTime) / 1000;
|
|
47
|
+
const expected = totalBytes / bytesPerSec;
|
|
48
|
+
const delay = expected - elapsed;
|
|
49
|
+
if (delay > 0) {
|
|
50
|
+
await new Promise((resolve) => setTimeout(resolve, delay * 1000));
|
|
51
|
+
}
|
|
52
|
+
controller.enqueue(chunk);
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jadujoel/web-audio-clip-node",
|
|
3
|
+
"version": "0.1.8",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Full-featured AudioWorklet clip player with playback rate, detune, gain, pan, filters, looping, fades, crossfade, and streaming buffer support. React components included.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"web-audio",
|
|
8
|
+
"audioworklet",
|
|
9
|
+
"audio",
|
|
10
|
+
"clip",
|
|
11
|
+
"player",
|
|
12
|
+
"dsp",
|
|
13
|
+
"react",
|
|
14
|
+
"worklet"
|
|
15
|
+
],
|
|
16
|
+
"author": "joel.lof@icloud.com",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/jadujoel/web-audio-clip-node.git"
|
|
21
|
+
},
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/lib.d.ts",
|
|
25
|
+
"import": "./dist/lib.js"
|
|
26
|
+
},
|
|
27
|
+
"./bundle": "./dist/lib.bundle.js",
|
|
28
|
+
"./react": {
|
|
29
|
+
"types": "./dist/lib-react.d.ts",
|
|
30
|
+
"import": "./dist/lib-react.js"
|
|
31
|
+
},
|
|
32
|
+
"./streaming": {
|
|
33
|
+
"types": "./dist/streaming.d.ts",
|
|
34
|
+
"import": "./dist/streaming.js"
|
|
35
|
+
},
|
|
36
|
+
"./processor": "./dist/processor.js",
|
|
37
|
+
"./styles.css": {
|
|
38
|
+
"types": "./dist/styles.css.d.ts",
|
|
39
|
+
"default": "./dist/styles.css"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"main": "./dist/lib.js",
|
|
43
|
+
"types": "./dist/lib.d.ts",
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE",
|
|
48
|
+
"examples"
|
|
49
|
+
],
|
|
50
|
+
"sideEffects": false,
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "bun build.ts",
|
|
53
|
+
"build:lib": "bun build.ts --lib",
|
|
54
|
+
"build:webpage": "bun build.ts --webpage",
|
|
55
|
+
"dev": "bun serve-webpage.ts",
|
|
56
|
+
"examples": "bun examples.ts",
|
|
57
|
+
"lint": "biome check",
|
|
58
|
+
"serve-webpage": "bun serve-webpage.ts",
|
|
59
|
+
"test": "bun test",
|
|
60
|
+
"test:e2e": "bunx playwright test",
|
|
61
|
+
"test:e2e:chromium": "bunx playwright test --project=chromium",
|
|
62
|
+
"test:e2e:firefox": "bunx playwright test --project=firefox",
|
|
63
|
+
"test:e2e:webkit": "bunx playwright test --project=webkit",
|
|
64
|
+
"typecheck": "tsc --noEmit",
|
|
65
|
+
"validate": "bun run build && bun run lint && bun run typecheck && bun test",
|
|
66
|
+
"prepublishOnly": "bun run build:lib"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"react": ">=18",
|
|
70
|
+
"react-dom": ">=18",
|
|
71
|
+
"zustand": ">=4"
|
|
72
|
+
},
|
|
73
|
+
"peerDependenciesMeta": {
|
|
74
|
+
"react": {
|
|
75
|
+
"optional": true
|
|
76
|
+
},
|
|
77
|
+
"react-dom": {
|
|
78
|
+
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"zustand": {
|
|
81
|
+
"optional": true
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@biomejs/biome": "2.4.11",
|
|
86
|
+
"@playwright/test": "1.59.1",
|
|
87
|
+
"@testing-library/dom": "10.4.1",
|
|
88
|
+
"@testing-library/react": "16.3.2",
|
|
89
|
+
"@types/react": "19.2.14",
|
|
90
|
+
"@types/react-dom": "19.2.3",
|
|
91
|
+
"bun-types": "1.3.12",
|
|
92
|
+
"happy-dom": "20.8.9",
|
|
93
|
+
"isomorphic-web-audio-api": "1.0.2",
|
|
94
|
+
"react": "19.2.5",
|
|
95
|
+
"react-dom": "19.2.5",
|
|
96
|
+
"zustand": "5.0.12"
|
|
97
|
+
},
|
|
98
|
+
"publishConfig": {
|
|
99
|
+
"access": "public"
|
|
100
|
+
},
|
|
101
|
+
"patchedDependencies": {
|
|
102
|
+
"node-web-audio-api@1.0.9": "patches/node-web-audio-api@1.0.9.patch"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var P={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var _=128;function i(V=[]){let A=V[0]?.length??0,F=A>0;return{totalLength:F?A:null,committedLength:F?A:0,streamEnded:F,streaming:!1,writtenSpans:F?[{startSample:0,endSample:A}]:[],pendingWrites:[],lowWaterThreshold:_*4,lowWaterNotified:!1,lastUnderrunSample:null}}function G0(V){return V[0]?.length??0}function o(V){return V.streamBuffer.totalLength??G0(V.buffer)}function H0(V,A){return Array.from({length:V},()=>new Float32Array(A))}function E0(V,A){let F=[...V,A].sort((J,k)=>J.startSample-k.startSample),T=[];for(let J of F){let k=T[T.length-1];if(!k||J.startSample>k.endSample){T.push({...J});continue}k.endSample=Math.max(k.endSample,J.endSample)}return T}function I0(V){let A=0;for(let F of V){if(F.startSample>A)break;A=Math.max(A,F.endSample)}return A}function w0(V,A){if(V.committedLength-Math.floor(A)>=V.lowWaterThreshold)V.lowWaterNotified=!1}function R0(V,A,F){let T=G0(V.buffer),J=V.buffer.length;if(T>=F&&J>=A)return;let k=Math.max(T,F),Q=Math.max(J,A),X=H0(Q,k);for(let U=0;U<J;U++)X[U].set(V.buffer[U].subarray(0,T));if(V.buffer=X,V.streamBuffer.totalLength==null||V.streamBuffer.totalLength<k)V.streamBuffer.totalLength=k}function B0(V,A){let F=Math.max(Math.floor(A.startSample),0),T=A.channelData[0]?.length??0,J=A.totalLength??null,k=Math.max(F+T,J??0);R0(V,Math.max(A.channelData.length,V.buffer.length,1),k);for(let Q=0;Q<A.channelData.length;Q++)V.buffer[Q].set(A.channelData[Q],F);if(J!=null)V.streamBuffer.totalLength=J;if(T>0)V.streamBuffer.writtenSpans=E0(V.streamBuffer.writtenSpans,{startSample:F,endSample:F+T}),V.streamBuffer.committedLength=I0(V.streamBuffer.writtenSpans);if(A.streamEnded===!0)V.streamBuffer.streamEnded=!0;w0(V.streamBuffer,V.playhead)}function y0(V){if(V.streamBuffer.pendingWrites.length===0)return;for(let A of V.streamBuffer.pendingWrites)B0(V,A);V.streamBuffer.pendingWrites=[]}function _0(V,A){V.buffer=A,V.streamBuffer=i(A)}function v0(V={},A){let{buffer:F=[],streamBuffer:T=i(F),duration:J=-1,loop:k=!1,loopStart:Q=0,loopEnd:X=(F[0]?.length??0)/A,loopCrossfade:U=0,playhead:$=0,offset:M=0,startWhen:Y=0,stopWhen:j=0,pauseWhen:z=0,resumeWhen:C=0,playedSamples:N=0,state:K=P.Initial,timesLooped:w=0,fadeInDuration:v=0,fadeOutDuration:Z=0,enableFadeIn:E=v>0,enableFadeOut:O=Z>0,enableLoopStart:R=!0,enableLoopEnd:d=!0,enableLoopCrossfade:b=U>0,enableHighpass:c=!0,enableLowpass:g=!0,enableGain:s=!0,enablePan:t=!0,enableDetune:r=!0,enablePlaybackRate:p=!0}=V;return{buffer:F,streamBuffer:T,loop:k,loopStart:Q,loopEnd:X,loopCrossfade:U,duration:J,playhead:$,offset:M,startWhen:Y,stopWhen:j,pauseWhen:z,resumeWhen:C,playedSamples:N,state:K,timesLooped:w,fadeInDuration:v,fadeOutDuration:Z,enableFadeIn:E,enableFadeOut:O,enableLoopStart:R,enableLoopEnd:d,enableHighpass:c,enableLowpass:g,enableGain:s,enablePan:t,enableDetune:r,enablePlaybackRate:p,enableLoopCrossfade:b}}function b0(V,A){return o(V)/A}function n(V,A){let F=b0(V,A);if(F<=0){V.loopStart=0,V.loopEnd=0;return}if(!Number.isFinite(V.loopStart)||V.loopStart<0)V.loopStart=0;if(V.loopStart>=F)V.loopStart=0;if(!Number.isFinite(V.loopEnd)||V.loopEnd<=V.loopStart||V.loopEnd>F)V.loopEnd=F}function e(V,A,F){if(A===void 0)return V.offset=0,0;if(A<0)return e(V,o(V)+A,F);if(A>(o(V)||1)-1)return e(V,o(V)%A,F);let T=Math.floor(A*F);return V.offset=T,T}function L0(V){let{playhead:A,bufferLength:F,loop:T,loopStartSamples:J,loopEndSamples:k}=V,Q=128;if(!T&&A+128>F)Q=Math.max(F-A,0);let X=Array(Q);if(!T){for(let Y=0,j=A;Y<Q;Y++,j++)X[Y]=j;let M=A+Q;return{playhead:M,indexes:X,looped:!1,ended:M>=F}}let U=A,$=!1;for(let M=0;M<Q;M++,U++){if(U>=k)U=J+(U-k),$=!0;X[M]=U}return{indexes:X,looped:$,ended:!1,playhead:U}}function x0(V){let{playhead:A,bufferLength:F,loop:T,loopStartSamples:J,loopEndSamples:k,playbackRates:Q}=V,X=128;if(!T&&A+128>F)X=Math.max(F-A,0);let U=Array(X),$=A,M=!1;if(T){for(let Y=0;Y<X;Y++){U[Y]=Math.min(Math.max(Math.floor($),0),F-1);let j=Q[Y]??Q[0]??1;if($+=j,j>=0&&($>k||$>F))$=J,M=!0;else if(j<0&&($<J||$<0))$=k,M=!0}return{playhead:$,indexes:U,looped:M,ended:!1}}for(let Y=0;Y<X;Y++)U[Y]=Math.min(Math.max(Math.floor($),0),F-1),$+=Q[Y]??Q[0]??1;return{playhead:$,indexes:U,looped:!1,ended:$>=F||$<0}}function m0(V,A,F){let T=Math.min(V.length,A.length);for(let J=0;J<F.length;J++)for(let k=0;k<T;k++)V[k][J]=A[k][F[J]];for(let J=T;J<V.length;J++)for(let k=0;k<V[J].length;k++)V[J][k]=0;for(let J=F.length;J<V[0].length;J++)for(let k=0;k<T;k++)V[k][J]=0}function h(V){for(let A=0;A<V.length;A++)for(let F=0;F<V[A].length;F++)V[A][F]=0}function S0(V){if(V.length>=2)for(let A=0;A<V[0].length;A++)V[1][A]=V[0][A];else{let A=new Float32Array(V[0].length);for(let F=0;F<V[0].length;F++)A[F]=V[0][F];V.push(A)}}function M0(V,A){for(let F=A.length;F<V.length;F++)A[F]=new Float32Array(V[F].length);for(let F=0;F<V.length;F++)for(let T=0;T<V[F].length;T++)A[F][T]=V[F][T]}function c0(V){let A=0;for(let F=0;F<V.length;F++)for(let T=0;T<V[F].length;T++)if(Number.isNaN(V[F][T]))A++,V[F][T]=0;return A}function V0(){return[{x_1:0,x_2:0,y_1:0,y_2:0},{x_1:0,x_2:0,y_1:0,y_2:0}]}function g0(V,A){if(A.length===1){let T=A[0];if(T===1)return;for(let J of V)for(let k=0;k<J.length;k++)J[k]*=T;return}let F=A[0];for(let T of V)for(let J=0;J<T.length;J++)F=A[J]??F,T[J]*=F}function h0(V,A){let F=A[0];for(let T=0;T<V[0].length;T++){F=A[T]??F;let J=F<=0?1:1-F,k=F>=0?1:1+F;V[0][T]*=J,V[1][T]*=k}}function d0(V,A,F,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:X,y_1:U,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let M=A[0];if(M>=20000)return;let Y=2*Math.PI*M/F,j=Math.sin(Y)/2,z=(1-Math.cos(Y))/2,C=1-Math.cos(Y),N=(1-Math.cos(Y))/2,K=1+j,w=-2*Math.cos(Y),v=1-j,Z=z/K,E=C/K,O=N/K,R=w/K,d=v/K;for(let b=0;b<k.length;b++){let c=k[b],g=Z*c+E*Q+O*X-R*U-d*$;X=Q,Q=c,$=U,U=g,k[b]=g}}else{let M=A[0];for(let Y=0;Y<k.length;Y++){let j=A[Y]??M,z=2*Math.PI*j/F,C=Math.sin(z)/2,N=(1-Math.cos(z))/2,K=1-Math.cos(z),w=(1-Math.cos(z))/2,v=1+C,Z=-2*Math.cos(z),E=1-C,O=k[Y],R=N/v*O+K/v*Q+w/v*X-Z/v*U-E/v*$;X=Q,Q=O,$=U,U=R,k[Y]=R}}T[J]={x_1:Q,x_2:X,y_1:U,y_2:$}}}function u0(V,A,F,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:X,y_1:U,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let M=A[0];if(M<=20)return;let Y=2*Math.PI*M/F,j=Math.sin(Y)/2,z=(1+Math.cos(Y))/2,C=-(1+Math.cos(Y)),N=(1+Math.cos(Y))/2,K=1+j,w=-2*Math.cos(Y),v=1-j;for(let Z=0;Z<k.length;Z++){let E=k[Z],O=z/K*E+C/K*Q+N/K*X-w/K*U-v/K*$;X=Q,Q=E,$=U,U=O,k[Z]=O}}else{let M=A[0];for(let Y=0;Y<k.length;Y++){let j=A[Y]??M,z=2*Math.PI*j/F,C=Math.sin(z)/2,N=(1+Math.cos(z))/2,K=-(1+Math.cos(z)),w=(1+Math.cos(z))/2,v=1+C,Z=-2*Math.cos(z),E=1-C,O=k[Y],R=N/v*O+K/v*Q+w/v*X-Z/v*U-E/v*$;X=Q,Q=O,$=U,U=R,k[Y]=R}}T[J]={x_1:Q,x_2:X,y_1:U,y_2:$}}}function P0(V,A,F,T){let{type:J,data:k}=A;switch(J){case"buffer":return _0(V,k),n(V,T),[];case"bufferInit":{let Q=k;return V.buffer=H0(Q.channels,Q.totalLength),V.streamBuffer={...i(),totalLength:Q.totalLength,streamEnded:!1,streaming:Q.streaming??!0},n(V,T),[]}case"bufferRange":return V.streamBuffer.pendingWrites.push(k),[];case"bufferEnd":{let Q=k;if(Q?.totalLength!=null)V.streamBuffer.totalLength=Q.totalLength;return V.streamBuffer.streamEnded=!0,[]}case"bufferReset":return V.buffer=[],V.streamBuffer=i(),n(V,T),[];case"start":V.timesLooped=0;{let Q=k;if(V.duration=Q?.duration??-1,V.duration===-1)V.duration=V.loop?Number.MAX_SAFE_INTEGER:(V.buffer[0]?.length??0)/T;e(V,Q?.offset,T),n(V,T),V.playhead=V.offset,V.startWhen=Q?.when??F,V.stopWhen=V.startWhen+V.duration,V.playedSamples=0,V.state=P.Scheduled}return[{type:"scheduled"}];case"stop":if(V.state===P.Ended||V.state===P.Initial)return[];return V.stopWhen=k??V.stopWhen,V.state=P.Stopped,[{type:"stopped"}];case"pause":return V.state=P.Paused,V.pauseWhen=k??F,[{type:"paused"}];case"resume":return V.state=P.Started,V.startWhen=k??F,[{type:"resume"}];case"dispose":return V.state=P.Disposed,V.buffer=[],V.streamBuffer=i(),[{type:"disposed"}];case"loop":{let Q=k,X=V.state;if(Q&&(X===P.Scheduled||X===P.Started))V.stopWhen=Number.MAX_SAFE_INTEGER,V.duration=Number.MAX_SAFE_INTEGER;if(V.loop=Q,Q)n(V,T);return[]}case"loopStart":return V.loopStart=k,[];case"loopEnd":return V.loopEnd=k,[];case"loopCrossfade":return V.loopCrossfade=k,[];case"playhead":return V.playhead=Math.floor(k),[];case"fadeIn":return V.fadeInDuration=k,[];case"fadeOut":return V.fadeOutDuration=k,[];case"toggleGain":return V.enableGain=k??!V.enableGain,[];case"togglePan":return V.enablePan=k??!V.enablePan,[];case"toggleLowpass":return V.enableLowpass=k??!V.enableLowpass,[];case"toggleHighpass":return V.enableHighpass=k??!V.enableHighpass,[];case"toggleDetune":return V.enableDetune=k??!V.enableDetune,[];case"togglePlaybackRate":return V.enablePlaybackRate=k??!V.enablePlaybackRate,[];case"toggleFadeIn":return V.enableFadeIn=k??!V.enableFadeIn,[];case"toggleFadeOut":return V.enableFadeOut=k??!V.enableFadeOut,[];case"toggleLoopStart":return V.enableLoopStart=k??!V.enableLoopStart,[];case"toggleLoopEnd":return V.enableLoopEnd=k??!V.enableLoopEnd,[];case"toggleLoopCrossfade":return V.enableLoopCrossfade=k??!V.enableLoopCrossfade,[];case"logState":return[]}return[]}function j0(V,A,F,T,J){let k=[],Q=V.state;if(Q===P.Disposed)return{keepAlive:!1,messages:k};if(y0(V),Q===P.Initial)return{keepAlive:!0,messages:k};if(Q===P.Ended)return h(A[0]),{keepAlive:!0,messages:k};if(Q===P.Scheduled)if(T.currentTime>=V.startWhen)Q=V.state=P.Started,k.push({type:"started"});else return h(A[0]),{keepAlive:!0,messages:k};else if(Q===P.Paused){if(T.currentTime>V.pauseWhen)return h(A[0]),{keepAlive:!0,messages:k}}if(T.currentTime>V.stopWhen)return h(A[0]),V.state=P.Ended,k.push({type:"ended"}),V.playedSamples=0,{keepAlive:!0,messages:k};let X=A[0],U=o(V);if(U===0)return h(X),{keepAlive:!0,messages:k};let{playbackRate:$,detune:M,lowpass:Y,highpass:j,gain:z,pan:C}=F,{buffer:N,loopStart:K,loopEnd:w,loopCrossfade:v,stopWhen:Z,playedSamples:E,enableLowpass:O,enableHighpass:R,enableGain:d,enablePan:b,enableDetune:c,enableFadeOut:g,enableFadeIn:s,enableLoopStart:t,enableLoopEnd:r,enableLoopCrossfade:p,playhead:D,fadeInDuration:A0,fadeOutDuration:F0}=V,K0=V.streamBuffer.streaming&&V.streamBuffer.committedLength<U,k0=V.loop&&!K0,u=Math.min(N.length,X.length),W0=V.duration*T.sampleRate,Z0=Math.floor(T.sampleRate*v),q0=Math.max(U-_,0),L=t?Math.min(Math.floor(K*T.sampleRate),q0):0,x=r?Math.min(Math.floor(w*T.sampleRate),U):U,N0=x-L,T0=c&&M.length>0&&M[0]!==0,l=$;if(T0){let G=Math.max($.length,M.length,_);l=new Float32Array(G);for(let W=0;W<G;W++){let I=$[W]??$[$.length-1],H=M[W]??M[M.length-1];l[W]=I*2**(H/1200)}}let J0=V.enablePlaybackRate||T0,O0=J0&&l.length>0&&l.every((G)=>G===0);if(V.streamBuffer.streaming&&!V.streamBuffer.streamEnded&&!V.streamBuffer.lowWaterNotified&&V.streamBuffer.committedLength-Math.floor(D)<V.streamBuffer.lowWaterThreshold)k.push({type:"bufferLowWater",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength}}),V.streamBuffer.lowWaterNotified=!0;if(O0){h(X);for(let G=1;G<A.length;G++)M0(X,A[G]);return{keepAlive:!0,messages:k}}let Q0={bufferLength:U,loop:k0,playhead:D,loopStartSamples:L,loopEndSamples:x,durationSamples:W0,playbackRates:l},{indexes:a,ended:U0,looped:X0,playhead:Y0}=J0?x0(Q0):L0(Q0),f=a.find((G)=>G>=V.streamBuffer.committedLength&&G<U);if(f!==void 0&&!V.streamBuffer.streamEnded&&V.streamBuffer.lastUnderrunSample!==f)k.push({type:"bufferUnderrun",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength,requestedSample:f}}),V.streamBuffer.lastUnderrunSample=f;else if(f===void 0)V.streamBuffer.lastUnderrunSample=null;m0(X,N,a);let m=Math.min(Math.floor(v*T.sampleRate),N0),D0=k0&&D>L&&D<x,C0=p&&Z0>0&&U>_;if(D0&&C0){{let G=L+m;if(m>0&&D>L&&D<G){let W=D-L,I=Math.min(Math.floor(G-D),_);for(let H=0;H<I;H++){let B=(W+H)/m,S=Math.cos(Math.PI*B/2),q=Math.floor(x-m+W+H);if(q>=0&&q<U)for(let y=0;y<u;y++)X[y][H]+=N[y][q]*S}}}{let G=x-m;if(m>0&&D>G&&D<x){let W=D-G,I=Math.min(Math.floor(x-D),_);for(let H=0;H<I;H++){let B=(W+H)/m,S=Math.sin(Math.PI*B/2),q=Math.floor(L+W+H);if(q>=0&&q<U)for(let y=0;y<u;y++)X[y][H]+=N[y][q]*S}}}}if(s&&A0>0){let G=Math.floor(A0*T.sampleRate),W=G-E;if(W>0){let I=Math.min(W,_);for(let H=0;H<I;H++){let B=(E+H)/G,S=B*B*B;for(let q=0;q<u;q++)X[q][H]*=S}}}if(g&&F0>0){let G=Math.floor(F0*T.sampleRate),W=Math.floor(T.sampleRate*(Z-T.currentTime));if(W<G+_)for(let I=0;I<_;I++){let H=W-I;if(H>=G)continue;let B=H<=0?0:H/G,S=B*B*B;for(let q=0;q<u;q++)X[q][I]*=S}}if(O)d0(X,Y,T.sampleRate,J.lowpass);if(R)u0(X,j,T.sampleRate,J.highpass);if(d)g0(X,z);if(u===1)S0(X);if(b)h0(X,C);if(X0)V.timesLooped++,k.push({type:"looped",data:V.timesLooped});if(U0)V.state=P.Ended,k.push({type:"ended"});V.playedSamples+=a.length,V.playhead=Y0;let $0=c0(X);if($0>0)return console.log({numNans:$0,indexes:a,playhead:Y0,ended:U0,looped:X0,sourceLength:U}),{keepAlive:!0,messages:k};for(let G=1;G<A.length;G++)M0(X,A[G]);return{keepAlive:!0,messages:k}}class z0 extends AudioWorkletProcessor{static get parameterDescriptors(){return[{name:"playbackRate",automationRate:"a-rate",defaultValue:1},{name:"detune",automationRate:"a-rate",defaultValue:0},{name:"gain",automationRate:"a-rate",defaultValue:1,minValue:0},{name:"pan",automationRate:"a-rate",defaultValue:0},{name:"highpass",automationRate:"a-rate",defaultValue:20,minValue:20,maxValue:20000},{name:"lowpass",automationRate:"a-rate",defaultValue:20000,minValue:20,maxValue:20000}]}properties;filterState={lowpass:V0(),highpass:V0()};lastFrameTime=0;constructor(V){super(V);this.properties=v0(V?.processorOptions,sampleRate),this.port.onmessage=(A)=>{let F=P0(this.properties,A.data,currentTime,sampleRate);for(let T of F)this.port.postMessage(T);if(this.properties.state===P.Disposed)this.port.close()}}process(V,A,F){try{let T=j0(this.properties,A,F,{currentTime,currentFrame,sampleRate},this.filterState);for(let k of T.messages)this.port.postMessage(k);let J=currentTime-this.lastFrameTime;return this.lastFrameTime=currentTime,this.port.postMessage({type:"frame",data:[currentTime,currentFrame,Math.floor(this.properties.playhead),J*1000]}),T.keepAlive}catch(T){return this.port.postMessage({type:"processorError",data:{error:String(T),state:this.properties.state,bufferChannels:this.properties.buffer?.length,bufferLength:this.properties.buffer?.[0]?.length,paramKeys:Object.keys(F),hasPlaybackRate:!!F.playbackRate,hasDetune:!!F.detune,hasGain:!!F.gain,hasPan:!!F.pan,outputChannels:A[0]?.length}}),!0}}}registerProcessor("ClipProcessor",z0);
|
|
1
|
+
var z={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var y=128;function o(V=[]){let F=V[0]?.length??0,A=F>0;return{totalLength:A?F:null,committedLength:A?F:0,streamEnded:A,streaming:!1,writtenSpans:A?[{startSample:0,endSample:F}]:[],pendingWrites:[],lowWaterThreshold:y*4,lowWaterNotified:!1,lastUnderrunSample:null}}function z0(V){return V[0]?.length??0}function a(V){return V.streamBuffer.totalLength??z0(V.buffer)}function P0(V,F){return Array.from({length:V},()=>new Float32Array(F))}function w0(V,F){let A=[...V,F].sort((J,k)=>J.startSample-k.startSample),T=[];for(let J of A){let k=T[T.length-1];if(!k||J.startSample>k.endSample){T.push({...J});continue}k.endSample=Math.max(k.endSample,J.endSample)}return T}function R0(V){let F=0;for(let A of V){if(A.startSample>F)break;F=Math.max(F,A.endSample)}return F}function B0(V,F){if(V.committedLength-Math.floor(F)>=V.lowWaterThreshold)V.lowWaterNotified=!1}function y0(V,F,A){let T=z0(V.buffer),J=V.buffer.length;if(T>=A&&J>=F)return;let k=Math.max(T,A),Q=Math.max(J,F),U=P0(Q,k);for(let X=0;X<J;X++)U[X].set(V.buffer[X].subarray(0,T));if(V.buffer=U,V.streamBuffer.totalLength==null||V.streamBuffer.totalLength<k)V.streamBuffer.totalLength=k}function _0(V,F){let A=Math.max(Math.floor(F.startSample),0),T=F.channelData[0]?.length??0,J=F.totalLength??null,k=Math.max(A+T,J??0);y0(V,Math.max(F.channelData.length,V.buffer.length,1),k);for(let Q=0;Q<F.channelData.length;Q++)V.buffer[Q].set(F.channelData[Q],A);if(J!=null)V.streamBuffer.totalLength=J;if(T>0)V.streamBuffer.writtenSpans=w0(V.streamBuffer.writtenSpans,{startSample:A,endSample:A+T}),V.streamBuffer.committedLength=R0(V.streamBuffer.writtenSpans);if(F.streamEnded===!0)V.streamBuffer.streamEnded=!0;B0(V.streamBuffer,V.playhead)}function b0(V){if(V.streamBuffer.pendingWrites.length===0)return;for(let F of V.streamBuffer.pendingWrites)_0(V,F);V.streamBuffer.pendingWrites=[]}function L0(V,F){V.buffer=F,V.streamBuffer=o(F)}function K0(V={},F){let{buffer:A=[],streamBuffer:T=o(A),duration:J=-1,loop:k=!1,loopStart:Q=0,loopEnd:U=(A[0]?.length??0)/F,loopCrossfade:X=0,playhead:$=0,offset:G=0,startWhen:Y=0,stopWhen:P=0,pauseWhen:K=0,resumeWhen:O=0,playedSamples:v=0,state:W=z.Initial,timesLooped:w=0,fadeInDuration:j=0,fadeOutDuration:Z=0,enableFadeIn:C=j>0,enableFadeOut:D=Z>0,enableLoopStart:R=!0,enableLoopEnd:l=!0,enableLoopCrossfade:b=X>0,enableHighpass:h=!0,enableLowpass:d=!0,enableGain:r=!0,enablePan:p=!0,enableDetune:e=!0,enablePlaybackRate:V0=!0}=V;return{buffer:A,streamBuffer:T,loop:k,loopStart:Q,loopEnd:U,loopCrossfade:X,duration:J,playhead:$,offset:G,startWhen:Y,stopWhen:P,pauseWhen:K,resumeWhen:O,playedSamples:v,state:W,timesLooped:w,fadeInDuration:j,fadeOutDuration:Z,enableFadeIn:C,enableFadeOut:D,enableLoopStart:R,enableLoopEnd:l,enableHighpass:h,enableLowpass:d,enableGain:r,enablePan:p,enableDetune:e,enablePlaybackRate:V0,enableLoopCrossfade:b}}function x0(V,F){return a(V)/F}function i(V,F){let A=x0(V,F);if(A<=0){V.loopStart=0,V.loopEnd=0;return}if(!Number.isFinite(V.loopStart)||V.loopStart<0)V.loopStart=0;if(V.loopStart>=A)V.loopStart=0;if(!Number.isFinite(V.loopEnd)||V.loopEnd<=V.loopStart||V.loopEnd>A)V.loopEnd=A}function A0(V,F,A){if(F===void 0)return V.offset=0,0;if(F<0)return A0(V,a(V)+F,A);if(F>(a(V)||1)-1)return A0(V,a(V)%F,A);let T=Math.floor(F*A);return V.offset=T,T}function m0(V){let{playhead:F,bufferLength:A,loop:T,loopStartSamples:J,loopEndSamples:k}=V,Q=128;if(!T&&F+128>A)Q=Math.max(A-F,0);let U=Array(Q);if(!T){for(let Y=0,P=F;Y<Q;Y++,P++)U[Y]=P;let G=F+Q;return{playhead:G,indexes:U,looped:!1,ended:G>=A}}let X=F,$=!1;for(let G=0;G<Q;G++,X++){if(X>=k)X=J+(X-k),$=!0;U[G]=X}return{indexes:U,looped:$,ended:!1,playhead:X}}function S0(V){let{playhead:F,bufferLength:A,loop:T,loopStartSamples:J,loopEndSamples:k,playbackRates:Q}=V,U=128;if(!T&&F+128>A)U=Math.max(A-F,0);let X=Array(U),$=F,G=!1;if(T){for(let Y=0;Y<U;Y++){X[Y]=Math.min(Math.max(Math.floor($),0),A-1);let P=Q[Y]??Q[0]??1;if($+=P,P>=0&&($>k||$>A))$=J,G=!0;else if(P<0&&($<J||$<0))$=k,G=!0}return{playhead:$,indexes:X,looped:G,ended:!1}}for(let Y=0;Y<U;Y++)X[Y]=Math.min(Math.max(Math.floor($),0),A-1),$+=Q[Y]??Q[0]??1;return{playhead:$,indexes:X,looped:!1,ended:$>=A||$<0}}function g0(V,F,A){let T=Math.min(V.length,F.length);for(let J=0;J<A.length;J++)for(let k=0;k<T;k++)V[k][J]=F[k][A[J]];for(let J=T;J<V.length;J++)for(let k=0;k<V[J].length;k++)V[J][k]=0;for(let J=A.length;J<V[0].length;J++)for(let k=0;k<T;k++)V[k][J]=0}function c(V){for(let F=0;F<V.length;F++)for(let A=0;A<V[F].length;A++)V[F][A]=0}function c0(V){if(V.length>=2)for(let F=0;F<V[0].length;F++)V[1][F]=V[0][F];else{let F=new Float32Array(V[0].length);for(let A=0;A<V[0].length;A++)F[A]=V[0][A];V.push(F)}}function F0(V,F){for(let A=F.length;A<V.length;A++)F[A]=new Float32Array(V[A].length);for(let A=0;A<V.length;A++)for(let T=0;T<V[A].length;T++)F[A][T]=V[A][T]}function h0(V){let F=0;for(let A=0;A<V.length;A++)for(let T=0;T<V[A].length;T++)if(Number.isNaN(V[A][T]))F++,V[A][T]=0;return F}function k0(){return[{x_1:0,x_2:0,y_1:0,y_2:0},{x_1:0,x_2:0,y_1:0,y_2:0}]}function d0(V,F){if(F.length===1){let T=F[0];if(T===1)return;for(let J of V)for(let k=0;k<J.length;k++)J[k]*=T;return}let A=F[0];for(let T of V)for(let J=0;J<T.length;J++)A=F[J]??A,T[J]*=A}function l0(V,F){let A=F[0];for(let T=0;T<V[0].length;T++){A=F[T]??A;let J=A<=0?1:1-A,k=A>=0?1:1+A;V[0][T]*=J,V[1][T]*=k}}function u0(V,F,A,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:U,y_1:X,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(F.length===1){let G=F[0];if(G>=20000)return;let Y=2*Math.PI*G/A,P=Math.sin(Y)/2,K=(1-Math.cos(Y))/2,O=1-Math.cos(Y),v=(1-Math.cos(Y))/2,W=1+P,w=-2*Math.cos(Y),j=1-P,Z=K/W,C=O/W,D=v/W,R=w/W,l=j/W;for(let b=0;b<k.length;b++){let h=k[b],d=Z*h+C*Q+D*U-R*X-l*$;U=Q,Q=h,$=X,X=d,k[b]=d}}else{let G=F[0];for(let Y=0;Y<k.length;Y++){let P=F[Y]??G,K=2*Math.PI*P/A,O=Math.sin(K)/2,v=(1-Math.cos(K))/2,W=1-Math.cos(K),w=(1-Math.cos(K))/2,j=1+O,Z=-2*Math.cos(K),C=1-O,D=k[Y],R=v/j*D+W/j*Q+w/j*U-Z/j*X-C/j*$;U=Q,Q=D,$=X,X=R,k[Y]=R}}T[J]={x_1:Q,x_2:U,y_1:X,y_2:$}}}function f0(V,F,A,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:U,y_1:X,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(F.length===1){let G=F[0];if(G<=20)return;let Y=2*Math.PI*G/A,P=Math.sin(Y)/2,K=(1+Math.cos(Y))/2,O=-(1+Math.cos(Y)),v=(1+Math.cos(Y))/2,W=1+P,w=-2*Math.cos(Y),j=1-P;for(let Z=0;Z<k.length;Z++){let C=k[Z],D=K/W*C+O/W*Q+v/W*U-w/W*X-j/W*$;U=Q,Q=C,$=X,X=D,k[Z]=D}}else{let G=F[0];for(let Y=0;Y<k.length;Y++){let P=F[Y]??G,K=2*Math.PI*P/A,O=Math.sin(K)/2,v=(1+Math.cos(K))/2,W=-(1+Math.cos(K)),w=(1+Math.cos(K))/2,j=1+O,Z=-2*Math.cos(K),C=1-O,D=k[Y],R=v/j*D+W/j*Q+w/j*U-Z/j*X-C/j*$;U=Q,Q=D,$=X,X=R,k[Y]=R}}T[J]={x_1:Q,x_2:U,y_1:X,y_2:$}}}function T0(V,F,A,T){let{type:J,data:k}=F;switch(J){case"buffer":return L0(V,k),i(V,T),[];case"bufferInit":{let Q=k;return V.buffer=P0(Q.channels,Q.totalLength),V.streamBuffer={...o(),totalLength:Q.totalLength,streamEnded:!1,streaming:Q.streaming??!0},i(V,T),[]}case"bufferRange":return V.streamBuffer.pendingWrites.push(k),[];case"bufferEnd":{let Q=k;if(Q?.totalLength!=null)V.streamBuffer.totalLength=Q.totalLength;return V.streamBuffer.streamEnded=!0,[]}case"bufferReset":return V.buffer=[],V.streamBuffer=o(),i(V,T),[];case"start":V.timesLooped=0;{let Q=k;if(V.duration=Q?.duration??-1,V.duration===-1)V.duration=V.loop?Number.MAX_SAFE_INTEGER:(V.buffer[0]?.length??0)/T;A0(V,Q?.offset,T),i(V,T),V.playhead=V.offset,V.startWhen=Q?.when??A,V.stopWhen=V.startWhen+V.duration,V.playedSamples=0,V.state=z.Scheduled}return[{type:"scheduled"}];case"stop":if(V.state===z.Ended||V.state===z.Initial)return[];return V.stopWhen=k??V.stopWhen,V.state=z.Stopped,[{type:"stopped"}];case"pause":return V.state=z.Paused,V.pauseWhen=k??A,[{type:"paused"}];case"resume":return V.state=z.Started,V.startWhen=k??A,[{type:"resume"}];case"dispose":return V.state=z.Disposed,V.buffer=[],V.streamBuffer=o(),[{type:"disposed"}];case"loop":{let Q=k,U=V.state;if(Q&&(U===z.Scheduled||U===z.Started))V.stopWhen=Number.MAX_SAFE_INTEGER,V.duration=Number.MAX_SAFE_INTEGER;if(V.loop=Q,Q)i(V,T);return[]}case"loopStart":return V.loopStart=k,[];case"loopEnd":return V.loopEnd=k,[];case"loopCrossfade":return V.loopCrossfade=k,V.enableLoopCrossfade=V.loopCrossfade>0,[];case"playhead":return V.playhead=Math.floor(k),[];case"fadeIn":return V.fadeInDuration=k,V.enableFadeIn=V.fadeInDuration>0,[];case"fadeOut":return V.fadeOutDuration=k,V.enableFadeOut=V.fadeOutDuration>0,[];case"toggleGain":return V.enableGain=k??!V.enableGain,[];case"togglePan":return V.enablePan=k??!V.enablePan,[];case"toggleLowpass":return V.enableLowpass=k??!V.enableLowpass,[];case"toggleHighpass":return V.enableHighpass=k??!V.enableHighpass,[];case"toggleDetune":return V.enableDetune=k??!V.enableDetune,[];case"togglePlaybackRate":return V.enablePlaybackRate=k??!V.enablePlaybackRate,[];case"toggleFadeIn":return V.enableFadeIn=k??!V.enableFadeIn,[];case"toggleFadeOut":return V.enableFadeOut=k??!V.enableFadeOut,[];case"toggleLoopStart":return V.enableLoopStart=k??!V.enableLoopStart,[];case"toggleLoopEnd":return V.enableLoopEnd=k??!V.enableLoopEnd,[];case"toggleLoopCrossfade":return V.enableLoopCrossfade=k??!V.enableLoopCrossfade,[];case"logState":return[]}return[]}function W0(V,F,A,T,J){let k=[],Q=V.state;if(Q===z.Disposed)return{keepAlive:!1,messages:k};if(b0(V),Q===z.Initial)return{keepAlive:!0,messages:k};if(Q===z.Ended)return c(F[0]),{keepAlive:!0,messages:k};if(Q===z.Scheduled)if(T.currentTime>=V.startWhen)Q=V.state=z.Started,k.push({type:"started"});else return c(F[0]),{keepAlive:!0,messages:k};else if(Q===z.Paused){if(T.currentTime>V.pauseWhen)return c(F[0]),{keepAlive:!0,messages:k}}if(T.currentTime>V.stopWhen)return c(F[0]),V.state=z.Ended,k.push({type:"ended"}),V.playedSamples=0,{keepAlive:!0,messages:k};let U=F[0],X=a(V);if(X===0)return c(U),{keepAlive:!0,messages:k};let{playbackRate:$,detune:G,lowpass:Y,highpass:P,gain:K,pan:O}=A,{buffer:v,loopStart:W,loopEnd:w,loopCrossfade:j,stopWhen:Z,playedSamples:C,enableLowpass:D,enableHighpass:R,enableGain:l,enablePan:b,enableDetune:h,enableFadeOut:d,enableFadeIn:r,enableLoopStart:p,enableLoopEnd:e,enableLoopCrossfade:V0,playhead:E,fadeInDuration:J0,fadeOutDuration:Q0}=V,U0=V.streamBuffer.streaming&&V.streamBuffer.committedLength<X,s=V.loop,L=U0&&s?Math.max(V.streamBuffer.committedLength,0):X,Z0=y*2;if(U0&&s&&L<Z0){c(U);for(let M=1;M<F.length;M++)F0(U,F[M]);return{keepAlive:!0,messages:k}}let u=Math.min(v.length,U.length),N0=V.duration*T.sampleRate,v0=Math.floor(T.sampleRate*j),D0=Math.max(L-y,0),x=p?Math.min(Math.floor(W*T.sampleRate),D0):0,m=e?Math.min(Math.floor(w*T.sampleRate),L):L,O0=m-x,X0=h&&G.length>0&&G[0]!==0,f=$;if(X0){let M=Math.max($.length,G.length,y);f=new Float32Array(M);for(let q=0;q<M;q++){let I=$[q]??$[$.length-1],H=G[q]??G[G.length-1];f[q]=I*2**(H/1200)}}let Y0=V.enablePlaybackRate||X0,C0=Y0&&f.length>0&&f.every((M)=>M===0);if(V.streamBuffer.streaming&&!V.streamBuffer.streamEnded&&!V.streamBuffer.lowWaterNotified&&V.streamBuffer.committedLength-Math.floor(E)<V.streamBuffer.lowWaterThreshold)k.push({type:"bufferLowWater",data:{playhead:Math.floor(E),committedLength:V.streamBuffer.committedLength}}),V.streamBuffer.lowWaterNotified=!0;if(C0){c(U);for(let M=1;M<F.length;M++)F0(U,F[M]);return{keepAlive:!0,messages:k}}let $0={bufferLength:L,loop:s,playhead:V.playhead,loopStartSamples:x,loopEndSamples:m,durationSamples:N0,playbackRates:f},{indexes:t,ended:M0,looped:G0,playhead:H0}=Y0?S0($0):m0($0),n=t.find((M)=>M>=V.streamBuffer.committedLength&&M<X);if(n!==void 0&&!V.streamBuffer.streamEnded&&V.streamBuffer.lastUnderrunSample!==n)k.push({type:"bufferUnderrun",data:{playhead:Math.floor(E),committedLength:V.streamBuffer.committedLength,requestedSample:n}}),V.streamBuffer.lastUnderrunSample=n;else if(n===void 0)V.streamBuffer.lastUnderrunSample=null;g0(U,v,t);let S=Math.min(Math.floor(j*T.sampleRate),O0),E0=s&&E>x&&E<m,I0=V0&&v0>0&&L>y;if(E0&&I0){{let M=x+S;if(S>0&&E>x&&E<M){let q=E-x,I=Math.min(Math.floor(M-E),y);for(let H=0;H<I;H++){let B=(q+H)/S,g=Math.cos(Math.PI*B/2),N=Math.floor(m-S+q+H);if(N>=0&&N<L)for(let _=0;_<u;_++)U[_][H]+=v[_][N]*g}}}{let M=m-S;if(S>0&&E>M&&E<m){let q=E-M,I=Math.min(Math.floor(m-E),y);for(let H=0;H<I;H++){let B=(q+H)/S,g=Math.sin(Math.PI*B/2),N=Math.floor(x+q+H);if(N>=0&&N<L)for(let _=0;_<u;_++)U[_][H]+=v[_][N]*g}}}}if(r&&J0>0){let M=Math.floor(J0*T.sampleRate),q=M-C;if(q>0){let I=Math.min(q,y);for(let H=0;H<I;H++){let B=(C+H)/M,g=B*B*B;for(let N=0;N<u;N++)U[N][H]*=g}}}if(d&&Q0>0){let M=Math.floor(Q0*T.sampleRate),q=Math.floor(T.sampleRate*(Z-T.currentTime));if(q<M+y)for(let I=0;I<y;I++){let H=q-I;if(H>=M)continue;let B=H<=0?0:H/M,g=B*B*B;for(let N=0;N<u;N++)U[N][I]*=g}}if(D)u0(U,Y,T.sampleRate,J.lowpass);if(R)f0(U,P,T.sampleRate,J.highpass);if(l)d0(U,K);if(u===1)c0(U);if(b)l0(U,O);if(G0)V.timesLooped++,k.push({type:"looped",data:V.timesLooped});if(M0)V.state=z.Ended,k.push({type:"ended"});V.playedSamples+=t.length,V.playhead=H0;let j0=h0(U);if(j0>0)return console.log({numNans:j0,indexes:t,playhead:H0,ended:M0,looped:G0,sourceLength:X}),{keepAlive:!0,messages:k};for(let M=1;M<F.length;M++)F0(U,F[M]);return{keepAlive:!0,messages:k}}class q0 extends AudioWorkletProcessor{static get parameterDescriptors(){return[{name:"playbackRate",automationRate:"a-rate",defaultValue:1},{name:"detune",automationRate:"a-rate",defaultValue:0},{name:"gain",automationRate:"a-rate",defaultValue:1,minValue:0},{name:"pan",automationRate:"a-rate",defaultValue:0},{name:"highpass",automationRate:"a-rate",defaultValue:20,minValue:20,maxValue:20000},{name:"lowpass",automationRate:"a-rate",defaultValue:20000,minValue:20,maxValue:20000}]}properties;filterState={lowpass:k0(),highpass:k0()};lastFrameTime=0;constructor(V){super(V);this.properties=K0(V?.processorOptions,sampleRate),this.port.onmessage=(F)=>{if(F.data.type==="transferPort"){let T=F.data.data;T.onmessage=(J)=>{let k=T0(this.properties,J.data,currentTime,sampleRate);for(let Q of k)this.port.postMessage(Q)};return}let A=T0(this.properties,F.data,currentTime,sampleRate);for(let T of A)this.port.postMessage(T);if(this.properties.state===z.Disposed)this.port.close()}}process(V,F,A){try{let T=W0(this.properties,F,A,{currentTime,currentFrame,sampleRate},this.filterState);for(let k of T.messages)this.port.postMessage(k);let J=currentTime-this.lastFrameTime;return this.lastFrameTime=currentTime,this.port.postMessage({type:"frame",data:[currentTime,currentFrame,Math.floor(this.properties.playhead),J*1000]}),T.keepAlive}catch(T){return this.port.postMessage({type:"processorError",data:{error:String(T),state:this.properties.state,bufferChannels:this.properties.buffer?.length,bufferLength:this.properties.buffer?.[0]?.length,paramKeys:Object.keys(A),hasPlaybackRate:!!A.playbackRate,hasDetune:!!A.detune,hasGain:!!A.gain,hasPan:!!A.pan,outputChannels:F[0]?.length}}),!0}}}registerProcessor("ClipProcessor",q0);
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=CA160104FA867FAC64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Streaming Example (WebCodecs AudioDecoder + Worker)
|
|
2
|
+
|
|
3
|
+
Streams an MP3 file over HTTP, decodes it progressively using the WebCodecs
|
|
4
|
+
`AudioDecoder` API inside a Web Worker, and sends decoded audio directly to
|
|
5
|
+
the ClipNode processor via a `MessagePort`.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
fetch → ReadableStream → MP3 frame parser → AudioDecoder (Worker)
|
|
11
|
+
↓ MessagePort
|
|
12
|
+
ClipProcessor (AudioWorklet)
|
|
13
|
+
↓
|
|
14
|
+
AudioContext.destination
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The main thread only handles UI and transport controls.
|
|
18
|
+
|
|
19
|
+
## Browser Support
|
|
20
|
+
|
|
21
|
+
Chrome 94+, Edge 94+, Firefox 130+, Safari 26+
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
bun run dev
|
|
25
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const workers = [
|
|
2
|
+
{
|
|
3
|
+
entry: "./mp3-decode-worker.ts",
|
|
4
|
+
output: "./generated/mp3-worker-code.ts",
|
|
5
|
+
exportName: "mp3WorkerCode",
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
entry: "./ogg-opus-decode-worker.ts",
|
|
9
|
+
output: "./generated/ogg-opus-worker-code.ts",
|
|
10
|
+
exportName: "oggOpusWorkerCode",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
entry: "./raw-opus-framed-decode-worker.ts",
|
|
14
|
+
output: "./generated/raw-opus-framed-worker-code.ts",
|
|
15
|
+
exportName: "rawOpusFramedWorkerCode",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
entry: "./webm-opus-decode-worker.ts",
|
|
19
|
+
output: "./generated/webm-opus-worker-code.ts",
|
|
20
|
+
exportName: "webmOpusWorkerCode",
|
|
21
|
+
},
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
for (const worker of workers) {
|
|
25
|
+
const result = await Bun.build({
|
|
26
|
+
entrypoints: [worker.entry],
|
|
27
|
+
target: "browser",
|
|
28
|
+
minify: true,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
console.error(`Worker build failed for ${worker.entry}:`, result.logs);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const code = await result.outputs[0].text();
|
|
37
|
+
const escaped = JSON.stringify(code);
|
|
38
|
+
|
|
39
|
+
await Bun.write(
|
|
40
|
+
worker.output,
|
|
41
|
+
`// AUTO-GENERATED — do not edit. Run \`bun run build:worker\` to regenerate.\nexport const ${worker.exportName} = ${escaped};\n`,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
console.log(
|
|
45
|
+
`Built ${worker.entry} (${code.length} bytes) → ${worker.output}`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseOpusHead,
|
|
3
|
+
type OpusHead,
|
|
4
|
+
} from "./opus-worker-common";
|
|
5
|
+
|
|
6
|
+
export const FRAMED_RAW_OPUS_MAGIC = "FROPUS01";
|
|
7
|
+
|
|
8
|
+
const magicBytes = new TextEncoder().encode(FRAMED_RAW_OPUS_MAGIC);
|
|
9
|
+
|
|
10
|
+
export interface FramedRawOpusStreamState {
|
|
11
|
+
headerParsed: boolean;
|
|
12
|
+
head: OpusHead | null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface FramedRawOpusParseResult {
|
|
16
|
+
packets: Uint8Array<ArrayBufferLike>[];
|
|
17
|
+
leftover: Uint8Array<ArrayBufferLike>;
|
|
18
|
+
head: OpusHead | null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function createFramedRawOpusStreamState(): FramedRawOpusStreamState {
|
|
22
|
+
return {
|
|
23
|
+
headerParsed: false,
|
|
24
|
+
head: null,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function readUint32LE(buf: Uint8Array, offset: number): number {
|
|
29
|
+
return (
|
|
30
|
+
(buf[offset] ?? 0) |
|
|
31
|
+
((buf[offset + 1] ?? 0) << 8) |
|
|
32
|
+
((buf[offset + 2] ?? 0) << 16) |
|
|
33
|
+
((buf[offset + 3] ?? 0) << 24)
|
|
34
|
+
) >>> 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function parseFramedRawOpusStream(
|
|
38
|
+
buf: Uint8Array<ArrayBufferLike>,
|
|
39
|
+
state: FramedRawOpusStreamState,
|
|
40
|
+
): FramedRawOpusParseResult {
|
|
41
|
+
let cursor = 0;
|
|
42
|
+
if (!state.headerParsed) {
|
|
43
|
+
const headerLength = magicBytes.length + 4;
|
|
44
|
+
if (buf.length < headerLength) {
|
|
45
|
+
return {
|
|
46
|
+
packets: [],
|
|
47
|
+
leftover: buf,
|
|
48
|
+
head: state.head,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
for (let i = 0; i < magicBytes.length; i++) {
|
|
52
|
+
if (buf[i] !== magicBytes[i]) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`Expected ${FRAMED_RAW_OPUS_MAGIC} header for framed raw Opus transport`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const opusHeadLength = readUint32LE(buf, magicBytes.length);
|
|
59
|
+
const opusHeadStart = headerLength;
|
|
60
|
+
const opusHeadEnd = opusHeadStart + opusHeadLength;
|
|
61
|
+
if (buf.length < opusHeadEnd) {
|
|
62
|
+
return {
|
|
63
|
+
packets: [],
|
|
64
|
+
leftover: buf,
|
|
65
|
+
head: state.head,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const headPacket = buf.slice(opusHeadStart, opusHeadEnd);
|
|
69
|
+
const head = parseOpusHead(headPacket);
|
|
70
|
+
if (!head) {
|
|
71
|
+
throw new Error("Framed raw Opus stream is missing a valid OpusHead packet");
|
|
72
|
+
}
|
|
73
|
+
state.headerParsed = true;
|
|
74
|
+
state.head = head;
|
|
75
|
+
cursor = opusHeadEnd;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const packets: Uint8Array<ArrayBufferLike>[] = [];
|
|
79
|
+
while (cursor + 4 <= buf.length) {
|
|
80
|
+
const packetLength = readUint32LE(buf, cursor);
|
|
81
|
+
const packetStart = cursor + 4;
|
|
82
|
+
const packetEnd = packetStart + packetLength;
|
|
83
|
+
if (buf.length < packetEnd) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
packets.push(buf.slice(packetStart, packetEnd));
|
|
87
|
+
cursor = packetEnd;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
packets,
|
|
92
|
+
leftover: buf.slice(cursor),
|
|
93
|
+
head: state.head,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>ClipNode – Streaming Example</title>
|
|
7
|
+
<link rel="stylesheet" href="../../src/styles.css" />
|
|
8
|
+
<style>
|
|
9
|
+
body { max-width: 900px; }
|
|
10
|
+
</style>
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<div id="root"></div>
|
|
14
|
+
<script type="module" src="./src/main.tsx"></script>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|