音として聴くためのシグナル(dac~ に送り出すシグナル)は -1.0 〜 +1.0までの振幅範囲でなければなりません。この範囲を超える値は、dac~ によって( -1または1に)クリップされます。これは、サウンドの(ほとんどの場合非常に欠陥となる)ディストーション(歪み)を引き起こします。cycle~ のようないくつかのオブジェクトは、デフォルトでは同じ範囲で値を出力します。
cycle~のデフォルト出力の振幅は1です
シグナルのレベルをコントロールするためには、単に各サンプルに係数を掛ければよいだけです。例えば、シグナルの振幅を半分にするためには、0.5を掛けます。(シグナルの振幅を2で割っても数学上は同じですが、コンピュータにとって乗算は除算より効率的な計算法です。)
係数をかけて調整された振幅
時間軸上で連続的にシグナルの振幅を変更したいとき、*~ の右のインレットに係数のためのシグナルを送ることができます。*~ の右のインレットの値を連続的に変えることによって、サウンドをフェードイン、フェードアウトさせたり、クレッシェンドやディミヌエンドなどの効果をつくることができます。
しかし、振幅の急激な変化はシグナルの不連続性を引き起し、結果としてクリックノイズ(プチッというような雑音)を発生させてしまいます。
瞬間的な振幅の変化はシグナルにノイズによる歪みを生じます
その理由から、振幅を変更するためには、各々のサンプル値がよりなめらかに(およそ数ミリセカンド間隔で線的に)変わっていくようなシグナルを利用すると、たいてい良い結果を生みます。
振幅の瞬間的な変化(それは、シグナルの欠陥となる歪みを引き起こします。)の代わりに、5ミリ秒ごとに1.0から0.5まで徐々に変化するシグナルを *~ の右側のインレットに与え、スタート時点の振幅とターゲットとなる振幅の間の補間を各サンプルごとに行なうことによって、なめらかな振幅変化を作ることができます。
line~を用いた5ミリ秒ごとの線的な振幅の変化
line~ オブジェクトは、Maxオブジェクトlineと同じような機能を持ちます。line~ の左のインレットは、目的の値とそれに達するまでの所要時間(ミリ秒で)を受け取ります。line~ は、現在の値から目的の値まで直線的に変化するように各サンプルの適当な中間値を計算します。line~ と line の1つの重要な違いは、line~ が目的の値と所要時間の入力を floatで受け入れることができるということです。
技術的な詳細:シグナル全体におけるどんな増幅も、それが変化しているときには絶えず多少の歪みをもたらします。(オリジナルのシグナルと比べて、波形はその間に、実際に変更されます)。この歪みが欠陥と感じられるかどうかは、変化がどの程度突然か、振幅の変化がどの程度大きいか、オリジナルの波形がどの程度複雑かに左右されます。すでに複雑なシグナルにもたらされるわずかな歪みは、聞き手にとってあまり気にならないかもしれません。逆に、オリジナルのシグナルがとても純粋な場合、ほんのわずかの歪みでも、それが部分音を付け加えてしまうために音色の変化を引き起こします。
上の例では、サイン波の音の振幅は5ミリ秒で半分(6dB)に減少しています。振幅が減少するにつれて、わずかな音色の変化を聞き取る人がいるかも知れませんが、その変化はクリックノイズを引き起こすほど突然ではありません。他方、もしサイン波の音の振幅が5ミリ秒で8倍(18dB)に増加したとしたら、その変化はパーカッションのアタックのように聞こえるくらい強烈です。
5ミリ秒での8倍の振幅増加はパーカッションのような効果を生みます
サンプルパッチは、オシレータの増幅を調節するためのアジャスタブル(可変)アンプを作るために、*~ と line~ の組み合わせを用いています。pack オブジェクトは目標となる振幅値に到達時間を追加するので、振幅のあらゆる変化には100ミリ秒を費やします。オシレータの周波数を変更するためのナンバーボックスも用いられています。
周波数と増幅が可変なオシレータ
どんなMaxメッセージが送り出されるよりも前に、シグナルネットワークはすでにデフォルト値を持つことに注意して下さい。cycle~ オブジェクトは指定された周波数1000Hzを持ち、line~ オブジェクトはデフォルトの初期値0を持ちます。たとえ *~ が右インレットを初期化するためにあらかじめアーギュメントを持っていたとしても、line~ が絶えず値を与え続けているので、その右オペランドは0のままでしょう。
・Amplitudeナンバーボックスを利用して好みのレベルにボリュームをセットし、サウンドをスタートさせるために Audio On/Off と表示された toggle をクリックして下さい。ナンバーボックスを使って、周波数と増幅を変化させて下さい。サウンドをオフにするためにもう一度 toggle をクリックして下さい。
line~ と*~ の組み合わせは、オーディオのオン、オフが切り替えられるときに発生するクリックを避けるのを助ける働きも持っています。toggle から送られる1と0(”on”と ”off”)のメッセージは、start、stop メッセージが dac~ に送り出される場合と同様に、要求された振幅までボリュームフェーダを上げ、そして0まで下げるような効果のために利用されます。この方法では、サウンドは、瞬間的にオンになるというより、むしろ穏やかにフェードイン、フェードアウトしています。
On、Offメッセージは dac~ の start、stop の前にオーディオのフェードイン、アウトを行います
オーディオがオフになる直前に、toggle からの 0 は pack オブジェクトに送られ、オシレータのボリュームの100ミリ秒でのフェードアウトを開始します。また、フェードアウトを発生させるために、dac~ に stop メッセージが送られる前に100ミリ秒の間ディレイされます。オーディオがオンになる直前に、要求された振幅値はトリガーされ、ボリュームのフェードインを開始します。しかしこの場合、実際には、フェードインは dac~ がスタートする直後まで開始しません。(実際のプログラムでは、start、stopというメッセージボックスは、ユーザが直接それらをクリックしないように非表示にされるか、サブパッチでカプセル化されるでしょう。)
1以外の数値をオーディオシグナルの各サンプルに乗じることで、振幅は変更されます。従って、*~ オブジェクトはアンプとしての機能を持ちます。振幅の突然の強烈な変化はクリックノイズを引き起こすので、他のシグナルによって振幅をコントロールして、より段階的なフェードを得ることは多くの場合賢明なやり方です。ラインセグメントジェネレータ line~ は、Maxオブジェクト line に似たもので、シグナル・ネットワークに対して線形に変化する値を与えるのに適しています。line~ と *~ の組み合わせは、シグナルの全体の振幅を制御するエンベロープを作るために利用できます。
cycle~ | テーブル・ルックアップ・オシレータ |
dac~ | オーディオの出力とオン、オフの切り替え |
line~ | リニア・ランプジェネレータ |