|
Quick Links
Categories
XML/RSS Feed
Statistics
Total entries in this blog:
Total entries in this category: Published On: 10 01, 2005 11:59 午前 |
1005 : Maxビギナーズ・チュートリアル(003) : 佐近田展康------------------------------------------------------------------------
DSPマガジン 2003.02.24 No.1005 ------------------------------------------------------------------------ Maxビギナーズ・チュートリアル(003) メッセージの処理 佐近田展康 Maxではパッチ・コードを通ってオブジェクトからオブジェクトへ受け渡されるものを総称して「メッセージ」と呼びますが、それにはいくつかの種類があります。 bang(バン) int(整数) float(実数) list(リスト) symbol(シンボル) がそれで、これらを組み合わせるなどして作られ、はっきりと分類できないものは単に message(メッセージ) と呼ばれます。 【sample3-1】は、次々とメッセージの種類が変換されながらオブジェクトからオブジェクトへと受け渡されているパッチ例です。まず"Click!"と書きこまれたメッセージ・ボックスをクリックすると、このオブジェクトは"Click!"というメッセージを出力します。これは文字列ですのでメッセージの種類としてはsymbolに分類されます。 次にbuttonオブジェクトはインレットに受け取ったあらゆるメッセージをすべて"bang"に変換して出力します。bangは一見して文字列と同じに見えますが、Maxではオブジェクトに動作のきっかけを与える特殊なメッセージになります。 buttonオブジェクトのアウトレットからはパッチ・コードが2本引かれており、2つのrandomオブジェクトに等しくbangが渡されます。すでに紹介したrandomオブジェクトはこのbangを受け取ると乱数を出力するわけですが、それは整数でありメッセージの種類としてはintに分類されます。出力メッセージの具体的な内容を見るために整数を表示するナンバー・ボックスを使っています。 floatオブジェクトは受け取った整数をそのまま実数に変換し、*オブジェクトはアーギュメントとして書かれた0.5を掛け算しますので、ここでメッセージの種類は小数点付きの実数つまりfloatになります。出力メッセージの具体的な内容を見るために実数を表示するフロート・ナンバー・ボックスを使っています。上のナンバー・ボックスと形状は似ていますが別のオブジェクトになります。 packオブジェクトはインレットに受け取った複数のメッセージをひとつのメッセージにまとめるもので、受け取るメッセージがすべて数値(intかfloat)の場合、出力されるメッセージは複数の数値の集合つまりlistに分類されることになります。アーギュメントとして「0. 0.」と書いていますが、これによりpackはインレットに受け取るメッセージの種類をfloatメッセージと解釈し2つのfloatメッセージをひとつのlistメッセージにまとめる働きをすることになります。printオブジェクトは受け取ったメッセージがどのような種類であれすべてMaxウィンドウに表示してくれるので、この例のようにメッセージ内容を確認するのに便利です。 こうしたメッセージの種類の違いを意識することはMaxプログラミングでは大切です。特にint、float、listの区別は混乱すると目的の結果が得られない場合がありますので注意が必要です。【sample3-2】は数値計算においてintメッセージ、floatメッセージが混乱している例です。パッチの左側では最初にメッセージ・ボックス0.5をクリックし、次に1.8をクリックすれば1.8+0.5=2.3の計算が実行されるつもりなのですが、printによりMaxウィンドウに表示される計算結果およびナンバー・ボックスに表示される計算結果ともに整数の1になってしまいます。通常このような数値計算を行う+、-、*、/などのオブジェクトはアーギュメントで何も指定しないとインレットに受け取るメッセージをintメッセージとして解釈します。このため実数0.5は整数に変換されて小数点以下を切り捨てられ0と解釈されます。同様に実数1.8は整数1として解釈され計算結果は0+1=1となります。またナンバー・ボックスもintメッセージを表示するもので、ここでの使用は不適切です。 パッチの中央は+オブジェクトにアーギュメントとして「0.」を書き込むことで正しい実数の計算を行っています。アーギュメントとして書かれた「0.」は初期値ですが、その値が重要なのではなく小数点を持った実数であることが重要です(Maxでは0.0は単に0.と表記されます)。このように実数をアーギュメントとして書き込むと+オブジェクトはインレットに受け取るメッセージをfloatメッセージとして解釈し、その計算結果もfloatメッセージとして出力するようになります。また計算結果の表示用にフロート・ナンバー・ボックスを使っていることも適切です。 パッチの右側は+オブジェクトの2つのインレットに個別にメッセージを与える代わりに、listメッセージで一度に入力している例です。多くのMaxオブジェクトではlistメッセージを第1インレットに与えることで、複数のインレットへ個別に入力するのと同じ効果を果たすことができます。 このパッチで紹介したメッセージ・ボックスというオブジェクトは、すべての種類のメッセージを自由に書き込む(格納する)ことができ、マウスクリックやbangメッセージを受け取ることで書き込まれたメッセージを別のオブジェクトに渡す広い用途を持ったオブジェクトです。【sample3-3】の左側では「bang」と書き込まれたメッセージ・ボックスもbuttonもともにbangメッセージを出力します。右側ではさまざまな種類のメッセージをメッセージ・ボックスに書き込んで、それをrouteオブジェクトによりメッセージの種類ごとに分岐させている例です。 メッセージ・ボックスでは【sample3-4】のように$マークを使った変数表現も可能です。変数が1個の場合は$1と表現し、複数ある場合は$1、$2、$3…と表現します。複数の変数への値の代入はlistメッセージにより行うことができます。 またメッセージ・ボックスは「set <任意のメッセージ>」という形式でメッセージを受け取ると、その<任意のメッセージ>部分をボックス内に表示してくれます。prependオブジェクトは受け取ったメッセージの前にアーギュメントとして書かれたものを付け加えて出力しますので「set <任意のメッセージ>」を簡単に作ることが出来ます。この"set"それ自体はただの文字列で"Click!"と同じsymbolなのですが、メッセージ・ボックスにとっては「ボックス内に表示する」という特別な意味を持った命令として働きます。 【sample3-4】の右側ではメッセージ・ボックスの複数の変数表現の応用で、brgb というメッセージをナンバー・ボックスに与えインスペクター・ウィンドウを開かずに背景色をコントロールしています。brgbの後にはRGBそれぞれの値を続けます。このbrgbも先程のsetと同様にナンバー・ボックスにとって特別な意味を持った命令として働きます。 こうした特別な命令として働くメッセージはオブジェクトごとに多数定義されており、オブジェクトを理解することは、その機能を理解し、アーギュメントを理解し、インレットやアウトレットの意味、入出力メッセージの種類、命令としての特別なメッセージを理解するということです。非常に難しく感じるかも知れませんが、実際に動作を確かめながらオブジェクトを理解できる優れたヘルプ・パッチがオブジェクトごとに用意されており、その都度参照しながらプログラミングを進めていくことができるので、すべてを暗記する必要などありません。 こうしてオブジェクトからオブジェクトへメッセージは受け渡され、パッチの処理が進んで行くわけですが、ここに処理の順序という大切な問題があります。【sample3-1】のパッチではクリックをした瞬間にMaxウィンドウにパッチの処理結果が表示されますが、2つあるrandomオブジェクトのうちどちらが先に動作したのでしょうか?見た目にいくら同時に見えても、オブジェクトのひとつのアウトレットから複数のパッチコードが伸びる場合、メッセージの受け渡しには必ず順序があり、これで処理の順序も決まります。Maxでは「右から左へ、下から上へ」という規則があり、これは実際のプログラミング内容によっては「靴下と靴のどちらを先に履くか」といった大切な問題になる場合があります。【sample3-5】の左側はひとつのbuttonオブジェクトから4本のパッチ・コードが分岐する場合にbangメッセージがどのような順序で到達するかを示したものです。また右側のようにtriggerオブジェクトはこうしたオブジェクト配置の規則に関わらず強制的に処理の順序を決めるのに有効なオブジェクトです。 * ここで説明したパッチは、以下のリンクをクリックしてダウンロードできます。 MBT003files.sit ------------------------------------------------------------------------ 暫定版ながら、DSPマガジンのWEBサイトを作りました。 メルマガの発行確認や購読中止などの操作は、こちらをご覧ください。 http://dspmag.iamas.ac.jp/ ------------------------------------------------------------------------ Copyright(C)2003 DSP Magazine. All Rights Reserved. 転送・転載禁止 ------------------------------------------------------------------------ |