チュートリアル 2
アジャスタブル・オシレータ

チュートリアルを開いてください

アンプリファイア: *~

音として聴くためのシグナル(dac~ に送り出すシグナル)は -1.0 〜 +1.0までの振幅範囲でなければなりません。この範囲を超える値は、dac~ によって( -1または1に)クリップされます。これは、サウンドの(ほとんどの場合非常に欠陥となる)ディストーション(歪み)を引き起こします。cycle~ のようないくつかのオブジェクトは、デフォルトでは同じ範囲で値を出力します。


cycle~のデフォルト出力の振幅は1です

シグナルのレベルをコントロールするためには、単に各サンプルに係数を掛ければよいだけです。例えば、シグナルの振幅を半分にするためには、0.5を掛けます(シグナルの振幅を2で割っても数学上は同じですが、コンピュータにとって乗算は除算より効率的な計算方法です)。


係数を掛けて調整された振幅

時間軸上で連続的にシグナルの振幅を変更したい場合、*~ の右インレットに振幅を変更するための係数を送ることができます。*~ の右インレットの値を連続的に変えることによって、サウンドをフェードイン、フェードアウトさせたり、クレッシェンドやディミヌエンドなどの効果を作ることができます。

しかし、振幅の急激な変化はシグナルの不連続性を引き起し、結果としてクリックノイズ(プチッというような雑音)を発生させてしまいます。


瞬間的な振幅の変化はシグナルにノイズによる歪みを生じます

そのため、振幅の変更には、各々のサンプル値がよりなめらかに(およそ数ミリセカンド間隔で線的に)変わっていくようなシグナルを使うと、たいていの場合良い結果を生みます。

ライン・セグメント・ジェネレータ:line~

振幅の瞬間的な変化(これは、シグナルの欠陥となる歪みを引き起こします。)の代わりに、1.0から0.5まで 5ミリ秒ごとに徐々に変化するシグナルを *~ の右インレットに与え、スタート時点の振幅とターゲットとなる振幅の間の補間を各サンプルごとに行なうと、なめらかな振幅変化が作り出されます。。


line~を用いた5ミリ秒ごとの線的な振幅の変化

line~ オブジェクトは、Maxオブジェクトlineと同じような機能を持ちます。line~ の左インレットでは、目的の値とそれに達するまでの所要時間(ミリ秒で)を受け取ります。line~ は、現在の値から目的の値まで直線的に変化するように各サンプルの適切な中間値を計算します。

技術的な詳細:シグナル全体におけるどんな増幅の変化の場合でも、振幅の変化が行なわれている間は絶えず多少の歪みをもたらします。(オリジナルのシグナルと比較すると、波形はその間に実際に変化します)。この歪みが欠陥と感じられるかどうかは、変化がどの程度突然か、振幅の変化がどの程度大きいか、オリジナルの波形がどの程度複雑かに左右されます。すでに複雑になっているシグナルにもたらされるわずかな歪みは、聞き手にとってあまり気にならないかもしれません。逆に、オリジナルのシグナルが非常にピュアな場合、ほんのわずかの歪みでも、それが部分音を付け加えてしまうため、音色の変化を引き起こします。

上の例では、サイン波の音の振幅は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”)というメッセージは、要求された振幅までボリュームを徐々に上げ、あるいは 0 まで徐々に下げるために使用され、同時に、startstop メッセージ を dac~ に送信します。この方法では、サウンドは瞬間的にオンになるのではなく、穏やかにフェードイン、フェードアウトします。


On、Offメッセージは dac~ startstop の前にオーディオのフェードイン、アウトを行います

オーディオがオフになる直前に、toggle からの 0 pack オブジェクトに送られ、オシレータのボリュームの100ミリ秒でのフェードアウトを開始します。さらに、フェードアウトを生じさせるために、dac~ stop メッセージを送信する前に100ミリ秒のディレイがかけられています。オーディオがオンになる直前に、要求された振幅値がトリガされ、ボリュームのフェードインが開始されます。しかし、この場合、実際にはフェードインは dac~ がスタートする直後まで開始されません。(実際のプログラムでは、startstopというメッセージボックスは、ユーザが直接クリックしないように非表示にするか、サブパッチでカプセル化する必要があるでしょう)。

まとめ

1以外の数値をオーディオシグナルの各サンプルに乗じると、オーディオの振幅が変化します。したがって、*~ オブジェクトはアンプリファイアとしての機能を持ちます。振幅の突然の強烈な変化はクリックノイズを引き起こすため、他のシグナルにで振幅をコントロールすることによって、より滑らかな振幅のフェードを得ることは、通常、賢明なやり方であると言えます。ラインセグメントジェネレータ line~ は、Maxオブジェクト line に似たもので、シグナル・ネットワークに対して線形に変化する値を与える場合に適しています。line~ *~ の組み合わせは、シグナル全体の振幅を制御するエンベロープを作るために利用できます。

参照

cycle~ テーブル・ルックアップ・オシレータ
dac~ オーディオの出力とオン、オフの切り替え
line~ リニア・ランプジェネレータ