Really needs a framerate limiter, at 360 Hz it's just a flickering mess.
There are more suggestions that make sense but I haven’t tried that include using multiple threads, calling setInterval/setTimeout in a separate thread for CPU work from the rAF() call (which is GPU and should not update if there is nothing to update) but this wasn’t immediately helpful to me so I went with the elapsed time test and explicit frameRate. There are some potential sync issues over time but they are discussed in the SO thread and additionally on the mozilla developer site, where they also discuss syncing to an audio clock at 60 Hz.