Converts between standard MIDI files, Piano Tiles 2-style song notation JSON, and USong binary files (v0.1.1), entirely in your browser. Format reference:
pianotiles2-community.github.io/wiki/song.html
MIDI → JSON
JSON → MIDI
Edit JSON
USong → MIDI
🎮 Test JSON
Load MIDI
Drop a .mid file here, or click to browse
Parsing happens locally in your browser
Settings
Smallest tile ?
Chord timing ?
Measure length ?
Song parts ?
Transpose ?
?
?
Tracks (each becomes one scores voice)
Per-part tempo — e.g. part 1 = 100 bpm, part 2 = 105, part 3 = 110...
baseBpm ?
?
?
Chance per group (%)
Output preview
5<> is the only tile type with confirmed syntax in the wiki ("double tile"). It merges multiple notes/chords across a paired lane at once — 2, 4, 8, even 16 at a time all work in-game.
3<> 6<> 7<> 8<> 9<> 10<> are named and described, but the wiki gives no worked
example or note-count limit for any of them. Everything else here (pitch names, chord grouping, quantized durations, grid
self-correction, measure barlines, time-signature detection) is implemented from confirmed spec.
🍺 DRUNK Mode's non-5<> tile types use your own chosen min/max note counts because the game doesn't document any —
there's no "correct" number to check against. Start with small ranges (2–6) and test in-game before trusting a file with these enabled.
Load JSON
Drop a song JSON file here, or click to browse
Parsing happens locally in your browser
Settings
MIDI division?
Fallback BPM?
Note velocity?
Transpose ?
Score tracks
Quantization — snaps note timing to a rhythmic grid, GarageBand-style
Type ?
Grid division ?
Swing style ?
?
Reconstructs pitch and rhythm exactly from the notation letters, including unpacking 5<> double tiles.
mute tokens produce a timed rest. Ignores baseBpm/baseBeats scroll-speed scaling
(uses each part's bpm directly) since the in-game speed formula isn't published.
Create a blank JSON
Generates an empty, structurally-valid song — add notes yourself for a custom challenge.
Parts
Score tracks per part
baseBpm
bpm / baseBeats per part
Load JSON to edit
Drop a song JSON file here, or click to browse
Edit directly as text, or use the token editor below
Raw text
Token editor
Click a token to select it, edit its text directly, or use the buttons below. Changes here re-write the raw text above.
Transpose ?
Semitones ?
Out-of-range notes ?
Quantize timing — same grid engine as the JSON → MIDI tab, applied directly to the notation
Rewrites the rest/note letters themselves so the notation's own timing snaps to a grid — useful when you want the quantized version saved back as JSON, not just baked into an exported MIDI.
Type ?
Grid division ?
Swing style ?
?
Duplicate notes ?
Apply to ?
Merge fast notes into grouped tiles ?
Duration letter to merge ?
Tile type ?
Notes per group ?
Convert tile types ?
Convert from
Convert to
Only convert tiles whose notes use these duration letters ?
🍺 Make this JSON DRUNK
Randomizes tile groupings directly on this JSON's existing notes — no MIDI needed, works even if you've lost the original file.
Chance per group (%)
🎲 Random note injection ?
Independent from DRUNK-ify above — this only adds extra pitches to notes, it never restructures tiles.
Chance per note (%) ?
Min extra notes
Max extra notes
Apply to
Pitch of extra notes ?
± semitones
Auto-fix strips trailing commas, balances unmatched brackets, trims garbage before/after the JSON body, and converts
stray single quotes — a best-effort heuristic, not a guarantee, especially for malformed note-notation strings.
Load USong
Drop a .usong file here, or click to browse
Format v0.1.1 · parsed entirely in your browser, nothing is uploaded
Only format version 1 (v0.1.1) is supported, since v0.1's header layout isn't documented. The song format
doesn't fully define how tempo evolves under linear and classic PT2 acceleration, so this
converter makes explicit choices — tap the ? below for details. Output MIDI always uses a fixed reference
tempo of 120 BPM at 960 ticks/quarter; USong's own tempo curve is baked directly into note timing instead, so
playback stays accurate regardless of what a MIDI player assumes about tempo.
Tempo timing assumptions?
— which mode is active is reported in the parse log for every file you load.
Load JSON to test
Loads a Piano Tiles 2 song JSON straight into the real Piano Tiles Zero game engine — no download, no copy-paste round trip needed. The JSON is parsed entirely by the game's own parser, not this site's.
🎮 Real game ?
Must be served over http(s) (not opened as a bare local file://) for the iframe and Tailwind CDN to load correctly — run it from a local web server if it looks blank.