[Diary/2012/June]

SuperColliderでリアルタイムクロスシンセシス / 2012-06-27 (水)

今日

夕方にSuperColliderの授業のため,授業準備.
今日はクロスシンセシスなのだが,相変わらずSuperColliderでの記述が簡単すぎて泣けてくる.

リアルタイムで入力を取りながら,クロスシンセシスをかけるのを,SynthDefを使って記述した例.

////// リアルタイム録音とCrossSynthesis 直接playではなくSynthDefにまとめてみる
(

f = Buffer.alloc(s, 44100 * 1.0, 1); // ノコギリ波を録音するバッファ 1秒分
g = Buffer.alloc(s, 44100 * 1.0, 1); // マイクインプットを録音するバッファ 1秒分
h = Buffer.alloc(s, 1024, 1); //FFT用のバッファその1
i = Buffer.alloc(s, 1024, 1); //FFT用のバッファその2

SynthDef(\sawBuf, {arg out=0, bufNum=0; // ノコギリ波を録音する
 	var inSnd;
	inSnd = Saw.ar(440);
	RecordBuf.ar(inSnd, bufNum);
}).play(s, [\out, 0, \bufNum, f.bufnum]); 

SynthDef(\recordBuf,{ arg out=0, bufNum=0; // マイクインプットをバッファに録音するSynthDef
	var inSnd;
	inSnd = AudioIn.ar(1);
	RecordBuf.ar(inSnd, bufNum);
}).play(s, [\out, 0, \bufNum, g.bufnum]);

)

(
SynthDef(\sawVocorder, { arg out=0, bufNum1=0, bufNum2=1, fftBufNum1=2, fftBufNum2=3;
	var inSnd1, chain1, inSnd2, chain2, outSnd, multChain;
	inSnd1 = PlayBuf.ar(1, bufNum1, BufRateScale.kr(bufNum1), loop: 1);
	inSnd2 = PlayBuf.ar(1, bufNum2, BufRateScale.kr(bufNum2), loop: 1);
	chain1 = FFT(fftBufNum1, inSnd1);
	chain2 = FFT(fftBufNum2, inSnd2);
	multChain = PV_Mul(chain1, chain2); 
	outSnd = IFFT(multChain);
	Out.ar([0, 1], outSnd);
}).play(s, [\out, 0, \bufNum1, f.bufnum, \bufNum2, g.bufnum, \fftBufNum1, h.bufnum, \fftBufNum2, i.bufnum]);
)

(
f.free;
g.free;
h.free;
i.free;
)