チュートリアル 13:サンプリング
レコーディングとプレイバック

サウンド入力:adc~

"現実の世界"からMSPへサウンドを取り込むために、adc~ と呼ばれるA/D変換オブジェクトがあります。adc~ は、dac~ オブジェクトと全く同じメッセージを認識しますが、コンピュータの音声出力ジャックにシグナルを送信する代わりに、オーディオ入力ジャックからのシグナルを受信して、入力シグナルをアウトレットから出力します。dac~ に、ezdac~ というユーザインタフェース・バージョンがあるように、adc~ には、ezadc~ というアイコンバージョンがあります。



adc~ezadc~ はオーディオ入力ジャックからサウンドを取り込み、シグナルとして送り出します。

adc~ オブジェクトを使用するためには、コンピュータにいくつかのソースからサウンドを入力する必要があります。サウンドはコンピュータのCDプレーヤ、テーププレーヤーのようなラインレベルのソース、あるいはマイクロフォンから入力できます。(コンピュータには組み込みのマイクロフォンがあるかもしれません。また、プリアンプを通して標準的なマイクロフォンを使用することもできます。)

adc~ オブジェクトをダブルクリックして、DSP ステータスウィンドウを開いて下さい。Input Sourceポップアップメニューが使いたい入力デバイスを表示していることを確かめて下さい。コンピュータシステムや、オーディオカードとドライバによっては、入力デバイスの選択肢がない場合があるかもしれません。この場合は特に気にかける必要はありません。

adc~ オブジェクトの上の toggle をクリックして、オーディオをオンにして下さい。入力されたサウンドを直接アウトプットジャックから出力して聞きたい場合は、Audio thruput level と表示されたナンバーボックスのレベルを調節して下さい。



オーディオスループットを適当なリスニングレベルに調節します

入力ソースがマイクロフォンの場合には、コンピュータから出力されたサウンドをマイクロフォンにフィードバックさせないよう注意する必要があります。

サウンドのレコーディング:record~

入力されるサウンド(または任意のシグナル)のサンプルをレコーディングするためには、まず、サウンドがストアされるバッファを明示する必要があります。したがって、パッチには少なくとも1つのbuffer~ オブジェクトが含まなけれていなければなりません。buffer~ と同じ名前の record~ オブジェクトも必要になります。レコーディングしたいサウンドは、record~ オブジェクトのインレットに届かなければなりません。


“Soundbite”と名付けられたbufferに、2秒間のステレオサウンドをレコーディング

record~ が左インレットでゼロ以外の整数(int)を受信した場合、record~ はそのレコードインレットに接続されるシグナルをレコーディングし始めます。0はレコーディングを停止します。record~ の2つの右側のインレットに数値を送信することで、buffer~ の範囲内でレコーディングの開始点と終了点を指定することができます。開始点と終了点を指定しない場合は、レコーディングによって buffer~ 全体を満たします。レコーディングの長さはbuffer~ の長さによって制限されることに注意して下さい。そうでないと、record~ が偶然に放って置かれた場合、アプリケーションメモリをすべて埋め尽くしてしまう危険性があります。

チュートリアルパッチでは、record~ は2秒間(2000ミリ秒)たった後、レコーディングを停止します。ここでは、2秒後に toggle を切り替えるためにディレイされた bang を含めていますが、これはrecord~ の状態を toggle に正確に表示させるようにするためであり、 record~ を明示的にストップさせるために必要だからではありません。なぜなら、終了点または buffer~ の終わりに達したとき、レコーディングは自動的に停止してしまうからです。


ディレイされた bang は2秒後にトグルをオフにして、それを直接表示します

・確かにコンピュータにサウンドが来ているかどうかを確認し、toggle をクリックして入力されるサウンドを2秒間レコーディングして下さい。レコーディング後に buffer~ の上でダブルクリックすると、レコーディングされたシグナルを見ることも可能です。

buffer~を読み通す:index~

これまでに、buffer~にサウンドを得るための2つの方法を見ました。read メッセージによって、既存のオーディオファイルを読み込むことができ、そして record~ オブジェクトによってbuffer~ にサウンドをレコーディングすることができます。ひとたび buffer~ にサウンドを得ると、それを用いていくつかのことが可能になります。write メッセージをbuffer~ に送信してそれをオーディオファイルとして保存すること、チュートリアル3で示されたように cycle~ のためのウェイブテーブルとしてその513個のサンプルを使用すること、チュートリアル12で示されたように lookup~ のための伝達関数(Transfer Function)としてその任意の区間を使用すること、そして、dac~ を使って演奏を出力するために単に読み通すことも可能です。このチュートリアルパッチでは、buffer~ のサウンドを演奏するための最も基本的な2つの方法を示します。第3の方法はチュートリアル14で示されます。

index~ オブジェクトはその入力としてシグナルを受信しますが、このシグナルはサンプル番号を表します。そして、関連づけられた buffer~ でそのサンプルを探し出し、シグナルとしてそのサンプルの値をアウトレットから出力します。count~ オブジェクトは、サンプルごとに1ずつ増加するシグナル値を出力します。そのため、count~ の出力(値を増加させる安定したストリーム)を index~ の入力(それらをサンプル番号として扱います)に接続することによって index~ は、buffer~ をストレートに読みとり、現在のサンプリングレートでそれをプレイバックします。


サンプルごとにルックアップして dac~ に送る方法による、buffer~ のサウンドの演奏

・"Play"と表示された buttonをクリックして buffer~ のサウンドを演奏して下さい。count~ にいろいろな初期値を送ることによって、プレイバックをスタートさせるサンプル番号を変更することができます。

この count~ index~ のコンビネーションは、buffer~ の中の、プレイバックを開始させようとする正確なサンプル番号の指定を可能にします。しかし、buffer~ をプレイバックするための開始点と終了点をミリ秒で指定したい場合、または(もしくは同時に)いろいろな速さ(または逆プレイバック)でサウンドをプレイバックしたい場合には、play~ オブジェクトの方がより適しています。

速度可変のプレイバック:play~

play~ オブジェクトは、関連した buffer~ の中の位置をミリ秒で指定する値をインレットで受け取ります。play~は、buffer~ のその位置での信号値を見つけて送信します。しかし、index~ と違って、play~ buffer~ の2つのサンプルの間の場所を指定されたとき、その2つの値の間を補間します。そのため、増加または減少するシグナルを play~ に送信することによって、どんな速度で buffer~ を読み通すことも可能になり、必要に応じて play~ はサンプルの間の補間を行います。(理論的には、類似した方法で index~ を使用することも可能ですが、サンプル間の補間を行わないため、サウンドの忠実性はかなり悪くなります。)

最もわかりやすい play~ オブジェクトの使用法は、チュートリアルパッチで示されるように line~ オブジェクトから直線的に増加(または減少)するシグナルを送信することです。


buffer~の中の、ある場所から他の場所までを、設定された時間で読み通します

0から2000まで(buffer~ のミリ秒での場所)を2000ミリ秒の時間で読み通すことは、結果として標準のプレイバックになります。同様に、0から2000までを4000ミリ秒で読み通すことは、半分の速度でのプレイバックになります。その他も同様です。

・いろいろなメッセージボックスをクリックして、様々な速度と方向の組み合わせで演奏されるサウンドを聞いて下さい。終わったら、オーディオをオフにして下さい。

このチュートリアルパッチでは示していませんが、play~ の入力に他のシグナルを使用して、加速や減速が実現できるということは、覚えておくだけの価値があります。例えば、curve~ オブジェクトからの指数曲線や、適切にスケーリングされた cycle~ オブジェクトからのサイン波などです。

まとめ

コンピュータに入って来たサウンドは、adc~ オブジェクトによってMSPに入力されます。record~ オブジェクトは、buffer~ の中に入力されたサウンド(または他のあらゆるシグナル)をストアします。buffer~ は、全体にレコーディングすることもできますが、record~ の右端の2つのインレットにbuffer~ の開始点と終了点の位置を指定することで、buffer~ の中のどの位置へでもレコーディングすることができます。count~index~ オブジェクトを使用して現在のサンプリングレートでbuffer~ を読むことによって、buffer~ 内のサウンドのシンプルな標準速度のプレイバックができます。line~play~ オブジェクトを利用すると、変化する速度でのプレイバック、または(あるいは同時に)buffer~ を双方向に読むことができます。

参照

adc~ オーディオ入力とオーディオのオン、オフ
ezadc~ オーディオのオン、オフ、アナログ−デジタル (AD) コンバータ
index~ 補間を行なわないサンプルのプレイバック
play~ 位置に基づいたサンプルのプレイバック
record~ バッファ( buffer ) へサウンドを録音