チュートリアル13:
MIDI ノートの送受信

ノートオンとノートオフ・メッセージ

Max からシンセへノート・メッセージを送信する際、1つの大きな問題に遭遇します。それはすべてのノートオン・メッセージに対して、対応するノートオフ・メッセージを送信する必要があるということです。 例えば、単に noteout にピッチとベロシティを送信してシンセサイザを演奏しただけでは、それらの音はベロシティ 0 の同じピッチを送信するまで鳴り止みません。

makenote

Max は シンセサイザに送信した音を消すためにノートオフ・メッセージを生成するオブジェクトを持っています。このようなオブジェクトの1つが makenote です。

makenote は左インレットに数値を受信すると、それをピッチ値として、そのピッチとベロシティを結合し、その数値を2つのアウトレットから送信します。そして、指定されたディレイ(あるいはデュレーション)の後で、 makenote は自動的に ベロシティ値が 0 の同じピッチ・ナンバーを送信します。

シンセサイザはベロシティが 0 のノートオン・メッセージをノートオフとして解釈します。このため makenote の出力が noteout に送信される場合、ノートオンとノートオフの両方がシンセサイザに送信されます。

・パッチ 1 の pitch と表示された slider をドラッグして下さい。slider から出力されるそれぞれの数値は makenote によってベロシティと結合させられ(この場合ベロシティは最初のアーギュメントによって 127 に指定されています)、ピッチとベロシティは noteout に送信されます。

それぞれのピッチが受信された50ミリ秒後に(デュレ?ションは2番目のアーギュメントで指定されています)makenote は同じピッチをベロシティ 0 で再び送信します。その結果、すべての音が50ミリ秒のデュレーションを持つようになります。

ベロシティとデュレーションは、中央インレットと右インレットで受信した数値によって変化させることができます。これらのインレットに最も新しく受信された値が、次に左インレットでピッチを受信した場合に使用されます。

slider オブジェクトをドラッグしてベロシティとデュレ?ションを変化させてみて下さい。その後、 pitch と表示されたslider をドラッグしてさらにノートを演奏して下さい。ノートは指定したベロシティとデュレ?ションの値をを持つようになります。

注:noteout のチャンネル・ナンバーが、タイプイン・アーギュメント(書き込まれたアーギュメント)や右インレットで受け取った値によって指定されていない場合、チャンネルはデフォルトのチャンネル1に設定されます。

パッチ2は、ピッチ、ベロシティ、デュレ?ションの値をすべてリストとして左インレットで受信できることを示した例です。

・数値 60 と書かれたメッセージボックスをクリックして下さい。ベロシティ 64 と結合されたことがわかります。そして、250 ミリ秒後に ベロシティ 0 と結合されます。

・リストが書き込まれたメッセージボックスをクリックして下さい。 ピッチ 72 は ベロシティ 96 と共に送信されます。そして、1.5秒後にベロシティ 0 と共に再び送信されます。

・再度、数値 60と書かれたメッセージボックスをクリックして下さい。makenote に格納されているベロシティとデュレーションの値を見ることができます( 961500)そして、これが左インレットで受信されるピッチに適用されます。

stripnote

stripnote オブジェクトは言わば「逆 makenote 」のようなものです。これはインレットでピッチとベロシティを受信し、ベロシティが 0 でない場合に限ってそのデータを通します。この方法によって stripnote はノートオフ・メッセージを取り除き、ノートオン・メッセージだけを通過させます。

MIDI キーボードの鍵盤が押された場合にのみデータを得たい場合、このオブジェクトは役に立ちます。 例えばキーボードからのピッチ値を使って、 Max のオブジェクトにその値を送信したい場合、キーが押されたときと放されたときの値を両方とも受信したいとは考えないでしょう。

flush

flush オブジェクトはノートオフ・メッセージを生成するもう1つのオブジェクトです。しかし makenote と違って、特定のデュレ?ションの後に自動的にそれらを生成するわけではありません。 その代わりに flush は自分を通過した音を記録します。左インレットで bang を受信すると、flush はまだオフになっていないノートに対してノートオフ・メッセージを提供します。

flushstripnote は、共に右インレットでベロシティ値、左インレットでピッチ値を受信し、値と同じ型をアウトレットから送信します。これらは右インレットで受信した最も新しいベロシティ値を使用し、左インレットで受信したピッチ値によってトリガされます。2つのオブジェクトは共に、左インレットでピッチとベロシティの値をリストとして一緒に受信することができます。

・MIDI キーボードでいくつかのノートを弾いて下さい。stripnote がノートオン・メッセージのみを通過させ、ノートオフ・メッセージを遮るようすを見ることができます。ノートオンは flush を通過し print オブジェクトで受信されます( flush オブジェクトは受信したノートオフも通過させますが、この場合は stripnote がそれらを取り除いています)。

button をクリックして、flush の左インレットに bang を送信して下さい。 flush オブジェクトは、受信したノートオン・メッセージの中でまだノートオフが送信されていないものをすべて記録していて、bang を受信すると、flush はこれらの保持しているノートに対してノートオフを供給します。

noteout に送信する前にピッチとベロシティのペアを flush に渡すことによって得られる利点は、flushbang を受信するまで何の影響も及ぼさず、bang を受信した後、まだオンになったままのノートをオフにするということです。これは鳴り止まなくなった音を止める場合に役に立ちます。

まとめ

noteout によって送信される MIDI ノートオン・メッセージに対しては、その後に対応するノートオフ・メッセージが送信されなければなりません。これによって、シンセサイザによって演奏された音はオフになります。

makenote オブジェクトはピッチ値とベロシティ値を結合し、これが noteout に送られます。 特定のデュレーションの後に、同じピッチをベロシティ 0 で送ることによって、ノートをオフにします。stripnote オブジェクトは makenote の逆です。これはノートオフ・メッセージ(ピッチとベロシティのペアで、ベロシティが 0 のもの)を取り除き、ノートオン・メッセージ(ベロシティが 0 以外のメッセージ)だけを通過させます。

flush オブジェクトは自分を通過した音を記録し、bang を受信すると、まだオンになったままの状態のノートに対してノートオフを送信します。

参照

flush ノートオンのままになっている音に対してノートオフを供給する。
makenote 各ノートオン・メッセージに続くノートオフ・メッセージを生成する。
poly 異なるボイスに音を割り当てる。
stripnote ノートオフ・メッセージを除外して、ノートオン・メッセージだけを通過させる。
sustain ノートオフ・メッセージをホールドして、コマンドでそれらを出力する。