チュートリアル 18;MIDIコントロール
MIDI の MSPへのマッピング

MIDIの領域 vs. MSPの領域

MSPの最も大きな資産の1つは、MIDIとデジタル信号処理を容易に結合できることです。利用可能なMIDIコントローラによる大きな多様性は、MSPでサウンドをコントロールするために使用するインストゥルメントに関して多くの選択肢を持つことを意味します。MaxはすでにMIDIプログラミングのための十分に発達した環境であり、MSPは完全にその環境に組み込まれるので、MSPのコントロール・パラメータとしてMIDIを利用することは難しいことではありません。

MSPのコントロールにMIDIを使用するプログラムを設計する上での主とした問題点は、2つのタイプのデータのために必要とされる数値の範囲を調整することです。MIDIデータバイトは、0 〜 127の範囲の整数だけを用います。そのため、Maxの大部分の数値演算処理は整数によって行われ、ほとんどのMaxオブジェクト(特にユーザインターフェースオブジェクト)は主として整数を扱います。それに対してMSPでは、オーディオ信号の値は一般的に-1.0〜1.0の範囲の10進数(小数)をとり、その他にも多くの値(例として周波数など)が広い範囲と数桁の精度を必要とします。従って、MSPでは、ほとんどの演算処理は浮動小数点(10進数)の数値によって行われます。

多くの場合、この「非互換性」は、1つの範囲(例えば、MIDIデータの0〜127の値)の、他の範囲(例えば、多くのMSPオブジェクトのインレットで受け取られる0〜1の値)へのリニアマッピング(線形写像)によって、簡単に一致させることができます。リニアマッピング(線形写像)は、Maxチュートリアル29で説明されていますが、この章でも再度検討します。しかし、他の多くのケースでは、MIDIデータの線形な数値の範囲を人間の知覚の非線形な側面にマップ(写像)する必要があるでしょう。(例えば、人間のピッチの知覚での12半音の増加が、周波数では2の累乗となることなど)。これは、異なったタイプのマッピングを必要としますが、そのいくつかの例についてはこのチュートリアルで述べられています。

MIDIによるシンセシス・パラメータのコントロール

このチュートリアルパッチでは、MIDIのコンティニュアスコントローラ・メッセージを使って、FMシンセシスパッチの様々なパラメーターをコントロールします。シンセシスは、チュートリアル11で紹介されたサブパッチ simpleFM~ を使ってMSPで実行され、MIDIコントローラ1(モジュレーションホイール)を振幅、変調指数、ビブラートの深さ、ビブラートの速さ、ピッチベンドの順に作用するようにマップします。


FMシンセシスサブパッチはMIDIによってモデュレートされるサウンドジェネレータです

実際に使用するインストゥルメントを設計する場合、おそらく各々のパラメータを別々のタイプのMIDIメッセージで(コントローラ7を「振幅」、コントローラ1を「ビブラートの深さ」、ピッチベンドを「ピッチベンド」、等というように)コントロールするでしょう。しかし、このパッチでは、ほとんどのMIDIキーボードでの動作を保証するために、すべてのコントロールにモジュレーションホイールコントローラを使用します。このパッチは良いシンセサイザ設計のモデルではありませんが、各パラメーターを別々にモジュレーションホイールによってコントロールします。

パッチャーウィンドウの右下隅では、コンピュータキーボードの0から5のキーがウィンドウの最上部にあるポップアップ umenu の項目を選ぶために使用されているのを見ることができます。


コンピュータキーボードからのASCIIコードはMIDIコントローラのアサイン(割当て)に利用されます

umenu は選ばれた項目を gate に送り、gate のアウトレットの1つをオープンします。こうして、モジュレーションホイールのコントロール値をシグナルネットワークの特定の場所に伝えます。


gate はシグナルネットワークの特定の場所にコントロールメッセージを伝えます

これから、各々のパラメーターをマッピングする場合にそれぞれ必要な条件を見ていきますが、その前にまずリニアマッピング(線形写像)のための式を検討しましょう。

リニアマッピング(線形写像)

リニアマッピングの問題は次のようなもです:「範囲 xmin から xmax の間にある値 x が与えられたとき、範囲 ymin から ymax において該当する位置にあたる値 y を見つけなさい。」例えば、3が範囲0から4の内で占める位置は、0.45が範囲0から0.6で占める位置に該当します。この問題は次の式によって解くことができます:

y = ((x - xmin) * (ymax - ymin)/ (xmax - xmin)) + ymin

このチュートリアルのために、我々は方程式を解く map というサブパッチを設計しました。mapは左インレットでxの値を受信し、他のインレットで受信した xminxmaxyminymax の値に基づいて正確な y の値を送信します。この方程式によって、シグナルネットワークのために必要とされるいろいろな他のコントローラ値の範囲(0から127)をマップすることができます。mapサブパッチは、パッチャーウィンドウの右上に示されています。


サブパッチmapの内容:exprオブジェクトで表される線形写像の公式

mapによってコントロール値の範囲をスケールした後、以下に述べるような、様々な信号処理の目的に合わせたマッピングの追加が必要になるでしょう。

MIDIの振幅へのマッピング

MSPチュートリアル4で言及したように、私たちは加法的スケールではなく、乗法的(累乗)スケールで振幅の関係を知覚します。例えば、振幅0.5と0.25(係数は1/2で差は0.25)の間の振幅の関係は、振幅0.12と0.06(係数は同様に1/2だが差は0.06)の間の関係と同じものとして聞こえます。この理由から、線形のスケール上で(MIDIの0〜127の値を利用して)振幅の関係を表現しようとする場合、デシベル(dB)を使うほうがより適しています。

toggleをクリックしてオーディオをオンにして下さい。値5を入力(または umenu から "Amplitude" を選択)して、コントローラの値が出力の振幅に影響するように指定して下さい。

umenuで選ばれる項目の値はまた、preset オブジェクトのプリセットを呼び出し、マップする範囲の値を提供します。この場合、yminは -80、ymaxは 0なので、モジュレーションホイールが0から127まで動くとき、振幅は -80dBから0dB(振幅全体)まで動きます。デシベルの値は、dBtoAというサブパッチが呼び出され、振幅に変換されます。これは、直線を指数曲線(知覚される音の大きさをスムーズに増加させるために必要な曲線)に変換するものです。


サブパッチ dBtoA の内容

・MIDIキーボードのモジュレーションホイールを動かして、音の振幅を変更して下さい。振幅をちょうどよく聞こえるようなレベルにセットして下さい。

このマッピングによって、コントローラの値が10変化するごとに、振幅はおよそ係数2を掛けたものになります。これによって、低い振幅値でのコントロールの変化量が、高い振幅値での場合と同じようになります。(これは、直線的なリニアマッピングによるものではありません。)

MIDIの周波数へのマッピング

私たちの相対的なピッチに対する知覚もまた、周波数に関して加法的ではなく乗法的です。同じ間隔のピッチを聞くためには、周波数は2の累乗として変化させなければなりません。(MSPチュートリアル17、および MSPチュートリアル19の、ピッチから周波数への変換についての解説を参照)

・ 値1を入力(または、umenu から "Octave Pitch Bend" を選択)して、コントローラの値がキャリア周波数に影響するように指定して下さい。モジュレーションホイールを動かして、ピッチを上方へ1オクターブだけベンドし、もとの周波数に戻って下さい。

モジュレーションホイールがピッチベンドを1オクターブ実行するために、その範囲を0 から1にマップしています。この値は、2の累乗(べき)関数の指数として用いられ、exprで基本周波数に掛け合わせられます。


20 から21までのオクターブベンド係数

20 = 1であり、21 = 2なので、コントロール値が0から1まで変化するにつれて、キャリア周波数は220から440まで増加します。これは「1オクターブ上である」と言われます。220から440への周波数の増加は指数曲線をたどり、AからAまで、ピッチの知覚上では直線的な増加を生じます。

MIDIの変調指数へのマッピング

MIDIコントローラの、FMインストゥルメントの変調指数へのマッピングは、線形のコントロールが要求されるので非常にシンプルです。コントローラの値が map サブパッチによって変換されてしまえば、それ以上の修正はもはや必要ありません。モジュレーションホイールは変調指数を0(全くモデュレートされない)から 24(最大のモジュレーション)まで変化させます。

・値4を入力(または umenu から "Modulation Index”を選択)して、コントローラの値が変調指数に影響するように指定して下さい。モジュレーションホイールを動かして、音の音色を変えて下さい。

MIDIのビブラートへのマッピング

このインストゥルメントは LFO(Low Frequency Oscillator - 低周波発振器)を追加されていて、LFOがサブオーディオ領域の周波数でキャリア周波数をモジュレートすることでビブラートを付け加えています。ビブラートの深さが基本周波数の上下に等間隔となるように、LFO のアウトプットを pow~ のべき関数の指数として使用します。


ビブラートの係数を計算

べき関数の基底(モジュレーションホイールによりコントロールされます)は、1 から 2まで変化します。基底が 1 のときビブラートはかかりません。基底が2のときビブラートは±1オクターブになります。

・ビブラート効果を聞く前に、ビブラートの速さとビブラートの深さをセットする必要があります。2を入力し、モジュレーションホイールを動かして、0 以外のビブラートの速さをセットして下さい。そして、3を入力し、モジュレーションホイールでビブラートの深さを変化させて下さい。

このプロセス(順番に各パラメータにモジュレーションホイールを再割当てすること)のぎこちなさは、異なるパラメータ(または、同じMIDIメッセージによって同時にリンクして制御される複数のパラメータ)のためには別々のMIDIコントローラが必要であることを物語っています。正確に反応するようなインストゥルメントでは、一度にこれらのパラメータを制御することを可能にしたいと思うでしょう。次章では、より現実的なMIDIのMSPへのアサインメント(割当て)を紹介します。

まとめ

MIDIメッセージはMSPインストゥルメントのコントロール・パラメータとして容易に使用でき、MIDIデータは適当な範囲にマップされて提供されます。map サブパッチは、リニア・マッピングの方程式を実行します。MIDIがMSPの周波数、振幅に影響を与えるパラメータをコントロールするために使用される場合、ピッチや、音の大きさの知覚のなめらかな変化を作り出すためには、MIDIデータの 0 から 127 までの線形な範囲は指数曲線にマップされなければなりません。dBtoA サブパッチは、線形な範囲を、振幅の指数曲線上のデシベル(dB)へマップします。pow~ オブジェクトは、シグナルによる指数計算を可能にします。