MIDI チュートリアル 1:
MIDIの基本

イントロダクション

このチュートリアルでは、基本的なMIDI (Musicla Instrument Digital Interface)通信プロトコルの使い方ついて説明します。また、入力デバイスからMIDI情報を受信する方法や、MIDI 情報を他のハードウェアやソフトウェアに送信する方法、送信された情報を取得するデバイスを選択する方法について見ていきます。

ソフトウェアのみによる音楽システムの流行によって、MIDI デバイスの必要性は減少しましたが、ハードウェアやソフトウェアで構成されるシンセサイザやサンプラを扱うためには、依然としてMIDI プロトコルが必要です。MIDI はまた、フィジカルインターフェイス(物理的インターフェイス)を扱うアーティストによってより広範囲に使用されるようになってきています。これは、センサ情報を受信したり、モータなどのコントロール可能なデバイスに対するコントロールメッセージを作成したりする場合に、MIDI がコンパクトで使いやすい通信プロトコルを提供するためです。

midiin、midiout オブジェクト

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

このチュートリアルパッチには、小さな MIDI に特化したパッチがいくつかあります。左端のパッチは、MIDI 入力デバイスで(midiin オブジェクトから)何らかの情報を受信した場合に、ナンバーボックスの値を変更します。その後、情報を別のMIDI デバイスに(midiout オブジェクトを介して)出力します。しかし、ここでは MIDI の入力と出力を行なうために用いるデバイスを選択する必要があります。MIDI デバイスを選択する簡単な方法は、割り当てを行ないたい MIDI オブジェクトをダブルクリックすることです。midiin オブジェクトをダブルクリックすると、利用できるMIDI 入力のメニューが表示され、midiout オブジェクトをダブルクリックすると、MIDI 出力のメニューが表示されます。

コンピュータに接続されている物理MIDI デバイスに加え、いくつかの仮想MIDIポートも表示されることがわかるでしょう。これは、オペレーティングシステムや環境によって決まります。最も便利な仮想ポートはビルトインシンセサイザ出力(組み込みシンセサイザ出力)です。これにより、実際のシンセサイザやサンプラといった物理デバイスに接続しなくても、MIDI メッセージからサウンドを生成することができます。

midiin オブジェクトでMIDI 入力キーボードを選択し、出力にビルトインシンセサイザを選択すると、ごく小さなパッチで、シンプルなMIDI スルーアプリケーションを作ったことになります。midiin オブジェクトと midiout オブジェクトは、フォーマットされていない生の MIDI メッセージを送受信します。midiin オブジェクトの出力を print オブジェクトに送ると、数値の連続したストリームを見ることができるでしょう。これを解釈することは難しいかもしれません。Max には、使用したいMIDI イベントのタイプ(ノート、コンティニュアスコントローラなど)を選び、プログラムの中でMIDI データを十分に利用するための部分的なコントロールを可能にする多くのオブジェクトがあります。

ノートのすべて:notein、noteout オブジェクト

notein オブジェクトと noteout オブジェクトはメッセージに特化したMIDI オブジェクトです。このオブジェクトはMIDI ストリームの入力を受け取り、ノートメッセージ以外のメッセージはすべて無視します。ノートメッセージはもともと、MIDI キーボードのキーでの演奏や、シンセドラムのパッドを叩いた場合に生じるものです。midiinオブジェクト や midioutオブジェクトの場合と同じように、オブジェクトをダブルクリックすると MIDI ポートを選択することができます。

2番目のパッチは基本的なノートメッセージを表しています。MIDI ポートを選択すると、ポートで受信したノートメッセージを見ることができます。notein オブジェクトは、入力されるノートメッセージごとに送信される3つの情報を表示しています。この3つは、ノートナンバー(ピッチ)、ノートベロシティ、MIDI チャンネルです。MIDI キーボード、あるいは他の MIDI ノートメッセージを生成するコントローラを演奏して、ナンバーボックスい表示されるノート情報を見て下さい。

キーが押された場合(ノートオン)とキーが放された場合(ノートオフ)を区別するための、「オン、オフ」表示がないことに気が付くでしょう。ノートオフメッセージは、「オン、オフ」表示ではなく、0(ゼロ)のベロシティ値を持ったノートとして表示されます。これは、通常使用される MIDI の記法で、多くの Max オブジェクトは、ノートオフメッセージを表す望ましい方法として、この記法を使用します。ここではまた、Display Format アトリビュートをMIDI に設定したナンバーボックスを使っています。これは、演奏されたノートのピッチを知るための、わかりやすい手がかりを与えてくれます。

次のパッチは、この逆の処理を行なうシンプルな例です。ここでは、MIDI デバイスで演奏されるノートメッセージを生成します。noteout オブジェクトはピッチ、ベロシティ、チャンネルナンバーを、それぞれ左、中央、右のインレットで受信することを前提にしているものです。左インレット(ピッチ)がホットインレットで、他はコールドインレットです。Maxはメッセージのリストを分解し、オブジェクトのインレットすべてに入力が行なわれたものとみなす機能を持っているため、ここではそれを利用しています。したがって、64 100 0 と書かれたメッセージボックスは、それぞれのインレットへの3つのメッセージ、「チャンネル 0」、「ベロシティ 64」、「ノートナンバ 64」として扱われます。これは、ピッチ 64(E3)、ベロシティ 100、チャンネル 0 のノートオンメッセージとして送信されます。2番目のメッセージボックスはほとんど同じものですが、ベロシティとして 0 を使っています。これは、ノートオフメッセージと同じものです。noteout オブジェクトをダブルクリックして、有効なMIDI出力デバイスを選択して下さい。その後、最初のメッセージボックスをクリックして下さい。デバイスからそのノートの音が鳴るのが聞こえるはずです。この音は、2番目のメッセージボックスをクリックするまで続きます。2番目のメッセージボックスはノートをオフにするものです。これは基本的なMIDIノートイベントの構造で、音楽を演奏するMIDI メッセージを生成する基礎として用いられるものです。

コントローラとポート選択:ctlin、ctlout、midiinfo

右端のパッチはMIDIコントロールデータを再マップする簡単なアプリケーションです。これは、モジュレーションホイールのコントロール値(規約では MIDI コントローラ1)をパンコントロール値(コントローラ 10)に変更します。このケースでは、ctlin と ctlout オブジェクトはMIDIコンティニュアスコントローラメッセージの受信と送信に使用されています。この2つのオブジェクトは、メッセージに特化されたMIDIオブジェクトで、MIDIコントローラ値専用のものです。このメッセージは多くの場合、MIDI フェーダボックスやノブ/ロータリーコントローラから、また、キーボードのサスティンペダルのような、より音楽的なインターフェイスから送信されます。他のオブジェクトと同様、ダブルクリックすることによって、使用するMIDIポートを設定できます。

入力された値はコントロールシステムの設定に使用されます。このパッチは入力されたコントロールナンバー(ctlin の中央アウトレット)を使って、グラフィカルな gate(gswitch 2)オブジェクトにルーティングを行なうかどうかを決定しています。コントローラが1 の場合、== オブジェクトが 1 を出力し、コントローラ値(左アウトレット)がその下のメッセージボックスに送信されるようにスイッチを設定します。送信された値は有効なメッセージに組み立てられ、ctloutに送信されます。ctlout はこの値を(MIDI コントローラ 10、チャンネル 0に割り当てて)選択された MIDI 出力に送ります。

ctlout オブジェクトには、もう1つ別のプログラミングが施されています。button が midiinfo オブジェクトに接続されていて、このbutton が bang を受信すると、umenu オブジェクトにデータがロードされます。このデータは ctlout オブジェクトに送信されています。これはどのようなデータでしょうか?

場合によっては、パッチのユーザがMIDI オブジェクトをダブルクリックしてポートを設定することを望まなかったり、多くのオブジェクトのポートを同時に設定したいことがあるでしょう。midiinfo オブジェクトは、カレント(現在)のMIDI設定に関する多くの情報を提供します。この情報を使って、MIDI オブジェクトのポート情報を設定することができます。ここでは、midinifo オブジェクトが左インレットでbang メッセージを受信すると、現時点であなたのシステムに定義されている、利用可能なMIDI 出力のポート名が出力されます。これを使って、umenu オブジェクトにカレントの MIDI 設定をロードしています。このメニューで項目を選ぶと、その項目が利用したいポートの識別子として ctlout オブジェクトに送信されます。

これは midiinfo オブジェクトの使用法の中の1つだけを示したものです。後のチュートリアルでは別の使用法も紹介します。

基本的なMIDIモニタの作成

MIDI メッセージツールの学習のために、基本的な MIDI モニタリングアプリケーションを作ってみましょう。まず、midiinfo と umenu の組み合わせを利用して、利用可能な MIDI 入力を表示することから始めましょう。MIDI入力を見るためには、midiinfo オブジェクトの右インレットにbang メッセージを送信する必要があります。これは、button オブジェクト、あるいは loadbang オブジェクトを使って行なうことができます。loadbang オブジェクトを使った場合、パッチーがロードされるたびに、menu がロードされます。

ノート情報とコントローラ情報の両方を追跡するために、umenu の出力を noteinオブジェクトと ctlin オブジェクトの両方に送信します。これにより、2つのオブジェクトは同じ MIDI ポートからMIDI 情報を受信するように設定されます。それでは、notein オブジェクトと ctlin オブジェクトのそれぞれのアウトレットにナンバーボックスを接続して下さい。ノートデータとコントローラからのデータは同じタイミングで生成されないため、おそらく「チャンネル」メッセージは1つのナンバーボックスを共用することになるでしょう。最後に、押されたキーのノートがわかりやすいように、ノートメッセージ用のナンバーボックスのDisplay Format を MIDI に変更して下さい。

これは、とてもシンプルなMIDIモニタアプリケーションですが、複雑なMIDI 設定をデバッグする手助けをすることができるアプリケーションの1つです。他のMIDI メッセージに特化したオブジェクトを使用して、このパッチを拡張することができます。例えば、pgmin(MIDI プログラムチェンジ)、bendin(MIDI ピッチベンドメッセージ)などを使って、受信したMIDIデータストリームをさらに詳しく見ることができます。

結び

入力される MIDI ストリームの基本的な内容は、midiin オブジェクトを使って取り出すことができます。また、midiout オブジェクトを使ってMIDI ストリームを送信することができます。しかし、多くの場合、メッセージごとに特化されたオブジェクトを使って、個別のメッセージを扱うほうが簡単です。notein/noteout や ctlin/ctlout オブジェクトは、容易にメッセージを扱うことができる機能を提供します。この場合、生のMIDI入力を解読したり、生のMIDIメッセージを作る必要はありません。

midiinfo オブジェクトは、MIDIセットアップのカレントのステート(状態)を調べるための、パワフルなツールです。これを使って、利用できる MIDI ポートの名前をロードすることによって、パッチの中で容易にMIDIポートを使用できます。これは、数多くのオブジェクトを同時に設定する最も良い方法でもあります。

midiin 入力されたMIDIバイトを出力します。
midiout 整数値を生MIDIデータとして送信します。
notein 入力されたMIDIノートメッセージを出力します。
noteout MIDI ノートオンとノートオフメッセージを送信します。
ctlin 入力された MIDI コントロールメッセージを出力します。
ctlout MIDI コントロールチェンジメッセージを送信します。
midiinfo カレントのMIDIデバイス名でポップアップメニューを設定します。
gswitch2 右インレットを2つの出力の間で切り替えます。