Source Files

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
