Nếu bạn thực sự muốn làm điều này:
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)
Lưu ý bạn sẽ cần phải làm install.packages("audio")
trước. Nếu bạn đã có một tệp cụ thể, trước tiên bạn cần chuyển đổi nó sang định dạng WAV.
Nếu bạn muốn thứ gì đó mang tính lập trình nhiều hơn một chút so với phát tệp WAV, thì đây là phiên bản tạo giai điệu từ một loạt các sóng sin:
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)
Có một số điểm cần lưu ý. Quãng tám mặc định cho các nốt là quãng 8, trong đó A4 ở tần số 440 Hz (nốt dùng để điều chỉnh dàn nhạc). Các quãng tám thay đổi ở C, vì vậy C3 cao hơn B2 một nửa cung. Lý do cho sự mờ dần make_sine
là do không có nó sẽ có âm thanh bật lên khi bắt đầu và dừng các nốt.