オーディオパッケージ
このパッケージには,標準波形およびユーザ指定のスペクトルを持つ波形の生成,振幅・周波数が変調された正弦波の合成,およびサウンドファイルのWolfram言語への読込みのための関数が含まれている.
Wolfram言語のサウンド関数のグラフィックス出力はハードウェアに依存するため,使用中のマシンで例題を評価して得られた波形が,このドキュメントに含まれているグラフィックスとは異なることがある.
標準波形の生成
Waveformでは理論的に無限数の倍音を含む標準波形の作成に,計算上効率のよいアルゴリズムが用いられる.
<<Audio`tri440 = Show[Waveform[Triangle, 440, 0.2]]オプションOvertonesを指定すると,Waveformで作成されるサウンドに含まれる倍音の数を制限することができる.
Show[Waveform[Square, 880, 0.2, Overtones -> 8, SampleRate -> 2^15]]Show[Table[Waveform[Sawtooth, 880, 0.1, Overtones -> n, SampleRate -> 2^15], {n, 10, 2, -1}]]オプションOvertonesを使うと, Waveform関数はサウンドの作成にフーリエ(Fourier)の総和を用いる.この方法は計算する上ではデフォルトのアルゴリズムほど効率的ではないが,指定数の倍音だけを持つよりクリーンなサウンドを生成することができる.Wolfram言語のSetOptions関数はフーリエの総和をデフォルトにする場合に用いられる.
SetOptions[Waveform, Overtones -> ∞]SetOptions[Waveform, Overtones -> Automatic]波形のスペクトルの指定
| ListWaveform[{{n1,a1},{n2,a2},…},freq,dur] | |
| 基本周波数 freq,継続時間 dur 秒で,相対周波数 ni において相対振幅が ai であるスペクトルのSoundオブジェクトを作成する | |
ListWaveformを使うと,特定のスペクトルを持つ波形を作成することができる.第1引数はペアのリストである.各ペアの最初の要素は基本周波数に対する相対周波数であり,2つ目の要素はその周波数における相対振幅である.
例えば,部分音の周波数が非調和関係にあり,複雑な振幅の関係を持つ「楽器」に相当する部分音リストを定義することができる.その後,ListWaveformを用いて,これらの関係を異なる基本周波数で生成することができる.
partialList = {{1, 1}, {1.1, 0.1}, {1.2, 0.9}, {1.3, 0.2}, {1.4, 0.8}, {1.5, 0.3}, {1.6, 0.7}, {1.7, 0.4}, {1.8, 0.6}, {1.9, 0.5}};sequence = Table[ListWaveform[partialList, 440 2^x / 12, 0.2], {x, 0, 5}];Show[sequence]ListWaveformを使うと,すべての周波数成分が同じ振幅を共有するように振幅を1とする部分音リストを定義することで,和音を作成することもできる.
majorChord = {{1, 1}, {1.26, 1}, {1.5, 1}};Show[ListWaveform[majorChord, 493.88, 0.2]]振幅変調
振幅変調はスタジオで使われる一般的なアナログ技術であり,これには作成されたサウンドには搬送波周波数と,搬送波周波数・変調周波数の和および差の3つの周波数が含まれる.
| AmplitudeModulation[fc,fm,mi,dur] | 搬送波周波数と変調周波数がそれぞれ fc ヘルツと fm ヘルツ,変調指数が mi,継続時間が dur 秒である振幅変調正弦波のSoundオブジェクトを作成する |
AmplitudeModulationで用いられる式は
である.
Show[AmplitudeModulation[440, 6, 1, 0.5]]変調の深さや強度は変調指数 mi で制御される.mi>1のとき,搬送波は過変調であるという.mi の影響を理解するのに最適な方法は,0.1から2.0の間の様々な値を試してみることである.
| AmplitudeModulation[fc,fm,mi,dur,RingModulation->True] | |
| リング変調正弦波のSoundオブジェクトを作成する | |
オプションをRingModulation->Trueと設定した場合,AmplitudeModulationで作成されたSound オブジェクトが含む周波数は,搬送波周波数と変調周波数の和と差の2つだけである.これはリング変調と呼ばれ,式
で与えられる.
Show[AmplitudeModulation[200, 500, 1, 0.5, RingModulation -> True]]周波数変調
周波数変調(FM)は主な大学でワークステーションに,また郊外の家でシンセサイザーに用いられる技術である.この技術が偏在する理由の一部として,数学的に簡単であることと,電子回路への実装が容易であることが挙げられる.周波数変調の式は
で与えられる.
| FrequencyModulation[fc,{fm,pd},dur] | |
| 搬送波周波数と変調周波数がそれぞれ fc ヘルツと fm ヘルツ,周波数偏移が pd ヘルツ,継続時間が dur 秒の周波数変調正弦波のSoundオブジェクトを作成する | |
Show[FrequencyModulation[660, {7, 70}, 0.5]]変調指数は変調周波数に対する周波数偏移の比となる.変調指数が大きいと,部分音が多くなり,音が明るくなる.変調指数の値が非常に大きいとエイリアシングノイズが発生し,音に低周波成分が加わる.
Show[FrequencyModulation[440, {550, 5500}, 0.5]]周波数比は搬送波周波数に対する変調周波数の比である.この比が1以上の整数である場合,結果の倍音と側波帯は互いに調和関係となる.これは標準的なオーケストラの楽器の調和関係に類似している.一方,周波数比が整数でない場合は,結果の倍音と側波帯は非調和関係を持つ.これはパーカッションやベルに類似している.調和関係とは倍音と側波帯が,ある基音(搬送波とは限らない)の高調波と一致する周波数のときのことである.
| FrequencyModulation[fc,{{f1,pd1},{f2,pd2},…},dur,ModulationType->Cascade] | |
| カスケード周波数変調正弦波のSoundオブジェクトを作成する.pdi は変調周波数 fi に関連付けられた周波数偏移で,両値とも単位はヘルツである | |
カスケード周波数変調は周波数変調の一種である.この方式では変調周波数自体が変調されるので,変調が段階的に行われることになる.2つの変調周波数を持つカスケード周波数変調の式は
と表される.このネストした演算は任意の大きさの変調周波数のリストについて実行できる.
Show[FrequencyModulation[880, {{340, 100}, {550, 50}, {730, 25}}, 0.5, ModulationType -> Cascade]]| FrequencyModulation[fc,{{f1,pd1},{f2,pd2},…},dur,ModulationType->Parallel] | |
| 並列周波数変調正弦波のSoundオブジェクトを作成する.pdi は変調周波数 fi に関連付けられた周波数偏移で,両値とも単位はヘルツである | |
カスケード周波数変調とは逆に,並列周波数変調は搬送波周波数が2つ以上の変調周波数で変調される技術である.この変調周波数は互いに変調し合うことはない.2つの変調周波数を持つ並列周波数変調の式は
で与えられる.
Show[FrequencyModulation[880, {{340, 100}, {550, 50}, {730, 25}}, 0.5, ModulationType -> Parallel]]オプションDisplayFunction,SampleRate,SampleDepth,PlayRangeの設定
Audioパッケージのサウンド生成関数はすべて,サウンド生成の低レベル操作にWolfram言語のPlay関数を使う.Playのオプションの中には,SampleRate,SampleDepth,PlayRange等,結果のサウンドの質と構成を大幅に変えることのできるものがある.オプションDisplayFunctionは,作成されたSoundオブジェクトが返された直後に再生されるかどうかを決定する.
パッケージをロードすると,オプションSampleRate,SampleDepth,PlayRangeは使用中のマシンにおけるそれぞれの最適値に設定される.また,DisplayFunction->Identityも設定される.これにより,Sound オブジェクトが返されても再生はされない.これらの値はWolfram言語のSetOptions関数を使って再設定したり,コマンドラインから指定したりすることができる.
AmplitudeModulation[440, 100, 1, 0.5, SampleRate -> 22050]オプションDisplayFunction->$SoundDisplayFunctionを設定すると,毎回Show関数を使わなくてもWolfram言語がサウンドを作成した直後にそのサウンドが再生できる.引数の組合せを試験しており,引数が結果のサウンドにもたらす影響を聴きたい場合には,この設定が最も便利である.
SetOptions[FrequencyModulation, DisplayFunction -> $SoundDisplayFunction]casfm2 = FrequencyModulation[660, {{770, 100}, {660, 50}, {540, 25}}, 0.5, ModulationType -> Cascade]FrequencyModulation[660, {{660, 100}, {540, 50}, {660, 25}}, 0.5, ModulationType -> Cascade]SetOptions[FrequencyModulation, DisplayFunction -> Identity]Playのさまざまなオプションの効果を知ると,サウンド生成関数がよりうまく使いこなせるようになる.
SampleRateはサウンドプリミティブのオプションで,サウンドの生成の際の1秒あたりのサンプル数を指定するものである.ナイキスト(Nyquist)の標本化定理によると,最大周波数
ヘルツの波形を正確に表現するためには,1秒あたり n サンプルが必要となる.つまり,サンプリングレートが聴きたいサウンドの最大周波数の少なくとも2倍である必要があるということである.サンプリングレートが小さいとエイリアシングが生じ,サンプリングレートの半分以上の周波数成分が実際より低い周波数成分として表されてしまう.人間の聴覚は音声信号として20 Hzから20,000 Hzまでの間の周波数を聞き取ることができるので,音声範囲をすべて正しくエンコードするためには,少なくとも1秒あたり40,000サンプルのサンプリングレートが必要となる.
Wolfram言語では,SampleRateは任意の正の数に設定できる.しかし,作成されるサウンドはデジタル・アナログコンバータのサンプリングレートに依存する.コンバータのサンプリングレートが指定のサンプリングレートの倍数でない場合は,コンバータのサンプリングレートのソフトウェア変換が自動的に行われるため,結果のサウンドに歪みが生じることがある.
Show[FrequencyModulation[660, {100, 100}, 0.5]]Show[FrequencyModulation[660, {100, 100}, 0.5, SampleRate -> 1234]]SampleDepth(量子化ともよく呼ばれる)はサウンドプリミティブのオプションで,サウンドの振幅レベルのエンコードに何ビット必要であるかを指定するものである.これをSampleDepth->8と設定すると
通りの振幅レベルが可能となり,SampleDepth->16とすると
通りとなる.使用するハードウェアに最適なSampleDepthを選択しなければならない.
Show[Waveform[Sawtooth, 880, 0.5]]Show[Waveform[Sawtooth, 880, 0.5, SampleDepth -> 3]]PlayRangeはPlay および関連する関数オプションで,含むべきサウンドの振幅レベルの範囲を指定するものである.関数Waveform,FrequencyModulationではこの値はAllとなり,AmplitudeModulation関数では{-1,1}となる.Play のPlayRangeはPlotのPlotRangeと同じように動作する.
Plot[Sin[x], {x, 0, 2 π}]Plot[Sin[x], {x, 0, 2 π}, PlotRange -> {-0.5, 0.5}]2つ目のプロットは関数の値がPlotRangeで指定された限界を越えると,値が切り捨てられる.同様に,サウンドの振幅がPlayRangeの設定を超えると,結果のサウンドは元の関数を完全には表現できない.この現象は作曲家の間では波形形成,エンジニアの間では波形歪みと呼ばれる.すべての生成されたサンプルが波形歪みなしで表されるように, PlayRangeは十分高く設定しなければならない.
任意の順序でのSoundオブジェクトの再生
Audio`で定義されているサウンド生成関数はすべてSoundオブジェクトを返すので,返された値はShow関数を使って順に聴くことができる.
{s1, s2, s3} = {Waveform[Sawtooth, 880, 0.2], AmplitudeModulation[440, 530, 1, 0.5], FrequencyModulation[660, {{300, 400}, {600, 200}}, 0.3, ModulationType -> Cascade]};Show[s3, s2, s1]