[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)