Onsets and Frames: Dual-Objective Piano Transcription:
They have an implementation in JS which I have not tried.
woaaaa this is amazing! @groma and @weefuzzy will like that!