チュートリアル 20:
MIDI サンプラのコントロール

基本的なサンプラ機能

この章では、あらかじめレコーディングしてあるサンプルをMIDIキーボードで演奏するような設計について説明します。この設計では基本的なサンプラキーボードの主な機能のいくつかを実装します。それは、サンプルをキーボードの領域にアサイン(割当て)すること、各サンプルのための基準となる(トランスポーズされない)キー位置を指定すること、押されたキーによって該当する調に“移調”してサンプルを演奏すること、そしてポリフォニックなボイスのアサイン(割当て)を達成することです。簡潔さのために、このパッチではピッチベンドホイールまたはモジュレーションホイールによるコントロールを実装しませんが、その方法は前の2つの章で説明したものと大きな違いはありません。

このパッチでは、groove~ オブジェクトを使用して、いろいろな速度でサンプルを演奏しますが、いくつかのケースではループ化されたサンプルを使用しています。MSPチュートリアル19で注意したように、ポリフォニックなインストゥルメントを設計しようとする場合、同時発音したい数のサウンド生成オブジェクトが必要になります。このチュートリアルパッチでは、samplevoice~ というサブパッチのコピーを4つ使用し、4声のポリフォニーを提供します。チュートリアル19と同様、各々のMIDIノートにボイスナンバを割り当てるために、polyオブジェクトを使用し、適切なsamplervoice~サブパッチにノート情報を送るために、routeを用います。


poly はMIDIノートにボイスをアサインし、適当なサブパッチに情報を送ります

samplervoice~サブパッチの動作を調べる前に、正確にサンプルを演奏するためにどんな情報が必要かについて検討しておくと良いでしょう。

  1. サウンドサンプルはメモリ(buffer~オブジェクトの中)に読み込まれなければなりません。そして、メモリ位置のリスト(buffer~の名前)が保持されていなければなりません。
  2. 各サンプルはキーボードの領域に割り当てられなければなりません。そして、キー割当てのリストが保持されていなければなりません。
  3. 各領域のための基準キー(サンプルが“移調”なしで演奏されキー)のリストが保持されていなければなりません。
  4. 各サンプルのためのループ点のリスト(そして、ルーピングがオンかオフか)が保持されていなければなりません。
  5. MIDIノートメッセージが受信され、samplervoice~サブパッチに送られたとき、サブパッチの groove~ オブジェクトは最初に、(演奏されているキー領域に基づいて)どのbuffer~を読むか、(その領域での、基準キーと押されたキーの周波数比に基づいて)どのような速さでサンプルを演奏するか、そのサンプルにどんなループポイントを適用するか、ループがオンかオフか、そして、ノートオンベロシティに基づいてどんな振幅のスケーリング係数を使うかについて指示されなければなりません。

このパッチでは、パッチが最初にロードされたとき、サンプルは全てメモリに読み込まれます。

p samplebuffers サブパッチをダブルクリックして、パッチャーウィンドウを開いて下さい。

ここでは、6つのサンプルが、sample1、sample2、などの名前をつけられて複数の buffer~へロードされているのを見ることができます。パフォーマンスの状況によって、同時にRAMにストアできるサンプルよりも多くのサンプルにアクセスする必要がある場合は、ファイル名をアーギュメントとして持つ read メッセージを用いて、必要に応じて新しいサンプルをbuffer~ へ読み込むことが可能です。

・サブパッチウィンドウを閉じて下さい。"keyboard sample assignments"と表示された message ボックスをクリックして下さい。

これは、funbuffオブジェクトに、ナンバーをつけられたキー領域をストアします(この情報は、funbuffに埋め込んでパッチと共に保存することができますが、ここでは、funbuff の内容を見ることができるようにメッセージボックスの中に残してあります)。MIDIキーナンバ 0 から 40 はキー領域1、キー41から47はキー領域2、以下同様になっています。ノートオンメッセージを受信する と、キーナンバは funbuff に行き、funbuff はそのキーのためのキー領域ナンバーを報告します。キー領域ナンバーは、collで他の重要な情報を探し出すために使用されます。


ノートオンキーナンバは funbuff で領域ナンバを見つけ、coll の中のサンプルの情報を探し出します

coll オブジェクトをダブルクリックして、その内容を見て下さい。

		1. 24 sample1 0 0 0;
		2. 33 sample2 0 0 0;
		3. 50 sample3 0.136054 373.106537 1;
		4. 7 sample4 60.204079 70.476189 1;
		5. 84 sample5 0 0 0;
		6. 108 sample6 0 0 0;

coll は各々のキー領域のためのサンプル情報を含んでいます。

キー領域ナンバは、coll の情報にインデックスを付けるために使用されます。例えば、53〜67のキーが押されると、funbuff はナンバ3を送り出し、キー領域3のための情報が呼び出されて、適切な samplervoice~ サブパッチに送られます。各キー領域のためのデータは、基準キー、buffer~の名前、ループ開始点と終了点、そしてループ・オン/オフのフラグです。

poly からのボイスナンバはゲートの正しいアウトレットを開き、coll からの情報が右側のサブパッチへ流れます。

サンプルの演奏:samplervoice~ サブパッチ

collウィンドウを閉じ、samplervoice~サブパッチオブジェクトをダブルクリックして、そのパッチャーウィンドウを開いて下さい。


samplervoice~ サブパッチ

coll からの情報がサブパッチで分解され、groove~ オブジェクトが演奏された音を出す準備を行なうために、適切な場所に送られているのがわかるでしょう。これは、groove~ に対して、どのbuffer~ を読むか、どんなループタイムを使用するか、ルーピングがオンかオフかを指示します。そして、ノート情報が左のインレットに届くと、そのベロシティは *~ オブジェクトに振幅の値を送るために使用され、ノートオン・キーナンバーは(右側のインレットから受け取った基準となるキーナンバと共に)groove~ の適切なプレイバック速度を計算し、groove~ をトリガしてタイム 0 からプレイバックを開始するために使用されます。

MSPのサンプルレート vs. オーディオファイルのサンプルレート

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

これで、ほとんどサンプルの演奏を始める準備は整いましたが、その前に注意する事がもう一つあります。メモリ空間を節約するために、このパッチではサンプルレート22,050HzのモノラルAIFFファイルが使用されています。これらが正しく演奏されるのを聞くためには、MSP のサンプルレートを、該当するレートにセットしなければなりません。

dac~ オブジェクトをダブルクリックして、DSPステータスウィンドウを開いてして下さい。サンプリングレートを22.050kHzにセットして、DSPステータスウィンドウを閉じて下さい。

注:ハードウェアによっては、サンプリングレートの再設定ができない場合もあります。

オーディオファイルのサンプルレートとMSPで使用しているサンプルレートが違うということは、サンプルを演奏する場合に起こりうる問題です。この例では、違いを解決するためにはこの方法で十分です。なぜなら、この例ではオーディオファイルはすべて同じサンプリングレートであり、MSPで演奏するのはこれらのファイルだけだからです。しかし、別の状況では、(おそらく異なるサンプリングレートによる)サンプルを他のサウンドと組み合わせてMSPで演奏したい場合があるでしょう。また、最適なサンプリングレートを使用したい場合もあるでしょう。

そのような状況のための最良のアドバイスは、オーディオファイルのサンプルレートとMSPのサンプルレートの比を groove~. の適切なプレイバック速度を決定するための付加的な係数として用いることです。例えば、もしオーディオファイルのサンプルレートがMSPのサンプルレートの半分ならば、groove~ はサンプルを半分の速さで演奏しなければなりません。

下の例で示されているように、サンプルとMSPそれぞれのサンプリングレートを取得するためにオブジェクト info~ および dspstate~ が使用できます。


オーディオファイルとMSPのサンプリングレートに基づいてプレイバック速度が計算されます

ノートオン・キーナンバーは、最初に、演奏されるサンプルの情報を呼び出すために使用されます。buffer~ の名前は、groove~ info~ に送信されます。次に、bang dspstate~ info~ に送り出されます。bang を受け取ると、dspstate~ はMSPのサンプリングレートを、そしてinfo~ buffer~ にストアされたAIFFファイルのサンプリングレートを報告します。サンプルパッチの左下では、このサンプリングレート情報が groove~ の適切なプレイバック速度を決定するための係数としてどのように利用されているかを見ることができます。

MIDIによるサンプルの演奏

・オーディオをオンにして、"Output Level" ナンバーボックスを快適なリスニングレベルにセットして下さい。MIDIキーボードの上でゆっくりと半音階のスケールを演奏し、様々なサンプル及びそのキーボード上での配置を確認して下さい。

キーボード全体に渡って、統一された一つのインストゥルメントサウンドを配置するためには、各キー領域は、同じソースからの音のサンプルを含まなければなりません。しかし、このケースでは、ドラム、ベース、キーボードを含む完全な「バンド」が得られるように、キーボード上にサンプルが配置されています。この種の複数の音色によるキーボードレイアウトは、簡単なキーボードスプリット(例えば左手でベース、右手でピアノ)や、この例のようにシーケンサによってMIDIの1つのチャンネルでいくつかの異なるサウンドにアクセスするために役に立ちます。

・複数の音色によるサンプルのレイアウトがシーケンサによってどのように利用されるかという例を見るために、"Play Sequence"と表示された toggle をクリックして下さい。シーケンスを止めるには、もう一度それをクリックして下さい。オーディオをオフにして下さい。p sequence オブジェクトをダブルクリックし、サブパッチのパッチャーウィンドウを開いて下さい。


p sequence サブパッチ

seq sampleseq.midiオブジェクトは、予めレコーディングしてあるMIDIファイルを含んでいます。midiparse オブジェクトは、メインパッチの poly にMIDIキーナンバとベロシティを送ります。シーケンスが演奏を終えるたびに seq の右側のアウトレットから bang が送り出されます。 bang は直ちにseqを再開するために使用され、シーケンスは連続するループとして演奏されます。シーケンスがユーザによって停止されると、bangがmidiflushに送信され、現在演奏されているすべての音をオフにします。

・このパッチを終えた後、DSPステータスウィンドウを開いてサンプリングレートをオリジナルのセッティングに復元するのを忘れないで下さい。

まとめ

MIDIキーボードによるサンプルの演奏は、各サンプルを buffer~ へロードし、groove~ によって行われます。ポリフォニックなサンプルの演奏のためには、ポリフォニーの 1ボイスにつき1つの groove~ オブジェクトを必要とします。poly オブジェクトによるボイスアサイン(ボイス割当て)によって、MIDIノート情報を異なった groove~ にルーティングすることができます。

各サンプルをMIDIキーボードの領域に割当てるためには、キー領域のリストを保存しておく必要があります。そして、各々のキー領域のために、どの buffer~ を使うか、どんなトランスポジションを使うか、どんなループポイントを使うか、などの情報を保持しておく必要があります。funbuffオブジェクトは、キーボード領域の割当てを格納するために便利です。各々のサンプルについての情報のさまざまな項目をまとめて、キー領域ナンバをインデックスとする coll のリストとして格納することができ、これが最良の方法です。音が演奏されるとき、キー領域は funbuff で探し出され、そのナンバーは coll でサンプル情報を探し出すために使用されます。

それぞれのノートのための適正なトランスポジションは、演奏された周波数(mtof オブジェクトで得られる)をサンプルの基準周波数で割ることによって計算できます。結果は、groove~ のプレイバック速度として使用されます。レコーディングされたサンプルのサンプリングレートがMSPで使用されているサンプリングレートと異なる場合は、サンプルが groove~ によって演奏されるときにその事実を groove~ に伝えなければなりません。オーディオファイルのサンプリングレートをMSPのサンプリングレートで割ることによって、groove~ のプレイバック速度に掛けるための正確な係数が求められます。MSPのサンプリングレートは dspstate~ によって得られます。また、buffer~ に読み込まれたAIFFファイルのサンプリングレートは info~ によって得られます。

ノートオン・ベロシティは、サンプルの振幅をコントロールするために利用できます。通常、指数関数によってベロシティを振幅へマッピングすることは最も良い方法です。キーボード上での、複数の音色によるサンプルのレイアウトは、多くの異なったサウンドの演奏(特にシーケンサによるもの)に役立ちます。seq の右アウトレットから送られる、ファイルの終わりを示す bang seq の再スタートに利用することによって、連続したループを演奏することができます。MIDIデータが midiflush オブジェクトを通る場合、seq が停止された時点で演奏されているすべての音は、midiflushbang を送ることでオフにされます。

参照

buffer~ オーディオサンプルのストア
dspstate~ 現在のDSP セッティングを報告します
groove~ サンプルループの速度可変プレイバック
poly~ パッチャーのためのポリフォニー/DSP マネージャ