Rでバイナリファイルを読む
さて、read_wavはwaveファイルを読むのですが、当然?wavファイルはバイナリデータです。
つまり、Rでバイナリファイルを読むための知見が必要なのですが、あまりそういう需要がないためか、情報もあまりないのでした。
readBin
こちらを大変参考にさせていただきました。 blog.recyclebin.jp
最終的にはかなり違うものになりましたが。
Rプログラミングマニュアル[第2版]ならreadBinについて記載があるかなと思ったのですが、残念ながら「ヘルプを読みましょう」と書かれていましたので、ヘルプとにらめっこです。 株式会社サイエンス社 株式会社新世社 株式会社数理工学社
readBinのヘルプ
readBinのヘルプを読みます。
引数で何が与えられるのか、デフォルト値が何で決まっているのか(環境依存とか)、サンプルプログラムとか、色々情報が詰まってますね。
本文は最初は読んでもよくわからないことが多いですが…末尾のプログラムが動かなかったことはなかったはず。
R: Transfer Binary Data To and From Connections
さて、readBinはこんな感じの引数(とデフォルト値)を持っていますね。
readBin(con, what, n = 1L, size = NA_integer_, signed = TRUE, endian = .Platform$endian)
conにはコネクションを与えます
connection <- file(file, "rb")
こんな感じでファイル名fileをバイナリモードのreadモードで開く形です。
whatには型を与えます。wavの場合は"integer"で良いです。"WAVE"などが入っている箇所はreadCharで読めばよいので。
signedは16bitPCMの場合は符号ありなのでTRUE。8bitの場合はFALSEにしないといけませんね。A.I.に追加。
endianはデフォルト値が入っているのですね。"little"を明示的に与えた方が良いのかもしれませんね。A.I.に追加。
sizeはそれぞれの読み込みのサイズをバイト数で与える形です。16bitなら2を与えればよいわけですね。
nは連続して読み込む場合に指定。wavファイルは固定長のデータのため、データ部分は一括で読み込むことが出来ます。
最初はfor文で読んでいましたが、Rのforは遅いので。ファイルサイズが小さい場合は問題にならないと思います。
可変長の場合は考えなくてはならないですが、それは次のread_smfにて考え中。
コネクションは最後に必ず閉じておく必要があります
close(connection)
が、エラーがあるとcloseが実行されなくなってしまうので、on.exit()に入れておく方が良いですかねぇ。これもA.I.…。
on.exit()
実際使ってみるのが、理解するには一番の近道な気がします。バイナリエディタとにらめっこして、思った値が取れているか?を地道にチェックすると良いのです。
read_wavの「完成」はまだまだ先になりそうですね…