Rusthesia
Rusthesia is till now just a hack to play a midi file, created from Logic Pro/X, and display a window with falling notes down onto a piano. Thus hardcoded for example is to use track 1 and 2 as piano input.
The midi file can be transposed in half notes in realtime by using shift left/right key. Playing can be paused by space.
Audio
Synthesizer is not included. Instead midi messages will be sent via core audio. Logic Pro/X can be used for playing the midi, but has to be set up accordingly.
No idea for other operation systems, if it works or how to do.
Video
Screen output uses sdl2.
Screenshot
Here screenshot for current version:

Preparation
The sdl2 libraries need to be installed. On macos this can be done by:
brew install sdl2 sdl2_gfx
Installation
cargo install rusthesia
Usage
For help just execute
rusthesia -h
For usage example the midi-file Marche_aux_Flambeaux.mid is included. As per that website, this file is in the public domain.
First list the available tracks:
> rusthesia Marche_aux_Flambeaux.mid -l
Track 0:
Text: Creator: GNU LilyPond 2.8.7
Text: Generated automatically by: GNU LilyPond 2.8.7
Text: at Mon Oct 16 20:41:39 2006
Text: at Mon Oct 16 20:41:39 2006
Track name: Track 0
Track 1:
Track name: upper
Instrument name: accordion
Track 2:
Track name: lower
Instrument name: accordion
For playing and displaying all tracks use:
> rusthesia Marche_aux_Flambeaux.mid -p 0 1 2 -s 0 1 2
In order to play the lower and show only the upper, use the following command:
> rusthesia Marche_aux_Flambeaux.mid -p 1 -s 2
Todo
- Refactoring and code quality
- Bug: Long pressed keys (start before and end after visible region) are not drawn
- Create video
- Speed up by using e.g. one large sdl2 surface
- Nicer looking output
- Different color for the channels (left/right)
- Native macos app with fruitbasket
- Add pause before playing the midi
- Handle all meta messages during playing
- Change most of the prints into log-commands and enable logging per command line option
- and more...
Final Words
The application works, but still this is a quick hack. In future refactoring will be necessary.