blog.monophile.net

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 現在は digitiminimi Inc. において、インフラエンジニアとして生計をたててている。 また、計算を主題に制作を行い、現代音楽作品や公共インスタレーション作品など技術提供を行う。 三輪眞弘に師事する。

List

音量を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’); )