チュートリアル 2:
bang!

bang! メッセージ

チュートリアルを開いて下さい。

このチュートリアルでは、bang メッセージを使って、Max パッチ内の接続をメッセージがどのように流れていくのかをたどってみます。このシンプルなパッチでは、Maxでメッセージが生成されるようす、また、パッチの中でこれらのメッセージがあらかじめ決められた順序で実行されるようすを示しています。

パッチの概観

o2mbangというパッチを見て下さい。パッチャーウィンドウの左側は非常にシンプルなパッチになっていて、button というUI オブジェクトが print オブジェクトに接続されています。button ("Click me" と表示されたもの)の上をクリックすると、Max ウィンドウに bang メッセージが表示されるのがわかります。これは、button オブジェクトが出力したものです。

bang メッセージは、Max の中では特別な使われ方をします。このメッセージは、多くのオブジェクトに対し、そのオブジェクトの処理を実行するように命じます。そのため、他のオブジェクトに対してbang メッセージを送信すると、通常、送信されたオブジェクトのアウトレットからメッセージが送信されます。パッチの2番目の部分(右に向かって)には、button("Now click me!" と表示されたもの)があり、メッセージボックス(Gotcha! というメッセージを持つもの)に接続されています。さらに、このメッセージボックスは print オブジェクトに接続されています。メッセージボックスの上をクリックすると、Gotcha! というメッセージが Max ウィンドウに送られます。これは、前のチュートリアルで見たとおりです。それでは、button オブジェクトをクリックして下さい。同じ Gotcha! というメッセージがMax ウィンドウに表示されるのがわかります。これは、どのような動作によるのでしょうか?

メッセージの流れを追ってみましょう。まず、buttonをクリックすると、button のアウトレットから bang メッセージが送信されます。このメッセージはパッチコードを伝ってメッセージボックスのインレットに到着します。メッセージボックスは bang メッセージを受信すると、自分が行なう処理、つまりメッセージの送信を実行します。そのため、Gothca! メッセージがメッセージボックスのアウトレットから print オブジェクトに送信され、これが Max ウィンドウに表示されたのです。

ほとんどの Max オブジェクト(これには、メッセージボックスや button オブジェクトも含まれます)は、bang を「その時点で利用できる情報を使って、オブジェクト自身が主として行なうべきタスク(処理)の実行を指示する命令」として解釈します。これ以降のチュートリアルでは、Max の世界の中で、数値や、その他のデータを操作することによって、オブジェクトがどのような処理を展開していくのかを見ていきます。しかし、ここでは、メッセージボックスの主な機能がメッセージを構成し、それを渡すことであるため、「任意のメッセージボックスに bang を送信すると、そのメッセージボックスが自分の内部に格納しているメッセージを送信する」という点に注意しておくことが大切です。

接続の中を通るメッセージの流れの追跡

bang メッセージは、上で述べたようなメッセージボックスのトリガに役立つだけではなく、それ以外の数多くのオブジェクトのトリガとして使用することができます。3番目のパッチの右上にある button をクリックして下さい。このbutton は2番目のbutton に接続されていて、2番目のbutton は bang メッセージによってトリガされ、メッセージ(bang)を print オブジェクトに送信します。

print オブジェクトが、名前の後にアーギュメント("one")を持っている点に注意して下さい。Max ウィンドウに注目すると、object という列には "print" という語の代わりに print オブジェクトへのアーギュメント "one" が表示されていることに気がつくと思います。この方法を使うと、Max ウィンドウでそれぞれお互いを区別するための固有のラベルを持った複数の print オブジェクトを作ることが可能になるため、Max パッチのデバッグを行なう場合に役に立ちます。

パッチをアンロックし、上側の button のアウトレットを、左側に1つだけあるbuttonに接続して下さい。これを行なっても、前からある接続を切断しない点に注意して下さい。アウトレットは複数のオブジェクトに接続することができ、それぞれのパッチコードには同じメッセージが送信されます。パッチをロックして、一番上の button をクリックして下さい。bang は両方の button オブジェクトに送信され、それぞれの button オブジェクトが独自の bang メッセージを生成します。

同じように、オブジェクトのインレットに複数のパッチコードを接続することもできます。ここでは、2つの button オブジェクトが1つの print オブジェクトに接続されています。最も上にあるbutton をクリックすると、bang メッセージを受信した両方の button の出力が print オブジェクトに送られ、2つの bang メッセージが Max ウィンドウに表示されます。

次のパッチでは、この原理をもう一度示しています。パッチの最も上にある button をクリックすると、3つの bang メッセージが("several" と表示された print オブジェクトを経由して)Max ウィンドウに表示されます。print オブジェクトは「2段目」にある2つの button オブジェクト(これは、最も上にある button によってトリガされます)から bang を受信し、同様に、直接 print オブジェクトに接続されている最も上のbutton 自身からも1つの bang を受信します。

この考え方を、右端のパッチにも適用することができます。パッチにはいくつかのメッセージボックスがあり、それらはすべて "many" という名前の1つの print オブジェクトに接続されています。個々のメッセージボックスには button が接続されていて、もう一段上のレベルにある button がそれらをコントロールしています。メッセージボックス自身をクリックするか、それぞれのメッセージボックスに接続されている button をクリックすることによって、個々のメッセージボックスオブジェクトにメッセージを表示させることができます。これらのメッセージボックスすべてを一度にトリガしたいときには、最も上にある button をクリックすることで実現できます。

最も上にある button をトリガした場合にMax ウィンドウに表示されるメッセージの順序に注目して下さい。メッセージは気まぐれな順序で表示されるわけではありません。メッセージは、パッチャーの中のオブジェクトの空間的な配置に基づいて生成され、右から左へ実行されます。このメッセージの順序についてはこの先のチュートリアルで調べていきますが、1つのオブジェクトが他の多数のオブジェクトに接続されている場合、メッセージが「右から左」の順序で送信されることを理解しておくと役に立ちます。

パッチをアンロックして、いくつか button オブジェクトを追加して下さい。これは、パレットを表示させ、button オブジェクトのアイコンを選択して行なうことができますが、アンロック状態のパッチャーでキーボードの 'b' キーを押すだけでも button の追加を行なうことができます。追加したbutton を右端のパッチの他の button に接続して下さい。複数のアウトレットやインレットの接続の様々な組み合わせを試してみて下さい。button を接続しながら、どのメッセージが、どのような順序で Max ウィンドウに表示されるかを推測してみて下さい。

結び

bang メッセージは、Max 環境の中で最もパワフルなメッセージの1つです。これは、他のオブジェクトの出力をトリガし、希望どおりの出力を行なうような接続のマトリックスを作ることができます。ここでは、インレットやアウトレットは複数の接続先を持つことができ、これらの接続によってメッセージを予測可能な順序で送信することができるということを見てきました。さらに、print オブジェクトのようなオブジェクトではアーギュメントを割り当てることができ、そのアーギュメントによってオブジェクトの動作を変化させることができるということについても見てきました。print オブジェクトに対するアーギュメントによって、Max ウィンドウに表示されるメッセージの送信元を確認することが可能になります。

参照

button bang を出力します
print Max ウィンドウにあらゆるメッセージを表示します。
message メッセージを表示し、送信します。