# 22.2. `aifc` --- AIFFおよびAIFCファイルの読み書き

ソースコード: Lib/aifc.py

このモジュールはAIFFとAIFF-Cファイルの読み書きをサポートします。AIFF（Audio Interchange File Format）はデジタルオーディオサンプルをファイルに保存するためのフォーマットです。AIFF-CはAIFFの新しいバージョンで、オーディオデータの圧縮に対応しています。

オーディオファイルには、オーディオデータについて記述したパラメータがたくさん含まれています。サンプリングレートあるいはフレームレートは、1秒あたりのオーディオサンプル数です。チャンネル数は、モノラル、ステレオ、4チャンネルかどうかを示します。フレームはそれぞれ、チャンネルごとに一つのサンプルからなります。サンプルサイズは、一つのサンプルの大きさをバイト数で示したものです。したがって、一つのフレームは `nchannels * samplesize` バイト からなり、1秒間では `nchannels * samplesize * framerate` バイトで構成されます。

例えば、CD品質のオーディオは2バイト（16ビット）のサンプルサイズを持っていて、2チャンネル（ステレオ）であり、44,100フレーム／秒のフレームレートを持っています。そのため、フレームサイズは4バイト（2*2）で、1秒間では2*2*44100バイト（176,400バイト）になります。

`aifc` モジュールは以下の関数を定義しています:

`aifc.``open`(file, mode=None)

  AIFFあるいはAIFF-Cファイルを開き、後述するメソッドを持つインスタンスを返します。引数 file はファイルを示す文字列か、 file object のいずれかです。 mode は、読み込み用に開くときには `'r'` か `'rb'` のどちらかでなければならず、書き込み用に開くときには `'w'` か `'wb'` のどちらかでなければなりません。もし省略されたら、 `file.mode` が存在すればそれが使用され、なければ `'rb'` が使われます。書き込み用にこのメソッドを使用するときには、これから全部でどれだけのサンプル数を書き込むのか分からなかったり、 `writeframesraw()` と `setnframes()` を使わないなら、ファイルオブジェクトはシーク可能でなければなりません。`open()` 関数は `with` 文の中で使われるかもしれません。`with` ブロックの実行が終了したら、`close()` メソッドが呼び出されます。

  バージョン 3.4 で変更: `with` 構文のサポートが追加されました。

ファイルが `open()` によって読み込み用に開かれたときに返されるオブジェクトには、以下のメソッドがあります:

`aifc.``getnchannels`()

  オーディオチャンネル数（モノラルなら1、ステレオなら2）を返します。

`aifc.``getsampwidth`()

  サンプルサイズをバイト数で返します。

`aifc.``getframerate`()

  サンプリングレート（1秒あたりのオーディオフレーム数）を返します。

`aifc.``getnframes`()

  ファイルの中のオーディオフレーム数を返します。

`aifc.``getcomptype`()

  オーディオファイルで使用されている圧縮形式を示す4バイトの bytes を返します。AIFFファイルでは `b'NONE'` が返されます。

`aifc.``getcompname`()

  オーディオファイルの圧縮形式を人に判読可能な形に変換できる bytes で返します。AIFFファイルでは `b'not compressed'` が返されます。

`aifc.``getparams`()

  `get*()` メソッドが返すのと同じ `(nchannels, sampwidth, framerate, nframes, comptype, compname)` の `namedtuple()` を返します。

`aifc.``getmarkers`()

  オーディオファイルのマーカーのリストを返します。一つのマーカーは三つの要素のタプルです。要素の1番目はマークID（整数）、2番目はマーク位置のフレーム数をデータの始めから数えた値（整数）、3番目はマークの名称（文字列）です。

`aifc.``getmark`(id)

  与えられた id のマークの要素を `getmarkers()` で述べたタプルで返します。

`aifc.``readframes`(nframes)

  オーディオファイルの次の nframes 個のフレームを読み込んで返します。返されるデータは、全チャンネルの圧縮されていないサンプルをフレームごとに文字列にしたものです。

`aifc.``rewind`()

  読み込むポインタをデータの始めに巻き戻します。次に `readframes()` を使用すると、データの始めから読み込みます。

`aifc.``setpos`(pos)

  指定したフレーム数の位置にポインタを設定します。

`aifc.``tell`()

  現在のポインタのフレーム位置を返します。

`aifc.``close`()

  AIFFファイルを閉じます。このメソッドを呼び出したあとでは、オブジェクトはもう使用できません。

ファイルが `open()` によって書き込み用に開かれたときに返されるオブジェクトには、 `readframes()` と `setpos()` を除く上述の全てのメソッドがあります。さらに以下のメソッドが定義されています。 `get*()` メソッドは、対応する `set*()` を呼び出したあとでのみ呼び出し可能です。最初に `writeframes()` あるいは `writeframesraw()` を呼び出す前に、フレーム数を除く全てのパラメータが設定されていなければなりません。

`aifc.``aiff`()

  AIFFファイルを作ります。デフォルトではAIFF-Cファイルが作られますが、ファイル名が `'.aiff'` で終わっていればAIFFファイルが作られます。

`aifc.``aifc`()

  AIFF-Cファイルを作ります。デフォルトではAIFF-Cファイルが作られますが、ファイル名が `'.aiff'` で終わっていればAIFFファイルが作られます。

`aifc.``setnchannels`(nchannels)

  オーディオファイルのチャンネル数を設定します。

`aifc.``setsampwidth`(width)

  オーディオのサンプルサイズをバイト数で設定します。

`aifc.``setframerate`(rate)

  サンプリングレートを1秒あたりのフレーム数で設定します。

`aifc.``setnframes`(nframes)

  オーディオファイルに書き込まれるフレーム数を設定します。もしこのパラメータが設定されていなかったり正しくなかったら、ファイルはシークに対応していなければなりません。

`aifc.``setcomptype`(type, name)

  圧縮形式を設定します。もし設定しなければ、オーディオデータは圧縮されません。AIFFファイルは圧縮できません。name 引数は人間が読める圧縮形式の説明を bytes にしたもので、type 引数は4バイトの bytes でなければなりません。現在のところ、以下の圧縮形式がサポートされています： `b'NONE'`, `b'ULAW'`, `b'ALAW'`, `b'G722'`。

`aifc.``setparams`(nchannels, sampwidth, framerate, comptype, compname)

  上の全パラメータを一度に設定します。引数はそれぞれのパラメータからなるタプルです。つまり、 `setparams()` の引数として、 `getparams()` を呼び出した結果を使うことができます。

`aifc.``setmark`(id, pos, name)

  指定したID（1以上）、位置、名称でマークを加えます。このメソッドは、 `close()` の前ならいつでも呼び出すことができます。

`aifc.``tell`()

  出力ファイルの現在の書き込み位置を返します。 `setmark()` との組み合わせで使うと便利です。

`aifc.``writeframes`(data)

  出力ファイルにデータを書き込みます。このメソッドは、オーディオファイルのパラメータを設定したあとでのみ呼び出し可能です。

  バージョン 3.4 で変更: どのような bytes-like object も使用できるようになりました。

`aifc.``writeframesraw`(data)

  オーディオファイルのヘッダ情報が更新されないことを除いて、 `writeframes()` と同じです。

  バージョン 3.4 で変更: どのような bytes-like object も使用できるようになりました。

`aifc.``close`()

  AIFFファイルを閉じます。ファイルのヘッダ情報は、オーディオデータの実際のサイズを反映して更新されます。このメソッドを呼び出したあとでは、オブジェクトはもう使用できません。