チュートリアル 22:
MIDI パンニング

パンニングによるローカリゼイション(位置の認識)と距離効果

ラウドネス(音量)は、音源がどのくらい遠くに位置するかを認識するための手がかりの一つです。各々の耳におけるサウンドの相対的なラウドネスは、サウンドがどの方向に位置するかを認識する手がかりになります。(距離と位置のための他の手がかりには、左右の聴覚の間のディレイ、反射音に対する直接音の比率などが含まれます。ここでは、ラウドネスについてだけ考えます。)

サウンドが一つのスピーカから聞こえるとき、音源はそのスピーカの方向にローカライズ(位置認識)されます。サウンドが2つのスピーカ間で同じバランスのとき、サウンドは2つのスピーカのちょうど中央の方向にローカライズされます。2つのスピーカの間のバランスが一方から他方に変化するとサウンドは2つのスピーカ間のさまざまな方向にローカライズされます。

用語「パンニング」は、2つの(あるいはより多くの)スピーカから聞こえる1つのサウンドの相対的な音の大きさを調節することを指します。アナログのミキシングコンソールでは、入力チャンネルから2つの出力チャンネルへのパンニングは、通常1つのノブによってコントロールされます。MIDIでは、パンニングは通常0から127までの1つの値によってコントロールされます。どちらの場合も、各々のチャンネルの様々な中間位置での明確な振幅は多くの異なった方法で計算できるにも関わらず、1つの連続した値が2つのステレオチャンネルの間のバランスを記述するために使用されます。

他のすべての要素が同じであるとき、小さいサウンドはより大きいサウンドより遠くにあるように感じられるため、(複数の)チャンネルの関連づけによって作り出される全体的な音の大きさの効果は、距離に関しての重要な手がかりを与えます。従って、パンニングは、単に音源の方向を暗示する適正なバランスについてだけのものと考えるべきではありません。それはまた、距離を暗示するために、関連したスピーカから知覚される音量をもコントロールしなければなりません。

このチュートリアルでは、パンニング(MIDI値0〜127によって制御可能なもの)を計算するための3つの方法を示します。3つの方法を試してみて、与えられた状況の中でパンニングをコントロールするために、どれが最もふさわしい方法かを決定することができます。

パンニング方法をテストするためのパッチ

このチュートリアルパッチでは、反復される「チャープ」(3オクターブ以上にまたがっている速い下方へのグリッサンド)シグナルを使用します。これは、特徴のある、左右のパンが確認しやすいサウンドです。

psound source” サブパッチをダブルクリックしてパッチャーウィンドウを開き、サウンドがどのように生成されるかについて確かめて下さい。

このサブパッチでは、gate~ begin~ オブジェクトを利用することによって、インレットで1を受信してgate~ が開かれるまでオーディオ処理はオフになっています。このとき、phasor~ は周波数2000(Hz)から200(Hz)までの線形なグリッサンドを、1秒につき2回生成します。


p 'sound source' サブパッチ

・サブパッチウィンドウを閉じて下さい。

このサブパッチの出力は、2つの *~ オブジェクト(各々の出力チャンネルのためのもの)に送られますが、そこでは各々の出力チャンネルが1つのパンニングアルゴリズムによってスケールされます。パッチの上部にあるポップアップ umenu から試してみたいパンニングアルゴリズムを選ぶことができます。これは2つの selector~ の各々1つのインレットを開き、適切なパンニングサブパッチからのコントロールシグナルを受信します。同時に、gate オブジェクトのアウトレットを開き、要求されたサブパッチにコントロール値を与えます。パンニングはコンティニュアスコントローラ No.10(MIDIでパンニング用に設計されている)からのMIDI入力によってコントロールされます。あなたのMIDIキーボードが簡単にコントローラ10を送信できない時は、ピッチベンドホイールをパンニングのテストに用いる事もできます。(これに関しては、別にMIDIは必須ではありません。"MIDI panning"と書かれたナンバーボックスをドラッグするだけで十分です。)


umenu の選択によって3つのパンニングサブパッチの1つに入出力をオープンします

リニア・クロスフェード

パンニングを実装する最もストレートな方法は、1つのチャンネルが 1から 0 へ線形にフェードアウトするにつれて、もう1つのチャンネルを 0 から 1 へ線形にフェードインさせることです。これは、最も簡単に計算できるタイプのパンニングです。MIDI値の範囲0 〜127を振幅の範囲0 〜 1の上にマッピングし、その値を右チャンネルの振幅として使用します。左チャンネルには常に1から右チャンネルの値を引いた値がセットされます。唯一の問題点は、MIDI のパンの値 64 は両チャンネル間のバランスが等しいことを意味するように想定されていますが、これが厳密には範囲の中央値ではない(64/127≠0.5)ということです。そのため、MIDI値 0 〜 64 は 65 〜 127とは違った扱いをする必要があります。

psimple linear xfade” オブジェクトをダブルクリックして、パッチャーウィンドウを開いて下さい。


MIDI値 0〜127 を使ってコントロールされるリニア・クロスフェード

2つの振幅の合計は常に1になるため、この方法は全く論理的なように思えます。問題は、サウンドの強さは各々のスピーカの振幅の2乗の和に比例しているということです。すなわち、振幅0.5を演奏している2つのスピーカは、振幅1を演奏している1つのスピーカと同じ強さを供給しません。(従って、同じ大きさとして知覚されません。)このため、リニアクロスフェードによってサウンドが中央にパンされると、両サイドにパンされた時と比べて実際には小さく感じられます。

・サブパッチウィンドウを閉じて下さい。umenuから "Simple Linear Crossfade" を選んで下さい。ezdac~ をクリックしてオーディオをオンにし、toggle をクリックして、「チャープ」サウンドをスタートさせて下さい。そして "Amplitude" ナンバーボックスを使って、ちょうど良いリスニングレベルにセットして下さい。一方のチャンネルからもう一方のチャンネルへゆっくりパンするように、MIDI キーボードのピッチベンドホイールを動かして下さい。パンをしたときにサウンドの音量が一定かどうかを聴いてみて下さい。

このリニア・クロスフェードは、ある状況では適切であるかも知れません。しかし、パンをする間、一定の強さを維持するような方法を見つけてみたいとも思うでしょう。

等距離のクロスフェード

もし、一方から他方へパンをする間、音の強さを一定に維持できれば、リスナーから音源までの距離が一定であるような印象を与えることになるでしょう。幾何学上、これはリスナーを中心とする円弧の上を音源が移動する場合にのみ可能になりますが、この時、リスナーと音源の距離は常に円弧の半径に等しくなります。

1つのチャンネルをコサイン波の1/4サイクルに、もう1つのチャンネルをサイン波の1/4サイクルにマッピングすることによって、この状況をうまくシミュレーションすることができます。従って、ここではMIDI値の0 〜 127の範囲を0 〜 0.25にマッピングし、その結果を、コサイン値、サイン値を計算するための角度として使います。

技術的な詳細:音源が0度から90度までの仮想の円弧上(リスナーを中心とする円の1/4サイクル)を移動する時、その角度のコサインは1から0へ、サインは0から1へ動いていきます。途中のすべての点で、コサインの2乗とサインの2乗の和は1になります。この三角法の恒等式は、ここでの目的である、「振幅の2乗の和が常に一定の強さに等しい。」という状態と同様のものです。そのため、これらの値は、音源とリスナーの距離が一定である状態のシミュレートのために必要となる相対的な振幅を得るための良い方法です。

pconstant distance xfade'”オブジェクトをダブルクリックし、パッチャーウィンドウを開いて下さい。


MIDI値 0〜127 は、コサイン、サイン関数の1/4サイクルにマップされます

ここでも、64 を範囲の中央値として保つために、64より大きいMIDIの値と64以下の値の扱い方を変える必要があります。MIDI値は、いったん0 〜 0.25の範囲にマップされ、その結果は2つの cycle~ オブジェクトの位相角(一方は"コサイン"、もう一方は"サイン"にするために位相のオフセットとして0.75を加算)として使用されます。

・サブパッチウィンドウを閉じて下さい。"Equal Distance Crossfade”を umenu から選んで下さい。1つのチャンネルからもう1つのチャンネルへゆっくりパンをする間、そのサウンドを聞いて下さい。

リニアクロスフェードとの違いがわかるでしょうか? おそらく、リスナーがパンをしているサウンドを聞くときに「運動が円弧状」だという印象を持つかどうかについては、あまり考えなくてもよいでしょう。しかし、パンをする間に著しい強さの "たるみ" を引き起こさないという点だけでも「等距離」の方法が勝っているということは重要です。

スピーカ・トゥー・スピーカ クロスフェード

標準的なステレオスピーカの配置(2つのスピーカはリスナーの前に等距離、等角度で置かれる)が与えられたとき、現実に音源(たとえば、トランペットを演奏する人)が一方のスピーカからもう一方まで直線的に動く場合、実際には、中央の位置での音源とリスナーの距離は、スピーカの位置からの距離よりも近くなります。そのため、音源がスピーカからスピーカまで直線的に動く状況をエミュレートするには、強さがリスナーからの距離に比例するようにその振幅を計算する必要があります。


距離bは距離aよりも短くなります

技術的な詳細:スピーカーの角度(xと-x)がわかっている場合、aとbの相対的な距離を計算するためにコサイン関数が使用できます。同様に、bとcの相対的な距離を計算するためにタンジェント関数が使用できます。2つのスピーカの距離は2cなので、パンのMIDI値が中央値64から遠ざかっていくにつれて、その値は中央から -cと+cの範囲にあるオフセット値(o)としてマップできます。bとoがわかれば、音源とリスナーの距離(d)をピタゴラスの定理を用いて求めることができ、アークタンジェント関数によってその角度(y)を求めることができます。これらのすべての情報を用いると、2つのチャンネルのゲインをa * cos(y±x)/dとして計算することができます。

・ “Speaker-to-Speaker Crossfade”をumenuから選んで下さい。一方のチャンネルから他方までゆっくりパンをする間、そのサウンドを聞いて下さい。"Speaker angle" ナンバーボックスの値を変えると、異なったスピーカ角について試してみることができます。実際のスピーカの位置に最もふさわしい角度を選んで下さい。

スピーカーの角度が増加するに従って、この効果はより顕著になります。これは30 〜 45度まで、最大60度までの "標準的" なスピーカー角の場合に最も効果的です。30度以下の場合、その効果はごく僅かなのであまり有効ではないですし、60度以上の場合には、非常に極端なのであまり現実的ではありません。

p “speaker-to-speaker xfade” オブジェクトをダブルクリックして、パッチャーウィンドウを開いて下さい。

上記の三角法の演算は、このサブパッチで行われています。直線の距離(b)は1にセットされ、他の相対的な距離はそれとの関係によって計算されます。スピーカーの角度(メインパッチでユーザーによって“度”で指定されたもの)は、サイクルの小数部に変換され、最終的には三角法の演算のために(2πまたは6.2832を乗じられて)ラジアンに変換されます。最終的に実際のゲイン値が計算されるときには、クリッピングを避けるために正規化の係数2/(d+b)を掛けられます。音源とどちらか一方のスピーカーの角度が90度より大きくなると、そのスピーカーのゲインは0にセットされます。

・これらの演算についての理解を深めるための参考として、ピッチベンドホイールを動かした時のサブパッチの価の変化を見て下さい。サブパッチを閉じて、メインパッチウィンドウでのゲインの変化を見て下さい。

シグナルのゲイン値は、次の章で説明される number~ と呼ばれるMSPユーザインターフェースオブジェクトによって表示されます。

まとめ

MIDIコントローラ No.10(または他のどのようなMIDIデータでも)は、出力チャンネル間でシグナルをパンするために使用できます。2つのチャンネルの相対的な振幅は、音源の方向を知るための「ローカリゼーション(位置の認識)」の手がかりを与えます。サウンドの全体的な強さ(振幅の二乗の和に比例します)は、音源の距離を知覚するための手がかりになります。

MIDIデータをマップして、2つのチャンネルの振幅のリニアクロスフェードを実行することは、パンの1つの方法です。しかし、サウンドが中央にパンされるとき、強さは減少してしまいます。リスナーを中心とする円弧上での音源の角度を決定するためにパンの値を使用(0度から90度までの範囲でマップ)し、チャンネルの振幅をその角度のサインとコサインに比例させると、パンをする間のサウンドの強さは一定に保たれます。

サウンドがリスナーの前を直線的に動く場合、リスナーの正面を通り過ぎる時に最も音量が大きくなります。音源が移動していく時の相対距離を計算し、それによって、各々のチャンネルの振幅(また、全体としての強さ)を変更することで、直線的な動きをエミュレートすることができます。

参照

expr~

数式を評価します

gate~ シグナルをいくつかのアウトレットのうちの 1つにルーティングします