RでWAVファイルの読み書きをはじめとする音の編集を行うにはtuneRパッケージを用いるとよい。
ライブラリの使用開始とWAVファイルの読み込み。16ビットのファイルなら(-32768)〜(+32767)の範囲で読み込まれるため、([-1,+1))の範囲に変換すると、のちのち好都合なときが多い。
library(tuneR)
wavobj <- readWave(file.path("file_in.wav"))
fs <- wavobj@samp.rate # サンプリング周波数 sampling frequency
nbits <- wavobj@bit # 量子化ビット数 quantization bits
xL <- wavobj@left / 2^(nbits-1) # 左チャンネルの信号を[-1,+1)に変換
xR <- wavobj@right / 2^(nbits-1) # 右チャンネルの信号を[-1,+1)に変換
波形をプロットするときには以下のように行う。
plot(wavobj)
([-1,+1))の範囲への変換後は以下のように。上記の方法よりもだいぶ時間がかかるので注意。
t <- (0:(length(xL)-1)) / fs
plot(t, xL, type="l", xlab="Time (s)", ylab="Amplitude", ylim=c(-1,+1))
grid()
音の再生はOS Xだと/usr/bin/afplay
コマンドを使うように指定する必要がある。
play(wavobj, "/usr/bin/afplay")
一通り処理が終わったらファイルに書き出す。
wavobj@left <- xL * 2^(nbits-1)
wavobj@right <- xR * 2^(nbits-1)
writeWave(wavobj, file.path("file_out.wav"))
tuneRのバージョン0.4-1では1chか2chのファイルしか扱えなかったが、バージョン1.0からマルチチャンネルもサポートされるようになった。
Wave
オブジェクトは2チャンネルのファイルまでしか扱うことができない。しかし、サラウンドの音源作成などで2チャンネルを超えるファイルを扱いたいときもある。そのときにはWaveMC
オブジェクトを使用する。
もちろん2チャンネルのファイルにWaveMC
オブジェクトを使用しても良いのだが、tuneRをはじめとするパッケージのユーティリティ関数はWave
オブジェクトを入力とするものが多いため、2チャンネルまでのファイルであれば当面Wave
オブジェクトを使用するほうが便利だろう。
tuneRのreadWave()
を用いるとWAVファイルを読み込むことができる。filename
で読み込むファイル名を指定する。toWaveMC=TRUE
はマルチチャンネル・オーディオに対応した形式で読み込むための方法だ。
wavobj <- readWave(filename="drums.wav", toWaveMC=TRUE)
WaveMCオブジェクト内にあるスロットのうち波形サンプルデータはleft
とright
ではなく、.Data
という二次元行列(行がサンプル、列がチャンネル)となる。
x1 <- wavobj@.Data[,1] # [,n]でnチャンネル目を指定する
fs <- wavobj@samp.rate # サンプリング周波数
nbits <- wavobj@bit # 量子化ビット数
信号を保存するときにはWaveMC
オブジェクトを作り、そのオブジェクトをwriteWave()
に渡す。その際、所望の量子化ビット数にあわせた振幅範囲に変換した上で、サンプリング周波数と量子化ビット数を指定する。
# データ、サンプリング周波数、量子化ビット数を指定してWaveMCオブジェクトを作成
wavobj <- WaveMC(data=x1, samp.rate=fs, bit=nbits)
# どのチャンネルに出力するものか指定
colnames(wavobj) <- c("FL")
# ファイル名を指定して保存
writeWave(object=wavobj, filename="hoge.wav")
WaveMC
オブジェクトを保存する際には、データがどの再生チャンネルに向けて用意されたものであるかを指定する必要がある。
たとえば、ITUのチャンネル順序に従う5.1チャンネルのファイルを作成したいときには
colnames(wavobj) <- c("FL", "FR", "FC", "LF", "BL", "BR")
のように指定する。このような指定ができる背景には、自分が作成したWAVオブジェクト中のチャンネル順が、必ずしもITUやSMPTEの推奨するチャンネル順に並んでいない場合があることによる。
FL
などのタグ名についてはMCnames
で表示されるname
を使用する。以下のようにMCnames
を見ると、Top Front Left(TFL)などといった上方スピーカへの出力も考慮されている。これはWAVファイルの定義として、18チャンネルまで用意されているものである。(現状では2016年8月に試験放送が始まった22.2chなどには対応できていないが、今後3次元オーディオ用に34チャンネルまでの拡張が計画されている。)
MCnames
## id label name
## 1 1 Front Left FL
## 2 2 Front Right FR
## 3 3 Front Center FC
## 4 4 Low Frequency LF
## 5 5 Back Left BL
## 6 6 Back Right BR
## 7 7 Front Left of Center FLC
## 8 8 Front Right of Center FRC
## 9 9 Back Center BC
## 10 10 Side Left SL
## 11 11 Side Right SR
## 12 12 Top Center TC
## 13 13 Top Front Left TFL
## 14 14 Top Front Center TFC
## 15 15 Top Front Right TFR
## 16 16 Top Back Left TBL
## 17 17 Top Back Center TBC
## 18 18 Top Back Right TBR