サウンド表現

「サウンド」では関数や数値データからサウンドを生成する方法について説明してある.ここでは,サウンドオブジェクトがどういった構造を持ち,形成されているか説明する.

Wolframシステムではサウンドはグラフィックスと同じように扱われる.事実,グラフィックスとサウンドを組み合せてサウンドトラック付きの画像を作ることも可能である.

グラフィックスにならい,サウンドもオブジェクトとしてとらえる.サウンドオブジェクトはSoundの頭部が作用した形で記述され,演奏音を表したサウンドプリミティブのリストから構成される.

Sound[{s1,s2,}]サウンドプリミティブのリストからなるサウンドオブジェクトを生成する

サウンドオブジェクトの生成

「サウンド」で触れたが,Soundオブジェクトを生成するにはPlayListPlayの関数を使う.

関数をPlayは,Soundオブジェクトを生成する.コンピュータに演奏機能が備わっていれば,関数値に対応した音が発生する.
In[1]:=
Click for copyable input
Out[1]=
Soundオブジェクトの構成を調べる.振幅の標本を生成するためにコンパイル済み関数を使うプリミティブSampledSoundFunctionが入っている.
In[2]:=
Click for copyable input
Out[2]//Short=
SampledSoundList[{a1,a2,},r]サンプルレート r で振幅値のリストからなるサウンドを指定する
SampledSoundFunction[f,n,r]関数 fn 個の連続した整数に適用して生成した,サンプルレート r の振幅値からなるサウンドを指定する
SoundNote[n,t,"style"]音符 n,時間指定 t の指定されたスタイルの音符のようなサウンドを指定する

サウンドプリミティブ

最も低次なレベルにおいて,サウンドとは音の振幅標本が連続したもの,またはMIDIイベントの列としてとらえられる.SampledSoundListでは,振幅は数値データのリストで与えられる.また,SampledSoundFunctionを使い関数からサウンドを生成すると,振幅データは関数に整数シーケンスを与え計算により生成される.ただし,実際の生成は演奏するときにだけ行われる.どちらのサウンド形態でも振幅値はからの範囲に入れておかなければいけない.SoundNoteでは,音符のようなサウンドは周波数,期間,振幅,音符のスタイルを表す一連のMIDIイベントとして表現される.

ListPlayを実行するとSampledSoundListのプリミティブが生成され,PlayだとSampledSoundFunctionのプリミティブが生成される.デフォルト通りコンパイル指定が有効なら(Compiled->True),Playの生成するSampledSoundFunctionのオブジェクトはCompiledFunctionによってコンパイルされている.

各種のプリミティブでSoundオブジェクトが形成できたら,次のステップは,それを実際に演奏することである.グラフィックスの場合と同じように,このステップにおける基本処理は,カーネルで作ったサウンドオブジェクトを出力装置で演奏可能な低レベルのデータ形態に変換することである.演奏処理はWolframシステムのフロントエンドや外部プログラムで実行される.

低レベルのデータ表記において,サウンドは振幅を指定した16進数の列データからなる.低レベルに下げる前のカーネル内部処理において,振幅値はからの実数近似値で表されている.低レベルデータを生成するため振幅の実数データに「量子化処理」が施される.量子化処理でオプションの1つにSampleDepthのビット長設定がある.これは何ビットで標本を量子化するかを決めるものである.デフォルトの値は8ビットで(SampleDepth->8),この設定だと振幅は256レベルの量子化が可能である.これは多くの用途で十分なレベル数である.音符ベースのサウンドを低レベルで表現すると,MIDIイベントを時間で量子化したバイトストリームとすることができる.これは音符オブジェクトについてのさまざまなパラメータを指定する.時間の量子化は,プレイバックで自動的に決定される.

SampleDepthのビット長設定はPlayおよびListPlayのどちらでも使える.また,サウンドプリミティブに標本化レート(rate)と一緒にビット長(depth)を指定したいときは,のリスト形式で指定する.