Currently I'm working up the courage to touch the Web Audio API
Researching it, I see why Emscripten's implementation of SDL's audio stuff was so bad...
The JS that generates new audio samples must run in a different thread and can only generate 128 samples per function call. Very different from how you would naturally make something in SDL.