- Add updateAudioListener() called each frame to sync the Web Audio API
listener position/orientation with the Three.js camera
- Add createPanner() helper for HRTF-positioned sound sources
- Sparkle plucks now spawn at random 3D positions floating above the
platform so they drift in from all directions
- Add startPortalHums(): each portal emits a quiet positional hum at its
world coordinate (x, y, z) so portals can be heard panning as the
listener orbits; hums start when both audio and portal data are ready
- stopAmbient() disconnects and clears all positionedPanners and resets
portalHumsStarted so restart is clean
Fixes#239
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>