package { import flash.display.Shape; import flash.display.Stage; import flash.display.Sprite; import flash.events.Event; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.system.Security; import org.papervision3d.core.math.Number3D; import org.papervision3d.cameras.Camera3D; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.materials.special.CompositeMaterial; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.render.QuadrantRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.materials.utils.MaterialsList; import gs.easing.*; import gs.TweenMax; import flash.display.Sprite; import flash.display.MovieClip; import flash.events.*; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.media.SoundLoaderContext; import flash.net.URLRequest; import flash.utils.Timer; import flash.utils.ByteArray; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.events.MouseEvent; public class soundSpectrumClass extends Sprite { public var viewport :Viewport3D; public var scene :Scene3D; public var camera :Camera3D; public var camera2 :Camera3D; public var camera3 :Camera3D; public var cube :Cube; public var plane0 :Plane; public var plane1 :Plane; public var plane2 :Plane; public var plane4 :Plane; public var logo:logostef; public var creditsmc:credits; public var square:Sprite; public var square2:Shape; public var progressSquare:Shape; public var renderer:QuadrantRenderEngine; public var planesColors:Array = new Array(0xFF6600, 0xFFFF00, 0x72FF33, 0x00CCFF, 0x3333FF, 0xF73CAC, 0xF93939, 0xFD9935); //////// SOUND SPECTRUM public var s:Sound = new Sound(); public var sc:SoundChannel = new SoundChannel(); public var estimatedLength:Number; public var ba:ByteArray = new ByteArray(); public var array:Array; public var a:Number = 0; public var tweeningInterval:Number = 5; public var tweeningInterval2:Number = 60; public var enterFrameNum:Number = 0; public var enterFrameNum2:Number = 0; public var diff:Number = 1; public var planes:Array = new Array(); //public var ns0:NumericStepper; var cameraPos0:Array = new Array(100, -340, -589, -49, -10, -13); var cameraPos1:Array = new Array(-150, 200, -650, 10, 40, 0); var topviewcoords:Array = new Array(-1000, 0, -300, 77, 0, 90); var frontviewcoords:Array = new Array(300, 0, -650, 0, 0, 0); var cp90basCoords:Array = new Array(800, 0, -900, -30, 0, 90); var cp90hautCoords:Array = new Array(-300, 0, -715, 41, 0, 90); var cp90hautCoords2:Array = new Array(-500, 0, -500, 57, 0, 90); var topview90coords:Array = new Array(-400, 0, -300, 75, 0, 90); var rightbottomview:Array = new Array(600, -100, -200, -25, -50, 0); var test1:Array = new Array(-800, 400, -400, 76, 0, 70); public var cameraPositions:Array = new Array(cameraPos1, cp90basCoords, cp90hautCoords2, topview90coords, rightbottomview, rightbottomview, rightbottomview); var cameraPos3:Array = new Array(); public function soundSpectrumClass() { super(); init(); } private function init():void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; init3D(); createCube(); soundSpectrumDemo(); addEventListeners(); logo.logolinks.visible = false; } private function init3D():void { viewport = new Viewport3D( 0, 0, true, false ); viewport.autoScaleToStage = true; viewport.autoClipping = true; this.addChild(viewport); renderer = new QuadrantRenderEngine(QuadrantRenderEngine.CORRECT_Z_FILTER); scene = new Scene3D(); camera = new Camera3D(); camera2 = new Camera3D(); camera3 = new Camera3D(); } private function resizeHandler(event:Event):void{ square.width = stage.stageWidth; trace(logo.y); creditsmc.x = stage.stageWidth; logo.y = stage.stageHeight; logo.logobar.width = stage.stageWidth; logo.logolinks.x = stage.stageWidth; } private function createCube():void { for(var i=0; i < 8; i++){ var mat:ColorMaterial = new ColorMaterial(planesColors[i]); mat.fillAlpha = 0.8; var wire:WireframeMaterial = new WireframeMaterial(planesColors[i]); wire.tiled = true; var composite:CompositeMaterial = new CompositeMaterial(); composite.addMaterial(mat); composite.addMaterial(wire); cube = new Cube(new MaterialsList({ front:composite, back:composite, left:composite, right:composite, top:composite, bottom:composite}), 10*8, 10*8, 480, 1, 1, 1); cube.x = 81*i; planes.push(cube); scene.addChild(cube); } } private function addEventListeners():void { addEventListener( Event.ENTER_FRAME, __onEnterFrame ); } private function removeEventListeners():void { removeEventListener( Event.ENTER_FRAME, __onEnterFrame ); } public function applyNumber3D(p:Number3D, d:DisplayObject3D):void { d.x = p.x; d.y = p.y; d.z = p.z; } private function __onEnterFrame ( e:Event ):void { if(enterFrameNum < tweeningInterval){ enterFrameNum++; } else { enterFrameNum = 0; } if(enterFrameNum2 < tweeningInterval2){ enterFrameNum2++; } else { enterFrameNum2 = 0; } var xcenter:Number = 0; var ycenter:Number = 0; var radius:Number = 50; var radian:Number = (viewport.mouseX/180)*Math.PI; camera3.x = xcenter+Math.cos(radian)*radius/2; camera3.rotationY = ycenter-Math.sin(radian)*radius/2; var radian2:Number = (viewport.mouseY/180)*Math.PI; camera3.rotationX = xcenter+Math.cos(radian2)*radius/2; camera3.y = ycenter-Math.sin(radian2)*radius/2; applyCoordsToCamera(camera, frontviewcoords); if(enterFrameNum2 == 0) applyCoordsToCamera(camera2, cameraPositions[Math.round(Math.random()*cameraPositions.length)]); if(diff == -1){ renderer.renderScene( scene, camera2, viewport ); } else { renderer.renderScene( scene, camera, viewport ); } estimatedLength = Math.ceil(s.length / (s.bytesLoaded / s.bytesTotal)); progressSquare.scaleX = sc.position / estimatedLength; //sound spectrum update spectrum(e); } public var cameraPosChangeCount:int = 0; private function applyCoordsToCamera(camera:Camera3D, coords:Array):void{ camera.x = coords[0]; camera.y = coords[1]; camera.z = coords[2]; camera.rotationX = coords[3]; camera.rotationY = coords[4]; camera.rotationZ = coords[5]; /*cameraPosChangeCount++; trace("changing camera position..."+cameraPosChangeCount); TweenMax.killTweensOf(camera); TweenMax.to(camera, 0.5, { x:coords[0], y:coords[1], z:coords[2], rotationX:coords[3], rotationY:coords[4], rotationZ:coords[5], ease:Linear.easeNone });*/ } public function soundSpectrumDemo(){ Security.allowDomain("http://lab.st-f.net"); stage.addEventListener(Event.RESIZE, resizeHandler); //bg var squareWidth:uint = stage.stageWidth; var squareHeight:uint = 10; square = new Sprite(); square.graphics.beginFill(0xFFFFFF, 0.3); square.graphics.drawRect(0, 0, squareWidth, squareHeight); square.graphics.endFill(); this.addChild(square); //song load bar square2 = new Shape(); square2.graphics.beginFill(0x000000, 1); square2.graphics.drawRect(0, 0, squareWidth, 2); square2.graphics.endFill(); //song seek bar progressSquare = new Shape(); progressSquare.graphics.beginFill(0x000000, 0.3); progressSquare.graphics.drawRect(0, 2, squareWidth, 8); progressSquare.graphics.endFill(); this.addChild(square2); this.addChild(progressSquare); logo = new logostef(); creditsmc = new credits(); creditsmc.y = 11; creditsmc.x = stage.stageWidth; creditsmc.prevBtn.addEventListener(MouseEvent.CLICK, prevSongHandler); creditsmc.nextBtn.addEventListener(MouseEvent.CLICK, nextSongHandler); this.addChild(creditsmc); logo.y = stage.stageHeight; logo.logobar.width = stage.stageWidth; logo.logolinks.x = stage.stageWidth; this.addChild(logo); square.addEventListener(MouseEvent.CLICK, seekTrack); loadAndPlayCurrentSong(); } public var songsList:Array = new Array("mix.mp3", "anam.mp3", "weekend.mp3"); public var creditsList:Array = new Array("Le Peuple de l'Herbe", "DJ Gumbo", "Karlit & Kabok"); public var currentSong:Number = 0; private function loadAndPlayCurrentSong():void{ creditsmc.txt.text = "music by " + creditsList[currentSong]; sc.stop(); s = new Sound(); var slc:SoundLoaderContext = new SoundLoaderContext(10000, true); s.load(new URLRequest("http://lab.st-f.net/AS3/soundSpectrum/music/"+songsList[currentSong]), slc); s.addEventListener(ProgressEvent.PROGRESS, progressHandler); sc = s.play(0); sc.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); } private function prevSongHandler(event:MouseEvent):void{ if(currentSong > 0){ currentSong--; }else{ currentSong = songsList.length-1; } loadAndPlayCurrentSong(); } private function nextSongHandler(event:MouseEvent = null):void{ trace("next"); if(currentSong < songsList.length-1){ currentSong++; } else { currentSong = 0; } loadAndPlayCurrentSong(); } private function soundCompleteHandler(e:Event):void { trace("sound complete !"); progressSquare.scaleX = 0; nextSongHandler(); } private function seekTrack(event:MouseEvent):void{ var percentSeeked:Number = mouseX / stage.stageWidth; var dest:Number = Math.round(estimatedLength * percentSeeked); sc.stop(); sc = s.play(dest); sc.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); trace("seek ! : percentSeeked: "+percentSeeked+" to: "+dest+" sc.position: "+sc.position+" s.length: "+s.length+" estimatedLength: "+estimatedLength); } private function progressHandler(event:ProgressEvent):void { square2.scaleX = event.bytesLoaded/event.bytesTotal*100; } private function spectrum(event:Event) { a = 0; graphics.clear(); SoundMixer.computeSpectrum(ba,true,0); for(var i=0; i < 256; i+=32){ a = ba.readFloat(); var num:Number = a*360; var tmp:Number = Math.round(num*100)/100; var newScale:Number = 0.4+tmp/200; if(enterFrameNum == 0){ TweenMax.killTweensOf(planes[i/32]); if(newScale > 1.8){ TweenMax.to(planes[i/32], 0.2, {scaleY:newScale-0.4, rotationX:newScale*180, ease:Elastic.easeOut}); if(i == 0){ diff = -1; } } else { if(i == 0){ diff = 1; } TweenMax.to(planes[i/32], 0.2, {scaleY:newScale, rotationX:0, ease:Linear.easeNone}); } if(i == 0){ TweenMax.killTweensOf(camera); TweenMax.to(camera, .2+newScale/10, {zoom:50+tmp/80, x:-300*newScale+400, ease:Linear.easeOut}); } } } } } }