@codexo/exojs 0.6.12 → 0.7.12
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 +1424 -0
- package/dist/esm/animation/Tween.d.ts +60 -1
- package/dist/esm/animation/Tween.js +60 -1
- package/dist/esm/animation/Tween.js.map +1 -1
- package/dist/esm/animation/TweenManager.d.ts +10 -0
- package/dist/esm/animation/TweenManager.js +10 -0
- package/dist/esm/animation/TweenManager.js.map +1 -1
- package/dist/esm/animation/types.d.ts +15 -0
- package/dist/esm/animation/types.js +6 -0
- package/dist/esm/animation/types.js.map +1 -1
- package/dist/esm/audio/AbstractMedia.d.ts +29 -0
- package/dist/esm/audio/AbstractMedia.js +76 -0
- package/dist/esm/audio/AbstractMedia.js.map +1 -1
- package/dist/esm/audio/AudioAnalyser.d.ts +83 -23
- package/dist/esm/audio/AudioAnalyser.js +277 -57
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/audio/AudioBus.d.ts +82 -0
- package/dist/esm/audio/AudioBus.js +255 -0
- package/dist/esm/audio/AudioBus.js.map +1 -0
- package/dist/esm/audio/AudioFilter.d.ts +16 -0
- package/dist/esm/audio/AudioFilter.js +13 -0
- package/dist/esm/audio/AudioFilter.js.map +1 -0
- package/dist/esm/audio/AudioListener.d.ts +39 -0
- package/dist/esm/audio/AudioListener.js +97 -0
- package/dist/esm/audio/AudioListener.js.map +1 -0
- package/dist/esm/audio/AudioManager.d.ts +68 -0
- package/dist/esm/audio/AudioManager.js +139 -0
- package/dist/esm/audio/AudioManager.js.map +1 -0
- package/dist/esm/audio/BeatDetector.d.ts +142 -0
- package/dist/esm/audio/BeatDetector.js +957 -0
- package/dist/esm/audio/BeatDetector.js.map +1 -0
- package/dist/esm/audio/Envelope.d.ts +44 -0
- package/dist/esm/audio/Envelope.js +60 -0
- package/dist/esm/audio/Envelope.js.map +1 -0
- package/dist/esm/audio/Media.d.ts +11 -0
- package/dist/esm/audio/Music.d.ts +20 -0
- package/dist/esm/audio/Music.js +45 -4
- package/dist/esm/audio/Music.js.map +1 -1
- package/dist/esm/audio/OscillatorSound.d.ts +98 -0
- package/dist/esm/audio/OscillatorSound.js +342 -0
- package/dist/esm/audio/OscillatorSound.js.map +1 -0
- package/dist/esm/audio/Sound.d.ts +119 -9
- package/dist/esm/audio/Sound.js +301 -117
- package/dist/esm/audio/Sound.js.map +1 -1
- package/dist/esm/audio/audio-context.d.ts +48 -0
- package/dist/esm/audio/audio-context.js +48 -5
- package/dist/esm/audio/audio-context.js.map +1 -1
- package/dist/esm/audio/crossFade.d.ts +19 -0
- package/dist/esm/audio/crossFade.js +26 -0
- package/dist/esm/audio/crossFade.js.map +1 -0
- package/dist/esm/audio/dsp/fft.d.ts +22 -0
- package/dist/esm/audio/dsp/mel.d.ts +43 -0
- package/dist/esm/audio/dsp/tempogram.d.ts +51 -0
- package/dist/esm/audio/filters/ChorusFilter.d.ts +52 -0
- package/dist/esm/audio/filters/ChorusFilter.js +143 -0
- package/dist/esm/audio/filters/ChorusFilter.js.map +1 -0
- package/dist/esm/audio/filters/CompressorFilter.d.ts +43 -0
- package/dist/esm/audio/filters/CompressorFilter.js +108 -0
- package/dist/esm/audio/filters/CompressorFilter.js.map +1 -0
- package/dist/esm/audio/filters/DelayFilter.d.ts +34 -0
- package/dist/esm/audio/filters/DelayFilter.js +110 -0
- package/dist/esm/audio/filters/DelayFilter.js.map +1 -0
- package/dist/esm/audio/filters/DuckingFilter.d.ts +44 -0
- package/dist/esm/audio/filters/DuckingFilter.js +164 -0
- package/dist/esm/audio/filters/DuckingFilter.js.map +1 -0
- package/dist/esm/audio/filters/EqualizerFilter.d.ts +49 -0
- package/dist/esm/audio/filters/EqualizerFilter.js +134 -0
- package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -0
- package/dist/esm/audio/filters/GranularFilter.d.ts +62 -0
- package/dist/esm/audio/filters/GranularFilter.js +176 -0
- package/dist/esm/audio/filters/GranularFilter.js.map +1 -0
- package/dist/esm/audio/filters/HighpassFilter.d.ts +29 -0
- package/dist/esm/audio/filters/HighpassFilter.js +71 -0
- package/dist/esm/audio/filters/HighpassFilter.js.map +1 -0
- package/dist/esm/audio/filters/LowpassFilter.d.ts +29 -0
- package/dist/esm/audio/filters/LowpassFilter.js +71 -0
- package/dist/esm/audio/filters/LowpassFilter.js.map +1 -0
- package/dist/esm/audio/filters/PitchShiftFilter.d.ts +44 -0
- package/dist/esm/audio/filters/PitchShiftFilter.js +132 -0
- package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -0
- package/dist/esm/audio/filters/ReverbFilter.d.ts +36 -0
- package/dist/esm/audio/filters/ReverbFilter.js +118 -0
- package/dist/esm/audio/filters/ReverbFilter.js.map +1 -0
- package/dist/esm/audio/filters/VocoderFilter.d.ts +49 -0
- package/dist/esm/audio/filters/VocoderFilter.js +174 -0
- package/dist/esm/audio/filters/VocoderFilter.js.map +1 -0
- package/dist/esm/audio/filters/WorkletFilter.d.ts +51 -0
- package/dist/esm/audio/filters/WorkletFilter.js +106 -0
- package/dist/esm/audio/filters/WorkletFilter.js.map +1 -0
- package/dist/esm/audio/filters/index.d.ts +12 -0
- package/dist/esm/audio/index.d.ts +15 -1
- package/dist/esm/audio/worklet/registerWorklet.d.ts +10 -0
- package/dist/esm/audio/worklet/registerWorklet.js +44 -0
- package/dist/esm/audio/worklet/registerWorklet.js.map +1 -0
- package/dist/esm/core/Application.d.ts +82 -0
- package/dist/esm/core/Application.js +137 -2
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Bounds.d.ts +23 -0
- package/dist/esm/core/Bounds.js +23 -0
- package/dist/esm/core/Bounds.js.map +1 -1
- package/dist/esm/core/Clock.d.ts +21 -0
- package/dist/esm/core/Clock.js +21 -0
- package/dist/esm/core/Clock.js.map +1 -1
- package/dist/esm/core/Color.d.ts +35 -0
- package/dist/esm/core/Color.js +35 -0
- package/dist/esm/core/Color.js.map +1 -1
- package/dist/esm/core/Scene.d.ts +46 -0
- package/dist/esm/core/Scene.js +27 -0
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.d.ts +62 -0
- package/dist/esm/core/SceneManager.js +49 -0
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +40 -1
- package/dist/esm/core/SceneNode.js +75 -6
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Signal.d.ts +44 -0
- package/dist/esm/core/Signal.js +39 -0
- package/dist/esm/core/Signal.js.map +1 -1
- package/dist/esm/core/Time.d.ts +21 -0
- package/dist/esm/core/Time.js +22 -1
- package/dist/esm/core/Time.js.map +1 -1
- package/dist/esm/core/Timer.d.ts +7 -0
- package/dist/esm/core/Timer.js +7 -0
- package/dist/esm/core/Timer.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +12 -0
- package/dist/esm/core/capabilities.js +12 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/index.d.ts +0 -1
- package/dist/esm/core/types.d.ts +37 -0
- package/dist/esm/core/utils.d.ts +48 -0
- package/dist/esm/core/utils.js +48 -0
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.d.ts +26 -0
- package/dist/esm/debug/BoundingBoxesLayer.js +136 -0
- package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -0
- package/dist/esm/debug/DebugLayer.d.ts +42 -0
- package/dist/esm/debug/DebugLayer.js +34 -0
- package/dist/esm/debug/DebugLayer.js.map +1 -0
- package/dist/esm/debug/DebugOverlay.d.ts +59 -0
- package/dist/esm/debug/DebugOverlay.js +123 -0
- package/dist/esm/debug/DebugOverlay.js.map +1 -0
- package/dist/esm/debug/HitTestLayer.d.ts +32 -0
- package/dist/esm/debug/HitTestLayer.js +118 -0
- package/dist/esm/debug/HitTestLayer.js.map +1 -0
- package/dist/esm/debug/PerformanceLayer.d.ts +37 -0
- package/dist/esm/debug/PerformanceLayer.js +193 -0
- package/dist/esm/debug/PerformanceLayer.js.map +1 -0
- package/dist/esm/debug/PointerStackLayer.d.ts +31 -0
- package/dist/esm/debug/PointerStackLayer.js +160 -0
- package/dist/esm/debug/PointerStackLayer.js.map +1 -0
- package/dist/esm/debug/index.d.ts +6 -0
- package/dist/esm/debug/index.js +7 -0
- package/dist/esm/debug/index.js.map +1 -0
- package/dist/esm/index.js +30 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/ArcadeStickGamepadMapping.d.ts +7 -0
- package/dist/esm/input/ArcadeStickGamepadMapping.js +7 -0
- package/dist/esm/input/ArcadeStickGamepadMapping.js.map +1 -1
- package/dist/esm/input/GameCubeGamepadMapping.d.ts +9 -0
- package/dist/esm/input/GameCubeGamepadMapping.js +9 -0
- package/dist/esm/input/GameCubeGamepadMapping.js.map +1 -1
- package/dist/esm/input/Gamepad.d.ts +48 -0
- package/dist/esm/input/Gamepad.js +43 -0
- package/dist/esm/input/Gamepad.js.map +1 -1
- package/dist/esm/input/GamepadChannels.d.ts +8 -0
- package/dist/esm/input/GamepadChannels.js +8 -0
- package/dist/esm/input/GamepadChannels.js.map +1 -1
- package/dist/esm/input/GamepadControl.d.ts +18 -0
- package/dist/esm/input/GamepadControl.js +13 -0
- package/dist/esm/input/GamepadControl.js.map +1 -1
- package/dist/esm/input/GamepadDefinitions.d.ts +64 -1
- package/dist/esm/input/GamepadDefinitions.js +40 -1
- package/dist/esm/input/GamepadDefinitions.js.map +1 -1
- package/dist/esm/input/GamepadMapping.d.ts +32 -2
- package/dist/esm/input/GamepadMapping.js +24 -0
- package/dist/esm/input/GamepadMapping.js.map +1 -1
- package/dist/esm/input/GamepadPromptLayouts.d.ts +32 -1
- package/dist/esm/input/GamepadPromptLayouts.js +25 -1
- package/dist/esm/input/GamepadPromptLayouts.js.map +1 -1
- package/dist/esm/input/GenericDualAnalogGamepadMapping.d.ts +10 -0
- package/dist/esm/input/GenericDualAnalogGamepadMapping.js +10 -0
- package/dist/esm/input/GenericDualAnalogGamepadMapping.js.map +1 -1
- package/dist/esm/input/GestureRecognizer.d.ts +11 -2
- package/dist/esm/input/GestureRecognizer.js +11 -2
- package/dist/esm/input/GestureRecognizer.js.map +1 -1
- package/dist/esm/input/Input.d.ts +24 -0
- package/dist/esm/input/Input.js +22 -0
- package/dist/esm/input/Input.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts +43 -0
- package/dist/esm/input/InputManager.js +68 -5
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionEvent.d.ts +31 -0
- package/dist/esm/input/InteractionEvent.js +37 -0
- package/dist/esm/input/InteractionEvent.js.map +1 -0
- package/dist/esm/input/InteractionManager.d.ts +163 -0
- package/dist/esm/input/InteractionManager.js +575 -0
- package/dist/esm/input/InteractionManager.js.map +1 -0
- package/dist/esm/input/JoyConLeftGamepadMapping.d.ts +9 -0
- package/dist/esm/input/JoyConLeftGamepadMapping.js +9 -0
- package/dist/esm/input/JoyConLeftGamepadMapping.js.map +1 -1
- package/dist/esm/input/JoyConRightGamepadMapping.d.ts +9 -0
- package/dist/esm/input/JoyConRightGamepadMapping.js +9 -0
- package/dist/esm/input/JoyConRightGamepadMapping.js.map +1 -1
- package/dist/esm/input/PlayStationGamepadMapping.d.ts +8 -0
- package/dist/esm/input/PlayStationGamepadMapping.js +8 -0
- package/dist/esm/input/PlayStationGamepadMapping.js.map +1 -1
- package/dist/esm/input/Pointer.d.ts +22 -0
- package/dist/esm/input/Pointer.js +22 -0
- package/dist/esm/input/Pointer.js.map +1 -1
- package/dist/esm/input/SteamControllerGamepadMapping.d.ts +8 -0
- package/dist/esm/input/SteamControllerGamepadMapping.js +8 -0
- package/dist/esm/input/SteamControllerGamepadMapping.js.map +1 -1
- package/dist/esm/input/SwitchProGamepadMapping.d.ts +9 -0
- package/dist/esm/input/SwitchProGamepadMapping.js +9 -0
- package/dist/esm/input/SwitchProGamepadMapping.js.map +1 -1
- package/dist/esm/input/XboxGamepadMapping.d.ts +8 -0
- package/dist/esm/input/XboxGamepadMapping.js +8 -0
- package/dist/esm/input/XboxGamepadMapping.js.map +1 -1
- package/dist/esm/input/index.d.ts +2 -0
- package/dist/esm/input/interaction-hooks.d.ts +34 -0
- package/dist/esm/input/interaction-hooks.js +35 -0
- package/dist/esm/input/interaction-hooks.js.map +1 -0
- package/dist/esm/input/types.d.ts +20 -0
- package/dist/esm/input/types.js +20 -0
- package/dist/esm/input/types.js.map +1 -1
- package/dist/esm/math/AbstractVector.d.ts +83 -0
- package/dist/esm/math/AbstractVector.js +83 -0
- package/dist/esm/math/AbstractVector.js.map +1 -1
- package/dist/esm/math/Circle.d.ts +44 -2
- package/dist/esm/math/Circle.js +116 -16
- package/dist/esm/math/Circle.js.map +1 -1
- package/dist/esm/math/CircleLike.d.ts +1 -0
- package/dist/esm/math/Collision.d.ts +39 -0
- package/dist/esm/math/Collision.js +5 -0
- package/dist/esm/math/Collision.js.map +1 -1
- package/dist/esm/math/Ellipse.d.ts +11 -0
- package/dist/esm/math/Ellipse.js +18 -2
- package/dist/esm/math/Ellipse.js.map +1 -1
- package/dist/esm/math/EllipseLike.d.ts +3 -0
- package/dist/esm/math/Flags.d.ts +31 -0
- package/dist/esm/math/Flags.js +31 -0
- package/dist/esm/math/Flags.js.map +1 -1
- package/dist/esm/math/Interval.d.ts +15 -0
- package/dist/esm/math/Interval.js +16 -1
- package/dist/esm/math/Interval.js.map +1 -1
- package/dist/esm/math/Line.d.ts +17 -1
- package/dist/esm/math/Line.js +17 -1
- package/dist/esm/math/Line.js.map +1 -1
- package/dist/esm/math/LineLike.d.ts +1 -0
- package/dist/esm/math/Matrix.d.ts +44 -3
- package/dist/esm/math/Matrix.js +44 -3
- package/dist/esm/math/Matrix.js.map +1 -1
- package/dist/esm/math/ObservableSize.d.ts +7 -0
- package/dist/esm/math/ObservableSize.js +7 -0
- package/dist/esm/math/ObservableSize.js.map +1 -1
- package/dist/esm/math/ObservableVector.d.ts +11 -2
- package/dist/esm/math/ObservableVector.js +13 -2
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/PointLike.d.ts +1 -0
- package/dist/esm/math/PolarVector.d.ts +15 -0
- package/dist/esm/math/PolarVector.js +16 -1
- package/dist/esm/math/PolarVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts +35 -1
- package/dist/esm/math/Polygon.js +78 -6
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/PolygonLike.d.ts +4 -0
- package/dist/esm/math/Quadtree.d.ts +84 -0
- package/dist/esm/math/Quadtree.js +204 -0
- package/dist/esm/math/Quadtree.js.map +1 -0
- package/dist/esm/math/Random.d.ts +25 -0
- package/dist/esm/math/Random.js +26 -1
- package/dist/esm/math/Random.js.map +1 -1
- package/dist/esm/math/Rectangle.d.ts +15 -0
- package/dist/esm/math/Rectangle.js +17 -2
- package/dist/esm/math/Rectangle.js.map +1 -1
- package/dist/esm/math/RectangleLike.d.ts +1 -0
- package/dist/esm/math/Segment.d.ts +7 -0
- package/dist/esm/math/Segment.js +7 -0
- package/dist/esm/math/Segment.js.map +1 -1
- package/dist/esm/math/ShapeLike.d.ts +6 -0
- package/dist/esm/math/Size.d.ts +9 -0
- package/dist/esm/math/Size.js +10 -1
- package/dist/esm/math/Size.js.map +1 -1
- package/dist/esm/math/Vector.d.ts +16 -0
- package/dist/esm/math/Vector.js +17 -1
- package/dist/esm/math/Vector.js.map +1 -1
- package/dist/esm/math/collision-detection.d.ts +47 -1
- package/dist/esm/math/collision-detection.js +231 -17
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/collision-primitives.d.ts +23 -0
- package/dist/esm/math/collision-primitives.js +23 -0
- package/dist/esm/math/collision-primitives.js.map +1 -1
- package/dist/esm/math/geometry.d.ts +42 -0
- package/dist/esm/math/geometry.js +37 -0
- package/dist/esm/math/geometry.js.map +1 -1
- package/dist/esm/math/index.d.ts +1 -0
- package/dist/esm/math/utils.d.ts +41 -0
- package/dist/esm/math/utils.js +41 -0
- package/dist/esm/math/utils.js.map +1 -1
- package/dist/esm/particles/Particle.d.ts +37 -0
- package/dist/esm/particles/Particle.js +37 -0
- package/dist/esm/particles/Particle.js.map +1 -1
- package/dist/esm/particles/ParticleProperties.d.ts +15 -0
- package/dist/esm/particles/ParticleSystem.d.ts +69 -0
- package/dist/esm/particles/ParticleSystem.js +70 -0
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/affectors/ColorAffector.d.ts +13 -0
- package/dist/esm/particles/affectors/ColorAffector.js +13 -0
- package/dist/esm/particles/affectors/ColorAffector.js.map +1 -1
- package/dist/esm/particles/affectors/ForceAffector.d.ts +11 -0
- package/dist/esm/particles/affectors/ForceAffector.js +11 -0
- package/dist/esm/particles/affectors/ForceAffector.js.map +1 -1
- package/dist/esm/particles/affectors/ParticleAffector.d.ts +13 -0
- package/dist/esm/particles/affectors/ScaleAffector.d.ts +10 -0
- package/dist/esm/particles/affectors/ScaleAffector.js +10 -0
- package/dist/esm/particles/affectors/ScaleAffector.js.map +1 -1
- package/dist/esm/particles/affectors/TorqueAffector.d.ts +11 -0
- package/dist/esm/particles/affectors/TorqueAffector.js +12 -1
- package/dist/esm/particles/affectors/TorqueAffector.js.map +1 -1
- package/dist/esm/particles/emitters/ParticleEmitter.d.ts +13 -0
- package/dist/esm/particles/emitters/ParticleOptions.d.ts +16 -0
- package/dist/esm/particles/emitters/ParticleOptions.js +16 -0
- package/dist/esm/particles/emitters/ParticleOptions.js.map +1 -1
- package/dist/esm/particles/emitters/UniversalEmitter.d.ts +23 -0
- package/dist/esm/particles/emitters/UniversalEmitter.js +23 -0
- package/dist/esm/particles/emitters/UniversalEmitter.js.map +1 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +12 -0
- package/dist/esm/rendering/CallbackRenderPass.js +12 -0
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Container.d.ts +44 -0
- package/dist/esm/rendering/Container.js +62 -0
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +22 -0
- package/dist/esm/rendering/Drawable.js +22 -0
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +13 -0
- package/dist/esm/rendering/RenderBackendType.d.ts +4 -0
- package/dist/esm/rendering/RenderBackendType.js +4 -0
- package/dist/esm/rendering/RenderBackendType.js.map +1 -1
- package/dist/esm/rendering/RenderNode.d.ts +45 -0
- package/dist/esm/rendering/RenderNode.js +62 -0
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +8 -0
- package/dist/esm/rendering/RenderStats.d.ts +19 -0
- package/dist/esm/rendering/RenderStats.js +7 -0
- package/dist/esm/rendering/RenderStats.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +17 -0
- package/dist/esm/rendering/RenderTarget.js +17 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.d.ts +11 -0
- package/dist/esm/rendering/RenderTargetPass.js +7 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/Renderer.d.ts +15 -0
- package/dist/esm/rendering/RendererRegistry.d.ts +7 -0
- package/dist/esm/rendering/RendererRegistry.js +7 -0
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/View.d.ts +73 -6
- package/dist/esm/rendering/View.js +69 -2
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/BlurFilter.d.ts +9 -0
- package/dist/esm/rendering/filters/BlurFilter.js +8 -0
- package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
- package/dist/esm/rendering/filters/ColorFilter.d.ts +7 -0
- package/dist/esm/rendering/filters/ColorFilter.js +7 -0
- package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
- package/dist/esm/rendering/filters/Filter.d.ts +23 -0
- package/dist/esm/rendering/filters/Filter.js +20 -0
- package/dist/esm/rendering/filters/Filter.js.map +1 -1
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +114 -0
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +273 -0
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +116 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +402 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +3 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +2 -0
- package/dist/esm/rendering/mesh/Mesh.js +3 -0
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/primitives/Graphics.d.ts +34 -0
- package/dist/esm/rendering/primitives/Graphics.js +34 -0
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/shader/Shader.d.ts +36 -0
- package/dist/esm/rendering/shader/Shader.js +26 -0
- package/dist/esm/rendering/shader/Shader.js.map +1 -1
- package/dist/esm/rendering/shader/ShaderAttribute.d.ts +13 -0
- package/dist/esm/rendering/shader/ShaderAttribute.js +13 -0
- package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
- package/dist/esm/rendering/shader/ShaderUniform.d.ts +27 -0
- package/dist/esm/rendering/shader/ShaderUniform.js +28 -1
- package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
- package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +38 -0
- package/dist/esm/rendering/sprite/AnimatedSprite.js +36 -0
- package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts +62 -1
- package/dist/esm/rendering/sprite/Sprite.js +97 -19
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/Spritesheet.d.ts +25 -0
- package/dist/esm/rendering/sprite/Spritesheet.js +20 -0
- package/dist/esm/rendering/sprite/Spritesheet.js.map +1 -1
- package/dist/esm/rendering/text/Text.d.ts +2 -0
- package/dist/esm/rendering/text/Text.js +2 -0
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/text/TextStyle.d.ts +29 -0
- package/dist/esm/rendering/text/TextStyle.js +24 -0
- package/dist/esm/rendering/text/TextStyle.js.map +1 -1
- package/dist/esm/rendering/text/types.d.ts +1 -0
- package/dist/esm/rendering/texture/RenderTexture.d.ts +16 -0
- package/dist/esm/rendering/texture/RenderTexture.js +16 -0
- package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
- package/dist/esm/rendering/texture/Sampler.d.ts +23 -0
- package/dist/esm/rendering/texture/Sampler.js +13 -0
- package/dist/esm/rendering/texture/Sampler.js.map +1 -1
- package/dist/esm/rendering/texture/Texture.d.ts +30 -0
- package/dist/esm/rendering/texture/Texture.js +30 -0
- package/dist/esm/rendering/texture/Texture.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +29 -0
- package/dist/esm/rendering/types.js +29 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/utils.d.ts +20 -0
- package/dist/esm/rendering/utils.js +10 -0
- package/dist/esm/rendering/utils.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +39 -1
- package/dist/esm/rendering/video/Video.js +68 -6
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +7 -0
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +7 -0
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +17 -4
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +20 -16
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +8 -0
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +8 -0
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +45 -8
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +160 -40
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/resources/AbstractAssetFactory.d.ts +20 -0
- package/dist/esm/resources/AbstractAssetFactory.js +20 -0
- package/dist/esm/resources/AbstractAssetFactory.js.map +1 -1
- package/dist/esm/resources/AssetFactory.d.ts +26 -0
- package/dist/esm/resources/AssetManifest.d.ts +45 -0
- package/dist/esm/resources/AssetManifest.js +25 -0
- package/dist/esm/resources/AssetManifest.js.map +1 -1
- package/dist/esm/resources/CacheFirstStrategy.d.ts +12 -0
- package/dist/esm/resources/CacheFirstStrategy.js +12 -0
- package/dist/esm/resources/CacheFirstStrategy.js.map +1 -1
- package/dist/esm/resources/CacheStore.d.ts +23 -0
- package/dist/esm/resources/CacheStrategy.d.ts +20 -0
- package/dist/esm/resources/Database.d.ts +45 -0
- package/dist/esm/resources/FactoryRegistry.d.ts +28 -0
- package/dist/esm/resources/FactoryRegistry.js +24 -0
- package/dist/esm/resources/FactoryRegistry.js.map +1 -1
- package/dist/esm/resources/IndexedDbDatabase.d.ts +22 -1
- package/dist/esm/resources/IndexedDbDatabase.js +21 -0
- package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
- package/dist/esm/resources/IndexedDbStore.d.ts +20 -0
- package/dist/esm/resources/IndexedDbStore.js +12 -0
- package/dist/esm/resources/IndexedDbStore.js.map +1 -1
- package/dist/esm/resources/Loader.d.ts +167 -0
- package/dist/esm/resources/Loader.js +110 -0
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/NetworkOnlyStrategy.d.ts +8 -0
- package/dist/esm/resources/NetworkOnlyStrategy.js +8 -0
- package/dist/esm/resources/NetworkOnlyStrategy.js.map +1 -1
- package/dist/esm/resources/factories/BinaryFactory.d.ts +13 -0
- package/dist/esm/resources/factories/BinaryFactory.js +13 -0
- package/dist/esm/resources/factories/BinaryFactory.js.map +1 -1
- package/dist/esm/resources/factories/FontFactory.d.ts +37 -0
- package/dist/esm/resources/factories/FontFactory.js +26 -0
- package/dist/esm/resources/factories/FontFactory.js.map +1 -1
- package/dist/esm/resources/factories/ImageFactory.d.ts +24 -0
- package/dist/esm/resources/factories/ImageFactory.js +19 -0
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/JsonFactory.d.ts +13 -0
- package/dist/esm/resources/factories/JsonFactory.js +13 -0
- package/dist/esm/resources/factories/JsonFactory.js.map +1 -1
- package/dist/esm/resources/factories/MusicFactory.d.ts +36 -0
- package/dist/esm/resources/factories/MusicFactory.js +44 -4
- package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
- package/dist/esm/resources/factories/SoundFactory.d.ts +29 -0
- package/dist/esm/resources/factories/SoundFactory.js +18 -0
- package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
- package/dist/esm/resources/factories/SvgFactory.d.ts +19 -0
- package/dist/esm/resources/factories/SvgFactory.js +19 -0
- package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextFactory.d.ts +11 -0
- package/dist/esm/resources/factories/TextFactory.js +11 -0
- package/dist/esm/resources/factories/TextFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +25 -0
- package/dist/esm/resources/factories/TextureFactory.js +20 -0
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/factories/VideoFactory.d.ts +37 -0
- package/dist/esm/resources/factories/VideoFactory.js +48 -5
- package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
- package/dist/esm/resources/factories/VttFactory.d.ts +18 -0
- package/dist/esm/resources/factories/VttFactory.js +24 -0
- package/dist/esm/resources/factories/VttFactory.js.map +1 -1
- package/dist/esm/resources/factories/WasmFactory.d.ts +16 -0
- package/dist/esm/resources/factories/WasmFactory.js +16 -0
- package/dist/esm/resources/factories/WasmFactory.js.map +1 -1
- package/dist/esm/resources/utils.d.ts +10 -0
- package/dist/esm/resources/utils.js +10 -0
- package/dist/esm/resources/utils.js.map +1 -1
- package/dist/exo.esm.js +11182 -2538
- package/dist/exo.esm.js.map +1 -1
- package/package.json +20 -9
- package/dist/esm/core/Quadtree.d.ts +0 -20
- package/dist/esm/core/Quadtree.js +0 -86
- package/dist/esm/core/Quadtree.js.map +0 -1
|
@@ -81,34 +81,77 @@ const onUserInteraction = () => {
|
|
|
81
81
|
dispatchReadyIfRunning();
|
|
82
82
|
});
|
|
83
83
|
};
|
|
84
|
+
/**
|
|
85
|
+
* Specialised {@link Signal} that fires once the global `AudioContext` reaches
|
|
86
|
+
* the `running` state. Subscribing via `add` or `once` automatically begins
|
|
87
|
+
* monitoring for user-interaction events that are required to resume a
|
|
88
|
+
* suspended context in browsers with autoplay policy.
|
|
89
|
+
*
|
|
90
|
+
* @internal
|
|
91
|
+
*/
|
|
84
92
|
class AudioContextReadySignal extends Signal {
|
|
93
|
+
/** Subscribe and immediately start interaction monitoring. */
|
|
85
94
|
add(handler, context) {
|
|
86
95
|
super.add(handler, context);
|
|
87
96
|
ensureAudioContextReadyMonitoring();
|
|
88
97
|
return this;
|
|
89
98
|
}
|
|
99
|
+
/** Subscribe once and immediately start interaction monitoring. */
|
|
90
100
|
once(handler, context) {
|
|
91
101
|
super.once(handler, context);
|
|
92
102
|
ensureAudioContextReadyMonitoring();
|
|
93
103
|
return this;
|
|
94
104
|
}
|
|
95
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Signal that dispatches once the global `AudioContext` enters the `running`
|
|
108
|
+
* state. Handles browser autoplay-policy by listening for user-interaction
|
|
109
|
+
* events (`mousedown`, `touchstart`, `touchend`) and resuming a suspended
|
|
110
|
+
* context automatically.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* onAudioContextReady.once((ctx) => {
|
|
115
|
+
* // safe to schedule audio nodes
|
|
116
|
+
* });
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
96
119
|
const onAudioContextReady = new AudioContextReadySignal();
|
|
120
|
+
/**
|
|
121
|
+
* Return the global singleton `AudioContext`, creating it if it does not yet
|
|
122
|
+
* exist. Also starts interaction-unlock monitoring so the context will resume
|
|
123
|
+
* on the first user gesture. Throws if `AudioContext` is not available in the
|
|
124
|
+
* current environment.
|
|
125
|
+
*/
|
|
97
126
|
const getAudioContext = () => {
|
|
98
127
|
const audioContext = getOrCreateAudioContext();
|
|
99
128
|
ensureAudioContextReadyMonitoring();
|
|
100
129
|
return audioContext;
|
|
101
130
|
};
|
|
131
|
+
/**
|
|
132
|
+
* Return `true` if the global `AudioContext` has been created and is currently
|
|
133
|
+
* in the `running` state. Safe to call before `getAudioContext`; returns
|
|
134
|
+
* `false` if no context exists yet.
|
|
135
|
+
*/
|
|
102
136
|
const isAudioContextReady = () => {
|
|
103
137
|
const audioContext = getExistingAudioContext();
|
|
104
138
|
return audioContext !== null && audioContext.state === 'running';
|
|
105
139
|
};
|
|
140
|
+
/**
|
|
141
|
+
* Return the shared singleton `OfflineAudioContext` used for audio decoding.
|
|
142
|
+
* Its sample rate matches the live `AudioContext`. Creates the live context
|
|
143
|
+
* as a side effect if it does not exist yet.
|
|
144
|
+
*/
|
|
106
145
|
const getOfflineAudioContext = () => getOrCreateOfflineAudioContext();
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
146
|
+
/**
|
|
147
|
+
* Decode raw audio bytes into an `AudioBuffer` using the shared
|
|
148
|
+
* `OfflineAudioContext`. The context's sample rate is derived from the live
|
|
149
|
+
* `AudioContext`, ensuring decoded buffers are compatible with playback nodes.
|
|
150
|
+
*
|
|
151
|
+
* Note: on some older mobile WebKit versions `decodeAudioData` requires a
|
|
152
|
+
* running (live) context — decoding may fail with a browser-level error rather
|
|
153
|
+
* than an ExoJS-shaped error in those environments.
|
|
154
|
+
*/
|
|
112
155
|
const decodeAudioData = async (arrayBuffer) => getOrCreateOfflineAudioContext().decodeAudioData(arrayBuffer);
|
|
113
156
|
|
|
114
157
|
export { decodeAudioData, getAudioContext, getOfflineAudioContext, isAudioContextReady, onAudioContextReady };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-context.js","sources":["../../../../src/audio/audio-context.ts"],"sourcesContent":[null],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"audio-context.js","sources":["../../../../src/audio/audio-context.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAMA,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAU;AAE1E,IAAI,oBAAoB,GAAwB,IAAI;AACpD,IAAI,2BAA2B,GAA+B,IAAI;AAClE,IAAI,yBAAyB,GAAG,KAAK;AACrC,IAAI,wBAAwB,GAAG,KAAK;AACpC,IAAI,eAAe,GAAG,KAAK;AAE3B,MAAM,oBAAoB,GAAG,MAAe,OAAO,YAAY,KAAK,WAAW;AAC/E,MAAM,2BAA2B,GAAG,MAAe,OAAO,mBAAmB,KAAK,WAAW;AAC7F,MAAM,cAAc,GAAG,MAAe,OAAO,QAAQ,KAAK,WAAW;AAErE,MAAM,uBAAuB,GAAG,MAA2B,oBAAoB;AAE/E,MAAM,uBAAuB,GAAG,MAAmB;AAC/C,IAAA,IAAI,CAAC,oBAAoB,EAAE,EAAE;AACzB,QAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;IACtE;AAEA,IAAA,IAAI,oBAAoB,KAAK,IAAI,EAAE;AAC/B,QAAA,oBAAoB,GAAG,IAAI,YAAY,EAAE;IAC7C;AAEA,IAAA,OAAO,oBAAoB;AAC/B,CAAC;AAED,MAAM,8BAA8B,GAAG,MAA0B;AAC7D,IAAA,IAAI,CAAC,2BAA2B,EAAE,EAAE;AAChC,QAAA,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC;IAC7E;AAEA,IAAA,IAAI,2BAA2B,KAAK,IAAI,EAAE;AACtC,QAAA,MAAM,YAAY,GAAG,uBAAuB,EAAE;AAE9C,QAAA,2BAA2B,GAAG,IAAI,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC;IACxF;AAEA,IAAA,OAAO,2BAA2B;AACtC,CAAC;AAED,MAAM,0BAA0B,GAAG,MAAW;AAC1C,IAAA,IAAI,CAAC,yBAAyB,IAAI,CAAC,cAAc,EAAE,EAAE;QACjD;IACJ;AAEA,IAAA,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE;QACvC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC;IACrE;IAEA,yBAAyB,GAAG,KAAK;AACrC,CAAC;AAED,MAAM,sBAAsB,GAAG,MAAW;AACtC,IAAA,MAAM,YAAY,GAAG,uBAAuB,EAAE;IAE9C,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,IAAI,eAAe,EAAE;QACtE;IACJ;IAEA,eAAe,GAAG,IAAI;AACtB,IAAA,0BAA0B,EAAE;AAC5B,IAAA,mBAAmB,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC9C,CAAC;AAED,MAAM,yBAAyB,GAAG,MAAW;AACzC,IAAA,sBAAsB,EAAE;AAC5B,CAAC;AAED,MAAM,uBAAuB,GAAG,MAAW;AACvC,IAAA,IAAI,yBAAyB,IAAI,CAAC,cAAc,EAAE,EAAE;QAChD;IACJ;AAEA,IAAA,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE;QACvC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC;IAClE;IAEA,yBAAyB,GAAG,IAAI;AACpC,CAAC;AAED,MAAM,iCAAiC,GAAG,MAAW;AACjD,IAAA,MAAM,YAAY,GAAG,uBAAuB,EAAE;IAC9C,MAAM,uBAAuB,GAAG,YAAkD;IAElF,IAAI,CAAC,wBAAwB,IAAI,OAAO,uBAAuB,CAAC,gBAAgB,KAAK,UAAU,EAAE;AAC7F,QAAA,uBAAuB,CAAC,gBAAgB,CAAC,aAAa,EAAE,yBAAyB,CAAC;QAClF,wBAAwB,GAAG,IAAI;IACnC;AAEA,IAAA,sBAAsB,EAAE;IAExB,IAAI,CAAC,eAAe,EAAE;AAClB,QAAA,uBAAuB,EAAE;IAC7B;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG,MAAW;AACjC,IAAA,MAAM,YAAY,GAAG,uBAAuB,EAAE;AAE9C,IAAA,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE;AAClC,QAAA,sBAAsB,EAAE;QAExB;IACJ;IAEA,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAK;AACjC,QAAA,sBAAsB,EAAE;AAC5B,IAAA,CAAC,CAAC;AACN,CAAC;AAED;;;;;;;AAOG;AACH,MAAM,uBAAwB,SAAQ,MAAsB,CAAA;;IAExC,GAAG,CAAC,OAAuD,EAAE,OAAgB,EAAA;AACzF,QAAA,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;AAC3B,QAAA,iCAAiC,EAAE;AAEnC,QAAA,OAAO,IAAI;IACf;;IAGgB,IAAI,CAAC,OAAuD,EAAE,OAAgB,EAAA;AAC1F,QAAA,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5B,QAAA,iCAAiC,EAAE;AAEnC,QAAA,OAAO,IAAI;IACf;AACH;AAED;;;;;;;;;;;;AAYG;AACI,MAAM,mBAAmB,GAAG,IAAI,uBAAuB;AAE9D;;;;;AAKG;AACI,MAAM,eAAe,GAAG,MAAmB;AAC9C,IAAA,MAAM,YAAY,GAAG,uBAAuB,EAAE;AAE9C,IAAA,iCAAiC,EAAE;AAEnC,IAAA,OAAO,YAAY;AACvB;AAEA;;;;AAIG;AACI,MAAM,mBAAmB,GAAG,MAAc;AAC7C,IAAA,MAAM,YAAY,GAAG,uBAAuB,EAAE;IAE9C,OAAO,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS;AACpE;AAEA;;;;AAIG;MACU,sBAAsB,GAAG,MAA2B,8BAA8B;AAE/F;;;;;;;;AAQG;AACI,MAAM,eAAe,GAAG,OAAO,WAAwB,KAA2B,8BAA8B,EAAE,CAAC,eAAe,CAAC,WAAW;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AbstractMedia } from './AbstractMedia';
|
|
2
|
+
export interface CrossFadeOptions {
|
|
3
|
+
/** Stop the `from` media after fade completes. Default true. */
|
|
4
|
+
stopAfterFade?: boolean;
|
|
5
|
+
/** Auto-play `to` if currently paused. Default true. */
|
|
6
|
+
autoPlayTarget?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Cross-fade from one media instance to another over `durationMs`.
|
|
10
|
+
*
|
|
11
|
+
* Calls `from.fadeOut(durationMs)` and `to.fadeIn(durationMs)` in parallel.
|
|
12
|
+
* If `to` is paused at call time and `autoPlayTarget !== false`, it will
|
|
13
|
+
* be played first (so the fade-in is audible).
|
|
14
|
+
*
|
|
15
|
+
* Returns a Promise that resolves after `durationMs` elapses (i.e., when
|
|
16
|
+
* the fade completes). Use `await crossFade(...)` for sequential music
|
|
17
|
+
* transitions, or fire-and-forget for non-blocking transitions.
|
|
18
|
+
*/
|
|
19
|
+
export declare function crossFade(from: AbstractMedia, to: AbstractMedia, durationMs: number, options?: CrossFadeOptions): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-fade from one media instance to another over `durationMs`.
|
|
3
|
+
*
|
|
4
|
+
* Calls `from.fadeOut(durationMs)` and `to.fadeIn(durationMs)` in parallel.
|
|
5
|
+
* If `to` is paused at call time and `autoPlayTarget !== false`, it will
|
|
6
|
+
* be played first (so the fade-in is audible).
|
|
7
|
+
*
|
|
8
|
+
* Returns a Promise that resolves after `durationMs` elapses (i.e., when
|
|
9
|
+
* the fade completes). Use `await crossFade(...)` for sequential music
|
|
10
|
+
* transitions, or fire-and-forget for non-blocking transitions.
|
|
11
|
+
*/
|
|
12
|
+
async function crossFade(from, to, durationMs, options = {}) {
|
|
13
|
+
const stopAfterFade = options.stopAfterFade ?? true;
|
|
14
|
+
const autoPlayTarget = options.autoPlayTarget ?? true;
|
|
15
|
+
if (autoPlayTarget && to.paused) {
|
|
16
|
+
to.play();
|
|
17
|
+
}
|
|
18
|
+
from.fadeOut(durationMs, { stopAfter: stopAfterFade });
|
|
19
|
+
to.fadeIn(durationMs);
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
setTimeout(resolve, Math.max(0, durationMs));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { crossFade };
|
|
26
|
+
//# sourceMappingURL=crossFade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crossFade.js","sources":["../../../../src/audio/crossFade.ts"],"sourcesContent":[null],"names":[],"mappings":"AASA;;;;;;;;;;AAUG;AACI,eAAe,SAAS,CAC3B,IAAmB,EACnB,EAAiB,EACjB,UAAkB,EAClB,OAAA,GAA4B,EAAE,EAAA;AAE9B,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI;AACnD,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI;AAErD,IAAA,IAAI,cAAc,IAAI,EAAE,CAAC,MAAM,EAAE;QAC7B,EAAE,CAAC,IAAI,EAAE;IACb;IAEA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AACtD,IAAA,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;AAErB,IAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACjC,QAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAChD,IAAA,CAAC,CAAC;AACN;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-place radix-2 Cooley-Tukey FFT.
|
|
3
|
+
*
|
|
4
|
+
* Operates on the supplied real/imag arrays (length must be a power of 2).
|
|
5
|
+
* After the call, real[i] and imag[i] hold the complex spectrum.
|
|
6
|
+
* A Hann window is applied to the input before the transform.
|
|
7
|
+
*
|
|
8
|
+
* These functions are duplicated (as plain JS) inside the beat-detector worklet
|
|
9
|
+
* source string because AudioWorklets cannot import modules.
|
|
10
|
+
*/
|
|
11
|
+
/** Apply a Hann window in-place to `real`. `imag` is zeroed. */
|
|
12
|
+
export declare function hannWindow(real: Float32Array, imag: Float32Array): void;
|
|
13
|
+
/**
|
|
14
|
+
* In-place FFT. `real` and `imag` must have the same length (power of 2).
|
|
15
|
+
* A Hann window is applied to `real` before the transform; `imag` is zeroed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function fft(real: Float32Array, imag: Float32Array): void;
|
|
18
|
+
/**
|
|
19
|
+
* Compute magnitude spectrum from complex FFT output.
|
|
20
|
+
* Returns a Float32Array of length `n/2` (positive frequencies only).
|
|
21
|
+
*/
|
|
22
|
+
export declare function magnitudeSpectrum(real: Float32Array, imag: Float32Array): Float32Array;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mel-scale filterbank generator.
|
|
3
|
+
*
|
|
4
|
+
* Generates `numBands` triangular filters log-spaced from `fMin` to `fMax` Hz
|
|
5
|
+
* on the mel scale. Each filter is a typed array of weights for the FFT
|
|
6
|
+
* magnitude bins.
|
|
7
|
+
*
|
|
8
|
+
* These helpers are also inlined inside the beat-detector worklet source
|
|
9
|
+
* string (worklets cannot import modules).
|
|
10
|
+
*/
|
|
11
|
+
/** Convert Hz to mel. */
|
|
12
|
+
export declare function hzToMel(hz: number): number;
|
|
13
|
+
/** Convert mel to Hz. */
|
|
14
|
+
export declare function melToHz(mel: number): number;
|
|
15
|
+
export interface MelBand {
|
|
16
|
+
/** Index of the FFT bin where this filter starts (weight 0). */
|
|
17
|
+
readonly startBin: number;
|
|
18
|
+
/** Index of the peak FFT bin (weight 1). */
|
|
19
|
+
readonly peakBin: number;
|
|
20
|
+
/** Index of the FFT bin where this filter ends (weight 0). */
|
|
21
|
+
readonly endBin: number;
|
|
22
|
+
/** Pre-computed triangular weights, indexed from startBin..endBin (inclusive). */
|
|
23
|
+
readonly weights: Float32Array;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build a mel filterbank.
|
|
27
|
+
*
|
|
28
|
+
* @param numBands Number of mel bands (default 24).
|
|
29
|
+
* @param fMin Lowest frequency in Hz (default 80).
|
|
30
|
+
* @param fMax Highest frequency in Hz (default 8000).
|
|
31
|
+
* @param fftSize Number of FFT points (e.g., 2048).
|
|
32
|
+
* @param sampleRate Audio sample rate in Hz (e.g., 48000).
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildMelFilterbank(numBands: number, fMin: number, fMax: number, fftSize: number, sampleRate: number): Array<MelBand>;
|
|
35
|
+
/**
|
|
36
|
+
* Compute mel band energies from a magnitude spectrum.
|
|
37
|
+
*
|
|
38
|
+
* @param mag FFT magnitude spectrum (length = fftSize/2).
|
|
39
|
+
* @param bands Filterbank from `buildMelFilterbank`.
|
|
40
|
+
* @param out Optional pre-allocated output array of length `bands.length`.
|
|
41
|
+
* @returns Log-compressed mel band energies.
|
|
42
|
+
*/
|
|
43
|
+
export declare function computeMelBands(mag: Float32Array, bands: Array<MelBand>, out?: Float32Array): Float32Array;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autocorrelation-based tempogram.
|
|
3
|
+
*
|
|
4
|
+
* Given a novelty (onset-strength) curve sampled at rate `hopRate = sampleRate / hopSize`,
|
|
5
|
+
* this module computes the autocorrelation function (ACF) over a sliding window
|
|
6
|
+
* and returns the top tempo candidates.
|
|
7
|
+
*
|
|
8
|
+
* These helpers are also inlined inside the beat-detector worklet source string
|
|
9
|
+
* (worklets cannot import modules).
|
|
10
|
+
*/
|
|
11
|
+
export interface TempoCandidateResult {
|
|
12
|
+
/** BPM value. */
|
|
13
|
+
bpm: number;
|
|
14
|
+
/** Normalised peak score (0..1). */
|
|
15
|
+
score: number;
|
|
16
|
+
/** ACF lag in hops that produced this peak. */
|
|
17
|
+
lag: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compute the normalised autocorrelation function over a novelty curve.
|
|
21
|
+
*
|
|
22
|
+
* @param flux Recent novelty values (ring-buffer contents, oldest first).
|
|
23
|
+
* @param minLag Minimum lag in samples (inclusive).
|
|
24
|
+
* @param maxLag Maximum lag in samples (inclusive).
|
|
25
|
+
* @returns ACF array indexed by lag (index 0 = lag minLag).
|
|
26
|
+
*/
|
|
27
|
+
export declare function computeAcf(flux: Float32Array, minLag: number, maxLag: number): Float32Array;
|
|
28
|
+
/**
|
|
29
|
+
* Find the top-K peaks in the ACF and convert lags to BPM candidates.
|
|
30
|
+
*
|
|
31
|
+
* @param acf Normalised ACF from `computeACF`.
|
|
32
|
+
* @param minLag The lag (in hops) corresponding to acf[0].
|
|
33
|
+
* @param hopSize Number of audio samples per hop.
|
|
34
|
+
* @param sampleRate Audio sample rate in Hz.
|
|
35
|
+
* @param topK Number of peaks to return (default 3).
|
|
36
|
+
* @returns Up to `topK` tempo candidates sorted by score descending.
|
|
37
|
+
*/
|
|
38
|
+
export declare function findTempoPeaks(acf: Float32Array, minLag: number, hopSize: number, sampleRate: number, topK?: number): Array<TempoCandidateResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Apply hysteresis to tempo candidate selection.
|
|
41
|
+
*
|
|
42
|
+
* Prevents rapid switching between tempo estimates:
|
|
43
|
+
* - Only switches to a new best if its score is > currentBestScore * 1.15.
|
|
44
|
+
* - Octave-related candidates (2x or 0.5x) require a score > 1.5x to switch.
|
|
45
|
+
*
|
|
46
|
+
* @param candidates Sorted candidates from `findTempoPeaks`.
|
|
47
|
+
* @param currentBpm Currently tracked BPM.
|
|
48
|
+
* @param currentScore Currently tracked best score.
|
|
49
|
+
* @returns The selected best BPM.
|
|
50
|
+
*/
|
|
51
|
+
export declare function applyTempoHysteresis(candidates: Array<TempoCandidateResult>, currentBpm: number, currentScore: number): number;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link ChorusFilter}. */
|
|
3
|
+
export interface ChorusFilterOptions {
|
|
4
|
+
/** Base delay in ms. Typical 15-30ms. Default 25. */
|
|
5
|
+
delayMs?: number;
|
|
6
|
+
/** Modulation depth in ms (peak deviation from base). Default 5. */
|
|
7
|
+
depthMs?: number;
|
|
8
|
+
/** LFO rate in Hz. Typical 0.1-5Hz for chorus, 5-15Hz for vibrato. Default 1.5. */
|
|
9
|
+
rateHz?: number;
|
|
10
|
+
/** Dry/wet mix, 0..1. Default 0.5 (equal mix). */
|
|
11
|
+
wet?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Chorus effect using native WebAudio nodes (no worklet required).
|
|
15
|
+
*
|
|
16
|
+
* The signal splits into a dry path and a wet path. The wet path passes
|
|
17
|
+
* through a DelayNode whose delay time is modulated by a sine-wave LFO,
|
|
18
|
+
* producing the characteristic pitch-wobble / thickening of chorus.
|
|
19
|
+
*
|
|
20
|
+
* Node graph:
|
|
21
|
+
* ```
|
|
22
|
+
* inputGain ┬── dryGain ────────────────┐
|
|
23
|
+
* │ ├── outputGain
|
|
24
|
+
* └── delayNode ── wetGain ────┘
|
|
25
|
+
*
|
|
26
|
+
* lfoOscillator ── lfoGain (depth) ── delayNode.delayTime
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class ChorusFilter extends AudioFilter {
|
|
30
|
+
private _nodes;
|
|
31
|
+
private _delayMs;
|
|
32
|
+
private _depthMs;
|
|
33
|
+
private _rateHz;
|
|
34
|
+
private _wet;
|
|
35
|
+
constructor(options?: ChorusFilterOptions);
|
|
36
|
+
get inputNode(): AudioNode;
|
|
37
|
+
get outputNode(): AudioNode;
|
|
38
|
+
/** Base delay time in milliseconds. Default 25. */
|
|
39
|
+
get delayMs(): number;
|
|
40
|
+
set delayMs(value: number);
|
|
41
|
+
/** LFO modulation depth in milliseconds (peak deviation from base delay). Default 5. */
|
|
42
|
+
get depthMs(): number;
|
|
43
|
+
set depthMs(value: number);
|
|
44
|
+
/** LFO oscillation rate in Hz. Typical chorus range is 0.1–5 Hz; 5–15 Hz produces a vibrato effect. Default 1.5. */
|
|
45
|
+
get rateHz(): number;
|
|
46
|
+
set rateHz(value: number);
|
|
47
|
+
/** Wet (modulated) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.5. */
|
|
48
|
+
get wet(): number;
|
|
49
|
+
set wet(value: number);
|
|
50
|
+
destroy(): void;
|
|
51
|
+
private _setupNodes;
|
|
52
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
|
|
2
|
+
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Chorus effect using native WebAudio nodes (no worklet required).
|
|
6
|
+
*
|
|
7
|
+
* The signal splits into a dry path and a wet path. The wet path passes
|
|
8
|
+
* through a DelayNode whose delay time is modulated by a sine-wave LFO,
|
|
9
|
+
* producing the characteristic pitch-wobble / thickening of chorus.
|
|
10
|
+
*
|
|
11
|
+
* Node graph:
|
|
12
|
+
* ```
|
|
13
|
+
* inputGain ┬── dryGain ────────────────┐
|
|
14
|
+
* │ ├── outputGain
|
|
15
|
+
* └── delayNode ── wetGain ────┘
|
|
16
|
+
*
|
|
17
|
+
* lfoOscillator ── lfoGain (depth) ── delayNode.delayTime
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
class ChorusFilter extends AudioFilter {
|
|
21
|
+
_nodes = null;
|
|
22
|
+
_delayMs;
|
|
23
|
+
_depthMs;
|
|
24
|
+
_rateHz;
|
|
25
|
+
_wet;
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
super();
|
|
28
|
+
this._delayMs = Math.max(0, options.delayMs ?? 25);
|
|
29
|
+
this._depthMs = Math.max(0, options.depthMs ?? 5);
|
|
30
|
+
this._rateHz = Math.max(0, options.rateHz ?? 1.5);
|
|
31
|
+
this._wet = Math.max(0, Math.min(1, options.wet ?? 0.5));
|
|
32
|
+
if (isAudioContextReady()) {
|
|
33
|
+
this._setupNodes(getAudioContext());
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
onAudioContextReady.once(this._setupNodes, this);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
get inputNode() {
|
|
40
|
+
if (!this._nodes)
|
|
41
|
+
throw new Error('ChorusFilter not yet initialized.');
|
|
42
|
+
return this._nodes.inputGain;
|
|
43
|
+
}
|
|
44
|
+
get outputNode() {
|
|
45
|
+
if (!this._nodes)
|
|
46
|
+
throw new Error('ChorusFilter not yet initialized.');
|
|
47
|
+
return this._nodes.outputGain;
|
|
48
|
+
}
|
|
49
|
+
// -------------------------------------------------------------------------
|
|
50
|
+
// Getters / setters
|
|
51
|
+
// -------------------------------------------------------------------------
|
|
52
|
+
/** Base delay time in milliseconds. Default 25. */
|
|
53
|
+
get delayMs() { return this._delayMs; }
|
|
54
|
+
set delayMs(value) {
|
|
55
|
+
this._delayMs = Math.max(0, value);
|
|
56
|
+
if (this._nodes) {
|
|
57
|
+
this._nodes.delayNode.delayTime.setTargetAtTime(this._delayMs / 1000, this._nodes.delayNode.context.currentTime, 0.01);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** LFO modulation depth in milliseconds (peak deviation from base delay). Default 5. */
|
|
61
|
+
get depthMs() { return this._depthMs; }
|
|
62
|
+
set depthMs(value) {
|
|
63
|
+
this._depthMs = Math.max(0, value);
|
|
64
|
+
if (this._nodes) {
|
|
65
|
+
this._nodes.lfoGain.gain.setTargetAtTime(this._depthMs / 1000, this._nodes.lfoGain.context.currentTime, 0.01);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** LFO oscillation rate in Hz. Typical chorus range is 0.1–5 Hz; 5–15 Hz produces a vibrato effect. Default 1.5. */
|
|
69
|
+
get rateHz() { return this._rateHz; }
|
|
70
|
+
set rateHz(value) {
|
|
71
|
+
this._rateHz = Math.max(0, value);
|
|
72
|
+
if (this._nodes) {
|
|
73
|
+
this._nodes.lfoOscillator.frequency.setTargetAtTime(this._rateHz, this._nodes.inputGain.context.currentTime, 0.01);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Wet (modulated) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.5. */
|
|
77
|
+
get wet() { return this._wet; }
|
|
78
|
+
set wet(value) {
|
|
79
|
+
this._wet = Math.max(0, Math.min(1, value));
|
|
80
|
+
if (this._nodes) {
|
|
81
|
+
const ctx = this._nodes.wetGain.context;
|
|
82
|
+
this._nodes.wetGain.gain.setTargetAtTime(this._wet, ctx.currentTime, 0.01);
|
|
83
|
+
this._nodes.dryGain.gain.setTargetAtTime(1 - this._wet, ctx.currentTime, 0.01);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
// Lifecycle
|
|
88
|
+
// -------------------------------------------------------------------------
|
|
89
|
+
destroy() {
|
|
90
|
+
onAudioContextReady.clearByContext(this);
|
|
91
|
+
if (this._nodes) {
|
|
92
|
+
this._nodes.lfoOscillator.stop();
|
|
93
|
+
this._nodes.lfoOscillator.disconnect();
|
|
94
|
+
this._nodes.lfoGain.disconnect();
|
|
95
|
+
this._nodes.delayNode.disconnect();
|
|
96
|
+
this._nodes.dryGain.disconnect();
|
|
97
|
+
this._nodes.wetGain.disconnect();
|
|
98
|
+
this._nodes.inputGain.disconnect();
|
|
99
|
+
this._nodes.outputGain.disconnect();
|
|
100
|
+
this._nodes = null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// -------------------------------------------------------------------------
|
|
104
|
+
// Private
|
|
105
|
+
// -------------------------------------------------------------------------
|
|
106
|
+
_setupNodes(ctx) {
|
|
107
|
+
const inputGain = ctx.createGain();
|
|
108
|
+
const outputGain = ctx.createGain();
|
|
109
|
+
const dryGain = ctx.createGain();
|
|
110
|
+
const wetGain = ctx.createGain();
|
|
111
|
+
// maxDelayTime must be larger than base + peak depth, with a small buffer.
|
|
112
|
+
const maxDelay = (this._delayMs + this._depthMs) / 1000 + 0.05;
|
|
113
|
+
const delayNode = ctx.createDelay(maxDelay);
|
|
114
|
+
const lfoGain = ctx.createGain();
|
|
115
|
+
// Initial values
|
|
116
|
+
inputGain.gain.setValueAtTime(1, ctx.currentTime);
|
|
117
|
+
outputGain.gain.setValueAtTime(1, ctx.currentTime);
|
|
118
|
+
dryGain.gain.setValueAtTime(1 - this._wet, ctx.currentTime);
|
|
119
|
+
wetGain.gain.setValueAtTime(this._wet, ctx.currentTime);
|
|
120
|
+
delayNode.delayTime.setValueAtTime(this._delayMs / 1000, ctx.currentTime);
|
|
121
|
+
lfoGain.gain.setValueAtTime(this._depthMs / 1000, ctx.currentTime);
|
|
122
|
+
// LFO
|
|
123
|
+
const lfoOscillator = ctx.createOscillator();
|
|
124
|
+
lfoOscillator.type = 'sine';
|
|
125
|
+
lfoOscillator.frequency.value = this._rateHz;
|
|
126
|
+
// Wiring
|
|
127
|
+
// LFO → lfoGain → delayNode.delayTime (AudioParam)
|
|
128
|
+
lfoOscillator.connect(lfoGain);
|
|
129
|
+
lfoGain.connect(delayNode.delayTime);
|
|
130
|
+
// Dry path: inputGain → dryGain → outputGain
|
|
131
|
+
inputGain.connect(dryGain);
|
|
132
|
+
dryGain.connect(outputGain);
|
|
133
|
+
// Wet path: inputGain → delayNode → wetGain → outputGain
|
|
134
|
+
inputGain.connect(delayNode);
|
|
135
|
+
delayNode.connect(wetGain);
|
|
136
|
+
wetGain.connect(outputGain);
|
|
137
|
+
lfoOscillator.start();
|
|
138
|
+
this._nodes = { inputGain, outputGain, dryGain, wetGain, delayNode, lfoOscillator, lfoGain };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { ChorusFilter };
|
|
143
|
+
//# sourceMappingURL=ChorusFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChorusFilter.js","sources":["../../../../../src/audio/filters/ChorusFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link CompressorFilter}. All values are clamped to their valid ranges on assignment. */
|
|
3
|
+
export interface CompressorFilterOptions {
|
|
4
|
+
threshold?: number;
|
|
5
|
+
knee?: number;
|
|
6
|
+
ratio?: number;
|
|
7
|
+
attack?: number;
|
|
8
|
+
release?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Dynamic-range compressor backed by a Web Audio `DynamicsCompressorNode`.
|
|
12
|
+
* Reduces the volume of loud signals above a threshold, evening out the
|
|
13
|
+
* perceived loudness of a mix. All parameter changes are applied with a short
|
|
14
|
+
* smoothing ramp so they are artifact-free during playback.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CompressorFilter extends AudioFilter {
|
|
17
|
+
private _node;
|
|
18
|
+
private _threshold;
|
|
19
|
+
private _knee;
|
|
20
|
+
private _ratio;
|
|
21
|
+
private _attack;
|
|
22
|
+
private _release;
|
|
23
|
+
constructor(options?: CompressorFilterOptions);
|
|
24
|
+
get inputNode(): AudioNode;
|
|
25
|
+
get outputNode(): AudioNode;
|
|
26
|
+
/** Level above which compression begins, in dBFS. Range −100..0, default −24. */
|
|
27
|
+
get threshold(): number;
|
|
28
|
+
set threshold(value: number);
|
|
29
|
+
/** Width in dB of the transition region around the threshold (soft knee). Range 0..40, default 30. */
|
|
30
|
+
get knee(): number;
|
|
31
|
+
set knee(value: number);
|
|
32
|
+
/** Input-to-output dB ratio above the threshold. Range 1..20, default 12. */
|
|
33
|
+
get ratio(): number;
|
|
34
|
+
set ratio(value: number);
|
|
35
|
+
/** Time in seconds for the compressor to engage after the signal exceeds the threshold. Range 0..1, default 0.003. */
|
|
36
|
+
get attack(): number;
|
|
37
|
+
set attack(value: number);
|
|
38
|
+
/** Time in seconds for the compressor to disengage after the signal drops below the threshold. Range 0..1, default 0.25. */
|
|
39
|
+
get release(): number;
|
|
40
|
+
set release(value: number);
|
|
41
|
+
destroy(): void;
|
|
42
|
+
private _setup;
|
|
43
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
|
|
2
|
+
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Dynamic-range compressor backed by a Web Audio `DynamicsCompressorNode`.
|
|
6
|
+
* Reduces the volume of loud signals above a threshold, evening out the
|
|
7
|
+
* perceived loudness of a mix. All parameter changes are applied with a short
|
|
8
|
+
* smoothing ramp so they are artifact-free during playback.
|
|
9
|
+
*/
|
|
10
|
+
class CompressorFilter extends AudioFilter {
|
|
11
|
+
_node = null;
|
|
12
|
+
_threshold;
|
|
13
|
+
_knee;
|
|
14
|
+
_ratio;
|
|
15
|
+
_attack;
|
|
16
|
+
_release;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
super();
|
|
19
|
+
this._threshold = Math.max(-100, Math.min(0, options.threshold ?? -24));
|
|
20
|
+
this._knee = Math.max(0, Math.min(40, options.knee ?? 30));
|
|
21
|
+
this._ratio = Math.max(1, Math.min(20, options.ratio ?? 12));
|
|
22
|
+
this._attack = Math.max(0, Math.min(1, options.attack ?? 0.003));
|
|
23
|
+
this._release = Math.max(0, Math.min(1, options.release ?? 0.25));
|
|
24
|
+
if (isAudioContextReady()) {
|
|
25
|
+
this._setup(getAudioContext());
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
onAudioContextReady.once(this._setup, this);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
get inputNode() {
|
|
32
|
+
if (!this._node)
|
|
33
|
+
throw new Error('CompressorFilter not yet initialized.');
|
|
34
|
+
return this._node;
|
|
35
|
+
}
|
|
36
|
+
get outputNode() {
|
|
37
|
+
if (!this._node)
|
|
38
|
+
throw new Error('CompressorFilter not yet initialized.');
|
|
39
|
+
return this._node;
|
|
40
|
+
}
|
|
41
|
+
/** Level above which compression begins, in dBFS. Range −100..0, default −24. */
|
|
42
|
+
get threshold() {
|
|
43
|
+
return this._threshold;
|
|
44
|
+
}
|
|
45
|
+
set threshold(value) {
|
|
46
|
+
this._threshold = Math.max(-100, Math.min(0, value));
|
|
47
|
+
if (this._node) {
|
|
48
|
+
this._node.threshold.setTargetAtTime(this._threshold, this._node.context.currentTime, 0.01);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Width in dB of the transition region around the threshold (soft knee). Range 0..40, default 30. */
|
|
52
|
+
get knee() {
|
|
53
|
+
return this._knee;
|
|
54
|
+
}
|
|
55
|
+
set knee(value) {
|
|
56
|
+
this._knee = Math.max(0, Math.min(40, value));
|
|
57
|
+
if (this._node) {
|
|
58
|
+
this._node.knee.setTargetAtTime(this._knee, this._node.context.currentTime, 0.01);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Input-to-output dB ratio above the threshold. Range 1..20, default 12. */
|
|
62
|
+
get ratio() {
|
|
63
|
+
return this._ratio;
|
|
64
|
+
}
|
|
65
|
+
set ratio(value) {
|
|
66
|
+
this._ratio = Math.max(1, Math.min(20, value));
|
|
67
|
+
if (this._node) {
|
|
68
|
+
this._node.ratio.setTargetAtTime(this._ratio, this._node.context.currentTime, 0.01);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Time in seconds for the compressor to engage after the signal exceeds the threshold. Range 0..1, default 0.003. */
|
|
72
|
+
get attack() {
|
|
73
|
+
return this._attack;
|
|
74
|
+
}
|
|
75
|
+
set attack(value) {
|
|
76
|
+
this._attack = Math.max(0, Math.min(1, value));
|
|
77
|
+
if (this._node) {
|
|
78
|
+
this._node.attack.setTargetAtTime(this._attack, this._node.context.currentTime, 0.01);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Time in seconds for the compressor to disengage after the signal drops below the threshold. Range 0..1, default 0.25. */
|
|
82
|
+
get release() {
|
|
83
|
+
return this._release;
|
|
84
|
+
}
|
|
85
|
+
set release(value) {
|
|
86
|
+
this._release = Math.max(0, Math.min(1, value));
|
|
87
|
+
if (this._node) {
|
|
88
|
+
this._node.release.setTargetAtTime(this._release, this._node.context.currentTime, 0.01);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
destroy() {
|
|
92
|
+
onAudioContextReady.clearByContext(this);
|
|
93
|
+
this._node?.disconnect();
|
|
94
|
+
this._node = null;
|
|
95
|
+
}
|
|
96
|
+
_setup(ctx) {
|
|
97
|
+
const node = ctx.createDynamicsCompressor();
|
|
98
|
+
node.threshold.setValueAtTime(this._threshold, ctx.currentTime);
|
|
99
|
+
node.knee.setValueAtTime(this._knee, ctx.currentTime);
|
|
100
|
+
node.ratio.setValueAtTime(this._ratio, ctx.currentTime);
|
|
101
|
+
node.attack.setValueAtTime(this._attack, ctx.currentTime);
|
|
102
|
+
node.release.setValueAtTime(this._release, ctx.currentTime);
|
|
103
|
+
this._node = node;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { CompressorFilter };
|
|
108
|
+
//# sourceMappingURL=CompressorFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompressorFilter.js","sources":["../../../../../src/audio/filters/CompressorFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|