Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I play birthday music using R? [closed]

Tags:

r

I would like to play music using R. While R may not be the best tool for this purpose, it is the tool that I am familiar with and it would be nice to demonstrate to others its flexibility on such a joyous occasion.

How could I accomplish this?

like image 243
Feng Tian Avatar asked Aug 03 '15 08:08

Feng Tian


People also ask

How do you play Happy Birthday on the keyboard?

To play "Happy Birthday" on your phone, press 112163 112196 11#9632 969363.

How to post Happy Birthday song on Facebook?

Once their photos or videos are captured, users can add birthday songs to their Facebook Stories by selecting the “Music” sticker. Once that's done, they can simply search “birthday” for a list of celebratory songs. A sticker featuring the artist and song will then appear on the video.


1 Answers

If you really wanted to do this:

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) 

Note you'll need to install.packages("audio") first. If you already have a specific file, you'll need to convert it to WAV format first.

If you wanted something a bit more programmery than playing a WAV file, here's a version that generates the tune from a series of sine waves:

library("dplyr") library("audio") notes <- c(A = 0, B = 2, C = 3, D = 5, E = 7, F = 8, G = 10) pitch <- "D D E D G F# D D E D A G D D D5 B G F# E C5 C5 B G A G" 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 = substring(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) 

There's a few points to note. The default octave for the notes is octave 4, where A4 is at 440 Hz (the note used to tune the orchestra). Octaves change over at C, so C3 is one semitone higher than B2. The reason for the fade in make_sine is that without it there are audible pops when starting and stopping notes.

like image 98
Nick Kennedy Avatar answered Oct 24 '22 15:10

Nick Kennedy