チュートリアル20

MIDIコントロール:サンプラ

基本的なサンプラ機能

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

このパッチでは、groove~オブジェクトを使用して、いろいろな速度でサンプルを演奏しますが、いくつかのケースではループ化されたサンプルを使用しています。MSPチュートリアル19で注意したように、ポリフォニックなインストゥルメントを設計しようとする場合、同時発音したい数のサウンド生成オブジェクトが必要になります。このチュートリアルパッチでは、samplevoice~というサブパッチのコピーを4つ使用し、4声のポリフォニーを提供します。MSPチュートリアル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"と記されたメッセージボックスをクリックして下さい。

これは、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. 67 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からの情報がサブパッチでunpackされ、演奏された音を出す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キーボードの上でゆっくりと半音階のスケールを演奏し、様々なサンプル及びそのキーボード上での配置を確認して下さい。

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

*"Play Sequence"と記されたトグルをクリックして、multi-timbralなサンプルのレイアウトがシーケンサによってどのように利用されるかという実例を見て下さい。シーケンスを止めるには、もう一度それをクリックして下さい。オーディオをオフにして下さい。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~によって得られます。

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

<-前の章 次の章->