チュートリアル41:
Max メッセージのタイムライン

スコアを書く

オーケストラ音楽の作曲家は、すべての演奏者の行為を1つのスコアに書き表します。そのため、あらかじめ予定されたすべてのイベントを同時に見ることができ、時間軸上で組織化することができます。コンピュータ・ミュージックの作曲家は、多くの場合、同じ目的のためにMIDI シーケンス・プログラムを使用します。Max には、スコアとシーケンサーを組み合わせた timeline オブジェクトがあります。

Max のタイムラインは 、Max メッセージのマルチトラック・シーケンサです。シーケンス内の各トラックは Max パッチャー(アクションパッチとして参照されます)で、各トラックに配置されたイベントは、アクションパッチの中の特定のオブジェクトに対して、指定したタイミングで送信されるメッセージです。そして、ちょうど、あらかじめ記録されたシーケンス(またはインポートされた MIDI ファイル)を seq オブジェクトによって読み込み、パッチャー内で再生できるように、あらかじめ記録されたタイムラインを timeline オブジェクトによって読み込み、パッチャー内で再生することができます。

・このチュートリアルのタイムラインを正しく動作させるために、Option メニュー内の Overdrive の設定がチェックされているかどうかを確認して下さい。

・このチュートリアルのサンプルパッチを開いた場合、他に2つのウィンドウが同様に開きますが、これらのウィンドウはパッチャーウィンドウ の背後に隠されています。その1つはタイムライン用のグラフィックエディタウィンドウ、もう1つは Quick Time ムービーウィンドウです。

注: Quick Time 機能拡張がシステムにインストールされていない場合、Quick Time ムービーウィンドウは表示されません。その場合、この章を読むにあたってはムービーに関する説明を無視して下さい。

このパッチは2つの主要な構成要素を持っています。ウィンドウの右側には、あらかじめレコーディングされたシーケンス(tutorial41.sc という名前のファイルから自動的に読み込まれます)を含む seq オブジェクトがあります。この seqmenu オブジェクトから送信されるメッセージ、または任意の場所の send seqcmd オブジェクトから遠隔的に送信されるメッセージによってコントロールすることができます。seq に送信されるあらゆるメッセージは、同時に midiflushbang を送信し、seq が停止、あるいは再スタートされた時点でオンのままになっているノートをオフにしている点に注意して下さい。


midiflush で受信される bang によって、オンのままになっているノートをオフにします

ウィンドウの左側には、あらかじめ記録されたタイムライン(tutorial41.ti という名前のファイルから自動的に読み込まれます)を含む timeline オブジェクトがあります。timeline を取り巻く他のオブジェクトは、timeline にコントロール・メッセージを送信するものや、timeline の出力の処理を扱うものです。すぐ後でパッチのこの部分に戻って説明したいと思います。

タイムラインウィンドウ

timeline オブジェクトをダブルクリックして(あるいは Windows メニューから tutorial41.ti を選んで)タイムラインのグラフィックエディタウィンドウを最前面に移動させ、タイムラインの内容を見て下さい。

このタイムラインには2つのトラックがあります。トラック1にはアクション・パッチに送信するイベントが含まれています。トラック2にはタイムライン上にある特定の重要なポイントをマークするためのマーカーだけがあります。最初のトラックには様々なイベントエディタがありますが、それぞれのイベントエディタは1つ、または複数のイベント(メッセージ)を含み、このイベントが特定の時間にトラックのアクションパッチに送信されます。アクションパッチには ticmd オブジェクトがあり、(メッセージがインレットを通じて送信された場合と同じように)メッセージを受信します。そして、このメッセージがパッチで使用されます。

例えば、seqcontrol start というテキスト持つイベントエディタは messenger と呼ばれるもので、 start メッセージをアクションパッチ内の seqcontrol という名前の ticmd オブジェクトに送信します。ticmdseq オブジェクトに接続され、seqticmd からの start メッセージを受信します。このため、タイムラインが動作を開始してから 4 秒後に seqcontrol start イベントによってシーケンスが開始されることになります。

タイムラインのイベントはメッセージを送信し・・・

そのメッセージはトラックのアクション・パッチ内のticmd オブジェクトのアウトレットから送信されます

しかし、これらのメッセージを受信し、動作するアクションパッチはどこにあるのでしょうか?アクションパッチは、作成・保存されている他のパッチと同じようなハードディスク上の Max ドキュメントで、 Max のサーチパス内の任意の場所に置くことができます。このケースでは、チュートリアルのパッチとして同じフォルダ内( Max Tutorial フォルダ)に置かれています。また Max フォルダの中には tiAction と呼ばれる特殊なフォルダがあり、その中にアクションパッチを保存すると、タイムラインのTrack というポップアップメニューに表示させることができます。いずれの場合でも、タイムラインはファイルを検索し、イベントの1つのトラックによって使用されているメモリにロードします。タイムラインの中でアクションパッチを見る(さらに編集する)ことが可能です。

アクションと ticmd

・トラック1の左にある小さな Max アイコンをダブルクリックして、アクションパッチを見て下さい。

アクションパッチには、タイムラインからのメッセージを受信するために、1つあるいは複数の ticmd オブジェクトが含まれています。それぞれの ticmd オブジェクトは名前(第1アーギュメント)を持ち、さらに受信するメッセージの型を指定しています。アクション内のそれぞれの ticmd の名前は、タイムライントラック上に,可能なイベントとして表示されます。例えば、アクションの A と B の部分を見ただけで、タイムライン上には、それぞれの ticmd オブジェクトにint の値を送信する pitchvolumebend という名前のイベントが含まれていることがわかります。

タイムラインの中のあらゆる volume イベントは、MIDI コントローラー 7 へのメッセージの値として( ticmd volume i オブジェクトを経由して)送信され、シンセサイザのボリュームを変更します。同様に、タイムラインの中の、あらゆる bend イベントは、 MIDI ピッチベンド・メッセージとして送信されます。pitch イベントは 200ミリ秒のノートとして、64 〜127からランダムに選ばれたべロシティで演奏されます( 0 から 64までの乱数が選ばれ、その後、 makenote のべロシティインレットに送信される前に 64 が加えられます)。

アクションパッチは、すべてのイベントを自分自身で処理する必要はありません。このアクションの C と D の部分で行なわれているように、ticmd のアウトレットを send オブジェクト、あるいは tiout オブジェクトに接続することによって、単に他の場所へ送信することも可能です。

tiout オブジェクトは、インレットで受信したあらゆるメッセージを、timeline オブジェクト自身の、指定されたアウトレットに渡します。そのため、ここではタイムラインからの note と scalespeed イベントは 、41.Timeline パッチの中にある timeline オブジェクトのアウトレットから送信されます。(アクションパッチのtiout オブジェクトを、サブパッチのoutlet オブジェクトと同様なものと考えれば、その有用性がわかるでしょう。tiout は、自分自身が含まれる timeline のアウトレットからメッセージを送信します。)また、アクションパッチの中で、seqcontrol メッセージが直接 seq オブジェクトに行くわけではなく、 send seqcmd オブジェクトに行くこともわかります。このように、実際には、メッセージは receive seqcmd オブジェクトさえあれば、どこへでも出力することができます。これは、タイムラインが、自分自身のアクションパッチ以外のパッチャーと通信を行なうことを可能にするためのもう一つの方法です。

thistimeline

アクションパッチで利用できるもう1つの機能であるthistimeline オブジェクトについて見てみましょう。アクションパッチの中の thistimeline オブジェクトによって受信されたあらゆるメッセージは、そのアクションパッチを含んでいるタイムラインに送信されます。この方法によって、タイムラインは自分自身に対してコントロール・メッセージを送信することができます!このチュートリアルで示されているアクション・パッチのEの部分には、タイムラインからの gotogotoA イベントを処理するための2つの ticmd オブジェクトがあります。

タイムラインが gotoA イベントに到達する(そして Ggate が適切なアウトレットを指している)と、gotoA イベントから送信される bang によって、search SectionA と書かれたメッセージボックスがトリガされ、メッセージをタイムラインに送信します。すると、タイムラインは SectionA と呼ばれるマーカーを探し、見つかった場合には自分自身をそのマーカーの位置に移動させます。タイムラインが goto イベントに到達する(そして gate が開いている)と、(タイムライン上のポイントをミリ秒単位で指定している)数値が locate $1 と書かれたメッセージボックスに送信され、これによってタイムラインは自分自身をそのポイントへ移動させます。どちらの場合も、新しいポイントに自分自身を移動させた後、タイムラインは演奏を続けます。

ユーザがタイムラインの動作に関する多少のコントロールができるように、このアクション・パッチでは、シンセサイザのモジュレーションホイール(コントローラ 1)を使って、gotoA および goto メッセージをブロックしたり、通過させたりするようになっています。gotoA メッセージは直前のモジュレーションホイールの値が 0 の場合にのみ Ggate の適切なアウトレットから送信され、goto メッセージはモジュレーションホイールが非 0 の位置にある場合にのみ、gate を通過するという点に注目して下さい。

タイムライン・スコアを読む

・ 再びタイムラインエディタウィンドウを見ることができるように、tutorial.ac ウィンドウを閉じて下さい。 すでに、アクションパッチで行なわれていることを見てきたため、ここでは、タイムラインが演奏されるときに何が起こるのかを理解することができます。最初の4 秒間にはピッチイベントで満たされたテーブルがああり、これによって 4 秒間にわたってピッチイベントが1つずつ送信されます。(値を持ったテーブルは、 etable イベントエディタによって、タイムライン上のイベントとして配置されます)。さらに、ボリュームイベントのグラフもあり、これも同様に、イベントエディタ(efunc として知られています)によって確保された時間全体にわたって連続的に送信されます。

タイムラインで 4 秒が経過すると、seqcontrol イベントがメッセージ start を送信します。すでに見てきたように、この start メッセージはタイムラインから、アクションパッチ内のticmd seqcontrol s オブジェクトに送られ、それが、アクションパッチ内の send seqcmd オブジェクトから 41.Timeline パッチの中の receive seqcmd オブジェクトへと送られます。

・ウィンドウを右にスクロールして、タイムラインの残りを見て下さい。

タイムライン上の 8000ミリ秒( 8 秒)の時点では、同時に発生する複数のイベントが現れます。トラックの左側部分の、ちょうどトラック名の下あたりでマウスを押し下げたままにすると、ポップアップメニューが表示され、イベントの正確な時刻を調べることができます。

このイベントのリストから gotoA bang イベントが他のイベントの直前に発生することがわかります。アクションパッチを調べると、シンセサイザのモジュレーションホイールが 0 の位置にある場合、この gotoA bang イベントによってタイムラインが SectionA マーカーへ移動することがわかります。タイムラインはモジュレーションホイールが新しい位置に動くまで 4000から 8000の間をループし続けます。

gotoA bang イベントが到着したときにモジュレーションホイールが非 0 の位置にある場合、メッセージはアクション内の Ggate の左アウトレットから出て行かないため、タイムラインは通常の進行を続けることができるようになります。そして、タイムラインは、(messenger オブジェクトからの)ノートイベント、emovie イベント(アクション内の movie オブジェクトに直接送信される start メッセージ)、bend イベントで満たされた etable (1つずつ送信される連続した int )を送信します。10000の時点で、タイムラインは goto 8001 イベントを送信し、(モジュレーションホイールが 0 の位置に戻っていない場合)自分自身をタイムライン上のその時点に移動させます。

これによって、タイムラインの 8002 の時点でムービーがスタートし、4つのノートによるコードが演奏され、ピッチベンドが始まります。そして、10000の時点でタイムラインは自分自身を 8001に移動させ、10000の時点でモジュレーションホイールが 0になるまで演奏を続けます。

注: 正しいタイミングでMIDI データの送信を行なうために必要なため、Overdrive オプションがチェックされています。このため、Quick TimeムービーはCPU スピードによっては、ガタガタと、あるいは断続的に動くかもしれません。

アクションパッチの中で、タイムラインから受信した note メッセージ(上の例では、4つの要素からできているリスト)を、timeline オブジェクトの第2アウトレットから送信することによって呼び戻すこともできます。

・ 41.Timeline パッチャーウィンドウ を最前面に戻し、これらの note メッセージに何が起こっているかを見て下さい。

タイムラインから note メッセージとして送信されたリストは timeline オブジェクトの第2アウトレットから出力され、unpack オブジェクトによって個別の数値に分けられます。それぞれの note メッセージの最初の3つの数値は直接 noteout オブジェクトに送られ、MIDI ノートオン・メッセージのピッチ、べロシティ、チャンネル情報として使用されます。また note メッセージの1番目、3番目、4番目の数値は pipe オブジェクトに送られ、4番目の数値は、他の数値を送信する前にディレイさせる時間をミリ秒で表した値として使用されます。

pipe オブジェクトの第2インレットには何も送信されないため、第2アウトレットから出て来る数値が常に 0 になることに注意して下さい。これらのディレイされた数値は noteout に送られ、ノートオフ・メッセージを供給します。これは、ノートオフを供給するための便利な方法で、ノートのデュレーションを指定し、その値を2番目のベロシティ 0 の値を持ったノートメッセージのディレイタイムとして使用します。これは、makenote オブジェクトを使用した場合とよく似ていますが、チャンネルナンバーも同様にディレイすることができます(これは、makenote では行なうことができません)。

タイムラインの演奏

これまでで、タイムラインの中の様々なイベントが何を行なうかを理解し、演奏する際のちょっとした良いアイデアも持っていることでしょう。最初の 4 秒間では、pitch テーブルのノートが演奏され、そのボリュームが volume グラフによって調節されます。タイム4000 から 8000 の間、シンセサイザのモジュレーションホイールが動かされるまで、tutorial41.sc のシーケンスが繰り返し演奏されます。そして、タイム 8002 では、コードが演奏され、ピッチベンド・メッセージが bend テーブルから送信され、QuickTime ムービーが再生されます。タイム 8000から 10000 までは、モジュレーションホイールを 0 に戻すまで繰り返されます。

・Windows メニューを使用して、Quick Time ムービーウィンドウを最前面に移動させて下さい(ウィンドウをスクリーンの右上隅にドラッグすると、パッチャーウィンドウを同時に見ることもできます。)。Option メニューの All Window Active コマンドをチェックして、ムービーウィンドウが前面ある状態で、パッチャーウィンドウ内のオブジェクトをクリックできるようにして下さい。

・タイムラインを演奏するには、パッチャーウィンドウ内にある play と書かれたメッセージボックスをクリックします。SectionA のシーケンスの繰り返しに飽きたら、モジュレーション・ホイールを動かして下さい。タイムラインは Coda セクションに進みます。タイムラインを停止するためには、パッチャーウィンドウ の stop メッセージをクリックして下さい。最初に戻るためには、locate 0 と書かれたメッセージボックスをクリックするか、パッチャーウィンドウのポップアップ menu から Intro を選んで下さい。

タイムラインのテンポ・コントロール

clockerlinemetropipetempo オブジェクトのように、timeline オブジェクトは setclock オブジェクトに同期させることができます。その場合、テンポは Max の標準のミリ秒クロックではなく、setclock オブジェクトによってコントロールされるようになります。

clock scalespeed と書かれたメッセージボックスをクリックして下さい。このメッセージは timeline オブジェクトに対して、 setclock scalespeed mul オブジェクトと同期するように指示します。locate 0 と書かれたメッセージボックスをクリックしてタイムラインを「巻き戻し」、play をクリックして下さい。Introセクションのテンポが若干変化することに気がつくでしょう。

mul ア−ギュメントを持つ setclock オブジェクトは、左インレットで数値を受信すると、その数値によって クロック値を乗算(言い換えれば、テンポを除算)します。このケースでは、timeline 自身によってテンポが変更されます。具体的には、タイムラインのIntro セクションにある scalespeed イベントエディタ(float オブジェクト)が、アクションパッチ内の ticmd scalespeed f オブジェクトに数値を送信し、その数値が(tiout 1 オブジェクトによって)timeline オブジェクトの第1アウトレットから送信されます。

タイムライントラックの scalespeed イベントは、アクションパッチ内のticmd オブジェクトで受信され、timeline オブジェクトの第1アウトレットから、timeline のテンポを変更する setclock に送信されます。

上の例は、主として、timelineオブジェクトの自己をコントロールする機能や、tioutsetclock オブジェクトの操作のデモンストレーションのために置かれているもので、やや複雑な状況になっています。しかし、setclock のテンポ変更のための数値は、slider や MIDI コントローラのような、他の任意のソースから(数値を float の適正な範囲にマップする適切な演算を行なうことによって)送信することが可能です。

timeline を標準のミリ秒クロックに従う状態に戻したい場合は、clock と書かれたメッセージボックスをクリックして下さい。

パッチの中で、まだ説明していない部分が1つだけ残っています。timeline はメッセージ marker 3を受信(これは、パッチがロードされる際に行われます)すると、それぞれのマーカーの最初の単語を第3アウトレットから送信し、それが menu オブジェクトに格納されます。この menu を使って、timeline を直ちに任意のマーカーの位置に移動させることができます。

menu を使用して、タイムラインの中の指定されたセクションへジャンプしてみて下さい。これは、タイムラインの演奏中に行なうことができます。

タイムラインの編集

このチュートリアルの例で使われているタイムラインは、前もって編集され、tutorial41.ti というファイル名で保存されています。グラフィックエディタウィンドウを最前面に移動させ、タイムラインを変更することができます。例えば、Intro セクションの中の volume グラフは、単にコントロールポイントをクリック&ドラッグするか、コントロールポイントのない場所をクリックして新しいポイントを作成することによって変更できます

・intro セクションにあるピッチ用の etable エディタをダブルクリックして下さい。テーブルエディタウィンドウが表示され、pitch テーブルの値を変更することができます。

テーブルエディタウィンドウには intropitchesというタイトルがあることに注意して下さい。これは、この特定の etable がアクションパッチの中の table intropitches オブジェクトにリンクされているからです。タイムライントラックに etable (あるいは efunc )イベントエディタを作成した場合、これを選択し、Object メニューから Get Info... コマンドを選んで、エディタのTable Label としてオブジェクト名を書き込むことによって、既存の table オブジェクト(efunc の場合にはfunbuff オブジェクト)にリンクすることができます。その後は、etable 内で行なわれた変更は、リンクされている table オブジェクトに反映されます。その逆も同様です。

タイムライントラックに新しいイベントを配置するためには、トラックのイベント部分の中のイベントを配置したい場所で、Macintosh では [Option] キー、Windows では [Alt] キーを押し下げたままマウスをクリックします。そのトラックが使用しているアクションパッチ内の ticmd オブジェクトに基づいて、トラック内に配置することが可能な、すべてのイベントのポップアップメニューが表示されます。特定のイベントに対して複数のエディタがある場合(例えば、int 型のイベントは、int etableefunc エディタを使って配置することができます)、エディタはサブメニューとして表示されます。ポップアップメニューから必要なイベントを選んで、そのイベントから ticmd オブジェクトに送信したいメッセージを入力します。

・トラック1の 4000のポイントに note イベントを配置してみて下さい。ウィンドウの最上部にあるインジケータがカーソル位置を 4000 と表示するまで、トラックのイベント部分でマウスで移動させて下さい。トラック内(他のイベントが邪魔をしない、空白の部分)で、Macintosh では [Option] + クリック、Windows では [Alt] + クリックし、ポップアップメニューから note イベントを選んで下さい。messenger イベントエディタが表示され、その中にノート情報を書き込むことができます。これまで見てきたように、note イベントは、「ピッチ べロシティ チャンネル デュレーション」というフォーマットによる4つの要素を持ったリストでなければならないため、26 96 1 1000 と書き込み、低いE をチャンネル1で1秒間演奏するようにして下さい。

ウィンドウの最上部にあるテープレコーダスタイルのコントローラを使用すると、グラフィックエディタウィンドウから離れずに作成したタイムラインを演奏できます。

まとめ

タイムラインはマルチトラック・シーケンサで、その個々のトラックは指定されたアクションパッチ内の ticmd オブジェクトにメッセージを送信します。タイムライン上の必要な位置で、Macintosh では [Option] + クリック、Windows では [Alt] + クリックすることによって、ノンリアルタイムでトラック内にイベント(メッセージ)を配置することができます。メッセージはアクションパッチ内の ticmd オブジェクトから出力され、アクションパッチ内部で使用することも、あるいは send オブジェクトや tiout オブジェクトによって他の場所に送信することもできます。

Max メッセージの「スコア」がタイムライン上で構成された後は、ファイルとして保存することができ、そのファイルをtimeline オブジェクトに読み込むことによって、パッチャーからアクセスすることができます。単にplay メッセージを timeline オブジェクトのインレットに送信するだけで、タイムラインを演奏することができます。また locate メッセージで、あるいは search メッセージでマーカーイベントを検索することによって、タイムラインの特定の時間位置に移動することもできます。

アクションパッチでは tiout オブジェクトによって、timeline オブジェクトのアウトレットからメッセージを送信することができます。また、アクションパッチは、自分自身が属するタイムラインをthistimeline オブジェクトによってコントロールすることができます。timelineのテンポは、setclock オブジェクトに同期させ setclock にメッセージを送信する(timeline 自身からの送信も可能です)ことによって、リアルタイムでコントロールできます。

参照

setclock タイミング・オブジェクトのクロック・レートを変更します。
thistimeline timeline から自分自身にメッセージを送信します。
ticmd タイムラインからのメッセージを受信します。
timeline 時間ベースの Max メッセージのスコア。
tiout timeline オブジェクトからメッセージを送信します。
Timeline (Max トピックス) Max メッセージのグラフィックスコアの作成