/* import flash.display.BlendMode; blendMode=BlendMode.SCREEN 关闭黑色背景 public function onStageReSize():void 自适应缩放 */ package { import color.ColorChange import flash.display.Sprite; import flash.display.Bitmap; import flash.utils.ByteArray; import flash.display.BitmapData; import flash.events.Event; import flash.media.SoundMixer; import flash.filters.BlurFilter; import flash.geom.ColorTransform; import flash.filters.ColorMatrixFilter; import flash.geom.Matrix; import flash.display.BlendMode; import flash.geom.Point; import flash.geom.Rectangle; import flash.events.MouseEvent; import flash.display.BlendMode; public class LineToGroups extends Sprite { private var sprite:Sprite; private var bitmap:Bitmap; private var bitmapData:BitmapData; private var byteArray:ByteArray; private var thisW:Number; private var thisH:Number; private var singleW:Number; private var pos:Number = 0; private var matrix:Matrix; private var mode:int =1; private var count:int = 0; private var numArr:Array = []; private var fftMode:Boolean = true; private var colorChange:ColorChange=new ColorChange(); public function LineToGroups(w:Number=720,h:Number=480) { thisW = w; thisH = h; sprite=new Sprite(); byteArray = new ByteArray(); for (var i:int= 0; i < 256; ++ i) { numArr[i] = 0; } bitmapData = new BitmapData(thisW,thisH,false,0); bitmap = addChild(new Bitmap(bitmapData)) as Bitmap; //blendMode=BlendMode.SCREEN this.addEventListener(MouseEvent.CLICK,onClickHandler); addEventListener(Event.ENTER_FRAME,enterframeHandler); } //ReSize public function onStageReSize():void { thisW = stage.stageWidth; thisH = stage.stageHeight; if (bitmapData) { bitmapData.dispose(); } bitmapData = new BitmapData(thisW,thisH,false,0); bitmap = addChild(new Bitmap(bitmapData)) as Bitmap; //blendMode=BlendMode.SCREEN } private function onClickHandler(event:MouseEvent):void { count = 0; mode = Math.floor(Math.random() * 5) + 1; } private function enterframeHandler(event:Event):void { var num:Number; var i:uint; var xPos:Number; var yPos:Number; if (count %500 == 0) { if (++mode > 6) { mode = 1; } } SoundMixer.computeSpectrum(byteArray,fftMode,1); sprite.graphics.clear(); sprite.graphics.lineStyle(1,colorChange.color); if (mode==1) { fftMode = false; for (i= 0; i <256; i+=4) { num = Math.abs(byteArray.readFloat() + 0.1); numArr[ i ] += (num-numArr[ i ] ) * 0.25; num = numArr[i]; sprite.graphics.drawCircle( thisW/2 + Math.sin(i * 360 / 256 * Math.PI / 180) * (30+num*thisH/4),thisH/2 + Math.cos(i * 360 / 256 * Math.PI / 180+pos) * (30+num*thisH/4), num * 20 ); } sprite.graphics.beginFill(colorChange.color, 1 ); for (i = 0; i <256; i+=4) { num = Math.abs(byteArray.readFloat() + 0.1); numArr[ i ] += (num-numArr[ i ] ) * 0.25; num = numArr[i]; sprite.graphics.drawCircle( thisW/2+ Math.sin(i * 360 /256 * Math.PI / 180) * (40+num*thisH/3),thisH/2 + Math.cos(i * 360 /256 * Math.PI / 180+pos) * (30+num*thisH/3)+thisH/8,num *5 ); } pos += 0.04; } if (mode==2) { pos = 0; fftMode = true; sprite.graphics.moveTo(-Math.sin(0)*2 + thisW/2 + thisW/8*Math.sin(pos), Math.cos(0) + thisH*0.6 + thisH/8*Math.cos(pos/2)); for (i= 0; i <512; i++) { num = byteArray.readFloat() + 0.1; var a:uint = i; if (i <256) { a += 256; } var _size:Number = Math.ceil(thisH* 0.75*0.8*(num+0.5)); xPos= -Math.sin(i/256*Math.PI)*_size*num*2 + thisW/2 + thisW/8*Math.sin(pos); yPos= Math.cos(a/256*Math.PI)*_size*num/2 + thisH*0.6 + thisH/8*Math.cos(pos/2); sprite.graphics.lineTo(xPos, yPos); } //pos += 0.02; } if (mode==3) { fftMode = false; for (i= 0; i <512; i+=2) { num = byteArray.readFloat(); var b:uint = i; if (i >= 256) { b -= 256; } if (i ==256) { sprite.graphics.moveTo(0, thisH/2); } xPos= b/512*(thisW*4+2); yPos = thisH / 4 * - num; xPos -= 2; if (i >= 256) { yPos *= -1; } sprite.graphics.lineTo(xPos, yPos + thisH/2); } } if (mode==4) { fftMode = false; sprite.graphics.moveTo(thisW/2,thisH/2-thisH/2*0.1); for (i= 0; i <512; i++) { num = byteArray.readFloat(); var angleInRadians:Number=i*(360/512)*(Math.PI/180); xPos = thisW / 2 + thisW / 2 * Math.sin(angleInRadians) * num; yPos = thisH / 2 - thisH / 2 * Math.cos(angleInRadians) * num; sprite.graphics.lineTo(xPos, yPos); } } if (mode==5) { fftMode = false; for (i= 0; i <512; i+=4) { num = byteArray.readFloat(); var c:uint = i; if (i >=512) { c -= 256; } xPos = c / 256 * (thisW + 10); yPos = - num * thisH / 4 + Math.cos(pos) * (thisH / 8); if (i >=256) { yPos *= -1; } if (i ==256) { sprite.graphics.moveTo(0, yPos + thisH/2); } sprite.graphics.lineTo(xPos, yPos + thisH/2); } pos += 0.01; } if (mode==6) { fftMode = true; sprite.graphics.moveTo(thisW/4,thisH/2); singleW = (thisW - thisW / 2) / 256; for (i= 0; i < 256; i++) { num = byteArray.readFloat(); sprite.graphics.lineTo(thisW/4+ i*singleW,thisH/2 + num *thisH/3); } sprite.graphics.moveTo(thisW/4,thisH/2); for (i = 0; i < 256; i++) { num = byteArray.readFloat(); sprite.graphics.lineTo(thisW/4 + i*singleW,thisH/2 - num *thisH/3); } } sprite.graphics.endFill(); matrix=new Matrix(); matrix.translate( - thisW/2, - thisH/2); matrix.scale(1.1,1.1); matrix.translate(thisW/2,thisH/2); bitmapData.lock(); bitmapData.draw(bitmapData,matrix,new ColorTransform(0.96,0.96,0.96)); //bitmapData.draw(bitmapData,matrix,new ColorTransform(0.96,0.96,0.96),BlendMode.NORMAL); //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,.998,0])); bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point(0,0),new BlurFilter(4,4,1)); bitmapData.draw(sprite); bitmapData.unlock(); count++; } } }