package { import flash.display.*; import flash.events.*; import flash.external.ExternalInterface; import flash.filters.*; import flash.geom.*; import flash.media.*; import flash.net.*; import flash.profiler.*; import flash.system.*; import flash.utils.*; [SWF(backgroundColor="#000000")] public class Visualizr extends Sprite { //set up the bitmap, the bitmapdata, and the bytearray private var scalerbmd:BitmapData; private var scalerbm:Bitmap; private var ba:ByteArray; private var drawerbmd:BitmapData; private var drawerbm:Bitmap; private var debug:Number = 0; private var holder:Sprite; private var rotor:Sprite; private var sizex:Number; private var sizey:Number; //make some noise private var s:Sound; //fx private var bf:BlurFilter; private var hider:Sprite; //additional stuff to glue it together private var color:Array; private var newcolor:String; private var newcolor2:String; private var rotationJump:Number; private var scaleChange:Number; private var dikte:Number = 1; //settingsstuff private var beginX:Number; private var beginY:Number; private var enabled:Boolean=true; public function Visualizr():void { this.stage.align = StageAlign.TOP_LEFT; this.stage.scaleMode = StageScaleMode.NO_SCALE; color = new Array(0xFF0033,0x33FF00,0x3300FF,0x00EEFF,0xFFFF00);//all the values you want to be able to show up in the color codes setTimeout(getColor,800); hider = new Sprite(); holder = new Sprite(); rotor = new Sprite(); //set up those filters! sizex = 1000; sizey = 600; rotationJump = 1.5; scaleChange = 1.08; bf = new BlurFilter(4,4,4); ba = new ByteArray(); scalerbmd = new BitmapData(sizex,sizey,true,0x000000); scalerbm = new Bitmap(scalerbmd); drawerbmd = new BitmapData(sizex,sizey,true,0x000000); drawerbm = new Bitmap(drawerbmd); rotor.addChild(scalerbm); scalerbm.x = -scalerbm.width/2; scalerbm.y = -scalerbm.height/2; holder.addChild(rotor); rotor.x = scalerbm.width/2; rotor.y = scalerbm.height/2; holder.addChild(hider); holder.addChild(drawerbm); addChild(holder); doLayout(); //var song:String = "http://labs.nocreativity.com/soundCoolness/Visualizr.html?s=abc"; var song:String = "soldiers.mp3"; var track:String = ""; var swfurl:String = ExternalInterface.call("function(){return window.location.href}"); if(swfurl.split("?s=").length==2){ track = swfurl.split("?s=")[1]; } switch(track){ case "1": song = "boom.mp3"; break; case "2": song="guetta.mp3"; break; case "3": song="soldiers.mp3"; break; case "4": song="mosdef.mp3"; break; case "5": song="daftpunk.mp3"; break; } s = new Sound(new URLRequest("assets/"+song)); var sc:SoundChannel = s.play(); var st:SoundTransform = sc.soundTransform; st.volume = 1; sc.soundTransform = st; //make things move stage.addEventListener(Event.ENTER_FRAME,loop); stage.addEventListener(MouseEvent.MOUSE_DOWN, startTheCount); stage.addEventListener(MouseEvent.CLICK, changeTheColor); stage.addEventListener(KeyboardEvent.KEY_DOWN, toggleFullScreen); } private function toggleFullScreen(e:KeyboardEvent):void{ if(e.keyCode == 70){ stage.displayState = StageDisplayState.FULL_SCREEN; } if(e.keyCode == 83){ enabled = !enabled; if(enabled){ stage.removeEventListener(Event.ENTER_FRAME,loop); } else{ stage.addEventListener(Event.ENTER_FRAME,loop); } } } private function changeTheColor(e:MouseEvent):void{ getColor(); //trace(System.totalMemory/1024/1024,' MB', ' @ ', stage.frameRate , "fps"); } private function startTheCount(e:MouseEvent):void{ beginX = mouseX; beginY = mouseY; stage.addEventListener(MouseEvent.MOUSE_MOVE, updateTheCount); stage.addEventListener(MouseEvent.MOUSE_UP, stopTheCount); } private function stopTheCount(e:MouseEvent):void{ stage.removeEventListener(MouseEvent.MOUSE_MOVE, updateTheCount); stage.removeEventListener(MouseEvent.MOUSE_UP, stopTheCount); e.stopPropagation(); stage.addEventListener(MouseEvent.CLICK, changeTheColor); } private function updateTheCount(e:MouseEvent):void{ stage.removeEventListener(MouseEvent.CLICK, changeTheColor); if(scaleChange - ((mouseX - beginX)/7500) < 0.5){ scaleChange = 0.5; } else if(scaleChange + ((mouseX - beginX)/7500) > 1.5){ scaleChange = 1.5; }else{ scaleChange -= ((mouseX - beginX)/7500); } if(rotationJump - ((mouseY - beginY)/80) < -20){ rotationJump = -20; } else if(rotationJump + ((mouseY - beginY)/80) > 20){ rotationJump = 20; }else{ rotationJump -= ((mouseY - beginY)/80); } beginX = mouseX; beginY = mouseY; } private function loop(e:Event):void { //let's see if we can get some low, mid and high tones... var array:Array = new Array(); SoundMixer.computeSpectrum(ba,true,85); for(var j:uint=0;j<255;j+=85){ ba.position = j; array.push(ba.readFloat()); } if(array[0]>1){ rotationJump *= -1; scaleChange = array[0]; } else if(array[0]<0.5){ scaleChange = array[0]*1.7; } //scaleChange = Math.abs(array[1]); var a:Number= Math.round(array[2]); if(a != 0 && a > 51200000000000000000000000000000){ getColor(); trace(a); } //let's draw some stuff hider.graphics.clear(); hider.graphics.lineStyle(1,uint(newcolor)); SoundMixer.computeSpectrum(ba); //FREAKING COOLNESS!! I TELL YOU!!! //left var cx:Number; var cy:Number; var changer:Number; //draw 1 circle for (var i:Number = 0; i<360; i++) { cx = Math.cos(i*Math.PI/180); cy = Math.sin(i*Math.PI/180); changer = ba[i]/2; if (i==0) { hider.graphics.moveTo(cx*changer+(sizex/2)+50,cy*changer+sizey/2); } if (changer>60) { hider.graphics.lineTo(cx*changer+(sizex/2),cy*changer+(sizey/2)); } } //make the bitmap grow // This is where the magic happens rotor.scaleX = scaleChange; rotor.scaleY = scaleChange; rotor.rotation = rotationJump; doLayout(); rotor.visible=true; drawerbm.visible=false; drawerbmd.draw(holder); drawerbm.visible=true; doLayout(); drawerbmd.applyFilter(drawerbmd, drawerbmd.rect, new Point(0,0), bf); rotor.visible=false; scalerbmd.draw(holder); rotor.rotation = rotationJump; // This was where the magic happens } private function clickHandler(e:MouseEvent):void { hider.visible= !hider.visible; } private function keydownHandler(e:KeyboardEvent):void { this.stage.removeEventListener(Event.ENTER_FRAME,loop); } private function keyupHandler(e:KeyboardEvent):void { this.stage.addEventListener(Event.ENTER_FRAME,loop); } private function getColor():void { var newpos:String =color[Math.floor(Math.random()*color.length)]; newcolor != newpos ? newcolor = newpos : getColor(); } private function doLayout():void{ scalerbm.x = -scalerbm.width/2; scalerbm.y = -scalerbm.height/2; holder.x = (stage.stageWidth - sizex)/2; holder.y = (stage.stageHeight - sizey)/2; } } }