Related fun fact: if you're using THREE.js, you might not know that basic positional audio is supported right in the library. It works with regular <audio> elements via WebAudio.
FYI WebAudio[1] has a PannerNode[2] that does exactly this (I only mention in case you thought you might need to manually calculate positional audio without THREE.js)
Today I learned! If you're working with a scene graph you still need to glue your matrices to WebAudio, but I'm consistently amazed at how far you can get without a library in modern browsers.
Artists are doing amazing things on the Sketchfab platform and (as a browser implementer) I'm continually impressed by how hard their team is working to make their viewers work well in all the browsers! It's particularly hard with the spec only just now becoming compatible and getting tests working across them. There are still a lot of quirks to sort out (link navigation, rAF interactions, implementation-specific performance issues, etc.). They're doing great work!
https://threejs.org/docs/#api/audio/PositionalAudio
I figure if someone told me this it would have saved me a couple of hours.