チュートリアル32:table オブジェクト

インデックス付けされた数値の配列

チュートリアル 27 では数値をインデックス付けされた配列に格納するfunbuff オブジェクトを紹介しました。数値はインデックスナンバー(アドレス)を伴って格納され、アドレスを指定するだけで、好きなときに数値を呼び戻すことができます。同様に table オブジェクトは数値の格納や呼び戻しを行ないますが、さらに多くの機能を持っています。

グラフィカルな編集

table オブジェクトの最も特筆すべき機能は、グラフィックエディタウィンドウで、格納された数値を見たり、編集したりすることが可能な点です。

・Options メニューの All Window Active をチェックして、table オブジェクトを見ながら、同時に パッチャーウィンドウ 内をクリックできるように設定して下さい。

・パッチ1の最下部にある table オブジェクトをダブルクリックして下さい。テーブルウィンドウが開き、格納してある数値のグラフを表示します。

この tableは128 個の数値を含み、それらは0から127までのアドレスを持っています。アドレスは常に「0 〜 tableのサイズより1小さい数」です。この table は 0 から 127 までの可能な値の範囲を表示し、36から96までの範囲に値が格納してあります。

・パッチ1の最上部にある metro オブジェクトをオンにして下さい。counter は0 と 127 の間でカウントアップ、カウントダウンを行ないます。数値は、進行をグラフィカルに表示するためにある uslider オブジェクトを通過し、その後、 table オブジェクトの左インレットに送信されます。

table オブジェクトの左インレットの数値は、それ自身によってアドレスを指定し、そのアドレスに格納された値が左アウトレットから送信されます。tableの出力は2番目の uslider オブジェクトによってグラフィカルに表示されます。counter がカウントを重ねるにつれて、table の中の数値を見て、聞くことができます。

Get Info...

・名称未設定の table エディタウィンドウがまだ前面にある状態で、Object メニューから Get Info... を選び、table インスペクタを開いて下さい。

table インスペクタは、table オブジェクトのサイズ(記憶するアドレスの数)と表示される範囲を示します。また数値の表示に関する2つのオプションを持っています。Signed をチェックすると、テーブルウィンドウは正の値だけでなく負の値も表示します。また、Note Name Legend をチェックすると、y 軸の値を数値ではなく MIDI ノート名で表示します。

table オブジェクトの中の値の保存

注意深く入力した数値を失わないために、table オブジェクトの保存のためのオプションを理解しておくことが重要です。通常 table オブジェクト内に格納した値は、パッチャーウィンドウを閉じるとクリアされます。しかし、Save Table With Patcher をチェックしておけば、table オブジェクトの中の数値はパッチャードキュメントの一部として保存されます。再度パッチを開いた場合でも table オブジェクトは数値を格納したままになっています。この table オブジェクトでは、大切な値を保持しておくために Save Table With Patcher をチェックしています。

table オブジェクトの中の値を変更した場合、Max は パッチャーウィンドウ を閉じる際に変更を保存するかどうかを尋ねます。パッチャーウィンドウ を閉じる毎に、Max からのこの問い合わせが必要ない場合には、Don't Save をチェックして下さい。Don't Save では、明示的にSave Table With Patcher を用いて保存された値が消去されることはありません。単にそれ以降の変更を保存するかどうかを尋ねないだけです。

テーブルエディタウィンドウ が前面にある場合、File メニューから Save を選ぶと、その table の内容を別のファイルに保存することができます。その後、そのファイルをパッチで使用したいときには、table オブジェクトを作り、アーギュメントとしてファイル名を書き込むだけで、ファイルの内容が table オブジェクトの中にロードされます。

別ファイルとして保存されたtableの例がパッチ 3 にあります。ファイル Cmajor.t は、パッチャーウィンドウが開かれたときに、table オブジェクトの中にロードされます。テーブルファイルの名前に .t のような識別子を付けたほうが良いかもしれません。そうしておけば、テーブルファイルと パッチャーファイルを区別できます。

訳注:このチュートリアルのチュートリアルパッチでは、 table ファイルはテキストファイルとして保存され、ファイル名は、Cmajor-tab.txt になっています。table ファイルはテキストファイルとして保存、編集することが可能である点、Windows 環境では拡張子は3文字であり、この拡張子によってファイルの属性が違うものと解釈される可能性がある点、などを考慮しているものと思われます。このチュートリアルの記述のような .t という識別子を使う方法が良いかどうかは疑問ですが、何らかの識別子を使用することによってファイルを区別することは有効な方法でしょう。

table Cmajor-tab.txt (訳注:原書ではtable Cmajor.tオブジェクトとなっています)をダブルクリックして、その内容を見て下さい。Cmajor-tab.txt のテーブルエディタウィンドウを最前面にして、Object メニューから Get Info... を選び、table インスペクタを開いて下さい。

tableのサイズが 36(61鍵キーボードにおけるCmajorの音の数)であることがわかります。このファイルに対する変更の保存をすることは考えていないため、Don't Save がチェックされています。また、table は別ファイルとして保存されていて、パッチが開かれるときに読み込まれるだけで十分であるため、Save Table Witn Patcher オブションはチェックされていません。

table インスペクタを閉じ、パッチ3の buttonをクリックして、あらかじめ作成されてあるピッチのセットを読み通すためにlinetableが使用されている例を聞いてみて下さい。また、20から125までのベロシティのクレッシェンドを作るために同じline が使用されている点に注意して下さい。

正確に 1秒につき10音の割合で、3.5秒間で 0から35進むために、line オブジェクトに対して、必要な時間よりわずかに長い時間(3501ミリ秒)を与えるという、ちょっとしたトリックを使いました。これはなぜでしょうか? line によって、ある数値から他の数値までのすべての値を出力する完全なタイムランプを作るためには、2つの詳細なことがらについて知っておく必要があります。

その第1は、line は 開始値から直ちに補間を行ない、停止も、必然的に開始値の出力も行なわないということです。そのため、次の例で示されるような方法の内の1つを使って、3.5 秒で 0 から 35 までの出力を指定しても、望むような結果は得られません。


0に進みますが 0 は出力されず   同様な問題が生じます。  0 と 1 が直ちに出力されてしまいます。
 1からカウントされます。

第2は、 lineに ついて知っておくと役に立つことがらです。それは、line が 実際には指定されるより短い時間で行き先にたどり着くということです。line は「解像度のグレイン」(2番目のアーギュメント、または右インレットで自信した数値によって指定されるレート)によって指定された時間間隔で、中央インレットで指定された合計時間より少ない時間(訳注:すなわち、指定された合計時間の枠の内側)で数値を出力します。そのため、前の例では、実際には終了値 35 へは 3400 ミリ秒で到着してしまいます。わずかに長い時間を指定することによって、36 ステップ(最初の直ちに出力される値を含む)を 3500 ミリ秒で実行することができるため、最初のステップは 0 からスタートします。

新しいテーブルの作成

新しい テーブルファイルを作成するための簡単な方法は3つあります。

  1. File メニューの New サブメニューから Table を選び、新しい テーブルエディタウィンドウ を開いて下さい。必要な値を描いた後、File メニューから Save を選んで table ファイルを保存して下さい。

  2. 新しい table オブジェクトを作成して下さい。それによって、自動的に新しい テーブルエディタウィンドウが開きます。新しい tableは、テーブルエディタウィンドウを閉じる前に別のファイルとして保存するか、Save Table With Patcher をチェックすることによって、パッチの一部として保存することができます。

  3. File メニューの New サブメニューから Textを選び、新しいテキストウィンドウを開いて下さい 。table という語を入力した後に数値のリストを続け、その後ファイルを保存して下さい。

テーブルファイルを保存しておけば、新しい table オブジェクトを作成し、アーギュメントとしてそのテキストファイル名を書き込むことによって、そのテーブルファイルをパッチャーウィンドウの中で使用することができます。

Table ウィンドウ の描画

鉛筆ツールや、クリックした点と点の間に自動的に直線を描く直線ツールを使って、テーブル・エディタ・ウィンドウの中に数値を描くことができます。

選択ツールで値のリージョン(領域)を選択して、その値をカットまたはコピーし、その後、他のリージョンを選択して、そこに最初のリージョンをペーストすることができます。さらに、テキストウィンドウ、あるいはワードプロセッシング・アプリケーションから数値をコピーし、選択ツールで指定されたグラフィックテーブルウィンドウのリージョンにペーストすることも可能です。

・パッチ 1 の最下部にある table オブジェクトをダブルクリックして下さい。新しいメロディの曲線を描き、metro オブジェクトをオンにしてそれを聞いてみて下さい。

table オブジェクトを変更するその他の方法

table オブジェクトは左インレットへのメッセージの数値を理解することができます。詳細は Maxリファレンスマニュアルの tableの項を参照して下さい。パッチ 2 ではいくつかの異なったメッセージを示し、それぞれのメッセージが、グラフィックエディタウィンドウを開かずに table を変更する方法の実例を紹介しています。

tableに値を格納するためには、右インレットに値を送信し、その後、左インレットに、値を格納しようとするアドレスを送信します。また、左インレットに、アドレスと値をリストとしてまとめて送信することもできます。パッチ 2 では uzi オブジェクトを使って、tableに対して自動的にリストを送信しています。これによって、すべてのアドレスの持つ値が64 になります。

・パッチ2の table オブジェクトをダブルクリックし、 button オブジェクトをクリックして、すべてのアドレスに値 64 が格納されることを確認して下さい。

uzi オブジェクトは bang 、あるいは数値を受信すると、指定された数の bang をできるだけ速く左アウトレットから送信します。これらはすべて Max の内部クロックの1つのティックで行われます。また uzibang メッセージを出力しながらカウントし、そのカウントを右インレットから送信します。これは、連続したアドレスやテーブルの初期化の値などのような、一連のメッセージを「一斉に」送信したい場合に特に役に立ちます。uzi は 1 からカウントするため、ここでは、同じbang によってトリガされる 0 を別に送信しています。

"set "の後にアドレスと1つ以上の値を続けると、その値を指定されたアドレスから順に格納します。例えば、set 23 65 68 79 というメッセージでは、数値 65 がアドレス 23 に、68 がアドレス 24 に、79 がアドレス 25 に格納されます。

・ナンバーボックスからアドレス値を送り、set $1 を含んでいるメッセージボックスをトリガして下さい。テーブルエディタウィンドウでその結果を見て下さい。

・"size" の後に数値を続けると、tableのサイズ(アドレスの数)を設定します。ナンバーボックスから数値を送信して size $1 を含んでいるメッセージボックスをトリガして下さい。テーブルエディタウィンドウの中の変化を観察して下さい。

ここでは、他の接続も追加している点に注意して下さい。これによって、新しいサイズを設定した場合に、関連した他のオブジェクトにも変更を行ない、tableとの相互作用が適切に行なわれるようになっています。

MIDI 値のための table オブジェクトの使用

パッチ1 では、table の中の値を使用してnoteout オブジェクトにピッチとを供給していました。パッチ 2 では line オブジェクトを使用して、様々なスピードで table オブジェクトを読み通し、異なったピッチベンドのカーブを出力しています。

ノートオンのベロシティはそれぞれ40 を掛けられ(40から5080までの値を取る可能性を与えられ)ます。この値は line オブジェクトが table オブジェクトを読み通すための処理時間として使用されます。ノートをより強く演奏した場合、linetable をよりゆっくりと読み通してピッチベンド値を送信します。

入力される数値の再構成を行ない、 2 つの異なったメッセージを送信するためのメッセージボックスの使用法に注目して下さい。パッチ 3 と異なり、ここではline オブジェクトのタイミングについては、あまり気にかけません。それは、演奏されるベロシティのばらつきが大きく、line オブジェクトから出力される値が全く予測できないためです。

・ ここで説明した方法を使って tableの値を変更するか、または、 自分自身でtable にカーブを描き入れて下さい。MIDI キーボードで、長い音や様々なベロシティによってメロディをを演奏し、様々な速さのピッチベンドを聞いてみて下さい。

まとめ

table オブジェクトはインデックス付けされた数値の配列を格納したり、呼び戻したりします。table オブジェクトをダブルクリックすると、格納された数値をグラフィカルに見ることや、編集することができます。

通常、table オブジェクト中の値は パッチャーウィンドウを閉じたときに破棄されます。しかし、Object メニューから Get Info... を選び Save Table With Patcher をチェックすることによって、table中の値をパッチの一部として保存することができます。また、table オブジェクトを別のファイルとしても保存することも可能です。 table オブジェクトを作成し、そのファイル名をアーギュメントとして書き込むことによって、これをパッチの中で使用することもできます。

新しい テーブルウィンドウを開くためには、New メニューから Table を選択するか、パッチャーウィンドウ内に新しい table オブジェクトを作成します。テキストウィンドウで “table” という語の後に数値のリストを続け、これをファイルとして保存することもできます。

グラフィックエディタウィンドウを開かずに table オブジェクトの中に数値を格納するためには、右インレットに値を送信し、その後、左インレットに値を格納するアドレスを送信します。また、その代わりにアドレスと値をリストとして、左インレットへまとめて送信することもできます。

set メッセージは table の中の特定のアドレスにある値を変更し、size メッセージはtableが保持できる値の数を変更します。

uzi オブジェクトは指定された数の bang メッセージを、Max の内部クロックの1つのティック内で、可能な限り速く送信します。また、uzibangメッセージのカウントや、カウントの送信が可能なため、連続したメッセージ全体を一瞬のうちに送信する場合に使用することができます。

参照

table 配列をグラフィカルに格納、編集します。
uzi

指定された数の bang を送信します。

テーブル table オブジェクトの グラフィックエディタウィンドウを使用します。