チュートリアル 19:MIDIコントロール
シンセサイザ

標準MIDIメッセージの実装

この章では、MSPでつくられるシンセシス・インストゥルメントのMIDIコントロールをどのように実装するかについて説明します。実例として挙げられているインストゥルメントは、ベロシティセンス、ピッチベンド、モジュレーションホイールによる音色のMIDIコントロールが可能なFMシンセサイザです。実例を比較的シンプルにしておくために、FMサウンドが 1つだけのタイプ(シンセサイザ用語で、1 つの「パッチ」といいます)で、2声のポリフォニーしか持たないものを使用します。

MSPシンセサイザのMIDIコントロールに関する主なポイントは次のようなものです。

  • MIDIキーナンバーを、適当な該当する周波数に変換する。

  • MIDIピッチベンド値を、適当な周波数スケール係数に変換する。

  • MIDIコントローラ値をモジュレータのパラメータに(例えばビブラートの速さ、ビブラートの深さなど)に変換する。

さらに、与えられたMSPオブジェクトは1度に1つの音しか演奏できないので、同時に発生するMIDIノートメッセージをうまく取り扱う必要があること、などがあります。

ポリフォニー

MSPの個々のサウンド生成オブジェクト(cycle~ phasor~のようなオシレータ、または groove~ play~ のようなサンプルプレーヤ)は、1度に1つの音だけしか演奏できません。したがって、MSPで1度に2つ以上の音を演奏するためには、2つ以上のサウンド生成オブジェクトが必要になります。このチュートリアルパッチでは、基本的なシンセシス・シグナルネットワークの同一な2つのコピーを作り、そのどちらか一方にMIDIノートメッセージを送ります。この2声ポリフォニーは、メロディーのレガートなキーボード演奏で通常起こっている、連続した音のオーバーラップを可能にします。



ポリフォニック音楽を演奏する poly はボイスナンバをアサイン(割当て)します

poly オブジェクトは入ってくる個々のノートメッセージにボイスナンバ(この場合1または2)を割り当てます。そして、2つを超える数のキーが同時に押したままにされた場合、poly は最初の音のノートオフメッセージを送り、後の音を演奏することができるようにします。ボイスナンバ、キーナンバそして、ベロシティは3項目によるリストとして一緒にパックされ、routeオブジェクトはボイスナンバを使用して、キーナンバとベロシティを一方の、あるいは他方のシンセサイザ「ボイス」に送信します。コンピュータの処理速度が十分に速い場合、当然、より多くのボイスによるシンセサイザを設計することが可能です。ボイスを加算しながら、DSP ステータス・ウィンドウの ”CPU Utilization”を観察することによって、コンピュータの能力をテストすることができます。

MSP でポリフォニックなボイスアサインメント(ボイス割り当て)を行なう別の方法として、poly~ オブジェクトの使用があります。このエレガントで効率的な poly~ オブジェクト(および、そのヘルパーオブジェクトである inin~outout~)については、チュートリアル21 で見ていくことにします。 今の所は、poly オブジェクトを使って、このチュートリアルで必要となる程度の、シンプルなポリフォニックでのボイスアサインメントを行なうことにしましょう。

ピッチベンド

このインストゥルメントでは、MIDIピッチベンド値 0から127までを使用して、ピッチを半音2個分上下にベンドさせます。音のピッチをベンドするためには、その(キャリア)周波数に適当な値を掛けることが必要です。±2半音のピッチベンドのためには、ベンドの係数を2の -2/12乗(およそ0.891)から2の 2/12乗(およそ1.1225)の範囲で計算する必要があります。

MIDIピッチベンドは、独特なマッピングの問題を提示します。それは、MIDIプロトコルによって64という値は「ベンドなし」の意味で使用されますが、64は厳密には0?127の中央値ではないということです。(厳密な中央値は63.5のはずです。)64の下には64個の値(0〜63)がありますが、上には63個の値(65〜127)しかありません。従って、上方へのベンドは、下方へのベンドとわずかに違った扱いをする必要があります。


下方へのベンドは、上方へのベンドとわずかに違った方法で計算されます。

下方のベンドの最大値(ピッチベンド値0)は指数 -64/384(-2/12と等しい)になるため、下方のベンド値(0から63)は -64でオフセットされ 384で割られます。上方のベンドは0から63/378(2/12に等しい)の範囲の指数になるので、上方のベンド値(64から127)は -64でオフセットされ、378で割られます。pack オブジェクトと line~ オブジェクトは、周波数が不連続な階段状の変化をするのを避けるために、20ミリ秒間で徐々に変化するような周波数の係数を生じさせる目的で使用されます。

モジュレーションホイール

モジュレーションホイールは、ここではFMシンセシスパッチの変調指数を変えるために用いられます。マッピングはリニア(線形)です。単純に、MIDIコントローラ値を16で割り、0から(ほとんど)8の範囲にマッピングします。シンセシス・インストゥルメント自体を見ることによって、この範囲が使用される正確な方法がわかるでしょう。



コントローラ値は0から7.9375の範囲にマップされます。

FMシンセサイザ

synthFMvoice~ サブパッチオブジェクトのうちの1つをダブルクリックして、パッチャーウィンドウを開いて下さい。

このFMシンセシスサブパッチのもとになっているのは、MSPチュートリアル11で紹介され(そして、説明され)た、simpleFM~ サブパッチです。書き込まれているアーギュメントは周波数比を1にセットするために使用され、倍音のスペクトルを生み出します。MIDIメッセージは、このFMサウンドの周波数と変調指数に影響を及ぼします。最初に、MIDIノート、およびピッチベンド情報が、周波数を決定するために使用されるところを見てみましょう。

MIDIの周波数への変換

オブジェクト mtof はシグナルオブジェクトではありませんが、MSPでは非常に便利なものです。これは、MIDIキーナンバを該当する周波数に変換します。


与えられたピッチの周波数を計算します

この周波数値は、メインパッチで計算されたベンド係数を掛けられ、その結果は、 simpleFM~ サブパッチのキャリア周波数として使用されます。



キーナンバとピッチベンドデータによって計算された音の周波数値

振幅エンベロープのベロシティコントロール

大部分のシンセサイザのように、このパッチでは振幅エンベロープを制御するために、MIDIノートオンベロシティが用いられます。これを達成するために必要なタスクは次のようなものです。

  • ノートオンベロシティをノートオフベロシティから切り離す。

  • 1 〜 127の ノートオンベロシティの範囲を、0 〜 1までの振幅の範囲にマップ(ほとんどの場合、非線形マッピングが最もよい)する。

  • ノートオンベロシティを、(このケースでは)エンベロープのアタック、ディケイの速さにマップする。

最初のタスクは、select 0 オブジェクトによって簡単に成し遂げられます。ノートオンベロシティは function オブジェクトをトリガし、アタックとディケイの形を送り出します。そして、以下の例で示すように、ノートオフベロシティは振幅を0に戻します。



MIDIノートオンベロシティは振幅エンベロープの領域、範囲をセットします

function がトリガされる前に、ノートオンベロシティを使用して領域と範囲をセットします。これは、エンベロープの持続期間と振幅を決定します。右の expr オブジェクトはエンベロープのアタックそしてディケイの部分の時間を計算します。ベロシティの最大値127はそれらを100ミリ秒間に行います。それに対してより小さいベロシティ60は496ミリ秒で行います。このように、よりソフトに演奏される音は、多くの管楽器の場合のように、より遅いアタックを持ちます。

左の exp rオブジェクトは、振幅を決定するためにベロシティを指数曲線にマップします


ベロシティは4の指数関数による振幅値にマップされます

直線的なリニアマッピングを使用する場合、127から64(大部分のノートが演奏される範囲)のMIDIベロシティは、およそ6dBの振幅範囲しかカバーしません。指数関数へのマッピングは、これをおよそ24dBに増加させます。そのため、ベロシティの上の方の範囲は、振幅のより大きい変化を作り出します。

音色のMIDIコントロール

アコースティック楽器が大きな音で演奏される場合に、より明るく(より高い周波数を含む)聞こえる場合がよくあります。このため、ノートオン・ベロシティがラウドネスと同様にサウンドの音色に影響を及ぼすことは意味があります。金管楽器の場合、音色は振幅と相関して非常に大きく変化するので、このパッチではFMインストゥルメントの振幅と変調指数のコントロールに同じエンベロープを使用します。エンベロープは、*~ オブジェクトに送られて、適当な範囲にスケールされます。+~ 8オブジェクトは変調指数が 0 から 8(最大のベロシティで演奏された場合)までのベロシティレンジによって影響を受けることを保証します。これまで見たように、メインパッチではモジュレーションホイールはより大きく変調指数を増加させる(変調指数レンジに少なくとも8以上を加算する)ことができます。

このように、ベロシティとモジュレーションホイールのポジションの組み合わせで、十分に変調指数に影響を及ぼすことができます。


エンベロープとモジュレーションホイールは変調指数をコントロールします

・(キーボード・シンセサイザのボリュームを絞って)MSPからのサウンドだけを聴くようにして、MIDIキーボードの単旋律のメロディーを演奏して下さい。演奏するとき、ベロシティが振幅、音色、アタックの速さに及ぼす効果に注意して下さい。モジュレーションホイールを上へ動かして、音色の全体のブライトネスを増加させて下さい。モジュレーションホイールを用いて、音のサステイン(持続)部分で音色をモジュレートすることも可能です。ピッチベンドホイールが周波数上で意図した効果を引き起こすことを確かめてみて下さい。

まとめ

MIDIデータは、ほとんどの他のシンセサイザと同様に、MSPシンセシスパッチをコントロールするために使用できます。標準的なインストゥルメント設計では、MIDIキーナンバとピッチベンドホイールポジションは、両方とも演奏された音のピッチを決定するために使用されます。キーナンバは、mtof オブジェクトによって周波数データに変換されます。ピッチベンド値は(平均律の半音1つにつき2の12乗根に基づいて)適当な周波数のベンド係数に変換されます。「ベンド無し」の値は64として設計されていますが、これは 0〜127 の正確な中央の値ではないため、上方へのベンドは下方へのベンドとわずかに違った式で計算しなければなりません。

ノートオンベロシティは、一般に音の振幅を決定するために使用されます。これは、振幅エンベロープのアタック部分をトリガします。ノートオフメッセージは、エンベロープのリリース部分をトリガします。ベロシティ値は、エンベロープのレンジを変換(または、振幅のスケーリングのための係数を提供)するために使用できます。ベロシティの振幅へのマッピングは、一般に、線形ではなく指数的である方がベストです。ベロシティはまた、エンベロープの速さや変調指数のような他のパラメータを変えるために使用することもできます。

MSPオブジェクトは1度に1つのサウンドを作ることしかできません。そのため、MIDIを通して同時に2つ以上の音を演奏しようとする場合、各々の音を poly のボイスナンバによってアサイン(割当て)し、各々のボイスを異なったMSPオブジェクトに送らなければなりません。次のチュートリアルでは、poly オブジェクトを使って、このチュートリアルで使ったようなシンプルな場合に用いられる、ポリフォニックなボイスアサインメント(ボイス割り当て)を行なっています。

チュートリアル21では、MSP でポリフォニックなボイスアサインメントを管理する別の方法として、poly~ オブジェクトを紹介します。

参照

mtof MIDI ノートナンバーを周波数に変換します。
poly ノートを異なるボイスに割り当てます。