In MIDI, there are NOTE_ON and NOTE_OFF events, for when you press and release each key. The NOTE_ON has pitch and velocity parameters. The NOTE_OFF just has pitch parameter (maybe it has velocity as well I can't quite remember, it's off the point). So if you push middle C, it might look like this:
NOTE_ON 60 (middle C) 98 (velocity), NOTE_OFF 60
Some keyboards never send NOTE_OFF events, instead they send NOTE_ON with velocity 0. On these keyboards, pressing middle C looks like this:
NOTE_ON 60 98, NOTE_ON 60 0
Both are valid MIDI streams, and all stream processors should react appropriately to both. This app likely does not correctly map zero velocity NOTE_ON events to NOTE_OFF with the same pitch.
Thanks for the feedback. Oof that's weird. Maybe I'm triggering some kind of odd aftertouch?
EDIT: Just saw ta2112's note. That's super helpful I'm definitely only responding to standard MIDI NOTE_ON and NOTE_OFF messages.
I'll try to get this fixed this evening.
Aside from that, nice work on the app! Looking forward to giving it another try.
ETA: a shameless plug, but since you may have an interest in this kind of thing - I built and published a free, online midi piano (and drum kit) available for anyone to use. It's pretty bare-bones and doesn't really explain itself, but in case you ever want to use it, check out https://midi-speaker.com/
works with midi input as well as keyboard and touch/mouse input. it only has the two sampled instruments, but it's great for a groove in a pinch!
Tried out your site - super clean interface. I noticed you are using the Salamander Grand Piano samples. For some weird reason I thought that those samples were pretty huge (50+ MB) but it loaded up pretty quick so great job!
Also, thanks for checking out the site! Yeah, I compressed the files down to .mp3, myself, and then only used a single velocity, so that they were around 2MB in total. They sound terrible, in comparison, but good enough for phone speakers and non-recordable jamming. You can find the same-sized, better-sounding .opus versions in all velocities on the repo's base-functionality branch, if you're interested in those samples.