액션스크립트 3.0을 이용한 사운드 시각화




package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundMixer;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
    [SWF(width=800, height=600, backgroundColor = 0xffffff)]
    public class AsExamSoundVisualize extends Sprite 
    {
        private var soundChannel:SoundChannel;
        private var soundObj:Sound = new Sound();
        public function AsExamSoundVisualize() 
        {
            loadSound();
            addEventHandlers();
        }
        
        private function loadSound():void
        {
            var req:URLRequest = new URLRequest("http://okgosu.net/book/asbook/sound-exam.mp3");
            soundObj.load(req);
            soundChannel = soundObj.play();
        }
        
        private function addEventHandlers():void
        {          
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            soundChannel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
        }
        // 사운드가 플레이되는 동안 스펙프럼 데이터를 추출하여 화면에 그려줌
        private function enterFrameHandler(event:Event):void 
        {
            var bytes:ByteArray = new ByteArray();
            SoundMixer.computeSpectrum(bytes, false, 0);
            drawWaves(bytes);   
        }
        // 사운드 스펙트럼 데이터를 바이트배열로 받아서 그래프로 그림
        private function drawWaves(bytes:ByteArray):void
        {
        var WAVE_HEIGHT:int = 300;
            var CHANNEL_COUNT:int = 512
            var byteNumber:Number = 0;
            this.graphics.clear();
            this.graphics.moveTo(0, WAVE_HEIGHT);
            for (var i:int = 0; i < CHANNEL_COUNT; i++) 
            {
                if(i < 256) // 왼쪽 256개 채널은 파란색으로
                {
                    this.graphics.lineStyle(1, 0x0000FF);
                }
                else // 오른쪽 256 개 채널은 빨간색으로 
                {
                   this.graphics.lineStyle(1, 0xFF0000);
                }
                byteNumber = (bytes.readFloat() * WAVE_HEIGHT);
                this.graphics.lineTo(i , WAVE_HEIGHT - byteNumber);
            }
        }
        
        private function soundCompleteHandler(event:Event):void 
        {
            stage.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
    }
}




















1.jpg
profile