forked from: soundtest16

by aobyrne forked from soundtest16 (diff: 103)
step or gap changed
time for tween changed
♥0 | Line 239 | Modified 2012-05-30 03:22:52 | MIT License
play

ActionScript3 source code

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

package 
{
    import caurina.transitions.properties.ColorShortcuts;
    import caurina.transitions.Tweener;
    import com.bit101.components.CheckBox;
    import com.bit101.components.HUISlider;
    import com.bit101.components.VBox;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.media.SoundMixer;
    import flash.text.TextField;
    import flash.utils.ByteArray;
    
    
    /**
     * ...
     * @author gaina
     */
    [SWF(width="465",height="465",frameRate="30")]
    public class SoundTest16Bis extends Sprite 
    {
        private var QTY:int = 8;
        
        private var _array:Array;
        private var _sp:Sprite;
        private var _sp_switch:Boolean = true;
        private var _line:Array;
        private var _line_switch:Boolean = true;
        private var _blend_swicth:Boolean = true;
        private var gapChkBx:CheckBox;
        private var _isGap:Boolean;
        private var gap:Number;
        private var tweenTime:HUISlider;
        private var thresholdFactor:Number;
        private var hasDrawn:Boolean;
        private var sprite:Sprite;
        
        public function SoundTest16Bis():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            stage.scaleMode = StageScaleMode.NO_SCALE;
            
            ColorShortcuts.init();
            
            _line = LineCircles();
            _array = Circles();
            
            var _sound:PlaySound = new PlaySound("http://www.takasumi-nagai.com/soundfiles/sound007.mp3");
            
            _sp = new Sprite();
            _sp.graphics.beginFill(0xFF0000);
            _sp.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            _sp.graphics.endFill();
            addChild(_sp);
            _sp.blendMode = "invert";
            _sp.addEventListener(MouseEvent.CLICK, BlendSwitch);
            addEventListener(Event.ENTER_FRAME, loop);
            var vbox:VBox = new VBox(this, 0, 0);
            tweenTime = new HUISlider(vbox, 0, 0, 'tween time');
            tweenTime.value = 0.5;
            tweenTime.maximum = 2;
            
            gapChkBx = new CheckBox(vbox, 0, 0, '64/128',onGap);
            gapChkBx.selected = isGap = false; gapChkBx.label = '128';
            //gapChkBx.selected =isGap = true;gapChkBx.label = '64';
            sprite = addChild(new Sprite) as Sprite;
            setChildIndex(sprite, 0);
        }
        
        private function onGap(e:Event):void 
        {
            isGap = CheckBox(e.target).selected;
            CheckBox(e.target).label = isGap?'64': '128';
            hasDrawn = false;
            while (sprite.numChildren) 
            {
                sprite.removeChildAt(sprite.numChildren - 1);
            }
            sprite.graphics.clear();
        }
        
        private function loop(e:Event):void 
        {
            var factor:Number =  0.40;
            var _byte:ByteArray = new ByteArray();
            SoundMixer.computeSpectrum(_byte, true, 0);
            
                var amount:int = 32;
                //4 per float, 4 floats per coordinate and 2 coordinates per loop
                var bytesReadPerLoop:int = 4 * 1 * 1;
                var bytesRead:int = bytesReadPerLoop * amount;
                for (var i:int = 0; i < QTY; i++) {
                 var ini:int =_byte.position = i * gap;
                //trace( "_byte.position : " + _byte.position );
                var p:Number = 0;
                var q:Number = 0;
                for (var j:int = 0; j < amount; j++) {
                    p += _byte.readFloat();
                    
                    if (i == 0) {
                        q = Math.max(0.3, p / 14);
                    }else {
                        q = Math.max(0.3, p / 4);
                    }
                    
                    if (i == 6 && p > thresholdFactor*3.5) {
                        SwitchColor();
                    }
                    if (i == 7 && p > thresholdFactor*3) {
                        VisibleSwicth();
                    }
                }
                var number:Number = QTY * bytesRead;
                trace( "number : " + number );
                //trace( "_byte.position : " + _byte.position );
                //trace( "----------------------------------- ");
                Tweener.addTween(_array[i] as Sprite, { scaleX:q, scaleY:q, time:tweenTime.value } );
                Tweener.addTween(_line[i] as Sprite, { scaleX:q, scaleY:q, time:tweenTime.value } );
                 if (!hasDrawn) {
                    var lineSize:Number = 110;
                    var g:Graphics = sprite.graphics;
                    g.lineStyle(0);
                    g.beginFill(0xffffff * Math.random(), 0.62);
                    var xx:Number = 10 + 50 * (i % 2);
                    var yy:Number = ini * factor;
                    var xxgap:Number = 4 * Math.random() - 8;
                    g.drawRect(xx + xxgap, yy + 2, 20 + Math.random() * 10 - 2 * xxgap, bytesRead * factor - 4);
                    trace( "bytesRead : " + bytesRead );
                    var textField:TextField = new TextField;
                    textField.text = i.toString();
                    textField.x = xx;
                    textField.y = yy;
                    textField.selectable = false;
                    sprite.addChild(textField);
                    g.lineStyle(2);
                    g.endFill();
                    g.moveTo(0, yy);
                    g.lineTo(lineSize, yy);
                    trace( "_byte.position : " + _byte.position );
                    trace( "range : " + (_byte.position -ini));
                    var number1:Number = 16 * 32;
                    g.lineStyle(NaN)
                    g.beginFill(0);
                    g.drawRect(lineSize, 0, 10, 1024 * factor);
                    g.endFill();
                }
            }
            hasDrawn = true;
           //removeEventListener(Event.ENTER_FRAME, loop);
        }
        
        private function SwitchColor():void
        {
            if (_sp_switch) {
                Tweener.addTween(_sp, {_color:0x000000 } );
                _sp_switch = false;
            } else {
                Tweener.addTween(_sp, {_color:Math.random()*0xFFFFFF } );
                _sp_switch = true;
            }
        }
        
        private function VisibleSwicth():void
        {
            if (_line_switch) {
                for (var i:int = 0; i < QTY; i++) {
                    _array[i].visible = false;
                    _line[i].visible = true;
                }
                _line_switch = false;
            } else {
                for (var j:int = 0; j < QTY; j++) {
                    _array[j].visible = true;
                    _line[j].visible = false;
                }
                _line_switch = true;
            }
        }
        
        private function BlendSwitch(e:MouseEvent):void 
        {
            if (_blend_swicth) {
                _sp.blendMode = "screen";
                _blend_swicth = false;
            } else {
                _sp.blendMode = "invert";
                _blend_swicth = true;
            }
        }
        
        
        private function Circles():Array
        {
            var _arr:Array = [];
            for (var i:int = 0; i < QTY; i++)
            {
                var _radius:Number = 465 - 465 / QTY * i;
                var _circle:Sprite = new Sprite();
                _circle.graphics.beginFill(0);
                _circle.graphics.lineStyle(2, 0xFFFFFF);
                _circle.graphics.drawCircle(0, 0, _radius);
                _circle.graphics.endFill();
                _circle.x = stage.stageWidth / 2;
                _circle.y = stage.stageHeight / 2;
                addChild(_circle);
                _arr.push(_circle);
            }
            return _arr;
        }
        
        private function LineCircles():Array
        {
            var _arr:Array = [];
            for (var i:int = 0; i < QTY; i++)
            {
                var _radius:Number = 465 - 465 / QTY * i;
                var _circle:Sprite = new Sprite();
                _circle.graphics.lineStyle(2, 0);
                _circle.graphics.drawCircle(0, 0, _radius);
                _circle.graphics.endFill();
                _circle.x = stage.stageWidth / 2;
                _circle.y = stage.stageHeight / 2;
                addChild(_circle);
                _arr.push(_circle);
            }
            return _arr;
        }
        
        public function get isGap():Boolean 
        {
            return _isGap;
        }
        
        public function set isGap(value:Boolean):void 
        {
            gap = value?64:128;
            thresholdFactor = value?1:0.1;
            tweenTime.value = value?1:2;
            _isGap = value;
        }
        
    }
    
}

import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundLoaderContext;
import flash.media.SoundTransform;
import flash.net.URLRequest;

class PlaySound
{
    private var sound:Sound;

        public function PlaySound(url:String)
        {
            sound = new Sound();
            var _context:SoundLoaderContext = new SoundLoaderContext(1000, true);
            sound.addEventListener(Event.COMPLETE, SoundLoadeComplete);
            sound.load(new URLRequest(url), _context);
        }
        
        private function SoundLoadeComplete(e:Event):void 
        {
            sound.play(0, 10, new SoundTransform(0.3, 0));
        }
}