A desktop app for composing music by painting notes on a grid. No music degree required.
Ever since I was a kid, I wanted to make music but never had the patience to learn an instrument. I always thought -- what if I could just draw a song? Click some boxes, hear some notes, move things around until it sounds good?
Every music app I tried was either way too complicated or way too limited. I wanted something in between. Something where I could just open it up, start clicking, and hear a song come together.
So I built PianoPainter.
- Paint notes on a grid -- click to place, click to remove, drag right to hold a note longer
- 3 built-in synth engines -- Basic, FM Piano, and Rich Piano (a multi-oscillator setup that actually sounds pretty decent)
- Sustain pedal -- toggle it on and a green bar appears at the bottom. Paint where you want the pedal held down, just like a real piano
- Color-coded notes -- assign colors to notes for visual organization (or just because it looks cool)
- Copy/Paste wizard -- copy measures and repeat them wherever you want
- Adjustable BPM and volume
- Save/Load your projects as
.ppfiles - Export to MP3 -- pre-rendered samples make this reasonably fast
- Infinite horizontal scrolling -- your song can be as long as you want
- Click measure numbers to set a playback start point
Pre-built installers for all supported platforms are available on the Releases page.
Grab the file that matches your system:
- macOS (Apple Silicon - M1/M2/M3) --
PianoPainter_*_aarch64.dmg - macOS (Intel) --
PianoPainter_*_x64.dmg - Windows x64 --
PianoPainter_*_x64_en-US.msiorPianoPainter_*_x64-setup.exe - Linux x64 --
PianoPainter_*_amd64.deb(Debian/Ubuntu),PianoPainter-*.x86_64.rpm(Fedora/RHEL), orPianoPainter_*_amd64.AppImage(universal) - Linux ARM64 --
PianoPainter_*_arm64.deb,PianoPainter-*.aarch64.rpm, orPianoPainter_*_aarch64.AppImage
Since PianoPainter isn't signed with an Apple Developer certificate, macOS will block it from opening. You may see a warning saying it can't be opened, or that the app is "damaged" (especially on Apple Silicon). To fix it, install PianoPainter normally (drag to Applications), then open Terminal and run:
xattr -d com.apple.quarantine /Applications/PianoPainter.appThen open the app normally. You only need to do this once.
For .AppImage files, you may need to make them executable with chmod +x PianoPainter_*.AppImage before running.
You'll need:
- Node.js (v18+)
- Rust
- pnpm
- System dependencies for Tauri -- see Tauri Prerequisites
git clone https://github.com/cartpauj/piano-painter.git
cd piano-painter
pnpm install
pnpm tauri devFirst build takes a while (Rust compilation). After that, hot reload is fast.
To build a release binary:
pnpm tauri build- Click a cell to place a note (you'll hear it preview)
- Click and drag right to create a held note
- Click an existing note to remove it
- Scroll wheel to move up/down through octaves
- Shift + scroll or trackpad swipe to move left/right through time
- Space bar to play/pause
- Click a measure number at the top to set where playback starts
- Stop resets to the selected measure, rewind button goes back to measure 1
The samples/ directory has example project files you can open in the app to see how things work. Give mary.pp a try -- it's Mary Had a Little Lamb.
The src-tauri/resources/samples/ directory contains 366 pre-rendered PCM audio samples -- every note across all 3 synth engines, with and without sustain. These are bundled with the app so MP3 exports are fast out of the box (no rendering needed). If they're missing for some reason, the app will regenerate them on the fly during export.
Built with Tauri 2, SolidJS, and Tone.js. The grid is rendered on HTML Canvas for performance. MP3 encoding happens in Rust via mp3lame.
See LICENSE for details.
