[解決済み] Rを使って誕生日の音楽を演奏するには?[クローズド]
2023-06-29 02:51:08
質問
Rはこの目的には最適なツールではないかもしれませんが、私にとっては使い慣れたツールであり、このような楽しい機会にその柔軟性を他の人に示すことができたらと思います。
どうすればこれを達成できるでしょうか?
どのように解決するのですか?
本当にやりたいのであれば
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
でフェードインする理由は、これがないと音を出したり止めたりするときにポップ音が聞こえるからです。
関連
-
R言語ダウンロード機能 download.fileとダウンロード解析
-
[解決済み] Rの再現性のある優れた例題の作り方
-
[解決済み] データフレームを結合(マージ)する方法(内側、外側、左側、右側)
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] データフレーム列の名前によるドロップ
-
[解決済み] xkcd風のグラフを作るには?
-
[解決済み】data.table vs dplyr:一方がうまくできない、またはうまくできないことを行うことができますか?
-
[解決済み】Roxygen2を使ってS4クラススロットを適切にドキュメント化する方法は?
-
[解決済み】私のggplot2構文が賢明であるときに、R CMDチェック「no visible binding for global variable」注記を処理するにはどうすればよいですか?
-
[解決済み】Rで2つのヒストグラムを一緒にプロットする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ggplot2 からグリッドと背景色を削除する。
-
[解決済み] "エラーです。Rでテーマの書式を保存する際に「Don't know how to add RHS to the theme object」(テーマオブジェクトにRHSを追加する方法がわかりません)と表示されます。
-
[解決済み] グループ化関数(tapply、by、aggregate)と*applyファミリ
-
[解決済み] Rの代入演算子"="と"<-"の違いは何ですか?
-
[解決済み] パッケージ 'xxx' は利用できません (for R version x.y.z) 」という警告にどのように対処したらよいですか?
-
[解決済み] なぜ `[`] は `subset` よりも優れているのですか?
-
[解決済み] R および RStudio のコンソールをクリアする関数
-
[解決済み】ggplot2で軸のタイトルやラベルの大きさを変更する。
-
[解決済み] FUN内のlapplyインデックス名へのアクセス
-
[解決済み] ggplot2 で個々のファセットにテキストをアノテートする