Comment puis-je jouer de la musique d’anniversaire en utilisant R?

Je voudrais jouer de la musique en utilisant R. Bien que R ne soit peut-être pas le meilleur outil à cet effet, c’est l’outil que je connais et il serait bien de montrer aux autres sa flexibilité dans une occasion si joyeuse.

Comment pourrais-je accomplir cela?

Si tu voulais vraiment faire ça:

 library("audio") bday_file < - tempfile() download.file("http://www.happybirthdaymusic.info/01_happy_birthday_song.wav", bday_file, mode = "wb") bday <- load.wave(bday_file) play(bday) 

Notez que vous devez d'abord install.packages("audio") . Si vous avez déjà un fichier spécifique, vous devez d'abord le convertir au format WAV.

Si vous vouliez quelque chose d'un peu plus programmé que la lecture d'un fichier WAV, voici une version qui génère le morceau à partir d'une série d'ondes sinusoïdales:

 library("dplyr") library("audio") notes < - c(A = 0, B = 2, C = 3, D = 5, E = 7, F = 8, G = 10) pitch <- "DDEDGF# DDEDAGDD D5 BGF# E C5 C5 BGAG" duration <- c(rep(c(0.75, 0.25, 1, 1, 1, 2), 2), 0.75, 0.25, 1, 1, 1, 1, 1, 0.75, 0.25, 1, 1, 1, 2) bday <- data_frame(pitch = strsplit(pitch, " ")[[1]], duration = duration) bday <- bday %>% mutate(octave = subssortingng(pitch, nchar(pitch)) %>% {suppressWarnings(as.numeric(.))} %>% ifelse(is.na(.), 4, .), note = notes[substr(pitch, 1, 1)], note = note + grepl("#", pitch) - grepl("b", pitch) + octave * 12 + 12 * (note < 3), freq = 2 ^ ((note - 60) / 12) * 440) tempo <- 120 sample_rate <- 44100 make_sine <- function(freq, duration) { wave <- sin(seq(0, duration / tempo * 60, 1 / sample_rate) * freq * 2 * pi) fade <- seq(0, 1, 50 / sample_rate) wave * c(fade, rep(1, length(wave) - 2 * length(fade)), rev(fade)) } bday_wave <- mapply(make_sine, bday$freq, bday$duration) %>% do.call("c", .) play(bday_wave) 

Il y a quelques points à noter. L'octave par défaut pour les notes est l'octave 4, où A4 est à 440 Hz (la note utilisée pour accorder l'orchestre). Les octaves changent à C, donc C3 est un demi-ton plus haut que B2. La raison du fondu dans make_sine est que sans elle, il y a des sons audibles lors du démarrage et de l’arrêt des notes.