web-tuner/chords.go

139 lines
3.6 KiB
Go

package main
import "strings"
type ChordCategory map[string][]int
func GetChordDefinitions() map[string]ChordCategory {
return map[string]ChordCategory{
"triads": {
"major": {0, 4, 7},
"minor": {0, 3, 7},
"dim": {0, 3, 6},
"aug": {0, 4, 8},
"sus2": {0, 2, 7},
"sus4": {0, 5, 7},
"5": {0, 7},
},
"sixths": {
"6": {0, 4, 7, 9},
"m6": {0, 3, 7, 9},
"6/9": {0, 2, 4, 7, 9},
"m6/9": {0, 2, 3, 7, 9},
"b6": {0, 4, 7, 8},
"mb6": {0, 3, 7, 8},
"b6/9": {0, 2, 4, 7, 8},
},
"sevenths": {
"maj7": {0, 4, 7, 11},
"7": {0, 4, 7, 10},
"m7": {0, 3, 7, 10},
"mmaj7": {0, 3, 7, 11},
"dim7": {0, 3, 6, 9},
"m7b5": {0, 3, 6, 10},
"aug7": {0, 4, 8, 10},
"augmaj7": {0, 4, 8, 11},
"7sus4": {0, 5, 7, 10},
"7sus2": {0, 2, 7, 10},
"7b5": {0, 4, 6, 10},
"maj7b5": {0, 4, 6, 11},
"maj7sus2": {0, 2, 7, 11},
"maj7sus4": {0, 5, 7, 11},
},
"ninths": {
"9": {0, 2, 4, 7, 10},
"maj9": {0, 2, 4, 7, 11},
"m9": {0, 2, 3, 7, 10},
"mmaj9": {0, 2, 3, 7, 11},
"7b9": {0, 1, 4, 7, 10},
"7#9": {0, 3, 4, 7, 10},
"add9": {0, 2, 4, 7},
"madd9": {0, 2, 3, 7},
"9sus4": {0, 2, 5, 7, 10},
"9b5": {0, 2, 4, 6, 10},
"7b9b5": {0, 1, 4, 6, 10},
"7#9b5": {0, 3, 4, 6, 10},
"7b9#5": {0, 1, 4, 8, 10},
"7#9#5": {0, 3, 4, 8, 10},
},
"elevenths": {
"11": {0, 2, 4, 5, 7, 10},
"maj11": {0, 2, 4, 5, 7, 11},
"m11": {0, 2, 3, 5, 7, 10},
"7#11": {0, 4, 6, 7, 10},
"maj7#11": {0, 4, 6, 7, 11},
"add11": {0, 4, 5, 7},
"madd11": {0, 3, 5, 7},
},
"thirteenths": {
"13": {0, 2, 4, 7, 9, 10},
"maj13": {0, 2, 4, 7, 9, 11},
"m13": {0, 2, 3, 7, 9, 10},
"7b13": {0, 4, 7, 8, 10},
},
}
}
func GetChordAliases() map[string]string {
return map[string]string{
"maj": "major", "M": "major",
"min": "minor", "m": "minor", "-": "minor",
"diminished": "dim", "\u00b0": "dim",
"augmented": "aug", "+": "aug",
"power": "5",
"major6": "6", "maj6": "6",
"minor6": "m6", "min6": "m6", "-6": "m6",
"6_9": "6/9",
"flat6": "b6",
"mflat6": "mb6", "minb6": "mb6", "-b6": "mb6",
"flat6/9": "b6/9",
"major7": "maj7", "M7": "maj7", "\u03947": "maj7", "\u0394": "maj7",
"dom7": "7", "dominant7": "7", "dominant": "7",
"min7": "m7", "minor7": "m7", "-7": "m7",
"m(maj7)": "mmaj7", "min(maj7)": "mmaj7", "mM7": "mmaj7",
"minmaj7": "mmaj7", "-M7": "mmaj7", "minor-major7": "mmaj7",
"\u00b07": "dim7", "diminished7": "dim7",
"\u00f8": "m7b5", "\u00f87": "m7b5", "half-dim": "m7b5",
"half-dim7": "m7b5", "halfdim": "m7b5", "halfdim7": "m7b5",
"+7": "aug7", "augmented7": "aug7",
"+M7": "augmaj7", "+maj7": "augmaj7",
"maj7#5": "augmaj7", "M7#5": "augmaj7",
"7sus": "7sus4",
"majmin7": "7",
"dom9": "9", "dominant9": "9",
"min9": "m9", "minor9": "m9", "-9": "m9",
"m(maj9)": "mmaj9", "mM9": "mmaj9", "minmaj9": "mmaj9",
"7flat9": "7b9",
"7sharp9": "7#9",
"add2": "add9",
"madd2": "madd9", "minadd9": "madd9",
"dom11": "11", "dominant11": "11",
"min11": "m11", "minor11": "m11", "-11": "m11",
"add4": "add11",
"madd4": "madd11",
"dom13": "13", "dominant13": "13",
"min13": "m13", "minor13": "m13", "-13": "m13",
"7flat13": "7b13",
}
}
func ResolveChordName(name string) string {
name = strings.TrimSpace(name)
aliases := GetChordAliases()
if canonical, ok := aliases[name]; ok {
return canonical
}
lower := strings.ToLower(name)
for alias, canonical := range aliases {
if strings.ToLower(alias) == lower {
return canonical
}
}
return name
}