Overview
The SATB Harmony Tool supports two workflows: Realize mode for
auto-voicing chords from Roman numerals or figured bass, and Check mode
for analysing and validating four-part harmony you enter yourself.
Both modes share the same grid, staff, and analysis panels.
Modes
Realize mode
Fill the RN row (Roman numerals) and/or the
B + Fig rows (bass note + figured bass)
to define your chord progression. The realizer generates SATB voicings
automatically, applying standard voice-leading rules: smooth motion,
correct doubling, leading-tone and 7th resolution.
Any note you type directly into an S / A / T / B cell before
clicking Realize is treated as a constraint — the realizer will honour
that note if it is a valid chord tone in range and fill the remaining
voices around it. Notes that conflict with the RN are ignored.
DISCLAIMER: The realizer always produces a result, but not necessarily your
intended result. Always inspect the voice-leading report after generating.
Check mode
Type the given notes directly into the S A T B rows.
The tool identifies each chord automatically as you type and shows Roman
numeral labels below the staff — you do not need to enter RNs yourself.
Click Check Notes to force a full re-analysis at any time.
The realizer is disabled in Check mode: your notes are never overwritten.
The Attempt Voicing button provides optional assistance
when some voices are missing — it suggests likely RNs and fills empty slots
without modifying notes you have already entered.
DISCLAIMER: This mode is designed for checking your OWN work. DO NOT use it as a final reference solution! Use the feedback to guide your corrections.
Controls
| Control |
Description |
| Key |
Sets the tonic and mode (major / minor) for all harmonic analysis, chord detection, and voicing. |
| Time |
Sets the time signature (2/4, 3/4, 4/4, 2/2, 3/2). Affects bar colouring in the grid, beat-strength detection for NCT analysis, and playback phrasing.
NOTE: This application is NOT intended as a notation software - Although best efforts are made to build notes and bars correctly, the visual output may not match what you expect. This does not affect the analysis!
|
| Default Chord |
Set the chord length for the progression (default are half-notes) |
| Anacrusis |
Add any anacrusis beats to start your piece (NOTE: this auto-balances the last bar) |
| MIDI |
Connects a MIDI keyboard via the WebMIDI API. Once connected, play a note while a grid cell is focused to enter that pitch directly. The note is spelled according to the current key's accidental preference (sharps vs flats). Hot-plug is supported. |
| Save |
Exports the current grid (key, time signature, all cell values, voicings) as a JSON file you can reload later.
Shift+click Save — submit your work to the example library. Submissions go to the Other / Student work category and appear with a Pending badge until an admin approves them.
|
| Load |
Loads a previously saved JSON file, restoring the full grid state. The filename is shown in the info strip below the toolbar. If you make changes after loading, (modified) appears next to the name as a reminder to save. |
| Clear |
Resets the grid, staff, and all analysis panels to the initial empty state. |
| Examples |
Opens the example library — a collection of progressions organised by category (basic cadences, sequences, chorales, minor key, etc.). Click any example to load it. Your own pending submissions appear here with a Pending badge. |
| Realize RN/FB |
Generates SATB voicings from the RN and/or B+Fig rows. Any valid notes already in S/A/T/B are retained. Normally this runs automatically on every edit, however when switching modes, use this button to trigger it manually (eg: loading an example). |
| Auto-Realize ↔ Manual-Mode toggle |
Switches between the two modes. The banner below the toolbar updates to describe the active mode. Switching always hides the Attempt Voicing panel if it is open. |
| Check Notes |
Forces a full voice-leading check on all entered notes. Normally this runs automatically on every edit; use this button to trigger it manually if switching modes. |
| Attempt Voicing |
(Check mode only) Opens a panel listing your grid, showing possible variations of unrealised chords (minimum 2 notes required). The application suggests ranked Roman numerals and lets you fill the empty voices — without modifying any note you have already typed. Columns with only one note show chords diatonically containing that pitch. PT/NCT and empty (duration spacer) columns are shown for context but are not filled. |
| Tempo + | Play | Sound |
Set your required TEMPO using the slider (default 100bpm). (Hint: Tweak this it as it's playing). The PLAY button play's the notes in your grid — click again to stop. The (Sound) Off / Piano / Choir / Organ switch selects the sound source: (Piano uses sampled piano, Choir uses sampled choir vowel sounds, Organ uses sampled church organ).
NOTE: This application is NOT intended as a notation software - playback uses simple note duration. It may sound better if you click along the RN in the grid to play your chords using your own timing.
|
| BC |
Enables a basso continuo cello layer during playback. When checked, a cello doubles the bass voice throughout, using a separate audio channel so it blends without replacing the main instrument. Cello samples are loaded on first use. |
The Harmony Grid
Each column represents one beat position. Rows from top to bottom:
| Row |
Full name |
Description |
| 𝄐 |
Fermata |
Checkbox. When checked, playback holds this chord longer before moving on. |
| PT |
Passing Tone / NCT |
Checkbox + duration selector. Marks this column as a non-chord tone beat.
In Realize mode checking PT inserts a new NCT column before the
current chord. In Check mode it tags the existing column as an NCT
without inserting a new one.
Duration options: ♬ 16th · ♪ 8th ·
♩ quarter · ½ half.
The NCT detector automatically classifies the type (see NCT Types below).
|
| S |
Soprano |
Range C4–G5. Highest voice. |
| A |
Alto |
Range G3–C5. |
| T |
Tenor |
Range C3–G4. |
| B |
Bass |
Range E2–C4. In Realize mode this is the bass note for figured-bass entry (e.g. G3);
in Check mode it is the fourth SATB voice, entered as a note name.
|
| Fig |
Figured Bass |
Realize mode only. Figured bass symbols paired with the B row bass note. Leave blank for root position. See Figured Bass reference below. |
| RN |
Roman Numeral |
In Realize mode this defines the chord to voice (required unless B+Fig is filled).
In Check mode this is auto-filled by the chord detector — you normally leave it blank,
but you can type an RN to override the detection.
See Roman Numeral reference below.
|
| CT |
Chord Tones |
Display-only row showing the notes expected in the current chord (root, third, fifth, seventh). Tones missing from the entered voicing are highlighted in amber. |
Note Entry Format
Notes are entered as a letter name, optional accidental, and octave number: C4 F#3 Bb5. Accidentals are # (sharp) or b (flat). The tool normalises capitalisation on blur. A cell turns green when the note is valid and in range; red when the note is out of range for that voice.
Grid Navigation
| ↑ / ↓ |
Move focus one row up or down |
| ← / → |
Move focus one column left or right (cursor must be at start/end of field) |
| Enter |
Move focus down one row |
| Shift + ↑ / ↓ |
Transpose the focused note by ±1 semitone (clamped to voice range). Triggers an immediate re-check. |
Column Management
Hover over any column number to reveal + (insert before) and − (delete) buttons. Inserting a column shifts all subsequent columns right. Empty columns between active ones act as duration spacers — they extend the preceding chord's playback duration by one beat each.
Figured Bass Reference
Enter a bass note in the B row and a figure in the Fig row. Leaving Fig blank is equivalent to root position (5/3).
| Figure |
Chord |
Inversion |
/ 5/3 / 5 |
Triad |
Root position |
6 / 6/3 |
Triad |
1st inversion — 3rd in bass |
6/4 |
Triad |
2nd inversion — 5th in bass |
7 / 7/5/3 |
Seventh |
Root position |
6/5 / 6/5/3 |
Seventh |
1st inversion — 3rd in bass |
4/3 / 6/4/3 |
Seventh |
2nd inversion — 5th in bass |
4/2 / 2 / 6/4/2 |
Seventh |
3rd inversion — 7th in bass |
| Figure |
Meaning |
#6 / b7 |
Accidentals can prefix any interval number |
#4/2 |
Raised 4th above bass, 2nd above bass |
b6/5 |
Flatted 6th — common in augmented-sixth approaches |
Modulations
The tool supports key changes mid-progression using the pivot-chord method.
A modulation marker tells the analyser where a new key begins so that chord
detection, Roman numerals, leading-tone resolution, and cadence labels all
use the correct key from that point on.
Adding and removing modulations
Click the Key cell inside any grid column to open the column
context menu, then choose Set modulation and select the new
tonic and mode. A blue → Key label appears above the staff at
the boundary, and a double barline is drawn in the notation. To remove a
modulation, open the same menu and choose Remove modulation.
Pivot chords
When a modulation is set, the analyser automatically scans the preceding
chords (up to six positions back) for a pivot chord — a chord
that is diatonic in both the old key and the new key. When one is found:
-
The chord header in the Progression Analysis panel shows both
Roman numerals separated by an equals sign, e.g.
ii = iv (read as "ii in the old key equals iv in the new key").
-
The double barline and key label in the notation are drawn immediately
after the pivot chord, not before the first chord of the new key.
-
The detail line below shows the full reading:
Pivot chord: ii in G major = iv in E minor.
If no diatonic common chord exists (a direct or chromatic modulation), the
barline is placed between the last chord of the old key and the first chord
of the new key with no pivot annotation.
Multiple modulations
You can add as many modulations as needed. Each one is independent — the
analyser chains them in column order so chords after the second modulation
are analysed in the second new key, and so on. Modulations are saved and
restored with the JSON file.
Roman Numeral Reference
Uppercase = major quality · lowercase = minor quality.
Accidentals, quality modifiers, seventh suffixes, and inversion numbers
can all be combined: bVII7, viiø43, V65/IV.
Triad quality
I / i |
Major / minor |
viio / vii° |
Diminished (o = °) |
III+ |
Augmented (+ or aug) |
Alteration prefix
bVII |
Flatted VII (borrowed) |
#IV |
Raised IV (Lydian) |
Seventh chords
V7 |
Dominant 7th (root pos.) |
IM7 / Imaj7 |
Major 7th |
ii7 |
Minor 7th |
viiø7 / viih7 |
Half-diminished (ø or h) |
viio7 |
Fully diminished 7th |
Inversions (after RN)
I6 |
1st inversion triad |
I64 |
2nd inversion triad |
V65 |
1st inv. seventh |
V43 |
2nd inv. seventh |
V42 / V2 |
3rd inv. seventh |
Special chords
V/V |
Secondary dominant of V |
V7/IV |
Secondary dom. 7th of IV |
V65/vi |
Secondary, 1st inv., of vi |
N6 |
Neapolitan sixth (♭II⁶) |
Ger+6 |
German augmented sixth |
It+6 |
Italian augmented sixth |
Fr+6 |
French augmented sixth |
Inversion numbers may be written with or without slashes:
V65 = V6/5. Superscript unicode is also accepted.
Non-Chord Tone (NCT) Types
Mark a column as a PT/NCT beat using the PT checkbox.
The detector automatically classifies the note using the surrounding chords.
Detected types appear in the Progression Analysis panel.
| Code |
Name |
Description |
UPN |
Unaccented Passing Tone |
Stepwise motion between two chord tones in the same direction; falls on a weak beat. |
APN |
Accented Passing Tone |
As above, but falls on a strong (accented) beat. |
N |
Neighbour Tone |
Steps away from a chord tone and returns to the same pitch; may be upper or lower neighbour. |
SUS |
Suspension |
Held over from the previous chord on a strong beat; resolves downward by step. |
ANT |
Anticipation |
A chord tone of the next harmony arrived early; falls on a weak beat before the chord changes. |
APP |
Appoggiatura |
Approached by leap, resolved by step; may fall on any beat. |
ECH |
Échappée |
Steps away from a chord tone then leaps away in the opposite direction. |
CAMB |
Cambiata |
Four-note figure: step down, skip down a third, step up. |
Analysis Panels
Voice-Leading Errors
Lists structural errors and warnings produced by the voice-leading checker.
The error count badges at the top of the Progression Analysis panel
mirror the same totals. Errors are flagged at the chord where they arrive
(e.g. a parallel-5th error between chords 3 and 4 is listed at chord 4).
| Error type |
Severity |
Rule |
| Range |
Error |
Note is outside the permitted range for that voice (S: C4–G5, A: G3–C5, T: C3–G4, B: E2–C4). |
| Spacing |
Error |
More than an octave between soprano–alto or alto–tenor. Tenor–bass may exceed an octave. |
| Voice crossing |
Error |
A voice moves below its neighbour voice in pitch order. |
| Voice overlap |
Error |
A voice moves past the previous position of an adjacent voice (not the same as crossing). |
| Parallel 5ths / octaves |
Error |
Two voices move in the same direction into a perfect 5th or octave when both voices are moving. |
| Hidden 5th / octave |
Warning |
Outer voices approach a perfect 5th or octave by similar motion with soprano leaping. |
| Large leap |
Warning |
A leap of a 6th in an upper voice, or a 7th in any voice. Leaps over an octave are errors. |
| Doubled leading tone |
Error |
The leading tone (7̂) appears in two voices simultaneously. |
| Doubled seventh |
Error |
The chordal 7th appears in two voices simultaneously. |
| Doubling (dim triad) |
Warning |
The 5th of a diminished triad is doubled; prefer doubling the 3rd. |
| Doubling (6/4) |
Warning |
In a second-inversion triad the bass note (5th of the chord) should be doubled. |
| Incomplete chord |
Warning |
A chord tone is missing from the voicing (5th may legitimately be omitted in V⁷→I). |
| Unresolved leading tone |
Error |
Leading tone does not resolve up by step to tonic in the same voice. |
| Unresolved chordal 7th |
Warning |
The chordal 7th does not resolve down by step in the same voice. |
Progression Analysis
Shows a row for each chord with its Roman numeral, chord name, inversion,
harmonic function badge, individual voice pitches, doubling notes,
tendency-tone resolution status, cadence detection, and any voice-leading
errors attached to that chord.
The key sanity warning (shown at the top) flags if fewer than half the chords
are diatonic — a possible sign that the key is set incorrectly.
When a modulation is present, a → Key divider row is inserted
in the panel immediately after the pivot chord (or before the first chord of
the new key when no pivot exists). The pivot chord's header shows both Roman
numerals, e.g. ii = iv, and a detail line names the keys:
Pivot chord: ii in G major = iv in E minor.
Secondary dominants show an Applied dominant — tonicises V note.
NCT rows list the detected type and voice for each non-chord tone column.
| Badge |
Function |
Typical chords |
| T |
Tonic |
I, i, I⁶, vi, VI, iii |
| PD |
Predominant |
IV, iv, ii, ii°, N⁶ |
| D |
Dominant |
V, V⁷, vii°, I⁶₄ (cadential) |
| 2° |
Secondary dominant |
V/V, V⁷/IV, V⁶₅/vi, etc. |
Keyboard Shortcuts
| ↑ / ↓ |
Navigate rows in the grid |
| ← / → |
Navigate columns (at start/end of cell) |
| Enter |
Move to the next row |
| Shift+↑ |
Raise focused note by one semitone |
| Shift+↓ |
Lower focused note by one semitone |
| Esc |
Close any open modal (Examples, Help) |
MIDI Keyboard Input
Click MIDI in the toolbar to request access to connected MIDI
devices. Once connected, any note played on the keyboard while a
S / A / T / B grid cell is focused will be entered
automatically, using the current key's accidental spelling preference.
Hot-plug is supported — devices connected after the page loads are picked up
automatically. If access is denied, check your browser's MIDI permission
settings.