こんばんわ。さくーしゃです。生きてますよ。まともにブログを書くのは1ヶ月ぶりですねぇ。いやーなんか8月前半は忙しまくりで後半はなんかやる気なくってみたいな。まあ、そんなこんなで最近は AS3 の仕事とかやってたりします。Flex + Cairngorm + Papervision3D みたいな。
今日はちょっと知りたいことがあったので作ってみました。といっても中途半端なのだけど目的はほぼ達成しちゃったのでもういいやってことで作ったやつだけ置いておきましょう。
知りたかったのは SoundMixer の computeSpectrum っていうメソッドの FFT モードんときに得られる値って、いったいいくつからいくつまでの周波数なんだろかってことでね。ビジュアライザーとかを作るだけならなんとなく値を使うだけでかっちょよくできるんだけど、もうちょっと解析よりのことをしようとするとそのへん知りたいのですね。
まあ結論からいうと返ってくる ByteArray の値、256 個の値はおそらく 0 〜 11008Hz。43Hz 単位で 256 バンド。おそらくになっちゃってるところがが中途半端なところで、なんとなく見た目で判断w。(んやまあ 44100Hz あたりから見当つけたけど。)
←作ったのはこれ。下のスライダーで周波数が変わる。んでそれのスペクトルが出る。リアルタイムの音声ジェネレートは popforge のアレを使ってます。っていうかサンプルの CreateAStream そのままだな。ソースはこつら。(コンパイルするなら popforge のんは別途入手してくださいな)
サイン波を FFT するとその周波数のとこにライン1本、じゃなくってあんな形になるのな、知らんかった。(なんかの誤差が影響してたりするんだろうか。。)
※実験とは関係ないけど矩形波バージョンも作ってみた。
おお。プチプチなるもののflashでtone generator作れるのか…
FFTが実用的なレベルならペパボの中の人がやってたMC APIの拡張版つくれそうですね。スネアの音域にトリガーをもってきて、どんなビートにもスピーチがジャストでのってくるという。
矩形波はsquare waveつーよりfrequency modulationになってまつね。
スライダー移動する時にスムージング=ポルタメント効果がかかってるからかしら…フィードバックがSF臭。
あー、プチプチなるのは処理が追いついてないからだなぁ。ウィンドウ小さくすると大丈夫かも。
FFT 自体は Flash Player の組み込みの機能だから速度的にはもんだいないね。音域わかってればビートを検知するのも簡単。実はほしいのは BPM なんだけどそっちが難しい。。
>矩形波
んそだね。スライダー動かす = 手動 FM つーか。
BPM検出については、以前某リスのビジュアライザーやったのは、FFTは使わずに、音が鳴り始めてから一定時間のamplitudeのpeak値の頻度の平均値をとってそこから簡易的にBPM的な数値を取得してたけど、それっぽくはなったかも…でもあくまで雰囲気だから、実際はけっこうブレまくり。
完全に自動的なBPM検出てのは結構ムズそうですね、最近はCDJとかミキサーにBPM検出機能がついてるけど、あれは前saqoosha氏がブクマしてた方法をつかってるのかも。ただ、4つ打ちじゃないと(というかそもそも4/4じゃないと)あんまうまく検出されないス。
あと、エフェクターとかでよくあるのはTAP機能てやつで、音にあわせてボタンをたたいてもらって、その間の平均値からBPMを検出するってのもありますね。
ふうむ。
曲限定すれば簡単だな、ってかそれなら先に世にあるアプリとかで調べた BPM をもとに適当な周波数のビートとシンクすればいいんだな。んまそのへんが現実的なライン。。。