Data.WAVE: Haskell で wav を扱う¶
Last Change: | 13-May-2016. |
---|---|
Author: | qh73xe |
Reference: | https://hackage.haskell.org/package/WAVE-0.1.3/docs/Data-WAVE.html |
wave の読み込み¶
とりあえず Haskell で wav ファイルを読み込みます。 これには先に導入した Data.WAVE を利用します。
このパッケージには getWAVEFile という関数が定義されているのでこれを利用しましょう。<0>
- getWAVEFile :: String -> IO WAVE
- data WAVESource
- waveHeader :: WAVEHeader
- waveNumChannels :: Int Samples per frame.
- waveFrameRate :: Int Frames per second.
- waveBitsPerSample :: Int Number of significant bits of left-justified value.
- waveFrames :: Maybe Int
waveSamples :: WAVESamples
import Data.WAVE
WAVE header samples <- getWAVEFile "hoge.wav"
これで header の中に waveHeader が、 samples の中に wavSample が読み込まれます。
詳しく見てみる¶
ここでは、上記のモジュールを使用するのではなく
C 言語による wav ファイルの読み込み
のように
一から実装できるようにします。
- とはいいつつ、参考にしますが
まず、 WAVE ファイルのクラスを考えます。 これは 形式上、ヘッダ と データに分けることが可能です。
Haskell の基本は小さい部分から作成していくことです。 まずは各データに関して考えると、これは n bit で表現されるデータです。 ここでは 32bit ということで考えます。
この集合が WAVE のデータチャンクですから、 それをリストにしたものも定義しましょう。
import Data.Int
type Sample = Int32
type Samples = [[Sample]]
つづいて フォーマットチャンクを考えます。 重要なのはサンプリング周波数と、量子化精度なので、 これらの情報をもつようにします。
data Header = Header {
fs :: Int,
bits :: Int,
}
あとは wav クラスを作成します。
data WAV = WAV {
header :: Header,
samples :: Samples
}
続いては読み込み関数を作成していきましょう。