forked from: Simple spectrum visualization

by Aksor.Al forked from Simple spectrum visualization (diff: 2)
♥0 | Line 114 | Modified 2011-01-04 12:11:10 | MIT License
play

ActionScript3 source code

/**
 * Copyright Aksor.Al ( http://wonderfl.net/user/Aksor.Al )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/csSh
 */

// forked from seikimaiii's Simple spectrum visualization
package
{
    import flash.utils.ByteArray;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundMixer;
    import flash.net.URLRequest;
    import flash.system.Security;
    import frocessing.color.ColorHSV;
    import flash.filters.BlurFilter;
    
    [SWF(frameRate="30",backgroundColor=0xFFFFFF)]
    
    public class AudioVisualizer extends MovieClip
    {
        private var _sound:Sound;
        private var _channel:SoundChannel;
        
        private var _timer:Timer;
        
        private var _resolution:Number = 16;
        private var _steps:Number;
        private var _width:Number;
        
        private var _bytes:ByteArray;
        
        private var _heights:Array;
        private var _freqs:Array;        
        
        //                                         h - [0, 360]
        //                                            s - [0, 1]
        //                                               v - brightness [0, 1]
        private var _color:ColorHSV = new ColorHSV(300, 1, 1);
        
        public function AudioVisualizer()
        {
            Security.loadPolicyFile("http://music.lunchbin.com/crossdomain.xml");
            
            _heights = new Array();
            _freqs = new Array();
            _bytes = new ByteArray();
            
            _steps = 256/_resolution;
            _width = 400/_resolution;
            
            for (var i:uint = 0; i < _steps; i++)
            {
                _heights[i] = 0;
            }
            
            _sound = new Sound();
            _sound.addEventListener(Event.COMPLETE, OnLoadComplete);
            _sound.load(new URLRequest("http://scfire-dtc-aa03.stream.aol.com:80/stream/1035"));
            
            _timer = new Timer(33.33); //30fps
            _timer.addEventListener(TimerEvent.TIMER, Tick);
            _timer.start();
        }
        
        public function OnLoadComplete(e:Event):void
        {
            _channel = _sound.play(0, 100, null);
        }

        // Main loop
        public function Tick(e:TimerEvent):void
        {
            if (_channel != null)
            {
                graphics.clear();              
                
                _bytes.position = 0;
                SoundMixer.computeSpectrum(_bytes, true);
                
                for (var i:uint = 0; i < _steps; i++)
                {
                    var l:Number = 0;
                    var r:Number = 0;
                    
                    //if (i < _steps/2)
                    //{
                    //    l = GetAvg(_bytes, i*_resolution*4, _resolution);
                    //    r = GetAvg(_bytes, i*_resolution*4 + 1024, _resolution);
                    //}
                    //else
                    //{
                        l = GetMax(_bytes, i*_resolution*4, _resolution);
                        r = GetMax(_bytes, i*_resolution*4 + 1024, _resolution);
                    //}
                    
                    var avg:Number = (l + r) / 2;
                    var n:Number = (avg * 200);
                    
                    if (n > _heights[i])
                    {
                        _heights[i] = n;
                    }
                    else
                    {
                        if (_heights[i] > 0)
                        {
                            _heights[i] -= (_heights[i]) * 0.05;
                        }
                        if (_heights[i] < 0)
                        {
                            _heights[i] = 0;
                        }
                    }
                    
                    _color.h = int((_heights[i]/200) * 360);
                    //_color.v = (_heights[i]/200) + 0.5;
                    
                    //graphics.beginFill(0xFFFFFF, (_heights[i]/200));
                    graphics.beginFill(_color.value);
                    graphics.drawRect(i*_width, 200, _width, -1 * _heights[i]);
                    graphics.endFill();
                }
            }
        }
        
        public function GetAvg(bytes:ByteArray, start:Number, length:Number):Number
        {
            var avg:Number = 0;
            bytes.position = start;
            for (var i:uint = 0; i < length; i++)
            {
                avg += bytes.readFloat();
            }
            avg /= length;
            return avg;
        }
        
        public function GetMax(bytes:ByteArray, start:Number, length:Number):Number
        {
            var max:Number = 0;
            bytes.position = start;
            for (var i:uint = 0; i < length; i++)
            {
                var test:Number = bytes.readFloat();
                if (test > max)
                {
                    max = test;
                }
            }
            return max;
        }

    }
}