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
). 왜 스타일 적으로 이름보다는 함수를 전달하는 것을 선호하는지 알 수 있지만 후자의 동작은 잘 문서화되어 있습니다.
symbol
symbol
c <- 4; c(1, 2)
c <- paste0; c(1, 2)
c
c(1, 2)
do.call(c, ...)