音量を SuperCollider で取得する
概要
オーディオリアクティブな装置を作るために、 SuperColliderを使ってMacの標準マイクからの音量を取得してみた。
SendPeakRMS
SendPeakRMSというオブジェクトを使うとscsynthからOSCメッセージが来るので、 それに対応したOSCFuncを登録しておけば良いみたいですね。 ちなみに、scsynthを起動するときにデバイスを指定しておくと間違いがないと思います。
(
var opt;
opt = s.options;
opt.inDevice = "Built-in Microph";
opt.outDevice = "Built-in Output";
opt.sampleRate = 44100;
opt.blockSize = 128;
opt.numOutputBusChannels = 2;
opt.numInputBusChannels = 2;
opt.dump;
s.boot;
)
(
var fm, dB;
{ SendPeakRMS.kr( AudioIn.ar(1), 10, 3, "/replyAddress") }.play;
dB = {|x| (x.log * 10) round: 1e-1};
fm = {|msg| "peak, rms: %, %".format(* msg[3..4] collect: dB ).postln; };
o = OSCFunc(fm, '/replyAddress');
)
上記のコードを実行すると、下記のような出力が現れます。
peak, rms: 0.0268, 0.0024
peak, rms: 0.0226, 0.0019
peak, rms: 0.0196, 0.0019
peak, rms: 0.0169, 0.0017
peak, rms: 0.0151, 0.0022
peak, rms: 0.0141, 0.002
peak, rms: 0.0126, 0.002
peak, rms: 0.0113, 0.0017
peak, rms: 0.0103, 0.0017
peak, rms: 0.0097, 0.0018
peak, rms: 0.0156, 0.0029
peak, rms: 0.0791, 0.0095
:
:
( SynthDef(,{ var sig, chain, onsets; sig = AudioIn.ar(1); // Out.ar(2, sig !2); chain = FFT({LocalBuf(512, 1)}, sig); onsets = Onsets.kr(chain,0.1,); SendTrig.kr(onsets); SendPeakRMS.kr(sig, 20, 3, “/replyAddress”); }).load(s); Synth(); p = OSCFunc({ |msg| “peak: %, rms: %”.format(msg[3], msg[4]).postln;}, ‘/replyAddress’); )