21.3. "aifc" --- AIFFおよびAIFCファイルの読み書き
*************************************************

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

======================================================================

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

注釈: 操作のいくつかはIRIX上でのみ動作します; そういう操作ではIRIXで
  のみ利 用できる "cl" モジュールをインポートしようとして、
  "ImportError" を 発生します。

オーディオファイルには、オーディオデータについて記述したパラメータがた
くさん含まれています。 サンプリングレートあるいはフレームレートは、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])

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

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

aifc.getnchannels()

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

aifc.getsampwidth()

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

aifc.getframerate()

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

aifc.getnframes()

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

aifc.getcomptype()

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

aifc.getcompname()

   オーディオファイルの圧縮形式を人に判読可能な記述を返します。AIFF フ
   ァイルでは "'not compressed'" が返されます。

aifc.getparams()

   以上の全ての値を上の順に並べたタプルを返します。

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 は圧縮形式を人
   に判読可能にしたもので、変数 type は 4 文字の文字列でなければなりま
   せん。現在のところ、以下の圧縮形式がサポートされています： NONE,
   ULAW, ALAW, G722。

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

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

aifc.setmark(id, pos, name)

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

aifc.tell()

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

aifc.writeframes(data)

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

aifc.writeframesraw(data)

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

aifc.close()

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