@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.
Files changed (512) hide show
  1. package/CHANGELOG.md +1424 -0
  2. package/dist/esm/animation/Tween.d.ts +60 -1
  3. package/dist/esm/animation/Tween.js +60 -1
  4. package/dist/esm/animation/Tween.js.map +1 -1
  5. package/dist/esm/animation/TweenManager.d.ts +10 -0
  6. package/dist/esm/animation/TweenManager.js +10 -0
  7. package/dist/esm/animation/TweenManager.js.map +1 -1
  8. package/dist/esm/animation/types.d.ts +15 -0
  9. package/dist/esm/animation/types.js +6 -0
  10. package/dist/esm/animation/types.js.map +1 -1
  11. package/dist/esm/audio/AbstractMedia.d.ts +29 -0
  12. package/dist/esm/audio/AbstractMedia.js +76 -0
  13. package/dist/esm/audio/AbstractMedia.js.map +1 -1
  14. package/dist/esm/audio/AudioAnalyser.d.ts +83 -23
  15. package/dist/esm/audio/AudioAnalyser.js +277 -57
  16. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  17. package/dist/esm/audio/AudioBus.d.ts +82 -0
  18. package/dist/esm/audio/AudioBus.js +255 -0
  19. package/dist/esm/audio/AudioBus.js.map +1 -0
  20. package/dist/esm/audio/AudioFilter.d.ts +16 -0
  21. package/dist/esm/audio/AudioFilter.js +13 -0
  22. package/dist/esm/audio/AudioFilter.js.map +1 -0
  23. package/dist/esm/audio/AudioListener.d.ts +39 -0
  24. package/dist/esm/audio/AudioListener.js +97 -0
  25. package/dist/esm/audio/AudioListener.js.map +1 -0
  26. package/dist/esm/audio/AudioManager.d.ts +68 -0
  27. package/dist/esm/audio/AudioManager.js +139 -0
  28. package/dist/esm/audio/AudioManager.js.map +1 -0
  29. package/dist/esm/audio/BeatDetector.d.ts +142 -0
  30. package/dist/esm/audio/BeatDetector.js +957 -0
  31. package/dist/esm/audio/BeatDetector.js.map +1 -0
  32. package/dist/esm/audio/Envelope.d.ts +44 -0
  33. package/dist/esm/audio/Envelope.js +60 -0
  34. package/dist/esm/audio/Envelope.js.map +1 -0
  35. package/dist/esm/audio/Media.d.ts +11 -0
  36. package/dist/esm/audio/Music.d.ts +20 -0
  37. package/dist/esm/audio/Music.js +45 -4
  38. package/dist/esm/audio/Music.js.map +1 -1
  39. package/dist/esm/audio/OscillatorSound.d.ts +98 -0
  40. package/dist/esm/audio/OscillatorSound.js +342 -0
  41. package/dist/esm/audio/OscillatorSound.js.map +1 -0
  42. package/dist/esm/audio/Sound.d.ts +119 -9
  43. package/dist/esm/audio/Sound.js +301 -117
  44. package/dist/esm/audio/Sound.js.map +1 -1
  45. package/dist/esm/audio/audio-context.d.ts +48 -0
  46. package/dist/esm/audio/audio-context.js +48 -5
  47. package/dist/esm/audio/audio-context.js.map +1 -1
  48. package/dist/esm/audio/crossFade.d.ts +19 -0
  49. package/dist/esm/audio/crossFade.js +26 -0
  50. package/dist/esm/audio/crossFade.js.map +1 -0
  51. package/dist/esm/audio/dsp/fft.d.ts +22 -0
  52. package/dist/esm/audio/dsp/mel.d.ts +43 -0
  53. package/dist/esm/audio/dsp/tempogram.d.ts +51 -0
  54. package/dist/esm/audio/filters/ChorusFilter.d.ts +52 -0
  55. package/dist/esm/audio/filters/ChorusFilter.js +143 -0
  56. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -0
  57. package/dist/esm/audio/filters/CompressorFilter.d.ts +43 -0
  58. package/dist/esm/audio/filters/CompressorFilter.js +108 -0
  59. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -0
  60. package/dist/esm/audio/filters/DelayFilter.d.ts +34 -0
  61. package/dist/esm/audio/filters/DelayFilter.js +110 -0
  62. package/dist/esm/audio/filters/DelayFilter.js.map +1 -0
  63. package/dist/esm/audio/filters/DuckingFilter.d.ts +44 -0
  64. package/dist/esm/audio/filters/DuckingFilter.js +164 -0
  65. package/dist/esm/audio/filters/DuckingFilter.js.map +1 -0
  66. package/dist/esm/audio/filters/EqualizerFilter.d.ts +49 -0
  67. package/dist/esm/audio/filters/EqualizerFilter.js +134 -0
  68. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -0
  69. package/dist/esm/audio/filters/GranularFilter.d.ts +62 -0
  70. package/dist/esm/audio/filters/GranularFilter.js +176 -0
  71. package/dist/esm/audio/filters/GranularFilter.js.map +1 -0
  72. package/dist/esm/audio/filters/HighpassFilter.d.ts +29 -0
  73. package/dist/esm/audio/filters/HighpassFilter.js +71 -0
  74. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -0
  75. package/dist/esm/audio/filters/LowpassFilter.d.ts +29 -0
  76. package/dist/esm/audio/filters/LowpassFilter.js +71 -0
  77. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -0
  78. package/dist/esm/audio/filters/PitchShiftFilter.d.ts +44 -0
  79. package/dist/esm/audio/filters/PitchShiftFilter.js +132 -0
  80. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -0
  81. package/dist/esm/audio/filters/ReverbFilter.d.ts +36 -0
  82. package/dist/esm/audio/filters/ReverbFilter.js +118 -0
  83. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -0
  84. package/dist/esm/audio/filters/VocoderFilter.d.ts +49 -0
  85. package/dist/esm/audio/filters/VocoderFilter.js +174 -0
  86. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -0
  87. package/dist/esm/audio/filters/WorkletFilter.d.ts +51 -0
  88. package/dist/esm/audio/filters/WorkletFilter.js +106 -0
  89. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -0
  90. package/dist/esm/audio/filters/index.d.ts +12 -0
  91. package/dist/esm/audio/index.d.ts +15 -1
  92. package/dist/esm/audio/worklet/registerWorklet.d.ts +10 -0
  93. package/dist/esm/audio/worklet/registerWorklet.js +44 -0
  94. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -0
  95. package/dist/esm/core/Application.d.ts +82 -0
  96. package/dist/esm/core/Application.js +137 -2
  97. package/dist/esm/core/Application.js.map +1 -1
  98. package/dist/esm/core/Bounds.d.ts +23 -0
  99. package/dist/esm/core/Bounds.js +23 -0
  100. package/dist/esm/core/Bounds.js.map +1 -1
  101. package/dist/esm/core/Clock.d.ts +21 -0
  102. package/dist/esm/core/Clock.js +21 -0
  103. package/dist/esm/core/Clock.js.map +1 -1
  104. package/dist/esm/core/Color.d.ts +35 -0
  105. package/dist/esm/core/Color.js +35 -0
  106. package/dist/esm/core/Color.js.map +1 -1
  107. package/dist/esm/core/Scene.d.ts +46 -0
  108. package/dist/esm/core/Scene.js +27 -0
  109. package/dist/esm/core/Scene.js.map +1 -1
  110. package/dist/esm/core/SceneManager.d.ts +62 -0
  111. package/dist/esm/core/SceneManager.js +49 -0
  112. package/dist/esm/core/SceneManager.js.map +1 -1
  113. package/dist/esm/core/SceneNode.d.ts +40 -1
  114. package/dist/esm/core/SceneNode.js +75 -6
  115. package/dist/esm/core/SceneNode.js.map +1 -1
  116. package/dist/esm/core/Signal.d.ts +44 -0
  117. package/dist/esm/core/Signal.js +39 -0
  118. package/dist/esm/core/Signal.js.map +1 -1
  119. package/dist/esm/core/Time.d.ts +21 -0
  120. package/dist/esm/core/Time.js +22 -1
  121. package/dist/esm/core/Time.js.map +1 -1
  122. package/dist/esm/core/Timer.d.ts +7 -0
  123. package/dist/esm/core/Timer.js +7 -0
  124. package/dist/esm/core/Timer.js.map +1 -1
  125. package/dist/esm/core/capabilities.d.ts +12 -0
  126. package/dist/esm/core/capabilities.js +12 -0
  127. package/dist/esm/core/capabilities.js.map +1 -1
  128. package/dist/esm/core/index.d.ts +0 -1
  129. package/dist/esm/core/types.d.ts +37 -0
  130. package/dist/esm/core/utils.d.ts +48 -0
  131. package/dist/esm/core/utils.js +48 -0
  132. package/dist/esm/core/utils.js.map +1 -1
  133. package/dist/esm/debug/BoundingBoxesLayer.d.ts +26 -0
  134. package/dist/esm/debug/BoundingBoxesLayer.js +136 -0
  135. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -0
  136. package/dist/esm/debug/DebugLayer.d.ts +42 -0
  137. package/dist/esm/debug/DebugLayer.js +34 -0
  138. package/dist/esm/debug/DebugLayer.js.map +1 -0
  139. package/dist/esm/debug/DebugOverlay.d.ts +59 -0
  140. package/dist/esm/debug/DebugOverlay.js +123 -0
  141. package/dist/esm/debug/DebugOverlay.js.map +1 -0
  142. package/dist/esm/debug/HitTestLayer.d.ts +32 -0
  143. package/dist/esm/debug/HitTestLayer.js +118 -0
  144. package/dist/esm/debug/HitTestLayer.js.map +1 -0
  145. package/dist/esm/debug/PerformanceLayer.d.ts +37 -0
  146. package/dist/esm/debug/PerformanceLayer.js +193 -0
  147. package/dist/esm/debug/PerformanceLayer.js.map +1 -0
  148. package/dist/esm/debug/PointerStackLayer.d.ts +31 -0
  149. package/dist/esm/debug/PointerStackLayer.js +160 -0
  150. package/dist/esm/debug/PointerStackLayer.js.map +1 -0
  151. package/dist/esm/debug/index.d.ts +6 -0
  152. package/dist/esm/debug/index.js +7 -0
  153. package/dist/esm/debug/index.js.map +1 -0
  154. package/dist/esm/index.js +30 -4
  155. package/dist/esm/index.js.map +1 -1
  156. package/dist/esm/input/ArcadeStickGamepadMapping.d.ts +7 -0
  157. package/dist/esm/input/ArcadeStickGamepadMapping.js +7 -0
  158. package/dist/esm/input/ArcadeStickGamepadMapping.js.map +1 -1
  159. package/dist/esm/input/GameCubeGamepadMapping.d.ts +9 -0
  160. package/dist/esm/input/GameCubeGamepadMapping.js +9 -0
  161. package/dist/esm/input/GameCubeGamepadMapping.js.map +1 -1
  162. package/dist/esm/input/Gamepad.d.ts +48 -0
  163. package/dist/esm/input/Gamepad.js +43 -0
  164. package/dist/esm/input/Gamepad.js.map +1 -1
  165. package/dist/esm/input/GamepadChannels.d.ts +8 -0
  166. package/dist/esm/input/GamepadChannels.js +8 -0
  167. package/dist/esm/input/GamepadChannels.js.map +1 -1
  168. package/dist/esm/input/GamepadControl.d.ts +18 -0
  169. package/dist/esm/input/GamepadControl.js +13 -0
  170. package/dist/esm/input/GamepadControl.js.map +1 -1
  171. package/dist/esm/input/GamepadDefinitions.d.ts +64 -1
  172. package/dist/esm/input/GamepadDefinitions.js +40 -1
  173. package/dist/esm/input/GamepadDefinitions.js.map +1 -1
  174. package/dist/esm/input/GamepadMapping.d.ts +32 -2
  175. package/dist/esm/input/GamepadMapping.js +24 -0
  176. package/dist/esm/input/GamepadMapping.js.map +1 -1
  177. package/dist/esm/input/GamepadPromptLayouts.d.ts +32 -1
  178. package/dist/esm/input/GamepadPromptLayouts.js +25 -1
  179. package/dist/esm/input/GamepadPromptLayouts.js.map +1 -1
  180. package/dist/esm/input/GenericDualAnalogGamepadMapping.d.ts +10 -0
  181. package/dist/esm/input/GenericDualAnalogGamepadMapping.js +10 -0
  182. package/dist/esm/input/GenericDualAnalogGamepadMapping.js.map +1 -1
  183. package/dist/esm/input/GestureRecognizer.d.ts +11 -2
  184. package/dist/esm/input/GestureRecognizer.js +11 -2
  185. package/dist/esm/input/GestureRecognizer.js.map +1 -1
  186. package/dist/esm/input/Input.d.ts +24 -0
  187. package/dist/esm/input/Input.js +22 -0
  188. package/dist/esm/input/Input.js.map +1 -1
  189. package/dist/esm/input/InputManager.d.ts +43 -0
  190. package/dist/esm/input/InputManager.js +68 -5
  191. package/dist/esm/input/InputManager.js.map +1 -1
  192. package/dist/esm/input/InteractionEvent.d.ts +31 -0
  193. package/dist/esm/input/InteractionEvent.js +37 -0
  194. package/dist/esm/input/InteractionEvent.js.map +1 -0
  195. package/dist/esm/input/InteractionManager.d.ts +163 -0
  196. package/dist/esm/input/InteractionManager.js +575 -0
  197. package/dist/esm/input/InteractionManager.js.map +1 -0
  198. package/dist/esm/input/JoyConLeftGamepadMapping.d.ts +9 -0
  199. package/dist/esm/input/JoyConLeftGamepadMapping.js +9 -0
  200. package/dist/esm/input/JoyConLeftGamepadMapping.js.map +1 -1
  201. package/dist/esm/input/JoyConRightGamepadMapping.d.ts +9 -0
  202. package/dist/esm/input/JoyConRightGamepadMapping.js +9 -0
  203. package/dist/esm/input/JoyConRightGamepadMapping.js.map +1 -1
  204. package/dist/esm/input/PlayStationGamepadMapping.d.ts +8 -0
  205. package/dist/esm/input/PlayStationGamepadMapping.js +8 -0
  206. package/dist/esm/input/PlayStationGamepadMapping.js.map +1 -1
  207. package/dist/esm/input/Pointer.d.ts +22 -0
  208. package/dist/esm/input/Pointer.js +22 -0
  209. package/dist/esm/input/Pointer.js.map +1 -1
  210. package/dist/esm/input/SteamControllerGamepadMapping.d.ts +8 -0
  211. package/dist/esm/input/SteamControllerGamepadMapping.js +8 -0
  212. package/dist/esm/input/SteamControllerGamepadMapping.js.map +1 -1
  213. package/dist/esm/input/SwitchProGamepadMapping.d.ts +9 -0
  214. package/dist/esm/input/SwitchProGamepadMapping.js +9 -0
  215. package/dist/esm/input/SwitchProGamepadMapping.js.map +1 -1
  216. package/dist/esm/input/XboxGamepadMapping.d.ts +8 -0
  217. package/dist/esm/input/XboxGamepadMapping.js +8 -0
  218. package/dist/esm/input/XboxGamepadMapping.js.map +1 -1
  219. package/dist/esm/input/index.d.ts +2 -0
  220. package/dist/esm/input/interaction-hooks.d.ts +34 -0
  221. package/dist/esm/input/interaction-hooks.js +35 -0
  222. package/dist/esm/input/interaction-hooks.js.map +1 -0
  223. package/dist/esm/input/types.d.ts +20 -0
  224. package/dist/esm/input/types.js +20 -0
  225. package/dist/esm/input/types.js.map +1 -1
  226. package/dist/esm/math/AbstractVector.d.ts +83 -0
  227. package/dist/esm/math/AbstractVector.js +83 -0
  228. package/dist/esm/math/AbstractVector.js.map +1 -1
  229. package/dist/esm/math/Circle.d.ts +44 -2
  230. package/dist/esm/math/Circle.js +116 -16
  231. package/dist/esm/math/Circle.js.map +1 -1
  232. package/dist/esm/math/CircleLike.d.ts +1 -0
  233. package/dist/esm/math/Collision.d.ts +39 -0
  234. package/dist/esm/math/Collision.js +5 -0
  235. package/dist/esm/math/Collision.js.map +1 -1
  236. package/dist/esm/math/Ellipse.d.ts +11 -0
  237. package/dist/esm/math/Ellipse.js +18 -2
  238. package/dist/esm/math/Ellipse.js.map +1 -1
  239. package/dist/esm/math/EllipseLike.d.ts +3 -0
  240. package/dist/esm/math/Flags.d.ts +31 -0
  241. package/dist/esm/math/Flags.js +31 -0
  242. package/dist/esm/math/Flags.js.map +1 -1
  243. package/dist/esm/math/Interval.d.ts +15 -0
  244. package/dist/esm/math/Interval.js +16 -1
  245. package/dist/esm/math/Interval.js.map +1 -1
  246. package/dist/esm/math/Line.d.ts +17 -1
  247. package/dist/esm/math/Line.js +17 -1
  248. package/dist/esm/math/Line.js.map +1 -1
  249. package/dist/esm/math/LineLike.d.ts +1 -0
  250. package/dist/esm/math/Matrix.d.ts +44 -3
  251. package/dist/esm/math/Matrix.js +44 -3
  252. package/dist/esm/math/Matrix.js.map +1 -1
  253. package/dist/esm/math/ObservableSize.d.ts +7 -0
  254. package/dist/esm/math/ObservableSize.js +7 -0
  255. package/dist/esm/math/ObservableSize.js.map +1 -1
  256. package/dist/esm/math/ObservableVector.d.ts +11 -2
  257. package/dist/esm/math/ObservableVector.js +13 -2
  258. package/dist/esm/math/ObservableVector.js.map +1 -1
  259. package/dist/esm/math/PointLike.d.ts +1 -0
  260. package/dist/esm/math/PolarVector.d.ts +15 -0
  261. package/dist/esm/math/PolarVector.js +16 -1
  262. package/dist/esm/math/PolarVector.js.map +1 -1
  263. package/dist/esm/math/Polygon.d.ts +35 -1
  264. package/dist/esm/math/Polygon.js +78 -6
  265. package/dist/esm/math/Polygon.js.map +1 -1
  266. package/dist/esm/math/PolygonLike.d.ts +4 -0
  267. package/dist/esm/math/Quadtree.d.ts +84 -0
  268. package/dist/esm/math/Quadtree.js +204 -0
  269. package/dist/esm/math/Quadtree.js.map +1 -0
  270. package/dist/esm/math/Random.d.ts +25 -0
  271. package/dist/esm/math/Random.js +26 -1
  272. package/dist/esm/math/Random.js.map +1 -1
  273. package/dist/esm/math/Rectangle.d.ts +15 -0
  274. package/dist/esm/math/Rectangle.js +17 -2
  275. package/dist/esm/math/Rectangle.js.map +1 -1
  276. package/dist/esm/math/RectangleLike.d.ts +1 -0
  277. package/dist/esm/math/Segment.d.ts +7 -0
  278. package/dist/esm/math/Segment.js +7 -0
  279. package/dist/esm/math/Segment.js.map +1 -1
  280. package/dist/esm/math/ShapeLike.d.ts +6 -0
  281. package/dist/esm/math/Size.d.ts +9 -0
  282. package/dist/esm/math/Size.js +10 -1
  283. package/dist/esm/math/Size.js.map +1 -1
  284. package/dist/esm/math/Vector.d.ts +16 -0
  285. package/dist/esm/math/Vector.js +17 -1
  286. package/dist/esm/math/Vector.js.map +1 -1
  287. package/dist/esm/math/collision-detection.d.ts +47 -1
  288. package/dist/esm/math/collision-detection.js +231 -17
  289. package/dist/esm/math/collision-detection.js.map +1 -1
  290. package/dist/esm/math/collision-primitives.d.ts +23 -0
  291. package/dist/esm/math/collision-primitives.js +23 -0
  292. package/dist/esm/math/collision-primitives.js.map +1 -1
  293. package/dist/esm/math/geometry.d.ts +42 -0
  294. package/dist/esm/math/geometry.js +37 -0
  295. package/dist/esm/math/geometry.js.map +1 -1
  296. package/dist/esm/math/index.d.ts +1 -0
  297. package/dist/esm/math/utils.d.ts +41 -0
  298. package/dist/esm/math/utils.js +41 -0
  299. package/dist/esm/math/utils.js.map +1 -1
  300. package/dist/esm/particles/Particle.d.ts +37 -0
  301. package/dist/esm/particles/Particle.js +37 -0
  302. package/dist/esm/particles/Particle.js.map +1 -1
  303. package/dist/esm/particles/ParticleProperties.d.ts +15 -0
  304. package/dist/esm/particles/ParticleSystem.d.ts +69 -0
  305. package/dist/esm/particles/ParticleSystem.js +70 -0
  306. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  307. package/dist/esm/particles/affectors/ColorAffector.d.ts +13 -0
  308. package/dist/esm/particles/affectors/ColorAffector.js +13 -0
  309. package/dist/esm/particles/affectors/ColorAffector.js.map +1 -1
  310. package/dist/esm/particles/affectors/ForceAffector.d.ts +11 -0
  311. package/dist/esm/particles/affectors/ForceAffector.js +11 -0
  312. package/dist/esm/particles/affectors/ForceAffector.js.map +1 -1
  313. package/dist/esm/particles/affectors/ParticleAffector.d.ts +13 -0
  314. package/dist/esm/particles/affectors/ScaleAffector.d.ts +10 -0
  315. package/dist/esm/particles/affectors/ScaleAffector.js +10 -0
  316. package/dist/esm/particles/affectors/ScaleAffector.js.map +1 -1
  317. package/dist/esm/particles/affectors/TorqueAffector.d.ts +11 -0
  318. package/dist/esm/particles/affectors/TorqueAffector.js +12 -1
  319. package/dist/esm/particles/affectors/TorqueAffector.js.map +1 -1
  320. package/dist/esm/particles/emitters/ParticleEmitter.d.ts +13 -0
  321. package/dist/esm/particles/emitters/ParticleOptions.d.ts +16 -0
  322. package/dist/esm/particles/emitters/ParticleOptions.js +16 -0
  323. package/dist/esm/particles/emitters/ParticleOptions.js.map +1 -1
  324. package/dist/esm/particles/emitters/UniversalEmitter.d.ts +23 -0
  325. package/dist/esm/particles/emitters/UniversalEmitter.js +23 -0
  326. package/dist/esm/particles/emitters/UniversalEmitter.js.map +1 -1
  327. package/dist/esm/rendering/CallbackRenderPass.d.ts +12 -0
  328. package/dist/esm/rendering/CallbackRenderPass.js +12 -0
  329. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  330. package/dist/esm/rendering/Container.d.ts +44 -0
  331. package/dist/esm/rendering/Container.js +62 -0
  332. package/dist/esm/rendering/Container.js.map +1 -1
  333. package/dist/esm/rendering/Drawable.d.ts +22 -0
  334. package/dist/esm/rendering/Drawable.js +22 -0
  335. package/dist/esm/rendering/Drawable.js.map +1 -1
  336. package/dist/esm/rendering/RenderBackend.d.ts +13 -0
  337. package/dist/esm/rendering/RenderBackendType.d.ts +4 -0
  338. package/dist/esm/rendering/RenderBackendType.js +4 -0
  339. package/dist/esm/rendering/RenderBackendType.js.map +1 -1
  340. package/dist/esm/rendering/RenderNode.d.ts +45 -0
  341. package/dist/esm/rendering/RenderNode.js +62 -0
  342. package/dist/esm/rendering/RenderNode.js.map +1 -1
  343. package/dist/esm/rendering/RenderPass.d.ts +8 -0
  344. package/dist/esm/rendering/RenderStats.d.ts +19 -0
  345. package/dist/esm/rendering/RenderStats.js +7 -0
  346. package/dist/esm/rendering/RenderStats.js.map +1 -1
  347. package/dist/esm/rendering/RenderTarget.d.ts +17 -0
  348. package/dist/esm/rendering/RenderTarget.js +17 -0
  349. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  350. package/dist/esm/rendering/RenderTargetPass.d.ts +11 -0
  351. package/dist/esm/rendering/RenderTargetPass.js +7 -0
  352. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  353. package/dist/esm/rendering/Renderer.d.ts +15 -0
  354. package/dist/esm/rendering/RendererRegistry.d.ts +7 -0
  355. package/dist/esm/rendering/RendererRegistry.js +7 -0
  356. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  357. package/dist/esm/rendering/View.d.ts +73 -6
  358. package/dist/esm/rendering/View.js +69 -2
  359. package/dist/esm/rendering/View.js.map +1 -1
  360. package/dist/esm/rendering/filters/BlurFilter.d.ts +9 -0
  361. package/dist/esm/rendering/filters/BlurFilter.js +8 -0
  362. package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
  363. package/dist/esm/rendering/filters/ColorFilter.d.ts +7 -0
  364. package/dist/esm/rendering/filters/ColorFilter.js +7 -0
  365. package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
  366. package/dist/esm/rendering/filters/Filter.d.ts +23 -0
  367. package/dist/esm/rendering/filters/Filter.js +20 -0
  368. package/dist/esm/rendering/filters/Filter.js.map +1 -1
  369. package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +114 -0
  370. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +273 -0
  371. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
  372. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +116 -0
  373. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +402 -0
  374. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
  375. package/dist/esm/rendering/index.d.ts +3 -0
  376. package/dist/esm/rendering/mesh/Mesh.d.ts +2 -0
  377. package/dist/esm/rendering/mesh/Mesh.js +3 -0
  378. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  379. package/dist/esm/rendering/primitives/Graphics.d.ts +34 -0
  380. package/dist/esm/rendering/primitives/Graphics.js +34 -0
  381. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  382. package/dist/esm/rendering/shader/Shader.d.ts +36 -0
  383. package/dist/esm/rendering/shader/Shader.js +26 -0
  384. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  385. package/dist/esm/rendering/shader/ShaderAttribute.d.ts +13 -0
  386. package/dist/esm/rendering/shader/ShaderAttribute.js +13 -0
  387. package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
  388. package/dist/esm/rendering/shader/ShaderUniform.d.ts +27 -0
  389. package/dist/esm/rendering/shader/ShaderUniform.js +28 -1
  390. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  391. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
  392. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
  393. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
  394. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +38 -0
  395. package/dist/esm/rendering/sprite/AnimatedSprite.js +36 -0
  396. package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
  397. package/dist/esm/rendering/sprite/Sprite.d.ts +62 -1
  398. package/dist/esm/rendering/sprite/Sprite.js +97 -19
  399. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  400. package/dist/esm/rendering/sprite/Spritesheet.d.ts +25 -0
  401. package/dist/esm/rendering/sprite/Spritesheet.js +20 -0
  402. package/dist/esm/rendering/sprite/Spritesheet.js.map +1 -1
  403. package/dist/esm/rendering/text/Text.d.ts +2 -0
  404. package/dist/esm/rendering/text/Text.js +2 -0
  405. package/dist/esm/rendering/text/Text.js.map +1 -1
  406. package/dist/esm/rendering/text/TextStyle.d.ts +29 -0
  407. package/dist/esm/rendering/text/TextStyle.js +24 -0
  408. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  409. package/dist/esm/rendering/text/types.d.ts +1 -0
  410. package/dist/esm/rendering/texture/RenderTexture.d.ts +16 -0
  411. package/dist/esm/rendering/texture/RenderTexture.js +16 -0
  412. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
  413. package/dist/esm/rendering/texture/Sampler.d.ts +23 -0
  414. package/dist/esm/rendering/texture/Sampler.js +13 -0
  415. package/dist/esm/rendering/texture/Sampler.js.map +1 -1
  416. package/dist/esm/rendering/texture/Texture.d.ts +30 -0
  417. package/dist/esm/rendering/texture/Texture.js +30 -0
  418. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  419. package/dist/esm/rendering/types.d.ts +29 -0
  420. package/dist/esm/rendering/types.js +29 -0
  421. package/dist/esm/rendering/types.js.map +1 -1
  422. package/dist/esm/rendering/utils.d.ts +20 -0
  423. package/dist/esm/rendering/utils.js +10 -0
  424. package/dist/esm/rendering/utils.js.map +1 -1
  425. package/dist/esm/rendering/video/Video.d.ts +39 -1
  426. package/dist/esm/rendering/video/Video.js +68 -6
  427. package/dist/esm/rendering/video/Video.js.map +1 -1
  428. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +7 -0
  429. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +7 -0
  430. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
  431. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +17 -4
  432. package/dist/esm/rendering/webgl2/WebGl2Backend.js +20 -16
  433. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  434. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +8 -0
  435. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +8 -0
  436. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
  437. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +45 -8
  438. package/dist/esm/rendering/webgpu/WebGpuBackend.js +160 -40
  439. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  440. package/dist/esm/resources/AbstractAssetFactory.d.ts +20 -0
  441. package/dist/esm/resources/AbstractAssetFactory.js +20 -0
  442. package/dist/esm/resources/AbstractAssetFactory.js.map +1 -1
  443. package/dist/esm/resources/AssetFactory.d.ts +26 -0
  444. package/dist/esm/resources/AssetManifest.d.ts +45 -0
  445. package/dist/esm/resources/AssetManifest.js +25 -0
  446. package/dist/esm/resources/AssetManifest.js.map +1 -1
  447. package/dist/esm/resources/CacheFirstStrategy.d.ts +12 -0
  448. package/dist/esm/resources/CacheFirstStrategy.js +12 -0
  449. package/dist/esm/resources/CacheFirstStrategy.js.map +1 -1
  450. package/dist/esm/resources/CacheStore.d.ts +23 -0
  451. package/dist/esm/resources/CacheStrategy.d.ts +20 -0
  452. package/dist/esm/resources/Database.d.ts +45 -0
  453. package/dist/esm/resources/FactoryRegistry.d.ts +28 -0
  454. package/dist/esm/resources/FactoryRegistry.js +24 -0
  455. package/dist/esm/resources/FactoryRegistry.js.map +1 -1
  456. package/dist/esm/resources/IndexedDbDatabase.d.ts +22 -1
  457. package/dist/esm/resources/IndexedDbDatabase.js +21 -0
  458. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  459. package/dist/esm/resources/IndexedDbStore.d.ts +20 -0
  460. package/dist/esm/resources/IndexedDbStore.js +12 -0
  461. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  462. package/dist/esm/resources/Loader.d.ts +167 -0
  463. package/dist/esm/resources/Loader.js +110 -0
  464. package/dist/esm/resources/Loader.js.map +1 -1
  465. package/dist/esm/resources/NetworkOnlyStrategy.d.ts +8 -0
  466. package/dist/esm/resources/NetworkOnlyStrategy.js +8 -0
  467. package/dist/esm/resources/NetworkOnlyStrategy.js.map +1 -1
  468. package/dist/esm/resources/factories/BinaryFactory.d.ts +13 -0
  469. package/dist/esm/resources/factories/BinaryFactory.js +13 -0
  470. package/dist/esm/resources/factories/BinaryFactory.js.map +1 -1
  471. package/dist/esm/resources/factories/FontFactory.d.ts +37 -0
  472. package/dist/esm/resources/factories/FontFactory.js +26 -0
  473. package/dist/esm/resources/factories/FontFactory.js.map +1 -1
  474. package/dist/esm/resources/factories/ImageFactory.d.ts +24 -0
  475. package/dist/esm/resources/factories/ImageFactory.js +19 -0
  476. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  477. package/dist/esm/resources/factories/JsonFactory.d.ts +13 -0
  478. package/dist/esm/resources/factories/JsonFactory.js +13 -0
  479. package/dist/esm/resources/factories/JsonFactory.js.map +1 -1
  480. package/dist/esm/resources/factories/MusicFactory.d.ts +36 -0
  481. package/dist/esm/resources/factories/MusicFactory.js +44 -4
  482. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  483. package/dist/esm/resources/factories/SoundFactory.d.ts +29 -0
  484. package/dist/esm/resources/factories/SoundFactory.js +18 -0
  485. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  486. package/dist/esm/resources/factories/SvgFactory.d.ts +19 -0
  487. package/dist/esm/resources/factories/SvgFactory.js +19 -0
  488. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  489. package/dist/esm/resources/factories/TextFactory.d.ts +11 -0
  490. package/dist/esm/resources/factories/TextFactory.js +11 -0
  491. package/dist/esm/resources/factories/TextFactory.js.map +1 -1
  492. package/dist/esm/resources/factories/TextureFactory.d.ts +25 -0
  493. package/dist/esm/resources/factories/TextureFactory.js +20 -0
  494. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  495. package/dist/esm/resources/factories/VideoFactory.d.ts +37 -0
  496. package/dist/esm/resources/factories/VideoFactory.js +48 -5
  497. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  498. package/dist/esm/resources/factories/VttFactory.d.ts +18 -0
  499. package/dist/esm/resources/factories/VttFactory.js +24 -0
  500. package/dist/esm/resources/factories/VttFactory.js.map +1 -1
  501. package/dist/esm/resources/factories/WasmFactory.d.ts +16 -0
  502. package/dist/esm/resources/factories/WasmFactory.js +16 -0
  503. package/dist/esm/resources/factories/WasmFactory.js.map +1 -1
  504. package/dist/esm/resources/utils.d.ts +10 -0
  505. package/dist/esm/resources/utils.js +10 -0
  506. package/dist/esm/resources/utils.js.map +1 -1
  507. package/dist/exo.esm.js +11182 -2538
  508. package/dist/exo.esm.js.map +1 -1
  509. package/package.json +20 -9
  510. package/dist/esm/core/Quadtree.d.ts +0 -20
  511. package/dist/esm/core/Quadtree.js +0 -86
  512. 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
+ }