チュートリアル15:
比較を用いた決定

関係演算子

コンピュータプログラムが行う最も基本的な動作の1つに、ある種のテストを行ない、そのテストの結果に基づいて決定を下すというものがあります。このテストは通常、ある種の比較で、2つの数値が等しいかどうかを調べるというようなものです。このテストの結果は、コンピュータが次にどのような動作を行なうかを決めるためにつかうことができます。

数値は、関係演算子を使って比較されます。この関係演算子は、ある数値と他の数値の関係を、“〜より小さい”“〜より大きい”“等しい” etc...というような語を使って明らかにするものです。Max には、ある値を他の値と比較するために、いくつかの関係演算子オブジェクトがあります。

< 〜より小さい <= 〜以下 == 等しい
> 〜より大きい  >= 〜以上  != 等しくない

Max の関係演算子は、条件文が真である場合数値 1 を送信し、条件文が偽である場合数値 0 を送信します。そのため、例えば、条件文「 7は 4 よりも大きい」をテストするためには、> オブジェクトの右インレットに数値 4 を送信し、その後、左インレットに数値 7を送信してオブジェクトをトリガします。条件文「 7 が 4 よりも大きい」というのは真なので、オブジェクトは数値 1 を送信します。

右のオペランドは、オブジェクトボックスにアーギュメントととして書き込むことによって与えることもできます。

・パッチ1の上部にある ナンバーボックスをドラッグして下さい。特に数値 5 を通過するときの各オブジェクトの出力に注意して下さい。

通常、関係演算子はインレットで intを受信することを期待します。float は比較を行なわれる前に int に変換されます。しかし、算術演算子と同様、アーギュメントを float で書き込んだ場合、関係演算子は float を比較することができます。

select

select オブジェクトは特別な関係演算子です。左オペランドと右オペランドが等しい場合、左アウトレットからbang メッセージが送信されます。そうでなければ左オペランドは右アウトレットからそのまま出力されます。結果として、左インレットで受信した数値は、select が探しているものを除いて、右アウトレットから出力されることになります。探している数値を受信すると、select は左アウトレットから bang メッセージを送信します。

パッチ2は select オブジェクト(名前は sel のように短縮することが可能です)が実際に複数のアーギュメント を持つことができ、それぞれのアーギュメントは int 、float 、シンボル(言い換えれば”単語”)が使用できるということを示しています。入力は各アーギュメントと比較される前に、適切な型( int 、float、シンボル)に変換されます。複数のアーギュメントがある場合には右インレットが存在しないことに注意して下さい。

・様々なメッセージをクリックして下さい。入力がアーギュメントの1つと合致した場合、アーギュメントに対応したアウトレットから bang が送信されることに注意して下さい。合致しない場合、入力は右アウトレットからそのまま出力されます。

入力がint (例えば 4 など)である場合、float アーギュメントと比較される前に float に変換されます。入力がfloat (例えば 26.9 など)の場合、int アーギュメントと比較される前に、小数点以下を切り捨てられます。

比較とselectオブジェクトの組み合わせ

select オブジェクトは bang メッセージを送信し、その bang を使用して他のオブジェクトをトリガすることができます。関係演算子は数値 1 と 0 を送信し、その数値を使用して何らかのオン/オフ切り替え(例えばmetro など)を行なうことができます。このことから、パッチの中で比較を使用することによって、他のオブジェクトのトリガをいつ行なうかを決定できることが分かります。

パッチ3は MIDI キーボードで演奏された特定のピッチを検出する sel の使用法を示しています。

ピッチは最初に % オブジェクトに送られます。このオブジェクトは数値を 12で割り、余り(剰余)を送信します。Cというノートは常に 12 の倍数(例えば、36、48、60など)にあたる MIDI キーナンバを持っているため、Cの音が演奏された場合、% 12オブジェクトは 0 を出力します。

sel オブジェクトは % から数値 0 を受信する毎に、メッセージボックスに bang を送信し、各メッセージボックスは noteoutC2、G2、E348、55、64)を送信します。これらのピッチはシンセサイザで演奏されたCの音のベロシティと結合されるため、コードは演奏されたノートと同じベロシティ、同じデュレーションを持つことになります。

比較と "Or "または "And" の組み合わせ

|| オブジェクトは "Or" (論理和)を意味します。左右の演算子のどちらかが非0(真)ならば、|| オブジェクトは数値 1 を送信します。両方の演算子が 0 ならば、数値 0 を送信します。

&& オブジェクトは "And" (論理積)を意味します。左右の演算子が共に非0ならば、&& は数値 1を送信します。そうでない場合には数値 0 を送信します。

||  と && は、「 a は b よりも大きい AND c は d よりも大きい」というような、2つの比較を1つの文に結合する場合に使用されます。

上の例では、数値 5 (a) が最後に送信されなければならない点に注意して下さい。そうであれば、&& オブジェクトがトリガされた時点で、他のすべての値が既に到着していることになります。

パッチ4はパッチ3と同様のものですが、|| を使用して1つではなく2つのピッチを検出します 。このパッチは、”演奏されたピッチが B OR D ( B または D )なら、G1とF3の音を鳴らしなさい”と命じています。これによる効果は、当然ながら、はBとDの音にドミナントセブンス風の響きを伴わせることになります。

・シンセサイザで C のキーのメロディーを弾いて下さい。パッチ3と4では、鬱陶しいほどハイドン風な伴奏が提供されます。

比較を使ったオブジェクトのオン/オフの切り替え

パッチ3と4では、任意の数値(および、シンセサイザ上の鍵や鍵の組み合わせ)が Maxの中の何かをトリガするために使用できることを表しています。同様に、関係演算子によって送信される数値 1と 0は、metro オブジェクトのオン/オフのように、オブジェクトの切り替えに使用することができます。

パッチ5では、この考え方の例をを示しています。

・ シンセサイザ上で、C6の音(高音の C)を弾いて下さい。鍵をリリースすると同時に、パッチ5はノートの演奏を開始し、次に鍵を弾くまで繰り返します。

このパッチは、「ピッチが 96に等しく、かつベロシティが 0 に等しい」という条件を探します。両方の条件が真である場合、 && は数値 1 を送信し、そうでなければ数値 0 を送信します。明らかに、ノート・メッセージの大半は && に数値 0 を送信させるはずです。繰り返し不必要な数値 0metro に送信することを避けるために、&& の出力は最初に change オブジェクトに送信されます。changeオブジェクトの目的は数値の繰り返しを取り除くことです。このオブジェクトのインレットで受信された数値は、先行する数値と異なる場合のみ、左アウトレットから送信されます。

metro は、オンの状態になると、数値 96 を1秒間に8ノート( 125ミリ秒毎に1回 )の割合でmakenote に送信します。

まとめ

関係演算子(<<===!=>=>)は2つの数値を比較し、10 を出力することによってその結果を知らせます。 && および || オブジェクトは、入力が 0 か 非 0 かをテストするもので、2つの比較を結合して1つのテストにするために役に立つオブジェクトです。

select オブジェクト(sel としても知られています)は、特定の数値(あるいはシンボル)を検出します。入力が探していたものと同じなら、そのアウトレットの1つから bang を送信します。そうでない場合には、入力はそのまま右アウトレットから出力されます。

これらの比較の結果は、プログラムの中で、他のオブジェクトをトリガするかどうかを決定するために使用できます。

change オブジェクトは、インレットで受信した数値が先行する数値と異なる場合にのみ、その数値を送信します。

参照

change 数値の繰り返しを取り除きます。
select 特定の入力を選択し、残りはそのまま通過させます。
< 〜より少ないという、2つの数値の比較を行ないます。
<= 〜以下であるという、2つの数値の比較を行ないます。
== 2つの数値を比較して、等しい場合に 1 を出力します。
!= 2つの数値を比較して、等しくない場合に 1 を出力します。
>= 〜以上であるという、2つの数値の比較を行ないます。
> 〜より小さいという、2つの数値の比較を行ないます。