• home
  • forum
  • my
  • kt
  • download
  • home / 2D Graphics / Flash / 3D

    Create a AS3 MP3 Player with papervision3d spectrum display

    Author: 2008-12-30 15:34:25 From:

    Source Files

    Create a AS3 MP3 Player with papervision3d spectrum display

    Full code with comments

    // Import Papervision3D
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    
    // constants
    const CHANNELS_PER_DIRECTION:int= 256;
    const CUBES_PER_CHANNEL:int		= 8;
    const CHANNEL_STEPS:int			= Math.floor(CHANNELS_PER_DIRECTION / CUBES_PER_CHANNEL);
    
    // papervision vars
    var viewport:Viewport3D;
    var scene:Scene3D;
    var camera:Camera3D;
    var cube:Cube;
    var renderer:BasicRenderEngine;
    
    // arrays holding references to cubes for each channel
    var cubesLeftChannel:Array		= new Array();
    var cubesRightChannel:Array		= new Array();
    // animation flag
    var bolAnimationForward:Boolean = true;
    
    // sound vars
    var sndObject:Sound				= new Sound();
    var reqObject:URLRequest 		= new URLRequest("so-deep.ram2000.mp3");
    var sndBytes:ByteArray			= new ByteArray();
    
    // INIT
    function init():void {
    	init3D();
    	initSound();
    	// add event listener for render loop
    	addEventListener(Event.ENTER_FRAME, renderLoop);
    }
    
    // init3d
    function init3D():void {
    	// Create viewport
    	viewport = new Viewport3D(0, 0, true);
    	// add viewport to stage
    	addChild(viewport);
    
    	// create basic render engine
    	renderer = new BasicRenderEngine();
    
    	// Create scene
    	scene = new Scene3D();
    
    	// blue cube material
    	var blueMaterial:MaterialsList = new MaterialsList(
    		{
    			front:  new ColorMaterial(0x0066FF),
    			back:   new ColorMaterial(0x0066FF),
    			right:  new ColorMaterial(0x0046B0),
    			left:   new ColorMaterial(0x0046B0),
    			top:    new ColorMaterial(0x1171FF),
    			bottom: new ColorMaterial(0x1171FF)
    		}
    	);
    
    	// green cube material
    	var greenMaterial:MaterialsList = new MaterialsList(
    		{
    			front:  new ColorMaterial(0x00CC00),
    			back:   new ColorMaterial(0x00CC00),
    			right:  new ColorMaterial(0x009F00),
    			left:   new ColorMaterial(0x009F00),
    			top:    new ColorMaterial(0x00CC00),
    			bottom: new ColorMaterial(0x00CC00)
    		}
    	);
    
    	// create cubes for left channel
    	for(var i = 0; i < CUBES_PER_CHANNEL; i++) {
    		cube = new Cube(blueMaterial, 12, 50, 400);
    		cube.x = i * 50;
    		cubesLeftChannel.push(cube);
    		scene.addChild(cube);
    	}
    	//create cubes for the right channel
    	for(i = 0; i < CUBES_PER_CHANNEL; i++) {
    		cube = new Cube(greenMaterial, 12, 50);
    		cube.x = (i * 50) + 25;
    		cubesRightChannel.push(cube);
    		scene.addChild(cube);
    	}
    
    	// create camera
    	camera = new Camera3D();
    	// set camera zoom
    	camera.zoom = 11;
    	// set cube in the center as camera target
    	camera.target = cubesRightChannel[CUBES_PER_CHANNEL / 2 - 1] as Cube;
    	// camera start position
    	camera.x -= 400;
    	camera.y += 300;
    }
    
    function initSound():void {
    	// load mp3 file and play it
    	sndObject.load(reqObject);
    	sndObject.play();
    }
    
    // render loop function
    function renderLoop(e:Event):void
    {
    	// compute spectrum and put result in byte array
    	SoundMixer.computeSpectrum(sndBytes);
    
    	//
    	// LEFT CHANNEL CUBES
    	for(var i = 0; i < CUBES_PER_CHANNEL; i++) {
    		var myCube:Cube = cubesLeftChannel[i] as Cube;
    		// get the right positions for the byte array
    		sndBytes.position = CHANNEL_STEPS * 4 * i;
    		// resize current cube
    		myCube.scaleY =  sndBytes.readFloat();
    	}
    	//
    	// RIGHT CHANNEL CUBES
    	for(i = 0; i < CUBES_PER_CHANNEL; i++) {
    		myCube = cubesRightChannel[i] as Cube;
    		// get the right positions for the byte array
    		sndBytes.position = 1024 + (CHANNEL_STEPS * 4 * i);
    		// resize current cube
    		myCube.scaleY = sndBytes.readFloat();
    	}
    
    	// swing camera
    	if(bolAnimationForward) {
    		camera.x += 4;
    		if(camera.x > 800)
    			bolAnimationForward = false;
    	} else {
    		camera.x -= 4;
    		if(camera.x < -400)
    			bolAnimationForward = true;
    	}
    
    	// render current scene
    	renderer.renderScene(scene, camera, viewport);
    }
    
    init();
    

    discuss this topic to forum

    relation tutorial

    No information

    Category

      3D (29)
      Math Physics (16)
      3rd Party (7)
      Navigation (63)
      Actionscripting (158)
      Optimization (17)
      Animation (108)
      Projector (11)
      Audio (52)
      Special Effects (152)
      Backend (26)
      Text Effects (82)
      Drawing (32)
      Tips and Techniques (47)
      Dynamic Content (31)
      Tricks (8)
      Games (97)
      Utilities (21)
      Getting Started (91)
      Video (24)
      Interactivity (43)
      Web Design (29)

    New

    Hot