R을 사용하여 음악을 재생하고 싶습니다. R이이 목적에 가장 적합한 도구는 아니지만, 제가 익숙한 도구이며, 이러한 즐거운 기회에 다른 사람들에게 유연성을 보여 주면 좋을 것입니다.
이것을 어떻게 할 수 있습니까?
R을 사용하여 음악을 재생하고 싶습니다. R이이 목적에 가장 적합한 도구는 아니지만, 제가 익숙한 도구이며, 이러한 즐거운 기회에 다른 사람들에게 유연성을 보여 주면 좋을 것입니다.
이것을 어떻게 할 수 있습니까?
I would like to play video using R.
rasterImage각 프레임 렌더링)
답변:
정말로 이것을하고 싶다면 :
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 파일을 재생하는 것보다 더 많은 프로그램을 원하신다면, 일련의 사인파에서 곡을 생성하는 버전이 있습니다.
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는 440Hz (오케스트라를 튜닝하는 데 사용되는 음표)입니다. 옥타브는 C에서 전환되므로 C3은 B2보다 한 반음 높습니다. 페이드 인 make_sine이없는 이유는 음표를 시작하고 중지 할 때 팝이 들리기 때문입니다.
c에서 do.call, 그리고 마지막 할당은 make_sine필요하지 않습니다.
do.call. a <- 1; b <- 2; c <- 3길을 따라와 같은 일을 한 덫에 빠지는 것은 너무나 쉽다 . 그리고 그 상황에서는 do.call(c, ...)실패하지만 c(1, 2, 3)그렇지 않을 것이다. 그러나 후자의 요점에 완전히 동의하고 불필요한 할당을 제거했습니다!
do.call("c", ...)작동합니다. 시도해보십시오 c <- 4; do.call("c", list(1, 2)). R은 대부분의 경우 함수를 받아들이는 인수가 함수 자체 또는 함수 이름을 받아 들인다는 점에서 합리적으로 일관성이 있습니다. 어떤 경우에 (예 lapply),이 경유 match.fun등 다른에서 반면 do.call, getMethod상기 구현은 (a 호출을 통해 후자에 대한 C 코드이다 C_R_getGeneric). 왜 스타일 적으로 이름보다는 함수를 전달하는 것을 선호하는지 알 수 있지만 후자의 동작은 잘 문서화되어 있습니다.
symbolsymbolc <- 4; c(1, 2)c <- paste0; c(1, 2)cc(1, 2)do.call(c, ...)