Interesting, and quite responsive. Audio generation in JS that I've tinkered with elsewhere tends to seem responsive until you try to make music out of it, at which point the poor timing is painfully obvious.
At the moment this seems to just be doing basic tone generation, though -- the options are sawtooth wave vs. sine wave etc..
Things get messy when you dig into MIDI playback type features, working with samples, sound libraries, etc.. But if they can forge a clear path in that direction (but somehow not lose decent timing), that could be quite useful.
Beep.js really isn't a synthesizer, it's more of a step-sequencer. You might want to check out WAD.js, which is more concerned with synthesizing sounds than scheduling them (it has filters, LFOs, other effects, etc). https://github.com/rserota/wad.
Full disclosure, I wrote WAD.js.
and btw it's totally possible to make well-timed music with web-audio. I've got a midi keyboard hooked up to web-audio based looper, and that's what I use as my primary instrument these days for practicing. It works fine for me.
Certain features that I depend on (particularly midi input) are only available in chrome as of right now, so I honestly only test it in chrome, though most of the basic functionality ought to work in other browsers.
This is the point where I stop and say "oh well, wait another year and maybe then..."
"Evergreen browsers only" is reasonable to ask for lots of sites; but "This site only works properly in the Chrome browser" gives me unpleasant flashbacks to when this notice was everywhere, but the browser was "IE5".
Failing that, it could also be interesting to explore the possibilities of making sounds and music that aren't so dependent on timing. Eventually consistent tunes, if you will. :)
It seems to support 4 simultaneous notes at a time, using the computer keyboard (e.g., press down zxcv together), but if you hit a 5th key it's ignored.
For key velocity (is that what you mean by instrument expression?) -- there's maybe not much point attempting to tackle that when it's not emulating instrument voices yet anyway, or supporting MIDI input. You can't exactly capture key velocity from a computer keyboard.
There's some mention of gain in the code snippets, at any rate -- I think each voice may have its own "volume knob", in effect -- but I haven't dug into it at all.
> It seems to support 4 simultaneous notes at a time, using the computer keyboard (e.g., press down zxcv together), but if you hit a 5th key it's ignored.
I think that's a limitation of your keyboard. Here I can play zxcvbn, but I can't add a seventh note.
I can play six with my keyboard too! But I got a seventh to sound by hovering over it with my mouse pointer. So it seems like many simultaneous notes are supported. I only wish there were controls for the timbre of the sound.
Nit picking but it would probably be better to have the white keys be a-s-d-f-etc. just because they're the home keys and where my fingers felt more natural. Awesome idea though and I love that browsers are capable of this.
Edit: If there's a reason for not having this be this way, I apologize; I'm a drummer and not privy to computer based synth.
Your idea is interesting feedback. There is a legacy associated with this pattern, though: Going back to at least 1989 (Amiga Protracker family), people have been using this layout because it allows two simultaneous octaves, one at qwertyuipo and one at zxcvbnm,./
That's what I'd figured because it was just so interestingly laid out but I was just thinking about finding the home keys and knowing where to begin. Once again, entirely speaking as someone coming from zero keys playing experience.
Are you asking if it can play a song recorded in a midi file, or if it can play sounds based on input from a midi keyboard? Either way, I think the answer is no.
At the moment this seems to just be doing basic tone generation, though -- the options are sawtooth wave vs. sine wave etc..
Things get messy when you dig into MIDI playback type features, working with samples, sound libraries, etc.. But if they can forge a clear path in that direction (but somehow not lose decent timing), that could be quite useful.