This is a fun tutorial for processing audio in Go, but generally panning will sound bad if you only adjust the amplitude/level.
The two important missing pieces are phase delay and frequency-specific attenuation (the "head" model). Audio coming from the left side of your head reaches your left ear first, then your right ear later. Also, your head blocks certain frequencies more than others. Both of these effects are super noticeable and necessary to make panning sound "3D".
Adding these things to the Go code would actually be fairly straightforward, you just need to add a filter to `applyPan`. The filter would only need around 12 taps to sound good.
Here's a javascript tutorial which includes both of these additional features:
You say this like it's bog standard but adding HRTF and compensation for speaker distance are not part of a standard panning algorithm. This is more likely to exist in another module, such as for ambisonics or correction.
HRTF is often used in game audio and AR [2], but never [1] as a mix effect in commercial DAWs.
HRTF is a blunt instrument anyway. It's supposed to model your head and not just a standard imaginary generic head, and that's impossible without sticking a microphone inside each ear.
It's also a headphone-only effect. As soon as you play the sound through speakers you get room reflections and all kinds of other artefacts which wash out the spatial detail.
[1] Almost never. There are HRTF plugins, but they're hardly ever used in music mixing.
[2] Apple has some HRTF patents for recording audio on multiple channels - not just two - using HRTFs to capture apparent depth.
Sorry this is just wrong. What is your basis for saying that HRTF are never used in commerical DAWs? Have you read anything by Bob Katz or Rashad Becker? Or perhaps you're not aware of the several options people reach for to perform multichannel mixing using ambisonics:
It isn't about speaker distance, it's about distance between ears.
I agree that HRTFs are uncommon in mixing, but spatialization without some frequency dependent attenuation generally sounds "flat" with headphones.
Although VR systems and big budget spatialization like Atmos will account for speaker distance (so called near field effects) it's almost impossible to notice those effects for stationary sources and no head-tracking.
The tutorial you linked to doesn't explain how to implement any of that stuff. But it doesn't matter because the panner in the article is fine as it is. Simple panning is often the best option in music, since filtering your sounds will just make your mix sound bad on common sound systems. Left/right delay will be great on headphones but create phase effects on common speaker setups, often making things worse as well. I don't think a general-purpose tool should add potentially unwanted effects like that.
To be fair, it’s not general, it’s a “speaker only” tool. For headphones, it’s incredibly unnatural to have audio only coming into one ear without a delayed signal in the other. That simply never happens in the real world.
The two important missing pieces are phase delay and frequency-specific attenuation (the "head" model). Audio coming from the left side of your head reaches your left ear first, then your right ear later. Also, your head blocks certain frequencies more than others. Both of these effects are super noticeable and necessary to make panning sound "3D".
Adding these things to the Go code would actually be fairly straightforward, you just need to add a filter to `applyPan`. The filter would only need around 12 taps to sound good.
Here's a javascript tutorial which includes both of these additional features:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_A...