@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,176 @@
|
|
|
1
|
+
import { WorkletFilter } from './WorkletFilter.js';
|
|
2
|
+
|
|
3
|
+
const granularWorkletSource = `
|
|
4
|
+
const sampleRate = globalThis.sampleRate;
|
|
5
|
+
|
|
6
|
+
class GranularProcessor extends AudioWorkletProcessor {
|
|
7
|
+
static get parameterDescriptors() {
|
|
8
|
+
return [
|
|
9
|
+
{ name: 'grainSize', defaultValue: 0.05, minValue: 0.005, maxValue: 0.5, automationRate: 'k-rate' },
|
|
10
|
+
{ name: 'density', defaultValue: 50, minValue: 1, maxValue: 500, automationRate: 'k-rate' },
|
|
11
|
+
{ name: 'spread', defaultValue: 0.5, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
|
|
12
|
+
{ name: 'pitchMin', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },
|
|
13
|
+
{ name: 'pitchMax', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },
|
|
14
|
+
{ name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super();
|
|
20
|
+
const opts = options.processorOptions ?? {};
|
|
21
|
+
const bufferSeconds = opts.bufferSeconds ?? 2;
|
|
22
|
+
this._bufferLength = Math.floor(bufferSeconds * sampleRate);
|
|
23
|
+
this._buffer = new Float32Array(this._bufferLength);
|
|
24
|
+
this._writePos = 0;
|
|
25
|
+
this._timeUntilNextGrainSamples = 0;
|
|
26
|
+
this._grains = []; // { startPos, ageSamples, lengthSamples, pitch }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
process(inputs, outputs, parameters) {
|
|
30
|
+
const input = inputs[0]?.[0];
|
|
31
|
+
const output = outputs[0]?.[0];
|
|
32
|
+
if (!input || !output) return true;
|
|
33
|
+
|
|
34
|
+
const grainSize = parameters.grainSize[0];
|
|
35
|
+
const density = parameters.density[0];
|
|
36
|
+
const spread = parameters.spread[0];
|
|
37
|
+
const pitchMin = parameters.pitchMin[0];
|
|
38
|
+
const pitchMax = parameters.pitchMax[0];
|
|
39
|
+
const wet = parameters.wet[0];
|
|
40
|
+
|
|
41
|
+
const grainSizeSamples = Math.max(8, Math.floor(grainSize * sampleRate));
|
|
42
|
+
const samplesPerGrain = sampleRate / Math.max(1, density);
|
|
43
|
+
|
|
44
|
+
for (let i = 0; i < input.length; i++) {
|
|
45
|
+
// Write input to circular buffer
|
|
46
|
+
this._buffer[this._writePos] = input[i];
|
|
47
|
+
this._writePos = (this._writePos + 1) % this._bufferLength;
|
|
48
|
+
|
|
49
|
+
// Spawn new grain if scheduled
|
|
50
|
+
this._timeUntilNextGrainSamples -= 1;
|
|
51
|
+
if (this._timeUntilNextGrainSamples <= 0) {
|
|
52
|
+
// Random offset into recent past, biased by spread
|
|
53
|
+
const maxOffset = Math.floor(spread * this._bufferLength);
|
|
54
|
+
const offset = Math.floor(Math.random() * Math.max(1, maxOffset));
|
|
55
|
+
const startPos = (this._writePos - offset - grainSizeSamples + this._bufferLength) % this._bufferLength;
|
|
56
|
+
// Random pitch in [pitchMin, pitchMax]
|
|
57
|
+
const pitch = pitchMin + Math.random() * Math.max(0, pitchMax - pitchMin);
|
|
58
|
+
|
|
59
|
+
this._grains.push({ startPos, ageSamples: 0, lengthSamples: grainSizeSamples, pitch });
|
|
60
|
+
this._timeUntilNextGrainSamples = samplesPerGrain;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Mix all active grains (apply Hann window)
|
|
64
|
+
let grainSum = 0;
|
|
65
|
+
for (let g = this._grains.length - 1; g >= 0; g--) {
|
|
66
|
+
const grain = this._grains[g];
|
|
67
|
+
if (grain.ageSamples >= grain.lengthSamples) {
|
|
68
|
+
this._grains.splice(g, 1);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const phase = grain.ageSamples / grain.lengthSamples;
|
|
73
|
+
const window = 0.5 * (1 - Math.cos(2 * Math.PI * phase));
|
|
74
|
+
const readPos = grain.startPos + grain.ageSamples * grain.pitch;
|
|
75
|
+
const idx = Math.floor(readPos) % this._bufferLength;
|
|
76
|
+
const safeIdx = (idx + this._bufferLength) % this._bufferLength;
|
|
77
|
+
grainSum += this._buffer[safeIdx] * window;
|
|
78
|
+
|
|
79
|
+
grain.ageSamples++;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
output[i] = (1 - wet) * input[i] + wet * grainSum;
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
registerProcessor('exojs-granular', GranularProcessor);
|
|
88
|
+
`;
|
|
89
|
+
/**
|
|
90
|
+
* Granular synthesis filter — slices input into small Hann-windowed grains
|
|
91
|
+
* and replays them with randomized parameters. Use cases:
|
|
92
|
+
*
|
|
93
|
+
* - Ambient texture: long grain (200ms+), low density (10-30/s), high
|
|
94
|
+
* spread, pitch range 0.5-1.5x. Creates evolving pad-like sounds.
|
|
95
|
+
* - Glitch: short grain (10-20ms), high density (100+/s), very high
|
|
96
|
+
* spread, pitch range 0.7-1.3x. Stuttering, lo-fi effects.
|
|
97
|
+
* - Time-stretch (low pitch with overlap): grain ~50ms, density 50/s,
|
|
98
|
+
* spread 0, pitch 1.0. Pseudo-stretches the input by buffering.
|
|
99
|
+
* - Pitch cloud: medium grain, medium density, pitchMin 0.5, pitchMax 2.0
|
|
100
|
+
* gives a "shimmer" effect of overlapping pitches.
|
|
101
|
+
*/
|
|
102
|
+
class GranularFilter extends WorkletFilter {
|
|
103
|
+
_grainSize;
|
|
104
|
+
_density;
|
|
105
|
+
_spread;
|
|
106
|
+
_pitchMin;
|
|
107
|
+
_pitchMax;
|
|
108
|
+
_wet;
|
|
109
|
+
_bufferSeconds;
|
|
110
|
+
constructor(options = {}) {
|
|
111
|
+
super();
|
|
112
|
+
this._grainSize = Math.max(0.005, Math.min(0.5, options.grainSize ?? 0.05));
|
|
113
|
+
this._density = Math.max(1, Math.min(500, options.density ?? 50));
|
|
114
|
+
this._spread = Math.max(0, Math.min(1, options.spread ?? 0.5));
|
|
115
|
+
this._pitchMin = Math.max(0.25, Math.min(4, options.pitchMin ?? 1.0));
|
|
116
|
+
this._pitchMax = Math.max(0.25, Math.min(4, options.pitchMax ?? 1.0));
|
|
117
|
+
this._wet = Math.max(0, Math.min(1, options.wet ?? 1.0));
|
|
118
|
+
this._bufferSeconds = options.bufferSeconds ?? 2;
|
|
119
|
+
}
|
|
120
|
+
get _workletName() { return 'exojs-granular'; }
|
|
121
|
+
get _workletSource() { return granularWorkletSource; }
|
|
122
|
+
get _workletOptions() {
|
|
123
|
+
return {
|
|
124
|
+
numberOfInputs: 1,
|
|
125
|
+
numberOfOutputs: 1,
|
|
126
|
+
processorOptions: { bufferSeconds: this._bufferSeconds },
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
_onWorkletReady() {
|
|
130
|
+
this._setAudioParam('grainSize', this._grainSize);
|
|
131
|
+
this._setAudioParam('density', this._density);
|
|
132
|
+
this._setAudioParam('spread', this._spread);
|
|
133
|
+
this._setAudioParam('pitchMin', this._pitchMin);
|
|
134
|
+
this._setAudioParam('pitchMax', this._pitchMax);
|
|
135
|
+
this._setAudioParam('wet', this._wet);
|
|
136
|
+
}
|
|
137
|
+
/** Duration of each grain in seconds. Range 0.005..0.5, default 0.05. */
|
|
138
|
+
get grainSize() { return this._grainSize; }
|
|
139
|
+
set grainSize(value) {
|
|
140
|
+
this._grainSize = Math.max(0.005, Math.min(0.5, value));
|
|
141
|
+
this._setAudioParam('grainSize', this._grainSize);
|
|
142
|
+
}
|
|
143
|
+
/** Number of grains spawned per second. Range 1..500, default 50. */
|
|
144
|
+
get density() { return this._density; }
|
|
145
|
+
set density(value) {
|
|
146
|
+
this._density = Math.max(1, Math.min(500, value));
|
|
147
|
+
this._setAudioParam('density', this._density);
|
|
148
|
+
}
|
|
149
|
+
/** Random time-offset spread for grain start positions, 0..1. Higher values scatter grains further into the past. Default 0.5. */
|
|
150
|
+
get spread() { return this._spread; }
|
|
151
|
+
set spread(value) {
|
|
152
|
+
this._spread = Math.max(0, Math.min(1, value));
|
|
153
|
+
this._setAudioParam('spread', this._spread);
|
|
154
|
+
}
|
|
155
|
+
/** Minimum per-grain pitch ratio. Range 0.25..4, default 1.0. */
|
|
156
|
+
get pitchMin() { return this._pitchMin; }
|
|
157
|
+
set pitchMin(value) {
|
|
158
|
+
this._pitchMin = Math.max(0.25, Math.min(4, value));
|
|
159
|
+
this._setAudioParam('pitchMin', this._pitchMin);
|
|
160
|
+
}
|
|
161
|
+
/** Maximum per-grain pitch ratio. Range 0.25..4, default 1.0. */
|
|
162
|
+
get pitchMax() { return this._pitchMax; }
|
|
163
|
+
set pitchMax(value) {
|
|
164
|
+
this._pitchMax = Math.max(0.25, Math.min(4, value));
|
|
165
|
+
this._setAudioParam('pitchMax', this._pitchMax);
|
|
166
|
+
}
|
|
167
|
+
/** Wet (granular) mix level, 0..1. Default 1.0. */
|
|
168
|
+
get wet() { return this._wet; }
|
|
169
|
+
set wet(value) {
|
|
170
|
+
this._wet = Math.max(0, Math.min(1, value));
|
|
171
|
+
this._setAudioParam('wet', this._wet);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export { GranularFilter };
|
|
176
|
+
//# sourceMappingURL=GranularFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GranularFilter.js","sources":["../../../../../src/audio/filters/GranularFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link HighpassFilter}. */
|
|
3
|
+
export interface HighpassFilterOptions {
|
|
4
|
+
frequency?: number;
|
|
5
|
+
resonance?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* High-pass filter backed by a `BiquadFilterNode` in `highpass` mode.
|
|
9
|
+
* Attenuates frequencies below the cutoff and passes everything above it.
|
|
10
|
+
* Useful for removing low-frequency rumble, thinning out bass-heavy audio,
|
|
11
|
+
* or sculpting mix headroom. The `resonance` (Q) parameter controls the
|
|
12
|
+
* sharpness of the roll-off peak at the cutoff frequency.
|
|
13
|
+
*/
|
|
14
|
+
export declare class HighpassFilter extends AudioFilter {
|
|
15
|
+
private _node;
|
|
16
|
+
private _frequency;
|
|
17
|
+
private _resonance;
|
|
18
|
+
constructor(options?: HighpassFilterOptions);
|
|
19
|
+
get inputNode(): AudioNode;
|
|
20
|
+
get outputNode(): AudioNode;
|
|
21
|
+
/** Cutoff frequency in Hz. Signals below this frequency are attenuated. Range 20..20000, default 1000. */
|
|
22
|
+
get frequency(): number;
|
|
23
|
+
set frequency(value: number);
|
|
24
|
+
/** Q (resonance) at the cutoff. Higher values create a sharper, resonant peak. Minimum 0.0001, default 1. */
|
|
25
|
+
get resonance(): number;
|
|
26
|
+
set resonance(value: number);
|
|
27
|
+
destroy(): void;
|
|
28
|
+
private _setup;
|
|
29
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
|
|
2
|
+
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* High-pass filter backed by a `BiquadFilterNode` in `highpass` mode.
|
|
6
|
+
* Attenuates frequencies below the cutoff and passes everything above it.
|
|
7
|
+
* Useful for removing low-frequency rumble, thinning out bass-heavy audio,
|
|
8
|
+
* or sculpting mix headroom. The `resonance` (Q) parameter controls the
|
|
9
|
+
* sharpness of the roll-off peak at the cutoff frequency.
|
|
10
|
+
*/
|
|
11
|
+
class HighpassFilter extends AudioFilter {
|
|
12
|
+
_node = null;
|
|
13
|
+
_frequency;
|
|
14
|
+
_resonance;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
super();
|
|
17
|
+
this._frequency = options.frequency ?? 1000;
|
|
18
|
+
this._resonance = options.resonance ?? 1;
|
|
19
|
+
if (isAudioContextReady()) {
|
|
20
|
+
this._setup(getAudioContext());
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
onAudioContextReady.once(this._setup, this);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
get inputNode() {
|
|
27
|
+
if (!this._node)
|
|
28
|
+
throw new Error('HighpassFilter not yet initialized.');
|
|
29
|
+
return this._node;
|
|
30
|
+
}
|
|
31
|
+
get outputNode() {
|
|
32
|
+
if (!this._node)
|
|
33
|
+
throw new Error('HighpassFilter not yet initialized.');
|
|
34
|
+
return this._node;
|
|
35
|
+
}
|
|
36
|
+
/** Cutoff frequency in Hz. Signals below this frequency are attenuated. Range 20..20000, default 1000. */
|
|
37
|
+
get frequency() {
|
|
38
|
+
return this._frequency;
|
|
39
|
+
}
|
|
40
|
+
set frequency(value) {
|
|
41
|
+
this._frequency = Math.max(20, Math.min(20000, value));
|
|
42
|
+
if (this._node) {
|
|
43
|
+
this._node.frequency.setTargetAtTime(this._frequency, this._node.context.currentTime, 0.01);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Q (resonance) at the cutoff. Higher values create a sharper, resonant peak. Minimum 0.0001, default 1. */
|
|
47
|
+
get resonance() {
|
|
48
|
+
return this._resonance;
|
|
49
|
+
}
|
|
50
|
+
set resonance(value) {
|
|
51
|
+
this._resonance = Math.max(0.0001, value);
|
|
52
|
+
if (this._node) {
|
|
53
|
+
this._node.Q.setTargetAtTime(this._resonance, this._node.context.currentTime, 0.01);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
destroy() {
|
|
57
|
+
onAudioContextReady.clearByContext(this);
|
|
58
|
+
this._node?.disconnect();
|
|
59
|
+
this._node = null;
|
|
60
|
+
}
|
|
61
|
+
_setup(ctx) {
|
|
62
|
+
const node = ctx.createBiquadFilter();
|
|
63
|
+
node.type = 'highpass';
|
|
64
|
+
node.frequency.setValueAtTime(this._frequency, ctx.currentTime);
|
|
65
|
+
node.Q.setValueAtTime(this._resonance, ctx.currentTime);
|
|
66
|
+
this._node = node;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { HighpassFilter };
|
|
71
|
+
//# sourceMappingURL=HighpassFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HighpassFilter.js","sources":["../../../../../src/audio/filters/HighpassFilter.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AASA;;;;;;AAMG;AACG,MAAO,cAAe,SAAQ,WAAW,CAAA;IACnC,KAAK,GAA4B,IAAI;AACrC,IAAA,UAAU;AACV,IAAA,UAAU;AAElB,IAAA,WAAA,CAAmB,UAAiC,EAAE,EAAA;AAClD,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC;QACxC,IAAI,mBAAmB,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAClC;aAAO;YACH,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAC/C;IACJ;AAEA,IAAA,IAAW,SAAS,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK;IACrB;AAEA,IAAA,IAAW,UAAU,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK;IACrB;;AAGA,IAAA,IAAW,SAAS,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU;IAC1B;IAEA,IAAW,SAAS,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QAC/F;IACJ;;AAGA,IAAA,IAAW,SAAS,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU;IAC1B;IAEA,IAAW,SAAS,CAAC,KAAa,EAAA;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;AACzC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QACvF;IACJ;IAEgB,OAAO,GAAA;AACnB,QAAA,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACrB;AAEQ,IAAA,MAAM,CAAC,GAAiB,EAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,kBAAkB,EAAE;AACrC,QAAA,IAAI,CAAC,IAAI,GAAG,UAAU;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC;AAC/D,QAAA,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC;AACvD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACrB;AACH;;;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link LowpassFilter}. */
|
|
3
|
+
export interface LowpassFilterOptions {
|
|
4
|
+
frequency?: number;
|
|
5
|
+
resonance?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Low-pass filter backed by a `BiquadFilterNode` in `lowpass` mode.
|
|
9
|
+
* Attenuates frequencies above the cutoff and passes everything below it.
|
|
10
|
+
* Useful for muffling audio (e.g., sound heard through a wall), taming
|
|
11
|
+
* harsh high-frequency content, or creating underwater/telephone effects.
|
|
12
|
+
* The `resonance` (Q) parameter controls the sharpness of the roll-off peak.
|
|
13
|
+
*/
|
|
14
|
+
export declare class LowpassFilter extends AudioFilter {
|
|
15
|
+
private _node;
|
|
16
|
+
private _frequency;
|
|
17
|
+
private _resonance;
|
|
18
|
+
constructor(options?: LowpassFilterOptions);
|
|
19
|
+
get inputNode(): AudioNode;
|
|
20
|
+
get outputNode(): AudioNode;
|
|
21
|
+
/** Cutoff frequency in Hz. Signals above this frequency are attenuated. Range 20..20000, default 1000. */
|
|
22
|
+
get frequency(): number;
|
|
23
|
+
set frequency(value: number);
|
|
24
|
+
/** Q (resonance) at the cutoff. Higher values create a sharper, resonant peak. Minimum 0.0001, default 1. */
|
|
25
|
+
get resonance(): number;
|
|
26
|
+
set resonance(value: number);
|
|
27
|
+
destroy(): void;
|
|
28
|
+
private _setup;
|
|
29
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
|
|
2
|
+
import { AudioFilter } from '../AudioFilter.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Low-pass filter backed by a `BiquadFilterNode` in `lowpass` mode.
|
|
6
|
+
* Attenuates frequencies above the cutoff and passes everything below it.
|
|
7
|
+
* Useful for muffling audio (e.g., sound heard through a wall), taming
|
|
8
|
+
* harsh high-frequency content, or creating underwater/telephone effects.
|
|
9
|
+
* The `resonance` (Q) parameter controls the sharpness of the roll-off peak.
|
|
10
|
+
*/
|
|
11
|
+
class LowpassFilter extends AudioFilter {
|
|
12
|
+
_node = null;
|
|
13
|
+
_frequency;
|
|
14
|
+
_resonance;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
super();
|
|
17
|
+
this._frequency = options.frequency ?? 1000;
|
|
18
|
+
this._resonance = options.resonance ?? 1;
|
|
19
|
+
if (isAudioContextReady()) {
|
|
20
|
+
this._setup(getAudioContext());
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
onAudioContextReady.once(this._setup, this);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
get inputNode() {
|
|
27
|
+
if (!this._node)
|
|
28
|
+
throw new Error('LowpassFilter not yet initialized.');
|
|
29
|
+
return this._node;
|
|
30
|
+
}
|
|
31
|
+
get outputNode() {
|
|
32
|
+
if (!this._node)
|
|
33
|
+
throw new Error('LowpassFilter not yet initialized.');
|
|
34
|
+
return this._node;
|
|
35
|
+
}
|
|
36
|
+
/** Cutoff frequency in Hz. Signals above this frequency are attenuated. Range 20..20000, default 1000. */
|
|
37
|
+
get frequency() {
|
|
38
|
+
return this._frequency;
|
|
39
|
+
}
|
|
40
|
+
set frequency(value) {
|
|
41
|
+
this._frequency = Math.max(20, Math.min(20000, value));
|
|
42
|
+
if (this._node) {
|
|
43
|
+
this._node.frequency.setTargetAtTime(this._frequency, this._node.context.currentTime, 0.01);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Q (resonance) at the cutoff. Higher values create a sharper, resonant peak. Minimum 0.0001, default 1. */
|
|
47
|
+
get resonance() {
|
|
48
|
+
return this._resonance;
|
|
49
|
+
}
|
|
50
|
+
set resonance(value) {
|
|
51
|
+
this._resonance = Math.max(0.0001, value);
|
|
52
|
+
if (this._node) {
|
|
53
|
+
this._node.Q.setTargetAtTime(this._resonance, this._node.context.currentTime, 0.01);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
destroy() {
|
|
57
|
+
onAudioContextReady.clearByContext(this);
|
|
58
|
+
this._node?.disconnect();
|
|
59
|
+
this._node = null;
|
|
60
|
+
}
|
|
61
|
+
_setup(ctx) {
|
|
62
|
+
const node = ctx.createBiquadFilter();
|
|
63
|
+
node.type = 'lowpass';
|
|
64
|
+
node.frequency.setValueAtTime(this._frequency, ctx.currentTime);
|
|
65
|
+
node.Q.setValueAtTime(this._resonance, ctx.currentTime);
|
|
66
|
+
this._node = node;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { LowpassFilter };
|
|
71
|
+
//# sourceMappingURL=LowpassFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LowpassFilter.js","sources":["../../../../../src/audio/filters/LowpassFilter.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AASA;;;;;;AAMG;AACG,MAAO,aAAc,SAAQ,WAAW,CAAA;IAClC,KAAK,GAA4B,IAAI;AACrC,IAAA,UAAU;AACV,IAAA,UAAU;AAElB,IAAA,WAAA,CAAmB,UAAgC,EAAE,EAAA;AACjD,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC;QACxC,IAAI,mBAAmB,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAClC;aAAO;YACH,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAC/C;IACJ;AAEA,IAAA,IAAW,SAAS,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK;IACrB;AAEA,IAAA,IAAW,UAAU,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK;IACrB;;AAGA,IAAA,IAAW,SAAS,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU;IAC1B;IAEA,IAAW,SAAS,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QAC/F;IACJ;;AAGA,IAAA,IAAW,SAAS,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU;IAC1B;IAEA,IAAW,SAAS,CAAC,KAAa,EAAA;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;AACzC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QACvF;IACJ;IAEgB,OAAO,GAAA;AACnB,QAAA,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACrB;AAEQ,IAAA,MAAM,CAAC,GAAiB,EAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,kBAAkB,EAAE;AACrC,QAAA,IAAI,CAAC,IAAI,GAAG,SAAS;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC;AAC/D,QAAA,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC;AACvD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACrB;AACH;;;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { WorkletFilter } from './WorkletFilter';
|
|
2
|
+
export interface PitchShiftFilterOptions {
|
|
3
|
+
/** Pitch ratio. 1.0 = no change, 0.5 = octave down, 2.0 = octave up. Default 1.0. */
|
|
4
|
+
pitch?: number;
|
|
5
|
+
/** Dry/wet mix, 0..1. Default 1.0 (full wet). */
|
|
6
|
+
wet?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Internal grain size in samples. Default 1024 (~21ms at 48kHz).
|
|
9
|
+
* Larger = more delay but cleaner pitch shifting.
|
|
10
|
+
*/
|
|
11
|
+
grainSize?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Real-time pitch shifter via granular synthesis (WorkletFilter).
|
|
15
|
+
*
|
|
16
|
+
* Quality: good for ±1 octave (pitch 0.5x-2.0x). Beyond that, audible
|
|
17
|
+
* artifacts (graininess, phase issues). For high-quality pitch shift,
|
|
18
|
+
* a phase-vocoder approach is required and not available in V1.
|
|
19
|
+
*
|
|
20
|
+
* Latency: ~half-grain-size = ~10ms at default 1024-sample grains
|
|
21
|
+
* (at 48kHz sample rate). Not suitable for live monitoring; fine for
|
|
22
|
+
* games / playback.
|
|
23
|
+
*
|
|
24
|
+
* Use cases:
|
|
25
|
+
* - Sound variation: random ±200 cent pitch on each footstep / bullet
|
|
26
|
+
* - Voice effects: chipmunk (1.5x) or demon (0.7x) for game NPCs
|
|
27
|
+
* - Detune layering: stack 0.99x and 1.01x for thick chorused sound
|
|
28
|
+
*/
|
|
29
|
+
export declare class PitchShiftFilter extends WorkletFilter {
|
|
30
|
+
private _pitch;
|
|
31
|
+
private _wet;
|
|
32
|
+
private readonly _grainSize;
|
|
33
|
+
constructor(options?: PitchShiftFilterOptions);
|
|
34
|
+
protected get _workletName(): string;
|
|
35
|
+
protected get _workletSource(): string;
|
|
36
|
+
protected get _workletOptions(): AudioWorkletNodeOptions;
|
|
37
|
+
protected _onWorkletReady(): void;
|
|
38
|
+
/** Pitch ratio relative to the original. 1.0 = no change, 0.5 = one octave down, 2.0 = one octave up. Range 0.25..4.0, default 1.0. */
|
|
39
|
+
get pitch(): number;
|
|
40
|
+
set pitch(value: number);
|
|
41
|
+
/** Wet (pitch-shifted) mix level, 0..1. Default 1.0 (full wet). */
|
|
42
|
+
get wet(): number;
|
|
43
|
+
set wet(value: number);
|
|
44
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { WorkletFilter } from './WorkletFilter.js';
|
|
2
|
+
|
|
3
|
+
const pitchShiftWorkletSource = `
|
|
4
|
+
class PitchShiftProcessor extends AudioWorkletProcessor {
|
|
5
|
+
static get parameterDescriptors() {
|
|
6
|
+
return [
|
|
7
|
+
{ name: 'pitch', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },
|
|
8
|
+
{ name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
|
|
9
|
+
];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super();
|
|
14
|
+
const grainSize = options.processorOptions?.grainSize ?? 1024;
|
|
15
|
+
this._grainSize = grainSize;
|
|
16
|
+
this._bufferLength = grainSize * 4;
|
|
17
|
+
this._buffer = new Float32Array(this._bufferLength);
|
|
18
|
+
this._writePos = 0;
|
|
19
|
+
// Two staggered read positions for overlap-add
|
|
20
|
+
this._readPosA = 0;
|
|
21
|
+
this._readPosB = grainSize / 2;
|
|
22
|
+
this._hannWindow = this._buildHannWindow(grainSize);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
_buildHannWindow(n) {
|
|
26
|
+
const w = new Float32Array(n);
|
|
27
|
+
for (let i = 0; i < n; i++) {
|
|
28
|
+
w[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (n - 1)));
|
|
29
|
+
}
|
|
30
|
+
return w;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_readGrain(readPos) {
|
|
34
|
+
const grainSize = this._grainSize;
|
|
35
|
+
const idx = Math.floor(readPos);
|
|
36
|
+
const phase = idx % grainSize; // position within the grain envelope
|
|
37
|
+
const win = this._hannWindow[phase];
|
|
38
|
+
const bufIdx = ((this._writePos - this._bufferLength + idx) % this._bufferLength + this._bufferLength) % this._bufferLength;
|
|
39
|
+
return this._buffer[bufIdx] * win;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
process(inputs, outputs, parameters) {
|
|
43
|
+
const input = inputs[0]?.[0];
|
|
44
|
+
const output = outputs[0]?.[0];
|
|
45
|
+
if (!input || !output) return true;
|
|
46
|
+
|
|
47
|
+
const pitch = parameters.pitch[0];
|
|
48
|
+
const wet = parameters.wet[0];
|
|
49
|
+
|
|
50
|
+
for (let i = 0; i < input.length; i++) {
|
|
51
|
+
// Write to circular buffer
|
|
52
|
+
this._buffer[this._writePos] = input[i];
|
|
53
|
+
this._writePos = (this._writePos + 1) % this._bufferLength;
|
|
54
|
+
|
|
55
|
+
// Read two grains and sum
|
|
56
|
+
const grainA = this._readGrain(this._readPosA);
|
|
57
|
+
const grainB = this._readGrain(this._readPosB);
|
|
58
|
+
const shifted = grainA + grainB;
|
|
59
|
+
|
|
60
|
+
// Mix with dry
|
|
61
|
+
output[i] = (1 - wet) * input[i] + wet * shifted;
|
|
62
|
+
|
|
63
|
+
// Advance read positions at pitch rate
|
|
64
|
+
this._readPosA += pitch;
|
|
65
|
+
this._readPosB += pitch;
|
|
66
|
+
if (this._readPosA >= this._grainSize) this._readPosA -= this._grainSize;
|
|
67
|
+
if (this._readPosB >= this._grainSize) this._readPosB -= this._grainSize;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
registerProcessor('exojs-pitch-shift', PitchShiftProcessor);
|
|
73
|
+
`;
|
|
74
|
+
/**
|
|
75
|
+
* Real-time pitch shifter via granular synthesis (WorkletFilter).
|
|
76
|
+
*
|
|
77
|
+
* Quality: good for ±1 octave (pitch 0.5x-2.0x). Beyond that, audible
|
|
78
|
+
* artifacts (graininess, phase issues). For high-quality pitch shift,
|
|
79
|
+
* a phase-vocoder approach is required and not available in V1.
|
|
80
|
+
*
|
|
81
|
+
* Latency: ~half-grain-size = ~10ms at default 1024-sample grains
|
|
82
|
+
* (at 48kHz sample rate). Not suitable for live monitoring; fine for
|
|
83
|
+
* games / playback.
|
|
84
|
+
*
|
|
85
|
+
* Use cases:
|
|
86
|
+
* - Sound variation: random ±200 cent pitch on each footstep / bullet
|
|
87
|
+
* - Voice effects: chipmunk (1.5x) or demon (0.7x) for game NPCs
|
|
88
|
+
* - Detune layering: stack 0.99x and 1.01x for thick chorused sound
|
|
89
|
+
*/
|
|
90
|
+
class PitchShiftFilter extends WorkletFilter {
|
|
91
|
+
_pitch;
|
|
92
|
+
_wet;
|
|
93
|
+
_grainSize;
|
|
94
|
+
constructor(options = {}) {
|
|
95
|
+
super();
|
|
96
|
+
this._pitch = Math.max(0.25, Math.min(4.0, options.pitch ?? 1.0));
|
|
97
|
+
this._wet = Math.max(0, Math.min(1.0, options.wet ?? 1.0));
|
|
98
|
+
this._grainSize = options.grainSize ?? 1024;
|
|
99
|
+
}
|
|
100
|
+
get _workletName() {
|
|
101
|
+
return 'exojs-pitch-shift';
|
|
102
|
+
}
|
|
103
|
+
get _workletSource() {
|
|
104
|
+
return pitchShiftWorkletSource;
|
|
105
|
+
}
|
|
106
|
+
get _workletOptions() {
|
|
107
|
+
return {
|
|
108
|
+
numberOfInputs: 1,
|
|
109
|
+
numberOfOutputs: 1,
|
|
110
|
+
processorOptions: { grainSize: this._grainSize },
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
_onWorkletReady() {
|
|
114
|
+
this._setAudioParam('pitch', this._pitch);
|
|
115
|
+
this._setAudioParam('wet', this._wet);
|
|
116
|
+
}
|
|
117
|
+
/** Pitch ratio relative to the original. 1.0 = no change, 0.5 = one octave down, 2.0 = one octave up. Range 0.25..4.0, default 1.0. */
|
|
118
|
+
get pitch() { return this._pitch; }
|
|
119
|
+
set pitch(value) {
|
|
120
|
+
this._pitch = Math.max(0.25, Math.min(4.0, value));
|
|
121
|
+
this._setAudioParam('pitch', this._pitch);
|
|
122
|
+
}
|
|
123
|
+
/** Wet (pitch-shifted) mix level, 0..1. Default 1.0 (full wet). */
|
|
124
|
+
get wet() { return this._wet; }
|
|
125
|
+
set wet(value) {
|
|
126
|
+
this._wet = Math.max(0, Math.min(1.0, value));
|
|
127
|
+
this._setAudioParam('wet', this._wet);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export { PitchShiftFilter };
|
|
132
|
+
//# sourceMappingURL=PitchShiftFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PitchShiftFilter.js","sources":["../../../../../src/audio/filters/PitchShiftFilter.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsE/B;AAcD;;;;;;;;;;;;;;;AAeG;AACG,MAAO,gBAAiB,SAAQ,aAAa,CAAA;AACvC,IAAA,MAAM;AACN,IAAA,IAAI;AACK,IAAA,UAAU;AAE3B,IAAA,WAAA,CAAmB,UAAmC,EAAE,EAAA;AACpD,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,MAAM,GAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,GAAS,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI;IAC/C;AAEA,IAAA,IAAc,YAAY,GAAA;AACtB,QAAA,OAAO,mBAAmB;IAC9B;AAEA,IAAA,IAAc,cAAc,GAAA;AACxB,QAAA,OAAO,uBAAuB;IAClC;AAEA,IAAA,IAAuB,eAAe,GAAA;QAClC,OAAO;AACH,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,eAAe,EAAE,CAAC;AAClB,YAAA,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;SACnD;IACL;IAEmB,eAAe,GAAA;QAC9B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACzC;;IAGA,IAAW,KAAK,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,IAAW,KAAK,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;IAC7C;;IAGA,IAAW,GAAG,KAAa,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAW,GAAG,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACzC;AACH;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AudioFilter } from '../AudioFilter';
|
|
2
|
+
/** Construction options for {@link ReverbFilter}. */
|
|
3
|
+
export interface ReverbFilterOptions {
|
|
4
|
+
durationSeconds?: number;
|
|
5
|
+
decay?: number;
|
|
6
|
+
wet?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Convolution reverb using a procedurally-generated impulse response loaded
|
|
10
|
+
* into a `ConvolverNode`. The impulse response is a stereo noise burst whose
|
|
11
|
+
* amplitude decays exponentially, simulating room reflections. Adjusting
|
|
12
|
+
* `durationSeconds` or `decay` rebuilds the impulse response immediately, so
|
|
13
|
+
* avoid animating these properties at audio rate — use `wet` for real-time
|
|
14
|
+
* mix control instead.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ReverbFilter extends AudioFilter {
|
|
17
|
+
private _setup;
|
|
18
|
+
private _duration;
|
|
19
|
+
private _decay;
|
|
20
|
+
private _wet;
|
|
21
|
+
constructor(options?: ReverbFilterOptions);
|
|
22
|
+
get inputNode(): AudioNode;
|
|
23
|
+
get outputNode(): AudioNode;
|
|
24
|
+
/** Length of the generated impulse response in seconds. Range 0.1..5, default 2. Changing this rebuilds the IR buffer. */
|
|
25
|
+
get durationSeconds(): number;
|
|
26
|
+
set durationSeconds(value: number);
|
|
27
|
+
/** Exponential decay rate of the impulse response. Higher values produce a tighter, drier reverb tail. Range 0.5..10, default 2. Changing this rebuilds the IR buffer. */
|
|
28
|
+
get decay(): number;
|
|
29
|
+
set decay(value: number);
|
|
30
|
+
/** Wet (reverberated) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.4. */
|
|
31
|
+
get wet(): number;
|
|
32
|
+
set wet(value: number);
|
|
33
|
+
destroy(): void;
|
|
34
|
+
private _generateImpulseResponse;
|
|
35
|
+
private _setupNodes;
|
|
36
|
+
}
|