Skip to main content

Jazz Piano Trainer

A desktop application to help you learn jazz piano modes and chords using your MIDI keyboard.
Press NEXT to get a question, play the notes on your keyboard, and the app reveals the answer automatically once you hit all the right keys.

Jazz Piano Trainer preview

Watch the walkthrough video: https://www.youtube.com/watch?v=WCQai649s_Q


Features

  • Modes & Chords — randomised questions covering all 12 keys, 7 modes, and a curated set of jazz chords
  • MIDI input — connect one or more MIDI keyboards; correct notes light up green, wrong notes red on the virtual keyboard
  • Virtual piano keyboard — resizable, scrollable, supports 1–7 octaves
  • Built-in sampler — plays back audio samples for each note via piano-sampler; can be disabled
  • Persistent settings — MIDI ports, sampler options, and display preferences saved to jptrainer.json

Dependencies

Package Purpose
piano-sampler Audio sample playback engine (sister project)
mido + python-rtmidi MIDI input handling
pygame Audio mixing
Pillow Image loading and keyboard scaling
tkinter (stdlib) GUI framework

Installation

With uv (recommended)

uv tool install jptrainer
jptrainer

With pip

pip install jptrainer
jptrainer

Usage

  1. Launch the app — the virtual keyboard and dark-themed UI open automatically.
  2. Open ⚙ Settings (gear icon, top-right of the header) to:
    • Select which MIDI input port(s) to use
    • Configure the sampler (enable/disable, velocity, sustain, polyphony, sample path)
    • Set how many octaves to display (1–7)
  3. Choose MODES or CHORDS from the mode selector in the header.
  4. Click ▶ NEXT — a question appears (e.g. "G Dorian").
  5. Play the required notes on your MIDI keyboard. Correct notes glow green; the answer reveals itself when all notes are played. After 10 seconds the answer is shown automatically.
  6. Click ↺ REPLAY to hear the audio example again.

Settings file

Settings are saved to jptrainer.json in the project root:

{
  "midi_ports": ["Your MIDI Device"],
  "sampler_enabled": true,
  "ignore_velocity": true,
  "sustain": false,
  "polyphony": 32,
  "samples_path": "./piano_samples.zip",
  "octaves": 4,
  "debug": false
}

Related projects


Buy me a coffee


🚨 WARNING: INCOMING SHAMELESS PLUG 🚨 Please avert your eyes if you are allergic to indie devs promoting their own stuff on their free MIT repos! 🫣

🎹 JazzPianoTrainer — Meet its beefy C++ sibling, JazzPianoLab!

I loved working on this repo, but my curiosity got the better of me. I really wanted to build my own highly controllable audio tool from the ground up, just to see what I could do. Fast forward a bit, and I accidentally spent way too much time creating a massive, supercharged version called JazzPianoLab!

It's written in C++ using the JUCE 8 audio framework and is packed with features I nerded out on:

🎹 VST3 Virtual Instrument Support

🎼 Advanced Chord Profile System

⚡ Real-Time Chord Identification

🔴 Built-in MIDI Recorder

...and much more!

Don't worry, this MIT project isn't going anywhere! But if you’re looking for a next-level jazz piano training tool (or just want to see what happens when a developer gets completely carried away), check out JazzPianoLab for the latest updates and downloads.

Let’s make jazz piano learning smarter and more fun together!

JazzPianoLabr

Metadata

Release files for jptrainer 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jptrainer 0.2.0
File Size Uploaded
jptrainer-0.2.0.tar.gz 87.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for jptrainer 0.2.0
File Interpreter ABI Platform
jptrainer-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 174.9 MB

Release files / jptrainer-0.2.0.tar.gz

Download URL jptrainer-0.2.0.tar.gz
Size 87.3 MB
Tags Source
SHA-256 checksum
How to use checksums
8d3d81936e227ebafc57988e6754ad5a4a575753246b0652efdc97d0fddfc239
BLAKE2b-256 checksum
How to use checksums
89d2630009615d7aa4644e09a516295e52ca586263898cdff6933c4d95dc32ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / jptrainer-0.2.0-py3-none-any.whl

Download URL jptrainer-0.2.0-py3-none-any.whl
Size 87.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
532889a88e6900970d951c3e118bc12dc1c1310cdd95af8148ca002fca511432
BLAKE2b-256 checksum
How to use checksums
62bb5b5d9d157eac65b6da8b3d094a51a11711fb553cd562158b127c0c19d71d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page