Rを使用して誕生日の音楽を再生するにはどうすればよいですか?[閉まっている]


80

Rを使って音楽を演奏したいと思います。Rはこの目的に最適なツールではないかもしれませんが、私がよく知っているツールであり、このような楽しい機会にその柔軟性を他の人に示すのは素晴らしいことです。

どうすればこれを達成できますか?


7
なぜR経由でBD音楽を再生したいのですか?Rは統計プログラミング言語です。そのようなタスクにはもっと良いプラットフォームがあると思います。
David Arenburg 2015

13
@DavidArenburgそれは確かに真実ですが、このファイルtinyurl.com/odlurthの33ページを見てください(これはPaul Murrellの「RGraphics」です)。何かをするためのより良いプログラムがあるという事実は、私たちがFeng Tian(おそらくその過程で何か新しいもの)を助けようとするのを妨げるべきではありません
MaZe 2015

11
私見、その質問にはいくつかのメリットがあるかもしれません。音の分析2)は正当な分析タスクであるため、分析作業を行う際に音のサンプルを官能的に検証することをいとわない状況を想定することができます。そうは言っても、タイトルの誕生日の音楽はかなり奇妙です。
コンラッド

8
質問する可能性があるので、この種の質問を奨励しないでくださいI would like to play video using R
Avinash Raj 2015

7
@AvinashRaj興味深いことに、私はそれを後続として考えていました:)真剣に、オプションはおそらく取るに足らない(外部プログラムを起動する)、無意味(外部コードでビデオプレーヤーを再実装する)、または使用できない(Rコードを使用する)のいずれかですビデオストリームをデコードし、rasterImage各フレームをレンダリングするため)
Nick Kennedy

回答:


237

あなたが本当にこれをしたいのなら:

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は440 Hz(オーケストラのチューニングに使用されるノート)です。オクターブはCで切り替わるため、C3はB2より1半音高くなります。フェードインの理由は、フェードインmake_sineがないと、ノートを開始および停止するときにポップ音が聞こえるからです。


6
@DavidArenburgありがとう。少しばかげたことをするために、正弦波を使用して第一原理から曲を生成するコードを追加しました:)
Nick Kennedy

素晴らしい答え。私は何か新しいことを学びました:私は色あせについて知りませんでした、そして私の最近の実験はこの正確な問題を抱えていました。Nitpick:で引用cする理由はなくdo.call、の最後の割り当てmake_sineは不要です。
Konrad Rudolph

1
@KonradRudolphありがとう。私はいつも関数名をで引用する傾向がありdo.callます。a <- 1; b <- 2; c <- 3途中で何かをしたという罠に陥るのは簡単で、その状況でdo.call(c, ...)は失敗しますが、失敗しc(1, 2, 3)ません。ただし、後者の点に完全に同意し、不要な割り当てを削除しました。
ニックケネディ

1
@KonradRudolph実際do.call("c", ...)に動作します。試してみてくださいc <- 4; do.call("c", list(1, 2))。Rは、ほとんどの場合、関数を受け入れる引数が関数自体または関数の名前のいずれかを受け入れるという点で、かなり一貫しています。いくつかの場合(たとえばにおいてlapply)、これは、を介して行われるmatch.fun他のに対して、例えばdo.callgetMethod実装は、(への呼び出しを介して、後者のためのCコードですC_R_getGeneric)。名前よりも関数を渡す方がスタイル的に好まれる理由はわかりますが、後者の動作は十分に文書化されています。
ニックケネディ

2
@KonradRudolphまあまあ。関連する問題は、検索パスのさらに上に別の関数が存在するsymbol場合でも、aの後に括弧が続く場合、Rは常に関数を検索することだと思いsymbolます。これにより、ベースを使用せずにc <- 4; c(1, 2)、通常どおりに作業できます。これによって、誰かがコードを非常に喜んで呼び出しているのに、機能しなくなるという混乱が生じているのを見てきました。結局のところ、機能が名前で提供されているのか、直接提供されているのかについては、私は強く感じていません。c <- paste0; c(1, 2)cc(1, 2)do.call(c, ...)
ニックケネディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.