The WebMIDI standard has a problem, which is that only the main UI thread can talk to the WebMIDI devices directly. So even if you schedule your MIDI messages in the audio thread, to emit them on the hardware device you need to pass them to the main thread and then emit the messages from there, incurring whatever delays imposed by the main thread as it handles user input
You can do this fairly rapidly, as long as the tab has enough cycles at its disposal. The real problems start when you try to do a lot of display, computation and other interaction at the same time.
Yesterday I couldn't figure out how to get it to work, or even what was supposed to happen, but today I hooked up my controller, restarted the browser (learned that's necessary yesterday), opened settings which by default was set to "Input: Blank" and "Output: MPKMINI2", switched it to "Input: MPKMINI2" and "Output: BUILTIN AUDIO" and I can now play along with the notes step by step. It's really fun actually :)