forked from: forked from: forked from: forked from: spectrum - spiral

by ohisama
this code is originally written to be used as a music visualizer used with Sound.computeSpectrum()
♥0 | Line 157 | Modified 2013-02-03 10:01:59 | MIT License
play

ActionScript3 source code

/**
 * Copyright ohisama ( http://wonderfl.net/user/ohisama )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/f2xZ
 */

// forked from macrobin's forked from: forked from: forked from: spectrum - spiral
// forked from hellohello's forked from: forked from: spectrum - spiral
// forked from hacker_47ryxtat's forked from: spectrum - spiral
// forked from k__'s spectrum - spiral
/*
this code is originally written to be used as a music visualizer used with Sound.computeSpectrum()
*/
package 
{
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;
    import flash.geom.*;
    import flash.filters.*;
    public class Main extends Sprite
    {
        private var canvas : BitmapData;
        private var canvasRect : Rectangle;
        private var oPt : Point;
        private var cMtx : ColorMatrixFilter;
        private var blur : BlurFilter;
        private var shape : Shape;
        private var cx : Number, cy : Number;
        private var verts : Vector.<Number>;
        private var pVerts : Vector.<Number>;
        private var uvts : Vector.<Number>;
        private var pmtx : Matrix3D;
        private var pers : PerspectiveProjection;
        private var angles : Vector.<Number>;
        private var vPos : Vector.<Number>;
        private var levs : Vector.<Number>;
        private var xr : Number = 0, yr : Number = 0;
        private var cnt : uint = 0;
        private var waves : Array;
        private var numWaves : uint = 5;
        private const WAVE_HEIGHT : Number = 50;
        private const BASE_RADIUS : Number = 80;
        public function Main() 
        {
            angles = new Vector.<Number>();
            vPos = new Vector.<Number>();
            levs = new Vector.<Number>();
            var n : Number = 0;
            var freq : Number;
            for (var i : uint = 0; i < 3000; i ++) 
            {
                freq = 55 * Math.pow(2, i / 120);
                if (freq > n * 14080 / 163.5) 
                {
                    angles.push(Math.PI * 2  * i / 120); 
                    vPos.push(-(angles[n] * 6 - 265));
                    n ++;
                }
                if (n >= 256) 
                {
                    break;
                }
            }
            for (i = 0; i < 256; i ++) 
            {
                levs.push(0);
            }
            shape = new Shape();
            addChild(new Bitmap(canvas = new BitmapData(stage.stageWidth,stage.stageHeight,true,0xff000000)));
            canvasRect = canvas.rect;
            oPt = new Point(0, 0);
            cMtx = new ColorMatrixFilter([0.99, 0, 0, 0, 0, 0, 0.99, 0, 0, 0, 0, 0, 0.99, 0, 0, 0, 0, 0, 1, 0]);
            blur = new BlurFilter(2, 2);
            cx = stage.stageWidth / 2;
            cy = stage.stageHeight / 2;
            pVerts = new Vector.<Number>();
            pmtx = new Matrix3D();
            pers = new PerspectiveProjection();
             uvts = new Vector.<Number>();
            addEventListener(Event.ENTER_FRAME, h_enterFrame);
            initWaves();
        }
        private function initWaves() : void 
        {
            waves = new Array();
            for (var i : uint = 0; i < numWaves; i ++) 
            {
                waves.push(Math.random());
            }
        }
        private function h_enterFrame(evt : Event) : void 
        {
            var i : uint, j : uint;
            var lev : Number;
            verts = new Vector.<Number>;
            if (Math.random() < 0.01) 
            {
                initWaves();
            }
            for (i = 0; i < 256; i ++) 
            {
                lev = 0;
                for (j = 0; j < numWaves; j ++) 
                {
                    lev += Math.sin((cnt + i) * waves[j] / 10);
                }
                lev = lev / numWaves * (1 + i / 128);
                if (!levs[i]) 
                {
                    levs[i] = 0;
                }
                if (lev > levs[i]) 
                {
                    levs[i] = (lev + levs[i]) / 2;
                } 
                else 
                {
                    levs[i] *= 0.9;
                }
                verts.push(Math.cos(angles[i]) * (levs[i] * WAVE_HEIGHT + BASE_RADIUS));
                verts.push(vPos[i]);
                verts.push(Math.sin(angles[i]) * (levs[i] * WAVE_HEIGHT + BASE_RADIUS));
            }
            var gr : Graphics = shape.graphics;
            gr.clear();
            pers.fieldOfView = 100;
            pmtx.identity();
            yr -= Math.sin(cnt / 200);
            xr += 0.5;
            pmtx.appendRotation(xr, Vector3D.X_AXIS);
            pmtx.appendRotation(yr, Vector3D.Y_AXIS);
            pmtx.appendTranslation(0, 0, pers.focalLength);
            pmtx.append(pers.toMatrix3D());
            bugfix(pmtx);
            Utils3D.projectVectors(pmtx, verts, pVerts, uvts);
            cnt = (cnt + 1) % (256 * 10);
            for (i = 20; i < 254; i ++) 
            {
                var r : uint = (cnt + i) % 256;
                var g : uint = (cnt + i + 12) % 256;
                var b : uint = (cnt+ i + 32) % 256;
                gr.lineStyle(0,r << 16 | g << 8 | b);
                if (i == 20) 
                {
                    gr.moveTo(pVerts[i * 2] + cx, pVerts[i * 2 + 1] + cy);
                } 
                else 
                {
                    gr.curveTo(pVerts[i * 2] + cx, pVerts[i * 2 + 1] + cy, (pVerts[i * 2] + pVerts[i * 2 + 2]) / 2 + cx, (pVerts[i * 2 + 1] + pVerts[i * 2 + 3]) / 2 + cy);
                }
            }
            canvas.draw(shape, null, null, BlendMode.ADD);
            canvas.applyFilter(canvas,canvasRect,oPt,cMtx);
            canvas.applyFilter(canvas,canvasRect,oPt,blur);
        }
        private function bugfix(matrix : Matrix3D) : void 
        {
            var m1 : Matrix3D = new Matrix3D(Vector.<Number>([ 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 1, 0 ]));
            var m2 : Matrix3D = new Matrix3D(Vector.<Number>([ 0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 1,  0, 0, 0, 0 ]));
            m1.append(m2);
            if (m1.rawData[15] == 20) 
            {
                var rawData : Vector.<Number> = matrix.rawData;
                rawData[15] /= 20;
                matrix.rawData = rawData;
            }
        }
    }
}