チュートリアル20:
コンピュータのキーボードの使用

ASCII オブジェクト

コンピュータのキーボードをタイプすると、どのキーがタイプされたかを報告するメッセージがコンピューターに送信されます。Max はこの情報を受信し、解釈するオブジェクトを持っています。

American Standard Code for Information Interchange( ASCII )はキーナンバリングの標準システムです。key オブジェクトは コンピュータのキーボードからキーダウン・メッセージを受信し、左アウトレットから、タイプされたキーの ASCII ナンバーを出力します( Keyはコンピュータのキーボードから直接入力を受けるため、インレットを持ちません)。これによって、ASCII ナンバーはパッチ内で他の数値と同じように扱うことが可能になります。

keyup オブジェクトは key と同様なオブジェクトですが、キーが放されたとき(キーボードからのキーアップ・メッセージが受信されたとき)にそのキーの ASCII ナンバーを出力します。numkey オブジェクトは keykeyup オブジェクトからの ASCII ナンバーを受信し、これを解読して、キーボードで数値がタイプされたかどうかを判定します。このオブジェクトはユーザが入力した数値の値を報告します。

key

このサンプルパッチは複合されたものではなく、単独のパッチです。パート A の上にあるのが key オブジェクトです。コンピュータのキーボードのキーを押すごとに、keyはそのキーの ASCII ナンバーを左アウトレットから送信します。ASCII ナンバーは splitと呼ばれるオブジェクトに送信されます。

split

split オブジェクトは関係演算子と gate を組み合わせたもので、それは特定の数値の範囲を検出します。範囲内の数値を左インレットで受信した場合、その数値を左アウトレットから送信します。そうでない場合には、右アウトレットから送信します。

split の範囲の最小値と最大値はアーギュメントとして書き込むことができます。また、中央と右のインレットで与えることもできます。このケースでは、ASCII ナンバーの120から122(キー x, y, z )は左アウトレットから、他のすべての ASCII ナンバーは右アウトレットから送信されます。

キー・コマンドを使用した gate のコントロール

キー x, y, z (120,121,122)をタイプすると何が起きるのか見てみましょう。最初にキーナンバーから120が引かれ、その結果、数値は0,1,2となります。これらの数値を使用して gate をコントロールします。文字 x は gate を閉じ、文字 y は左アウトレットを開き、文字 z は右アウトレットを開きます。

notein からのピッチ情報は、gate の開いているアウトレットを通過します。そのため、文字 y がタイプされた場合、ピッチは - 12 オブジェクトに渡され、1オクターブ下にトランスポーズされます。文字 z がタイプされた場合、ピッチは + 12 オブジェクトに渡され、1オクターブ上にトランスポーズされます。x がタイプされた場合、gate は閉じられ、ピッチは渡されません。

トランスポーズされたピッチは flush オブジェクトでベロシティと結合され、noteout に送信されます。

・キーコマンドx, y, z をそれぞれタイプし、MIDI キーボードを演奏した場合に各コマンドによって生じる効果の変化をよく聴いて下さい。

トランスポーズした音を消す

一見したところ、flushオブジェクトはこのパッチでは不必要なのではないかと思うかもしれません。 なぜ、ピッチは noteoutでベロシティと結合することができないのでしょう?それも可能ではあるのですが、いくつかのノートオフ・メッセージがシンセサイザに受信されないという可能性が残ります。次のシナリオに沿って考えてみて下さい。

ピッチを1オクターブ下にトランスポーズするために、文字 y をタイプしたと仮定します。その後、MIDI キーボードで C3(60)を押したままにします。これによってノート 48 が noteout に送信されるでしょう。MIDI キーボードでノート60を放す前に z をタイプしてピッチを1オクターブ上にトランスポーズします。その後ノート60を放すと、ノート72のためのノートオフがシンセサイザに送信されます。ノート48はオフにならないはずです。

このような潜在的な問題を解決するために、ノートをまず最初に flushオブジェクトに送信します。gate の左インレットで数値が受信される毎に、オンのままになっているノートをオフにするための bangflushに送信されます。この方法によって、gate の状態が変更されたときにオンになっている音に対しても、ノートオフが常に送信されることになります。


gate がコントロール・ナンバーを受信すると、flush に bang が送信されます

もちろん、演奏とキーコマンドを同時に行わなければこのような予防策は必要ありません。しかし、一般的なルールとして、音を処理する(例えば、音のトランスポーズなどを行なう)場合、ノートオン・メッセージが常に対応するノートオフ・メッセージを伴っているということを確認しておくのは大切なことです。ノートを演奏している間のトランスポーズの変更や、gate を閉じることなどによって、このような問題はよく起こります。

numkey

パッチのパート B は、numkey が コンピュータのキーボードでタイプされた数値をどのように解釈するかを示しています。key オブジェクトからの ASCII 値は numkey に送信されます。(キー x, y, z は除きます。これらは数字キーではないため、いずれにせよ numkey はこれらを無視します。)

数字がタイプされると、numkeyは右アウトレットから現在の数値を送信します。 [Delete] ( [Backspace]) キーで最後に入力した数字を消すことができます。数値を間違えずに入力したら、Macintosh では [Return] または [Enter] キー、Windows では [Enter] キーを押して、数値を左アウトレットから送信することができます。通常、右アウトレットはタイプされた数字を示すために使用され、左アウトレットは実際に数値を送信するために使用します。

・コンピュータのキーボードからプログラムナンバーをタイプして、シンセサイザのサウンドを変更してみて下さい。

keynumkeyの組み合わせを使用して数値をタイプすることは、直接 ナンバーボックスにタイプする場合とは異なります。その違いは、ナンバーボックスにタイプする場合には、まずその前にナンバーボックスををクリックしなければならないという点です。keykeyupオブジェクトはタイプされたすべてのキーを受信するため、numkeyを使って数値をタイプする場合には、事前にオブジェクトを選択する必要がありません。

keyup

コンピュータのキーボードをタイプする場合、ちょうど MIDI キーボードで演奏する場合と同じように2つのメッセージがコンピューターに送信されます。1つはキーを押し下げたとき、もう1つはキーを放したときです。keyupオブジェクトは放されたキーの ASCII ナンバーを送信します。

パッチのパート C では、keyオブジェクトの送信した数値とkeyupオブジェクトの送信した数値の到着時間の間隔を測ることにより、キーが押されていた時間を測定しています。

timer

パートCでは、sel オブジェクトを使用して特定の ASCII ナンバーを検出しています。両方の sel オブジェクトとも、キー t(tempoを表わす省略記号として t を選びました)を表す数値116を検出します。 t が押されると、timer オブジェクトの左インレットに bang が送信されます。t が放されると、timer オブジェクトの右インレットに bang メッセージが送信されます。

timerオブジェクトは、左インレットで受信する bangと右インレットで受信する bangの間の時間をミリ秒単位の数値で出力します。

注:timerオブジェクトは、左インレットが出力をトリガするという一般的なルールから外れる例外的なオブジェクトです。この場合、左インレットの bangはタイミング処理をスタートさせますが、右インレットへの bang が経過した時間の送信をもたらします。

デュレーションを使用したテンポの設定

このパッチでは、キーが押されていた時間(デュレーション)を使用して、メトロノームのスピードを設定します。キー t が放されると timerオブジェクトの右インレットにbangが送信され、timerはキーの押されていた時間を報告します( key からのメッセージを使用して、timerをスタートさせています)。

この「キーが押されていた時間」は metroオブジェクトの右インレットに送信されます。また、同時に / オブジェクトに送られて2で割られてから makenoteの右インレットに送信されます。この方法では、演奏されるノートのデュレーションはノート間の時間間隔の1/2 になり、スタッカートのような効果を生むでしょう。

また、キー t を放すことによって metroオブジェクトがスタートします。timer metro より前にトリガされているため、metroがスタートする前に、時間の値が metro makenote に到着しているという点に注意して下さい。


metrometroを停止させるためのピリオドキー(.)がタイプされるまでmakenoteにピッチ値96を送信します。

・ キー t を押したままにする時間を様々な長さに変えて、metro オブジェクトのテンポ(そして音のデュレーション)が変わるようすを聴いて下さい。ピリオドキー (.) をタイプして、 metro を停止させて下さい。

まとめ

key オブジェクトは コンピュータのキーボードでタイプされたキーの ASCII コードを報告します。keyup オブジェクトはキーを放したときに、その ASCII コードを報告します。 numkey オブジェクトは key オブジェクトや keyup オブジェクトから受信した ASCII コードを解釈し、タイプされた数値を報告します。

key keyup からの ASCII 値を使用して、パッチにコマンドを送信したり、gateを開いたり、処理をトリガしたりすることができます。sel のような関係演算子を使用して、タイプされた特定のキーを検出できます。

split オブジェクトは特定の範囲内の数値を検出します。範囲内の数値が入力されると、その数値を左アウトレットから送信します。そうでない場合は、右アウトレットから送信します。

2つのイベントの間で経過した時間を timer オブジェクトを用いて取得することができます。timerは左インレットで受信した bangメッセージによってスタートし、右インレットで bang メッセージを受信したときに、それまでに経過した時間を出力します。

参照

key コンピュータのキーボードで、押されたキーを報告します。
keyup コンピュータのキーボードで、放されたキーを報告します。
numkey コンピュータのキーボードで、タイプされた数値を解釈します。
split 数値の範囲を検出します。
timer 2つのイベント間で経過した時間を報告します。