tidygraph graph of notes#
Mathematically, a graph is a set of nodes, and a set of pairs of the nodes defining where the edges are.
With the melody in a dataframe, a tidygraph object can be obtained. To convert it into a graph object that could be animated and laid out in the order the notes appear in the melody, I needed four things.
toandfromto define the edges, in text labelstfor what time the note plays for the animationthe note as number so the layout reflected the order of notes
# get melody dataframe
melody_df <- readRDS(url('https://github.com/softloud/digmus/raw/main/outputs/step-output/melody_df.rds'))
suppressMessages(library(tidyverse))
melody_graphable <- melody_df %>%
arrange(on) %>%
mutate(
from = note_name,
to = lead(note_name),
t = off
) %>%
dplyr::filter(!is.na(to)) %>%
select(from, to, t, note) %>%
# get start note
rbind(
melody_df %>%
mutate(
from = note_name,
to = note_name,
t = 0
) %>%
select(from, to, t, note) %>%
slice(1)
) %>%
# get end note
rbind(
melody_df %>%
mutate(
from = note_name,
to = note_name,
t = off
) %>%
select(from, to, t, note) %>%
slice(n())
) %>%
arrange(t)
# inspect
melody_graphable
| from | to | t | note |
|---|---|---|---|
| <chr> | <chr> | <dbl> | <dbl> |
| D | D | 0.0 | 62 |
| D | A | 1.2 | 62 |
| A | F | 2.4 | 69 |
| F | D | 3.6 | 65 |
| D | C# | 4.8 | 62 |
| C# | D | 6.0 | 61 |
| D | E | 6.6 | 62 |
| E | F | 7.2 | 64 |
| F | G | 8.7 | 65 |
| G | F | 9.0 | 67 |
| F | E | 9.3 | 65 |
| E | D | 9.6 | 64 |
| D | D | 10.2 | 62 |
# convert to graph object
suppressMessages(library(tidygraph))
melody_graphable %>%
arrange(note) %>%
as_tbl_graph()
# A tbl_graph: 6 nodes and 13 edges
#
# A directed multigraph with 1 component
#
# Node Data: 6 × 1 (active)
name
<chr>
1 C#
2 D
3 E
4 F
5 G
6 A
#
# Edge Data: 13 × 4
from to t note
<int> <int> <dbl> <dbl>
1 1 2 6 61
2 2 2 0 62
3 2 6 1.2 62
# ℹ 10 more rows