// 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();

		}







	}
}

  

posted on 2021-10-10 20:30  疯子_wu  阅读(108)  评论(0编辑  收藏  举报