slider や dial から送信される正確な値を、実際に送信が行なわれる前に知りたいという場合があるでしょう。mousefilter オブジェクトはこれを助けます。mousefilter は数値をインレットで受信しますが、マウスボタンが放されたときだけに数値を通過させます。下の例をよく見て下さい。
hslider をドラッグしている間、数値は ナンバーボックスに送信されて表示されますが、マウスボタンが押し下げられているため mousefilter は数値を通過させません。マウスボタンを放したとき、最後の数値が mousefilter のアウトレットから送信されます。
パッチャーウィンドウの左側のパッチは、この例と非常によく似ていますが、mousefilter オブジェクトとパッチコードが非表示になっている点だけが違います。dial をドラッグすると、上の ナンバーボックス は dial の出力を示しますが、数値は、マウスボタンが放されるまで、下のナンバーボックス(および、非表示になっている pgmout )には送信されません。
・dial をドラッグして、新しいプログラムチェンジ・ナンバーを選択して下さい。マウスボタンを放すまでシンセサイザには何も送信されません。
パッチの左上隅にある button は、line オブジェクトをトリガし、自動的に16 秒間かけて一通りのプログラムチェンジを行ないます。
・button をクリックして下さい。dial は自動的にコントロールされていますが、マウスを使って特定のプログラムチェンジ・ナンバーの送信を抑えることができます。マウスボタンを押し下げているとき、 mousefilter は gate のように動作し pgmout への数値の流れを止めることができます。
・ パッチャーウィンドウ をアンロックし、接続がどのように行なわれているかを見て下さい。パッチの残りを試す前、再びウィンドウをロックして下さい。
サンプルパッチのパッチャーウィンドウの中にある大きなボックスは、グラフィックス・アプリケーションソフトからインポートされ、 Edit メニューの Paste Picture を使ってウィンドウの中にペーストされたものです。これは、マウスによってノートを演奏できるような、ピッチ−ベロシティのグリッドを描きます。グレーの領域は 61鍵キーボードの音域( C1 からC6 まで)に対応するピッチ領域を示しています。
・ピッチ−べロシティのグリッドを使用する前にボックスの最も左下の隅をクリックしなければなりません。これにより 0.0 のポイントがどこにあるかを Max に告げます。
・上の作業を行った後、ボックスの内部をクリックしたりドラッグしたりしてマウスで演奏して下さい。
ボックスの内部でマウスボタンを押し下げたままにすると、ノートは連続して演奏されます。ボックス内で左から右へマウスを移動させるとピッチが増加します。下から上に移動させるとべロシティが増加します。上またはは下へ大きく変化させると、ノートのテンポが増減します。
マウスはスライダ類やその他のユーザインターフェイスオブジェクトを動かしているわけではありません。どのようにノートを送信しているのでしょうか?
・パッチャーウィンドウ をアンロックし、右にスクロールして何が行われているのかを見て下さい。
このパッチの内部で数値を生成しているのは mousestate オブジェクトです。インレットでbang を受信すると、mousestate は現在のマウスの水平、および垂直位置を中央左アウトレットと中央アウトレットから報告します。
スクリーン上の位置は、水平−垂直の数値のペアで表現され、通常はスクリーンの左上隅からのピクセル数で測られます。水平位置は左から右へ、垂直位置は上から下へと測定されます。
mousestate が zero メッセージを受信すると、現在のマウス位置を新しい 0.0 のポイントとして使用し、これ以降の測定はこの新しいポイントから相対的に行なわれます。これが、演奏を開始する前に、ピッチ−べロシティの左下隅をクリックした理由です。ボックスの隅には小さい ubutton オブジェクトが置いてあります。このため、クリックを行なうと mousestate に対して zero メッセージをトリガし、このポイントを新しい 0.0のポイントとしてセットします。
mousestate はまた、マウスボタンの状態を報告し、マウスボタンが押し下げられた場合には 1を、放された場合には 0 を送信します。このパッチの中では、この機能を使用して、mousestate に bang メッセージを送信する metro オブジェクトをコントロールしています。metro は マウスボタンが押し下げられているときにだけbang を送信するため、mousestate はマウスが押し下げられているときにだけ位置の値を送信します。
右の2つのアウトレットは前の報告からの位置の変化を報告します。このパッチではピッチ、ベロシティ、テンポの値を提供するために、水平位置、垂直位置、垂直位置の変化を使用します。それぞれの値の範囲は制限され、適切な範囲に値が収まるように、多少異なった方法で処理されます。
例えば、ピッチ−べロシティのボックスは256ピクセルの幅なので、split オブジェクトを用いて水平位置の値を 0から255までに制限し、 2 で割って 0 から127のピッチの範囲を得ます。ボックスは 128ピクセルの高さですが、垂直位置が上から下へ数えられることを思い出して下さい。このため、マウスがボックス内にある場合、垂直位置の値は 0から -127になります。そこで、垂直位置の値を -127から -1に制限し abs オブジェクトを使用して正の値に直しています。(べロシティ値0 はmakenote によって供給されるため、必要ありません)。
テンポを得るためには、マウスの垂直位置の変化を使います。しかし、大きな変化のみを検出したいと考えたため、最初にわずかな変化(±7ピクセル)を除去してから、値を -128から128に制限し、exprを用いて、指数による曲線の40から500までの範囲にマップします。これにより、べロシティが大幅に増加すると速いテンポになり、べロシティが大幅に減少するとゆっくりとしたテンポになります。べロシティの緩やかな変化では、テンポは変化しません。
マウスボタンが押し下げられている場合、mousefilter は、マウスボタンが放されるまで数値の出力を抑え、マウスが放されると最後に受信した数値を出力します。mousefilter は、マウスによるゲートとして使用することができます。特に、多くの値を見て、そのうち必要なものだけを送信するということを可能にしてくれます。
mousestate は bang を受信する毎にマウスの位置、および前に報告された位置からの変化を出力します。これらの値は、連続した音楽上のコントロール値を与えるために使うことができ、マウスの動きによって 2 次元の値を生成するためにスクリーン全体をフィールドとして使用する可能性を与えてくれます。
マウスボタンが押し下げられると、mousestate は左アウトレットから 1 を送信します。マウスボタンが放されると、mousestate は 0 を送信します。この値を使って、処理のオンとオフ切り替えや gate の開閉を行うことができます。
mousefilter | マウス・ボタンが上がっている時のみ数値を通過させる。 |
mousestate | マウスの状態と位置を報告する。 |