このチュートリアルでは、MIDIノートの生成や操作における難しい問題の1つに対処する方法をいくつか見ていきます。その問題とは、ノートオンとノートオフという一対のメッセージの取り扱いです。ここでは、makenote を使って、指定された時間間隔で正確に一対のメッセージを生成し、stripnote と flush を使って、入力される一対のメッセージをコントロールします。さらに、sustain オブジェクトを使って、サスティンペダルのような動作が要求されるケースに対応します。
MIDI シンセサイザやサンプラを使う際に最も気になる状況の1つは、デバイスにノートオンメッセージが送信されているにもかかわらずノートオフメッセージが送信されないことです。その結果、「スタックノート」という状態になり、そのMIDIノートはずっと鳴ったままになってしまいます。これは決して良い結果をもたらしません。また、そのパッチの使用者には「バグ」として見られてしまうかもしれません。
このチュートリアルでは、ノートオンとノートオフという2つのメッセージの適切な組み合わせを維持するための、様々な方法について見ていきます。このような管理を助ける Max オブジェクトを使うことによって、対になっていないノートメッセージが原因で起きるような誤りを防ぐことができます。
チュートリアルを開いて下さい。
Max の最もポピュラーな使用法の1つは、いろいろな Max オブジェクトを用いたジェネレーティブミュージック(訳注:アルゴリズムによって生成される音楽)の制作です。当然、このような処理では、接続したサンプラやシンセサイザによって演奏されるノートメッセージの生成を行ないます。数多くのノートメッセージを作る場合、ノートオンメッセージとノートオフメッセージの組み合わせを適切に維持するためには、多くの余計なプログラミングが必要になってしまう可能性があります。
Maxには、makenote というオブジェクトがあります。このオブジェクトは、任意のピッチ/ベロシティの組み合わせでノートオンメッセージを作り、設定されたデュレーション(持続時間)の後、これに対応するノートオフメッセージを生成します。左端にあるパッチはこのmakenote オブジェクトの動作を示しています。ここでは、用意されたsliderオブジェクトを使って、ピッチ、ベロシティ、デュレーションを選ぶことができます。makenote オブジェクトはノートオンメッセージを生成し、選択されたデュレーションが経過した後、自動的にノートオフメッセージ(実際には、ベロシティ 0 のノートオンメッセージです)を続けます。makenote の2つのアーギュメントはデフォルトのベロシティとデュレーションの値ですが、この値は対応するインレットで新しい値を受け取ると変更されます。ほとんどの Max オブジェクトと同様、makenote も左インレットだけがホットインレットです。中央と右のslider オブジェクトではパラメータが設定されるだけですが、左端のslider をドラッグするとMIDIイベントが波紋のように発生します。
右下の noteout オブジェクトをダブルクリックして、有効なMIDI出力先を選んで下さい。その後、ピッチ、ベロシティ、デュレーションの値を調整して下さい。ノートが生成され、設定されたデュレーションに基づいてオフにされるようすを聴くことができるはずです。ノートイベントは、同時にprint オブジェクトにも送信しています。Max ウィンドウを見ると、個々のノートの後に、対応するノートオフメッセージが続いていることがわかるでしょう。このオブジェクトは、複数のノートが同時になっているような場合でも、ノートオフメッセージを正しくキュー(待ち行列)に入れます。makenote オブジェクトの使用は、Max で演奏するノートを生成するための簡単な方法です。この場合、ノートオンメッセージを追跡してノートオフメッセージを作成するようなプログラミングを行なう必要はありません。
チュートリアルの2番目のパッチでは、MIDI デバイスから受信したノートオフメッセージを取り除き、パッチでノートオフメッセージを明示的にコントロールする処理を行なっています。多くの場合、キーボード(あるいは他のMIDI 入力デバイス)からのノートオフを避け、プログラム上でノートオフメッセージを生成したいと考えるでしょう。この2番目のパッチでは、notein オブジェクトから受け取ったMIDI ノートメッセージを stripnote オブジェクトに送っています。このstripnoteオブジェクトは MIDI デバイスから送られてくるノートオフメッセージをすべて取り除きます。この結果、パッチのそれ以降の部分はノートオンメッセージだけを渡され、必要なときにノートをオフにする責任役割を果たしています。
ノートオンをトラッキング(追跡)し続けるための、最も便利なツールの1つに flush オブジェクトがあります。このオブジェクトは内部に管理用のテーブルを作り、まだ対応するノートオフメッセージを受信していないノートオンメッセージの情報を保持します。さらに、flush は 左インレットでbang を受信すると、ノートオフメッセージを受信していないノートすべてに対してノートオフメッセージを生成します。このケースでは、ノートオフメッセージをすべて除去しているため、flush のテーブルには、MIDIデバイスで演奏したすべてのノート情報が保持されています。このノートをオフにしたい場合、button オブジェクトをクリックして flush オブジェクトに bang メッセージを送信します。これにより、演奏されたすべてのノートに対するノートオフメッセージが生成され、その後、
flush の内部のテーブルにあるノート情報がクリアされて、次からのイベントに対する準備が整います。notein オブジェクトをダブルクリックして有効なMIDI入力デバイスを選択して下さい。MIDIキーボードを使ってノート情報をいくつか生成して下さい。演奏された音は、button をクリックして flush からノートオフメッセージを出力させるまで鳴り続けます。ノート情報は(print オブジェクトを使って)Max ウィンドウにも送られています。そのため、Max ウィンドウでメッセージの流れを確認することができます。
stripnote オブジェクトを使ってMIDIノートの使用をコントロールする方法は、演奏エンジン(訳注:演奏処理を行なうプログラムの中心部分)がキーボード以外のコントローラに対して敏感に反応する必要がある場合に便利なものです。stripnote と flush の組み合わせを使うと、明確にオフにされていないノートすべてに対して、確実にMIDIノートオフメッセージを生成することができます。
3番目のパッチも似たような機能を持っています。ここでは、明確に停止されるまで音が鳴り続けます。しかし、この機能は toggle がオンになっている場合にだけしか動作しません。それ以外のケースでは「ノーマル」な動作を行ない、受信したノートオフメッセージがそのまま出力されます。
このオブジェクトの機能は、ピアノのサスティンペダルに良く似ています。サスティンペダルが「オン」の場合、キーから指を離しても音は鳴り続けます。そして、ペダルを離すと音は鳴り止みます。したがって、ペダルは第2のレベルでのコントロールを可能にしてくれています。sustain オブジェクトはこの動作をシミュレートしたものです。sustain オブジェクトは右インレットでゼロ以外の値を受信すると、同じインレットで 0 というメッセージを受信するまで、すべてのノートオフメッセージを保持しています。このような方法によって、ノートオン/ノートオフメッセージの対応をプログラムとして管理しなくても、サスティンペダルンの動作をシミュレートすることが可能になっています。多くの場合、sustain オブジェクトは、MIDI コントローラ64(サスティンペダルコントローラ)と関連付けると便利です。これにより、キーボードから送信されたペダルコントロールメッセージに対して、パッチが適切に反応します。
前の例と同じように、右側のnotein オブジェクトでMIDI 入力デバイスの設定を行なって下さい(必要であれば、中央の notein で入力デバイスを外す設定を行なって下さい)。まず、いくつかのノートを通常の状態で演奏し、その後、toggle ボックスをクリックして演奏してみて下さい。toggle ボックスをクリックすると、音が鳴ったままになるはずです。
ほとんどのMIDI シンセサイザやサンプラは、一対のノートオンメッセージとノートオフメッセージを必要とします。これを怠ると、「スタック(鳴ったままの)」ノートが生じてしまいます。Max には、このノートオン/ノートオフの対応を維持することを助けるオブジェクや、MIDI ノートの生成や演奏をプログラム上で行なうことを可能にするオブジェクトがいくつかあります。ノートのデュレーション(持続時間)があらかじめ計画されている場合、makenote オブジェクトはMIDI ノートの生成を完璧に行なってくれます。ノートオフの生成をコントロールする必要があり、ノートオフを送信していないノートオンメッセージを「バックアップ」しておきたい場合、stripnote と flush を組み合わせて使用することがよりよい選択と言えます。最後に、sustain オブジェクトを使うと、標準キーボードのサスティンペダルをシミュレートすることができ、この機能をプログラミングする必要がなくなります。
makenote | ノートオンメッセージに対応するノートオフメッセージを供給します。 |
stripnote | ノートオフメッセージを取り除くフィルタ |
flush | 現在オンになっているノートをオフにします。 |
sustain | コマンドによって出力するまで、ノートオフメッセージを保持します。 |