Klaverakkorder i R med R-pakken 'pichor'

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 tutorialshttps://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

Avatar
Mikkel Meyer Andersen
Lektor i anvendt statistik

Mine forskningsinteresser er bl.a. indenfor anvendt statistik og beregningsbaseret statistik.

Relaterede