@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,118 @@
1
+ import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
2
+ import { AudioFilter } from '../AudioFilter.js';
3
+
4
+ /**
5
+ * Convolution reverb using a procedurally-generated impulse response loaded
6
+ * into a `ConvolverNode`. The impulse response is a stereo noise burst whose
7
+ * amplitude decays exponentially, simulating room reflections. Adjusting
8
+ * `durationSeconds` or `decay` rebuilds the impulse response immediately, so
9
+ * avoid animating these properties at audio rate — use `wet` for real-time
10
+ * mix control instead.
11
+ */
12
+ class ReverbFilter extends AudioFilter {
13
+ _setup = null;
14
+ _duration;
15
+ _decay;
16
+ _wet;
17
+ constructor(options = {}) {
18
+ super();
19
+ this._duration = Math.max(0.1, Math.min(5, options.durationSeconds ?? 2));
20
+ this._decay = Math.max(0.5, Math.min(10, options.decay ?? 2));
21
+ this._wet = Math.max(0, Math.min(1, options.wet ?? 0.4));
22
+ if (isAudioContextReady()) {
23
+ this._setupNodes(getAudioContext());
24
+ }
25
+ else {
26
+ onAudioContextReady.once(this._setupNodes, this);
27
+ }
28
+ }
29
+ get inputNode() {
30
+ if (!this._setup)
31
+ throw new Error('ReverbFilter not yet initialized.');
32
+ return this._setup.inputGain;
33
+ }
34
+ get outputNode() {
35
+ if (!this._setup)
36
+ throw new Error('ReverbFilter not yet initialized.');
37
+ return this._setup.outputGain;
38
+ }
39
+ /** Length of the generated impulse response in seconds. Range 0.1..5, default 2. Changing this rebuilds the IR buffer. */
40
+ get durationSeconds() {
41
+ return this._duration;
42
+ }
43
+ set durationSeconds(value) {
44
+ this._duration = Math.max(0.1, Math.min(5, value));
45
+ if (this._setup) {
46
+ this._setup.convolver.buffer = this._generateImpulseResponse(this._setup.convolver.context);
47
+ }
48
+ }
49
+ /** 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. */
50
+ get decay() {
51
+ return this._decay;
52
+ }
53
+ set decay(value) {
54
+ this._decay = Math.max(0.5, Math.min(10, value));
55
+ if (this._setup) {
56
+ this._setup.convolver.buffer = this._generateImpulseResponse(this._setup.convolver.context);
57
+ }
58
+ }
59
+ /** Wet (reverberated) mix level, 0..1. The dry level is automatically `1 - wet`. Default 0.4. */
60
+ get wet() {
61
+ return this._wet;
62
+ }
63
+ set wet(value) {
64
+ this._wet = Math.max(0, Math.min(1, value));
65
+ if (this._setup) {
66
+ const ctx = this._setup.wetGain.context;
67
+ this._setup.wetGain.gain.setTargetAtTime(this._wet, ctx.currentTime, 0.01);
68
+ this._setup.dryGain.gain.setTargetAtTime(1 - this._wet, ctx.currentTime, 0.01);
69
+ }
70
+ }
71
+ destroy() {
72
+ onAudioContextReady.clearByContext(this);
73
+ if (this._setup) {
74
+ this._setup.inputGain.disconnect();
75
+ this._setup.convolver.disconnect();
76
+ this._setup.dryGain.disconnect();
77
+ this._setup.wetGain.disconnect();
78
+ this._setup.outputGain.disconnect();
79
+ this._setup = null;
80
+ }
81
+ }
82
+ _generateImpulseResponse(ctx) {
83
+ const length = Math.floor(ctx.sampleRate * this._duration);
84
+ const buffer = ctx.createBuffer(2, length, ctx.sampleRate);
85
+ for (let channel = 0; channel < 2; channel++) {
86
+ const data = buffer.getChannelData(channel);
87
+ for (let i = 0; i < length; i++) {
88
+ const t = i / length;
89
+ const decayFactor = Math.pow(1 - t, this._decay);
90
+ data[i] = (Math.random() * 2 - 1) * decayFactor;
91
+ }
92
+ }
93
+ return buffer;
94
+ }
95
+ _setupNodes(ctx) {
96
+ const inputGain = ctx.createGain();
97
+ const outputGain = ctx.createGain();
98
+ const convolver = ctx.createConvolver();
99
+ const dryGain = ctx.createGain();
100
+ const wetGain = ctx.createGain();
101
+ inputGain.gain.setValueAtTime(1, ctx.currentTime);
102
+ outputGain.gain.setValueAtTime(1, ctx.currentTime);
103
+ dryGain.gain.setValueAtTime(1 - this._wet, ctx.currentTime);
104
+ wetGain.gain.setValueAtTime(this._wet, ctx.currentTime);
105
+ convolver.buffer = this._generateImpulseResponse(ctx);
106
+ // Dry path: input → dryGain → output
107
+ inputGain.connect(dryGain);
108
+ dryGain.connect(outputGain);
109
+ // Wet path: input → convolver → wetGain → output
110
+ inputGain.connect(convolver);
111
+ convolver.connect(wetGain);
112
+ wetGain.connect(outputGain);
113
+ this._setup = { inputGain, outputGain, convolver, dryGain, wetGain };
114
+ }
115
+ }
116
+
117
+ export { ReverbFilter };
118
+ //# sourceMappingURL=ReverbFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReverbFilter.js","sources":["../../../../../src/audio/filters/ReverbFilter.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAkBA;;;;;;;AAOG;AACG,MAAO,YAAa,SAAQ,WAAW,CAAA;IACjC,MAAM,GAA6B,IAAI;AACvC,IAAA,SAAS;AACT,IAAA,MAAM;AACN,IAAA,IAAI;AAEZ,IAAA,WAAA,CAAmB,UAA+B,EAAE,EAAA;AAChD,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACxD,IAAI,mBAAmB,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACvC;aAAO;YACH,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;QACpD;IACJ;AAEA,IAAA,IAAW,SAAS,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;AACtE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS;IAChC;AAEA,IAAA,IAAW,UAAU,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;AACtE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU;IACjC;;AAGA,IAAA,IAAW,eAAe,GAAA;QACtB,OAAO,IAAI,CAAC,SAAS;IACzB;IAEA,IAAW,eAAe,CAAC,KAAa,EAAA;AACpC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,wBAAwB,CACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAuB,CAChD;QACL;IACJ;;AAGA,IAAA,IAAW,KAAK,GAAA;QACZ,OAAO,IAAI,CAAC,MAAM;IACtB;IAEA,IAAW,KAAK,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAChD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,wBAAwB,CACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAuB,CAChD;QACL;IACJ;;AAGA,IAAA,IAAW,GAAG,GAAA;QACV,OAAO,IAAI,CAAC,IAAI;IACpB;IAEA,IAAW,GAAG,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;YAC1E,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;QAClF;IACJ;IAEgB,OAAO,GAAA;AACnB,QAAA,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE;AACnC,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QACtB;IACJ;AAEQ,IAAA,wBAAwB,CAAC,GAAiB,EAAA;AAC9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AAC1D,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC;AAC1D,QAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;AAC3C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC7B,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM;AACpB,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;AAChD,gBAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW;YACnD;QACJ;AACA,QAAA,OAAO,MAAM;IACjB;AAEQ,IAAA,WAAW,CAAC,GAAiB,EAAA;AACjC,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,EAAE;AAClC,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE;AACnC,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,EAAE;AACvC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE;QAEhC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC;QACjD,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC;AAClD,QAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;AAC3D,QAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC;QAEvD,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;;AAGrD,QAAA,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;AAC1B,QAAA,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;;AAG3B,QAAA,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;AAC5B,QAAA,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;AAC1B,QAAA,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;AAE3B,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;IACxE;AACH;;;;"}
@@ -0,0 +1,49 @@
1
+ import { WorkletFilter } from './WorkletFilter';
2
+ import type { AudioBus } from '../AudioBus';
3
+ export interface VocoderFilterOptions {
4
+ /** Modulator AudioBus — its output drives the spectral envelope.
5
+ * Typically routed from a microphone or voice sample. */
6
+ modulator: AudioBus;
7
+ /** Number of frequency bands. More bands = better resolution, more CPU. Default 16. */
8
+ numBands?: number;
9
+ /** Lowest band center frequency in Hz. Default 80. */
10
+ minHz?: number;
11
+ /** Highest band center frequency in Hz. Default 8000. */
12
+ maxHz?: number;
13
+ /** Bandpass Q factor. Higher = narrower bands. Default 4. */
14
+ bandQ?: number;
15
+ /** Dry/wet mix, 0..1. Default 1.0. */
16
+ wet?: number;
17
+ /** Envelope follower smoothing factor (one-pole coefficient).
18
+ * Smaller = smoother / slower. Default 0.005. */
19
+ envelopeSmoothing?: number;
20
+ }
21
+ /**
22
+ * Phase-vocoder-style effect implemented as a {@link WorkletFilter}. Analyzes
23
+ * the spectral envelope of a `modulator` {@link AudioBus} across a bank of
24
+ * log-spaced bandpass filters and applies that envelope to the carrier signal
25
+ * (the main input). The result is the classic "robot voice" or talking-synth
26
+ * effect. Band count, frequency range, and Q are compile-time parameters set
27
+ * at construction; only `wet` and `envelopeSmoothing` are adjustable at
28
+ * runtime.
29
+ */
30
+ export declare class VocoderFilter extends WorkletFilter {
31
+ private readonly _modulator;
32
+ private readonly _numBands;
33
+ private readonly _minHz;
34
+ private readonly _maxHz;
35
+ private readonly _bandQ;
36
+ private _wet;
37
+ private _envelopeSmoothing;
38
+ constructor(options: VocoderFilterOptions);
39
+ protected get _workletName(): string;
40
+ protected get _workletSource(): string;
41
+ protected get _workletOptions(): AudioWorkletNodeOptions;
42
+ protected _onWorkletReady(audioContext: AudioContext): void;
43
+ /** Wet (vocoded) mix level, 0..1. Default 1.0. */
44
+ get wet(): number;
45
+ set wet(value: number);
46
+ /** One-pole envelope follower coefficient. Smaller values produce slower, smoother envelope tracking. Range 0.0001..0.1, default 0.005. */
47
+ get envelopeSmoothing(): number;
48
+ set envelopeSmoothing(value: number);
49
+ }
@@ -0,0 +1,174 @@
1
+ import { WorkletFilter } from './WorkletFilter.js';
2
+
3
+ const vocoderWorkletSource = `
4
+ const sampleRate = globalThis.sampleRate;
5
+
6
+ class VocoderProcessor extends AudioWorkletProcessor {
7
+ static get parameterDescriptors() {
8
+ return [
9
+ { name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
10
+ { name: 'envelopeSmoothing', defaultValue: 0.005, minValue: 0.0001, maxValue: 0.1, automationRate: 'k-rate' },
11
+ ];
12
+ }
13
+
14
+ constructor(options) {
15
+ super();
16
+ const opts = options.processorOptions ?? {};
17
+ const numBands = opts.numBands ?? 16;
18
+ const minHz = opts.minHz ?? 80;
19
+ const maxHz = opts.maxHz ?? 8000;
20
+ const Q = opts.bandQ ?? 4;
21
+
22
+ // Log-spaced band centers + biquad coefficients
23
+ this._bands = [];
24
+ for (let i = 0; i < numBands; i++) {
25
+ const ratio = numBands === 1 ? 0 : i / (numBands - 1);
26
+ const centerHz = minHz * Math.pow(maxHz / minHz, ratio);
27
+ const omega = 2 * Math.PI * centerHz / sampleRate;
28
+ const cos = Math.cos(omega);
29
+ const sin = Math.sin(omega);
30
+ const alpha = sin / (2 * Q);
31
+
32
+ // Bandpass (constant 0 dB peak) biquad
33
+ const a0 = 1 + alpha;
34
+ const b0 = alpha / a0;
35
+ const b1 = 0;
36
+ const b2 = -alpha / a0;
37
+ const a1 = (-2 * cos) / a0;
38
+ const a2 = (1 - alpha) / a0;
39
+ this._bands.push({ b0, b1, b2, a1, a2 });
40
+ }
41
+
42
+ // Per-band biquad state (one for carrier, one for modulator)
43
+ this._carrierStates = this._bands.map(() => ({ x1: 0, x2: 0, y1: 0, y2: 0 }));
44
+ this._modulatorStates = this._bands.map(() => ({ x1: 0, x2: 0, y1: 0, y2: 0 }));
45
+
46
+ // Per-band envelope follower
47
+ this._envelopes = new Float32Array(numBands);
48
+ }
49
+
50
+ _processBiquad(state, coef, x) {
51
+ const y = coef.b0 * x + coef.b1 * state.x1 + coef.b2 * state.x2 - coef.a1 * state.y1 - coef.a2 * state.y2;
52
+ state.x2 = state.x1; state.x1 = x;
53
+ state.y2 = state.y1; state.y1 = y;
54
+ return y;
55
+ }
56
+
57
+ process(inputs, outputs, parameters) {
58
+ const carrier = inputs[0]?.[0];
59
+ const modulator = inputs[1]?.[0];
60
+ const output = outputs[0]?.[0];
61
+ if (!carrier || !output) return true;
62
+
63
+ const wet = parameters.wet[0];
64
+ const envSmoothing = parameters.envelopeSmoothing[0];
65
+ const numBands = this._bands.length;
66
+
67
+ for (let i = 0; i < carrier.length; i++) {
68
+ const carrierSample = carrier[i];
69
+ const modulatorSample = modulator?.[i] ?? 0;
70
+
71
+ let bandSum = 0;
72
+ for (let b = 0; b < numBands; b++) {
73
+ const coef = this._bands[b];
74
+
75
+ // Modulator band → envelope follower
76
+ const modBand = this._processBiquad(this._modulatorStates[b], coef, modulatorSample);
77
+ const target = Math.abs(modBand);
78
+ this._envelopes[b] += (target - this._envelopes[b]) * envSmoothing;
79
+
80
+ // Carrier band, scaled by modulator envelope
81
+ const carBand = this._processBiquad(this._carrierStates[b], coef, carrierSample);
82
+ bandSum += carBand * this._envelopes[b];
83
+ }
84
+
85
+ output[i] = (1 - wet) * carrierSample + wet * bandSum;
86
+ }
87
+ return true;
88
+ }
89
+ }
90
+ registerProcessor('exojs-vocoder', VocoderProcessor);
91
+ `;
92
+ /**
93
+ * Phase-vocoder-style effect implemented as a {@link WorkletFilter}. Analyzes
94
+ * the spectral envelope of a `modulator` {@link AudioBus} across a bank of
95
+ * log-spaced bandpass filters and applies that envelope to the carrier signal
96
+ * (the main input). The result is the classic "robot voice" or talking-synth
97
+ * effect. Band count, frequency range, and Q are compile-time parameters set
98
+ * at construction; only `wet` and `envelopeSmoothing` are adjustable at
99
+ * runtime.
100
+ */
101
+ class VocoderFilter extends WorkletFilter {
102
+ // Declared nullable because super() may trigger _onWorkletReady before the
103
+ // subclass constructor body runs (if construction is aborted by a throw).
104
+ _modulator = null;
105
+ _numBands;
106
+ _minHz;
107
+ _maxHz;
108
+ _bandQ;
109
+ _wet;
110
+ _envelopeSmoothing;
111
+ constructor(options) {
112
+ super();
113
+ if (!options.modulator) {
114
+ throw new Error('VocoderFilter requires a modulator AudioBus.');
115
+ }
116
+ this._modulator = options.modulator;
117
+ this._numBands = options.numBands ?? 16;
118
+ this._minHz = options.minHz ?? 80;
119
+ this._maxHz = options.maxHz ?? 8000;
120
+ this._bandQ = options.bandQ ?? 4;
121
+ this._wet = Math.max(0, Math.min(1, options.wet ?? 1.0));
122
+ this._envelopeSmoothing = Math.max(0.0001, Math.min(0.1, options.envelopeSmoothing ?? 0.005));
123
+ }
124
+ get _workletName() { return 'exojs-vocoder'; }
125
+ get _workletSource() { return vocoderWorkletSource; }
126
+ get _workletOptions() {
127
+ return {
128
+ numberOfInputs: 2,
129
+ numberOfOutputs: 1,
130
+ processorOptions: {
131
+ numBands: this._numBands,
132
+ minHz: this._minHz,
133
+ maxHz: this._maxHz,
134
+ bandQ: this._bandQ,
135
+ },
136
+ };
137
+ }
138
+ _onWorkletReady(audioContext) {
139
+ // Guard against partially-constructed instances (constructor threw after super()).
140
+ if (!this._modulator)
141
+ return;
142
+ this._setAudioParam('wet', this._wet);
143
+ this._setAudioParam('envelopeSmoothing', this._envelopeSmoothing);
144
+ // Wire modulator bus output to input 1 of the worklet
145
+ const modulator = this._modulator;
146
+ const modOutput = modulator._getOutputNode();
147
+ if (modOutput && this._workletNode) {
148
+ modOutput.connect(this._workletNode, 0, 1);
149
+ }
150
+ else {
151
+ modulator.onceSetup(() => {
152
+ const node = modulator._getOutputNode();
153
+ if (node && this._workletNode) {
154
+ node.connect(this._workletNode, 0, 1);
155
+ }
156
+ });
157
+ }
158
+ }
159
+ /** Wet (vocoded) mix level, 0..1. Default 1.0. */
160
+ get wet() { return this._wet; }
161
+ set wet(value) {
162
+ this._wet = Math.max(0, Math.min(1, value));
163
+ this._setAudioParam('wet', this._wet);
164
+ }
165
+ /** One-pole envelope follower coefficient. Smaller values produce slower, smoother envelope tracking. Range 0.0001..0.1, default 0.005. */
166
+ get envelopeSmoothing() { return this._envelopeSmoothing; }
167
+ set envelopeSmoothing(value) {
168
+ this._envelopeSmoothing = Math.max(0.0001, Math.min(0.1, value));
169
+ this._setAudioParam('envelopeSmoothing', this._envelopeSmoothing);
170
+ }
171
+ }
172
+
173
+ export { VocoderFilter };
174
+ //# sourceMappingURL=VocoderFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VocoderFilter.js","sources":["../../../../../src/audio/filters/VocoderFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { AudioFilter } from '../AudioFilter';
2
+ /**
3
+ * Base class for filters implemented as AudioWorkletProcessors. Subclasses
4
+ * declare the worklet's name, source code, and node options; this class
5
+ * handles the async lifecycle.
6
+ *
7
+ * Stable input/output nodes (GainNodes) are created immediately on setup.
8
+ * While the worklet loads asynchronously, audio passes through directly
9
+ * (effectively bypassing the filter for ~10-50ms during initial load).
10
+ * Once the worklet loads, it's inserted into the chain and audio routes
11
+ * through it.
12
+ *
13
+ * Subclasses can override `_onWorkletReady` to perform additional wiring
14
+ * (e.g., sidechain inputs).
15
+ */
16
+ export declare abstract class WorkletFilter extends AudioFilter {
17
+ protected _inputGain: GainNode | null;
18
+ protected _outputGain: GainNode | null;
19
+ protected _workletNode: AudioWorkletNode | null;
20
+ protected _ready: Promise<void> | null;
21
+ /** The processor name registered via `registerProcessor()` in the worklet source. */
22
+ protected abstract get _workletName(): string;
23
+ /** The full worklet source code as a JavaScript string. */
24
+ protected abstract get _workletSource(): string;
25
+ /** AudioWorkletNode constructor options. Default: 1 input, 1 output. */
26
+ protected get _workletOptions(): AudioWorkletNodeOptions;
27
+ constructor();
28
+ get inputNode(): AudioNode;
29
+ get outputNode(): AudioNode;
30
+ /**
31
+ * Resolves once the underlying worklet is loaded and inserted into the
32
+ * audio chain. Use this if you need to wait before applying parameters
33
+ * that depend on the worklet node.
34
+ */
35
+ get ready(): Promise<void>;
36
+ /** Disconnects all nodes, cancels any pending worklet load, and releases resources. */
37
+ destroy(): void;
38
+ /**
39
+ * Subclass hook — called once when the worklet has loaded and the
40
+ * AudioWorkletNode is inserted into the chain. Use this for additional
41
+ * wiring (e.g., connecting a sidechain input).
42
+ */
43
+ protected _onWorkletReady?(audioContext: AudioContext): void;
44
+ /**
45
+ * Ramps an `AudioParam` on the underlying `AudioWorkletNode` to `value`
46
+ * using a short exponential ramp. No-ops if the worklet is not yet loaded.
47
+ * @internal
48
+ */
49
+ protected _setAudioParam(name: string, value: number): void;
50
+ private _setup;
51
+ }
@@ -0,0 +1,106 @@
1
+ import { AudioFilter } from '../AudioFilter.js';
2
+ import { isAudioContextReady, getAudioContext, onAudioContextReady } from '../audio-context.js';
3
+ import { registerWorkletProcessor } from '../worklet/registerWorklet.js';
4
+
5
+ /**
6
+ * Base class for filters implemented as AudioWorkletProcessors. Subclasses
7
+ * declare the worklet's name, source code, and node options; this class
8
+ * handles the async lifecycle.
9
+ *
10
+ * Stable input/output nodes (GainNodes) are created immediately on setup.
11
+ * While the worklet loads asynchronously, audio passes through directly
12
+ * (effectively bypassing the filter for ~10-50ms during initial load).
13
+ * Once the worklet loads, it's inserted into the chain and audio routes
14
+ * through it.
15
+ *
16
+ * Subclasses can override `_onWorkletReady` to perform additional wiring
17
+ * (e.g., sidechain inputs).
18
+ */
19
+ class WorkletFilter extends AudioFilter {
20
+ _inputGain = null;
21
+ _outputGain = null;
22
+ _workletNode = null;
23
+ _ready = null;
24
+ /** AudioWorkletNode constructor options. Default: 1 input, 1 output. */
25
+ get _workletOptions() {
26
+ return { numberOfInputs: 1, numberOfOutputs: 1 };
27
+ }
28
+ constructor() {
29
+ super();
30
+ if (isAudioContextReady()) {
31
+ this._setup(getAudioContext());
32
+ }
33
+ else {
34
+ onAudioContextReady.once(this._setup, this);
35
+ }
36
+ }
37
+ get inputNode() {
38
+ if (!this._inputGain) {
39
+ throw new Error(`${this.constructor.name}: input node accessed before audio context is ready.`);
40
+ }
41
+ return this._inputGain;
42
+ }
43
+ get outputNode() {
44
+ if (!this._outputGain) {
45
+ throw new Error(`${this.constructor.name}: output node accessed before audio context is ready.`);
46
+ }
47
+ return this._outputGain;
48
+ }
49
+ /**
50
+ * Resolves once the underlying worklet is loaded and inserted into the
51
+ * audio chain. Use this if you need to wait before applying parameters
52
+ * that depend on the worklet node.
53
+ */
54
+ get ready() {
55
+ return this._ready ?? Promise.resolve();
56
+ }
57
+ /** Disconnects all nodes, cancels any pending worklet load, and releases resources. */
58
+ destroy() {
59
+ onAudioContextReady.clearByContext(this);
60
+ this._workletNode?.disconnect();
61
+ this._inputGain?.disconnect();
62
+ this._outputGain?.disconnect();
63
+ this._workletNode = null;
64
+ this._inputGain = null;
65
+ this._outputGain = null;
66
+ this._ready = null;
67
+ }
68
+ /**
69
+ * Ramps an `AudioParam` on the underlying `AudioWorkletNode` to `value`
70
+ * using a short exponential ramp. No-ops if the worklet is not yet loaded.
71
+ * @internal
72
+ */
73
+ _setAudioParam(name, value) {
74
+ if (!this._workletNode)
75
+ return;
76
+ const param = this._workletNode.parameters.get(name);
77
+ if (param) {
78
+ param.setTargetAtTime(value, this._workletNode.context.currentTime, 0.01);
79
+ }
80
+ }
81
+ _setup(audioContext) {
82
+ // Create stable input/output gains immediately (bus can wire them now).
83
+ const inputGain = audioContext.createGain();
84
+ const outputGain = audioContext.createGain();
85
+ // Bypass: input → output until worklet loads.
86
+ inputGain.connect(outputGain);
87
+ this._inputGain = inputGain;
88
+ this._outputGain = outputGain;
89
+ // Async-load the worklet, then re-route through it.
90
+ this._ready = registerWorkletProcessor(audioContext, this._workletName, this._workletSource)
91
+ .then(() => {
92
+ if (!this._inputGain || !this._outputGain)
93
+ return; // destroyed during load
94
+ const node = new AudioWorkletNode(audioContext, this._workletName, this._workletOptions);
95
+ this._workletNode = node;
96
+ // Re-route: input → worklet → output
97
+ this._inputGain.disconnect();
98
+ this._inputGain.connect(node);
99
+ node.connect(this._outputGain);
100
+ this._onWorkletReady?.(audioContext);
101
+ });
102
+ }
103
+ }
104
+
105
+ export { WorkletFilter };
106
+ //# sourceMappingURL=WorkletFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkletFilter.js","sources":["../../../../../src/audio/filters/WorkletFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export * from './LowpassFilter';
2
+ export * from './HighpassFilter';
3
+ export * from './CompressorFilter';
4
+ export * from './DelayFilter';
5
+ export * from './ReverbFilter';
6
+ export * from './EqualizerFilter';
7
+ export * from './DuckingFilter';
8
+ export { WorkletFilter } from './WorkletFilter';
9
+ export { ChorusFilter, type ChorusFilterOptions } from './ChorusFilter';
10
+ export { PitchShiftFilter, type PitchShiftFilterOptions } from './PitchShiftFilter';
11
+ export { VocoderFilter, type VocoderFilterOptions } from './VocoderFilter';
12
+ export { GranularFilter, type GranularFilterOptions } from './GranularFilter';
@@ -2,5 +2,19 @@ export * from './AbstractMedia';
2
2
  export * from './Media';
3
3
  export * from './audio-context';
4
4
  export * from './AudioAnalyser';
5
+ export * from './AudioBus';
6
+ export * from './BeatDetector';
7
+ export { AudioFilter } from './AudioFilter';
8
+ export { AudioListener, type AudioListenerTarget } from './AudioListener';
9
+ export { AudioManager, getAudioManager } from './AudioManager';
10
+ export * from './filters';
5
11
  export * from './Music';
6
- export * from './Sound';
12
+ export { Sound, SoundPoolStrategy } from './Sound';
13
+ export type { SoundOptions, PlayOptions, AudioSpriteClip } from './Sound';
14
+ export { registerWorkletProcessor } from './worklet/registerWorklet';
15
+ export { crossFade } from './crossFade';
16
+ export type { CrossFadeOptions } from './crossFade';
17
+ export { Envelope } from './Envelope';
18
+ export type { EnvelopeOptions } from './Envelope';
19
+ export { OscillatorSound } from './OscillatorSound';
20
+ export type { OscillatorSoundOptions, OscillatorType, OscillatorPlayOptions } from './OscillatorSound';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Registers an AudioWorkletProcessor (defined by `source`) with the given
3
+ * AudioContext under `processorName`. Idempotent: subsequent calls with the
4
+ * same context+name return immediately. Concurrent calls (race-condition
5
+ * protection) share a single in-flight registration promise.
6
+ *
7
+ * Source is bundled at build time as a JavaScript string and turned into a
8
+ * Blob URL at runtime — no separate worklet asset file is shipped.
9
+ */
10
+ export declare function registerWorkletProcessor(audioContext: BaseAudioContext, processorName: string, source: string): Promise<void>;
@@ -0,0 +1,44 @@
1
+ const _registered = new WeakMap();
2
+ const _pending = new WeakMap();
3
+ /**
4
+ * Registers an AudioWorkletProcessor (defined by `source`) with the given
5
+ * AudioContext under `processorName`. Idempotent: subsequent calls with the
6
+ * same context+name return immediately. Concurrent calls (race-condition
7
+ * protection) share a single in-flight registration promise.
8
+ *
9
+ * Source is bundled at build time as a JavaScript string and turned into a
10
+ * Blob URL at runtime — no separate worklet asset file is shipped.
11
+ */
12
+ async function registerWorkletProcessor(audioContext, processorName, source) {
13
+ let registered = _registered.get(audioContext);
14
+ if (!registered) {
15
+ registered = new Set();
16
+ _registered.set(audioContext, registered);
17
+ }
18
+ if (registered.has(processorName))
19
+ return;
20
+ let pending = _pending.get(audioContext);
21
+ if (!pending) {
22
+ pending = new Map();
23
+ _pending.set(audioContext, pending);
24
+ }
25
+ const inFlight = pending.get(processorName);
26
+ if (inFlight)
27
+ return inFlight;
28
+ const blob = new Blob([source], { type: 'application/javascript' });
29
+ const url = URL.createObjectURL(blob);
30
+ const promise = audioContext.audioWorklet.addModule(url).finally(() => {
31
+ URL.revokeObjectURL(url);
32
+ }).then(() => {
33
+ registered.add(processorName);
34
+ pending.delete(processorName);
35
+ }).catch((error) => {
36
+ pending.delete(processorName);
37
+ throw error;
38
+ });
39
+ pending.set(processorName, promise);
40
+ return promise;
41
+ }
42
+
43
+ export { registerWorkletProcessor };
44
+ //# sourceMappingURL=registerWorklet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerWorklet.js","sources":["../../../../../src/audio/worklet/registerWorklet.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,IAAI,OAAO,EAAiC;AAChE,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAgD;AAE5E;;;;;;;;AAQG;AACI,eAAe,wBAAwB,CAC1C,YAA8B,EAC9B,aAAqB,EACrB,MAAc,EAAA;IAEd,IAAI,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;IAC9C,IAAI,CAAC,UAAU,EAAE;AACb,QAAA,UAAU,GAAG,IAAI,GAAG,EAAE;AACtB,QAAA,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;IAC7C;AACA,IAAA,IAAI,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE;IAEnC,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE;AACV,QAAA,OAAO,GAAG,IAAI,GAAG,EAAE;AACnB,QAAA,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC;IACvC;IACA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAC3C,IAAA,IAAI,QAAQ;AAAE,QAAA,OAAO,QAAQ;AAE7B,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;IACnE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAErC,IAAA,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAK;AAClE,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;AAC5B,IAAA,CAAC,CAAC,CAAC,IAAI,CAAC,MAAK;AACT,QAAA,UAAW,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9B,QAAA,OAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;AAClC,IAAA,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AACf,QAAA,OAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;AAC9B,QAAA,MAAM,KAAK;AACf,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC;AACnC,IAAA,OAAO,OAAO;AAClB;;;;"}