K

by spanvega
♥1 | Line 115 | Modified 2017-03-29 10:36:52 | MIT License
play

ActionScript3 source code

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

package
{
    import flash.geom.*;
    import flash.media.*;
    import flash.display.*;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.utils.setTimeout;

    /* @author SPANVEGA // CHRISTIAN */

    public class K extends Sprite
    {
        private var c : ColorTransform = new ColorTransform (1, 1, 1, 0.5);

        private var m : Matrix3D = new Matrix3D (),
                    v : Vector.<Number>, p : Vector.<Number>;

        private var w : uint = 465, h : uint = 465,
                    cx : Number = w >> 1, cy : Number = h >> 1,
                    b : BitmapData = new BitmapData (w, h, true, 0);

        private var n : int = 90000,

                    scale : int = 70,

                    _a : Number = -1.1,
                    _b : Number = -2.4,
                    _c : Number =  0.5,
                    _d : Number =  1.0;

        private var playing : Boolean = false,
                    channel : SoundChannel,
                    sound : Sound;
        
        private var smoothLeft  : Smoothsteps = new Smoothsteps (5),
                    smoothRight : Smoothsteps = new Smoothsteps (5);

        // https://developers.soundcloud.com/docs/api/reference
        private var CLIENT_ID : String = 'c644fa92a0e751bad397bdd5b8e35ae5',
                     TRACK_ID : Number = 185881845;

        public function K () { addEventListener (Event.ADDED_TO_STAGE, init); }
        
        private function init (e : Event) : void
        {
            removeEventListener (Event.ADDED_TO_STAGE, init);

            with (stage) { scaleMode = 'noScale'; frameRate = 60; color = 0; }

            graphics.beginFill (0, 1);
            graphics.drawRect  (0, 0, w, h);

            addChild (new Bitmap (b));

            //

            m.prependTranslation (cx, cy, 0);

            v = new Vector.<Number>(n, true);
            p = new Vector.<Number>(n, true);

            plot ();

            //

            sound = new Sound ();
            sound.load (new URLRequest ('https://api.soundcloud.com/tracks/' + TRACK_ID + '/stream?client_id=' + CLIENT_ID));
            
            setTimeout (start, 3000);

            addEventListener (Event.ENTER_FRAME, render);
        }

        private function start () : void
        {
            channel = sound.play (0, int.MAX_VALUE);

            playing = true;
        }

        private function render (e : Event = null) : void
        {
            if (playing)
            {
                _c =  smoothLeft.push (channel.leftPeak  * 2);
                _d = smoothRight.push (channel.rightPeak * 2);

                plot ();
            }

            //

            m.prependRotation (1, Vector3D.X_AXIS);
            m.prependRotation (1, Vector3D.Y_AXIS);

            m.transformVectors (v, p);

            //

            b.lock();
            b.colorTransform (b.rect, c);

            var d : Number, j : Number, k : Number;

            for (var i : int = 0; i < n; i += 3)
            {
                j = cx - p [i]; k = cy - p [i+1];

                d = Math.sqrt (j * j + k * k);

                if (d > 0xFF) d = 0xFF;

                b.setPixel32 (p [i], p [i+1], 0xFF << 24 | 0xFF << 16 | (0xFF - d)  << 8);
            }

            b.unlock();
        }

        // http://softology.com.au/tutorials/attractors2d/tutorial.htm

        private function plot () : void
        {
            var _x : Number = 1, _y : Number = 1, _z : Number;
            var nx : Number,     ny : Number,     nz : Number;

            for (var i : int = 0; i < n; i += 3)
            {
                nx = Math.sin (_y * _b) + _c * Math.sin (_x * _b);
                ny = Math.sin (_x * _a) + _d * Math.sin (_y * _a);
                nz = _x * _y;

                v [i]     = (_x = nx) * scale;
                v [i + 1] = (_y = ny) * scale;
                v [i + 2] = (_z = nz) * scale;
            }
        }
    }
}

class Smoothsteps
{
    public var previous : Number, current : Number = 0;

    private var values : Vector.<Number>;

    private var iterator : int = 0;

    private var steps : int;


    public function Smoothsteps (steps : int) : void
    {
        values = new Vector.<Number> (steps, true);

        this.steps = steps;
    }

    public function push (value : Number) : Number
    {
        values [iterator++ % steps] = value;

        var sum : Number = 0,

            tmp : int = iterator < steps ? iterator : steps;

        for (var i : int = 0; i < tmp; i++)
        {
            sum += values [i];
        }

        previous = current;

        current = sum / tmp;

        return current;
    }
}