I am extremely happy with this - my two biggest issues with using nsfplay were the noise channel being wrong when playing looped noise, and the keyboard view flickering constantly because no vsync. You've fixed both these issues, which makes me really happy :D
edit: some suggestions/observations
1) when you fast forward/seek forward by clicking, it doesn't replay the song up to that point, which means the keyboard timing is wrong. I noticed if you fast forward using the right arrow key it does this properly (or rewind, same idea).
2) at the same volume, VRC6 squares are noticeably louder than 2a03 squares, is this correct behavior?
3) a request: I would love it if the 2a03 dots on the keyboard were always on top. I really like the change you made (different colors for different expansions) but if I have n106 playing over a bunch of notes, 2a03 never appears. Maybe some kind of blending could be done when two expansions are on the same note, or maybe stack their location on the note? I dunno how that'd be done efficiently though.
1. Hmm, what I am noticing after you mention it is that the keyboard gets a small amount ahead of the track after seeking (I don't see any difference between the arrow keys and clicking; at any rate they execute the same code anyway). I'll try to fix this for the release if I can.
2. Kevin Horton has suggested that there is no nonlinear mixing going on for the VRC6 (doc) which means that volume will not work quite the same way for them. If you want them to sound identical, you can turn off the nonlinear mixing for APU1 in the options and adjust the volume of the VRC6 in the channel mixer so they match.
3. Yeah, it just draws in track order, whatever's last is on top. For the time being you can click the checkboxes to the left of the track display to hide the key dots of a channel. I've been considering adding some sort of vertical stacking for multiple notes, but it won't happen for this version (just fixing bugs right now).
Edit: okay, I think I fixed #1. Looks like seek times were inaccurate, causing the sound playback to lag behind the keyboard.