首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用R播放生日音乐?

如何使用R播放生日音乐?
EN

Stack Overflow用户
提问于 2015-08-03 16:22:03
回答 1查看 16.2K关注 0票数 81

我想使用R播放音乐,虽然R可能不是实现此目的的最佳工具,但它是我熟悉的工具,在这样一个快乐的场合向其他人展示它的灵活性将是一件很好的事情。

我怎么才能做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-03 16:46:50

如果你真的想这样做:

代码语言:javascript
复制
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)

请注意,您需要首先执行install.packages("audio")。如果你已经有一个特定的文件,你需要先把它转换成WAV格式。

如果你想要比播放WAV文件更有编程意味的东西,这里有一个可以从一系列正弦波生成曲子的版本:

代码语言:javascript
复制
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)

有几点需要注意。音符的默认八度是八度4,其中A4为440 Hz (用于调整管弦乐队的音符)。八度在C上变化,所以C3比B2高一个半音。make_sine中淡入淡出的原因是,如果没有它,在开始和停止注释时会有声音爆裂。

票数 241
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31782580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档