@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,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
const SNAP_OPTIONS = [
|
|
5
|
+
{ value: "none", label: "None" },
|
|
6
|
+
{ value: "beat", label: "Beat" },
|
|
7
|
+
{ value: "bar", label: "Bar" },
|
|
8
|
+
{ value: "8th", label: "8th" },
|
|
9
|
+
{ value: "16th", label: "16th" },
|
|
10
|
+
{ value: "int", label: "Integer" },
|
|
11
|
+
];
|
|
12
|
+
export function ContextMenu({ x, y, snap, snapMode = "tempo", min, max, maxLocked = false, showMaxLock = true, audioDuration, onSnapChange, onMinChange, onMaxChange, onMaxLockedChange, onClose, }) {
|
|
13
|
+
const menuRef = useRef(null);
|
|
14
|
+
// Close on click outside or Escape
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const handleClick = (e) => {
|
|
17
|
+
if (menuRef.current && !menuRef.current.contains(e.target)) {
|
|
18
|
+
onClose();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const handleKey = (e) => {
|
|
22
|
+
if (e.key === "Escape")
|
|
23
|
+
onClose();
|
|
24
|
+
};
|
|
25
|
+
document.addEventListener("mousedown", handleClick);
|
|
26
|
+
document.addEventListener("keydown", handleKey);
|
|
27
|
+
return () => {
|
|
28
|
+
document.removeEventListener("mousedown", handleClick);
|
|
29
|
+
document.removeEventListener("keydown", handleKey);
|
|
30
|
+
};
|
|
31
|
+
}, [onClose]);
|
|
32
|
+
// Adjust position to stay within viewport
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const el = menuRef.current;
|
|
35
|
+
if (!el)
|
|
36
|
+
return;
|
|
37
|
+
const rect = el.getBoundingClientRect();
|
|
38
|
+
if (rect.right > window.innerWidth) {
|
|
39
|
+
el.style.left = `${window.innerWidth - rect.width - 8}px`;
|
|
40
|
+
}
|
|
41
|
+
if (rect.bottom > window.innerHeight) {
|
|
42
|
+
el.style.top = `${window.innerHeight - rect.height - 8}px`;
|
|
43
|
+
}
|
|
44
|
+
}, []);
|
|
45
|
+
const handleSnapClick = useCallback((value) => {
|
|
46
|
+
onSnapChange(value);
|
|
47
|
+
}, [onSnapChange]);
|
|
48
|
+
const handleMinCommit = useCallback((e) => {
|
|
49
|
+
const input = e.currentTarget;
|
|
50
|
+
const parsed = Number.parseFloat(input.value);
|
|
51
|
+
if (Number.isFinite(parsed)) {
|
|
52
|
+
onMinChange(parsed);
|
|
53
|
+
}
|
|
54
|
+
}, [onMinChange]);
|
|
55
|
+
const handleMaxCommit = useCallback((e) => {
|
|
56
|
+
const input = e.currentTarget;
|
|
57
|
+
const parsed = Number.parseFloat(input.value);
|
|
58
|
+
if (Number.isFinite(parsed)) {
|
|
59
|
+
onMaxChange(parsed);
|
|
60
|
+
}
|
|
61
|
+
}, [onMaxChange]);
|
|
62
|
+
const handleInputKeyDown = useCallback((commit) => (e) => {
|
|
63
|
+
if (e.key === "Enter") {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
commit(e);
|
|
66
|
+
}
|
|
67
|
+
else if (e.key === "Escape") {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
onClose();
|
|
70
|
+
}
|
|
71
|
+
}, [onClose]);
|
|
72
|
+
return createPortal(_jsxs("div", { ref: menuRef, className: "context-menu", style: { left: x, top: y }, role: "menu", children: [_jsx("div", { className: "context-menu__section-label", children: "Snap" }), snapMode === "preset" ? (_jsxs("label", { className: "context-menu__field", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: snap !== "none", onChange: (e) => onSnapChange(e.target.checked ? "preset" : "none") }), "Enable snap"] })) : (SNAP_OPTIONS.map((opt) => (_jsxs("button", { type: "button", className: `context-menu__item${snap === opt.value ? " context-menu__item--active" : ""}`, role: "menuitemradio", "aria-checked": snap === opt.value, onClick: () => handleSnapClick(opt.value), children: [_jsx("span", { className: "context-menu__radio", children: snap === opt.value ? "●" : "○" }), opt.label] }, opt.value)))), _jsx("div", { className: "context-menu__divider" }), _jsx("div", { className: "context-menu__section-label", children: "Range" }), _jsxs("label", { className: "context-menu__field", children: ["Min:", _jsx("input", { type: "number", className: "context-menu__input", defaultValue: min, step: "any", onBlur: handleMinCommit, onKeyDown: handleInputKeyDown(handleMinCommit) })] }), _jsxs("label", { className: "context-menu__field", children: ["Max:", _jsx("input", { type: "number", className: "context-menu__input", defaultValue: max, step: "any", disabled: maxLocked && audioDuration != null, onBlur: handleMaxCommit, onKeyDown: handleInputKeyDown(handleMaxCommit) })] }), showMaxLock && (_jsxs("label", { className: "context-menu__field", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: maxLocked, onChange: (e) => onMaxLockedChange?.(e.target.checked) }), "Max = file length"] }))] }), document.body);
|
|
73
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ControlDef, ControlKey } from "../controls/controlDefs";
|
|
2
|
+
import type { LinkedControlPairDef, LinkedControlPairKey } from "../controls/linkedControlPairs";
|
|
3
|
+
interface ControlSectionProps {
|
|
4
|
+
legend: string;
|
|
5
|
+
defs: ControlDef[];
|
|
6
|
+
values: Record<ControlKey, number>;
|
|
7
|
+
snaps: Record<ControlKey, string>;
|
|
8
|
+
enabled: Record<ControlKey, boolean>;
|
|
9
|
+
mins: Record<ControlKey, number>;
|
|
10
|
+
maxs: Record<ControlKey, number>;
|
|
11
|
+
maxLocked: Record<ControlKey, boolean>;
|
|
12
|
+
linked?: Record<LinkedControlPairKey, boolean>;
|
|
13
|
+
linkedPairs?: readonly LinkedControlPairDef[];
|
|
14
|
+
tempo: number;
|
|
15
|
+
audioDuration?: number | null;
|
|
16
|
+
onValueChange: (key: ControlKey, val: number) => void;
|
|
17
|
+
onToggle: (key: ControlKey, on: boolean) => void;
|
|
18
|
+
onLinkedChange?: (key: LinkedControlPairKey, linked: boolean) => void;
|
|
19
|
+
onSnapChange: (key: ControlKey, snap: string) => void;
|
|
20
|
+
onMinChange: (key: ControlKey, val: number) => void;
|
|
21
|
+
onMaxChange: (key: ControlKey, val: number) => void;
|
|
22
|
+
onMaxLockedChange: (key: ControlKey, locked: boolean) => void;
|
|
23
|
+
}
|
|
24
|
+
declare function ControlSectionInner({ legend, defs, linked, linkedPairs, onLinkedChange, ...controlProps }: ControlSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export declare const ControlSection: import("react").MemoExoticComponent<typeof ControlSectionInner>;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useId } from "react";
|
|
3
|
+
import { AudioControl } from "./AudioControl.js";
|
|
4
|
+
/** Build a set of control keys that belong to a linked pair,
|
|
5
|
+
* and a map from the first control key to its pair def. */
|
|
6
|
+
function buildPairMaps(pairs) {
|
|
7
|
+
const pairByFirst = new Map();
|
|
8
|
+
const pairedKeys = new Set();
|
|
9
|
+
if (pairs) {
|
|
10
|
+
for (const pair of pairs) {
|
|
11
|
+
pairByFirst.set(pair.controls[0], pair);
|
|
12
|
+
pairedKeys.add(pair.controls[0]);
|
|
13
|
+
pairedKeys.add(pair.controls[1]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return { pairByFirst, pairedKeys };
|
|
17
|
+
}
|
|
18
|
+
function renderAudioControl(def, props) {
|
|
19
|
+
const { mins, maxs, maxLocked, audioDuration, values, tempo, snaps, enabled, onValueChange, onToggle, onSnapChange, onMinChange, onMaxChange, onMaxLockedChange, } = props;
|
|
20
|
+
return (_jsx(AudioControl, { label: def.label, controlKey: def.key, min: mins[def.key] ?? def.min, max: maxLocked[def.key] && audioDuration != null
|
|
21
|
+
? audioDuration
|
|
22
|
+
: (maxs[def.key] ?? def.max), value: values[def.key], defaultValue: def.defaultValue, tempo: tempo, snap: snaps[def.key], preset: def.preset, title: def.title, enabled: enabled[def.key], hasToggle: def.hasToggle, hasSnap: def.hasSnap, hasMaxLock: def.hasMaxLock, audioDuration: audioDuration, maxLocked: maxLocked[def.key] ?? true, onChange: (v) => onValueChange(def.key, v), onToggle: (on) => onToggle(def.key, on), onSnapChange: (s) => onSnapChange(def.key, s), onMinChange: (v) => onMinChange(def.key, v), onMaxChange: (v) => onMaxChange(def.key, v), onMaxLockedChange: (locked) => onMaxLockedChange(def.key, locked) }, def.key));
|
|
23
|
+
}
|
|
24
|
+
function ControlSectionInner({ legend, defs, linked, linkedPairs, onLinkedChange, ...controlProps }) {
|
|
25
|
+
const sectionId = useId();
|
|
26
|
+
const { pairByFirst, pairedKeys } = buildPairMaps(linkedPairs);
|
|
27
|
+
const items = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
while (i < defs.length) {
|
|
30
|
+
const def = defs[i];
|
|
31
|
+
const pair = pairByFirst.get(def.key);
|
|
32
|
+
if (pair) {
|
|
33
|
+
// Find the second control in the pair
|
|
34
|
+
const secondDef = defs.find((d) => d.key === pair.controls[1]);
|
|
35
|
+
const isLinked = linked?.[pair.key] ?? false;
|
|
36
|
+
const inputId = `${sectionId}-${pair.key}`;
|
|
37
|
+
items.push(_jsxs("div", { className: `control-link-group${isLinked ? " control-link-group--active" : ""}`, children: [_jsxs("div", { className: "control-link-bracket", children: [_jsx("span", { className: "control-link-line" }), _jsx("button", { type: "button", id: inputId, className: "control-link-btn", "aria-pressed": isLinked, "aria-label": pair.label, title: pair.label, onClick: () => onLinkedChange?.(pair.key, !isLinked), children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M6.5 4.5h-1A2.5 2.5 0 0 0 3 7v2a2.5 2.5 0 0 0 2.5 2.5h1m3-7h1A2.5 2.5 0 0 1 13 7v2a2.5 2.5 0 0 1-2.5 2.5h-1M5.5 8h5", stroke: "currentColor", strokeWidth: "1.3", strokeLinecap: "round" }) }) }), _jsx("span", { className: "control-link-line" })] }), _jsxs("div", { className: "control-link-controls", children: [renderAudioControl(def, controlProps), secondDef && renderAudioControl(secondDef, controlProps)] })] }, `link-${pair.key}`));
|
|
38
|
+
// Skip past both controls in the pair
|
|
39
|
+
i += 1;
|
|
40
|
+
if (secondDef && defs[i]?.key === secondDef.key) {
|
|
41
|
+
i += 1;
|
|
42
|
+
}
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Not part of a pair (or is a second control already rendered above)
|
|
46
|
+
if (!pairedKeys.has(def.key)) {
|
|
47
|
+
items.push(renderAudioControl(def, controlProps));
|
|
48
|
+
}
|
|
49
|
+
i += 1;
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs("fieldset", { className: "control-group", children: [_jsx("legend", { children: legend }), items] }));
|
|
52
|
+
}
|
|
53
|
+
function areControlSectionPropsEqual(prev, next) {
|
|
54
|
+
return (prev.legend === next.legend &&
|
|
55
|
+
prev.defs === next.defs &&
|
|
56
|
+
prev.values === next.values &&
|
|
57
|
+
prev.snaps === next.snaps &&
|
|
58
|
+
prev.enabled === next.enabled &&
|
|
59
|
+
prev.mins === next.mins &&
|
|
60
|
+
prev.maxs === next.maxs &&
|
|
61
|
+
prev.maxLocked === next.maxLocked &&
|
|
62
|
+
prev.linked === next.linked &&
|
|
63
|
+
prev.linkedPairs === next.linkedPairs &&
|
|
64
|
+
prev.tempo === next.tempo &&
|
|
65
|
+
prev.audioDuration === next.audioDuration &&
|
|
66
|
+
prev.onValueChange === next.onValueChange &&
|
|
67
|
+
prev.onToggle === next.onToggle &&
|
|
68
|
+
prev.onLinkedChange === next.onLinkedChange &&
|
|
69
|
+
prev.onSnapChange === next.onSnapChange &&
|
|
70
|
+
prev.onMinChange === next.onMinChange &&
|
|
71
|
+
prev.onMaxChange === next.onMaxChange &&
|
|
72
|
+
prev.onMaxLockedChange === next.onMaxLockedChange);
|
|
73
|
+
}
|
|
74
|
+
export const ControlSection = memo(ControlSectionInner, areControlSectionPropsEqual);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface DetuneControlProps {
|
|
2
|
+
value: number;
|
|
3
|
+
defaultValue: number;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
onChange: (value: number) => void;
|
|
6
|
+
onToggle: (enabled: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
declare function DetuneControlInner({ value, defaultValue, enabled, onChange, onToggle, }: DetuneControlProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const DetuneControl: import("react").MemoExoticComponent<typeof DetuneControlInner>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useId, useRef, useState } from "react";
|
|
3
|
+
import { presets } from "../audio/utils.js";
|
|
4
|
+
import { SnappableSlider } from "./SnappableSlider.js";
|
|
5
|
+
function DetuneControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
|
|
6
|
+
const preset = presets.cents;
|
|
7
|
+
const min = preset.min ?? -2400;
|
|
8
|
+
const max = preset.max ?? 2400;
|
|
9
|
+
const labelId = useId();
|
|
10
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
11
|
+
const [editText, setEditText] = useState("");
|
|
12
|
+
const inputRef = useRef(null);
|
|
13
|
+
const displayValue = `${Math.round(value)} cents`;
|
|
14
|
+
const handleChange = useCallback((v) => {
|
|
15
|
+
if (!enabled)
|
|
16
|
+
return;
|
|
17
|
+
onChange(v);
|
|
18
|
+
}, [enabled, onChange]);
|
|
19
|
+
const startEditing = useCallback(() => {
|
|
20
|
+
setEditText(String(Math.round(value)));
|
|
21
|
+
setIsEditing(true);
|
|
22
|
+
queueMicrotask(() => inputRef.current?.select());
|
|
23
|
+
}, [value]);
|
|
24
|
+
const commitEdit = useCallback(() => {
|
|
25
|
+
setIsEditing(false);
|
|
26
|
+
const parsed = Number.parseFloat(editText);
|
|
27
|
+
if (Number.isFinite(parsed)) {
|
|
28
|
+
onChange(Math.min(Math.max(parsed, min), max));
|
|
29
|
+
}
|
|
30
|
+
}, [editText, min, max, onChange]);
|
|
31
|
+
const handleEditKeyDown = useCallback((e) => {
|
|
32
|
+
if (e.key === "Enter") {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
commitEdit();
|
|
35
|
+
}
|
|
36
|
+
else if (e.key === "Escape") {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
setIsEditing(false);
|
|
39
|
+
}
|
|
40
|
+
}, [commitEdit]);
|
|
41
|
+
const disabled = !enabled;
|
|
42
|
+
return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "Pitch shift in cents.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Detune" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 1, step: preset.step ?? 1, defaultValue: defaultValue, ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
|
|
43
|
+
}
|
|
44
|
+
export const DetuneControl = memo(DetuneControlInner);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ClipNodeState } from "../audio/types";
|
|
2
|
+
interface DisplayPanelProps {
|
|
3
|
+
nodeState: ClipNodeState;
|
|
4
|
+
statusMessage: string | null;
|
|
5
|
+
soundName: string | null;
|
|
6
|
+
currentTime: string;
|
|
7
|
+
currentFrame: string;
|
|
8
|
+
timesLooped: string;
|
|
9
|
+
latency: string;
|
|
10
|
+
timeTaken: string;
|
|
11
|
+
}
|
|
12
|
+
declare function DisplayPanelInner({ nodeState, statusMessage, soundName, currentTime, currentFrame, timesLooped, latency, timeTaken, }: DisplayPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare const DisplayPanel: import("react").MemoExoticComponent<typeof DisplayPanelInner>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo } from "react";
|
|
3
|
+
function DisplayPanelInner({ nodeState, statusMessage, soundName, currentTime, currentFrame, timesLooped, latency, timeTaken, }) {
|
|
4
|
+
return (_jsxs("section", { id: "display", children: [statusMessage && (_jsx("div", { className: "status-message", role: "alert", children: statusMessage })), _jsx("code", { children: "Sound:" }), _jsx("output", { children: soundName ?? "none" }), _jsx("code", { children: "State:" }), _jsx("output", { children: nodeState }), _jsx("code", { children: "Time:" }), _jsx("output", { children: currentTime }), _jsx("code", { children: "Loops:" }), _jsx("output", { children: timesLooped }), _jsxs("details", { className: "display-details", children: [_jsx("summary", { children: "Debug" }), _jsxs("div", { className: "display-details__row", children: [_jsx("code", { children: "Frame:" }), _jsx("output", { children: currentFrame }), _jsx("code", { children: "Latency:" }), _jsx("output", { children: latency }), _jsx("code", { children: "TimeTaken:" }), _jsx("output", { children: timeTaken })] })] })] }));
|
|
5
|
+
}
|
|
6
|
+
export const DisplayPanel = memo(DisplayPanelInner);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface FilterControlProps {
|
|
2
|
+
label: string;
|
|
3
|
+
controlKey: string;
|
|
4
|
+
value: number;
|
|
5
|
+
defaultValue: number;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
onChange: (value: number) => void;
|
|
8
|
+
onToggle: (enabled: boolean) => void;
|
|
9
|
+
}
|
|
10
|
+
declare function FilterControlInner({ label, controlKey: _controlKey, value, defaultValue, enabled, onChange, onToggle, }: FilterControlProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare const FilterControl: import("react").MemoExoticComponent<typeof FilterControlInner>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useId, useRef, useState } from "react";
|
|
3
|
+
import { presets } from "../audio/utils.js";
|
|
4
|
+
import { SnappableSlider } from "./SnappableSlider.js";
|
|
5
|
+
function formatHz(value) {
|
|
6
|
+
if (value >= 1000)
|
|
7
|
+
return `${(value / 1000).toFixed(1)} kHz`;
|
|
8
|
+
return `${Math.round(value)} Hz`;
|
|
9
|
+
}
|
|
10
|
+
function FilterControlInner({ label, controlKey: _controlKey, value, defaultValue, enabled, onChange, onToggle, }) {
|
|
11
|
+
const preset = presets.hertz;
|
|
12
|
+
const min = preset.min ?? 32;
|
|
13
|
+
const max = preset.max ?? 16384;
|
|
14
|
+
const labelId = useId();
|
|
15
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
16
|
+
const [editText, setEditText] = useState("");
|
|
17
|
+
const inputRef = useRef(null);
|
|
18
|
+
const handleChange = useCallback((v) => {
|
|
19
|
+
if (!enabled)
|
|
20
|
+
return;
|
|
21
|
+
onChange(v);
|
|
22
|
+
}, [enabled, onChange]);
|
|
23
|
+
const startEditing = useCallback(() => {
|
|
24
|
+
setEditText(String(Math.round(value)));
|
|
25
|
+
setIsEditing(true);
|
|
26
|
+
queueMicrotask(() => inputRef.current?.select());
|
|
27
|
+
}, [value]);
|
|
28
|
+
const commitEdit = useCallback(() => {
|
|
29
|
+
setIsEditing(false);
|
|
30
|
+
const parsed = Number.parseFloat(editText);
|
|
31
|
+
if (Number.isFinite(parsed)) {
|
|
32
|
+
onChange(Math.min(Math.max(parsed, min), max));
|
|
33
|
+
}
|
|
34
|
+
}, [editText, min, max, onChange]);
|
|
35
|
+
const handleEditKeyDown = useCallback((e) => {
|
|
36
|
+
if (e.key === "Enter") {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
commitEdit();
|
|
39
|
+
}
|
|
40
|
+
else if (e.key === "Escape") {
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
setIsEditing(false);
|
|
43
|
+
}
|
|
44
|
+
}, [commitEdit]);
|
|
45
|
+
const disabled = !enabled;
|
|
46
|
+
return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: `${label} cutoff frequency.`, children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: label }), _jsx(SnappableSlider, { min: min, max: max, value: value, logarithmic: true, defaultValue: defaultValue, enableSnap: true, snaps: preset.snaps ?? [], ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: formatHz(value), onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: formatHz(value) }))] }));
|
|
47
|
+
}
|
|
48
|
+
export const FilterControl = memo(FilterControlInner);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface GainControlProps {
|
|
2
|
+
value: number;
|
|
3
|
+
defaultValue: number;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
onChange: (value: number) => void;
|
|
6
|
+
onToggle: (enabled: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
declare function GainControlInner({ value, defaultValue, enabled, onChange, onToggle, }: GainControlProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const GainControl: import("react").MemoExoticComponent<typeof GainControlInner>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useId, useRef, useState } from "react";
|
|
3
|
+
import { presets } from "../audio/utils.js";
|
|
4
|
+
import { SnappableSlider } from "./SnappableSlider.js";
|
|
5
|
+
function GainControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
|
|
6
|
+
const preset = presets.gain;
|
|
7
|
+
const min = preset.min ?? -100;
|
|
8
|
+
const max = preset.max ?? 0;
|
|
9
|
+
const labelId = useId();
|
|
10
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
11
|
+
const [editText, setEditText] = useState("");
|
|
12
|
+
const inputRef = useRef(null);
|
|
13
|
+
const displayValue = `${value.toFixed(1)} dB`;
|
|
14
|
+
const handleChange = useCallback((v) => {
|
|
15
|
+
if (!enabled)
|
|
16
|
+
return;
|
|
17
|
+
onChange(v);
|
|
18
|
+
}, [enabled, onChange]);
|
|
19
|
+
const startEditing = useCallback(() => {
|
|
20
|
+
setEditText(String(value));
|
|
21
|
+
setIsEditing(true);
|
|
22
|
+
queueMicrotask(() => inputRef.current?.select());
|
|
23
|
+
}, [value]);
|
|
24
|
+
const commitEdit = useCallback(() => {
|
|
25
|
+
setIsEditing(false);
|
|
26
|
+
const parsed = Number.parseFloat(editText);
|
|
27
|
+
if (Number.isFinite(parsed)) {
|
|
28
|
+
onChange(Math.min(Math.max(parsed, min), max));
|
|
29
|
+
}
|
|
30
|
+
}, [editText, min, max, onChange]);
|
|
31
|
+
const handleEditKeyDown = useCallback((e) => {
|
|
32
|
+
if (e.key === "Enter") {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
commitEdit();
|
|
35
|
+
}
|
|
36
|
+
else if (e.key === "Escape") {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
setIsEditing(false);
|
|
39
|
+
}
|
|
40
|
+
}, [commitEdit]);
|
|
41
|
+
const disabled = !enabled;
|
|
42
|
+
return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "Amplitude in dB.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Gain" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 6, defaultValue: defaultValue, ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
|
|
43
|
+
}
|
|
44
|
+
export const GainControl = memo(GainControlInner);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface PanControlProps {
|
|
2
|
+
value: number;
|
|
3
|
+
defaultValue: number;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
onChange: (value: number) => void;
|
|
6
|
+
onToggle: (enabled: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
declare function PanControlInner({ value, defaultValue, enabled, onChange, onToggle, }: PanControlProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const PanControl: import("react").MemoExoticComponent<typeof PanControlInner>;
|
|
10
|
+
export {};
|
package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useId, useRef, useState } from "react";
|
|
3
|
+
import { presets } from "../audio/utils.js";
|
|
4
|
+
import { SnappableSlider } from "./SnappableSlider.js";
|
|
5
|
+
function formatPan(value) {
|
|
6
|
+
if (Math.abs(value) < 0.005)
|
|
7
|
+
return "C";
|
|
8
|
+
const pct = Math.round(Math.abs(value) * 100);
|
|
9
|
+
return value < 0 ? `L${pct}` : `R${pct}`;
|
|
10
|
+
}
|
|
11
|
+
function PanControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
|
|
12
|
+
const preset = presets.pan;
|
|
13
|
+
const min = preset.min ?? -1;
|
|
14
|
+
const max = preset.max ?? 1;
|
|
15
|
+
const labelId = useId();
|
|
16
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
17
|
+
const [editText, setEditText] = useState("");
|
|
18
|
+
const inputRef = useRef(null);
|
|
19
|
+
const displayValue = formatPan(value);
|
|
20
|
+
const handleChange = useCallback((v) => {
|
|
21
|
+
if (!enabled)
|
|
22
|
+
return;
|
|
23
|
+
onChange(v);
|
|
24
|
+
}, [enabled, onChange]);
|
|
25
|
+
const startEditing = useCallback(() => {
|
|
26
|
+
setEditText(String(value));
|
|
27
|
+
setIsEditing(true);
|
|
28
|
+
queueMicrotask(() => inputRef.current?.select());
|
|
29
|
+
}, [value]);
|
|
30
|
+
const commitEdit = useCallback(() => {
|
|
31
|
+
setIsEditing(false);
|
|
32
|
+
const parsed = Number.parseFloat(editText);
|
|
33
|
+
if (Number.isFinite(parsed)) {
|
|
34
|
+
onChange(Math.min(Math.max(parsed, min), max));
|
|
35
|
+
}
|
|
36
|
+
}, [editText, min, max, onChange]);
|
|
37
|
+
const handleEditKeyDown = useCallback((e) => {
|
|
38
|
+
if (e.key === "Enter") {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
commitEdit();
|
|
41
|
+
}
|
|
42
|
+
else if (e.key === "Escape") {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
setIsEditing(false);
|
|
45
|
+
}
|
|
46
|
+
}, [commitEdit]);
|
|
47
|
+
const disabled = !enabled;
|
|
48
|
+
return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "-1 full left, 1 full right.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Pan" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 1, defaultValue: defaultValue, ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
|
|
49
|
+
}
|
|
50
|
+
export const PanControl = memo(PanControlInner);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface PlaybackRateControlProps {
|
|
2
|
+
value: number;
|
|
3
|
+
defaultValue: number;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
onChange: (value: number) => void;
|
|
6
|
+
onToggle: (enabled: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
declare function PlaybackRateControlInner({ value, defaultValue, enabled, onChange, onToggle, }: PlaybackRateControlProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const PlaybackRateControl: import("react").MemoExoticComponent<typeof PlaybackRateControlInner>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useId, useRef, useState } from "react";
|
|
3
|
+
import { presets } from "../audio/utils.js";
|
|
4
|
+
import { SnappableSlider } from "./SnappableSlider.js";
|
|
5
|
+
function PlaybackRateControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
|
|
6
|
+
const preset = presets.playbackRate;
|
|
7
|
+
const min = preset.min ?? -4;
|
|
8
|
+
const max = preset.max ?? 4;
|
|
9
|
+
const labelId = useId();
|
|
10
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
11
|
+
const [editText, setEditText] = useState("");
|
|
12
|
+
const inputRef = useRef(null);
|
|
13
|
+
const displayValue = `${value.toFixed(2)}x`;
|
|
14
|
+
const handleChange = useCallback((v) => {
|
|
15
|
+
if (!enabled)
|
|
16
|
+
return;
|
|
17
|
+
onChange(v);
|
|
18
|
+
}, [enabled, onChange]);
|
|
19
|
+
const startEditing = useCallback(() => {
|
|
20
|
+
setEditText(String(value));
|
|
21
|
+
setIsEditing(true);
|
|
22
|
+
queueMicrotask(() => inputRef.current?.select());
|
|
23
|
+
}, [value]);
|
|
24
|
+
const commitEdit = useCallback(() => {
|
|
25
|
+
setIsEditing(false);
|
|
26
|
+
const parsed = Number.parseFloat(editText);
|
|
27
|
+
if (Number.isFinite(parsed)) {
|
|
28
|
+
onChange(Math.min(Math.max(parsed, min), max));
|
|
29
|
+
}
|
|
30
|
+
}, [editText, min, max, onChange]);
|
|
31
|
+
const handleEditKeyDown = useCallback((e) => {
|
|
32
|
+
if (e.key === "Enter") {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
commitEdit();
|
|
35
|
+
}
|
|
36
|
+
else if (e.key === "Escape") {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
setIsEditing(false);
|
|
39
|
+
}
|
|
40
|
+
}, [commitEdit]);
|
|
41
|
+
const disabled = !enabled;
|
|
42
|
+
return (_jsxs("div", { className: `audio-control${disabled ? " audio-control--disabled" : ""}`, title: "Playback speed. Negative for reverse.", children: [_jsx("input", { type: "checkbox", className: "control-toggle", checked: enabled, onChange: (e) => onToggle(e.target.checked) }), _jsx("span", { className: "control-label", id: labelId, children: "Rate" }), _jsx(SnappableSlider, { min: min, max: max, value: value, skew: preset.skew ?? 1, defaultValue: defaultValue, enableSnap: true, snaps: preset.snaps ?? [], ticks: preset.ticks ?? [], disabled: disabled, labelId: labelId, valueText: displayValue, onChange: handleChange }), isEditing ? (_jsx("input", { ref: inputRef, type: "text", className: "control-output control-output--editing", value: editText, onChange: (e) => setEditText(e.target.value), onBlur: commitEdit, onKeyDown: handleEditKeyDown })) : (_jsx("button", { type: "button", className: "control-output", onClick: startEditing, children: displayValue }))] }));
|
|
43
|
+
}
|
|
44
|
+
export const PlaybackRateControl = memo(PlaybackRateControlInner);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface PlayheadSliderProps {
|
|
2
|
+
/** Current playhead position in samples. */
|
|
3
|
+
value: number;
|
|
4
|
+
/** Audio duration in seconds (null when no audio loaded). */
|
|
5
|
+
audioDuration: number | null;
|
|
6
|
+
/** Whether playback is active (started/paused). */
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Called when the user seeks to a new position (value in samples). */
|
|
9
|
+
onChange: (samplePosition: number) => void;
|
|
10
|
+
}
|
|
11
|
+
declare function PlayheadSliderInner({ value, audioDuration, disabled, onChange, }: PlayheadSliderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare const PlayheadSlider: import("react").MemoExoticComponent<typeof PlayheadSliderInner>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useId } from "react";
|
|
3
|
+
import { SAMPLE_RATE } from "../controls/controlDefs.js";
|
|
4
|
+
import { SnappableSlider } from "./SnappableSlider.js";
|
|
5
|
+
function formatTime(seconds) {
|
|
6
|
+
const m = Math.floor(seconds / 60);
|
|
7
|
+
const s = seconds % 60;
|
|
8
|
+
return `${m}:${s.toFixed(2).padStart(5, "0")}`;
|
|
9
|
+
}
|
|
10
|
+
function PlayheadSliderInner({ value, audioDuration, disabled = false, onChange, }) {
|
|
11
|
+
const labelId = useId();
|
|
12
|
+
const maxSamples = audioDuration != null ? audioDuration * SAMPLE_RATE : 0;
|
|
13
|
+
const currentSeconds = value / SAMPLE_RATE;
|
|
14
|
+
const durationSeconds = audioDuration ?? 0;
|
|
15
|
+
const handleChange = useCallback((v) => {
|
|
16
|
+
onChange(Math.floor(v));
|
|
17
|
+
}, [onChange]);
|
|
18
|
+
return (_jsxs("div", { className: "playhead-slider", children: [_jsx("span", { className: "playhead-label", id: labelId, children: "Playhead" }), _jsx(SnappableSlider, { min: 0, max: maxSamples, value: value, disabled: disabled || maxSamples === 0, labelId: labelId, valueText: formatTime(currentSeconds), onChange: handleChange }), _jsxs("span", { className: "playhead-time", children: [formatTime(currentSeconds), " / ", formatTime(durationSeconds)] })] }));
|
|
19
|
+
}
|
|
20
|
+
export const PlayheadSlider = memo(PlayheadSliderInner);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SnappableSliderProps {
|
|
2
|
+
min: number;
|
|
3
|
+
max: number;
|
|
4
|
+
value: number;
|
|
5
|
+
skew?: number;
|
|
6
|
+
step?: number;
|
|
7
|
+
defaultValue?: number;
|
|
8
|
+
enableSnap?: boolean;
|
|
9
|
+
snaps?: number[];
|
|
10
|
+
ticks?: number[];
|
|
11
|
+
logarithmic?: boolean;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
labelId?: string;
|
|
14
|
+
valueText?: string;
|
|
15
|
+
formatTick?: (value: number) => string;
|
|
16
|
+
onChange?: (value: number) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function SnappableSlider({ min, max, value, skew, step, defaultValue, enableSnap, snaps, ticks, logarithmic, disabled, labelId, valueText, formatTick, onChange, }: SnappableSliderProps): import("react/jsx-runtime").JSX.Element;
|