← All Stories
JMOVE·April 10, 2026Apr 10, 2026·15 min read

1,511 Jazz Standards in Your Browser

How an obfuscated URL format, a 43-rule chord parser, and an underground fake book tradition became a one-click standards library with real backing tracks

In 1975, two students at the Berklee College of Music compiled a collection of jazz lead sheets and published it as an underground volume with a plain cover. No publisher. No licensing deals with ASCAP or the estates of Cole Porter and George Gershwin. Just melodies and chord changes for the tunes every jazz musician was expected to know, typed out and photocopied, passed hand to hand through the jazz community like samizdat. They called it the Real Book, a wry nod to the "fake books" that Broadway pit musicians had been using since the 1940s. The original fakes were literally faking it - unlicensed compilations of popular songs. The Real Book was the genuine article, or at least the most genuine version of an inherently unauthorized tradition.

The Real Book was technically illegal for its first two decades. The compilers never cleared rights. But it filled a need so perfectly that the jazz world adopted it anyway. Before the Real Book, learning standards meant buying individual sheet music from Hal Leonard or Alfred, transcribing from records by ear, or sitting in a practice room with an older musician who had the changes memorized. The Real Book put the entire common vocabulary of jazz into a single portable volume for under twenty dollars. By the time Hal Leonard published a legal sixth edition in 2004, the Real Book had already changed how jazz was taught and played on every continent where the music existed.

I think about the Real Book constantly when I work on JMove. The impulse behind it - making the shared language of jazz freely available to anyone who wants to learn - is the same impulse behind bundling 1,511 standards directly into the app. No account required. No subscription. No internet connection. You open JMove, you type "Stella" into the search bar, and the full chord changes to Stella by Starlight appear on your screen, ready to study, ready to practice with a generated rhythm section, ready to transpose to whatever key your voice or your horn demands. The database contains 52,333 measures and 73,241 individual chord slots. Every standard is one click away from a living, breathing backing track.

The Weight of a Tune

Every standard in that library carries decades of conversation. Body and Soul was written by Johnny Green in 1930, and it became the definitive test of a jazz musician's harmonic sophistication. The bridge modulates from D-flat major to D major - a half-step key change that was audacious for its time - then winds through a sequence of ii-V progressions before landing back in the original key. Coleman Hawkins recorded a solo on it in 1939 that essentially invented modern jazz tenor saxophone. He ignored the melody almost entirely and improvised over the harmony, treating the chord changes as the composition itself. When you load Body and Soul in JMove, you're not loading a chord chart. You're loading ninety-six years of musical argument about what a chord progression can mean.

Giant Steps, written by John Coltrane in 1959, divided the octave into three equal parts using major third intervals. The progression cycles through key centers separated by four semitones - Eb, G, B - moving so rapidly that conventional bebop vocabulary collapses. Tommy Flanagan, one of the finest pianists of his generation, famously stumbled during his solo on the original recording. The harmony was that new. Today Giant Steps is a rite of passage: every jazz student eventually sits down with those changes and confronts the same symmetrical geometry that Coltrane heard. In the database, it sits as thirty-two measures in Eb, tagged "Up Tempo Swing," composer "Coltrane John" - the same data format as A Foggy Day or Fly Me to the Moon, as if a revolution in harmonic thought were no more remarkable than a show tune. That's the democracy of the format.

All The Things You Are, composed by Jerome Kern with lyrics by Oscar Hammerstein II in 1939, is often the first standard a jazz student learns because its harmony moves through the circle of fourths so logically. But that logic is deceptive. The tune modulates three times in thirty-two bars: from Ab major to C major to Eb major and back to Ab. The bridge opens on G major - a tritone away from the home key - and navigates back through a sequence of ii-V resolutions that tests your ears and your theory equally. Charlie Parker loved this tune. So did Bill Evans. So did Keith Jarrett. The reason is structural: it rewards you at every level of understanding. A beginner can follow the root motion. A master finds new voice-leading possibilities after fifty years.

561 Composers, 18 Styles, and the Key of F

The database spans 561 unique composers, from the expected - Coltrane, Monk, Shorter, Jobim, Ellington - to the surprising. Thad Jones's A Child Is Born sits alongside Tom Jobim's A Felicidade. Thelonious Monk's 52nd Street Theme neighbors Chick Corea's 500 Miles High. There are standards from Broadway, bossa nova, bebop, post-bop, fusion, and free jazz. The eighteen style tags range from "Up Tempo Swing" to "Bossa Nova" to "Even 8ths" to "Waltz" to "Funk." Every standard carries its original style designation, so when you load a tune, the practice engine can auto-detect an appropriate groove and tempo without you having to configure anything.

The key distribution tells its own story about the history of jazz composition. F major dominates with 260 standards - it sits comfortably on every instrument, favoring the natural range of tenor saxophone and trumpet, the two most iconic jazz voices. C major follows with 245, then Eb with 226 (the home key of alto saxophone and many brass instruments), then Bb with 178 (the concert key that transposing instruments see as C). The bias toward flat keys reveals the music's origins in the horn-driven ensembles of New Orleans and Kansas City. Sharp keys are rarer: there are only 41 standards in F minor, 43 in D minor, 45 in Db major. The database is a demographic portrait of which instruments won the argument about what key to play in.

The iReal Pro Encoding Problem

The 1,511 standards in JMove's database originate from the iReal Pro ecosystem - the app that became the digital Real Book. iReal Pro stores chord charts in a proprietary URI format that begins with the protocol prefix irealb:// and encodes every song as a percent-encoded, deliberately obfuscated string. The obfuscation isn't encryption - it's a character-swap scramble designed to make casual inspection difficult without making the format cryptographically secure. Understanding that format, and building a reliable pipeline from obfuscated URI to rendered chord chart, is the engineering foundation that makes the standards browser possible.

The URI format works in layers. The outer layer is percent-encoding - standard URL encoding where special characters become %HH hex sequences. Peel that off with decodeURIComponent and you get a string of songs separated by triple equals signs (===). Each song is a pipe-delimited record of metadata fields - title, composer, style, key, transpose, music data, comping style, BPM, repeats. The music data itself is scrambled using a character-position swap algorithm: the string is broken into fifty-character segments, and each segment undergoes a specific permutation where the first five characters swap with the last five, and characters at positions 10 through 24 swap with their mirrors at positions 25 through 39. The final segment passes through unmodified.

iReal Pro URI structure:

irealb://[percent-encoded payload]

After decoding:
  Song1===Song2===Song3===PlaylistName

Each song (split on = separators):
  Title = Composer = Style = Key = MusicData = BPM

Obfuscation: 50-char segment swap
  Positions 0-4  <-> Positions 45-49
  Positions 10-24 <-> Positions 25-39
  Last segment (< 50 chars): pass through unchanged

Parsing the Cell Format

Once the music data is unscrambled, what emerges is a cell-based chart language - a compact notation system where every character or token has a specific meaning. Bar lines are represented by the pipe character |. Section markers are asterisks followed by a letter (*A, *B). Time signatures are the letter T followed by digits (T44 for 4/4, T34 for 3/4). Repeat signs use curly braces. The token XyQ means empty space. The letter n means no chord. The letter x means "repeat previous measure." And chords are expressed in iReal's own shorthand: C^7 for Cmaj7, D-7 for Dm7, Bh7 for Bm7b5 (half-diminished), Bo7 for Bdim7.

The parser processes this character stream using a rule-based tokenizer - an ordered list of token patterns, each with an optional operation function. The parser walks the string from left to right, testing each rule in priority order until one matches the beginning of the remaining input. When a rule matches, its operation function fires (creating a measure, pushing a chord, setting a repeat location), the matched characters are consumed, and the parser recurses on the remainder. If no rule matches, the parser discards one character and tries again - a graceful degradation that handles unknown formatting without crashing.

javascript
// Parser rules - ordered by priority, tested left-to-right
const rules = [
  { token: 'XyQ',    desc: 'Empty space' },
  { token: /\*\w/,   desc: 'Section marker (*A, *B, *C)' },
  { token: /T(\d+)/, desc: 'Time signature',     op: setTimeSignature },
  { token: 'x',      desc: 'Repeat prev measure', op: repeatLastMeasure },
  { token: 'n',      desc: 'No Chord (N.C.)',     op: pushNull },
  { token: '{',      desc: 'Start repeat',        op: setStartRepeatLocation },
  { token: '}',      desc: 'End repeat',          op: repeatToEndLocation },
  { token: '|',      desc: 'Bar line',            op: createNewMeasure },
  { token: '[',      desc: 'Double bar start',    op: createNewMeasure },
  { token: ']',      desc: 'Double bar end' },
  { token: /N(\d)/,  desc: 'Numbered ending',     op: setEndRepeatLocation },
  { token: 'Z',      desc: 'Final bar line' },
  // Last rule: chord regex - A-G root, quality modifiers, optional /bass
  { token: /[A-GW][+\-^\dhob#suadlt]*(\/[A-G][#b]?)?/,
    desc: 'Chord symbol', op: pushChordInMeasures }
];

// The chord regex covers everything from a bare C triad
// to Db7#9b13/Ab - the entire iReal harmonic namespace.

43 Quality Mappings

iReal Pro's chord notation uses its own symbols - the caret ^ for major, the dash - for minor, h for half-diminished, o for diminished. These are compact and efficient for a mobile screen but meaningless to a music theory engine that needs to know interval content. JMove's import layer contains a QUALITY_MAP - a table of 43 regular expression patterns, tested in priority order from most specific to least, that translates every iReal quality modifier into a standardized chord quality string.

Order matters critically. The pattern for ^7#11 must be tested before ^7, or else Cmaj7#11 would be misidentified as Cmaj7 with leftover characters. The pattern for -^7 (minor-major seventh) must be tested before -7 (minor seventh) or before - (minor triad). Each pattern is a regular expression anchored to the start of the modifier string, and the first match wins. This longest-match-first approach is the same strategy that lexer generators have used since the 1970s - it's not clever, it's correct.

javascript
// QUALITY_MAP - 43 patterns, longest-first priority
const QUALITY_MAP = [
  // Major family
  [/^\^7#11$/,  "maj7#11"],    // Lydian chord
  [/^\^7#5$/,   "maj7#5"],     // Lydian augmented
  [/^\^13$/,    "maj13"],
  [/^\^9$/,     "maj9"],
  [/^\^7$/,     "maj7"],       // most common major
  [/^\^$/,      "maj7"],       // bare caret = maj7
  // Minor family
  [/^-\^7$/,    "m(maj7)"],    // melodic minor tonic
  [/^-11$/,     "m11"],        // dorian color
  [/^-9$/,      "m9"],
  [/^-7$/,      "m7"],         // most common minor
  [/^-6$/,      "m6"],
  [/^-$/,       "m"],          // bare dash = minor triad
  // Half-dim / diminished
  [/^h7$/,      "m7b5"],       // half-diminished
  [/^h$/,       "m7b5"],
  [/^o7$/,      "dim7"],       // fully diminished
  [/^o$/,       "dim"],
  // Dominant family (20+ entries): 7, 9, 13, 7b9, 7#9, 7alt,
  //   7b9b13, 7#9b13, 7b9#11, 7#9#11, 7b13, 7#11, 7#5, 7b5,
  //   13sus, 9sus, 7sus4, 7sus ...
  // Augmented, suspended, add chords ...
];

// "C^7#11" -> modifier "^7#11" -> hits line 1 -> "maj7#11"
// "C^7"    -> modifier "^7"    -> skips line 1 -> "maj7"
// "D-7"    -> modifier "-7"    -> "m7"
// "Bh7"    -> modifier "h7"    -> "m7b5"

Downstream from the quality mapping sits the interval table - the engine that converts a root note and a quality string into actual pitches. The voicing engine contains a 33-entry INTERVALS map for generating MIDI output, while the theory engine maintains a 51-entry version with richer annotations. Every quality maps to a list of semitone offsets from the root. The entry for "m7" is [0, 3, 7, 10] - root, minor third, perfect fifth, minor seventh. The entry for "7alt" is [0, 4, 6, 10, 13, 20] - root, major third, flat fifth, minor seventh, flat ninth, flat thirteenth. The entry for "maj7#11" is [0, 4, 7, 11, 18] - the Lydian chord that Pat Metheny built half a career on.

The theory engine's interval table is annotated with comments that read like a jazz history syllabus. The maj7#11 entry says "Lydian chord (Metheny)." The m11 entry says "Dorian color (Jaco)." The 7#9 entry says "Hendrix chord." The m(maj7) entry says "melodic minor tonic (Holdsworth)." These aren't decorative - they document the musical lineage of each chord quality, connecting the abstract interval set to the musicians who defined its sound.

From Parse to Playback

The full import pipeline has five stages. First, the iReal URI is percent-decoded and split into individual song records. Second, the music data is unscrambled through the fifty-character segment swap. Third, the rule-based parser tokenizes the unscrambled string into measures, each containing raw chord strings in iReal notation. Fourth, each chord string passes through parseIrealChord, which extracts the root (letter A-G plus optional sharp or flat), runs the modifier through the 43-entry QUALITY_MAP, and splits off any slash-chord bass note. Fifth, the parsed chords are assembled into a QuantizedScore - JMove's internal representation, which includes time-stamped measures, MIDI-pitched chord voicings, key signature, time signature, and tempo.

The voicing step deserves attention. iReal Pro is a chord-only format - it has no melody data, no note durations, no dynamics. The import layer generates pitched voicings by routing each chord through chordToMidi, which looks up the root's semitone offset (C=0, Db=1, D=2, ..., B=11), retrieves the interval set for the quality, and builds a close-position piano voicing in octave 4 (middle C = MIDI 60). For slash chords, the bass note is voiced in octave 3 (MIDI 48 + offset) and prepended to the pitch array. The result is a playable, audible chord that the practice engine can render through any of its instrument voices.

Time is distributed evenly within each measure. A measure with one chord gets a whole note. A measure with two chords (the classic ii-V, like Dm7 | G7 squeezed into one bar) gets two half notes. A measure with four chords (rhythm changes: Bb^7 G7 C-7 F7) gets four quarter notes. The parser doesn't try to infer rhythmic placement from the chord density - it distributes evenly and lets the practice engine's comping algorithm add the rhythmic sophistication.

The Standards Browser

The 1,511 standards live in a single JSON file - jazzStandards.json - that ships with the app as a static asset. Each entry contains the title, composer (last name first, as is convention in music libraries), style tag, key, BPM, time signature, and a complete array of measures with their chord symbols still in iReal notation. The file is 748 kilobytes. It fits in a browser cache. It works offline. It requires no API call, no server round-trip, no authentication. The entire jazz canon sits in memory the moment the page loads.

The browse interface offers two axes of discovery: free-text search and style filtering. The search field matches against title and composer simultaneously - type "monk" and you get Thelonious Monk's compositions (52nd Street Theme, Blue Monk, Evidence, Misterioso, Round Midnight) plus songs by other composers with "monk" in the title. Type "shorter" and Wayne Shorter's entire compositional output unfolds, from Footprints to Speak No Evil to Nefertiti, each one a masterclass in harmonic ambiguity.

The filtering is instant because there's no network request to wait for. The useMemo hook computes the filtered list by walking all 1,511 entries and applying the search predicate and style filter. At that size, the filtering completes in under a millisecond. The list renders the first 100 matches - a pagination guardrail that prevents the DOM from bogging down - and shows a "refine your search" message if there are more. Each entry displays the title, composer, style, and key. One click loads the standard, runs it through the iReal-to-score pipeline, and drops it into the workspace. The entire journey from "I want to practice Autumn Leaves" to hearing the first chord takes about two seconds.

Beyond iReal: MusicXML and MIDI

The standards database handles the common case - the tune you already know by name. But musicians' chord charts live in many formats. Your lead sheets might be in iReal Pro. Your arrangements might be in MuseScore or Sibelius. Your transcriptions might be MIDI files from a DAW. JMove's import offers four tabs: the standards browser, iReal Pro URL paste, MusicXML file upload, and MIDI file upload. Each tab feeds a different parser, but all four converge on the same QuantizedScore representation.

The MusicXML parser uses the browser's native DOMParser (zero additional dependencies) to walk the XML tree and extract notes with their MIDI pitch values, durations, and timing. The parser converts MusicXML pitch notation (step C, alter -1, octave 4) into MIDI note numbers using a simple formula: (octave + 1) * 12 + stepSemitone + alter. It handles ties by merging consecutive tied notes into a single sustained duration, dots by extending note length by half, and chord symbols by extracting the harmony elements that MuseScore and Sibelius embed in the XML.

MIDI import has a special trick: it detects JMove's own MIDI exports. When JMove exports a session as MIDI, it embeds the full session configuration - style, form, key, chord progression, tempo, time signature, sections - as metadata in the MIDI file. The import parser recognizes this fingerprint and offers to restore the complete jam session, not just the raw note data. Generic MIDI files get chord detection from the note clusters. JMove MIDI files get full-fidelity session restoration.

52 Qualities of Harmony

The engine's master quality list enumerates 52 distinct chord qualities that the system can parse, voice, and reason about. The major family has nine members: major triad, maj7, maj9, maj11, maj13, maj7#11 (Lydian), maj9#11, maj13#11, maj7#5 (Lydian augmented), and maj7b5. The minor family has ten: minor triad, m7, m9, m11, m13, m6, m6/9 (the Dorian tonic voicing), m(maj7) (melodic minor), m(maj9), and m7b5 (half-diminished, also called Locrian).

The dominant family is the largest and the wildest, with twenty members. The basic dominant seventh opens the door. Then the extensions: 9, 11, 13. Then the alterations: 7#9 (the Hendrix chord), 7b9, 7#5, 7b5, 7#11 (Lydian dominant), 7b13. Then the compound alterations: 7#9#5, 7#9b5, 7b9#5, 7b9b5. Then 7alt - shorthand for the altered scale sound, which the engine voices as [0, 4, 6, 10, 13, 20], incorporating the flat fifth, flat ninth, and flat thirteenth in a single dense cluster. Then the suspended dominants: 7sus4, 7sus2, 9sus4, 13sus4. The last of those - the thirteenth suspended fourth - is the sound of Weather Report, of Jaco Pastorius's "Teen Town," of the open, floating harmony that defined fusion in the late 1970s.

What the Data Reveals

Run analytics across 73,241 chord slots and you start seeing the grammar of jazz itself. The most common chord symbol in the entire database is C7 - the dominant seventh being the most fundamental harmonic engine in the music. G minor seventh appears next. Bb7 follows. These are the sounds of ii-V-I progressions in every key, the bread and butter of tonal jazz harmony, repeated across thousands of compositions spanning a century.

The database contains 1,094 unique chord symbols in iReal notation. That's more than the 52 quality types because it accounts for every combination of root and quality and slash bass that appears in the repertoire. Ebmaj7, Ab7#11, F#m7b5/E, Dbdim7 - each is a distinct symbol that the parser must handle. The 43-entry QUALITY_MAP in the import layer and the 52-entry QUALITIES list in the engine cover all of them, with the parser's fallback behavior (pass through unrecognized modifiers as-is) providing a safety net for edge cases.

Take Five by Paul Desmond sits in the database tagged as "Medium Up Swing" in Eb minor with a time signature of 54 - the only standard in 5/4 time in the collection. The parser handles it identically to 4/4 or 3/4: the time signature is extracted from the iReal T token, the beat count per measure adjusts the measure duration, and the voicing engine distributes chords evenly across five beats instead of four. No special-casing. The same code that processes Autumn Leaves in 4/4 processes Take Five in 5/4. That's what a good abstraction looks like.

Handling the Edge Cases

Real-world chart data is messy. iReal Pro charts are user-contributed, and different users notate the same tune differently. Some write Dm7-G7 as two chords in one measure. Others split them across two measures. Some use Bh7 for half-diminished; others use Bm7b5 directly. The parser handles all of these through the rule system and the quality map, and it degrades gracefully: if a chord modifier doesn't match any of the 43 patterns, it passes through as-is rather than throwing an error, so the chart still renders even if one exotic chord symbol doesn't get translated perfectly.

Repeat structures add complexity. Jazz charts use first and second endings, D.C. al Coda, D.S. al Coda, and segno markers. The parser tracks repeat locations, numbered endings, coda positions, and segno positions using state variables that get updated as the parser walks through the chart. When it hits an end repeat marker, it copies measures from the start repeat location. The resulting measure array is a fully "unrolled" representation of the chart - no repeat signs, no jumps, just the linear sequence of measures as they would be played in performance.

The key parsing has its own subtlety. In iReal notation, minor keys are indicated with a trailing dash: A- means A minor, not A-something. The parser converts this to JMove's convention: A- becomes Am. Major keys pass through unchanged. This is a small detail, but it matters - if the key is wrong, the entire downstream analysis (Roman numeral analysis, diatonic chord detection, key-based suggestions) produces incorrect results. The key is the frame around every harmonic picture.

A Library, Not a Product

I think of the standards database the way I think of a public library. The compositions don't belong to JMove - they belong to the composers who wrote them and the musicians who've spent decades interpreting them. JMove's job is to make them accessible, organized, and free, so you can spend your time on the part that matters: playing. The 43-rule parser, the 52-quality mapping table, the five-stage import pipeline - these are infrastructure. They're the shelving system, the card catalog, the reading room. The music is in the scores themselves.

The original Real Book was an act of love disguised as an act of piracy. Its compilers believed that the music belonged to everyone who wanted to play it, that access shouldn't be gated by the cost of individual sheet music, that the shared vocabulary of jazz was too important to lock behind a paywall. Whether they were right about the legality is a question for lawyers. That they were right about the impulse - the democratizing, equalizing, barrier-removing impulse - is beyond dispute. Every jazz musician alive today learned from some version of those photocopied pages.

JMove's standards browser is the same impulse, running on better technology. One thousand five hundred and eleven tunes. Fifty-two chord qualities. Forty-three parsing rules. Eighteen styles. Zero dollars. Zero friction. The entire tradition, in your browser, waiting for you to play.

Read the full story of why JMove was built
Browse the Standards