チュートリアル30:数値のグループ

リストの使用

今まで、メッセージが1つの数値、あるいはスペースで区切られた数値のリストから構成できることを見てきました。リストは、数値をまとめて送信し、それらの数値がオブジェクトに同時に受信されることを確実にするための効果的な方法です。

例えば、通常、ピッチとベロシティは、noteout が適切な順序で受信するように同期させなければなりません。noteoutは、左インレットでリストを受信すると、(存在する場合)3番目の要素をチャンネルナンバー、2番目の要素をベロシティ、1番目の要素をピッチとして解釈します。

リストとして数値を結合したり、リストを個々の数値に分割するために特化されたオブジェクトがあります。これらを使用することによって、オブジェクト間で数値のグループを送信する際に、最も適切な方法を選択することができるようになります。リストは、数値だけでなくシンボル(語)を含むこともできますが、これも役に立つ場合があります。第1の要素が数値であれば、Max オブジェクトはそのメッセージをリストとして認識します。

iter

iter オブジェクトは、インレットで数値のリストを受信すると、リストを個々の要素に分解し、それらの数値をすべて同時にではなく、次々と順序よく送信します。iterは、要素の間にカンマを置いて、それらを個別のメッセージにするのと同様な働きをします。

パッチャーウィンドウ の右側部分で iter オブジェクトの動作を見ることができます。metro が数値のリストをトリガすると、リストは iter オブジェクトに送信されます。iter は可能な限り速くリストを分割し、個々の数値を順番に送信します。pipe オブジェクトでディレイされた数値は、その後 makenote オブジェクトに(実際にはほぼ同時に)ピッチとして送信されます。

unpack

unpack オブジェクトによってリストが受信されると、リストの個々の要素はそれぞれ別のアウトレットから送信されます。unpack オブジェクトのアウトレットの数は書き込まれたアーギュメントの数によって決まります(また、アーギュメントは、それぞれのアウトレットの初期値も設定します)。タイプイン・アーギュメントがない場合、unpack オブジェクトは2つのアウトレットを持ち、各々の初期値は 0 になります。

unpack オブジェクトのアウトレットの数よりも受信したリスト要素の数のほうが多い場合、余分な要素は無視されます。アウトレットの数よりも受信したリストの要素の数のほうが少ない場合、unpackはそれらの要素を該当するアウトレットから送信しますが、残りのアウトレットからは何も送信しません。

サンプルパッチでは、 unpack でリストが受信されると、リストの2番目の要素が右アウトレットから送信され、その後、1番目の要素が左アウトレットから送信されます(出力の順序は常に右から左へです)。

pack

pack オブジェクトは、個々の要素を1つのリストに結合します。pack は各インレットで受信した1番新しいメッセージを格納していて、左インレットでメッセージを受信すると、格納しているすべての要素をまとめてリストとして送信します。インレットの数(および個々のインレットに格納される初期値)はタイプイン・アーギュメントによって指定されます。

パッチャーウィンドウ の左側部分では、MIDI キーボードからのノートオンのピッチとベロシティの値が、数値 750 と共にリストとしてパックされ、ピッチ、ベロシティ、ディレイのリストが pipe オブジェクトに送信されます。パッチの他の部分によって pipe のディレイタムが変更された場合でも、ディレイタイムがノートオンのデータと同じリストで送信されるため、MIDI キーボードから送信されるすべてのノートが 750 ミリ秒ディレイされます。

swap

swap オブジェクトは受信した数値の順序を逆にします。このオブジェクトは、他のオブジェクトと同様、左インレットの数値によってトリガされます。しかし最初に右アウトレットから左インレットで受信した数値を送信し、その後、すでに右インレットで受信していた数値を左アウトレットから送信します。

サンプルパッチでは、swap unpack オブジェクトから受信したリストの最初の2つの要素の順番を逆にします。そして、リスト の1番目の数値 40 をベロシティ、2番目の数値 59 をピッチとして使用します。

要素の順序を逆にするためには、 unpack オブジェクトからのパッチコードを交差するだけでは不十分です。この場合、数値 59 が先に pipe の左インレットに到着し、40 を受信する前に pipe をトリガしてしまいます。


このパッチは上のパッチと等しいものではありません。

swap オブジェクトは、左インレットで bang メッセージを受信すると同じ数値を再び送信します。入れ替える2つの数値を、左インレットでリストとして受信することも可能です。
swap オブジェクトはリストを解釈でき、リストの最初の2つの要素を交換するため、実際のところ、厳密に言えばこのパッチの unpack オブジェクトは必要ありません。しかし、ここでは数値の交換をより視覚的にわかりやすくするため unpack オブジェクトを使っています。また、ここでは示していませんが、float を入れ替えるための fswap と呼ばれるオブジェクトもあります。

リストはメッセージボックスを使って管理することができます

チュートリアル 25で示したように、メッセージボックスを使って、リストの中の要素を切り離したり、並び変えたりすることができます。ここでは、リストから個別の要素を選択するためにメッセージボックスを活用する例のいくつかを示しています。

自動伴奏

ここまで、リスト管理オブジェクトがどのように動作するかを見てきました。これらのオブジェクトがサンプルパッチの中でどのように使用されているかを見ていきましょう。リスト40 59 80 のそれぞれの要素は並び変えられ、様々な方法でディレイされて、別々のメッセージとして、別々なタイミングで makenote オブジェクトに送信されます。

metroがオンにされると、直ちに、リスト全体が makenote オブジェクトに送信され、ノート40(E1)がベロシティ59 、デュレーション80ミリ秒で演奏されます。ピッチとベロシティは swap オブジェクトによって入れ替えられ、500ミリ秒ディレイされてから、makenote オブジェクトに送信され、ノート59(B2)がベロシティ40 で演奏されます。metroがオンにされた1秒後に、すべての数値がコード (E1、B2、G#4)として、前のノートのベロシティ40でmakenoteに送信されます。同時に del オブジェクトによってディレイされていた bangが、swapのノートB2を再びトリガし、500 ミリ秒ディレイされて演奏されます。合計2秒後には、すべてのプロセスが繰り返され、結果次のようなものになります:


Eメジャー・コード自動伴奏の音型

MIDI キーボードからのノートオンのピッチとベロシティは、ディレイタイムと一緒に1つの リストとしてパックされ、750ミリ秒のディレイタイムを設定されている pipe オブジェクトに送信されます。これによって、演奏されたすべての音が750ミリ秒の短いエコーを持つようになります。

演奏されたノートは、また、伴奏にも影響を与えます。このノートが、伴奏の最初と2番目のノートの間に pipe オブジェクトに到達した場合、伴奏の2番目の音のディレイは 750ミリ秒になり、次のようなリズムの変化を引き起こします。

さらに、ディレイされた音が、伴奏の2番目と3番目のノートの間に makenote オブジェクトに到達した場合には、コードのベロシティが変化します。

・伴奏をオンにして、一緒にメロディーを演奏して下さい。

まとめ

リスト は数値で始まり、アーギュメントとして追加の要素を持つことが可能なメッセージです。通常アーギュメントはすべて数値ですが、シンボルでも構いません。

数値をリストとしてまとめて送信することによって、それらの数値は確実に同時に受信されます。pipe, makenote, noteout のような多くのオブジェクトは、左インレットで受信した数値のリストを、それぞれのインレットで個々に数値を受信した場合と同じように解釈します。

pack オブジェクトは、それぞれのインレットで受信したメッセージを1つのリストに結合します。unpack オブジェクトは、リストを個別の要素に分解し、それぞれの要素を別々のアウトレットから、右から左の順序で送信します。iter オブジェクトは、リストのそれぞれの数値を、1つのアウトレットから、個別に、左から右の順序で送信します。

メッセージボックスの中の可変な $ アーギュメントは、リストの要素を個別に切り離すために使うことができます。これは特に、リストが数値に加えてシンボルを持っている場合に効果的です。

swap オブジェクトは2つの数値の順序を入れ替えます。左インレットで数値を受信すると、その数値は右アウトレットから送信され、その後、すでに右インレットで受信していた数値を左アウトレットから送信します。

参照

buddy 到着した数値を同期させ、一緒に出力します。
fswap 2つの(小数の)数値の順序を入れ替えます。
iter リストを分割してして連続した数値の流れに変換します。
pack 数値やシンボルを1つのリストに結合します。
swap 2つの数値の順序を入れ替えます。
thresh 一定の時間内に受信した数値を、リストとして結合します。
unpack リストを個別のメッセージに分割します。