@codexo/exojs 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +265 -6
- package/README.md +82 -67
- package/dist/esm/animation/Tween.d.ts.map +1 -1
- package/dist/esm/animation/Tween.js +1 -2
- package/dist/esm/animation/Tween.js.map +1 -1
- package/dist/esm/animation/TweenManager.d.ts +50 -7
- package/dist/esm/animation/TweenManager.d.ts.map +1 -1
- package/dist/esm/animation/TweenManager.js +68 -10
- package/dist/esm/animation/TweenManager.js.map +1 -1
- package/dist/esm/animation/TweenSequencer.d.ts +139 -0
- package/dist/esm/animation/TweenSequencer.d.ts.map +1 -0
- package/dist/esm/animation/TweenSequencer.js +305 -0
- package/dist/esm/animation/TweenSequencer.js.map +1 -0
- package/dist/esm/animation/index.d.ts +7 -4
- package/dist/esm/animation/index.d.ts.map +1 -1
- package/dist/esm/audio/AudioBus.d.ts +12 -12
- package/dist/esm/audio/AudioBus.js +29 -29
- package/dist/esm/audio/AudioEffect.d.ts +18 -0
- package/dist/esm/audio/AudioEffect.d.ts.map +1 -0
- package/dist/esm/audio/AudioEffect.js +16 -0
- package/dist/esm/audio/AudioEffect.js.map +1 -0
- package/dist/esm/audio/AudioGenerator.d.ts +91 -0
- package/dist/esm/audio/AudioGenerator.d.ts.map +1 -0
- package/dist/esm/audio/AudioGenerator.js +165 -0
- package/dist/esm/audio/AudioGenerator.js.map +1 -0
- package/dist/esm/audio/AudioGeneratorVoice.d.ts +52 -0
- package/dist/esm/audio/AudioGeneratorVoice.d.ts.map +1 -0
- package/dist/esm/audio/AudioGeneratorVoice.js +141 -0
- package/dist/esm/audio/AudioGeneratorVoice.js.map +1 -0
- package/dist/esm/audio/AudioInput.d.ts +39 -0
- package/dist/esm/audio/AudioInput.d.ts.map +1 -0
- package/dist/esm/audio/AudioInput.js +53 -0
- package/dist/esm/audio/AudioInput.js.map +1 -0
- package/dist/esm/audio/AudioManager.d.ts +72 -34
- package/dist/esm/audio/AudioManager.d.ts.map +1 -1
- package/dist/esm/audio/AudioManager.js +97 -51
- package/dist/esm/audio/AudioManager.js.map +1 -1
- package/dist/esm/audio/AudioStream.d.ts +49 -0
- package/dist/esm/audio/AudioStream.d.ts.map +1 -0
- package/dist/esm/audio/AudioStream.js +109 -0
- package/dist/esm/audio/AudioStream.js.map +1 -0
- package/dist/esm/audio/AudioStreamVoice.d.ts +61 -0
- package/dist/esm/audio/AudioStreamVoice.d.ts.map +1 -0
- package/dist/esm/audio/AudioStreamVoice.js +137 -0
- package/dist/esm/audio/AudioStreamVoice.js.map +1 -0
- package/dist/esm/audio/BaseVoice.d.ts +111 -0
- package/dist/esm/audio/BaseVoice.d.ts.map +1 -0
- package/dist/esm/audio/BaseVoice.js +298 -0
- package/dist/esm/audio/BaseVoice.js.map +1 -0
- package/dist/esm/audio/BiquadEffect.d.ts +53 -0
- package/dist/esm/audio/BiquadEffect.d.ts.map +1 -0
- package/dist/esm/audio/BiquadEffect.js +110 -0
- package/dist/esm/audio/BiquadEffect.js.map +1 -0
- package/dist/esm/audio/InputVoice.d.ts +41 -0
- package/dist/esm/audio/InputVoice.d.ts.map +1 -0
- package/dist/esm/audio/InputVoice.js +85 -0
- package/dist/esm/audio/InputVoice.js.map +1 -0
- package/dist/esm/audio/NoopVoice.d.ts +29 -0
- package/dist/esm/audio/NoopVoice.d.ts.map +1 -0
- package/dist/esm/audio/NoopVoice.js +52 -0
- package/dist/esm/audio/NoopVoice.js.map +1 -0
- package/dist/esm/audio/Playable.d.ts +135 -0
- package/dist/esm/audio/Playable.d.ts.map +1 -0
- package/dist/esm/audio/Sound.d.ts +64 -69
- package/dist/esm/audio/Sound.d.ts.map +1 -1
- package/dist/esm/audio/Sound.js +176 -377
- package/dist/esm/audio/Sound.js.map +1 -1
- package/dist/esm/audio/SoundVoice.d.ts +63 -0
- package/dist/esm/audio/SoundVoice.d.ts.map +1 -0
- package/dist/esm/audio/SoundVoice.js +168 -0
- package/dist/esm/audio/SoundVoice.js.map +1 -0
- package/dist/esm/audio/WorkletEffect.d.ts +68 -0
- package/dist/esm/audio/WorkletEffect.d.ts.map +1 -0
- package/dist/esm/audio/WorkletEffect.js +177 -0
- package/dist/esm/audio/WorkletEffect.js.map +1 -0
- package/dist/esm/audio/audio-context.js +1 -1
- package/dist/esm/audio/audio-context.js.map +1 -1
- package/dist/esm/audio/crossFade.d.ts +22 -13
- package/dist/esm/audio/crossFade.d.ts.map +1 -1
- package/dist/esm/audio/crossFade.js +21 -13
- package/dist/esm/audio/crossFade.js.map +1 -1
- package/dist/esm/audio/filters/HighpassFilter.d.ts +2 -2
- package/dist/esm/audio/filters/HighpassFilter.js +2 -2
- package/dist/esm/audio/filters/LowpassFilter.d.ts +2 -2
- package/dist/esm/audio/filters/LowpassFilter.js +2 -2
- package/dist/esm/audio/filters/index.d.ts +0 -10
- package/dist/esm/audio/filters/index.d.ts.map +1 -1
- package/dist/esm/audio/index.d.ts +13 -15
- package/dist/esm/audio/index.d.ts.map +1 -1
- package/dist/esm/core/Application.d.ts +169 -14
- package/dist/esm/core/Application.d.ts.map +1 -1
- package/dist/esm/core/Application.js +306 -31
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/BuildInfo.js +2 -2
- package/dist/esm/core/Codec.d.ts +41 -0
- package/dist/esm/core/Codec.d.ts.map +1 -0
- package/dist/esm/core/Codec.js +79 -0
- package/dist/esm/core/Codec.js.map +1 -0
- package/dist/esm/core/Color.d.ts +6 -4
- package/dist/esm/core/Color.d.ts.map +1 -1
- package/dist/esm/core/Color.js +19 -15
- package/dist/esm/core/Color.js.map +1 -1
- package/dist/esm/core/DisposalScope.d.ts +50 -0
- package/dist/esm/core/DisposalScope.d.ts.map +1 -0
- package/dist/esm/core/DisposalScope.js +86 -0
- package/dist/esm/core/DisposalScope.js.map +1 -0
- package/dist/esm/core/FixedTimestep.d.ts +28 -0
- package/dist/esm/core/FixedTimestep.d.ts.map +1 -0
- package/dist/esm/core/FixedTimestep.js +62 -0
- package/dist/esm/core/FixedTimestep.js.map +1 -0
- package/dist/esm/core/Perf.d.ts +10 -22
- package/dist/esm/core/Perf.d.ts.map +1 -1
- package/dist/esm/core/Perf.js +15 -8
- package/dist/esm/core/Perf.js.map +1 -1
- package/dist/esm/core/Registry.d.ts +64 -0
- package/dist/esm/core/Registry.d.ts.map +1 -0
- package/dist/esm/core/Registry.js +79 -0
- package/dist/esm/core/Registry.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +83 -21
- package/dist/esm/core/Scene.d.ts.map +1 -1
- package/dist/esm/core/Scene.js +127 -16
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.d.ts +28 -59
- package/dist/esm/core/SceneManager.d.ts.map +1 -1
- package/dist/esm/core/SceneManager.js +86 -155
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +78 -7
- package/dist/esm/core/SceneNode.d.ts.map +1 -1
- package/dist/esm/core/SceneNode.js +162 -21
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Signal.js.map +1 -1
- package/dist/esm/core/Stage.d.ts +49 -0
- package/dist/esm/core/Stage.d.ts.map +1 -0
- package/dist/esm/core/System.d.ts +22 -0
- package/dist/esm/core/System.d.ts.map +1 -0
- package/dist/esm/core/SystemRegistry.d.ts +40 -0
- package/dist/esm/core/SystemRegistry.d.ts.map +1 -0
- package/dist/esm/core/SystemRegistry.js +114 -0
- package/dist/esm/core/SystemRegistry.js.map +1 -0
- package/dist/esm/core/Time.d.ts +15 -0
- package/dist/esm/core/Time.d.ts.map +1 -1
- package/dist/esm/core/Time.js +25 -0
- package/dist/esm/core/Time.js.map +1 -1
- package/dist/esm/core/dev.d.ts +9 -4
- package/dist/esm/core/dev.d.ts.map +1 -1
- package/dist/esm/core/dev.js +5 -0
- package/dist/esm/core/dev.js.map +1 -1
- package/dist/esm/core/index.d.ts +30 -15
- package/dist/esm/core/index.d.ts.map +1 -1
- package/dist/esm/core/letterbox.d.ts +25 -0
- package/dist/esm/core/letterbox.d.ts.map +1 -0
- package/dist/esm/core/letterbox.js +26 -0
- package/dist/esm/core/letterbox.js.map +1 -0
- package/dist/esm/core/logging.d.ts +34 -0
- package/dist/esm/core/logging.d.ts.map +1 -0
- package/dist/esm/core/logging.js +59 -0
- package/dist/esm/core/logging.js.map +1 -0
- package/dist/esm/core/serialization/NodeSerializer.d.ts +71 -0
- package/dist/esm/core/serialization/NodeSerializer.d.ts.map +1 -0
- package/dist/esm/core/serialization/Prefab.d.ts +49 -0
- package/dist/esm/core/serialization/Prefab.d.ts.map +1 -0
- package/dist/esm/core/serialization/Prefab.js +61 -0
- package/dist/esm/core/serialization/Prefab.js.map +1 -0
- package/dist/esm/core/serialization/SerializationRegistry.d.ts +95 -0
- package/dist/esm/core/serialization/SerializationRegistry.d.ts.map +1 -0
- package/dist/esm/core/serialization/SerializationRegistry.js +108 -0
- package/dist/esm/core/serialization/SerializationRegistry.js.map +1 -0
- package/dist/esm/core/serialization/commonFields.d.ts +20 -0
- package/dist/esm/core/serialization/commonFields.d.ts.map +1 -0
- package/dist/esm/core/serialization/commonFields.js +155 -0
- package/dist/esm/core/serialization/commonFields.js.map +1 -0
- package/dist/esm/core/serialization/coreSerializers.d.ts +9 -0
- package/dist/esm/core/serialization/coreSerializers.d.ts.map +1 -0
- package/dist/esm/core/serialization/coreSerializers.js +101 -0
- package/dist/esm/core/serialization/coreSerializers.js.map +1 -0
- package/dist/esm/core/serialization/index.d.ts +6 -0
- package/dist/esm/core/serialization/index.d.ts.map +1 -0
- package/dist/esm/core/serialization/read.d.ts +65 -0
- package/dist/esm/core/serialization/read.d.ts.map +1 -0
- package/dist/esm/core/serialization/read.js +48 -0
- package/dist/esm/core/serialization/read.js.map +1 -0
- package/dist/esm/core/serialization/renderingSerializers.d.ts +7 -0
- package/dist/esm/core/serialization/renderingSerializers.d.ts.map +1 -0
- package/dist/esm/core/serialization/renderingSerializers.js +320 -0
- package/dist/esm/core/serialization/renderingSerializers.js.map +1 -0
- package/dist/esm/core/serialization/serialize.d.ts +56 -0
- package/dist/esm/core/serialization/serialize.d.ts.map +1 -0
- package/dist/esm/core/serialization/serialize.js +144 -0
- package/dist/esm/core/serialization/serialize.js.map +1 -0
- package/dist/esm/core/serialization/serializerHelpers.d.ts +46 -0
- package/dist/esm/core/serialization/serializerHelpers.d.ts.map +1 -0
- package/dist/esm/core/serialization/serializerHelpers.js +161 -0
- package/dist/esm/core/serialization/serializerHelpers.js.map +1 -0
- package/dist/esm/core/serialization/types.d.ts +49 -0
- package/dist/esm/core/serialization/types.d.ts.map +1 -0
- package/dist/esm/core/serialization/types.js +9 -0
- package/dist/esm/core/serialization/types.js.map +1 -0
- package/dist/esm/core/serialization/uiSerializers.d.ts +7 -0
- package/dist/esm/core/serialization/uiSerializers.d.ts.map +1 -0
- package/dist/esm/core/serialization/uiSerializers.js +206 -0
- package/dist/esm/core/serialization/uiSerializers.js.map +1 -0
- package/dist/esm/core/types.d.ts +1 -1
- package/dist/esm/core/types.d.ts.map +1 -1
- package/dist/esm/core/utils.d.ts +1 -16
- package/dist/esm/core/utils.d.ts.map +1 -1
- package/dist/esm/core/utils.js +2 -100
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/debug/PerformanceLayer.js +8 -9
- package/dist/esm/debug/PerformanceLayer.js.map +1 -1
- package/dist/esm/debug/PointerStackLayer.d.ts.map +1 -1
- package/dist/esm/debug/PointerStackLayer.js +9 -6
- package/dist/esm/debug/PointerStackLayer.js.map +1 -1
- package/dist/esm/debug/RenderPassInspectorLayer.d.ts.map +1 -1
- package/dist/esm/debug/RenderPassInspectorLayer.js +19 -12
- package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
- package/dist/esm/extensions/Extension.d.ts +39 -4
- package/dist/esm/extensions/Extension.d.ts.map +1 -1
- package/dist/esm/extensions/materialize.d.ts +9 -1
- package/dist/esm/extensions/materialize.d.ts.map +1 -1
- package/dist/esm/extensions/materialize.js +17 -2
- package/dist/esm/extensions/materialize.js.map +1 -1
- package/dist/esm/extensions/snapshot.d.ts +2 -1
- package/dist/esm/extensions/snapshot.d.ts.map +1 -1
- package/dist/esm/extensions/snapshot.js +8 -0
- package/dist/esm/extensions/snapshot.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +41 -61
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/FocusManager.d.ts +59 -0
- package/dist/esm/input/FocusManager.d.ts.map +1 -0
- package/dist/esm/input/FocusManager.js +175 -0
- package/dist/esm/input/FocusManager.js.map +1 -0
- package/dist/esm/input/Gamepad.d.ts +10 -0
- package/dist/esm/input/Gamepad.d.ts.map +1 -1
- package/dist/esm/input/Gamepad.js +20 -4
- package/dist/esm/input/Gamepad.js.map +1 -1
- package/dist/esm/input/GamepadAxis.js +2 -2
- package/dist/esm/input/GamepadDefinitions.d.ts.map +1 -1
- package/dist/esm/input/GamepadDefinitions.js +6 -2
- package/dist/esm/input/GamepadDefinitions.js.map +1 -1
- package/dist/esm/input/GestureRecognizer.d.ts +1 -2
- package/dist/esm/input/GestureRecognizer.d.ts.map +1 -1
- package/dist/esm/input/GestureRecognizer.js +1 -3
- package/dist/esm/input/GestureRecognizer.js.map +1 -1
- package/dist/esm/input/InputBinding.js +3 -3
- package/dist/esm/input/InputBinding.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts +7 -2
- package/dist/esm/input/InputManager.d.ts.map +1 -1
- package/dist/esm/input/InputManager.js +40 -21
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionManager.d.ts +67 -2
- package/dist/esm/input/InteractionManager.d.ts.map +1 -1
- package/dist/esm/input/InteractionManager.js +165 -41
- package/dist/esm/input/InteractionManager.js.map +1 -1
- package/dist/esm/input/KeyEvent.d.ts +25 -0
- package/dist/esm/input/KeyEvent.d.ts.map +1 -0
- package/dist/esm/input/KeyEvent.js +32 -0
- package/dist/esm/input/KeyEvent.js.map +1 -0
- package/dist/esm/input/Pointer.d.ts +21 -4
- package/dist/esm/input/Pointer.d.ts.map +1 -1
- package/dist/esm/input/Pointer.js +54 -15
- package/dist/esm/input/Pointer.js.map +1 -1
- package/dist/esm/input/index.d.ts +3 -1
- package/dist/esm/input/index.d.ts.map +1 -1
- package/dist/esm/math/AbstractVector.d.ts.map +1 -1
- package/dist/esm/math/AbstractVector.js +7 -2
- package/dist/esm/math/AbstractVector.js.map +1 -1
- package/dist/esm/math/Circle.d.ts.map +1 -1
- package/dist/esm/math/Circle.js +5 -1
- package/dist/esm/math/Circle.js.map +1 -1
- package/dist/esm/math/Line.d.ts +1 -1
- package/dist/esm/math/Line.d.ts.map +1 -1
- package/dist/esm/math/Line.js +1 -1
- package/dist/esm/math/Line.js.map +1 -1
- package/dist/esm/math/Matrix.d.ts.map +1 -1
- package/dist/esm/math/Matrix.js +6 -1
- package/dist/esm/math/Matrix.js.map +1 -1
- package/dist/esm/math/ObservableVector.d.ts +26 -8
- package/dist/esm/math/ObservableVector.d.ts.map +1 -1
- package/dist/esm/math/ObservableVector.js +24 -16
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts +5 -0
- package/dist/esm/math/Polygon.d.ts.map +1 -1
- package/dist/esm/math/Polygon.js +27 -3
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/Random.d.ts +9 -9
- package/dist/esm/math/Random.d.ts.map +1 -1
- package/dist/esm/math/Random.js +46 -46
- package/dist/esm/math/Random.js.map +1 -1
- package/dist/esm/math/Rectangle.d.ts +11 -4
- package/dist/esm/math/Rectangle.d.ts.map +1 -1
- package/dist/esm/math/Rectangle.js +12 -6
- package/dist/esm/math/Rectangle.js.map +1 -1
- package/dist/esm/math/Vector.d.ts +1 -1
- package/dist/esm/math/Vector.d.ts.map +1 -1
- package/dist/esm/math/Vector.js +1 -1
- package/dist/esm/math/Vector.js.map +1 -1
- package/dist/esm/math/collision-detection.d.ts +42 -0
- package/dist/esm/math/collision-detection.d.ts.map +1 -1
- package/dist/esm/math/collision-detection.js +54 -4
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/collision-primitives.d.ts.map +1 -1
- package/dist/esm/math/collision-primitives.js +4 -0
- package/dist/esm/math/collision-primitives.js.map +1 -1
- package/dist/esm/math/geometry.d.ts +26 -0
- package/dist/esm/math/geometry.d.ts.map +1 -1
- package/dist/esm/math/geometry.js +89 -2
- package/dist/esm/math/geometry.js.map +1 -1
- package/dist/esm/math/index.d.ts +7 -5
- package/dist/esm/math/index.d.ts.map +1 -1
- package/dist/esm/math/swept-collision.d.ts +13 -0
- package/dist/esm/math/swept-collision.d.ts.map +1 -1
- package/dist/esm/math/swept-collision.js +15 -1
- package/dist/esm/math/swept-collision.js.map +1 -1
- package/dist/esm/math/triangulate.d.ts.map +1 -1
- package/dist/esm/math/triangulate.js +9 -1
- package/dist/esm/math/triangulate.js.map +1 -1
- package/dist/esm/math/utils.d.ts +20 -0
- package/dist/esm/math/utils.d.ts.map +1 -1
- package/dist/esm/math/utils.js +18 -15
- package/dist/esm/math/utils.js.map +1 -1
- package/dist/esm/renderer-sdk.d.ts +2 -0
- package/dist/esm/renderer-sdk.d.ts.map +1 -1
- package/dist/esm/{rendering.js → renderer-sdk.js} +1 -1
- package/dist/esm/renderer-sdk.js.map +1 -0
- package/dist/esm/rendering/BackendTargetPass.d.ts +1 -1
- package/dist/esm/rendering/BackendTargetPass.d.ts.map +1 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +14 -10
- package/dist/esm/rendering/CallbackRenderPass.d.ts.map +1 -1
- package/dist/esm/rendering/CallbackRenderPass.js +17 -12
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Container.d.ts +3 -0
- package/dist/esm/rendering/Container.d.ts.map +1 -1
- package/dist/esm/rendering/Container.js +28 -5
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/DrawContext.d.ts +48 -0
- package/dist/esm/rendering/DrawContext.d.ts.map +1 -0
- package/dist/esm/rendering/Drawable.d.ts +24 -0
- package/dist/esm/rendering/Drawable.d.ts.map +1 -1
- package/dist/esm/rendering/Drawable.js +54 -0
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/GpuResourceAccountant.d.ts +65 -0
- package/dist/esm/rendering/GpuResourceAccountant.d.ts.map +1 -0
- package/dist/esm/rendering/GpuResourceAccountant.js +130 -0
- package/dist/esm/rendering/GpuResourceAccountant.js.map +1 -0
- package/dist/esm/rendering/PassContext.d.ts +42 -0
- package/dist/esm/rendering/PassContext.d.ts.map +1 -0
- package/dist/esm/rendering/PassContext.js +48 -0
- package/dist/esm/rendering/PassContext.js.map +1 -0
- package/dist/esm/rendering/RenderBackend.d.ts +29 -1
- package/dist/esm/rendering/RenderBackend.d.ts.map +1 -1
- package/dist/esm/rendering/RenderBatch.d.ts +55 -0
- package/dist/esm/rendering/RenderBatch.d.ts.map +1 -0
- package/dist/esm/rendering/RenderBatch.js +107 -0
- package/dist/esm/rendering/RenderBatch.js.map +1 -0
- package/dist/esm/rendering/RenderNode.d.ts +50 -10
- package/dist/esm/rendering/RenderNode.d.ts.map +1 -1
- package/dist/esm/rendering/RenderNode.js +115 -22
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderNodePass.d.ts +1 -1
- package/dist/esm/rendering/RenderNodePass.d.ts.map +1 -1
- package/dist/esm/rendering/RenderNodePass.js +2 -2
- package/dist/esm/rendering/RenderNodePass.js.map +1 -1
- package/dist/esm/rendering/RenderStats.d.ts +39 -0
- package/dist/esm/rendering/RenderStats.d.ts.map +1 -1
- package/dist/esm/rendering/RenderStats.js +14 -0
- package/dist/esm/rendering/RenderStats.js.map +1 -1
- package/dist/esm/rendering/RendererRegistry.d.ts.map +1 -1
- package/dist/esm/rendering/RendererRegistry.js +20 -23
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +132 -17
- package/dist/esm/rendering/RenderingContext.d.ts.map +1 -1
- package/dist/esm/rendering/RenderingContext.js +228 -28
- package/dist/esm/rendering/RenderingContext.js.map +1 -1
- package/dist/esm/rendering/TransformBuffer.d.ts +23 -0
- package/dist/esm/rendering/TransformBuffer.d.ts.map +1 -1
- package/dist/esm/rendering/TransformBuffer.js +60 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -1
- package/dist/esm/rendering/View.d.ts +85 -15
- package/dist/esm/rendering/View.d.ts.map +1 -1
- package/dist/esm/rendering/View.js +81 -27
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts.map +1 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +10 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.d.ts.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.js +4 -2
- package/dist/esm/rendering/geometry/Geometry.js.map +1 -1
- package/dist/esm/rendering/gradient/Gradient.d.ts.map +1 -1
- package/dist/esm/rendering/gradient/Gradient.js +7 -2
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -1
- package/dist/esm/rendering/material/MaterialKey.d.ts.map +1 -1
- package/dist/esm/rendering/material/MaterialKey.js +2 -0
- package/dist/esm/rendering/material/MaterialKey.js.map +1 -1
- package/dist/esm/rendering/material/MeshMaterial.d.ts +20 -1
- package/dist/esm/rendering/material/MeshMaterial.d.ts.map +1 -1
- package/dist/esm/rendering/material/MeshMaterial.js +17 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -1
- package/dist/esm/rendering/material/ShaderSource.js +6 -0
- package/dist/esm/rendering/material/ShaderSource.js.map +1 -1
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +20 -1
- package/dist/esm/rendering/material/SpriteMaterial.d.ts.map +1 -1
- package/dist/esm/rendering/material/SpriteMaterial.js +17 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -1
- package/dist/esm/rendering/mesh/ImmediateMesh.d.ts +48 -0
- package/dist/esm/rendering/mesh/ImmediateMesh.d.ts.map +1 -0
- package/dist/esm/rendering/mesh/ImmediateMesh.js +85 -0
- package/dist/esm/rendering/mesh/ImmediateMesh.js.map +1 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +29 -6
- package/dist/esm/rendering/mesh/Mesh.d.ts.map +1 -1
- package/dist/esm/rendering/mesh/Mesh.js +40 -13
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/pixelSnap.d.ts.map +1 -1
- package/dist/esm/rendering/pixelSnap.js +1 -0
- package/dist/esm/rendering/pixelSnap.js.map +1 -1
- package/dist/esm/rendering/plan/RenderCommand.d.ts +31 -9
- package/dist/esm/rendering/plan/RenderCommand.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderCommand.js +23 -21
- package/dist/esm/rendering/plan/RenderCommand.js.map +1 -1
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +8 -2
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -1
- package/dist/esm/rendering/plan/RenderInstruction.d.ts +12 -39
- package/dist/esm/rendering/plan/RenderInstruction.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +17 -2
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +154 -50
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js +31 -4
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +54 -17
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -1
- package/dist/esm/rendering/plan/RenderScope.d.ts +23 -10
- package/dist/esm/rendering/plan/RenderScope.d.ts.map +1 -1
- package/dist/esm/rendering/primitives/Graphics.d.ts +16 -1
- package/dist/esm/rendering/primitives/Graphics.d.ts.map +1 -1
- package/dist/esm/rendering/primitives/Graphics.js +46 -9
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/{index.d.ts → public.d.ts} +9 -39
- package/dist/esm/rendering/public.d.ts.map +1 -0
- package/dist/esm/rendering/shader/ShaderAttribute.d.ts.map +1 -1
- package/dist/esm/rendering/shader/ShaderAttribute.js +2 -0
- package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
- package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +60 -12
- package/dist/esm/rendering/sprite/AnimatedSprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/AnimatedSprite.js +142 -30
- package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
- package/dist/esm/rendering/sprite/NineSliceSprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/NineSliceSprite.js +10 -11
- package/dist/esm/rendering/sprite/NineSliceSprite.js.map +1 -1
- package/dist/esm/rendering/sprite/RepeatingSprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/RepeatingSprite.js +1 -3
- package/dist/esm/rendering/sprite/RepeatingSprite.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.js +30 -3
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/nineSlice.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/nineSlice.js +12 -18
- package/dist/esm/rendering/sprite/nineSlice.js.map +1 -1
- package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/repeatingSpritePlan.js +2 -2
- package/dist/esm/rendering/sprite/repeatingSpritePlan.js.map +1 -1
- package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
- package/dist/esm/rendering/text/BitmapText.d.ts.map +1 -1
- package/dist/esm/rendering/text/BitmapText.js +6 -0
- package/dist/esm/rendering/text/BitmapText.js.map +1 -1
- package/dist/esm/rendering/text/GlyphAtlas.d.ts.map +1 -1
- package/dist/esm/rendering/text/GlyphAtlas.js +2 -1
- package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -1
- package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +8 -1
- package/dist/esm/rendering/text/GlyphAtlasPool.d.ts.map +1 -1
- package/dist/esm/rendering/text/GlyphAtlasPool.js +9 -12
- package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -1
- package/dist/esm/rendering/text/GlyphSdf.d.ts.map +1 -1
- package/dist/esm/rendering/text/GlyphSdf.js +5 -1
- package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
- package/dist/esm/rendering/text/HTMLText.d.ts.map +1 -1
- package/dist/esm/rendering/text/HTMLText.js +3 -2
- package/dist/esm/rendering/text/HTMLText.js.map +1 -1
- package/dist/esm/rendering/text/Text.d.ts +17 -6
- package/dist/esm/rendering/text/Text.d.ts.map +1 -1
- package/dist/esm/rendering/text/Text.js +9 -12
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/text/TextLayout.d.ts.map +1 -1
- package/dist/esm/rendering/text/TextLayout.js +4 -18
- package/dist/esm/rendering/text/TextLayout.js.map +1 -1
- package/dist/esm/rendering/texture/DataTexture.js +2 -2
- package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
- package/dist/esm/rendering/texture/Texture.d.ts +6 -0
- package/dist/esm/rendering/texture/Texture.d.ts.map +1 -1
- package/dist/esm/rendering/texture/Texture.js +8 -0
- package/dist/esm/rendering/texture/Texture.js.map +1 -1
- package/dist/esm/rendering/texture/TextureRegion.d.ts.map +1 -1
- package/dist/esm/rendering/texture/TextureRegion.js.map +1 -1
- package/dist/esm/rendering/texture/repeat.d.ts.map +1 -1
- package/dist/esm/rendering/texture/repeat.js +2 -2
- package/dist/esm/rendering/texture/repeat.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +37 -2
- package/dist/esm/rendering/types.d.ts.map +1 -1
- package/dist/esm/rendering/types.js +37 -2
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +7 -3
- package/dist/esm/rendering/video/Video.d.ts.map +1 -1
- package/dist/esm/rendering/video/Video.js +7 -3
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +2 -2
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.d.ts +41 -0
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.d.ts.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.js +222 -0
- package/dist/esm/rendering/webgl2/WebGl2BackdropBlendCompositor.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +55 -3
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +209 -61
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +2 -2
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +17 -0
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +122 -38
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js +2 -1
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +16 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +32 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js +15 -11
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js +14 -3
- package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +3 -3
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js +11 -2
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +7 -2
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +3 -2
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +60 -15
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/backdrop-blend.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text.vert.js +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.d.ts +72 -0
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.d.ts.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.js +494 -0
- package/dist/esm/rendering/webgpu/WebGpuBackdropBlendCompositor.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +45 -2
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +247 -69
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBlendState.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js +5 -26
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +2 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +17 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +105 -25
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js +8 -2
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +8 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +20 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts +6 -0
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js +23 -10
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +10 -5
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +3 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +2 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +22 -9
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -3
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +50 -6
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
- package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +1 -1
- package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -1
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts +7 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +8 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -1
- package/dist/esm/resources/Asset.d.ts +1 -1
- package/dist/esm/resources/Asset.d.ts.map +1 -1
- package/dist/esm/resources/Asset.js +0 -2
- package/dist/esm/resources/Asset.js.map +1 -1
- package/dist/esm/resources/AssetContainer.d.ts +75 -0
- package/dist/esm/resources/AssetContainer.d.ts.map +1 -0
- package/dist/esm/resources/AssetContainer.js +100 -0
- package/dist/esm/resources/AssetContainer.js.map +1 -0
- package/dist/esm/resources/AssetDefinitions.d.ts +3 -3
- package/dist/esm/resources/AssetDefinitions.d.ts.map +1 -1
- package/dist/esm/resources/Assets.d.ts.map +1 -1
- package/dist/esm/resources/Assets.js +0 -1
- package/dist/esm/resources/Assets.js.map +1 -1
- package/dist/esm/resources/FactoryRegistry.d.ts.map +1 -1
- package/dist/esm/resources/FactoryRegistry.js +14 -23
- package/dist/esm/resources/FactoryRegistry.js.map +1 -1
- package/dist/esm/resources/IndexedDbDatabase.d.ts.map +1 -1
- package/dist/esm/resources/IndexedDbDatabase.js +8 -1
- package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
- package/dist/esm/resources/IndexedDbKeyValueStore.d.ts +37 -0
- package/dist/esm/resources/IndexedDbKeyValueStore.d.ts.map +1 -0
- package/dist/esm/resources/IndexedDbKeyValueStore.js +58 -0
- package/dist/esm/resources/IndexedDbKeyValueStore.js.map +1 -0
- package/dist/esm/resources/KeyValueStore.d.ts +31 -0
- package/dist/esm/resources/KeyValueStore.d.ts.map +1 -0
- package/dist/esm/resources/Loader.d.ts +55 -2
- package/dist/esm/resources/Loader.d.ts.map +1 -1
- package/dist/esm/resources/Loader.js +159 -14
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/MemoryStore.d.ts +17 -0
- package/dist/esm/resources/MemoryStore.d.ts.map +1 -0
- package/dist/esm/resources/MemoryStore.js +30 -0
- package/dist/esm/resources/MemoryStore.js.map +1 -0
- package/dist/esm/resources/WebStorageStore.d.ts +40 -0
- package/dist/esm/resources/WebStorageStore.d.ts.map +1 -0
- package/dist/esm/resources/WebStorageStore.js +84 -0
- package/dist/esm/resources/WebStorageStore.js.map +1 -0
- package/dist/esm/resources/coreAssetBindings.d.ts.map +1 -1
- package/dist/esm/resources/coreAssetBindings.js +16 -5
- package/dist/esm/resources/coreAssetBindings.js.map +1 -1
- package/dist/esm/resources/factories/BmFontFactory.js +4 -4
- package/dist/esm/resources/factories/BmFontFactory.js.map +1 -1
- package/dist/esm/resources/factories/MusicFactory.d.ts +9 -9
- package/dist/esm/resources/factories/MusicFactory.d.ts.map +1 -1
- package/dist/esm/resources/factories/MusicFactory.js +7 -7
- package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
- package/dist/esm/resources/factories/SoundFactory.js +2 -2
- package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
- package/dist/esm/resources/factories/SubtitleFactory.d.ts +11 -1
- package/dist/esm/resources/factories/SubtitleFactory.d.ts.map +1 -1
- package/dist/esm/resources/factories/SubtitleFactory.js +13 -9
- package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -1
- package/dist/esm/resources/index.d.ts +51 -34
- package/dist/esm/resources/index.d.ts.map +1 -1
- package/dist/esm/resources/utils.js +4 -4
- package/dist/esm/resources/utils.js.map +1 -1
- package/dist/esm/ui/Button.d.ts +54 -0
- package/dist/esm/ui/Button.d.ts.map +1 -0
- package/dist/esm/ui/Button.js +139 -0
- package/dist/esm/ui/Button.js.map +1 -0
- package/dist/esm/ui/Label.d.ts +17 -0
- package/dist/esm/ui/Label.d.ts.map +1 -0
- package/dist/esm/ui/Label.js +37 -0
- package/dist/esm/ui/Label.js.map +1 -0
- package/dist/esm/ui/Panel.d.ts +38 -0
- package/dist/esm/ui/Panel.d.ts.map +1 -0
- package/dist/esm/ui/Panel.js +61 -0
- package/dist/esm/ui/Panel.js.map +1 -0
- package/dist/esm/ui/ProgressBar.d.ts +37 -0
- package/dist/esm/ui/ProgressBar.d.ts.map +1 -0
- package/dist/esm/ui/ProgressBar.js +76 -0
- package/dist/esm/ui/ProgressBar.js.map +1 -0
- package/dist/esm/ui/ScrollContainer.d.ts +63 -0
- package/dist/esm/ui/ScrollContainer.d.ts.map +1 -0
- package/dist/esm/ui/ScrollContainer.js +99 -0
- package/dist/esm/ui/ScrollContainer.js.map +1 -0
- package/dist/esm/ui/Stack.d.ts +34 -0
- package/dist/esm/ui/Stack.d.ts.map +1 -0
- package/dist/esm/ui/Stack.js +69 -0
- package/dist/esm/ui/Stack.js.map +1 -0
- package/dist/esm/ui/Tooltip.d.ts +67 -0
- package/dist/esm/ui/Tooltip.d.ts.map +1 -0
- package/dist/esm/ui/Tooltip.js +133 -0
- package/dist/esm/ui/Tooltip.js.map +1 -0
- package/dist/esm/ui/UIRoot.d.ts +31 -0
- package/dist/esm/ui/UIRoot.d.ts.map +1 -0
- package/dist/esm/ui/UIRoot.js +49 -0
- package/dist/esm/ui/UIRoot.js.map +1 -0
- package/dist/esm/ui/Widget.d.ts +45 -0
- package/dist/esm/ui/Widget.d.ts.map +1 -0
- package/dist/esm/ui/Widget.js +113 -0
- package/dist/esm/ui/Widget.js.map +1 -0
- package/dist/esm/ui/index.d.ts +17 -0
- package/dist/esm/ui/index.d.ts.map +1 -0
- package/dist/exo.debug.esm.js +1 -948
- package/dist/exo.debug.esm.js.map +1 -1
- package/dist/exo.esm.js +1 -40945
- package/dist/exo.esm.js.map +1 -1
- package/dist/exo.iife.js +45202 -0
- package/dist/exo.iife.js.map +1 -0
- package/dist/exo.iife.min.js +2 -0
- package/dist/exo.iife.min.js.map +1 -0
- package/package.json +37 -14
- package/dist/esm/audio/AbstractMedia.d.ts +0 -75
- package/dist/esm/audio/AbstractMedia.d.ts.map +0 -1
- package/dist/esm/audio/AbstractMedia.js +0 -179
- package/dist/esm/audio/AbstractMedia.js.map +0 -1
- package/dist/esm/audio/AudioAnalyser.d.ts +0 -128
- package/dist/esm/audio/AudioAnalyser.d.ts.map +0 -1
- package/dist/esm/audio/AudioAnalyser.js +0 -473
- package/dist/esm/audio/AudioAnalyser.js.map +0 -1
- package/dist/esm/audio/AudioFilter.d.ts +0 -17
- package/dist/esm/audio/AudioFilter.d.ts.map +0 -1
- package/dist/esm/audio/AudioFilter.js +0 -15
- package/dist/esm/audio/AudioFilter.js.map +0 -1
- package/dist/esm/audio/BeatDetector.d.ts +0 -207
- package/dist/esm/audio/BeatDetector.d.ts.map +0 -1
- package/dist/esm/audio/BeatDetector.js +0 -424
- package/dist/esm/audio/BeatDetector.js.map +0 -1
- package/dist/esm/audio/Media.d.ts +0 -37
- package/dist/esm/audio/Media.d.ts.map +0 -1
- package/dist/esm/audio/Music.d.ts +0 -42
- package/dist/esm/audio/Music.d.ts.map +0 -1
- package/dist/esm/audio/Music.js +0 -164
- package/dist/esm/audio/Music.js.map +0 -1
- package/dist/esm/audio/OscillatorSound.d.ts +0 -100
- package/dist/esm/audio/OscillatorSound.d.ts.map +0 -1
- package/dist/esm/audio/OscillatorSound.js +0 -346
- package/dist/esm/audio/OscillatorSound.js.map +0 -1
- package/dist/esm/audio/dsp/fft.d.ts +0 -23
- package/dist/esm/audio/dsp/fft.d.ts.map +0 -1
- package/dist/esm/audio/dsp/mel.d.ts +0 -44
- package/dist/esm/audio/dsp/mel.d.ts.map +0 -1
- package/dist/esm/audio/dsp/mel.js +0 -70
- package/dist/esm/audio/dsp/mel.js.map +0 -1
- package/dist/esm/audio/dsp/tempogram.d.ts +0 -52
- package/dist/esm/audio/dsp/tempogram.d.ts.map +0 -1
- package/dist/esm/audio/filters/ChorusFilter.d.ts +0 -54
- package/dist/esm/audio/filters/ChorusFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/ChorusFilter.js +0 -155
- package/dist/esm/audio/filters/ChorusFilter.js.map +0 -1
- package/dist/esm/audio/filters/CompressorFilter.d.ts +0 -54
- package/dist/esm/audio/filters/CompressorFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/CompressorFilter.js +0 -123
- package/dist/esm/audio/filters/CompressorFilter.js.map +0 -1
- package/dist/esm/audio/filters/DelayFilter.d.ts +0 -36
- package/dist/esm/audio/filters/DelayFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/DelayFilter.js +0 -114
- package/dist/esm/audio/filters/DelayFilter.js.map +0 -1
- package/dist/esm/audio/filters/DuckingFilter.d.ts +0 -45
- package/dist/esm/audio/filters/DuckingFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/DuckingFilter.js +0 -172
- package/dist/esm/audio/filters/DuckingFilter.js.map +0 -1
- package/dist/esm/audio/filters/EqualizerFilter.d.ts +0 -51
- package/dist/esm/audio/filters/EqualizerFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/EqualizerFilter.js +0 -138
- package/dist/esm/audio/filters/EqualizerFilter.js.map +0 -1
- package/dist/esm/audio/filters/GranularFilter.d.ts +0 -63
- package/dist/esm/audio/filters/GranularFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/GranularFilter.js +0 -107
- package/dist/esm/audio/filters/GranularFilter.js.map +0 -1
- package/dist/esm/audio/filters/PitchShiftFilter.d.ts +0 -45
- package/dist/esm/audio/filters/PitchShiftFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/PitchShiftFilter.js +0 -66
- package/dist/esm/audio/filters/PitchShiftFilter.js.map +0 -1
- package/dist/esm/audio/filters/ReverbFilter.d.ts +0 -38
- package/dist/esm/audio/filters/ReverbFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/ReverbFilter.js +0 -122
- package/dist/esm/audio/filters/ReverbFilter.js.map +0 -1
- package/dist/esm/audio/filters/VocoderFilter.d.ts +0 -50
- package/dist/esm/audio/filters/VocoderFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/VocoderFilter.js +0 -94
- package/dist/esm/audio/filters/VocoderFilter.js.map +0 -1
- package/dist/esm/audio/filters/WorkletFilter.d.ts +0 -54
- package/dist/esm/audio/filters/WorkletFilter.d.ts.map +0 -1
- package/dist/esm/audio/filters/WorkletFilter.js +0 -110
- package/dist/esm/audio/filters/WorkletFilter.js.map +0 -1
- package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +0 -2
- package/dist/esm/audio/worklets/beat-detector.worklet.d.ts.map +0 -1
- package/dist/esm/audio/worklets/beat-detector.worklet.js +0 -647
- package/dist/esm/audio/worklets/beat-detector.worklet.js.map +0 -1
- package/dist/esm/audio/worklets/granular.worklet.d.ts +0 -2
- package/dist/esm/audio/worklets/granular.worklet.d.ts.map +0 -1
- package/dist/esm/audio/worklets/granular.worklet.js +0 -89
- package/dist/esm/audio/worklets/granular.worklet.js.map +0 -1
- package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +0 -2
- package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts.map +0 -1
- package/dist/esm/audio/worklets/pitch-shift.worklet.js +0 -74
- package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +0 -1
- package/dist/esm/audio/worklets/vocoder.worklet.d.ts +0 -2
- package/dist/esm/audio/worklets/vocoder.worklet.d.ts.map +0 -1
- package/dist/esm/audio/worklets/vocoder.worklet.js +0 -92
- package/dist/esm/audio/worklets/vocoder.worklet.js.map +0 -1
- package/dist/esm/input/internal/interactionManagerRegistry.d.ts +0 -10
- package/dist/esm/input/internal/interactionManagerRegistry.d.ts.map +0 -1
- package/dist/esm/input/internal/interactionManagerRegistry.js +0 -10
- package/dist/esm/input/internal/interactionManagerRegistry.js.map +0 -1
- package/dist/esm/rendering/Camera.d.ts +0 -34
- package/dist/esm/rendering/Camera.d.ts.map +0 -1
- package/dist/esm/rendering/Camera.js +0 -38
- package/dist/esm/rendering/Camera.js.map +0 -1
- package/dist/esm/rendering/index.d.ts.map +0 -1
- package/dist/esm/rendering/plan/RenderInstruction.js +0 -45
- package/dist/esm/rendering/plan/RenderInstruction.js.map +0 -1
- package/dist/esm/rendering.d.ts +0 -29
- package/dist/esm/rendering.d.ts.map +0 -1
- package/dist/esm/rendering.js.map +0 -1
- package/dist/esm/resources/JsonStore.d.ts +0 -19
- package/dist/esm/resources/JsonStore.d.ts.map +0 -1
- package/dist/esm/resources/JsonStore.js +0 -62
- package/dist/esm/resources/JsonStore.js.map +0 -1
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { pitchShiftWorkletSource } from '../worklets/pitch-shift.worklet.js';
|
|
2
|
-
import { WorkletFilter } from './WorkletFilter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Real-time pitch shifter via granular synthesis (WorkletFilter).
|
|
6
|
-
*
|
|
7
|
-
* Quality: good for ±1 octave (pitch 0.5x-2.0x). Beyond that, audible
|
|
8
|
-
* artifacts (graininess, phase issues). For high-quality pitch shift,
|
|
9
|
-
* a phase-vocoder approach is required and not available in V1.
|
|
10
|
-
*
|
|
11
|
-
* Latency: ~half-grain-size = ~10ms at default 1024-sample grains
|
|
12
|
-
* (at 48kHz sample rate). Not suitable for live monitoring; fine for
|
|
13
|
-
* games / playback.
|
|
14
|
-
*
|
|
15
|
-
* Use cases:
|
|
16
|
-
* - Sound variation: random ±200 cent pitch on each footstep / bullet
|
|
17
|
-
* - Voice effects: chipmunk (1.5x) or demon (0.7x) for game NPCs
|
|
18
|
-
* - Detune layering: stack 0.99x and 1.01x for thick chorused sound
|
|
19
|
-
*/
|
|
20
|
-
class PitchShiftFilter extends WorkletFilter {
|
|
21
|
-
_pitch;
|
|
22
|
-
_wet;
|
|
23
|
-
_grainSize;
|
|
24
|
-
constructor(options = {}) {
|
|
25
|
-
super();
|
|
26
|
-
this._pitch = Math.max(0.25, Math.min(4, options.pitch ?? 1));
|
|
27
|
-
this._wet = Math.max(0, Math.min(1, options.wet ?? 1));
|
|
28
|
-
this._grainSize = options.grainSize ?? 1024;
|
|
29
|
-
}
|
|
30
|
-
get _workletName() {
|
|
31
|
-
return 'exojs-pitch-shift';
|
|
32
|
-
}
|
|
33
|
-
get _workletSource() {
|
|
34
|
-
return pitchShiftWorkletSource;
|
|
35
|
-
}
|
|
36
|
-
get _workletOptions() {
|
|
37
|
-
return {
|
|
38
|
-
numberOfInputs: 1,
|
|
39
|
-
numberOfOutputs: 1,
|
|
40
|
-
processorOptions: { grainSize: this._grainSize },
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
_onWorkletReady() {
|
|
44
|
-
this._setAudioParam('pitch', this._pitch);
|
|
45
|
-
this._setAudioParam('wet', this._wet);
|
|
46
|
-
}
|
|
47
|
-
/** Pitch ratio relative to the original. 1.0 = no change, 0.5 = one octave down, 2.0 = one octave up. Range 0.25..4.0, default 1.0. */
|
|
48
|
-
get pitch() {
|
|
49
|
-
return this._pitch;
|
|
50
|
-
}
|
|
51
|
-
set pitch(value) {
|
|
52
|
-
this._pitch = Math.max(0.25, Math.min(4, value));
|
|
53
|
-
this._setAudioParam('pitch', this._pitch);
|
|
54
|
-
}
|
|
55
|
-
/** Wet (pitch-shifted) mix level, 0..1. Default 1.0 (full wet). */
|
|
56
|
-
get wet() {
|
|
57
|
-
return this._wet;
|
|
58
|
-
}
|
|
59
|
-
set wet(value) {
|
|
60
|
-
this._wet = Math.max(0, Math.min(1, value));
|
|
61
|
-
this._setAudioParam('wet', this._wet);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export { PitchShiftFilter };
|
|
66
|
-
//# sourceMappingURL=PitchShiftFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PitchShiftFilter.js","sources":["../../../../../src/audio/filters/PitchShiftFilter.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;;;;;AAeG;AACG,MAAO,gBAAiB,SAAQ,aAAa,CAAA;AACzC,IAAA,MAAM;AACN,IAAA,IAAI;AACK,IAAA,UAAU;AAE3B,IAAA,WAAA,CAAmB,UAAmC,EAAE,EAAA;AACtD,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI;IAC7C;AAEA,IAAA,IAAc,YAAY,GAAA;AACxB,QAAA,OAAO,mBAAmB;IAC5B;AAEA,IAAA,IAAc,cAAc,GAAA;AAC1B,QAAA,OAAO,uBAAuB;IAChC;AAEA,IAAA,IAAuB,eAAe,GAAA;QACpC,OAAO;AACL,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,eAAe,EAAE,CAAC;AAClB,YAAA,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;SACjD;IACH;IAEmB,eAAe,GAAA;QAChC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACvC;;AAGA,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM;IACpB;IACA,IAAW,KAAK,CAAC,KAAa,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;IAC3C;;AAGA,IAAA,IAAW,GAAG,GAAA;QACZ,OAAO,IAAI,CAAC,IAAI;IAClB;IACA,IAAW,GAAG,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACvC;AACD;;;;"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { AudioFilter } from '#audio/AudioFilter';
|
|
2
|
-
/** Construction options for {@link ReverbFilter}. */
|
|
3
|
-
export interface ReverbFilterOptions {
|
|
4
|
-
durationSeconds?: number;
|
|
5
|
-
decay?: number;
|
|
6
|
-
wet?: number;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Convolution reverb using a procedurally-generated impulse response loaded
|
|
10
|
-
* into a `ConvolverNode`. The impulse response is a stereo noise burst whose
|
|
11
|
-
* amplitude decays exponentially, simulating room reflections. Adjusting
|
|
12
|
-
* `durationSeconds` or `decay` rebuilds the impulse response immediately, so
|
|
13
|
-
* avoid animating these properties at audio rate — use `wet` for real-time
|
|
14
|
-
* mix control instead.
|
|
15
|
-
*/
|
|
16
|
-
export declare class ReverbFilter extends AudioFilter {
|
|
17
|
-
private _setup;
|
|
18
|
-
private _duration;
|
|
19
|
-
private readonly _onAudioContextReady;
|
|
20
|
-
private _decay;
|
|
21
|
-
private _wet;
|
|
22
|
-
constructor(options?: ReverbFilterOptions);
|
|
23
|
-
get inputNode(): AudioNode;
|
|
24
|
-
get outputNode(): AudioNode;
|
|
25
|
-
/** Length of the generated impulse response in seconds. Range 0.1..5, default 2. Changing this rebuilds the IR buffer. */
|
|
26
|
-
get durationSeconds(): number;
|
|
27
|
-
set durationSeconds(value: number);
|
|
28
|
-
/** Exponential decay rate of the impulse response. Higher values produce a tighter, drier reverb tail. Range 0.5..10, default 2. Changing this rebuilds the IR buffer. */
|
|
29
|
-
get decay(): number;
|
|
30
|
-
set decay(value: number);
|
|
31
|
-
/** Wet (reverberated) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.4. */
|
|
32
|
-
get wet(): number;
|
|
33
|
-
set wet(value: number);
|
|
34
|
-
destroy(): void;
|
|
35
|
-
private _generateImpulseResponse;
|
|
36
|
-
private _setupNodes;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=ReverbFilter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReverbFilter.d.ts","sourceRoot":"","sources":["../../../../src/audio/filters/ReverbFilter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAUD;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAGnC;IACF,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;gBAEF,OAAO,GAAE,mBAAwB;IAYpD,IAAW,SAAS,IAAI,SAAS,CAGhC;IAED,IAAW,UAAU,IAAI,SAAS,CAGjC;IAED,0HAA0H;IAC1H,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED,IAAW,eAAe,CAAC,KAAK,EAAE,MAAM,EAKvC;IAED,0KAA0K;IAC1K,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAK7B;IAED,iGAAiG;IACjG,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAO3B;IAEe,OAAO,IAAI,IAAI;IAY/B,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,WAAW;CAyBpB"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { onAudioContextReady, isAudioContextReady, getAudioContext } from '../audio-context.js';
|
|
2
|
-
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Convolution reverb using a procedurally-generated impulse response loaded
|
|
6
|
-
* into a `ConvolverNode`. The impulse response is a stereo noise burst whose
|
|
7
|
-
* amplitude decays exponentially, simulating room reflections. Adjusting
|
|
8
|
-
* `durationSeconds` or `decay` rebuilds the impulse response immediately, so
|
|
9
|
-
* avoid animating these properties at audio rate — use `wet` for real-time
|
|
10
|
-
* mix control instead.
|
|
11
|
-
*/
|
|
12
|
-
class ReverbFilter extends AudioFilter {
|
|
13
|
-
_setup = null;
|
|
14
|
-
_duration;
|
|
15
|
-
_onAudioContextReady = (ctx) => {
|
|
16
|
-
onAudioContextReady.remove(this._onAudioContextReady);
|
|
17
|
-
this._setupNodes(ctx);
|
|
18
|
-
};
|
|
19
|
-
_decay;
|
|
20
|
-
_wet;
|
|
21
|
-
constructor(options = {}) {
|
|
22
|
-
super();
|
|
23
|
-
this._duration = Math.max(0.1, Math.min(5, options.durationSeconds ?? 2));
|
|
24
|
-
this._decay = Math.max(0.5, Math.min(10, options.decay ?? 2));
|
|
25
|
-
this._wet = Math.max(0, Math.min(1, options.wet ?? 0.4));
|
|
26
|
-
if (isAudioContextReady()) {
|
|
27
|
-
this._setupNodes(getAudioContext());
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
onAudioContextReady.add(this._onAudioContextReady);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
get inputNode() {
|
|
34
|
-
if (!this._setup)
|
|
35
|
-
throw new Error('ReverbFilter not yet initialized.');
|
|
36
|
-
return this._setup.inputGain;
|
|
37
|
-
}
|
|
38
|
-
get outputNode() {
|
|
39
|
-
if (!this._setup)
|
|
40
|
-
throw new Error('ReverbFilter not yet initialized.');
|
|
41
|
-
return this._setup.outputGain;
|
|
42
|
-
}
|
|
43
|
-
/** Length of the generated impulse response in seconds. Range 0.1..5, default 2. Changing this rebuilds the IR buffer. */
|
|
44
|
-
get durationSeconds() {
|
|
45
|
-
return this._duration;
|
|
46
|
-
}
|
|
47
|
-
set durationSeconds(value) {
|
|
48
|
-
this._duration = Math.max(0.1, Math.min(5, value));
|
|
49
|
-
if (this._setup) {
|
|
50
|
-
this._setup.convolver.buffer = this._generateImpulseResponse(this._setup.convolver.context);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/** Exponential decay rate of the impulse response. Higher values produce a tighter, drier reverb tail. Range 0.5..10, default 2. Changing this rebuilds the IR buffer. */
|
|
54
|
-
get decay() {
|
|
55
|
-
return this._decay;
|
|
56
|
-
}
|
|
57
|
-
set decay(value) {
|
|
58
|
-
this._decay = Math.max(0.5, Math.min(10, value));
|
|
59
|
-
if (this._setup) {
|
|
60
|
-
this._setup.convolver.buffer = this._generateImpulseResponse(this._setup.convolver.context);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/** Wet (reverberated) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.4. */
|
|
64
|
-
get wet() {
|
|
65
|
-
return this._wet;
|
|
66
|
-
}
|
|
67
|
-
set wet(value) {
|
|
68
|
-
this._wet = Math.max(0, Math.min(1, value));
|
|
69
|
-
if (this._setup) {
|
|
70
|
-
const ctx = this._setup.wetGain.context;
|
|
71
|
-
this._setup.wetGain.gain.setTargetAtTime(this._wet, ctx.currentTime, 0.01);
|
|
72
|
-
this._setup.dryGain.gain.setTargetAtTime(1 - this._wet, ctx.currentTime, 0.01);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
destroy() {
|
|
76
|
-
onAudioContextReady.remove(this._onAudioContextReady);
|
|
77
|
-
if (this._setup) {
|
|
78
|
-
this._setup.inputGain.disconnect();
|
|
79
|
-
this._setup.convolver.disconnect();
|
|
80
|
-
this._setup.dryGain.disconnect();
|
|
81
|
-
this._setup.wetGain.disconnect();
|
|
82
|
-
this._setup.outputGain.disconnect();
|
|
83
|
-
this._setup = null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
_generateImpulseResponse(ctx) {
|
|
87
|
-
const length = Math.floor(ctx.sampleRate * this._duration);
|
|
88
|
-
const buffer = ctx.createBuffer(2, length, ctx.sampleRate);
|
|
89
|
-
for (let channel = 0; channel < 2; channel++) {
|
|
90
|
-
const data = buffer.getChannelData(channel);
|
|
91
|
-
for (let i = 0; i < length; i++) {
|
|
92
|
-
const t = i / length;
|
|
93
|
-
const decayFactor = Math.pow(1 - t, this._decay);
|
|
94
|
-
data[i] = (Math.random() * 2 - 1) * decayFactor;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return buffer;
|
|
98
|
-
}
|
|
99
|
-
_setupNodes(ctx) {
|
|
100
|
-
const inputGain = ctx.createGain();
|
|
101
|
-
const outputGain = ctx.createGain();
|
|
102
|
-
const convolver = ctx.createConvolver();
|
|
103
|
-
const dryGain = ctx.createGain();
|
|
104
|
-
const wetGain = ctx.createGain();
|
|
105
|
-
inputGain.gain.setValueAtTime(1, ctx.currentTime);
|
|
106
|
-
outputGain.gain.setValueAtTime(1, ctx.currentTime);
|
|
107
|
-
dryGain.gain.setValueAtTime(1 - this._wet, ctx.currentTime);
|
|
108
|
-
wetGain.gain.setValueAtTime(this._wet, ctx.currentTime);
|
|
109
|
-
convolver.buffer = this._generateImpulseResponse(ctx);
|
|
110
|
-
// Dry path: input → dryGain → output
|
|
111
|
-
inputGain.connect(dryGain);
|
|
112
|
-
dryGain.connect(outputGain);
|
|
113
|
-
// Wet path: input → convolver → wetGain → output
|
|
114
|
-
inputGain.connect(convolver);
|
|
115
|
-
convolver.connect(wetGain);
|
|
116
|
-
wetGain.connect(outputGain);
|
|
117
|
-
this._setup = { inputGain, outputGain, convolver, dryGain, wetGain };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export { ReverbFilter };
|
|
122
|
-
//# sourceMappingURL=ReverbFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReverbFilter.js","sources":["../../../../../src/audio/filters/ReverbFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import type { AudioBus } from '#audio/AudioBus';
|
|
2
|
-
import { WorkletFilter } from './WorkletFilter';
|
|
3
|
-
export interface VocoderFilterOptions {
|
|
4
|
-
/** Modulator AudioBus — its output drives the spectral envelope.
|
|
5
|
-
* Typically routed from a microphone or voice sample. */
|
|
6
|
-
modulator: AudioBus;
|
|
7
|
-
/** Number of frequency bands. More bands = better resolution, more CPU. Default 16. */
|
|
8
|
-
numBands?: number;
|
|
9
|
-
/** Lowest band center frequency in Hz. Default 80. */
|
|
10
|
-
minHz?: number;
|
|
11
|
-
/** Highest band center frequency in Hz. Default 8000. */
|
|
12
|
-
maxHz?: number;
|
|
13
|
-
/** Bandpass Q factor. Higher = narrower bands. Default 4. */
|
|
14
|
-
bandQ?: number;
|
|
15
|
-
/** Dry/wet mix, 0..1. Default 1.0. */
|
|
16
|
-
wet?: number;
|
|
17
|
-
/** Envelope follower smoothing factor (one-pole coefficient).
|
|
18
|
-
* Smaller = smoother / slower. Default 0.005. */
|
|
19
|
-
envelopeSmoothing?: number;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Phase-vocoder-style effect implemented as a {@link WorkletFilter}. Analyzes
|
|
23
|
-
* the spectral envelope of a `modulator` {@link AudioBus} across a bank of
|
|
24
|
-
* log-spaced bandpass filters and applies that envelope to the carrier signal
|
|
25
|
-
* (the main input). The result is the classic "robot voice" or talking-synth
|
|
26
|
-
* effect. Band count, frequency range, and Q are compile-time parameters set
|
|
27
|
-
* at construction; only `wet` and `envelopeSmoothing` are adjustable at
|
|
28
|
-
* runtime.
|
|
29
|
-
*/
|
|
30
|
-
export declare class VocoderFilter extends WorkletFilter {
|
|
31
|
-
private readonly _modulator;
|
|
32
|
-
private readonly _numBands;
|
|
33
|
-
private readonly _minHz;
|
|
34
|
-
private readonly _maxHz;
|
|
35
|
-
private readonly _bandQ;
|
|
36
|
-
private _wet;
|
|
37
|
-
private _envelopeSmoothing;
|
|
38
|
-
constructor(options: VocoderFilterOptions);
|
|
39
|
-
protected get _workletName(): string;
|
|
40
|
-
protected get _workletSource(): string;
|
|
41
|
-
protected get _workletOptions(): AudioWorkletNodeOptions;
|
|
42
|
-
protected _onWorkletReady(_audioContext: AudioContext): void;
|
|
43
|
-
/** Wet (vocoded) mix level, 0..1. Default 1.0. */
|
|
44
|
-
get wet(): number;
|
|
45
|
-
set wet(value: number);
|
|
46
|
-
/** One-pole envelope follower coefficient. Smaller values produce slower, smoother envelope tracking. Range 0.0001..0.1, default 0.005. */
|
|
47
|
-
get envelopeSmoothing(): number;
|
|
48
|
-
set envelopeSmoothing(value: number);
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=VocoderFilter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VocoderFilter.d.ts","sourceRoot":"","sources":["../../../../src/audio/filters/VocoderFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC;8DAC0D;IAC1D,SAAS,EAAE,QAAQ,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;sDACkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,aAAa;IAG9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,kBAAkB,CAAS;gBAEhB,OAAO,EAAE,oBAAoB;IAchD,SAAS,KAAK,YAAY,IAAI,MAAM,CAEnC;IACD,SAAS,KAAK,cAAc,IAAI,MAAM,CAErC;IACD,cAAuB,eAAe,IAAI,uBAAuB,CAWhE;cAEkB,eAAe,CAAC,aAAa,EAAE,YAAY,GAAG,IAAI;IAsBrE,kDAAkD;IAClD,IAAW,GAAG,IAAI,MAAM,CAEvB;IACD,IAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAG3B;IAED,2IAA2I;IAC3I,IAAW,iBAAiB,IAAI,MAAM,CAErC;IACD,IAAW,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAGzC;CACF"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { vocoderWorkletSource } from '../worklets/vocoder.worklet.js';
|
|
2
|
-
import { WorkletFilter } from './WorkletFilter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Phase-vocoder-style effect implemented as a {@link WorkletFilter}. Analyzes
|
|
6
|
-
* the spectral envelope of a `modulator` {@link AudioBus} across a bank of
|
|
7
|
-
* log-spaced bandpass filters and applies that envelope to the carrier signal
|
|
8
|
-
* (the main input). The result is the classic "robot voice" or talking-synth
|
|
9
|
-
* effect. Band count, frequency range, and Q are compile-time parameters set
|
|
10
|
-
* at construction; only `wet` and `envelopeSmoothing` are adjustable at
|
|
11
|
-
* runtime.
|
|
12
|
-
*/
|
|
13
|
-
class VocoderFilter extends WorkletFilter {
|
|
14
|
-
// Declared nullable because super() may trigger _onWorkletReady before the
|
|
15
|
-
// subclass constructor body runs (if construction is aborted by a throw).
|
|
16
|
-
_modulator = null;
|
|
17
|
-
_numBands;
|
|
18
|
-
_minHz;
|
|
19
|
-
_maxHz;
|
|
20
|
-
_bandQ;
|
|
21
|
-
_wet;
|
|
22
|
-
_envelopeSmoothing;
|
|
23
|
-
constructor(options) {
|
|
24
|
-
super();
|
|
25
|
-
if (!options.modulator) {
|
|
26
|
-
throw new Error('VocoderFilter requires a modulator AudioBus.');
|
|
27
|
-
}
|
|
28
|
-
this._modulator = options.modulator;
|
|
29
|
-
this._numBands = options.numBands ?? 16;
|
|
30
|
-
this._minHz = options.minHz ?? 80;
|
|
31
|
-
this._maxHz = options.maxHz ?? 8000;
|
|
32
|
-
this._bandQ = options.bandQ ?? 4;
|
|
33
|
-
this._wet = Math.max(0, Math.min(1, options.wet ?? 1));
|
|
34
|
-
this._envelopeSmoothing = Math.max(0.0001, Math.min(0.1, options.envelopeSmoothing ?? 0.005));
|
|
35
|
-
}
|
|
36
|
-
get _workletName() {
|
|
37
|
-
return 'exojs-vocoder';
|
|
38
|
-
}
|
|
39
|
-
get _workletSource() {
|
|
40
|
-
return vocoderWorkletSource;
|
|
41
|
-
}
|
|
42
|
-
get _workletOptions() {
|
|
43
|
-
return {
|
|
44
|
-
numberOfInputs: 2,
|
|
45
|
-
numberOfOutputs: 1,
|
|
46
|
-
processorOptions: {
|
|
47
|
-
numBands: this._numBands,
|
|
48
|
-
minHz: this._minHz,
|
|
49
|
-
maxHz: this._maxHz,
|
|
50
|
-
bandQ: this._bandQ,
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
_onWorkletReady(_audioContext) {
|
|
55
|
-
// Guard against partially-constructed instances (constructor threw after super()).
|
|
56
|
-
if (!this._modulator)
|
|
57
|
-
return;
|
|
58
|
-
this._setAudioParam('wet', this._wet);
|
|
59
|
-
this._setAudioParam('envelopeSmoothing', this._envelopeSmoothing);
|
|
60
|
-
// Wire modulator bus output to input 1 of the worklet
|
|
61
|
-
const modulator = this._modulator;
|
|
62
|
-
const modOutput = modulator._getOutputNode();
|
|
63
|
-
if (modOutput && this._workletNode) {
|
|
64
|
-
modOutput.connect(this._workletNode, 0, 1);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
modulator.onceSetup(() => {
|
|
68
|
-
const node = modulator._getOutputNode();
|
|
69
|
-
if (node && this._workletNode) {
|
|
70
|
-
node.connect(this._workletNode, 0, 1);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/** Wet (vocoded) mix level, 0..1. Default 1.0. */
|
|
76
|
-
get wet() {
|
|
77
|
-
return this._wet;
|
|
78
|
-
}
|
|
79
|
-
set wet(value) {
|
|
80
|
-
this._wet = Math.max(0, Math.min(1, value));
|
|
81
|
-
this._setAudioParam('wet', this._wet);
|
|
82
|
-
}
|
|
83
|
-
/** One-pole envelope follower coefficient. Smaller values produce slower, smoother envelope tracking. Range 0.0001..0.1, default 0.005. */
|
|
84
|
-
get envelopeSmoothing() {
|
|
85
|
-
return this._envelopeSmoothing;
|
|
86
|
-
}
|
|
87
|
-
set envelopeSmoothing(value) {
|
|
88
|
-
this._envelopeSmoothing = Math.max(0.0001, Math.min(0.1, value));
|
|
89
|
-
this._setAudioParam('envelopeSmoothing', this._envelopeSmoothing);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export { VocoderFilter };
|
|
94
|
-
//# sourceMappingURL=VocoderFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VocoderFilter.js","sources":["../../../../../src/audio/filters/VocoderFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { AudioFilter } from '#audio/AudioFilter';
|
|
2
|
-
/**
|
|
3
|
-
* Base class for filters implemented as AudioWorkletProcessors. Subclasses
|
|
4
|
-
* declare the worklet's name, source code, and node options; this class
|
|
5
|
-
* handles the async lifecycle.
|
|
6
|
-
*
|
|
7
|
-
* Stable input/output nodes (GainNodes) are created immediately on setup.
|
|
8
|
-
* While the worklet loads asynchronously, audio passes through directly
|
|
9
|
-
* (effectively bypassing the filter for ~10-50ms during initial load).
|
|
10
|
-
* Once the worklet loads, it's inserted into the chain and audio routes
|
|
11
|
-
* through it.
|
|
12
|
-
*
|
|
13
|
-
* Subclasses can override `_onWorkletReady` to perform additional wiring
|
|
14
|
-
* (e.g., sidechain inputs).
|
|
15
|
-
* @advanced
|
|
16
|
-
*/
|
|
17
|
-
export declare abstract class WorkletFilter extends AudioFilter {
|
|
18
|
-
protected _inputGain: GainNode | null;
|
|
19
|
-
protected _outputGain: GainNode | null;
|
|
20
|
-
protected _workletNode: AudioWorkletNode | null;
|
|
21
|
-
protected _ready: Promise<void> | null;
|
|
22
|
-
private readonly _onAudioContextReady;
|
|
23
|
-
/** The processor name registered via `registerProcessor()` in the worklet source. */
|
|
24
|
-
protected abstract get _workletName(): string;
|
|
25
|
-
/** The full worklet source code as a JavaScript string. */
|
|
26
|
-
protected abstract get _workletSource(): string;
|
|
27
|
-
/** AudioWorkletNode constructor options. Default: 1 input, 1 output. */
|
|
28
|
-
protected get _workletOptions(): AudioWorkletNodeOptions;
|
|
29
|
-
constructor();
|
|
30
|
-
get inputNode(): AudioNode;
|
|
31
|
-
get outputNode(): AudioNode;
|
|
32
|
-
/**
|
|
33
|
-
* Resolves once the underlying worklet is loaded and inserted into the
|
|
34
|
-
* audio chain. Use this if you need to wait before applying parameters
|
|
35
|
-
* that depend on the worklet node.
|
|
36
|
-
*/
|
|
37
|
-
get ready(): Promise<void>;
|
|
38
|
-
/** Disconnects all nodes, cancels any pending worklet load, and releases resources. */
|
|
39
|
-
destroy(): void;
|
|
40
|
-
/**
|
|
41
|
-
* Subclass hook — called once when the worklet has loaded and the
|
|
42
|
-
* AudioWorkletNode is inserted into the chain. Use this for additional
|
|
43
|
-
* wiring (e.g., connecting a sidechain input).
|
|
44
|
-
*/
|
|
45
|
-
protected _onWorkletReady?(audioContext: AudioContext): void;
|
|
46
|
-
/**
|
|
47
|
-
* Ramps an `AudioParam` on the underlying `AudioWorkletNode` to `value`
|
|
48
|
-
* using a short exponential ramp. No-ops if the worklet is not yet loaded.
|
|
49
|
-
* @internal
|
|
50
|
-
*/
|
|
51
|
-
protected _setAudioParam(name: string, value: number): void;
|
|
52
|
-
private _setup;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=WorkletFilter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkletFilter.d.ts","sourceRoot":"","sources":["../../../../src/audio/filters/WorkletFilter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,aAAc,SAAQ,WAAW;IACrD,SAAS,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAC7C,SAAS,CAAC,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAC9C,SAAS,CAAC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACvD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAGnC;IAEF,qFAAqF;IACrF,SAAS,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC;IAC9C,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,KAAK,cAAc,IAAI,MAAM,CAAC;IAChD,wEAAwE;IACxE,SAAS,KAAK,eAAe,IAAI,uBAAuB,CAEvD;;IAWD,IAAW,SAAS,IAAI,SAAS,CAKhC;IAED,IAAW,UAAU,IAAI,SAAS,CAKjC;IAED;;;;OAIG;IACH,IAAoB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzC;IAED,uFAAuF;IACvE,OAAO,IAAI,IAAI;IAW/B;;;;OAIG;IACH,SAAS,CAAC,eAAe,CAAC,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAE5D;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3D,OAAO,CAAC,MAAM;CAyBf"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { onAudioContextReady, isAudioContextReady, getAudioContext } from '../audio-context.js';
|
|
2
|
-
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
-
import { registerAudioWorkletProcessor } from '../worklet/registerWorklet.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Base class for filters implemented as AudioWorkletProcessors. Subclasses
|
|
7
|
-
* declare the worklet's name, source code, and node options; this class
|
|
8
|
-
* handles the async lifecycle.
|
|
9
|
-
*
|
|
10
|
-
* Stable input/output nodes (GainNodes) are created immediately on setup.
|
|
11
|
-
* While the worklet loads asynchronously, audio passes through directly
|
|
12
|
-
* (effectively bypassing the filter for ~10-50ms during initial load).
|
|
13
|
-
* Once the worklet loads, it's inserted into the chain and audio routes
|
|
14
|
-
* through it.
|
|
15
|
-
*
|
|
16
|
-
* Subclasses can override `_onWorkletReady` to perform additional wiring
|
|
17
|
-
* (e.g., sidechain inputs).
|
|
18
|
-
* @advanced
|
|
19
|
-
*/
|
|
20
|
-
class WorkletFilter extends AudioFilter {
|
|
21
|
-
_inputGain = null;
|
|
22
|
-
_outputGain = null;
|
|
23
|
-
_workletNode = null;
|
|
24
|
-
_ready = null;
|
|
25
|
-
_onAudioContextReady = (ctx) => {
|
|
26
|
-
onAudioContextReady.remove(this._onAudioContextReady);
|
|
27
|
-
this._setup(ctx);
|
|
28
|
-
};
|
|
29
|
-
/** AudioWorkletNode constructor options. Default: 1 input, 1 output. */
|
|
30
|
-
get _workletOptions() {
|
|
31
|
-
return { numberOfInputs: 1, numberOfOutputs: 1 };
|
|
32
|
-
}
|
|
33
|
-
constructor() {
|
|
34
|
-
super();
|
|
35
|
-
if (isAudioContextReady()) {
|
|
36
|
-
this._setup(getAudioContext());
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
onAudioContextReady.add(this._onAudioContextReady);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
get inputNode() {
|
|
43
|
-
if (!this._inputGain) {
|
|
44
|
-
throw new Error(`${this.constructor.name}: input node accessed before audio context is ready.`);
|
|
45
|
-
}
|
|
46
|
-
return this._inputGain;
|
|
47
|
-
}
|
|
48
|
-
get outputNode() {
|
|
49
|
-
if (!this._outputGain) {
|
|
50
|
-
throw new Error(`${this.constructor.name}: output node accessed before audio context is ready.`);
|
|
51
|
-
}
|
|
52
|
-
return this._outputGain;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Resolves once the underlying worklet is loaded and inserted into the
|
|
56
|
-
* audio chain. Use this if you need to wait before applying parameters
|
|
57
|
-
* that depend on the worklet node.
|
|
58
|
-
*/
|
|
59
|
-
get ready() {
|
|
60
|
-
return this._ready ?? Promise.resolve();
|
|
61
|
-
}
|
|
62
|
-
/** Disconnects all nodes, cancels any pending worklet load, and releases resources. */
|
|
63
|
-
destroy() {
|
|
64
|
-
onAudioContextReady.remove(this._onAudioContextReady);
|
|
65
|
-
this._workletNode?.disconnect();
|
|
66
|
-
this._inputGain?.disconnect();
|
|
67
|
-
this._outputGain?.disconnect();
|
|
68
|
-
this._workletNode = null;
|
|
69
|
-
this._inputGain = null;
|
|
70
|
-
this._outputGain = null;
|
|
71
|
-
this._ready = null;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Ramps an `AudioParam` on the underlying `AudioWorkletNode` to `value`
|
|
75
|
-
* using a short exponential ramp. No-ops if the worklet is not yet loaded.
|
|
76
|
-
* @internal
|
|
77
|
-
*/
|
|
78
|
-
_setAudioParam(name, value) {
|
|
79
|
-
if (!this._workletNode)
|
|
80
|
-
return;
|
|
81
|
-
const audioParam = this._workletNode.parameters.get(name);
|
|
82
|
-
if (audioParam) {
|
|
83
|
-
audioParam.setTargetAtTime(value, this._workletNode.context.currentTime, 0.01);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
_setup(audioContext) {
|
|
87
|
-
// Create stable input/output gains immediately (bus can wire them now).
|
|
88
|
-
const inputGain = audioContext.createGain();
|
|
89
|
-
const outputGain = audioContext.createGain();
|
|
90
|
-
// Bypass: input → output until worklet loads.
|
|
91
|
-
inputGain.connect(outputGain);
|
|
92
|
-
this._inputGain = inputGain;
|
|
93
|
-
this._outputGain = outputGain;
|
|
94
|
-
// Async-load the worklet, then re-route through it.
|
|
95
|
-
this._ready = registerAudioWorkletProcessor(audioContext, this._workletName, this._workletSource).then(() => {
|
|
96
|
-
if (!this._inputGain || !this._outputGain)
|
|
97
|
-
return; // destroyed during load
|
|
98
|
-
const node = new AudioWorkletNode(audioContext, this._workletName, this._workletOptions);
|
|
99
|
-
this._workletNode = node;
|
|
100
|
-
// Re-route: input → worklet → output
|
|
101
|
-
this._inputGain.disconnect();
|
|
102
|
-
this._inputGain.connect(node);
|
|
103
|
-
node.connect(this._outputGain);
|
|
104
|
-
this._onWorkletReady?.(audioContext);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export { WorkletFilter };
|
|
110
|
-
//# sourceMappingURL=WorkletFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkletFilter.js","sources":["../../../../../src/audio/filters/WorkletFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare const beatDetectorWorkletSource = "\n// ---- Hann window + FFT (radix-2 Cooley-Tukey) ----\nfunction applyHannWindow(real, imag) {\n var n = real.length;\n for (var i = 0; i < n; i++) {\n var w = 0.5 * (1 - Math.cos(2 * Math.PI * i / (n - 1)));\n real[i] *= w;\n imag[i] = 0;\n }\n}\n\nfunction bitReversePermute(real, imag) {\n var n = real.length;\n var j = 0;\n for (var i = 1; i < n; i++) {\n var bit = n >> 1;\n for (; j & bit; bit >>= 1) { j ^= bit; }\n j ^= bit;\n if (i < j) {\n var t = real[i]; real[i] = real[j]; real[j] = t;\n t = imag[i]; imag[i] = imag[j]; imag[j] = t;\n }\n }\n}\n\nfunction fftInPlace(real, imag) {\n applyHannWindow(real, imag);\n bitReversePermute(real, imag);\n var n = real.length;\n for (var len = 2; len <= n; len <<= 1) {\n var halfLen = len >> 1;\n var step = -2 * Math.PI / len;\n for (var i = 0; i < n; i += len) {\n for (var k = 0; k < halfLen; k++) {\n var angle = step * k;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var re = real[i+k+halfLen]*cos - imag[i+k+halfLen]*sin;\n var im = real[i+k+halfLen]*sin + imag[i+k+halfLen]*cos;\n real[i+k+halfLen] = real[i+k] - re;\n imag[i+k+halfLen] = imag[i+k] - im;\n real[i+k] += re;\n imag[i+k] += im;\n }\n }\n }\n}\n\n// ---- Mel filterbank ----\nfunction buildMelFilterbank(numBands, fMin, fMax, fftSize, sampleRate) {\n var numBins = fftSize >> 1;\n var nyquist = sampleRate / 2;\n var melMin = 2595 * Math.log10(1 + fMin / 700);\n var melMax = 2595 * Math.log10(1 + fMax / 700);\n var melPoints = new Float32Array(numBands + 2);\n for (var i = 0; i < numBands + 2; i++) {\n melPoints[i] = melMin + (melMax - melMin) * i / (numBands + 1);\n }\n var binPoints = new Float32Array(numBands + 2);\n for (var i = 0; i < numBands + 2; i++) {\n var hz = 700 * (Math.pow(10, melPoints[i] / 2595) - 1);\n binPoints[i] = Math.round(hz / nyquist * (numBins - 1));\n }\n var bands = [];\n for (var b = 0; b < numBands; b++) {\n var startBin = Math.max(0, Math.min(numBins - 1, binPoints[b]));\n var peakBin = Math.max(0, Math.min(numBins - 1, binPoints[b+1]));\n var endBin = Math.max(0, Math.min(numBins - 1, binPoints[b+2]));\n var len = endBin - startBin + 1;\n var weights = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n var bin = startBin + i;\n if (bin <= peakBin && peakBin > startBin) {\n weights[i] = (bin - startBin) / (peakBin - startBin);\n } else if (bin > peakBin && endBin > peakBin) {\n weights[i] = (endBin - bin) / (endBin - peakBin);\n } else {\n weights[i] = 1;\n }\n }\n bands.push({ startBin: startBin, peakBin: peakBin, endBin: endBin, weights: weights });\n }\n return bands;\n}\n\nfunction computeMelBands(mag, bands, out) {\n for (var b = 0; b < bands.length; b++) {\n var band = bands[b];\n var energy = 0;\n for (var i = 0; i < band.weights.length; i++) {\n energy += mag[band.startBin + i] * band.weights[i];\n }\n out[b] = Math.log(1 + energy);\n }\n}\n\n// ---- Processor ----\nclass BeatDetectorProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n var opts = (options && options.processorOptions) || {};\n this._sampleRate = sampleRate;\n this._fftSize = opts.fftSize || 2048;\n this._hopSize = opts.hopSize || 512;\n this._minBpm = opts.minBpm || 50;\n this._maxBpm = opts.maxBpm || 250;\n this._melBands = opts.melBands || 24;\n this._settlingMs = opts.settlingMs !== undefined ? opts.settlingMs : 1500;\n this._tempoWindowSec = opts.tempoWindowSec || 6;\n this._enableTsDetection = opts.enableTimeSignatureDetection !== false;\n\n var numBins = this._fftSize >> 1;\n this._real = new Float32Array(this._fftSize);\n this._imag = new Float32Array(this._fftSize);\n this._mag = new Float32Array(numBins);\n this._ringBuffer = new Float32Array(this._fftSize);\n this._ringWritePos = 0;\n this._sampleCount = 0;\n this._hopAccum = 0;\n\n this._melBandFilters = buildMelFilterbank(this._melBands, 80, 8000, this._fftSize, this._sampleRate);\n this._melOut = new Float32Array(this._melBands);\n var fluxWindowLen = Math.ceil(this._tempoWindowSec * this._sampleRate / this._hopSize);\n this._fluxWindow = new Float32Array(fluxWindowLen);\n this._fluxWritePos = 0;\n this._fluxCount = 0;\n var LAG_K = 3;\n this._prevMelFrames = [];\n for (var i = 0; i < LAG_K; i++) {\n this._prevMelFrames.push(new Float32Array(this._melBands));\n }\n this._prevMelFrameIdx = 0;\n\n // Lag range in hops for BPM range\n this._minLag = Math.max(1, Math.round(60 / this._maxBpm * this._sampleRate / this._hopSize));\n this._maxLag = Math.round(60 / this._minBpm * this._sampleRate / this._hopSize);\n\n this._hopsSinceACF = 0;\n var ACF_INTERVAL = 15;\n this._acfInterval = ACF_INTERVAL;\n\n // Tempo state\n this._bestBpm = 0;\n this._bestScore = 0;\n this._candidates = [];\n\n // Phase state\n this._lastBeatSample = -1;\n this._ibiHistory = new Float32Array(4); // last 4 inter-beat intervals\n this._ibiIdx = 0;\n\n // Bar position state \u2014 parallel posteriors for 4/4 and 3/4\n this._posterior4 = new Float32Array([0.25, 0.25, 0.25, 0.25]);\n this._posterior3 = new Float32Array([1/3, 1/3, 1/3]);\n this._ts4Confidence = 0.5;\n this._ts3Confidence = 0.5;\n this._activeTs = '4/4';\n this._sustainCounter = 0;\n this._barPosition = 1; // 1-indexed\n this._barNumber = 0;\n this._beatsSinceStart = 0;\n\n // Confidence\n this._confidence = 0;\n\n // State snapshot cadence (~20 Hz)\n var STATE_INTERVAL_HOPS = Math.round(this._sampleRate / this._hopSize / 20);\n this._stateInterval = Math.max(1, STATE_INTERVAL_HOPS);\n this._hopsSinceState = 0;\n\n // Settling\n this._startSample = currentFrame;\n this._settledSamples = Math.round(this._settlingMs * 0.001 * this._sampleRate);\n\n // Lookahead\n this._lookahead = [];\n\n // RMS / onset state\n this._rms = 0;\n this._onsetStrength = 0;\n\n // Band energy (for state messages)\n var LOW_BANDS = Math.round(this._melBands * 0.25);\n var MID_BANDS = Math.round(this._melBands * 0.6);\n this._lowBandEnd = LOW_BANDS;\n this._midBandEnd = MID_BANDS;\n }\n\n process(inputs, _outputs, _parameters) {\n var input = inputs[0];\n if (!input || input.length === 0) return true;\n\n var left = input[0] || [];\n var right = input[1] || left;\n var blockLen = left.length;\n\n for (var s = 0; s < blockLen; s++) {\n // Mono downmix\n var mono = (left[s] + right[s]) * 0.5;\n\n // Accumulate RMS\n this._rms += mono * mono;\n\n // Fill ring buffer\n this._ringBuffer[this._ringWritePos] = mono;\n this._ringWritePos = (this._ringWritePos + 1) & (this._fftSize - 1);\n\n this._hopAccum++;\n this._sampleCount++;\n\n if (this._hopAccum >= this._hopSize) {\n this._hopAccum = 0;\n this._processHop();\n }\n }\n\n return true;\n }\n\n _processHop() {\n // Read ring buffer into real[] (oldest first)\n var rb = this._ringBuffer;\n var wp = this._ringWritePos;\n var n = this._fftSize;\n for (var i = 0; i < n; i++) {\n this._real[i] = rb[(wp + i) & (n - 1)];\n }\n\n // FFT\n fftInPlace(this._real, this._imag);\n\n // Magnitude spectrum\n var bins = n >> 1;\n for (var i = 0; i < bins; i++) {\n this._mag[i] = Math.sqrt(this._real[i]*this._real[i] + this._imag[i]*this._imag[i]);\n }\n\n // RMS (from time domain, using ring buffer)\n var rmsAccum = 0;\n for (var i = 0; i < n; i++) {\n rmsAccum += rb[(wp + i) & (n - 1)] * rb[(wp + i) & (n - 1)];\n }\n this._rms = Math.sqrt(rmsAccum / n);\n\n // Mel bands\n computeMelBands(this._mag, this._melBandFilters, this._melOut);\n\n // Spectral flux (SuperFlux-lite, lag k=3)\n var K = this._prevMelFrames.length;\n var flux = 0;\n for (var b = 0; b < this._melBands; b++) {\n var localMax = -Infinity;\n for (var k = 0; k < K; k++) {\n var prevVal = this._prevMelFrames[k][b];\n if (prevVal > localMax) localMax = prevVal;\n }\n var diff = this._melOut[b] - localMax;\n if (diff > 0) flux += diff;\n }\n this._onsetStrength = flux;\n\n // Store current mel frame in circular buffer\n var prevFrame = this._prevMelFrames[this._prevMelFrameIdx];\n for (var b = 0; b < this._melBands; b++) {\n prevFrame[b] = this._melOut[b];\n }\n this._prevMelFrameIdx = (this._prevMelFrameIdx + 1) % K;\n\n // Add flux to sliding window\n this._fluxWindow[this._fluxWritePos] = flux;\n this._fluxWritePos = (this._fluxWritePos + 1) % this._fluxWindow.length;\n if (this._fluxCount < this._fluxWindow.length) this._fluxCount++;\n\n // Tempogram: compute ACF periodically\n this._hopsSinceACF++;\n if (this._hopsSinceACF >= this._acfInterval && this._fluxCount >= this._maxLag + 1) {\n this._hopsSinceACF = 0;\n this._computeACFAndCandidates();\n }\n\n // Phase tracker\n var settled = (this._sampleCount - this._settledSamples) > 0;\n if (this._bestBpm > 0 && settled) {\n this._tickPhase(flux);\n }\n\n // State snapshot\n this._hopsSinceState++;\n if (this._hopsSinceState >= this._stateInterval) {\n this._hopsSinceState = 0;\n this._sendStateMessage();\n }\n }\n\n _computeACFAndCandidates() {\n var n = this._fluxCount;\n var buf = this._fluxWindow;\n var wp = this._fluxWritePos;\n var len = buf.length;\n\n // Compute ACF for lags in [minLag, maxLag]\n var numLags = this._maxLag - this._minLag + 1;\n var acf = new Float32Array(numLags);\n for (var lagIdx = 0; lagIdx < numLags; lagIdx++) {\n var lag = this._minLag + lagIdx;\n var sum = 0, count = 0;\n for (var t = lag; t < n; t++) {\n var idxT = (wp - 1 - (n - 1 - t) + len) % len;\n var idxTL = (wp - 1 - (n - 1 - (t - lag)) + len) % len;\n sum += buf[idxT] * buf[idxTL];\n count++;\n }\n acf[lagIdx] = count > 0 ? sum / count : 0;\n }\n\n // Normalise\n var norm = 0;\n for (var i = 0; i < numLags; i++) { if (acf[i] > norm) norm = acf[i]; }\n if (norm > 0) {\n for (var i = 0; i < numLags; i++) acf[i] /= norm;\n }\n\n // Find top peaks\n var peaks = [];\n for (var i = 1; i < numLags - 1; i++) {\n if (acf[i] > acf[i-1] && acf[i] > acf[i+1] && acf[i] > 0) {\n var lag2 = this._minLag + i;\n var bpm = 60 * this._sampleRate / (lag2 * this._hopSize);\n if (bpm >= this._minBpm && bpm <= this._maxBpm) {\n peaks.push({ bpm: bpm, score: acf[i], lag: lag2 });\n }\n }\n }\n peaks.sort(function(a, b) { return b.score - a.score; });\n this._candidates = peaks.slice(0, 3);\n\n if (this._candidates.length === 0) return;\n\n var top = this._candidates[0];\n\n // Hysteresis\n if (this._bestBpm <= 0) {\n // First lock\n this._bestBpm = top.bpm;\n this._bestScore = top.score;\n } else {\n var isOctave = (Math.abs(top.bpm / this._bestBpm - 2) < 0.1) ||\n (Math.abs(top.bpm / this._bestBpm - 0.5) < 0.05);\n var margin = isOctave ? 1.5 : 1.15;\n if (top.score > this._bestScore * margin) {\n var oldBpm = this._bestBpm;\n this._bestBpm = top.bpm;\n this._bestScore = top.score;\n // Only fire tempoChange if > 5% different\n if (Math.abs(this._bestBpm - oldBpm) / oldBpm > 0.05) {\n this.port.postMessage({ type: 'tempoChange', newTempo: this._bestBpm, oldTempo: oldBpm });\n }\n } else {\n this._bestScore = this._bestScore * 0.99 + top.score * 0.01; // slowly decay\n }\n }\n\n this._updateConfidence();\n }\n\n _tickPhase(flux) {\n if (this._lastBeatSample < 0) {\n // Bootstrap: set first beat at current sample\n this._lastBeatSample = this._sampleCount;\n return;\n }\n\n var beatIntervalSamples = 60 / this._bestBpm * this._sampleRate;\n var phase = (this._sampleCount - this._lastBeatSample) / beatIntervalSamples;\n\n // Snap correction: if novelty peak is strong and phase is 0.7..1.3, snap\n if (phase >= 0.7 && phase <= 1.3 && flux > 0) {\n // Compute mean recent flux\n var recentMean = 0;\n var count = Math.min(this._fluxCount, 16);\n var wp = this._fluxWritePos;\n var len = this._fluxWindow.length;\n for (var i = 0; i < count; i++) {\n recentMean += this._fluxWindow[(wp - 1 - i + len) % len];\n }\n recentMean /= count || 1;\n if (flux > 1.5 * recentMean && recentMean > 0) {\n // Snap to this sample\n this._lastBeatSample = this._sampleCount;\n phase = 1.0;\n }\n }\n\n if (phase >= 1.0) {\n var beatTime = (this._lastBeatSample + beatIntervalSamples) / this._sampleRate;\n this._lastBeatSample += beatIntervalSamples;\n\n // Update IBI history\n this._ibiHistory[this._ibiIdx] = beatIntervalSamples;\n this._ibiIdx = (this._ibiIdx + 1) & 3;\n\n this._beatsSinceStart++;\n\n // Update bar position\n this._updateBarPosition(flux);\n\n // Compute confidence\n this._updateConfidence();\n\n // Lookahead\n this._updateLookahead(beatTime);\n\n var isDownbeat = this._barPosition === 1;\n var beatInfo = {\n type: 'beat',\n audioTime: beatTime,\n tempo: this._bestBpm,\n confidence: this._confidence,\n beatPhase: 0,\n energy: flux,\n isDownbeat: isDownbeat,\n beatInBar: this._barPosition,\n };\n this.port.postMessage(beatInfo);\n\n if (isDownbeat) {\n this.port.postMessage({\n type: 'barStart',\n audioTime: beatTime,\n tempo: this._bestBpm,\n confidence: this._confidence,\n barNumber: this._barNumber,\n });\n }\n }\n }\n\n _computeBeatLikelihood(flux) {\n var count = Math.min(this._fluxCount, 32);\n var wp = this._fluxWritePos;\n var len = this._fluxWindow.length;\n var totalFlux = 0;\n for (var i = 0; i < count; i++) {\n totalFlux += this._fluxWindow[(wp - 1 - i + len) % len];\n }\n var mean = count > 0 ? totalFlux / count : 1;\n return Math.max(0.5, Math.min(1.5, mean > 0 ? flux / mean : 1));\n }\n\n _updateBarPosition(flux) {\n var likelihood = this._computeBeatLikelihood(flux);\n\n // --- 4/4 posterior ---\n var p4 = this._posterior4;\n var s4 = new Float32Array(4);\n s4[0] = p4[3]; s4[1] = p4[0]; s4[2] = p4[1]; s4[3] = p4[2];\n var sum4 = 0;\n for (var i = 0; i < 4; i++) {\n p4[i] = s4[i] * (likelihood + (i === 0 ? 0.3 : 0));\n sum4 += p4[i];\n }\n if (sum4 > 0) { for (var i = 0; i < 4; i++) p4[i] /= sum4; }\n\n // --- 3/4 posterior ---\n var p3 = this._posterior3;\n var s3 = new Float32Array(3);\n s3[0] = p3[2]; s3[1] = p3[0]; s3[2] = p3[1];\n var sum3 = 0;\n for (var i = 0; i < 3; i++) {\n p3[i] = s3[i] * (likelihood + (i === 0 ? 0.3 : 0));\n sum3 += p3[i];\n }\n if (sum3 > 0) { for (var i = 0; i < 3; i++) p3[i] /= sum3; }\n\n // --- Update TS confidences (EMA) ---\n var max4 = 0;\n for (var i = 0; i < 4; i++) { if (p4[i] > max4) max4 = p4[i]; }\n var max3 = 0;\n for (var i = 0; i < 3; i++) { if (p3[i] > max3) max3 = p3[i]; }\n var alpha = 0.1;\n this._ts4Confidence = (1 - alpha) * this._ts4Confidence + alpha * max4;\n this._ts3Confidence = (1 - alpha) * this._ts3Confidence + alpha * max3;\n\n // --- Hysteresis switching ---\n if (this._enableTsDetection && this._beatsSinceStart > 8) {\n var minSwitchMargin = 1.4;\n var minSustainBeats = 12; // ~4 bars * 3 beats\n var threeFavored = this._ts3Confidence > this._ts4Confidence * minSwitchMargin;\n var fourFavored = this._ts4Confidence > this._ts3Confidence * minSwitchMargin;\n\n if (this._activeTs === '4/4' && threeFavored) {\n this._sustainCounter++;\n if (this._sustainCounter >= minSustainBeats) {\n this._activeTs = '3/4';\n this._sustainCounter = 0;\n }\n } else if (this._activeTs === '3/4' && fourFavored) {\n this._sustainCounter++;\n if (this._sustainCounter >= minSustainBeats + 4) { // 16 beats for 4/4\n this._activeTs = '4/4';\n this._sustainCounter = 0;\n }\n } else {\n this._sustainCounter = 0;\n }\n }\n\n // --- Determine bar position from active TS ---\n var barLen = this._activeTs === '3/4' ? 3 : 4;\n var posterior = this._activeTs === '3/4' ? p3 : p4;\n\n if (this._beatsSinceStart >= barLen) {\n var maxP = -1, maxI = 0;\n for (var i = 0; i < barLen; i++) {\n if (posterior[i] > maxP) { maxP = posterior[i]; maxI = i; }\n }\n var newPos = maxI + 1; // 1-indexed\n if (newPos === 1 && this._barPosition !== 1) {\n this._barNumber++;\n }\n this._barPosition = newPos;\n } else {\n // Just advance sequentially\n this._barPosition = ((this._barPosition) % barLen) + 1;\n if (this._barPosition === 1) this._barNumber++;\n }\n }\n\n _updateConfidence() {\n if (this._candidates.length === 0) {\n this._confidence = 0;\n return;\n }\n\n // Peak contrast\n var top1 = this._candidates[0] ? this._candidates[0].score : 0;\n var top2 = this._candidates[1] ? this._candidates[1].score : top1;\n var top3 = this._candidates[2] ? this._candidates[2].score : top2;\n var peakContrast = (top2 + top3) > 0 ? top1 / ((top2 + top3) / 2) : 1;\n\n // Phase consistency from IBI variance\n var ibiMean = 0;\n for (var i = 0; i < 4; i++) ibiMean += this._ibiHistory[i];\n ibiMean /= 4;\n var ibiVar = 0;\n for (var i = 0; i < 4; i++) {\n var d = this._ibiHistory[i] - ibiMean;\n ibiVar += d * d;\n }\n ibiVar /= 4;\n var phaseConsistency = ibiMean > 0 ? Math.max(0, 1 - ibiVar / (ibiMean * ibiMean)) : 0;\n\n // Bar consistency (use the active posterior)\n var activePosterior = this._activeTs === '3/4' ? this._posterior3 : this._posterior4;\n var activeLen = this._activeTs === '3/4' ? 3 : 4;\n var maxP = 0;\n for (var i = 0; i < activeLen; i++) {\n if (activePosterior[i] > maxP) maxP = activePosterior[i];\n }\n var barConsistency = maxP;\n\n var c = Math.sqrt(Math.max(0, peakContrast / 2)) *\n Math.sqrt(Math.max(0, phaseConsistency)) *\n (0.5 + 0.5 * barConsistency);\n this._confidence = Math.max(0, Math.min(1, c));\n }\n\n _updateLookahead(lastBeatTime) {\n var lookahead = [];\n var beatInterval = 60 / this._bestBpm;\n var barPos = this._barPosition;\n var barLen = this._activeTs === '3/4' ? 3 : 4;\n for (var i = 0; i < 8; i++) {\n var t = lastBeatTime + (i + 1) * beatInterval;\n var bp = ((barPos - 1 + i) % barLen) + 1;\n lookahead.push({\n audioTime: t,\n tempo: this._bestBpm,\n isDownbeat: bp === 1,\n beatInBar: bp,\n });\n }\n this._lookahead = lookahead;\n }\n\n _computeBandEnergy() {\n var low = 0, mid = 0, high = 0;\n for (var b = 0; b < this._lowBandEnd; b++) low += this._melOut[b];\n for (var b = this._lowBandEnd; b < this._midBandEnd; b++) mid += this._melOut[b];\n for (var b = this._midBandEnd; b < this._melBands; b++) high += this._melOut[b];\n var denom = this._lowBandEnd || 1;\n return {\n low: low / denom,\n mid: mid / Math.max(1, this._midBandEnd - this._lowBandEnd),\n high: high / Math.max(1, this._melBands - this._midBandEnd),\n };\n }\n\n _sendStateMessage() {\n var settled = (this._sampleCount - this._settledSamples) > 0;\n var beatInterval = this._bestBpm > 0 ? 60 / this._bestBpm : 0;\n var currentTime = this._sampleCount / this._sampleRate;\n var lastBeatTime = this._lastBeatSample >= 0 ? this._lastBeatSample / this._sampleRate : 0;\n var beatPhase = beatInterval > 0\n ? Math.min(1, (currentTime - lastBeatTime) / beatInterval)\n : 0;\n var nextBeatTime = lastBeatTime + beatInterval;\n\n var nextDownbeatTime = nextBeatTime;\n for (var i = 0; i < this._lookahead.length; i++) {\n if (this._lookahead[i].isDownbeat) {\n nextDownbeatTime = this._lookahead[i].audioTime;\n break;\n }\n }\n\n var be = this._computeBandEnergy();\n\n this.port.postMessage({\n type: 'state',\n tempo: settled ? this._bestBpm : 0,\n beatPhase: beatPhase,\n confidence: settled ? this._confidence : 0,\n gridStability: settled ? this._confidence : 0,\n tempoCandidates: settled ? this._candidates.map(function(c) {\n return { bpm: c.bpm, score: c.score };\n }) : [],\n rms: this._rms,\n onsetStrength: this._onsetStrength,\n bandEnergy: be,\n barPosition: this._barPosition,\n barLength: this._activeTs === '3/4' ? 3 : 4,\n timeSignature: this._activeTs === '3/4'\n ? { numerator: 3, denominator: 4 }\n : { numerator: 4, denominator: 4 },\n lookahead: this._lookahead,\n nextBeatTime: settled ? nextBeatTime : 0,\n nextDownbeatTime: settled ? nextDownbeatTime : 0,\n });\n }\n}\n\nregisterProcessor('exojs-beat-detector', BeatDetectorProcessor);\n";
|
|
2
|
-
//# sourceMappingURL=beat-detector.worklet.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"beat-detector.worklet.d.ts","sourceRoot":"","sources":["../../../../src/audio/worklets/beat-detector.worklet.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,+wvBAmoBrC,CAAC"}
|