Thanks Ashley!
The stepped function is cool too! I really appreciate it. I think small things like this that can replace a extra conditional event (getting rid of the exception to set 0 as mute) goes a long way to making things simpler for the user.
One more minor suggestion while we're on the topic - recommend updating the tooltip when choosing the volume parameter for Audio: Play (and other places?). It currently states "Volume: The attenuation in decibels (dB). 0 is original volume, -10dB is about half as loud, etc." I think that tooltip by itself was another source of confusion as well - I know it led me to think ok, if -10db is half as loud (it wasn't), 50% should be -10, and if I want half of that half (because of my limited knowledge of dB), I'd need -20 at 25%... (also wrong) ect.
I think it would be enough to say that it is the attenuation in decibels from 0 to negative infinity, possibly implying or explicitly stating the user needs to determine the lower bound (this might be TMI for a tooltip?), and note that the normalizedVolume expression is a thing that exists for it.
Recommending the dynamic range lower bound to be -40 (instead of -50 or -60) due to the stepped function) in the manual manual entry for normalizedVolume() might be good too. I'm not familiar with how standard ranges are across systems though so explicitly recommending a value may or may not cause problems for some people? Although I can't imagine that literally every piece of software in existence that dealt with audio would have (or should, at the least) to deal with something like that.
And why not make it so you can have it louder instead of just quieter...
This is the dream for us laypeople isn't it? This really is a key point that can be hard to wrap your head around without prior knowledge. Unfortunately, that's simply just not how computers/operating systems work when outputting sound, as far as I've learned about.