flash on 2010-10-20

by kappa-lab
...
@author gk
♥0 | Line 492 | Modified 2010-10-20 23:37:35 | MIT License
play

ActionScript3 source code

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

package 
{
    import caurina.transitions.Tweener;
    import com.bit101.components.*;
    import flash.display.*;
    import flash.events.*;
    import flash.media.*;
    import flash.utils.ByteArray;
    /**
     * ...
     * @author gk
     */
    public class Main2 extends Sprite
    {
        private var _mic:Microphone;
        private var _cam:Camera;
        private var _vid:Video;
        private var _g:Graphics;
        private var _recorders:Vector.<RecUnit>;
        private var _vjCnt:Sprite
        public function Main2() 
        {
            if (stage) init();
            addEventListener(Event.ADDED_TO_STAGE,init)
        }
        
        private function init(e:Event=null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            stage.scaleMode = "noScale";
            stage.align = "topLeft";
            
            _mic = Microphone.getMicrophone();
            _mic.rate = 44;
            _mic.setSilenceLevel(0);
            _cam = Camera.getCamera();
            
            _vid = new Video(_cam.width, _cam.height);
            _vid.attachCamera(_cam);
            addChild(_vid);
            
            _recorders = new Vector.<RecUnit>();
            
            logger = new Text(this, 600);
            
            _cam.addEventListener(ActivityEvent.ACTIVITY, onActivity);
        }
        
        private function onActivity(e:ActivityEvent):void 
        {
            log(e);
            _cam.removeEventListener(ActivityEvent.ACTIVITY, onActivity);
            Tweener.addCaller(this, { time:1, count:1, onComplete:startRecordUnits } ); 
        }
        private function startRecordUnits():void
        {
            var scale:Number = 1
            var ru:RecUnit = new RecUnit();
            _recorders.push(ru)
            ru.addEventListener(Event.COMPLETE, onRecorded)
            ru.record(_mic, _vid);
            var count:int = _recorders.length;
            ru.scaleX = ru.scaleY = scale;
            addChild(ru).y = 300 + (_vid.height * scale + 10) * (count - 1);
            
        }
        
        private function onRecorded(e:Event):void 
        {
            //RecUnit(e.target).playImage(true);
            //RecUnit(e.target).playSound();
            if (_recorders.length <= 2) {
                startRecordUnits();
            }else {
                _vjCnt = addChild(new Sprite()) as Sprite;
                _vjCnt.x = 200;
                _vjCnt.scaleX = _vjCnt.scaleY = 2;
                master = new Master(_recorders)
                master.initVJ(_vjCnt);
                master.play()
            }
        }
        
        
    }
}
import caurina.transitions.Tweener;
import com.bit101.components.Text;
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.net.URLRequest;
import flash.utils.ByteArray;
internal var logger:Text
internal function log(...arg):void
{
    var str:String=""
    for each(var p:* in arg) str += p.toString() + ", "
    logger.text = str
}

class RecUnit extends Sprite 
{
    private var _mic:Microphone;
    private var _vid:Video;
    public var original:Vector.<Number>;
    public var detects:Vector.<Vector.<Number>>;
    public var imageQue:Vector.<Vector.<int>>;
    public var compless:Vector.<Number>;
    public var strech:Vector.<Number>;
    public var reverse:Vector.<Number>;
    
    public var images:Vector.<DisplayObject>;
    
    public var imgCnt:Sprite;
    public var scope:Shape;
    
    private static var _totalRec:int = 0;
    private var _id:int;
    private var _indexImage:int;
    private var _totalImage:int;
    private var _lastImage:DisplayObject;
    private var _g:Graphics;
    private var _loopImage:Boolean;
    private var _loopSound:Boolean;
    
    public const REC_DURATION:Number = 3;
    private var _endImage:int;
    private var _startImage:int;
    
    public function RecUnit()
    {
        _id = _totalRec;
        _totalRec++;
        _indexImage = 0;
        imgCnt = addChild(new Sprite()) as Sprite;
        scope = addChild(new Shape()) as Shape;
        scope.scaleX = .005;
        _g = scope.graphics;
        _g.lineStyle(1, 0xFF0000);
        _g.lineTo(REC_DURATION*44100,0)
        _g.lineStyle(1, 0);
        _g.moveTo(0, 0);
    }
    
    public function record(mic:Microphone, vid:Video):void
    {
        _mic = mic;
        _vid = vid;
        log("REC START:" + _id);
        
        original = new Vector.<Number>();
        detects = new Vector.<Vector.<Number>>();
        imageQue = new Vector.<Vector.<int>>();
        compless = new Vector.<Number>();
        strech = new Vector.<Number>();
        
        images = new Vector.<DisplayObject>();
        
        mic.addEventListener(SampleDataEvent.SAMPLE_DATA, recSound);
        vid.addEventListener(Event.EXIT_FRAME, recImage);
        scope.x = vid.width;
        scope.y = vid.height * .5;
        
    }
    
    private function recordComplete():void
    {
        //reverse = original.slice(0, len - 1).reverse();
        //reverse.fixed  = true;
        compless.fixed = true;

        analizeSound()
        _totalImage = images.length;
        log("REC FINISH:" + _id);
        dispatchEvent(new Event(Event.COMPLETE));
    }
    
    
    public function playSound(loop:Boolean=false):void
    {
        var s:Sound = new Sound();
        s.addEventListener(SampleDataEvent.SAMPLE_DATA, writeData);
        var i:int = 0;
        var sampleLegth:int = original.length;
        var len:int = 0;
        function writeData(se:SampleDataEvent):void {
            len += 8192;
            if (len >= sampleLegth) {
                len = sampleLegth;
                if (!_loopSound) {
                    s.removeEventListener(SampleDataEvent.SAMPLE_DATA, writeData)
                }else {
                        
                }
            }
            for (i; i < len; i++){
                var smp:Number = original[i];
                se.data.writeFloat(smp);
                se.data.writeFloat(smp);
            }
        }        
        s.play();
    }
    public function stopSound():void
    {
        
    }
    
    
    public function hideAll():void
    {
        for each(var img:DisplayObject in images) img.visible = false;
    }
    
    public function playImage(loop:Boolean=false):void
    {
        hideAll();
        _lastImage = images[_indexImage];
        _loopImage = loop
        addEventListener(Event.ENTER_FRAME,onPlayImage)
    }
    
    private function onPlayImage(e:Event):void 
    {
        _lastImage.visible = false;
        images[_indexImage].visible = true;
        _lastImage = images[_indexImage];
        _indexImage = (++_indexImage) % _totalImage;
        if (_indexImage >= _totalImage-1 && !_loopImage) stop();
    }
    
    public function playImageByRage(start:int, end:int):void
    {
        _startImage = _indexImage = start;
        _endImage = end;
        hideAll();
        _lastImage = images[_indexImage];
        
        addEventListener(Event.ENTER_FRAME,onPlayImageByRage)
    }
    
    private function onPlayImageByRage(e:Event):void 
    {
        _lastImage.visible = false;
        images[_indexImage].visible = true;
        _lastImage = images[_indexImage];
        _indexImage++;
        if (_indexImage >= _endImage )stop();
    }

    public function playDetects(index:int):void
    {
        master.addVoice(detects[index]);
        //playImage();
        playImageByRage(imageQue[index][0], imageQue[index][1]);
    }
    
    public function stop():void
    {
        removeEventListener(Event.ENTER_FRAME, onPlayImage);
        removeEventListener(Event.ENTER_FRAME, onPlayImageByRage);
    }
    
    private function recImage(e:Event):void 
    {
        var v:Video = e.target as Video
        var bmd:BitmapData = new BitmapData(v.width, v.height, true, 0);
        bmd.draw(v)
        var bm:Bitmap = new Bitmap(bmd);
        images.push(bm);
        imgCnt.addChild(bm);
    }
    
    private function recSound(e:SampleDataEvent):void 
    {
        var len:int = e.data.length/4;
        var i:int;
        var offset:int = original.length;
        for (i = 0; i < len ; i++) {
            
            var smp:Number = e.data.readFloat()
            original.push(smp);
            if (i % 2 == 0) compless.push(smp);

            _g.lineTo((offset + i), smp * 30);
        }
        
        if(offset+i > REC_DURATION*44100){
            _mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, recSound);
            _vid.removeEventListener(Event.EXIT_FRAME, recImage);
            recordComplete();
        }
    }
    
    private function analizeSound():void
    {
        //_g.lineStyle(NaN);

        var len:int = original.length;
        var pre:Number = 0;
        var p1:int = 0;
        var p2:int = 0;
        var thresh:Number = 0.03;
        var d:Vector.<Number>;
        var img:Vector.<int>;
        var c:int = 0;
        var i:int = 0;
        for (i; i < len; i++) 
        {
            var smp:Number = original[i];

            strech.push((smp - pre) * .5 + pre);
            strech.push(smp);
            pre = smp;
            

            if (p1 == 0 && (smp > thresh || smp < -thresh)) {
                p1 = i;
                d = new Vector.<Number>(); 
                img = new Vector.<int>();
                img.push(int(i / len * images.length));
            }else if(p1 > 0 && p2==0 && (smp < thresh || smp > -thresh)){
                p2 = i;
            }else if(p2 > 0 && (smp > thresh || smp < -thresh)){
                p2 = 0;
            }else if (p2 > 0 && i - p2 > 1000) {
                if(i-p1 > 2000)    close();
                p1 = p2 = 0;
            }else if (p1>0 && i - p1 > 10000) {
                p2 = i;
                close();
                p1 = p2 = 0;
            }
            
            if (d) d.push(smp);
        }
        
        function close():void
        {
            _g.beginFill(0xFF0000, .5);
            _g.drawRect(p1, -30, p2-p1, 60);
            _g.endFill()
            img.push(int(i / len * images.length));
            imageQue.push(img)
            detects.push(d);
            c++;
        }
        
        if (p1 > 0) {
            p2 = len - 1;
            close();
        }
        if (c == 0) {
            p1 = 0;
            p2 = i = 3000;
            d = original.slice(0,i); 
            img = new Vector.<int>();
            img.push(int(p1));
            close()
        }
        trace("c",c)
    }

    
    
    
    public function get id():int { return _id; }
}

internal var master:Master;
class Master
{
    public var latency:int = 8000;
    private var _position:int;
    private var _sound:Sound;
    private var _stack:Vector.<Vector.<Number>>;
    private var _callback:Function;
    private var _units:Vector.<RecUnit>;
    private var _voice:Vector.<Vector.<Number>>;
    private var _count:int;
    private var _loop:int;
    private var _metro:Vector.<Number>;
    private var _metro2:Vector.<Number>;
    private var _score:Array;
    
    public function Master(units:Vector.<RecUnit>,callback:Function=null)
    {
        _count = 0;
        _units = units;
        
        _callback = callback;
        _metro = new Vector.<Number>();
        _metro2 = new Vector.<Number>();
        for (var i:int = 0; i < 1000; i++) {
            _metro.push(Math.sin(i * .5)*.01);
            _metro2.push(Math.sin(i * .2)*.01);
        }
        
        _stack = new Vector.<Vector.<Number>>();
        _sound = new Sound();
        _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
        
        makeScore();
    }
    public function play():void
    {
        _sound.play();
    }
    
    public function initVJ(container:DisplayObjectContainer):void
    {
        for each(var u:RecUnit in _units) 
        {
            container.addChild(u.imgCnt)
            u.imgCnt.visible
        }
    }
    
    public function makeScore():void
    {
        trace("makescore")
        _score =
        [
            [[15, .3, .4]],
            [[3, .3, .4]],
            [[2, .3, .4]],
            [[1, .3, .4]],
            [[5, .3, .4]],
            [[8, .3, .4]],
            [[10, .3, .4]],
            [[12, .3, .4]],
            [[15, .3, .4]],
            [[11, .3, .4]],
            [[9, .3, .4]],
            [[7, .3, .4]],
            [[6, .3, .4]],
            [[18, .3, .4]],
            [[19, .3, .4]],
            [[13, .3, .4]]
        ];
        //return
        _score = [];
        for (var i:int = 0; i < 16; i++) 
        {
            _score[i] = [];
            for (var i2:int = 0; i2 < 3; i2++) 
            {
                if (Math.random() > .4) {
                    var unit:int = Math.random() * _units.length
                    var detect:int = Math.random() * _units[unit].detects.length;
                    _score[i].push([unit, detect])
                }
            }
            trace(i,_score[i]);
        }        
    }
    
    public function addVoice(v:Vector.<Number>):Number
    {
        return _stack.push(v.slice(0,v.length-1).reverse());
    }
    
    private function onSampleData(e:SampleDataEvent):void 
    {
        nextQue();
        
        var len:int = _stack.length;
        var i2:int = 0
        for (var i:int = 0; i < latency; i++) 
        {
            var smp:Number = 0;
            
            for (i2 = 0; i2 < len; i2++) 
            {
                var v:Vector.<Number> = _stack[i2];
                if(v.length>0)smp += v.pop()
            }
            
            e.data.writeFloat(smp);
            e.data.writeFloat(smp);
        }
        
        var v2:Vector.<Vector.<Number>> = new Vector.<Vector.<Number>>()
        for (i2 = 0; i2 < len; i2++) 
        {
            v = _stack[i2];
            if (v.length > 0)v2.push(v)
        }
        _stack = v2;
        
        _count++;
        _loop++;
        if (_loop >= 16 * 11) {
            _loop = 0;
            makeScore();
        }
    }
    
    private function nextQue():void
    {
        if (_count % 8 == 0) {
            addVoice(_metro);
        }
        if (_count % 32 == 0) {
            addVoice(_metro2);
        }
        if (_loop < 32 && _count % 8 != 0) return;
        if (_loop < 64 && _count % 4 != 0) return;
        if (_loop < 128 && _count % 2 != 0) return;
        var ary:Array = _score[_count % 16];
        for each(var p:Array in ary) {
            var unit:int   = p[0];
            var detect:int = p[1];
            _units[unit].playDetects(detect);
        }
        
        if (ary.length != 0) {
            for each(var r:RecUnit in _units) {
                r.imgCnt.visible = false;
            }
        }
        
        if (ary.length == 1) {
            _units[ary[0][0]].imgCnt.visible = true;
            _units[ary[0][0]].imgCnt.scaleX = 1;
            _units[ary[0][0]].imgCnt.x = 0;
        }else if (ary.length == 2) {
            _units[ary[0][0]].imgCnt.visible = true;
            _units[ary[0][0]].imgCnt.scaleX = .5;
            _units[ary[0][0]].imgCnt.x = 0;
            _units[ary[1][0]].imgCnt.visible = true;
            _units[ary[1][0]].imgCnt.scaleX = .5;
            _units[ary[1][0]].imgCnt.x = _units[ary[1][0]].imgCnt.width;
        }else  if (ary.length == 3) {
            _units[ary[0][0]].imgCnt.visible = true;
            _units[ary[0][0]].imgCnt.scaleX = .33;
            _units[ary[0][0]].imgCnt.x = 0;
            _units[ary[1][0]].imgCnt.visible = true;
            _units[ary[1][0]].imgCnt.scaleX = .33;
            _units[ary[1][0]].imgCnt.x = _units[ary[1][0]].imgCnt.width;
            _units[ary[2][0]].imgCnt.visible = true;
            _units[ary[2][0]].imgCnt.scaleX = .33;
            _units[ary[2][0]].imgCnt.x = _units[ary[2][0]].imgCnt.width;
        }
        
    }
    private function nextQue2():void
    {
        if (_count % 4 == 0) {
            addVoice(_metro);
        }
        if (_count % 16 == 0) {
            addVoice(_metro2);
        }
        //if (_count % 10 == 0) addVoice(_units[2].original.slice(0,200));
        var r:Number
        if (_count % 8 == 0) {
            r = Math.random()
            if(r<.2)addVoice(_units[0].compless)
            else if(r<.4)addVoice(_units[1].compless)
            else if(r<.6)addVoice(_units[2].compless)
            else if(r<.8)addVoice(_units[3].compless)
            else if (r < 1) addVoice(_units[4].compless);
            
            //addVoice(_voice[int(Math.random()*_voice.length)]);
        }
        if (_count % 16 == 15) {
            r = Math.random()
            if(r<.2)addVoice(_units[0].original)
            else if(r<.4)addVoice(_units[1].original)
            else if(r<.6)addVoice(_units[2].original)
            else if(r<.8)addVoice(_units[3].original)
            else if (r < 1) addVoice(_units[4].original);
            
            //addVoice(_voice[int(Math.random()*_voice.length)]);
        }
        //if (_count % 40 == 10) addVoice(_units[3].strech);
        //if (_count % 40 == 20) addVoice(_units[3].compless);
        if (_count % 40 == 24) addVoice(_units[3].strech);
        //if (_count % 20 == 19) addVoice(_units[4].reverse);
        //if (_count % 20 == 0) addVoice(_units[0].original);
    }
    
    
    
}