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.

  1. Open the Text Chord Player tool.
  2. 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 :beats like | Am:2 D:2 |.
  3. Set "Tempo", "Meter" and "Accompaniment pattern". Changing any of
    them rebuilds the score and backing track.
  4. 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.
  5. 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).
  6. 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 :beats to 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 :beats split 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
    :beats and 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, x is 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# plus C# E A in 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/ on
    abstiro.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).