[HN Gopher] Audio from Scratch with Go: Stereo Panning
       ___________________________________________________________________
        
       Audio from Scratch with Go: Stereo Panning
        
       Author : Insanity
       Score  : 62 points
       Date   : 2020-07-25 12:22 UTC (1 days ago)
        
 (HTM) web link (dylanmeeus.github.io)
 (TXT) w3m dump (dylanmeeus.github.io)
        
       | PaulDavisThe1st wrote:
       | [ Edited/Deleted reply because I missed the fact that this code
       | distributes a single mono signal across 2 outputs. The
       | terminology for this stuff is never totally clear: some people
       | would call this a mono panner, some would call it a stereo
       | panner, some call it a 1in/2out panner ]
        
         | Insanity wrote:
         | Hey there, yep I'm actually aware of what you're saying. I
         | actually wrote this at the bottom of the post:
         | 
         | "There is actually a flaw with this panning function that we
         | are using. However it is not apparent to us yet because we can
         | only set a pan for an entire audio source"
         | 
         | I'm working from something simple up to something more complex,
         | but tackling it in small parts. Next I'm writing about applying
         | breakpoints where the pan can be set throughout the track and
         | you can notice the power dip - and then we'll work on fixing
         | that. ;-)
        
           | [deleted]
        
           | PaulDavisThe1st wrote:
           | For some reason, I just realized that despite your talk about
           | 2 channel WAV files, this code is actually a 1 input to 2
           | output panner.
           | 
           | So I take back what I said about it being a balance control
           | entirely. Sorry for that.
        
         | [deleted]
        
       | akx wrote:
       | Wonder if this should take into account pan laws:
       | 
       | * https://en.wikipedia.org/wiki/Pan_law
       | 
       | * https://www.image-line.com/support/flstudio_online_manual/ht...
       | (search for "panning law")
        
         | pierrec wrote:
         | I believe this minimal implementation actually over-compensates
         | for pan law because it has a -6dB center. In other words, if
         | you ask this tool for zero panning, it will actually divide the
         | amplitude by 2 (probably not what most people would expect!) In
         | DAWs, -3dB or 0dB center is more common. In a tool like this I
         | would suggest a 0dB center by default, so that zero panning
         | does not change the amplitude. This would be what you second
         | link calls triangular pan law.
        
       | sramsay wrote:
       | Wow, this is really cool. I wonder how far the author plans to go
       | with this? DSP gets pretty complex pretty quickly . . .
        
         | Insanity wrote:
         | Her, author here! :)
         | 
         | Glad you liked it! I don't have concrete plans actually, just
         | doing this for fun so we'll see how far I get :)
        
           | nkozyra wrote:
           | Might have been an interesting point to stream this data
           | (basic sine) to an audio output instead of file. That's more
           | immediately hands on.
           | 
           | (Sorry, this refers to the first entry in your audio/go
           | series)
        
             | Insanity wrote:
             | Thanks, that's a good idea!
        
             | slx26 wrote:
             | that can easily get pretty tricky if you don't want to
             | depend a lot on libraries, which the last time I checked
             | weren't great for golang in this area. I have worked with
             | ALSA (advanced linux sound architecture) a bit,
             | implementing basic midi input from a keyboard + sound
             | generators + plugins with go interfaces and pkg/plugin +
             | stream to audio output... and it's a mess of devices,
             | buffers and formats. and that's only for one OS. and if you
             | start doing anything non-trivial, making the programs work
             | well in real-time is not for the faint of heart.
             | 
             | if there was a single format supported everywhere, minimum
             | buffer sizes and a common API for all OSes, it would be a
             | whole another, much more pleasant story
        
       | mgraczyk wrote:
       | 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:
       | 
       | https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_A...
        
         | qmmmur wrote:
         | 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.
        
         | pierrec wrote:
         | 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.
        
       ___________________________________________________________________
       (page generated 2020-07-26 23:00 UTC)