チュートリアル31:タイマの使用

時間の処理

これまでに、一定の間隔で bang を送信する metro オブジェクト、および2つのイベント間の経過した時間を報告する timer オブジェクトという2つのタイミングオブジェクトを使用してきました。この章では、指定された時間の中で数値の進行を生成するオブジェクトをいくつか紹介します。

clocker

clocker オブジェクトは、metro オブジェクトと同様なものですが、指定された時間間隔で、bang を送信するのではなく、オンにされてから経過した時間を送信します。この情報によって、時間の経過と関連して値を変化させることができます。

パッチャーウィンドウ の A と表示された部分では、clockerが経過した時間を報告し、この情報がマップされて、徐々に増加する値がシンセサイザのモジュレーションホイールに送信されています。時間が 6 秒経過すると、値は 0 から6000まで増加し、コントロール値は 0 から 127 まで増加します。コントロール値が 128 になると clockersel によってオフにされます。その結果、シンセサイザ上では、モジュレーション効果が 6 秒間でリニアにフェードインすることになります。

int オブジェクトは、* オブジェクトが出力する floatの値を整数に丸めるために使われています。これによって、sel オブジェクトは正確な比較を行なうことができます。

counter

counter自体はタイミングオブジェクトではありませんが、counterは受信した bang の数をカウントするため、頻繁に metroと組み合わせて使用されます。metro - counterの組み合わせは、繰り返しの値をインクリメント(増加)、あるいはデクリメント(減少)させるための効果的な方法です。

パッチャーウィンドウ の B と表示された部分で、counterの第1アーギュメントはカウントする方向を指定しています。0は増加を指定します。(1は減少を指定し、2は増加と減少を繰り返すことを指定します)。第2アーギュメントはカウントの最小値を、第3アーギュメントは最大値を設定します。

注:counter オブジェクトのアーギュメントの表す意味は、アーギュメントの数によって変わります。詳細は Max Reference Manual の counterを参照して下さい。

カウントは左アウトレットから送信されます。最大値( 127 )に達すると、counter オブジェクトは右側中央のアウトレットから 1 を送信します。この1 は selによって検出され、metro をオフに切り替えます。この方法は clockerを使用した場合と同じ効果を得ることができます。しかし counterでは、毎回乗算を実行することなく、簡単に数値を望む範囲内(この場合では 0から127)に収めることができます。コンピューターにとって、乗算はカウントを増加(インクリメント)させるよりも長い時間を必要とします。

metro オブジェクトのスピードは 47ミリ秒に設定されているため、 0から127までの進行は5.969秒 で完了します。これは(この方法を使う場合)可能な限り6秒に近いと言えます。

line

line オブジェクトも、開始値から終了値までのリニアランプ(線形傾斜)上の値を、指定された処理時間内で出力します。第1アーギュメントは開始値、第2アーギュメントはグレイン(数値が出力される時間間隔)をセットします。中央インレットで処理期間(ランプタイム)が受信され、左インレットで終了値が受信されると、lineは指定された処理時間の間に開始値から終了値へリニア(線形)に進行する数値を出力します。

各インレットへの数値は、リストにまとめて左インレットで受信することもできます。

処理時間が同時に受信されずに、左インレットで数値が受信された場合、lineは直ちに新しい値にジャンプして値を出力します。開始値は set メッセージ(set という語の後に数値を続けたメッセージ)によって、出力をトリガすることなく line>へ送信することができます。


開始値を 0 に設定し、それから6 秒間で 127まで進行します。 数値は 47ミリ秒ごとに出力されます。

スタック・オーバーフロー

「処理しなければならない仕事のリストが増大する速さが、実際に仕事を処理し終えるよりも速い」と感じた経験はないでしょうか? Max がこのような事態になった場合、オーバーロード(過負荷)状態に陥ってしまうと考えられ、その結果、Max が処理しなければならないタスクのリストのサイズが、そのリストを格納するスタックとして利用できるメモリの量を超える「オーバーフロー」が生じます。これが「スタック・オーバーフロー」と呼ばれるもので、 Max の内部のスケジューラのシャットダウンを引き起こし、オーバーフローの原因を修正するまで、時間指定を伴った動作の実行は停止されます。

 

スタック・オーバーフローを引き起こすケースの1つは、オブジェクトの出力を入力に戻してしまうことです。例えば、数値をできるだけ速くインクリメント(増加)させたいと思う場合、counter が自分自身を振り出しに戻すように、オブジェクトの出力をそれ自身の入力にフィードバックして、繰り返しカウントをインクリメントさせたくなるかもしれません。しかし、このような自動的な繰り返しには、少なくとも 1〜 2 ミリ秒の間隔を空けなければなりません。そうでないと、Max が生成する繰り返し処理があまりにも速すぎるため、実行が追いつかず、「スタック・オーバーフロー」エラーというダイアログを表示させる結果なってしまうでしょう。このような状態に陥ってしまった場合には、Edit メニューから Resume を選び、Max のスケジューラを再スタートさせなければなりません。

・パッチD とE は、結果的にスタック・オーバーフローを引き起こす状況の2つの例を示しています。もし Max を不幸な目に合わせたければ、ボタンをクリックして下さい(やってみて下さい。何かが壊れるという心配はありません)。Max を再びスタートさせるためにResume コマンドを選ぶことを覚えておいて下さい。

tempo

tempo オブジェクトはもう1つのメトロノームです。しかし、clocker, metro, line オブジェクトで必要とされるミリ秒単位の指定をするのではなく、もっと伝統的な音楽用語を用いて操作します。tempo オブジェクトの第1アーギュメント(あるいは中央左インレットで受信される数値)は 、伝統的なメトロノームと同じように、 beats per minute (つまり、1分あたりの4分音符の数)という考え方でテンポを設定します。

訳注:beats per minute (B.P.M)は、厳密には、必ずしも4分音符とは限らないのですが、4分音符の場合が多いのも事実です。

2番目、3番目のアーギュメント(あるいは中央右インレット、および右インレットに与えられる数値)は全音符に対する分割を指定し、tempo はこれをメトロノームの刻みの送信に使用します。例えば、第2、第3アーギュメントが 1と16なら、全音符に対する分割は16分の1となり、tempo オブジェクトは、指定された4分音符の速さに基づいて、各16分音符に対して0から15の数値を送信します。2/3という分割の値の場合、2 分音符で書かれる3連符による刻み(全音符の2/3毎の刻み)を送信します。

tempo オブジェクトによって送信される数値は、常に 0から始まり、分割するパルス(3番目のアーギュメント)より1小さい数までになります。可能な分割の最大値は 96(64分音符で書かれる3連符)です。 tempo オブジェクトが数値(パルス・インデックスのようなもの)を送信するということは、1小節の中で、それぞれのパルスに対して異なった動作を割り当てることが可能であるということを意味します。この方法によって、拍節に基づいた自動的なプロセスを生成することができます。

パッチ F で、tempo オブジェクトは、テンポ 80 で各 16分音符に対して数値を送信し、小節内のパルス毎に異なったピッチとベロシティをトリガします。ピッチは上昇するオーギュメント・トライアド(増3和音)のアルペジオになり、ベロシティは4/4 拍子の強拍で強く、弱拍で弱くなります。

・ シンセサイザでベロシティ付きサウンドの設定を選び、tempo オブジェクトをオンにして下さい。

外部からのタイミング

metro, line, clocker, tempo オブジェクトは、Max が内部に持っているミリ秒によるタイマ以外の、他のタイミングソースと同期させることができます。タイムコードジェネレータ、外部シーケンサ、あるいは他のソフトウェアシーケンサのようなものがそれにあたります。詳細は、このマニュアルのObjectセクションにある setclock オブジェクトや、個々のオブジェクト名の箇所を参照して下さい。

訳注:このマニュアルではなく、Max リファレンスマニュアルの各オブジェクト名、及び、setclock オブジェクトの箇所を指していると思われます。

まとめ

clocker は、オンにされると、一定の間隔で経過した時間を送信します。時間の値は、時間の経過に従って他の範囲にマップすることができます。

counter は、受信した bang の数と送信したカウントを保存します。カウントは指定された範囲に制限することができ、counter を指定したスピードで増減させるために、 metro を用いて bang メッセージを繰り返し供給することができます。これは時間時間の経過にしたがって特定の数値の進行を作り出すもう1つの方法です。

line オブジェクトは数値のリニアな進行を生成する3番目の方法です。line オブジェクトは開始値から終了値までのランプ(直線的な傾斜)の数値を出力し、指定された処理時間で新しい値に達します。

繰り返しの間に何らかのディレイを伴わない、再帰的な手段による数値のインクリメントは、結果としてスタック・オーバーフローエラーを引き起こし、Max に内部のスケジューラを停止させます。Edit メニューから Resume を選ぶとスケジューラは再スタートします。

tempo オブジェクトは、beats per minute や拍の分割などの伝統的な音楽の語法を用いてタイミングを指定することができるメトロノームです。このオブジェクトは、1小節中の各パルスに対して異なる数値を送信するため、それぞれのパルスの数値によって異なったアクションをトリガすることができます。

metro, line, clocker,tempo オブジェクトは、シーケンサーやタイムコードジェネレータのなどの外部タイミング・ソースに同期させることが可能です。

参照

clocker 一定の間隔で、経過した時間を出力します。
counter 受信した bang の数を数えて、カウントを出力します。
line ある値から他の値までのランプ内の数値を出力します。
metro 一定の間隔で bang を送信します。
setclock タイミング・オブジェクトのクロック・スピードをリモート・コントロールします。
tempo メトロノーム的なテンポで数値を出力します。
timein 外部のタイムコード・ソースからのタイムを報告します。