サウンド波形

AS3ではサウンドの波形が簡単にとれるということなのでちょっと作ってみました

色はランダムなので色々試してみるといいかも

※クリックでstart

Flash Player 10 にしてください

SoundComputeSpectrum.as


package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.media.SoundChannel;
    import flash.media.SoundMixer;
    import flash.utils.ByteArray;

	[SWF(width=512, height=200,backgroundColor=0xffffff)]
    public class SoundComputeSpectrum extends Sprite {
       	[Embed(source="sound.mp3")]
       	private var mySound:Class;
    	private var lineArray:Array = new Array();
        private const HEIGHT:int = 100;
        private const LENGTH:int = 512;
        private const VC:int = 20;

        public function SoundComputeSpectrum() {
        	stage.addEventListener(MouseEvent.CLICK, init);
        }

        private function init(event:MouseEvent):void{
        	stage.removeEventListener(MouseEvent.CLICK, init);
         	var color:uint = Math.random()*0xffffff;
        	for(var i:int = 0; i < LENGTH; i++){
        		var sp:Sprite = new Sprite();
        		sp.x = i;
        		sp.y = HEIGHT;
        		sp.graphics.lineStyle(0,color);
        		sp.graphics.lineTo(0,1);
        		addChild(sp);
        		lineArray.push(sp);
        	}

            var channel:SoundChannel = new mySound().play();
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            channel.addEventListener(Event.SOUND_COMPLETE, completeHandler);
        }

        private function onEnterFrame(event:Event):void {
            var bytes:ByteArray = new ByteArray();
            SoundMixer.computeSpectrum(bytes, false, 0);
            var rf:Number;
            for (var i:int = 0; i < LENGTH; i++) {
            	rf = bytes.readFloat();
            	lineArray[i].alpha = Math.abs(rf);
            	lineArray[i].scaleY = -rf*HEIGHT;
            }
            var ro:Number = stage.transform.colorTransform.redOffset + Math.random()*VC - VC/2;
            var go:Number = stage.transform.colorTransform.greenOffset + Math.random()*VC - VC/2;
            var bo:Number = stage.transform.colorTransform.blueOffset + Math.random()*VC - VC/2;
            stage.transform.colorTransform = new ColorTransform(1,1,1,1,ro,go,bo,0);
        }

        private function completeHandler(event:Event):void {
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
    }
}

自分のやりかたが悪いのでちょっと重いですが、がんばればかなり軽くなるはず!
それにしても簡単に波形がとれていいですねー
あとByteArray便利
こいつがあればなんでも出来そうな気がする! おおげさですかw
今度ByteArrayを使ってごにょごにょやってみようかな

このエントリーを含むはてなブックマークはてなブックマーク - サウンド波形 この記事をクリップ!Livedoorクリップ - サウンド波形 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This

Comments are closed.