チュートリアル29:
テスト 5 - 確率用パッチ・オブジェクト

パッチ・オブジェクト(abstraction)の作成

これは、パッチ・オブジェクトの作成と使用のための演習です。受信する bang メッセージを特定のパーセンテージだけ通過させるパッチ・オブジェクトを作成し、このパッチ・オブジェクトをパッチの中で使用して下さい。最初に、このパッチ・オブジェクトを作成します。

1. 左インレットで bang メッセージを受信し、それらのうちの特定のパーセンテージだけを送信する passpct というパッチ・オブジェクトを作成しなさい。そのパーセンテージはタイプイン・アーギュメント、あるいは右インレットで受信された数値によって指定できるようにしなさい。

ヒント

確率のパーセンテージは100 回の試みの中で起こると予想されるイベントの数です。例えば、33% の可能性は、発生するイベントが 100のうち 33の確率であることを意味します。

前章のパッチ・オブジェクト gamble をモデルとして使用し、処理方法のヒントにして下さい。パッチ・オブジェクト passpct は次の点を除けば同じものになるでしょう。

  1. 乱数は常に100のうちから選ばれます。
  2. 1と0を送信する代わりに、bang メッセージを送信する(条件に合致した場合)必要があります。

演習1の解答

演習1の解答を Max Tutorial フォルダの PassPct というファイルに保存してあります。

左インレットで bang、あるいは他の任意のメッセージを受信すると、random 100 オブジェクトは 0 から 99の範囲で数値を選びます。その値がアーギュメント(あるいは右インレットで受信した数値)よりも小さい場合、sel オブジェクトは bang メッセージを送信します。

次の項では、パッチの中で確率的な決定を行なうために PassPct オブジェクトを使います。

metroからの bang メッセージを特定のパーセンテージだけ通過させる

2. metro オブジェクトを使用して bang メッセージを一定間隔で送信し、 PassPct を使用してその bang を特定のパーセンテージだけ通過させなさい。PassPct からの bang メッセージを使用して、シンセサイザに送信するノートをトリガしなさい。5オクターブの kslider を使用して送信するピッチを選びなさい。

kslider によって選択されたピッチに比例するように、PassPct のパーセンテージの値を計算しなさい。ピッチが 36から95まで増加すると、パーセンテージが 5 から95まで増加するようにしなさい。

ヒント

kslider によって送信されるピッチ値は、値の格納に使われるようなオブジェクト(intvalue、ナンバーボックス などですが、intがもっとも効果的です)に保存しなければなりません。PassPct からの bang メッセージは、この格納のためのオブジェクトをトリガし、 makenote に数値を送信して、ノートの演奏を可能にします。

この問題の難しい部分は、kslider から送信されるピッチの範囲(36から95)を使って、PassPct に異なったパーセンテージの範囲(5から95)を与える点です。これは、1つの範囲から別の範囲へのマッピングとして知られているものです。このような比例関係はリニアマップ(線形写像)になります。2つの範囲の関係は直線のグラフで表すことができます。


ピッチが36から95へ変化すると、パーセンテージは5から95へ変化します

リニアマップの計算

リニアマップの問題とは次のようなものです。

「ある数値の範囲 xmin から xmax 、および もう1つの数値の範囲 ymin から ymax が与えられている。最初の範囲の中に存在する数値 x が与えられたとき、もう1つの範囲の中で同じ位置を占める数値 y を求めよ。」

次は与えられた x の値に対応する y の値を計算するための公式です。

y = (( x - xmin ) * ( ymax - ymin )÷( xmax-xmin )) + ymin

この公式に、ここで用いる範囲を当てはめると、次のようになります。

y=(( x - 36 ) * 90 ÷ 60 ) + 5

 訳注:この演習の範囲を公式に当てはめると、厳密には上の式にはなりません。kslider の値が 36 から 95、確率の値が 5 から 95 であるため、xmin : 36、 xmax : 95、ymin : 5、ymax : 95 となり、これをあてはめると

y = (( x - 36 ) * ( 95 - 5 ) ÷ ( 95 - 36 )) + 5

= (( x - 36 ) * 90 ÷ 59 ) + 5

となります。おそらく xmax : 96 で考えた式と、5 オクターブの kslider の最高のピッチ値が95であるということの間で齟齬が生じたと考えられます。この章の最後に、訳注として修正したパッチ図を掲載しておきます。

考え方は本文のもので十分理解できます。「95 - 36 = 59」という点だけ注意して下さい。

これをオブジェクトに移し換えるにはどうすれば良いでしょう?

kslider からのピッチは公式に送られ、パーセンテージが PassPct に送信されます。作成したパッチはこのようなものになるでしょう。

PassPct を使用してランダムな選択を行なう

この演習にもう1つの要素を追加してみましょう。

3. 同じ metro からbang を受信するPassPct をもう1つ追加し、その PassPct が選択されたピッチのランダムなオクターブトランスポーズをトリガするようにしなさい。PassPct オブジェクトのパーセンテージは、ピッチが増加するに従って 95から5に減少するようにしなさい。

演習のこの部分では、2つの新しい問題が提起されています。ピッチのランダムなオクターブトランスポーズを作るにはどのようにしたらよいでしょう。また、反転した線形関係はどう表現したらよいでしょう。先に読み進む前に、自分自身で解答を見つけて下さい。

ピッチのランダムなオクターブトランスポーズ

ノートのランダムなオクターブトランスポーズを行なうためには、ノートのピッチクラス(C、C#、D など)を計算し、その後、ピッチクラスに、ランダムな12 の倍数を加える必要があります。トランスポーズが鍵盤の範囲内に収まるように、乱数に制限を加える必要があるでしょう。解答はこのようになります。

反転したリニアマップの計算

演奏されたピッチから可能なピッチの最大値を引き、その結果の絶対値を取ってピッチを反転させていた以前のバッチを覚えているでしょうか(チュートリアル14 のパッチ2を参照して下さい)。

反比例したリニアマップのための公式はこのようになります。

y = ( -( x - xmax ) * ( ymax - ymin ) ÷ ( xmax - xmin )) + ymin

この公式に、ここで用いる範囲を当てはめると、次のようになります。

y =( -( x - 96 ) * 90 ÷ 60 ) + 5

訳注:前にも注釈を入れましたが、この場合も実際には

y = ( -( x - 95 ) * ( 95 - 5 ) ÷ ( 95 - 36 )) + 5

= ( -( x - 95 ) * 90 ÷ 59 ) + 5

が正しい式になります。

これは、パッチ内のオブジェクトで次のように表現することができます。

パッチャーウィンドウ を右にスクロールして、演習2と3を組み合わせて1つのパッチにしたものを見て下さい(ここでは、パッチ・オブジェクト PastPct を使っています)。

まとめ

パッチ・オブジェクトを作成するためには、inletoutlet オブジェクト(さらに、必要ならば、可変な # アーギュメント)を含むパッチを作成して保存します。その後、他のパッチの中でオブジェクトボックスにファイル名を書き込んで使用します。

パッチ・オブジェクト PassPctは 前章のパッチ・オブジェクト gamble と同様なものです。PassPct は、受信した bang を、確率に基づいて通過させたり、削除したりします。

最初にピッチクラスを( % 12 オブジェクトを用いて)計算し、その後、12の倍数をピッチクラスに加えることによって、ノートを任意のオクターブ数でトランスポーズすることができます。

この章で述べられたリニアマッピングの手続きを使用して、数値による2つの範囲の線形関係、あるいは反転した線形関係を作ることができます。

(訳注のための修正パッチ図)

xmax を 96 から 95 に変更し、[ * 1.5 ] を [ * 90. ] と [ / 59. ]に置き換えています。こうすることで y は 5 から 95 に正しくマッピングされます。