PEG Grammar for Chord Notation
Recently I was looking for a grammar to catagorize music chords but was surprised that there weren’t any decent ones around.
The following is a PEG grammar which categorizes the most common cases for standard Jazz notation. There are a few missing edge cases (e.g. 7sus4).
I’m still unsure whether a full grammar is worthwhile due to the many edge cases. I’ve written a parser previously using parser combinators which was fairly straight-forward.
You can find an online peg parser generator here.
PolyChord = Chord ('|' Chord)?
Chord = Chord1 / Chord2 / Chord3 / Chord4
Chord1 = Note Special ChordUpper
Chord2 = Note ThirdSeventh Extended? ChordUpper
Chord3 = Note Third? Sixth ChordUpper
Chord4 = Note Third? Extended? ChordUpper
ChordUpper = Addition? Alterations? Slash?
ThirdSeventh = Augmented / Diminished
Augmented = 'aug' / '+'
Diminished = 'dim' / 'o' / 'ø'
Special = '5' / 'sus2' / 'sus4'
Sixth = '6' / '6/9'
Third = (MajorThird !Extended) / MinorThird
MajorThird = 'Maj' / 'M' / 'Δ'
MinorThird = 'min' / 'm' / '-'
Extended = ExtendedQuality? ExtendedInterval
ExtendedQuality = MajorThird / 'dom'
ExtendedInterval = '7' / '9' / '11' / '13'
Alterations = Alteration / AlterationList
AlterationList = '(' Alteration (',' Alteration)* ')'
Alteration = Accidental AlterationInterval
AlterationInterval = '4' / '5' / '9' / '11' / '13'
Addition = 'add' ('2' / '4' / '6')
Slash = '/' Note Accidental?
Note = [A-G] Accidental*
Accidental = [b#]