home > AS3 : SoundMixer.computeSpectrum
AS3 : SoundMixer.computeSpectrum
January 20, 2010
SoundMixer.computeSpectrumは結構問題あるようですが、
とりあえず波形を表示するサンプルを作ってみました。
package {
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
public class Main extends Sprite {
private var WaveH:int = stage.stageHeight/2;
//チャンネル毎のByteArray取得範囲
private const chanlength:int = 512;
private var _byteArray:ByteArray = new ByteArray();//サウンドの再生・毎フレームイベント設定
public function Main() {
var sound:Sound = new Sound();
var soundurl:URLRequest = new URLRequest("loop.mp3");
sound.load(soundurl);
var channel:SoundChannel;
channel = sound.play(0,100);
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
//channel.addEventListener( Event.SOUND_COMPLETE, PlayCompleteHandler );
}//毎フレームサウンドの波形取得・線描画
private function enterFrameHandler( e:Event ):void {
//_byteArrayにサウンド波形の値を設定
SoundMixer.computeSpectrum( _byteArray, false, 0 );
var g:Graphics = graphics;
g.clear();
g.lineStyle( 0, 0xff0000 );// 線のスタイル設定:赤
//g.beginFill (0xff0000, 1.0);// 面のスタイル設定:赤
/* 円で表示する場合
var n:Number = 0;
n = ( _byteArray.readFloat() * WaveH );
g.drawCircle(275,200,(WaveH - n));
*//* 波形表示の場合*/
g.moveTo( 0, WaveH );
//左チャンネルの波形 : 0〜255
//右チャンネルの波形 : 256〜511
//左 + 右 チャンネル取得して描画
var n:Number = 0;
for ( var i:int = 0; i < chanlength; i++ ) {
n = ( _byteArray.readFloat() * WaveH );
g.lineTo( i, WaveH - n );
}
}
private function PlayCompleteHandler( e:Event ):void {
removeEventListener( Event.ENTER_FRAME, enterFrameHandler );
}
}
}
【追記20101115】
サンプルはこちら
問題点としては、別ブラウザーで表示した別サイトの音も解析しようとしておかしな動きをするようですね。
まあ同時に表示しておく人はあまりいないと思いますが。。。
http://feb19.jp/blog/archives/000133.php