Text Chord Player — Manual
What it does
Type a chord progression and play a simple backing track to sing along to, right
in the browser. Choose an accompaniment pattern, tempo and meter; a
score is generated to match, and a cursor follows it as it plays. Click a note in
the score or drag the slider to start from anywhere. You do not enter a melody
or specific accompaniment notes — just chords and a few settings. The sound is
piano only (switching instruments is a possible future paid feature). Everything
runs in your browser; nothing you enter is uploaded or stored. The piano
sounds are served from this site too, so playback makes no third-party requests.
How to use it
The editor has four tabs: Player, Settings, Data, and Simple syntax. Edit the progression in Data,
tempo, meter, pattern, and volume in Settings, and use the rendered score and playback controls in Player.
- Open the Text Chord Player tool.
- Type chords into the "Chord progression" box (e.g.
D A/C# Bm7 Asus4).
Space-separated means one chord per bar; put|between bars to place several
chords in one bar. A newline starts a new line in the score. To change chord
mid-bar, add:beatslike| Am:2 D:2 |. - Set "Tempo", "Meter" and "Accompaniment pattern". Changing any of
them rebuilds the score and backing track. - Press "Play" above the score to hear the accompaniment and watch the cursor
move. Press again to pause; "Stop" returns to the start. Use the "Volume"
slider to adjust playback volume. - Click a note in the score, or drag the seek bar, to play from that point (the
first play takes a few seconds to load the piano sound). - Settings are reflected in the URL. "Copy link" copies the current URL to the
clipboard; "Share" hands the URL and text to your device's share sheet (shown
only where the Web Share API is available). Share or bookmark that URL to
reopen with the same settings.
Spec
Chord progression syntax
- Separators: a newline starts a new score line. If a line contains
|, bars
are split on|and a bar may hold several space-separated chords. Without|,
each space-separated chord is its own bar. - Beats within a bar: append
:beatsto a chord to set how many beats it
takes in its bar (decimals allowed, e.g.| C:3 G:1 |is C for 3 beats, G for
1). Chords without:beatssplit the remainder of the bar evenly (e.g.| C:2 G Am |is C for 2 beats, G and Am for 1 each). If every chord has:beatsand the total doesn't fill the bar, the last chord is adjusted. - Bar limit: 64 bars. Anything beyond is ignored.
- Input limits: 8,192 characters, up to 8 chords in one bar, and 256 chords total. Inputs above these limits are rejected with an error.
- Root:
A–G(upper or lower case).#/♯raises a semitone,b/♭
lowers one,xis a double sharp. - Slash chords: write a bass note after
/, e.g.C/G. The named bass note
sounds in the left-hand (low) register and the right-hand chord stays a compact
one-octave voicing (e.g.A/C#is a left-hand C# plusC# E Ain the right hand). - No melody or rhythm input — the accompaniment shape comes entirely from the
"Accompaniment pattern" choice.
Accompaniment patterns
There are two patterns, "Pattern 1" and "Pattern 2". The right hand is the same
in both: a full chord on every beat (chord tones folded into one octave,
C4–B4). Only the left-hand rhythm differs. The left hand always plays an
octave — the bass note (the chord root, or the note after / for a slash chord)
plus the note one octave below it, roughly C2–B3.
Pattern 1 (struck at each chord and bar)
The left-hand octave is restruck every time the chord changes and every time the
bar changes, then held for that chord. Even if the bass note (root) is the same
as before, it is played again at the chord or bar boundary — it is never tied
across. This is the plainest backing, good as a guide for singing or as a bed
under a vocal.
- Example (4/4,
C | C | F | G7): the left hand strikes the octave at the start
of every bar and holds it for that bar. Bars 1 and 2 are both "C", but bar 2 is
struck again on its downbeat. The right hand plays four quarter-note chords in
every bar.
Pattern 2 (anticipated bass at chord changes)
Same as Pattern 1 (struck at each chord and bar, then held), except that on the
last eighth note (off-beat) of every chord it restrikes the same octave,
pushing into the downbeat of the next chord (usually the next bar). This gives a
"daa—dat, daa—dat" forward lean, with more drive than Pattern 1. It happens even
when the next chord's bass note is unchanged (progressions like C | C | G7 | C).
- Example (4/4,
C | F | G7 | C): in each bar the left hand holds the downbeat
octave for three and a half beats, hits again on the "and" of beat 4, and
carries straight into the next bar's bass note. Only the very last chord of
the progression has no off-beat — with nothing to push into, it is just
struck on the downbeat and held. - If a chord occupies fewer than two beats (short allocations like
| C:1 F:1 C:1 G:1 |), there is no room for the off-beat, so that chord behaves
like Pattern 1.
Supported chord types
Add one of these after the root (common notation variants are also accepted).
| Type | Examples |
|---|---|
| Major | C / CM / Cmaj |
| Minor | Cm / Cmin / C- |
| 7th | C7 |
| Major 7th | Cmaj7 / CM7 / CΔ |
| Minor 7th | Cm7 / Cmin7 / C-7 |
| 6th / m6 | C6 / Cm6 |
| sus2 / sus4 | Csus2 / Csus4 / Csus |
| dim / dim7 / m7♭5 | Cdim / Cdim7 / Cm7b5 / C° / Cø |
| aug | Caug / C+ |
| 9ths | C9 / Cmaj9 / Cm9 / Cadd9 |
| 11th / 13th | C11 / C13 |
| Altered tensions | C7b9 / C7#9 / C7#5 / C7b5 / C7#11 |
| Power chord | C5 |
If a chord can't be understood, that bar is skipped, the rest still plays, and the
unrecognized chords are listed on screen.
Input ranges
| Field | Range |
|---|---|
| Tempo (BPM) | 30–300 (out-of-range is clamped; non-numeric falls back to 90) |
| Meter | choose 4/4 / 3/4 / 6/8 |
| Accompaniment pattern | Pattern 1 (struck at each chord and bar) / Pattern 2 (anticipated bass); see "Accompaniment patterns" |
| Volume | 0–100 (default 50); 50 is unity gain, 100 is roughly 2× |
Simple syntax and sharing URL
Settings and the chord progression can be edited together. Everything after the blank line is the progression.
tempo: 90
meter: 4/4
pattern: 1
volume: 50
C | F C | G7 C | G7 C |
The syntax is compressed with fflate and stored in the URL as #v1:…. Opening that URL restores
the same settings and progression. The previous query-parameter format is not supported.
Privacy
- Input and settings are processed only in your browser; nothing is sent to a server.
- The piano sound (soundfont) is served from
/assets/soundfont/onabstiro.com. Playback makes no requests to third-party domains. - The URL is updated with
history.replaceState, so it does not clutter your
browser history. - "Copy link" and "Share" send nothing to a server: the former writes the current
URL to the clipboard, the latter passes it to the device share sheet
(navigator.share).
Notes
- Each chord is voiced as a left-hand bass octave (C2–B3: the bass note plus the
note an octave below) and a right-hand chord (chord tones folded into one
octave, C4–B4). The bass note is the chord root, or the named bass for a slash
chord. Even with tensions, the right-hand shape never leaps wildly up or down.
The score writes the two hands on a piano grand staff: right hand in treble
clef, left hand in bass clef. The right hand always plays a full chord per
beat; only the left hand changes with the pattern (see "Accompaniment
patterns"). - The score shows the chosen accompaniment pattern as notes, not a melody. Use it
as a stand-in for a seek bar to see where playback is. - Volume changes apply in real time while playing (the score and backing track
are not rebuilt).