チュートリアル13

サンプリング:レコーディングとプレイバック

サウンド入力:adc‾

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

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

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

* adc‾オブジェクトをダブルクリックして、DSP Statusウィンドウをオープンして下さい。Input Sourceポップアップメニューが、使いたい入力ソースを表示していることを確かめて下さい。ほとんどの場合、Internal CDまたはMicrophone(入力ジャックから入って来るソースすべてを意味しています)の選択肢があります。オーディオカードとMSPオーディオドライバのうちの1つを使用している場合、入力ソースの選択肢はありません。DSP Statusウィンドウを閉じて下さい。

* adc‾オブジェクトの上のトグルをクリックして、オーディオをオンにして下さい。入力されたサウンドを直接アウトプットジャックから出力して聞きたい場合は、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‾の状態をトグルに正確に表示させるようにするためであり、record‾を明確にストップさせるために必要だからではありません。なぜなら、終了点またはbuffer‾の終わりに達した時、レコーディングは自動的に止まってしまうからです。

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

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

buffer‾を読み通す:index‾

これまでに、buffer‾にサウンドを得るための2つの方法を見ました。readメッセージにより、既存のAIFFまたはSoundDesigner IIファイルを読み込むことができ、そして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‾の中のどの位置へでもレコーディングすることができます。buffer‾内のサウンドの単純な標準速度のプレイバックは、count‾とindex‾オブジェクトを使用して現在のサンプリングレートでbuffer‾を読むことで行えます。line‾とplay‾オブジェクトを利用すると、変化する速度でのプレイバック、または(あるいは同時に)buffer‾を双方向に読むことができます。

<-前の章 次の章->

目次へ