チュートリアル 8:
キーボードとマウスによる入力

タイプ、クリック、ドラッグ

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

このチュートリアルでは、コンピュータのマウスとキーボードを使って Max の動作をコントロールすることについて見ていきます。また、数値を文字に変換したり、特定のキーを認識する方法についても説明します。

Max パッチのコントロールに外部機器を使用することが必ずしも便利であったり、役に立つとは限りません。パッチを動作させるために必要なコントロールメカニズムが、すべてコンピュータ自身でまかなえる場合もあります。マウスとキーボードを使用することによって、他のデバイスに関して心配せずに、パッチの広範囲なコントロールが可能になります。

マウスの動作の観察

08mKeyboardAndMouseInput というパッチを見て下さい。これは、このチュートリアルのためのサンプルパッチです。ウィンドウの左側は、metro オブジェクトが、mousestate と modifiers と書かれた2つの新しい Max オブジェクトに接続されている小さなパッチになっています。チェックボックスをクリックし、metro をオンにして、スクリーン上でマウスを動かしてみて下さい。マウスの動きに従って、mousestate オブジェクトに接続されたナンバーボックスがマウスの情報を表示し、マウスボタンをクリックしたときに、mousestate オブジェクトに接続されたチェックボックスがオンになることに気がつくと思います。

mousestate オブジェクトの出力は、マウスボタンが「クリックされている」かどうかに関わらず、2組の座標値を出力します。これは x軸 と y軸の値によるマウスの絶対位置の座標と、その前にmousestate が値を調べたときの位置からどのくらい移動したかを表すデルタ位置の座標です。絶対座標はパッチャーウィンドウ内の座標ではなく、スクリーン座標に基づいています。そのため、コンピュータスクリーン上のどこにマウスがあっても、その動きをトラッキング(追跡)することができます。これはまた、mousestate の結果が、実際のコンピュータスクリーンのサイズによって変化するということを意味します。コンピュータのスクリーン座標は通常のデカルト座標と逆になっています。スクリーンの左上の座標が0, 0, になり、右下の座標がスクリーンサイズ - 1 になります。(例えば、1024 X 768 のディスプレイでは、マウスが右下の角にあるとき1023, 767, になります。)

デルタ値はマウス位置の変化量を報告するものですが、実際に変化量が出力されるのはどの時点でしょうか?位置の変化は(絶対位置と同様に)オブジェクトのインレットでbang メッセージを受信したときだけに出力されます。したがって、メッセージを生成するために metro オブジェクトが使用されています。このような動作をポーリングと呼び、オブジェクトによって生成されるメッセージの
時間的な密度をコントロールすることができます。このコントロールは、mousestate のようなオブジェクトでは特に重要です。これが自動で行なわれた場合、大量の不必要なデータのストリームが生成されてしまう可能性があります。能動的なポーリングを必要としない唯一の出力はマウスボタンです(オブジェクトの左アウトレットから出力されます)。

キーボードの観察

mousestate オブジェクトの隣には modifiers オブジェクトがあります。これは(右から左の順で)、キーボード上の [Shift] 、[Caps Lock]、[alt]、[ctrl]、[Command] の各キーをトラッキングします。これらの出力もすべてポーリングが必要ですが、パッチの中でこれらの修飾キーのステート(状態)をキャプチャする優れた方法があります。

次の3つの小さいパッチは、コンピュータキード上でキーが押されたかどうかをキャプチャするものです。マウスメッセージと異なり、キーストロークはキーが押された場合と放された場合にのみ値を出力します。そのため、メッセージの時間密度を減らすためにポーリングを行なう必要がありません。最も左側のパッチでは、キーが押されたときにそのASCII 値を取得する key オブジェクトが使われています。この出力はナンバーボックス(これは値を表示するためにあります)に送られ、itoa オブジェクトに渡されます。itoa オブジェクトは整数値をアルファベット文字のシンボルに変換します。これが Max ウィンドウに(print オブジェクトを介して)送られることによって、押されたキーの文字を見ることができるのです。あなたの名前をタイプし、Max ウィンドウを見て下さい。key オブジェクトから出力される整数値が対応するシンボルに正しく変換されていることに注目してください。表示されない文字に対応するキー、例えば [Return] キー(ASCII 13)や [tab] キー(ASCII 9)では、Key オブジェクトから正しい数値が出力されますが、Max ウィンドウでは1つの空白行になります。

すぐ右の小さなパッチでは、keyup オブジェクトを使っています。これはほとんど key オブジェクトと同じものですが、キーが放されるまでキー情報を出力しない点が異なっています。これは、キーが放されたときだけに生じるようなアクションを必要とするような状況で役に立ちます。key からメッセージを受信したときにアクションを切り替え、keyup からメッセージを受信したときにそれをオフにすることができます。

次の小さなパッチでは、key オブジェクトの出力に対し、numkey というオブジェクトを使っています。これは非常に便利なオブジェクトで、これを使って整数による数値をキーボード入力することができます。数値をいくつか入力してみて下さい。右側のアウトレットでその数字が蓄えられていくようすを見ることができます。[Return] キーを押すと、この数字が左アウトレットから整数値として出力されるのがわかるでしょう。このことは、numkey オブジェクトが数字の蓄積とキーボード値の数値への変換をすべて実行していることを意味しています。このパッチが整数の出力にだけを行なう点に注意して下さい。浮動小数点数を出力されたい場合には、numkey オブジェクトに 不動小数点数アーギュメント(0.00のような値)を与え、オブジェクトに対して、小数点に留意し、浮動小数点数で出力するように命じておく必要があります。

mousefilter による出力のコントロール

最後に、最も右のパッチでは、mousefileter と呼ばれるオブジェクトの動作を示しています。上側のSlider をドラッグしてもマウスボタンを放すまで出力は何も行なわれません。これは、不必要な中間データの生成を制限するために使うことができる、もう1つの便利なオブジェクトです。このケースでは、スライダの動きが完全に終わるまで、どのようなアクションも実行して欲しくはありません。mousefilter によって slider オブジェクトの出力にフィルタをかけることによって、マウスボタンが放されるまで、すべての出力が抑えられます。

「賢い」パッチの生成

これまで説明してきたようなオブジェクトやテクニックを使って、キーボードやマウスの動きに基づいて「賢く」動作するパッチを作ってみましょう。250 をアーギュメントに持つmetro オブジェクトを2つ作り、アウトレットに button オブジェクトを接続して下さい。これがテストの対象になります。最も左のパッチからスタートして、mousestare の左端のアウトレット(これはマウスボタンのステート(状態)を出力します)を2つの metro オブジェクトのインレットに接続します。パッチをロックして、マウスボタンを押すと、metro オブジェクトがオンになり、放すと metro オブジェクトが停止することを確認して下さい。

次は、slider を使って水平のマウス位置をトラッキングしてみましょう。パッチに slider を追加し、これを mousestate の第2アウトレットに接続してください。これが意味を持つためには、slider の出力範囲を変更する必要があります。size メッセージを使って(または、オブジェクトインスペクタを使って)、slider の出力範囲の最大がスクリーンの幅のピクセル数になるように変更して下さい。これで、mousestate でポーリングしている metro オブジェクトをオンにすると、マウスの水平移動と共に slider が動くのを見ることができます。

この値を2つの metro オブジェクトが出力する速さのコントロールに使用しましょう。slider のアウトレットを、先ほど作った最初の metro の右インレットに接続して下さい。これで、マウスを(button を押したままで)動かすと、マウスがある位置に基づいて最初の metro の速さが変化するのがわかります。さらに、slider を使って第2の metro オブジェクトの速さをコントロールしますが、演算オブジェクトを使ってこの速さをスケールしましょう。* オブジェクトをパッチに追加して、アーギュメントを 2 にします。そして、これをslider と 第2の metro オブジェクトの右インレットの間に接続します。これで、マウスを(マウスボタンを押したままで)動かすと、2番目の metro が最初の metro の2倍の間隔で出力し、この2つが共にマウスの位置によってコントロールされるのを見ることができます。

最後に、キーボードを使って * オブジェクトがスケールする値を変更してみましょう。 numkey オブジェクトの左アウトレットの出力(これは、[Return] キーが押された後にだけ値を出力します)を使います。これを * オブジェクトの右インレットに接続して下さい。これで、数字キーを使って数値を入力し、第2の metro をスケールする値を変更することができます。この場合、変更を行なうためにナンバーボックスをクリックする必要はありません。数値を入力して(例えば 3 で試してみて下さい) [Return] キーを押し、それからマウスクリックの機能を試すことによって、このパッチをテストすることができます。metro オブジェクトは現在のマウス位置に反応するはずです。

結び

このチュートリアルではMax パッチのコントローラとしてコンピュータ自身を使用する方法について示しました。単にユーザインターフェイス要素だけを頼るのではなく、マウスやキーボードから直接に値を得ることができます。そして、その結果の値を使ってパッチの動作を変えることができます。

参照

itoa 整数を ASCII 文字に変換します。
key コンピュータキーボードからのイベントを出力します。
keyup コンピュータキーボードのキーを放したときのイベントを出力します。
modifiers キーボードの修飾キーの状態を報告します。
mousestate マウスやカーソルに関する情報を取得します。
mousefilter マウスボタンを放したときにだけ情報を出力します。
numkey 数値キーが押された場合に処理を行ないます。