Vespers.as (メインクラス)
package {
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.Rectangle;
    import flash.geom.ColorTransform;
    import flash.geom.Point;
    import flash.geom.Matrix;
    import flash.media.Sound;
    import flash.media.SoundMixer;
    import flash.media.SoundTransform;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
    import flash.filters.BlurFilter;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.events.IOErrorEvent;
    import flash.text.TextField;
    import flash.text.TextFormat;
    
    [SWF(width="550",height="400",backgroundColor="0x0",frameRate="24")]
    
    public class Vespers extends Sprite {
        
        //Define the canvas area
        private var marginX:Number = 50;
        private var marginY:Number = 50;
        private var canvasLeft:Number = marginX;
        private var canvasRight:Number = stage.stageWidth - marginX;
        private var canvasTop:Number = marginY;
        private var canvasBottom:Number = stage.stageHeight - marginY;
        private var screen:BitmapData;
        
        //Control blur filter
        private var sliderX:SimpleSlider;
        private var sliderY:SimpleSlider;
    
        //Loading info
        private var progress:TextField;
        
        //Constructor
        public function Vespers (){
            var s:Sound = new Sound();
            s.load(new URLRequest("mp3/Vespers_mono_32kbps.mp3"));
            s.addEventListener(Event.COMPLETE,onComplete);
            s.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener);
            s.addEventListener(ProgressEvent.PROGRESS,progressListener);
            createProgressIndicator();
        }
        
        //Now loading...
        private function createProgressIndicator():void{
            progress = new TextField();
            progress.width = 140;
            progress.x = stage.stageWidth/2 - progress.width/2;
            progress.y = stage.stageHeight/2 - 10;
            
            if (!contains(progress)){
                addChild(progress);
            }
        }
        
        //set sliders and a bitmap-canvas onto a stage
        private function createStageObject():void{
            //SliderX, rotated by 90 degree
            sliderX = new SimpleSlider(0,20,0);
            sliderX.x = stage.stageWidth/2 + sliderX.height/2;
            sliderX.y = stage.stageHeight - 30;
            sliderX.rotation = 90;
            addChild(sliderX);
            
            //SliderY
            sliderY = new SimpleSlider(0,20,0);
            sliderY.x = 20;
            sliderY.y = stage.stageHeight/2 - sliderY.height/2;
            addChild(sliderY);
            
            //A bitmap-canvas
            var w:Number = canvasRight - canvasLeft;
            var h:Number = canvasBottom - canvasTop;
            screen = new BitmapData(w,h,false,0x0);
            var bmp:Bitmap = new Bitmap(screen);
            bmp.x = canvasLeft;
            bmp.y = canvasTop;
            addChild(bmp);
        }
        
        private function ioErrorListener(e:IOErrorEvent):void{
            progress.text = "Load error!!";
            
            var format:TextFormat = new TextFormat();
            format.color = 0xFFFFFF;
            format.font = "Courier";
            format.size = 14;
            progress.setTextFormat(format);
        }
        
        private function progressListener(e:ProgressEvent):void{
            progress.text = "Loading... " + Math.floor(e.bytesLoaded*100/e.bytesTotal) + " %";
            
            var format:TextFormat = new TextFormat();
            format.color = 0xFFFFFF;
            format.font = "Courier";
            format.size = 14;
            progress.setTextFormat(format);
        }
        
        private function onComplete(e:Event):void{
            var sc:SoundChannel = e.target.play(0,999);
            var st:SoundTransform = new SoundTransform();
            st.volume = 0.5;
            sc.soundTransform = st;
            
            //Remove the setup-objects
            removeChild(progress);
            e.target.removeEventListener(ProgressEvent.PROGRESS,progressListener);
            e.target.removeEventListener(Event.COMPLETE,onComplete);
            
            createStageObject();
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }
        
        private function onEnterFrame(e:Event):void{
            //FFT
            var ba:ByteArray = new ByteArray();
            SoundMixer.computeSpectrum(ba,true,0);
            
            makeMirage();
                
            var dif:int = 16;
            for(var i:int=0; i<256; i+=dif){
                var h:Number = (canvasBottom-canvasTop)*ba.readFloat();
                var x:Number = (canvasRight-canvasLeft)*i/255;
                var y:Number = canvasBottom - h;
                var r:int = i;
                var g:int = (255 + 255 - i)/2;
                var b:int = (255 + 255 - i)/2;
                var col:uint = r << 16 | g << 8 | b;
                var s:Shape = new Shape();
                s.graphics.beginFill(col);
                s.graphics.drawRect(x,y,(canvasRight-canvasLeft)*dif/255,5);
                s.graphics.endFill();
                screen.draw(s);
            }
        }
        
        //Make a mirage-like effect
        private function makeMirage():void{
            var cach:BitmapData = screen.clone();
            screen.fillRect(screen.rect,0x0);
            
            //Control blur amplitudes in the x- and y-axis
            var bx:Number = sliderX.value;
            var by:Number = sliderY.value;
            
            cach.applyFilter(cach,cach.rect,new Point(0,0),new BlurFilter(bx,by));
            screen.draw(cach,new Matrix(),new ColorTransform(1,1,1,0.95,0,0,0,0));
        }
    } 
}
SimpleSlider.as (original source by Keith Peters BIT-101 Blog)
package{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    import flash.events.Event;
    
    /* Modified the handler shape into a rectangle */
    
    public class SimpleSlider extends Sprite{
        private var _width:Number = 6;
        private var _height:Number = 100;
        private var _value:Number;
        private var _max:Number = 100;
        private var _min:Number = 0;
        private var _handle:Sprite;
        private var _back:Sprite;
        private var _backWidth:Number = 0;
        private var _handleHeight:Number = 20;
        private var _backColor:uint = 0xcccccc;
        private var _backBorderColor:uint = 0x999999;
        private var _handleColor:uint = 0x000000;
        private var _handleBorderColor:uint = 0xcccccc;
        private var _handleRadius:Number = 2;
        private var _backRadius:Number = 2;
        
        public function SimpleSlider(min:Number=0, max:Number=100, value:Number=100){
            _min = min;
            _max = max;
            _value = Math.min(Math.max(value, min), max)
            init();
        }
        
        private function init():void{
            _back = new Sprite();
            addChild(_back);
            
            _handle = new Sprite();
            addChild(_handle);
            _handle.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            
            draw();
            updatePosition();
        }
        
        private function draw():void{
            drawBack();
            drawHandle();
        }
        
        private function drawBack():void{
            _back.graphics.clear();
            _back.graphics.beginFill(_backColor);
            _back.graphics.lineStyle(0, _backBorderColor);
            _back.graphics.drawRoundRect(0, 0, _backWidth, _height, _backRadius, _backRadius);
            _back.graphics.endFill();
            _back.x = _width / 2 - _backWidth / 2;
        }
        
        private function drawHandle():void{
            _handle.graphics.clear();
            _handle.graphics.beginFill(_handleColor);
            _handle.graphics.lineStyle(0, _handleBorderColor);
            _handle.graphics.drawRect(0, 0, _width, _handleHeight);
            _handle.graphics.endFill();
        }
    
        private function updatePosition():void{
            var handleRange:Number = _height - _handleHeight;
            var valueRange:Number = _max - _min;
            _handle.y = handleRange - (_value - _min) / valueRange * handleRange;
        }
        
        private function updateValue():void{
            var handleRange:Number = _height - _handleHeight;
            var valueRange:Number = _max - _min;
            _value = (handleRange - _handle.y) / handleRange * valueRange + _min;
            dispatchEvent(new Event(Event.CHANGE));
        }
        
        private function onMouseUp(event:MouseEvent):void{
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            _handle.stopDrag();
        }
        
        private function onMouseDown(event:MouseEvent):void
        {
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            _handle.startDrag(false, new Rectangle(0, 0, 0, _height - _handleHeight));
        }
        
        private function onMouseMove(event:MouseEvent):void{
            updateValue();
        }


        
        public function invalidate():void{
            draw();
        }
        
        public function move(x:Number, y:Number):void{
            this.x = x;
            this.y = y;
        }
        
        public function setSize(w:Number, h:Number):void{
            _width = w;
            _height = h;
            draw();
        }
        
        public function set backBorderColor(n:uint):void{
            _backBorderColor = n;
            draw();
        }
        public function get backBorderColor():uint{
            return _backBorderColor;
        }
        
        public function set backColor(n:uint):void{
            _backColor = n;
            draw();
        }
        public function get backColor():uint{
            return _backColor;
        }
        
        public function set backRadius(n:Number):void{
            _backRadius = n;
        }
        public function get backRadius():Number{
            return _backRadius;
        }
        
        public function set backWidth(n:Number):void{
            _backWidth = n;
            draw();
        }
        public function get backWidth():Number{
            return _backWidth;
        }
        
        public function set handleBorderColor(n:uint):void{
            _handleBorderColor = n;
            draw();
        }
        public function get handleBorderColor():uint{
            return _handleBorderColor;
        }
        
        public function set handleColor(n:uint):void{
            _handleColor = n;
            draw();
        }
        public function get handleColor():uint{
            return _handleColor;
        }
        
        public function set handleRadius(n:Number):void{
            _handleRadius = n;
            draw();
        }
        public function get handleRadius():Number{
            return _handleRadius;
        }
        
        public function set handleHeight(n:Number):void{
            _handleHeight = n;
            draw();
            updatePosition();
        }
        public function get handleHeight():Number{
            return _handleHeight;
        }
        
        override public function set height(n:Number):void{
            _height = n;
            draw();
        }
        override public function get height():Number{
            return _height;
        }
        
        public function set max(n:Number):void{
            _max = n;
            updatePosition();
        }
        public function get max():Number{
            return _max;
        }
        
        public function set min(n:Number):void{
            _min = n;
            updatePosition();
        }
        public function get min():Number{
            return _min;
        }
        
        public function set value(n:Number):void{
            _value = n;
            _value = Math.min(_max, Math.max(_value, _min));
            updatePosition();
        }
        public function get value():Number{
            return _value;
        }
        
        override public function set width(n:Number):void{
            _width = n;
            draw();
        }
        override public function get width():Number{
            return _width;
        }
    }
}
Powered by blog Boreal Kiss 2008.