zoukankan      html  css  js  c++  java
  • as3.0声音波形系列03_十组合

    // public onStageReSize():void
    
    package 
    {
    	import colors.ColorChange;
    	import flash.events.EventDispatcher;
    	import flash.media.SoundMixer;
    	import flash.events.TimerEvent;
    	import flash.utils.Timer;
    	import flash.events.MouseEvent;
    	import flash.display.BitmapData;
    	import flash.display.Bitmap;
    	import flash.geom.Point;
    	import flash.display.Sprite;
    	import flash.filters.BlurFilter;
    	import flash.filters.ColorMatrixFilter;
    	import flash.events.Event;
    	import flash.filters.DisplacementMapFilter;
    	import flash.utils.ByteArray;
    	import flash.display.Shape;
    
    	public class RonSoundFX extends Sprite
    	{
    		private var fxShape:Sprite;
    		private var th:uint;
    		private var tw:uint;
    		private var _fxID:int;
    		private var bn:int;
    		private var dy:Number;
    
    		private var bitmapdata:BitmapData;
    		private var _bitmapdata:BitmapData;
    
    		private var dz:Number = 0;
    
    		private var fn:Function;
    
    		private var listBar:Array;
    		private var mlArray:Array;
    		private var listVal:Array;
    		private var list256:Array;
    		private var listDot:Array;
    		private var list512:Array;
    
    		private var _isFilter:Boolean;
    		private var myTimer:Timer;
    		private var _color:ColorChange=new ColorChange();
    		private var bitmap:Bitmap;
    		var float:Number = 0;
    		var _byteArray:ByteArray;
    		
    		var alphaNumber:Number=0.66
    		/*宽度,高度,默认频谱ID,是否对频谱使用滤镜,是否自动切换频谱*/
    		public function RonSoundFX(w:int=400, h:int=300, n:int=0,_filter:Boolean=true,_start:Boolean=true,timer:uint=15,click:Boolean=true)
    		{
    			tw = w;
    			th = h;
    			_fxID = n;
    			if (_filter)
    			{
    				_isFilter = true;
    			}
    			else
    			{
    				_isFilter = false;
    			}
    
    			init();
    
    			myTimer = new Timer(timer*1000);//频谱顺序切换时间
    			myTimer.addEventListener("timer", timerHandler);
    			if (_start)
    			{
    				myTimer.start();
    			}
    			else
    			{
    				myTimer.stop();
    			}
    			
    			if(click){
    				
    				this.addEventListener(MouseEvent.CLICK,thisClickHandler);
    			}
    			else
    			{
    				this.removeEventListener(MouseEvent.CLICK,thisClickHandler);
    			}
    		}
    
    
    		private function init():void
    		{
    			fxShape=new Sprite();
    			_bitmapdata = new BitmapData(tw,th,true,0);
    			mlArray = gML();
    			
    			start()
    		}
    		
    		public function onStageReSize():void
    		{
    			tw =stage.stageWidth
    			th =stage.stageHeight
    			if(tw>800||th>800){
    				_isFilter = false
    			}else{
    				_isFilter =true
    			}
    			
    			start()
    		}
    
    
    
    
    
    		private function gML():Array
    		{
    			return ([waveForm01, waveForm02, waveForm03, waveForm04, waveForm05, waveForm06, waveForm07, waveForm08, waveForm09, waveForm10]);
    		}
    
    		private function waveForm01():void
    		{
    			alphaNumber=0.66
    			_byteArray = bytePosition(byteArray(true),true);
    			var num:Number = tw / bn;
    			fxShape.graphics.clear();
    			fxShape.graphics.beginFill(_color.color24);
    			for (var i:int=0; i < bn; i++)
    			{
    				float = th * 0.666 * _byteArray.readFloat();
    
    				_byteArray.position = _byteArray.position + Math.floor(252 / bn - 1) * 4;
    				listVal[i] = listVal[i] * 1.1;
    				listDot[i] = listDot[i] - listVal[i];
    				if (listDot[i] < float)
    				{
    					listVal[i] = dy * 0.5;
    					listDot[i] = float;
    				}
    				listBar[i] = listBar[i] - (listVal[i] + 2);
    				if (listBar[i] < float)
    				{
    					listBar[i] = float;
    				}
    				fxShape.graphics.drawRect(num * i, th, num - 1, -listBar[i]);
    				fxShape.graphics.drawRect(num * i, th - listDot[i] - 1, num - 1, 1);
    			}
    			fxShape.graphics.endFill();
    			waveFilter(false);
    		}
    
    		private function waveForm02():void
    		{
    			alphaNumber=0.998
    			_byteArray = bytePosition(byteArray());
    			fxShape.graphics.clear();
    			fxShape.graphics.lineStyle(1, _color.color24);
    			if (_byteArray.bytesAvailable)
    			{
    				float = th * 0.4 * _byteArray.readFloat();
    				fxShape.graphics.moveTo(0, (th * 0.5 + float));
    				for (var i:int=1; i < 256; i++)
    				{
    					float = th * 0.4 * _byteArray.readFloat();
    					fxShape.graphics.lineTo(i * (tw * 0.00390625), th * 0.5 + float);
    				}
    			}
    			waveFilter(false);
    		}
    
    
    		private function waveForm03():void
    		{
    			alphaNumber=0.92
    			_byteArray = byteArray(true);
    			var num:Number = tw * 0.00195313;
    			fxShape.graphics.clear();
    			fxShape.graphics.beginFill(_color.color24);
    			fxShape.graphics.moveTo((tw * 0.5), th);
    			if (_byteArray.bytesAvailable)
    			{
    				i = 255;
    				for (var i:int=255; i > 0; i--)
    				{
    					float = th * 0.666 * _byteArray.readFloat();
    					fxShape.graphics.lineTo(i * num, th - float);
    				}
    				fxShape.graphics.lineTo(0, th);
    				fxShape.graphics.moveTo(tw * 0.5, th);
    				for (i=256; i < 512; i++)
    				{
    					float = th * 0.666 * _byteArray.readFloat();
    					fxShape.graphics.lineTo(i * num, th - float);
    				}
    			}
    			fxShape.graphics.lineTo(tw, th);
    			fxShape.graphics.endFill();
    			waveFilter(false);
    		}
    
    
    		private function waveForm04():void
    		{
    			alphaNumber=0.76
    			_byteArray = bytePosition(byteArray(true),true);
    			fxShape.graphics.clear();
    			fxShape.graphics.lineStyle(1, _color.color24);
    			fxShape.graphics.beginFill(_color.color24);
    			fxShape.graphics.moveTo(0, th);
    
    			for (var i:int=1; i < 256; i++)
    			{
    				float = th * 0.666 * _byteArray.readFloat();
    				list256[i] = list256[i] - (dy * 2);
    				if (list256[i] < float)
    				{
    					list256[i] = float;
    				}
    				fxShape.graphics.lineTo(i * (tw * 0.00390625), th - list256[i]);
    			}
    			fxShape.graphics.lineTo(tw, th);
    			fxShape.graphics.endFill();
    			waveFilter(false);
    		}
    
    		private function waveForm05():void
    		{
    			alphaNumber=0.82
    			_byteArray = byteArray(true);
    			fxShape.graphics.clear();
    			fxShape.graphics.beginFill(_color.color24);
    			fxShape.graphics.moveTo(0, th * 0.5);
    			for (var i:int=0; i<512; i++)
    			{
    				float = th * 0.4 * _byteArray.readFloat();
    				list512[i] = (list512[i] - (dy * 2));
    				if (list512[i] < float)
    				{
    					list512[i] = float;
    				}
    				if (i >= 256)
    				{
    					if (i == 256)
    					{
    						fxShape.graphics.lineTo(tw, th * 0.5);
    						fxShape.graphics.lineTo(0, th * 0.5);
    					}
    					fxShape.graphics.lineTo((i - 256) * tw * 0.00390625, th * 0.5 - list512[i]);
    				}
    				else
    				{
    					fxShape.graphics.lineTo((i * tw * 0.00390625), (th * 0.5 + list512[i]));
    				}
    			}
    			fxShape.graphics.lineTo(tw, th * 0.5);
    			fxShape.graphics.lineTo(0, th * 0.5);
    			waveFilter(false);
    		}
    
    		private function waveForm06():void
    		{
    			alphaNumber=0.94
    			var cos:Number;
    			var sin:Number;
    			_byteArray = bytePosition(byteArray(true),true);
    			fxShape.graphics.clear();
    			fxShape.graphics.lineStyle(5, _color.color24);
    			fxShape.graphics.moveTo(tw * 0.5, th * 0.5);
    			for (var i:int=0; i<256; i++)
    			{
    				float = th * 0.3 * _byteArray.readFloat() + 5;
    				list256[i] = (list256[i] - dy);
    				if (list256[i] < float)
    				{
    					list256[i] = float;
    					list512[i] = (Math.random() * 360);
    				}
    				cos = float* Math.cos(list512[i] * (Math.PI / 180)) + tw * 0.5;
    				sin = float* Math.sin(list512[i] * (Math.PI / 180)) + th * 0.5;
    				fxShape.graphics.moveTo(tw * 0.5, th * 0.5);
    				fxShape.graphics.lineTo(cos, sin);
    			}
    			waveFilter(false);
    		}
    
    
    
    		private function waveForm07():void
    		{
    			alphaNumber=0.40
    			var num:*;
    			var list:*;
    			_byteArray = bytePosition(byteArray(true),true);
    			fxShape.graphics.clear();
    			for (var i:int=0; i < 256; i+=8)
    			{
    				if (list256[i] < 1)
    				{
    					list256[i] = 1;
    					num = _byteArray.readFloat() * 20;
    					float = _byteArray.readFloat() * 20;
    					list256[i + 1] = num;
    					list256[i + 2] = (tw - 40) * Math.random() + 20;
    					float *=  0.5;
    					if (float< 3)
    					{
    						float = 3;
    					}
    					list256[(i + 3)] = float;
    				}
    				else
    				{
    					num = list256;
    					list = list256[(i + 1)] - 1;
    					num[i + 1] = list;
    					list256[i] = list256[i] + list256[i + 1];
    					/*if(list256[i + 3] > 3)
    					{
    					list256[i + 3] -=0.5;
    					}*/
    
    				}
    				fxShape.graphics.beginFill(_color.color24);
    				fxShape.graphics.drawCircle(list256[i + 2], th - list256[i], list256[i + 3]);
    				fxShape.graphics.endFill();
    			}
    			waveFilter();
    		}
    
    
    		private function waveForm08():void
    		{
    			alphaNumber=0.96
    			_byteArray = bytePosition(byteArray(true),true);
    			fxShape.graphics.clear();
    			for (var i:int=0; i < 256; i+=8)
    			{
    				float = 10 * _byteArray.readFloat();
    				if (list256[i] < 1)
    				{
    					list256[i + 1] = (tw - (2 * 10)) * Math.random() + 10;
    					list256[i + 2] = (th - (2 * 10)) * Math.random() + 10;
    					list256[i + 3] = false;
    				}
    				if (list256[i] < float)
    				{
    					list256[i] = float;
    				}
    				list256[i] -=  0.5;
    				if ((float > 8 && i) || list256[i + 3])
    				{
    					if (list256[i + 3])
    					{
    						if (list256[i + 4] > 0)
    						{
    							list256[i + 4]-= 0.05;
    						}
    						else
    						{
    							list256[i + 3] = false;
    						}
    					}
    					else
    					{
    						list256[i + 4] = 1;
    						list256[i + 3] = true;
    					}
    					fxShape.graphics.lineStyle(1, _color.color24, list256[i + 4]);
    					fxShape.graphics.lineTo(list256[i + 1], list256[i + 2]);
    				}
    				fxShape.graphics.beginFill(_color.color24);
    				fxShape.graphics.drawCircle(list256[i + 1], list256[i + 2], list256[i]);
    				fxShape.graphics.moveTo(list256[i + 1], list256[i + 2]);
    				fxShape.graphics.endFill();
    			}
    			waveFilter(false);
    		}
    
    		private function waveForm09():void
    		{
    			alphaNumber=0.90
    			var abs:Number;
    			var point:Point;
    			var _round:int = 0;
    			var cos:Number;
    			var sin:Number;
    			var _array:Array = [];
    			var num:Number = 0;
    			var def:Number = 0;
    			var j:int = 1;
    			var _int:int = 0;
    			_byteArray = byteArray(true);
    			fxShape.graphics.clear();
    			fxShape.graphics.lineStyle(1, _color.color24);
    			while (_byteArray.bytesAvailable)
    			{
    				float = _byteArray.readFloat();
    				if (float> 0)
    				{
    					abs = float * th * 0.3 + 5;
    					num +=  abs;
    					def = num / j;
    					_array.push(abs - def);
    					j++;
    				}
    			}
    
    			for (var i:int=0; i < _array.length; i++)
    			{
    				abs = Math.abs(((_array[i] - def) * 0.5)) + def;
    				list512[i] -=  dy;
    				if (list512[i] < abs)
    				{
    					list512[i] = abs;
    				}
    				abs = list512[i];
    				_round =Math.round(i * 360 / _array.length) + dz;
    				cos = Math.round(abs * Math.cos(_round * (Math.PI / 180))) + tw * 0.5;
    				sin =Math.round(abs * Math.sin(_round * (Math.PI / 180))) + th * 0.5;
    				if (i == 0)
    				{
    					fxShape.graphics.moveTo(tw * 0.5, th * 0.5);
    					point = new Point(cos,sin);
    				}
    				fxShape.graphics.lineTo(cos, sin);
    				if ((_round - _int) > 8)
    				{
    					fxShape.graphics.lineTo(tw * 0.5, th * 0.5);
    					fxShape.graphics.moveTo(cos, sin);
    					_int = _round;
    				}
    			}
    			if (point)
    			{
    				fxShape.graphics.lineTo(point.x, point.y);
    			}
    			dz++;
    			waveFilter(false);
    		}
    
    
    		private function waveForm10():void
    		{
    			alphaNumber=0.92
    			_byteArray = bytePosition(byteArray(true),true);
    			fxShape.graphics.clear();
    			fxShape.graphics.lineStyle(1, _color.color24);
    			for (var i:int = 0; i < 256; i+=8)
    			{
    				float = _byteArray.readFloat() * 20;
    				if (list256[i] < 1)
    				{
    					list256[i + 1] = (tw - (2 * 20)) * Math.random() + 20;
    					list256[i + 2] = (th - (2 * 20)) * Math.random() + 20;
    				}
    				if (list256[i] < float)
    				{
    					list256[i] = float;
    				}
    				var list:Array = list256;
    				var j:int = i;
    				var _list = list256[i] - 1;
    				list[j] = _list;
    				fxShape.graphics.drawCircle(list256[i + 1], list256[i + 2], list256[i]);
    			}
    			waveFilter();
    		}
    
    
    		private function waveFilter(value:Boolean=true):void
    		{
    			_bitmapdata.lock();
    			if (_isFilter)
    			{
    
    				if (value)
    				{
    					applyDisplace(_bitmapdata);
    				}
    				else
    				{
    					_bitmapdata.applyFilter(_bitmapdata,_bitmapdata.rect,new Point(),new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,alphaNumber,0]));
    				}
    			}
    			else
    			{
    				_bitmapdata.applyFilter(_bitmapdata,_bitmapdata.rect,new Point(),new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.0,0]));
    			}
    			_bitmapdata.applyFilter(_bitmapdata, _bitmapdata.rect, new Point(), new BlurFilter(8,8,2));
    
    			_bitmapdata.draw(fxShape);
    			_bitmapdata.unlock();
    
    		}
    
    
    
    
    		private function zero(value:int):Array
    		{
    			var array:Array = [];
    			for (var i:int = 0; i < value; i++)
    			{
    				array.push(0);
    			}
    			return array;
    		}
    
    		private function clearF():void
    		{
    			if (_bitmapdata)
    			{
    				_bitmapdata.fillRect(_bitmapdata.rect, 0);
    			}
    		}
    
    		private function bytePosition(_byteArray:ByteArray, value:Boolean=false):ByteArray
    		{
    			var number:Number;
    			var _byte:ByteArray=new ByteArray();
    			_byteArray.position = 0;
    			if (_byteArray.bytesAvailable)
    			{
    				var byte:ByteArray = new ByteArray();
    				_byteArray.position = 1024;
    				_byteArray.readBytes(byte);
    				_byteArray.position = 0;
    				while (byte.bytesAvailable)
    				{
    					var n:Number = _byteArray.readFloat();
    					var num:Number = byte.readFloat();
    					if (value ||n > 0 && num > 0)
    					{
    						number = n > num ? n:num;
    					}
    					else
    					{
    						if (n < 0&& num < 0)
    						{
    							number = n < num ? n:num;
    						}
    						else
    						{
    							number = (n + num) * 0.5;
    						}
    					}
    					_byte.writeFloat(number);
    				}
    				_byte.position = 0;
    			}
    			return _byte;
    		}
    
    
    		private function applyDisplace(_bitmapdata:BitmapData):void
    		{
    			bitmapdata = _bitmapdata.clone();
    			var _bd:DisplacementMapFilter = new DisplacementMapFilter(bitmapdata,new Point(0,0),1,2,10,10,"clamp");
    			_bitmapdata.applyFilter(bitmapdata, _bitmapdata.rect, new Point(0,0), _bd);
    		}
    
    
    
    		private function byteArray(value:Boolean=false):ByteArray
    		{
    			var byte:ByteArray= new ByteArray();
    			if (SoundMixer.areSoundsInaccessible())
    			{
    				stop();
    			}
    			else
    			{
    				try
    				{
    					SoundMixer.computeSpectrum(byte,value);
    				}
    				catch (e:Error)
    				{
    				}
    			}
    			return byte;
    		}
    
    
    		public function start():void
    		{
    			stop();
    			dz = 0;
    			bn = (tw * 0.125);
    			if (bn >512)
    			{
    				bn = 512;
    			}
    			dy = th * 0.008;
    			listVal = zero(bn);
    			listDot = zero(bn);
    			listBar = zero(bn);
    			list256 = zero(256);
    			list512 = zero(512);
    			if (_bitmapdata)
    			{
    				_bitmapdata.clone();
    			}
    			_bitmapdata = new BitmapData(tw,th,true,0);
    			bitmap = addChild(new Bitmap(_bitmapdata)) as Bitmap;
    			fn = mlArray[_fxID];
    			this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
    		}
    
    
    		public function stop():void
    		{
    			if (! this.hasEventListener(Event.ENTER_FRAME))
    			{
    				return;
    			}
    			this.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
    			fxShape.graphics.clear();
    			clearF();
    		}
    		private function onEnterFrameHandler(event:Event):void
    		{
    			if (fn != null)
    			{
    				fn();
    			}
    
    		}
    
    		function timerHandler(event:TimerEvent):void
    		{
    			if (_fxID< 9)
    			{
    				_fxID++;
    			}
    			else
    			{
    				_fxID = 0;
    			}
    			start();
    
    		}
    
    		function thisClickHandler(event:MouseEvent):void
    		{
    
    			var index:int = Math.floor(Math.random() * 10);//频谱随机ID
    			trace(index);
    			//先停止频谱
    			myTimer.stop();
    			stop();
    
    			_fxID = index;
    
    			//从新运行频谱
    			myTimer.start();
    			start();
    
    		}
    
    
    
    
    
    
    
    	}
    }
    

      

  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/fengziwu/p/15390524.html
Copyright © 2011-2022 走看看