« 5月11日:音響合成 | メイン | 6月1日: OSCによるネットワーク上でのコミュニケーション »

5月18日:サンプリング&プレイバック

サンプリング・プレイバック:2種類の方法

  • サンプリング・プレイバックには大きく分けて2つの方法がある
    • ディスクベースでのサンプリング・プレイバック
      • ハードディクスに直接録音し、録音されたサウンドファイルを直接読み出しながら音を再生する方法
      • 利点:
        • データの扱いが楽、手軽
        • 長時間のサウンドデータも、ハードディスクの容量の限界までは使用することができる
        • メモリを消費しない
      • 欠点:
        • 複雑な音響処理には向いていない
        • 読み出しの際に物理的な不可が大きい(音飛び)
      • 使用するオブジェクト
        • sfplay~, sfrecord~
    • メモリベースでのサンプリング・プレイバック
      • サウンドデータをプログラムのメモリに読み込んだ上で、処理を行い再生をする方法
      • 利点:
        • 柔軟性が高い、アイデア次第で様々な操作ができる
        • 物理的な負荷がないので、アクセススピードが速い
      • 欠点:
        • データの扱いが比較的煩雑である
        • メモリを消費する
        • 扱える音の長さに限界がある
      • 使用するオブジェクト
        • play~, record~, play~, groove~, wave~等

ディスクベースでのサンプリング

sfplay~・sfrecord~の利用

0518_01.gif
  • HDDにレコーディング:sfrecord~オブジェクトを用いる。指定したチャンネル数のaiffファイルを作成可能
  • HDDから再生:sfplay~オブジェクトを用いる。再生がファイルの最後尾まで来ると第3アウトレットからbangが出される。これを利用することでループ機能を付加している

IOライブラリの利用

0518_02.gif

レスリー・スタックによる、IOパッチを利用することで、サウンドファイルの入出力(録音・再生の処理)を容易に付加することが可能です

メモリベースでのサンプリング

メモリ上にオーディオファイルを読み込む:buffer~

0518_03.gif

Bufferオブジェクトに様々なメッセージを送って、HDD上のファイルをメモリに展開したり、メモリに展開されたオーディオデータをHDDに保存することが可能です。

  • "buffer~ バッファ名"という書式で使用するバッファの名前を付ける(後で読み出す際に使用する)
  • read:オーディオファイル(AIFF, WAV, SND, AU)をバッファに読みこむ
  • replace:オーディオファイル全体に読みこむ(全て置きかえる)
  • import:mp3ファイルやムービーファイルをコンバートして読みこむ
  • write:buffer~に読みこまれたオーディオデータをファイルに保存する

buffer~を用いたサンプリングとプレイバック:record~, play~

0518_04.gif
  • record~:buffer~オブジェクトメモリ内にオーディオデータを書き込む
  • play~:buffer~オブジェクトノのメモリ内に格納されたオーディオデータを読みだす

buffer~の波形表示:waveform~

0518_05.gif
  • waveform~オブジェクト
    • buffer~に読みこまれた信号を表示・編集する
    • 第1インレットに"set バッファー名"というメッセージを入力。同一の名前を付けられたバッファーにリンクする
    • 第1アウトレット:表示されている信号の開始時間
    • 第2アウトレット:表示されている信号の終了時間
    • 第3アウトレット:選択されている信号の開始時間
    • 第4アウトレット:選択されている信号の終了時間

groove~のオブジェクトでbuffer~を再生する

0518_07.gif
  • groove~
    • buffer~の内容を様々なスピードで、ループ再生可能
    • "groove~ バッファ名"と指定することで、バッファ名でしていされたbuffer~シグナルにリンク
    • 第1インレットには、信号を読み出す際のスピード(増加分)をシグナルで入力しなければならない
      • sig~オブジェクトで一定の値の信号を入力 → 指定したスピードで再生(負の値を入力すると逆再生)
    • 第2インレットは、ループ再生の開始点
    • 第3インレットは、ループ再生の終了点

groove~をオシレータでドライブする

0518_06.gif
  • groove~の第1インレット、sig~オブジェクトの代わりにcycle~オブジェクトを入力してみる
    → 再生スピードが変化する
  • 色々なシグナルを入力してみる

位相変化でミニマル音楽(風?)

0518_08.gif
  • ループ再生の際に、微妙に長さ(位相を)ずらしたサンプルを重ねていく
  • 音のモアレ効果
  • スティーブ・ライヒの初期作品との比較
  • 実験:フェイズシフトしたサンプルを録音(sfrecord~)して、それをさらにフェイズシフトするという操作を何度も繰り返してみる。最終的にどんな音になっていくのか?

応用: SC3でサンプリング&プレイバック

SuperCollider3で、サンプリングされたデータを扱う方法についてみてみましょう。

メモリにサウンドファイルを読み込む

まず、サウンドファイル(Wav, AIFF, AUなど)をメモリに読み込みます。Bufferオブジェクトを使用します。 Bufferオブジェクトのreadメソッドで、サウンドファイル全体がメモリのバッファに読み込まれます。

(
// サウンドファイル全体をメモリに格納
s = Server.local;
b = Buffer.read(s,"sounds/a11wlk01.wav");
)

メモリ内のサウンドを再生する

メモリ内のサウンドを再生するにはPlayBufオブジェクトを使用します。

  • PlayBuf.ar(numChannels,bufnum,rate,trigger,startPos,loop)
    • numChannels - サンプル数を整数で指定
    • bufnum - 使用するバッファーの番号
    • rate - 再生スピード
    • trigger - 再生ヘッドを開始位置にリセットする
    • startPos - 再生するサンプルの開始点
    • loop - ループするかどうか(1する、0しない)
//バッファの再生
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	Out.ar(out,
		PlayBuf.ar(1,bufnum, BufRateScale.kr(bufnum))
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

//ループをオンに
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	Out.ar(out,
		PlayBuf.ar(1,bufnum,BufRateScale.kr(bufnum),loop: 1.0)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

//インパスル信号で再生をトリガー
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var trig;
	trig = Impulse.kr(2.0);
	Out.ar(out,
		PlayBuf.ar(1,b.bufnum,BufRateScale.kr(bufnum),trig,0,0)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

//それぞれのインパスル信号で全体をトリガー
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var trig;
	trig = Impulse.kr(XLine.kr(0.1,100,30));
	Out.ar(out,
		PlayBuf.ar(1,b.bufnum,BufRateScale.kr(bufnum),trig,5000,0)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

// トリガの間隔と再生の開始点をマウスで指定
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var trig;
	trig = Impulse.kr(MouseY.kr(0.5,200,1));
	Out.ar(out,
		PlayBuf.ar(1,b.bufnum,BufRateScale.kr(bufnum),
                           trig,MouseX.kr(0,BufFrames.kr(bufnum)),1)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

// 再生ピッチを徐々に増加させていく
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var rate;
	rate = XLine.kr(0.1,100,60);
	Out.ar(out, 
		PlayBuf.ar(1, bufnum, rate, 1.0,0.0, 1.0)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

// サイン波で再生ヘッドをコントロール
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var rate;
	rate = FSinOsc.kr(XLine.kr(0.2,8,30), 0, 3, 0.6);
	Out.ar(out,
		PlayBuf.ar(1,bufnum,BufRateScale.kr(bufnum)*rate,1,0,1)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

// サウンドの中をジグザグに再生
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var rate;
	rate = LFNoise2.kr(XLine.kr(1,20,60), 2);
	Out.ar(out,
		PlayBuf.ar(1,bufnum,BufRateScale.kr(bufnum)*rate,1,0,1)
	)
}).play(s,[¥out, 0, ¥bufnum, b.bufnum]);

SC3で(ライヒ風?)フェイズシフト!

(
s = Server.local;
s.boot;
b = Buffer.read(s,"sounds/a11wlk01.wav");
)

// Phase Shift 1
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	Out.ar(out,
		[PlayBuf.ar(1,bufnum, BufRateScale.kr(bufnum),loop: 1.0),
		PlayBuf.ar(1,bufnum, BufRateScale.kr(bufnum)*1.01,loop: 1.0)]
	)
}).play;

// Phase Shift 2
SynthDef("help-PlayBuf",{ arg out=0,bufnum=0;
	var trig1, trig2;
	trig1 = Impulse.kr(1.0);
	trig2 = Impulse.kr(1.01);
	Out.ar(out,
		[PlayBuf.ar(1,b.bufnum,BufRateScale.kr(bufnum),trig1,0,0),
		PlayBuf.ar(1,b.bufnum,BufRateScale.kr(bufnum),trig2,0,0)]
	)
}).play;

サンプルファイルのダウンロード

Download file

投稿者 Atsushi Tadokoro : May 17, 2004 12:02 PM

コメント