チュートリアル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ドキュメント「Tutorial and Topics」の中のチュートリアル29で説明されており、この章でも検討します。とはいえ、他の多くのケースでは、MIDIデータの線形な数値の範囲を人間の知覚の非線形な側面にマップ(写像)する必要があるでしょう。(例えば、人間のピッチの知覚での12半音の増加が、周波数では2の累乗となること等)。これは、他のタイプのマッピングを必要とします。;いくつかの例について、このチュートリアルで検討していきます。

MIDIによるシンセシスパラメーターの制御

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

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

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

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

Macキーボードからの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の値を受取り、他のインレットから受取るxmin、xmax、ymin、ymaxの値に基づいて正確な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)を追加されていて、LFOがサブオーディオ領域の周波数でキャリア周波数をモジュレートすることでビブラートを付け加えています。ビブラートの深さ(デプス)が基本周波数の上下に等間隔となるように、LFOのアウトプットをpow‾のべき関数の指数として使用します。

ビブラートの係数を計算

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

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

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

まとめ

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

<-前の章 次の章->