Jeg er i gang med at lære at spille klaver. I forbindelse med det, har jeg af og til brug for oversigter over akkorder. Jeg ved godt, at det er en god øvelse at konstruere dem selv, finde ud af andre positioner (udover grundpositionen) osv., men af og til er der andre aspekter af indlæringen, der lettes ved at have et ark med akkorder. Jeg søgte på (hele!) internettet, men uden at finde nogle gode akkordark.
Derfor måtte jeg lave nogle selv. Det gjorde jeg ved at lave en R
-pakke, pichor
.
I den kan man lave akkordark, arbejde med akkorder mm.
Pakkens hjemmeside findes på https://mikldk.github.io/pichor (med forskellige tutorials på https://mikldk.github.io/pichor/articles).
Kildekoden findes på https://github.com/mikldk/pichor.
Man kan installere pakken med R-kommandoen devtools::install_github('mikldk/pichor')
(når devtools
-pakken er installeret).
Nedenfor vil jeg vise et par eksempler.
Eksempler
Klaverdiagram
library(pichor)
Der medfølger indbygget data i keys_chords
med information om et udsnit af tangenterne på et klaver.
Disse kan eksempelvis bruges til at lave et klaverdiagram:
ggpiano(keys_chords)
Det er også muligt at fremhæve visse tangenter (og vise deres navne):
keys_chords_highlighted <- highlight_keys(keys_chords, keys = c(7, 10, 14))
ggpiano(keys_chords_highlighted, labels = TRUE)
Ovenstående er også muligt med magrittr
’s “rør”-operator (pipe), %>%
:
library(magrittr)
keys_chords %>%
highlight_keys(keys = c(7, 10, 14)) %>%
ggpiano(labels = TRUE)
Akkorder
Det er muligt at arbejde med akkorder, fx få tangenter, den højeste tone mm.:
chrd <- construct_chord_raw(root_tone = "F#", distances_rel = c(4, 3))
chrd
## F# chord with tones F#/Gb, A#/Bb, C#/Db
as.character(chrd, brief = TRUE)
## [1] "F#"
chrd_Fsm <- construct_chord_minor(root_tone = "F#")
chrd_Fsm
## F#m chord (minor) with tones F#/Gb, A, C#/Db
as.character(chrd_Fsm)
## [1] "F#m chord (minor) with tones F#/Gb, A, C#/Db"
as.character(chrd_Fsm, brief = TRUE)
## [1] "F#m"
get_keys(chord = chrd_Fsm)
## [1] 7 10 14
get_keys_highest_tone(chord = chrd_Fsm, highest_tone = "A")
## [1] 2 7 10
Og i stedet for at fremhæve tangenter direkte, kan akkorder fremhæves i klaverdiagrammer:
keys_coords %>%
highlight_chord(chord = chrd_Fsm) %>% # root form by default
ggpiano()
keys_coords %>%
highlight_chord(chord = chrd_Fsm, highest_tone = "A") %>%
ggpiano()
Det er også muligt at arbejde med positioner (inversions):
chrd_Bm <- construct_chord_minor(root_tone = "B")
get_keys(chord = chrd_Bm)
## [1] 12 15 19
get_keys_inversion(chord = chrd_Bm, inversion = 0)
## [1] 12 15 19
get_keys_inversion(chord = chrd_Bm, inversion = 1)
## [1] 3 7 12
get_keys_inversion(chord = chrd_Bm, inversion = 2)
## [1] 7 12 15
De kan også fremhæves i et diagram:
keys_coords %>%
highlight_chord(chord = chrd_Bm, inversion = 2L) %>%
ggpiano()
Akkordsekvens
Det er også muligt at arbejde med en akkordsekvens. Lad mig illustrere det med en version af Beatles “Let it be”, der indledningsvist har akkorderne G, D, Em, C, G, D, C.
chords <- list(construct_chord_major("G"),
construct_chord_major("D"),
construct_chord_minor("E"), # Em
construct_chord_major("C"),
construct_chord_major("G"),
construct_chord_major("D"),
construct_chord_major("C"))
chords
## [[1]]
## G chord (major) with tones G, B, D
##
## [[2]]
## D chord (major) with tones D, F#/Gb, A
##
## [[3]]
## Em chord (minor) with tones E, G, B
##
## [[4]]
## C chord (major) with tones C, E, G
##
## [[5]]
## G chord (major) with tones G, B, D
##
## [[6]]
## D chord (major) with tones D, F#/Gb, A
##
## [[7]]
## C chord (major) with tones C, E, G
chord_names <- sapply(chords, as.character, brief = TRUE)
key_seq <- lapply(chords, get_keys)
For at få flere muligheder i plot og datahåndtering, indlæses ggplot2
og dplyr
indledningsvist.
Man kan få informative titler på underfigurer ved at angive argumentet sequence_names
til highlight_key_sequence()
:
library(ggplot2)
library(dplyr)
keys_chords %>%
highlight_key_sequence(key_sequence = key_seq,
sequence_names = chord_names) %>%
ggpiano() +
facet_wrap(~ seq_name)
## NULL
Man kan for eksempel også inkludere seq_no
som en ny søjle, seq_lbl
, for at få den rette ordning:
keys_chords %>%
highlight_key_sequence(key_sequence = key_seq,
sequence_names = chord_names) %>%
mutate(seq_lbl = paste0(seq_name, " (#", seq_no, ")")) %>%
mutate(seq_lbl = forcats::fct_inorder(seq_lbl)) %>%
ggpiano() +
facet_wrap(~ seq_lbl)
## NULL
De bedste positioner
Der er pt. én naiv metode til at finde de mest optimale positioner. Det foregår helt simpelt ved at minimere antallet af tangenter, der flyttes mellem på hinanden følgende akkorder.
opt_res <- optim_min_dist_exhaustive(key_sequence = key_seq)
keys_chords %>%
highlight_key_sequence(key_sequence = opt_res$best,
sequence_names = chord_names) %>%
ggpiano() +
facet_wrap(~ seq_name) +
labs(title = "Best inversions")
## NULL
keys_chords %>%
highlight_key_sequence(key_sequence = opt_res$worst,
sequence_names = chord_names) %>%
ggpiano() +
facet_wrap(~ seq_name) +
labs(title = "Worst inversions")
## NULL