I am examining how chord progressions have changed in popular genres of music over time to see if there is a noticeable pattern between chord progressions and popularity. Examining this question allows for predictions of music popularity in the future. The genres I will be looking at are pop, country, and rock. These are three chord-heavy genres, and they’ve maintained mainstream popularity for a long time. Of the three genres, country and rock have sometimes been more niche, and I’m curious if their swings in popularity can be related to chord progression. Pop is a bit more fluid of a genre, and seeing its evolution over time gives a very strong sense of what style of pop was popular in a given time.

The data comes from Cornell University. It was collected by taking data from Ultimate Guitar. It took data from songs from the last several decades, and was compiled in 2024. I will examine the variables of genre, chord type, and chord similarity. Genre refers to what genre the song is (in this case either pop, country, or rock). Chord type is what kind of chord is used (major, minor, suspended, power, half-diminished, augmented, or diminished). Chord similarity is how similar chords are between genres, and it’s a numeric variable out of 1 (which is 100%).

library(readr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ purrr     1.0.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(viridis)
## Loading required package: viridisLite
library(ggthemes)
library(wordcloud)
## Loading required package: RColorBrewer
library(tidytext)
library(ggridges)

chordonomicon_v2 <- read_csv("chordonomicon_v2.csv")
## Rows: 679807 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (8): chords, release_date, genres, rock_genre, artist_id, main_genre, sp...
## dbl (2): id, decade
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# View(chordonomicon_v2)
chordonomicon_v2 |>
  filter(main_genre == c("pop", "rock", "country")) |>
  ggplot() +
  geom_bar(aes(x = main_genre), color = "black", fill = "darkgreen") +
  labs(title = "Pop, Rock, and Country Songs Released in the Modern Era", x = "Genre", y = "Count")
## Warning: There was 1 warning in `filter()`.
## ℹ In argument: `main_genre == c("pop", "rock", "country")`.
## Caused by warning in `main_genre == c("pop", "rock", "country")`:
## ! longer object length is not a multiple of shorter object length
This bar chart shows how many songs were released between 1950 and 2020 in the genres of Pop, Rock, and Country. The X axis displays the three aforementioned genres and the Y axis shows their counts, ranging from 0 to 30000.

Figure 1. The three most popular genres of the modern era, Pop, Country, and Rock, are shown in their counts. Data are based on collected data of song releases since 1950.

In the above graph, we see the numbers of Country, Pop, and Rock songs that have been released since 1950. Pop is the most prevalent, tallying around 29000 releases, whereas country is the least prevalent, only having roughly 18000. Rock is squarely in the middle, with around 23000 releases.

chordonomicon_v2 |>
  filter(main_genre == c("pop", "rock", "country")) |>
  ggplot() +
  geom_histogram(aes(x = decade, fill = main_genre)) +
  theme_bw() +
  labs(title = "Songs Released Each Decade", x = "Decade", y = "Count")
## Warning: There was 1 warning in `filter()`.
## ℹ In argument: `main_genre == c("pop", "rock", "country")`.
## Caused by warning in `main_genre == c("pop", "rock", "country")`:
## ! longer object length is not a multiple of shorter object length
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 10237 rows containing non-finite outside the scale range
## (`stat_bin()`).
This histogram shows the relationship between the genres of Pop, Country, and Rock in how many of them were released each decade from 1950 to 2020. The X axis displays the decade, ranging from 1900 to 2020, and the Y axis shows the count, ranging from 0 to 25000. The bars are colored to represent each genre, and a key on the right assigns each genre a color. As time goes on, we can see Pop slowly becoming the predominant genre, where before it was Rock. Country has a surge between 1980 and 2010, but it stays low outside of those years.

Figure 2. Song releases by Decade are shown, divided by genre. From this graph, we can discern the most popular genre of each era. Data are collected through online music databases.

In the above graph, we see the trends of song releases by decade. Between 1950 and 1980, Rock is the most popular, but as more music is released starting in the early 21st centure, pop becomes the primary genre. Country gains popularity between 1980 and 2010, but it isn’t a large part of the release diet any other year. Notably, the amount of music released falls off drastically after 2010, likely due to the 2020s still being in progress.

[^1] CHORDONOMICON: A Dataset of 666,000 Songs and their Chord Progressions, Spyridon Kantarelis and Konstantinos Thomas and Vassilis Lyberatos and Edmund Dervakos and Giorgos Stamou, 2024, 2410.22046,arXiv, cs.SD, https://arxiv.org/abs/2410.22046 [^2] ChordFormer: A Conformer-Based Architecture for Large-Vocabulary Audio Chord Recognition, Muhammad Waseem Akram and Stefano Dettori and Valentina Colla and Giorgio Carlo Buttazzo, 2025, 2502.11840, arXiv, cs.SD, https://arxiv.org/abs/2502.11840

#chordonomicon_v2 |>
  #filter(main_genre == c("pop", "rock", "country")) |>
 # ggplot() +
 # geom_point(aes(x = chords, fill = main_genre)) +
  #theme_bw()