@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
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link DelayFilter}. */
|
|
3
|
+
export interface DelayFilterOptions {
|
|
4
|
+
delaySeconds?: number;
|
|
5
|
+
feedback?: number;
|
|
6
|
+
wet?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Echo/delay effect using a Web Audio `DelayNode` with a feedback loop and
|
|
10
|
+
* dry/wet mix. The feedback path feeds the delayed signal back into itself,
|
|
11
|
+
* producing repeating echoes that decay naturally. Setting `feedback` near
|
|
12
|
+
* its maximum of 0.95 produces a long, prominent tail; lower values create
|
|
13
|
+
* a single slap-back echo.
|
|
14
|
+
*/
|
|
15
|
+
export declare class DelayFilter extends AudioFilter {
|
|
16
|
+
private _setup;
|
|
17
|
+
private _delaySeconds;
|
|
18
|
+
private _feedback;
|
|
19
|
+
private _wet;
|
|
20
|
+
constructor(options?: DelayFilterOptions);
|
|
21
|
+
get inputNode(): AudioNode;
|
|
22
|
+
get outputNode(): AudioNode;
|
|
23
|
+
/** Delay time in seconds. Range 0..5, default 0.3. */
|
|
24
|
+
get delaySeconds(): number;
|
|
25
|
+
set delaySeconds(value: number);
|
|
26
|
+
/** Fraction of the delayed signal fed back into the delay input. Range 0..0.95, default 0.4. */
|
|
27
|
+
get feedback(): number;
|
|
28
|
+
set feedback(value: number);
|
|
29
|
+
/** Wet (delayed) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.5. */
|
|
30
|
+
get wet(): number;
|
|
31
|
+
set wet(value: number);
|
|
32
|
+
destroy(): void;
|
|
33
|
+
private _setupNodes;
|
|
34
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
|
|
2
|
+
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Echo/delay effect using a Web Audio `DelayNode` with a feedback loop and
|
|
6
|
+
* dry/wet mix. The feedback path feeds the delayed signal back into itself,
|
|
7
|
+
* producing repeating echoes that decay naturally. Setting `feedback` near
|
|
8
|
+
* its maximum of 0.95 produces a long, prominent tail; lower values create
|
|
9
|
+
* a single slap-back echo.
|
|
10
|
+
*/
|
|
11
|
+
class DelayFilter extends AudioFilter {
|
|
12
|
+
_setup = null;
|
|
13
|
+
_delaySeconds;
|
|
14
|
+
_feedback;
|
|
15
|
+
_wet;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
super();
|
|
18
|
+
this._delaySeconds = Math.max(0, Math.min(5, options.delaySeconds ?? 0.3));
|
|
19
|
+
this._feedback = Math.max(0, Math.min(0.95, options.feedback ?? 0.4));
|
|
20
|
+
this._wet = Math.max(0, Math.min(1, options.wet ?? 0.5));
|
|
21
|
+
if (isAudioContextReady()) {
|
|
22
|
+
this._setupNodes(getAudioContext());
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
onAudioContextReady.once(this._setupNodes, this);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
get inputNode() {
|
|
29
|
+
if (!this._setup)
|
|
30
|
+
throw new Error('DelayFilter not yet initialized.');
|
|
31
|
+
return this._setup.inputGain;
|
|
32
|
+
}
|
|
33
|
+
get outputNode() {
|
|
34
|
+
if (!this._setup)
|
|
35
|
+
throw new Error('DelayFilter not yet initialized.');
|
|
36
|
+
return this._setup.outputGain;
|
|
37
|
+
}
|
|
38
|
+
/** Delay time in seconds. Range 0..5, default 0.3. */
|
|
39
|
+
get delaySeconds() {
|
|
40
|
+
return this._delaySeconds;
|
|
41
|
+
}
|
|
42
|
+
set delaySeconds(value) {
|
|
43
|
+
this._delaySeconds = Math.max(0, Math.min(5, value));
|
|
44
|
+
if (this._setup) {
|
|
45
|
+
this._setup.delayNode.delayTime.setTargetAtTime(this._delaySeconds, this._setup.delayNode.context.currentTime, 0.01);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Fraction of the delayed signal fed back into the delay input. Range 0..0.95, default 0.4. */
|
|
49
|
+
get feedback() {
|
|
50
|
+
return this._feedback;
|
|
51
|
+
}
|
|
52
|
+
set feedback(value) {
|
|
53
|
+
this._feedback = Math.max(0, Math.min(0.95, value));
|
|
54
|
+
if (this._setup) {
|
|
55
|
+
this._setup.feedbackGain.gain.setTargetAtTime(this._feedback, this._setup.feedbackGain.context.currentTime, 0.01);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Wet (delayed) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.5. */
|
|
59
|
+
get wet() {
|
|
60
|
+
return this._wet;
|
|
61
|
+
}
|
|
62
|
+
set wet(value) {
|
|
63
|
+
this._wet = Math.max(0, Math.min(1, value));
|
|
64
|
+
if (this._setup) {
|
|
65
|
+
const ctx = this._setup.wetGain.context;
|
|
66
|
+
this._setup.wetGain.gain.setTargetAtTime(this._wet, ctx.currentTime, 0.01);
|
|
67
|
+
this._setup.dryGain.gain.setTargetAtTime(1 - this._wet, ctx.currentTime, 0.01);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
destroy() {
|
|
71
|
+
onAudioContextReady.clearByContext(this);
|
|
72
|
+
if (this._setup) {
|
|
73
|
+
this._setup.inputGain.disconnect();
|
|
74
|
+
this._setup.delayNode.disconnect();
|
|
75
|
+
this._setup.feedbackGain.disconnect();
|
|
76
|
+
this._setup.dryGain.disconnect();
|
|
77
|
+
this._setup.wetGain.disconnect();
|
|
78
|
+
this._setup.outputGain.disconnect();
|
|
79
|
+
this._setup = null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
_setupNodes(ctx) {
|
|
83
|
+
const inputGain = ctx.createGain();
|
|
84
|
+
const outputGain = ctx.createGain();
|
|
85
|
+
const delayNode = ctx.createDelay(5);
|
|
86
|
+
const feedbackGain = ctx.createGain();
|
|
87
|
+
const dryGain = ctx.createGain();
|
|
88
|
+
const wetGain = ctx.createGain();
|
|
89
|
+
inputGain.gain.setValueAtTime(1, ctx.currentTime);
|
|
90
|
+
outputGain.gain.setValueAtTime(1, ctx.currentTime);
|
|
91
|
+
delayNode.delayTime.setValueAtTime(this._delaySeconds, ctx.currentTime);
|
|
92
|
+
feedbackGain.gain.setValueAtTime(this._feedback, ctx.currentTime);
|
|
93
|
+
dryGain.gain.setValueAtTime(1 - this._wet, ctx.currentTime);
|
|
94
|
+
wetGain.gain.setValueAtTime(this._wet, ctx.currentTime);
|
|
95
|
+
// Dry path: input → dryGain → output
|
|
96
|
+
inputGain.connect(dryGain);
|
|
97
|
+
dryGain.connect(outputGain);
|
|
98
|
+
// Wet path: input → delay → wetGain → output
|
|
99
|
+
inputGain.connect(delayNode);
|
|
100
|
+
delayNode.connect(wetGain);
|
|
101
|
+
wetGain.connect(outputGain);
|
|
102
|
+
// Feedback loop: delay → feedbackGain → delay
|
|
103
|
+
delayNode.connect(feedbackGain);
|
|
104
|
+
feedbackGain.connect(delayNode);
|
|
105
|
+
this._setup = { inputGain, outputGain, delayNode, feedbackGain, dryGain, wetGain };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export { DelayFilter };
|
|
110
|
+
//# sourceMappingURL=DelayFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DelayFilter.js","sources":["../../../../../src/audio/filters/DelayFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { WorkletFilter } from './WorkletFilter';
|
|
2
|
+
import type { AudioBus } from '../AudioBus';
|
|
3
|
+
/** Construction options for {@link DuckingFilter}. `sidechain` is required. */
|
|
4
|
+
export interface DuckingFilterOptions {
|
|
5
|
+
sidechain: AudioBus;
|
|
6
|
+
threshold?: number;
|
|
7
|
+
ratio?: number;
|
|
8
|
+
attackMs?: number;
|
|
9
|
+
releaseMs?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Sidechain compressor (ducker) implemented as an {@link WorkletFilter}.
|
|
13
|
+
* Attenuates the main audio signal whenever the `sidechain` {@link AudioBus}
|
|
14
|
+
* exceeds the threshold, then releases when it drops back down. Commonly used
|
|
15
|
+
* to duck background music under dialogue or sound effects. Attack and release
|
|
16
|
+
* times are expressed in milliseconds and converted internally to one-pole
|
|
17
|
+
* filter coefficients.
|
|
18
|
+
*/
|
|
19
|
+
export declare class DuckingFilter extends WorkletFilter {
|
|
20
|
+
private readonly _sidechain;
|
|
21
|
+
private _threshold;
|
|
22
|
+
private _ratio;
|
|
23
|
+
private _attackMs;
|
|
24
|
+
private _releaseMs;
|
|
25
|
+
constructor(options: DuckingFilterOptions);
|
|
26
|
+
protected get _workletName(): string;
|
|
27
|
+
protected get _workletSource(): string;
|
|
28
|
+
protected get _workletOptions(): AudioWorkletNodeOptions;
|
|
29
|
+
protected _onWorkletReady(audioContext: AudioContext): void;
|
|
30
|
+
/** Convert ms time-constant to one-pole filter coefficient at given sample rate. */
|
|
31
|
+
private _msToCoeff;
|
|
32
|
+
/** Sidechain level above which the main signal is attenuated, in dBFS. Range −100..0, default −20. */
|
|
33
|
+
get threshold(): number;
|
|
34
|
+
set threshold(value: number);
|
|
35
|
+
/** Compression ratio applied to the main signal above the threshold. Range 1..20, default 4. */
|
|
36
|
+
get ratio(): number;
|
|
37
|
+
set ratio(value: number);
|
|
38
|
+
/** Attack time in milliseconds — how quickly the ducker engages. Default 30. */
|
|
39
|
+
get attackMs(): number;
|
|
40
|
+
set attackMs(value: number);
|
|
41
|
+
/** Release time in milliseconds — how quickly the ducker disengages. Default 300. */
|
|
42
|
+
get releaseMs(): number;
|
|
43
|
+
set releaseMs(value: number);
|
|
44
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { WorkletFilter } from './WorkletFilter.js';
|
|
2
|
+
|
|
3
|
+
const duckingWorkletSource = `
|
|
4
|
+
class DuckingProcessor extends AudioWorkletProcessor {
|
|
5
|
+
static get parameterDescriptors() {
|
|
6
|
+
return [
|
|
7
|
+
{ name: 'threshold', defaultValue: -20, minValue: -100, maxValue: 0, automationRate: 'k-rate' },
|
|
8
|
+
{ name: 'ratio', defaultValue: 4, minValue: 1, maxValue: 20, automationRate: 'k-rate' },
|
|
9
|
+
{ name: 'attack', defaultValue: 0.03, minValue: 0.001, maxValue: 1, automationRate: 'k-rate' },
|
|
10
|
+
{ name: 'release', defaultValue: 0.3, minValue: 0.001, maxValue: 5, automationRate: 'k-rate' },
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this._envelope = 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
process(inputs, outputs, parameters) {
|
|
20
|
+
const main = inputs[0];
|
|
21
|
+
const sidechain = inputs[1];
|
|
22
|
+
const output = outputs[0];
|
|
23
|
+
|
|
24
|
+
if (!main || main.length === 0 || !output || output.length === 0) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const threshold = parameters.threshold[0];
|
|
29
|
+
const ratio = parameters.ratio[0];
|
|
30
|
+
const attackCoeff = parameters.attack[0];
|
|
31
|
+
const releaseCoeff = parameters.release[0];
|
|
32
|
+
|
|
33
|
+
const blockLength = main[0]?.length ?? 0;
|
|
34
|
+
for (let i = 0; i < blockLength; i++) {
|
|
35
|
+
// Sidechain RMS sample (mono-mix L+R for detection)
|
|
36
|
+
let scSample = 0;
|
|
37
|
+
if (sidechain && sidechain.length > 0) {
|
|
38
|
+
const left = sidechain[0]?.[i] ?? 0;
|
|
39
|
+
const right = sidechain[1]?.[i] ?? left;
|
|
40
|
+
scSample = (Math.abs(left) + Math.abs(right)) * 0.5;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Envelope follower
|
|
44
|
+
const coeff = scSample > this._envelope ? attackCoeff : releaseCoeff;
|
|
45
|
+
this._envelope += (scSample - this._envelope) * coeff;
|
|
46
|
+
|
|
47
|
+
// Compute gain reduction in dB
|
|
48
|
+
const envDb = 20 * Math.log10(this._envelope + 1e-9);
|
|
49
|
+
const overshoot = Math.max(0, envDb - threshold);
|
|
50
|
+
const reduction = overshoot * (1 - 1 / ratio);
|
|
51
|
+
const gain = Math.pow(10, -reduction / 20);
|
|
52
|
+
|
|
53
|
+
// Apply to all main channels
|
|
54
|
+
for (let ch = 0; ch < main.length; ch++) {
|
|
55
|
+
const mainCh = main[ch];
|
|
56
|
+
const outCh = output[ch];
|
|
57
|
+
if (mainCh && outCh && i < mainCh.length) {
|
|
58
|
+
outCh[i] = mainCh[i] * gain;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
registerProcessor('exojs-ducking', DuckingProcessor);
|
|
67
|
+
`;
|
|
68
|
+
/**
|
|
69
|
+
* Sidechain compressor (ducker) implemented as an {@link WorkletFilter}.
|
|
70
|
+
* Attenuates the main audio signal whenever the `sidechain` {@link AudioBus}
|
|
71
|
+
* exceeds the threshold, then releases when it drops back down. Commonly used
|
|
72
|
+
* to duck background music under dialogue or sound effects. Attack and release
|
|
73
|
+
* times are expressed in milliseconds and converted internally to one-pole
|
|
74
|
+
* filter coefficients.
|
|
75
|
+
*/
|
|
76
|
+
class DuckingFilter extends WorkletFilter {
|
|
77
|
+
// Declared nullable because super() may trigger _onWorkletReady before the
|
|
78
|
+
// subclass constructor body runs (if construction is aborted by a throw).
|
|
79
|
+
_sidechain = null;
|
|
80
|
+
_threshold;
|
|
81
|
+
_ratio;
|
|
82
|
+
_attackMs;
|
|
83
|
+
_releaseMs;
|
|
84
|
+
constructor(options) {
|
|
85
|
+
super();
|
|
86
|
+
if (!options.sidechain) {
|
|
87
|
+
throw new Error('DuckingFilter requires a sidechain AudioBus.');
|
|
88
|
+
}
|
|
89
|
+
this._sidechain = options.sidechain;
|
|
90
|
+
this._threshold = options.threshold ?? -20;
|
|
91
|
+
this._ratio = options.ratio ?? 4;
|
|
92
|
+
this._attackMs = options.attackMs ?? 30;
|
|
93
|
+
this._releaseMs = options.releaseMs ?? 300;
|
|
94
|
+
}
|
|
95
|
+
get _workletName() {
|
|
96
|
+
return 'exojs-ducking';
|
|
97
|
+
}
|
|
98
|
+
get _workletSource() {
|
|
99
|
+
return duckingWorkletSource;
|
|
100
|
+
}
|
|
101
|
+
get _workletOptions() {
|
|
102
|
+
return { numberOfInputs: 2, numberOfOutputs: 1 };
|
|
103
|
+
}
|
|
104
|
+
_onWorkletReady(audioContext) {
|
|
105
|
+
// Guard against partially-constructed instances (constructor threw after super()).
|
|
106
|
+
if (!this._sidechain)
|
|
107
|
+
return;
|
|
108
|
+
// Apply current parameter values
|
|
109
|
+
this._setAudioParam('threshold', this._threshold);
|
|
110
|
+
this._setAudioParam('ratio', this._ratio);
|
|
111
|
+
this._setAudioParam('attack', this._msToCoeff(this._attackMs, audioContext.sampleRate));
|
|
112
|
+
this._setAudioParam('release', this._msToCoeff(this._releaseMs, audioContext.sampleRate));
|
|
113
|
+
// Wire sidechain to input 1 of the worklet
|
|
114
|
+
const sidechain = this._sidechain;
|
|
115
|
+
const sidechainOut = sidechain._getOutputNode();
|
|
116
|
+
if (sidechainOut && this._workletNode) {
|
|
117
|
+
sidechainOut.connect(this._workletNode, 0, 1);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
sidechain.onceSetup(() => {
|
|
121
|
+
const node = sidechain._getOutputNode();
|
|
122
|
+
if (node && this._workletNode) {
|
|
123
|
+
node.connect(this._workletNode, 0, 1);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Convert ms time-constant to one-pole filter coefficient at given sample rate. */
|
|
129
|
+
_msToCoeff(ms, sampleRate) {
|
|
130
|
+
const tau = (ms * 0.001) * sampleRate;
|
|
131
|
+
return 1 - Math.exp(-1 / Math.max(1, tau));
|
|
132
|
+
}
|
|
133
|
+
/** Sidechain level above which the main signal is attenuated, in dBFS. Range −100..0, default −20. */
|
|
134
|
+
get threshold() { return this._threshold; }
|
|
135
|
+
set threshold(value) {
|
|
136
|
+
this._threshold = Math.max(-100, Math.min(0, value));
|
|
137
|
+
this._setAudioParam('threshold', this._threshold);
|
|
138
|
+
}
|
|
139
|
+
/** Compression ratio applied to the main signal above the threshold. Range 1..20, default 4. */
|
|
140
|
+
get ratio() { return this._ratio; }
|
|
141
|
+
set ratio(value) {
|
|
142
|
+
this._ratio = Math.max(1, Math.min(20, value));
|
|
143
|
+
this._setAudioParam('ratio', this._ratio);
|
|
144
|
+
}
|
|
145
|
+
/** Attack time in milliseconds — how quickly the ducker engages. Default 30. */
|
|
146
|
+
get attackMs() { return this._attackMs; }
|
|
147
|
+
set attackMs(value) {
|
|
148
|
+
this._attackMs = Math.max(0.001, value);
|
|
149
|
+
if (this._workletNode) {
|
|
150
|
+
this._setAudioParam('attack', this._msToCoeff(this._attackMs, this._workletNode.context.sampleRate));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Release time in milliseconds — how quickly the ducker disengages. Default 300. */
|
|
154
|
+
get releaseMs() { return this._releaseMs; }
|
|
155
|
+
set releaseMs(value) {
|
|
156
|
+
this._releaseMs = Math.max(0.001, value);
|
|
157
|
+
if (this._workletNode) {
|
|
158
|
+
this._setAudioParam('release', this._msToCoeff(this._releaseMs, this._workletNode.context.sampleRate));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { DuckingFilter };
|
|
164
|
+
//# sourceMappingURL=DuckingFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DuckingFilter.js","sources":["../../../../../src/audio/filters/DuckingFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link EqualizerFilter}. */
|
|
3
|
+
export interface EqualizerFilterOptions {
|
|
4
|
+
low?: number;
|
|
5
|
+
mid?: number;
|
|
6
|
+
high?: number;
|
|
7
|
+
lowFrequency?: number;
|
|
8
|
+
midFrequency?: number;
|
|
9
|
+
highFrequency?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Three-band equalizer (low shelf / peaking mid / high shelf) built from a
|
|
13
|
+
* series chain of `BiquadFilterNode` instances. Gain values are in dB and
|
|
14
|
+
* clamped to ±40 dB. All six parameters (gains + frequencies) are
|
|
15
|
+
* adjustable at runtime via the corresponding setters; gain changes use a
|
|
16
|
+
* short exponential ramp to avoid clicks.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EqualizerFilter extends AudioFilter {
|
|
19
|
+
private _setup;
|
|
20
|
+
private _low;
|
|
21
|
+
private _mid;
|
|
22
|
+
private _high;
|
|
23
|
+
private _lowFrequency;
|
|
24
|
+
private _midFrequency;
|
|
25
|
+
private _highFrequency;
|
|
26
|
+
constructor(options?: EqualizerFilterOptions);
|
|
27
|
+
get inputNode(): AudioNode;
|
|
28
|
+
get outputNode(): AudioNode;
|
|
29
|
+
/** Low-shelf gain in dB applied below `lowFrequency`. Range −40..40, default 0. */
|
|
30
|
+
get low(): number;
|
|
31
|
+
set low(value: number);
|
|
32
|
+
/** Peaking mid-band gain in dB centered at `midFrequency`. Range −40..40, default 0. */
|
|
33
|
+
get mid(): number;
|
|
34
|
+
set mid(value: number);
|
|
35
|
+
/** High-shelf gain in dB applied above `highFrequency`. Range −40..40, default 0. */
|
|
36
|
+
get high(): number;
|
|
37
|
+
set high(value: number);
|
|
38
|
+
/** Cutoff frequency in Hz of the low-shelf band. Default 250. */
|
|
39
|
+
get lowFrequency(): number;
|
|
40
|
+
set lowFrequency(value: number);
|
|
41
|
+
/** Center frequency in Hz of the peaking mid band. Default 1500. */
|
|
42
|
+
get midFrequency(): number;
|
|
43
|
+
set midFrequency(value: number);
|
|
44
|
+
/** Cutoff frequency in Hz of the high-shelf band. Default 6000. */
|
|
45
|
+
get highFrequency(): number;
|
|
46
|
+
set highFrequency(value: number);
|
|
47
|
+
destroy(): void;
|
|
48
|
+
private _setupNodes;
|
|
49
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
|
|
2
|
+
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Three-band equalizer (low shelf / peaking mid / high shelf) built from a
|
|
6
|
+
* series chain of `BiquadFilterNode` instances. Gain values are in dB and
|
|
7
|
+
* clamped to ±40 dB. All six parameters (gains + frequencies) are
|
|
8
|
+
* adjustable at runtime via the corresponding setters; gain changes use a
|
|
9
|
+
* short exponential ramp to avoid clicks.
|
|
10
|
+
*/
|
|
11
|
+
class EqualizerFilter extends AudioFilter {
|
|
12
|
+
_setup = null;
|
|
13
|
+
_low;
|
|
14
|
+
_mid;
|
|
15
|
+
_high;
|
|
16
|
+
_lowFrequency;
|
|
17
|
+
_midFrequency;
|
|
18
|
+
_highFrequency;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
super();
|
|
21
|
+
this._low = Math.max(-40, Math.min(40, options.low ?? 0));
|
|
22
|
+
this._mid = Math.max(-40, Math.min(40, options.mid ?? 0));
|
|
23
|
+
this._high = Math.max(-40, Math.min(40, options.high ?? 0));
|
|
24
|
+
this._lowFrequency = options.lowFrequency ?? 250;
|
|
25
|
+
this._midFrequency = options.midFrequency ?? 1500;
|
|
26
|
+
this._highFrequency = options.highFrequency ?? 6000;
|
|
27
|
+
if (isAudioContextReady()) {
|
|
28
|
+
this._setupNodes(getAudioContext());
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
onAudioContextReady.once(this._setupNodes, this);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
get inputNode() {
|
|
35
|
+
if (!this._setup)
|
|
36
|
+
throw new Error('EqualizerFilter not yet initialized.');
|
|
37
|
+
return this._setup.lowShelf;
|
|
38
|
+
}
|
|
39
|
+
get outputNode() {
|
|
40
|
+
if (!this._setup)
|
|
41
|
+
throw new Error('EqualizerFilter not yet initialized.');
|
|
42
|
+
return this._setup.highShelf;
|
|
43
|
+
}
|
|
44
|
+
/** Low-shelf gain in dB applied below `lowFrequency`. Range −40..40, default 0. */
|
|
45
|
+
get low() {
|
|
46
|
+
return this._low;
|
|
47
|
+
}
|
|
48
|
+
set low(value) {
|
|
49
|
+
this._low = Math.max(-40, Math.min(40, value));
|
|
50
|
+
if (this._setup) {
|
|
51
|
+
this._setup.lowShelf.gain.setTargetAtTime(this._low, this._setup.lowShelf.context.currentTime, 0.01);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Peaking mid-band gain in dB centered at `midFrequency`. Range −40..40, default 0. */
|
|
55
|
+
get mid() {
|
|
56
|
+
return this._mid;
|
|
57
|
+
}
|
|
58
|
+
set mid(value) {
|
|
59
|
+
this._mid = Math.max(-40, Math.min(40, value));
|
|
60
|
+
if (this._setup) {
|
|
61
|
+
this._setup.peaking.gain.setTargetAtTime(this._mid, this._setup.peaking.context.currentTime, 0.01);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** High-shelf gain in dB applied above `highFrequency`. Range −40..40, default 0. */
|
|
65
|
+
get high() {
|
|
66
|
+
return this._high;
|
|
67
|
+
}
|
|
68
|
+
set high(value) {
|
|
69
|
+
this._high = Math.max(-40, Math.min(40, value));
|
|
70
|
+
if (this._setup) {
|
|
71
|
+
this._setup.highShelf.gain.setTargetAtTime(this._high, this._setup.highShelf.context.currentTime, 0.01);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Cutoff frequency in Hz of the low-shelf band. Default 250. */
|
|
75
|
+
get lowFrequency() {
|
|
76
|
+
return this._lowFrequency;
|
|
77
|
+
}
|
|
78
|
+
set lowFrequency(value) {
|
|
79
|
+
this._lowFrequency = Math.max(0, value);
|
|
80
|
+
if (this._setup) {
|
|
81
|
+
this._setup.lowShelf.frequency.setTargetAtTime(this._lowFrequency, this._setup.lowShelf.context.currentTime, 0.01);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Center frequency in Hz of the peaking mid band. Default 1500. */
|
|
85
|
+
get midFrequency() {
|
|
86
|
+
return this._midFrequency;
|
|
87
|
+
}
|
|
88
|
+
set midFrequency(value) {
|
|
89
|
+
this._midFrequency = Math.max(0, value);
|
|
90
|
+
if (this._setup) {
|
|
91
|
+
this._setup.peaking.frequency.setTargetAtTime(this._midFrequency, this._setup.peaking.context.currentTime, 0.01);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Cutoff frequency in Hz of the high-shelf band. Default 6000. */
|
|
95
|
+
get highFrequency() {
|
|
96
|
+
return this._highFrequency;
|
|
97
|
+
}
|
|
98
|
+
set highFrequency(value) {
|
|
99
|
+
this._highFrequency = Math.max(0, value);
|
|
100
|
+
if (this._setup) {
|
|
101
|
+
this._setup.highShelf.frequency.setTargetAtTime(this._highFrequency, this._setup.highShelf.context.currentTime, 0.01);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
destroy() {
|
|
105
|
+
onAudioContextReady.clearByContext(this);
|
|
106
|
+
if (this._setup) {
|
|
107
|
+
this._setup.lowShelf.disconnect();
|
|
108
|
+
this._setup.peaking.disconnect();
|
|
109
|
+
this._setup.highShelf.disconnect();
|
|
110
|
+
this._setup = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
_setupNodes(ctx) {
|
|
114
|
+
const lowShelf = ctx.createBiquadFilter();
|
|
115
|
+
lowShelf.type = 'lowshelf';
|
|
116
|
+
lowShelf.frequency.setValueAtTime(this._lowFrequency, ctx.currentTime);
|
|
117
|
+
lowShelf.gain.setValueAtTime(this._low, ctx.currentTime);
|
|
118
|
+
const peaking = ctx.createBiquadFilter();
|
|
119
|
+
peaking.type = 'peaking';
|
|
120
|
+
peaking.frequency.setValueAtTime(this._midFrequency, ctx.currentTime);
|
|
121
|
+
peaking.gain.setValueAtTime(this._mid, ctx.currentTime);
|
|
122
|
+
const highShelf = ctx.createBiquadFilter();
|
|
123
|
+
highShelf.type = 'highshelf';
|
|
124
|
+
highShelf.frequency.setValueAtTime(this._highFrequency, ctx.currentTime);
|
|
125
|
+
highShelf.gain.setValueAtTime(this._high, ctx.currentTime);
|
|
126
|
+
// Series chain: lowShelf → peaking → highShelf
|
|
127
|
+
lowShelf.connect(peaking);
|
|
128
|
+
peaking.connect(highShelf);
|
|
129
|
+
this._setup = { lowShelf, peaking, highShelf };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { EqualizerFilter };
|
|
134
|
+
//# sourceMappingURL=EqualizerFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EqualizerFilter.js","sources":["../../../../../src/audio/filters/EqualizerFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { WorkletFilter } from './WorkletFilter';
|
|
2
|
+
export interface GranularFilterOptions {
|
|
3
|
+
/** Grain size in seconds. 0.005-0.5. Default 0.05 (50ms). */
|
|
4
|
+
grainSize?: number;
|
|
5
|
+
/** Grains per second (overlap density). 1-500. Default 50. */
|
|
6
|
+
density?: number;
|
|
7
|
+
/** Random offset spread, 0-1. Higher = wider time-window scatter. Default 0.5. */
|
|
8
|
+
spread?: number;
|
|
9
|
+
/** Minimum random pitch ratio per grain. Default 1.0. */
|
|
10
|
+
pitchMin?: number;
|
|
11
|
+
/** Maximum random pitch ratio per grain. Default 1.0. */
|
|
12
|
+
pitchMax?: number;
|
|
13
|
+
/** Dry/wet mix, 0..1. Default 1.0. */
|
|
14
|
+
wet?: number;
|
|
15
|
+
/** Internal circular-buffer length in seconds. Compile-time, not runtime. Default 2. */
|
|
16
|
+
bufferSeconds?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Granular synthesis filter — slices input into small Hann-windowed grains
|
|
20
|
+
* and replays them with randomized parameters. Use cases:
|
|
21
|
+
*
|
|
22
|
+
* - Ambient texture: long grain (200ms+), low density (10-30/s), high
|
|
23
|
+
* spread, pitch range 0.5-1.5x. Creates evolving pad-like sounds.
|
|
24
|
+
* - Glitch: short grain (10-20ms), high density (100+/s), very high
|
|
25
|
+
* spread, pitch range 0.7-1.3x. Stuttering, lo-fi effects.
|
|
26
|
+
* - Time-stretch (low pitch with overlap): grain ~50ms, density 50/s,
|
|
27
|
+
* spread 0, pitch 1.0. Pseudo-stretches the input by buffering.
|
|
28
|
+
* - Pitch cloud: medium grain, medium density, pitchMin 0.5, pitchMax 2.0
|
|
29
|
+
* gives a "shimmer" effect of overlapping pitches.
|
|
30
|
+
*/
|
|
31
|
+
export declare class GranularFilter extends WorkletFilter {
|
|
32
|
+
private _grainSize;
|
|
33
|
+
private _density;
|
|
34
|
+
private _spread;
|
|
35
|
+
private _pitchMin;
|
|
36
|
+
private _pitchMax;
|
|
37
|
+
private _wet;
|
|
38
|
+
private readonly _bufferSeconds;
|
|
39
|
+
constructor(options?: GranularFilterOptions);
|
|
40
|
+
protected get _workletName(): string;
|
|
41
|
+
protected get _workletSource(): string;
|
|
42
|
+
protected get _workletOptions(): AudioWorkletNodeOptions;
|
|
43
|
+
protected _onWorkletReady(): void;
|
|
44
|
+
/** Duration of each grain in seconds. Range 0.005..0.5, default 0.05. */
|
|
45
|
+
get grainSize(): number;
|
|
46
|
+
set grainSize(value: number);
|
|
47
|
+
/** Number of grains spawned per second. Range 1..500, default 50. */
|
|
48
|
+
get density(): number;
|
|
49
|
+
set density(value: number);
|
|
50
|
+
/** Random time-offset spread for grain start positions, 0..1. Higher values scatter grains further into the past. Default 0.5. */
|
|
51
|
+
get spread(): number;
|
|
52
|
+
set spread(value: number);
|
|
53
|
+
/** Minimum per-grain pitch ratio. Range 0.25..4, default 1.0. */
|
|
54
|
+
get pitchMin(): number;
|
|
55
|
+
set pitchMin(value: number);
|
|
56
|
+
/** Maximum per-grain pitch ratio. Range 0.25..4, default 1.0. */
|
|
57
|
+
get pitchMax(): number;
|
|
58
|
+
set pitchMax(value: number);
|
|
59
|
+
/** Wet (granular) mix level, 0..1. Default 1.0. */
|
|
60
|
+
get wet(): number;
|
|
61
|
+
set wet(value: number);
|
|
62
|
+
}
|