In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: .mp3 player

i dont know if I really can use those musics.

...
@author Thi
v. 1.5

.mp3 Player
Get Adobe Flash player
by Thy 06 Sep 2010
/**
 * Copyright Thy ( http://wonderfl.net/user/Thy )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/fqNA
 */

// forked from Thy's .mp3 player
// i dont know if I really can use those musics.
package 
{
    import flash.geom.ColorTransform;
    import flash.geom.Rectangle;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.utils.ByteArray;
    import flash.display.Shape;
    import flash.filters.GlowFilter;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.TextField;
    import flash.display.BlendMode;
    import flash.geom.Matrix;
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    /**
     * ...
     * @author Thi
     * v. 1.5
     *     
     * .mp3 Player
     */
    public class Main extends Sprite 
    {
        private var // layer
        layer2:Sprite = new Sprite(), // background
        layer3:Sprite = new Sprite(); // buttons
        
        private var // player
        player:MusicPlayer;
        
        private var // temp
        i:int, sprite:Sprite, g:Graphics, p:Part,
        ba:ByteArray = new ByteArray,
        rect:Rectangle = new Rectangle(0,0,350,40),
        col:ColorTransform = new ColorTransform(1,1,1,.99),
        rand:Number = Math.random()*4 + 4;
        
        private var // display objcts
        txt:TextField = new TextField(),
        line:Shape = new Shape(), line2:Shape = new Shape(),
        data:BitmapData = new BitmapData(350,40,false,0xFFFFFF),
        bitmap:Bitmap = new Bitmap(data, "auto", true);
        
        private var // particles
        num:uint = 200,
        parts:Vector.<Part> = new Vector.<Part>(num, true),
        data2:BitmapData = new BitmapData(350,40,false, 0xFFFFFF),
        bitmap2:Bitmap = new Bitmap(data2, "auto", true);
        
        public function Main():void 
        {
            this.x = 57.5; this.y = 140 // for wonderfl print screen
            Wonderfl.capture_delay( 10 )
            // layers
            addChild(layer2); addChild(layer3);
            
            // player
            var links:Array = 
            [ 
"http://thymusic.webs.com/Entrosa8.swf",
"http://thymusic.webs.com/m/05%20Edward%20Maya%20Feat%20Vika%20Jigulina%20-%20Stereo%20Love.mp3",
"http://thymusic.webs.com/m/32%20Kelis%20-%204th%20Of%20july%20(Fireworks).mp3",
"http://thymusic.webs.com/m/01%20JLS%20-%20The%20Club%20Is%20Alive.mp3",
"http://thymusic.webs.com/m/19%20Skepta%20-%20Rescue%20Me.mp3",
"http://thymusic.webs.com/m/16%20The%20Pretty%20Reckless%20-%20Make%20Me%20Wanna%20Die.mp3",
"http://thymusic.webs.com/m/13%20David%20Guetta%20&%20Chris%20Willis%20Feat%20Fergie%20&%20Lmfao%20-%20Gettin%20Over%20You.mp3",
"http://thymusic.webs.com/m/35%20Pixie%20Lott%20-%20Turn%20It%20Up.mp3",
"http://thymusic.webs.com/m/06%20Eminem%20Feat%20Rihanna%20-%20Love%20The%20Way%20You%20Lie.mp3",
"http://thymusic.webs.com/m/07%203OH3%20Feat%20KeSha%20-%20My%20First%20Kiss.mp3",
 
"http://thethi.webs.com/Entrosa8.swf",
"http://thethi.webs.com/m/Im%20Not%20Alone_.mp3",
"http://thethi.webs.com/m/39%20Glee%20Cast%20-%20It's%20My%20Life-Confessions%20Pt.II.mp3",
"http://thethi.webs.com/m/36%20Snow%20Patrol%20Feat%20Martha%20Wainwright%20-%20Set%20The%20Fire%20To%20The%20Third%20Bar.mp3",
"http://thethi.webs.com/m/3%20Words_.mp3",
 
"http://thymusic.webs.com/EntrosaPlacebo6.swf",
"http://phoenix.vlcteam.free.fr/Son/Bourrier/02 - Helicopter.mp3",
"http://aolradio.podcast.aol.com/aolmusic/mp3s/Nirvana_AboutAGirl.mp3",
"http://dc206.4shared.com/img/244086766/257ba254/dlink__2Fdownload_2FcLb4WsLO_3Ftsid_3D20100717-173843-5322abed/preview.mp3",
 
"http://thethi.webs.com/Entrosa8.swf",
"http://thethi.webs.com/m/03%20Commandment.mp3"
            ]
            
            var nomes:Array = 
            [
true,
"Pop",
"Stereo Love - Edward Maya Feat Vika Jigulina",
"4th Of july (Fireworks) - Kelis",
"The Club Is Alive - JLS",
"Rescue Me - Skepta",
"Make Me Wanna Die - The Pretty Reckless",
"Gettin Over You - David Guetta & Chris Willis Feat Fergie & Lmfao",
"Turn It Up - Pixie Lott",
"Love The Way You Lie - Eminem Feat Rihanna",
"My First Kiss - 3OH3 Feat. KeSha",
            
true,
"Others",
"Im Not Alone - Calvin Harris",
"It's My Life-Confessions Pt.II - Glee Cast",
"Set The Fire To The Third Bar - Snow Patrol Feat Martha Wainwright",
"3 Words - Cheryl Cole",
            
true,
"Others",
"Helicopter - Bloc Party",
"About A Girl - Nirvana",
"It's My Life - Jon Bovi",
            
true,
"Jogos",
"Commandment - Kow Otani"
            ]
            // cretae the player (sends the 'this', and the links)
            player = new MusicPlayer( this, links, null, false)
            // now setup the 'nome' var (name of songs)
            player.nomes = nomes
            // now do function 'formatNomes', to build names index
            player.formarNomes()
            
            // graphics
            sprite = new Sprite();
            layer2.addChild(sprite)
            g = sprite.graphics
            var matrix:Matrix = new Matrix()
            matrix.createGradientBox(350,20,0,0,0)
            g.beginGradientFill("linear", [0x13294A, 0x6BCAF1], 
            [1,1], [0, 0xFF], matrix);
            g.drawRect(0,0,350,40)
            g.endFill();
            g.lineStyle(1,0)
            g.drawRect(0,0,350,40);
            g.moveTo(0,20);
            g.lineTo(350,20);
            sprite.cacheAsBitmap = true;
            
            // buttons
            sprite = new Sprite() // play
            layer3.addChild(sprite)
            g = sprite.graphics
            g.lineStyle(1, 0xFFFFFF); g.beginFill(0xFFFFFF); 
            g.lineTo(5, 2.5); g.lineTo(0, 5); g.lineTo(0, 0)
            g.endFill()
            sprite.scaleX = sprite.scaleY = 2
            sprite.x = 172; sprite.y = 24
            sprite.addEventListener(MouseEvent.CLICK, 
            function ():void { if (player._play) { player.pause() }
             else { player.play() }} )
            sprite.blendMode = BlendMode.OVERLAY;
            sprite = new Sprite() // next
            layer3.addChild(sprite)
            g = sprite.graphics
            g.lineStyle(1, 0xFFFFFF); g.beginFill(0xFFFFFF)
            g.lineTo(5, 2.5); g.lineTo(0, 5); g.lineTo(0, 0); 
            g.moveTo(4.5, 0); 
            g.lineTo(9, 2.5); g.lineTo(4.5, 5); g.lineTo(4.5, 0)
            g.endFill()
            sprite.scaleX = sprite.scaleY = 2
            sprite.x = 189; sprite.y = 24
            sprite.addEventListener(MouseEvent.CLICK, 
            function ():void {player.changeMusic(player.album, 
            player.track + 1)})
            sprite.blendMode = BlendMode.OVERLAY;
            sprite = new Sprite() // prev
            layer3.addChild(sprite)
            g = sprite.graphics
            g.lineStyle(1, 0xFFFFFF); g.beginFill(0xFFFFFF)
            g.lineTo(5, 2.5); g.lineTo(0, 5); g.lineTo(0, 0)
            g.moveTo(4.5, 0)
            g.lineTo(9, 2.5); g.lineTo(4.5, 5); g.lineTo(4.5, 0)
            g.endFill()
            sprite.scaleX = -2; sprite.scaleY = 2
            sprite.x = 164; sprite.y = 24
            sprite.addEventListener(MouseEvent.CLICK, 
            function ():void { player.changeMusic(player.album, 
            player.track - 1) } )
            sprite.blendMode = BlendMode.OVERLAY;
            // text sprite
            var format:TextFormat = new TextFormat("Tahoma", 12);
            txt.defaultTextFormat = format;
            txt.autoSize = TextFieldAutoSize.CENTER;
            txt.textColor = 0xFFFFFF
            layer3.addChild(txt);
            txt.text = "test";
            txt.filters = [new GlowFilter(0, 1, 2, 2, 10, 1)];
            txt.blendMode = BlendMode.OVERLAY;
            txt.x = 175 - txt.width/2;
            
            // the bitmap (color transform & particles)
            layer3.addChild(bitmap);
            bitmap.blendMode = BlendMode.OVERLAY;
            
            // spec & loading/playing progress bar
            layer3.addChild(line);
            layer3.addChild(line2);
            line.blendMode = BlendMode.OVERLAY;
            
            // create parts
            parts[0] = new Part(); // the first particle
            i = 0;
            while(++i < num)
            {
                p = new Part();
                p.x = Math.random() * 350;
                p.y = Math.random() * 40;
                parts[i] = parts[i-1].next = p;
            }
            layer3.addChild(bitmap2);
            bitmap2.blendMode = BlendMode.OVERLAY;

            // listener
            stage.addEventListener(Event.ENTER_FRAME, ef);
            
            // the player pause (less CPU usage)
            new SmartPause(stage, .5, 40).start()
            
            // start the player manually
            player.start();
        }
        
        private function ef(e:Event):void
        {
            // txt string
            txt.text = player.string;
            // spectrum
            if(player.id3Pego)
            {
                // gets spectrum
                player.objEntrosa.getByteArray()
                ba = player.objEntrosa.ba // copy byteArray
                //
                data.lock();
                data.draw(line) // copy line
                data.colorTransform(rect,col)
                data.unlock();
                // draw the line
                draw()
            }
            // particles
            particles();

        }
        
        private function draw():void
        {
            // lines drawing
            g = line2.graphics;
            g.clear()
            g.moveTo(0, 20)
            // redraw the 'playing' bar
            g.moveTo(player.playing * 350 ,20)
            g.lineStyle(2, 0xFFFFFF, .4)
            // redraw the loading bar
            g.lineTo(player.loading * 350 ,20)
            // redraw the spectrum
            g = line.graphics;
            g.clear();
            if(ba)
            {
                g.lineStyle(rand,0xC0C0C0, 1,true)
                g.moveTo(0,41)
                g.beginFill(0xC0C0C0)
                i = -1
                var expand:Number = 350 / 256 // line width / 256
                var height:Number = 41
                while(++i < 256) g.lineTo(i * expand, 
                41 - ba.readFloat() * height);
                g.lineTo(256,41)
                g.lineTo(0,41)
                g.endFill();
            }
        }
        
        private function particles():void
        {
                data2.lock();
                p = parts[0];
                while(p = p.next)
                {
                    data2.setPixel(p.x -= .5, --p.y , 0xFFFFFF);
                    if(p.x < 0) p.x += 350;
                    if(p.y < 0) p.y += 40;
                }
                data2.colorTransform(rect, col);
                data2.unlock();

            
        }



        
    }
}


class Part {public var x:Number=0, y:Number=0, next:Part=null;}

//package  
//{
    import flash.display.Stage
    import flash.events.Event;
    import flash.events.MouseEvent;
    /**
     * ...
     * @author Thi
     * v. 1.1
     */
    /*public*/ class SmartPause //extends Object
    {
        
        public var min:Number
        public var max:Number
        
        private var stage:Stage
        private var event:int = 0
        
        public function SmartPause(stage:Stage = null, a:Number = 0,b:Number = 40) 
        {
            this.stage = stage
            min = a
            max = b
            stage.frameRate = min
        }
        //
        public function start():void
        {
            event = 1
            stage.addEventListener(MouseEvent.MOUSE_MOVE, In)
        }
        
        public function stop():void
        {
            if (event == 1)
            {
                stage.removeEventListener(MouseEvent.MOUSE_MOVE, In)
            }
            if (event == 2)
            {
                stage.removeEventListener(Event.MOUSE_LEAVE, Out)
            }
            event = 0
        }
        //
        private function In(e:MouseEvent = null):void
        {
            event = 2
            stage.frameRate = max
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, In)
            stage.addEventListener(Event.MOUSE_LEAVE, Out)
        }
        
        private function Out(e:Event = null):void
        {
            event = 1
            stage.frameRate = min
            stage.addEventListener(MouseEvent.MOUSE_MOVE, In)
            stage.removeEventListener(Event.MOUSE_LEAVE, Out)
        }    
    }
//}


//package  
//{
    import flash.display.Graphics;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.ProgressEvent;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundTransform;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.utils.ByteArray;
    /**
     * ...
     * @author Thi
     */
    /*public*/ class MusicPlayer extends Sprite
    {
        // variáveis setup
        public var links:Array // os links
        public var nomes:Array // os nomes das músicas
        
        // as variáveis que poderão ser retornadas
        public var string:String // palavra que o 'texto' mostrará (status ou informações)
        public var loading:Number // carregamento das musicas à ser tocada, 0 ~ 1
        public var length:Number // a estimativa da duração total da música, em milisegundos
        public var playing:Number // a estimativa do tanto da música que já foi tocado, 0 ~ 1
        public var objEntrosa:Object // variável acessível do .fla, o Entrosa
        public var id3Pego:Boolean // variável acessível do .fla, pra ver se o ID3 foi carregado
        // quando o ID3 da música é carregado, pode-se dar play, pegar o ID3, pegar espectro
        
        private var st:Sprite
        
        private var i:int, j:int, k:int // temp int
        private var s:String // temp string
        
        public function MusicPlayer(st:Sprite = null, links:Array = null, nomes:Array = null, mouseStart:Boolean = true) 
        {
            // setup
            this.st = st
            this.links = links
            this.nomes = nomes
            //
            
            formarLinks()
            //
            somC.soundTransform = somT
            //
            
            if (mouseStart)
            {
                
                st.addEventListener(MouseEvent.MOUSE_MOVE, init);
            }
        }
        
        public function formarLinks():void
        {
            var links2:Array = []
            i = -1
            while (++i < links.length)
            {
                links2[i] = links[i].concat()
            }
            links = []
            //
            // organiza melhor a indexação dos links
            i = 0; k = -1
            j = links2.length
            while (i < j)
            {
                s = links2[i]
                if (s.charAt(s.length - 3) == "s" && s.charAt(s.length - 2) == "w" && s.charAt(s.length - 1) == "f")
                {
                    // adiciona um novo entrosa
                    links.push([s])
                    ++k
                } else
                {
                    // se tiver alguma coisa escrito
                    if (s != "")
                    {
                        // adiciona uma nova música
                        links[k].push(s)
                    }
                }
                ++i
            }
            links2 = null
            
        }
        
        public function formarNomes():void
        {            
            var nomes2:Array = []
            i = -1
            while (++i < nomes.length)
            {
                nomes2[i] = nomes[i]
            }
            nomes = []
            // organiza os nomes (ID3 pré-determinado)
            i = -1, k = -1, j = nomes2.length
            while (++i < j)
            {
                s = String(nomes2[i])
                if (s == "true")
                {
                    // adiciona uma nova categoria
                    nomes.push([String(nomes2[++i])])
                    ++k
                } else
                {
                    // se tiver alguma coisa escrito
                    if (s != "")
                    {
                        // adiciona uma nova música
                        nomes[k].push(s)
                    }
                }
            }
            
        }
        
        private function init(e:MouseEvent):void
        {
            st.removeEventListener(MouseEvent.MOUSE_MOVE, init)
            start()
            st = null
        }
        
        public function start():void
        {
            // a 1° musica
            link_entrosa = links[0][0]
            track = 1
            // faz o loader
            loader()
        }
        
        private var link_entrosa:String
        private var carregou:Boolean
        private var Entrosa:Loader
        private function loader():void
        {
            // carrega o Entrosa. É ele quem na verdade manda carregar as musicas
            string = "Carregando álbum"
            Entrosa = new Loader()
            Entrosa.load(new URLRequest(link_entrosa))
            //Entrosa.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loader_progress)
            Entrosa.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete)
        }
        
        
        private function loader_complete(e:Event):void
        {
            // novo entrosa carregado
            string = "Álbum carregado"
            Entrosa.contentLoaderInfo.removeEventListener(Event.COMPLETE, loader_complete)
            objEntrosa = Object(Entrosa.content)
            // carrega nova musica
            newMusic()
        }
        
        private var som:Sound // a var Som, só tem uma
        private var somC:SoundChannel = new SoundChannel() // channel, posso dar pause etc
        private var somT:SoundTransform = new SoundTransform() // posso mudar o volume
        public var track:int = 0 // o index da musica à ser tocada
        
        // em qual Entrosa está a musica que está sendo tocada
        public var album:int
        
        private function newMusic():void
        {
            // arruma algumas variáveis
            carregou = false
            position = 0 // posição do play
            id3Pego = false
            tentativas = 0 // número de tentativas pra pegar o ID3 da música
            
            // arruma a música à ser tocada. É complicado porquê pode-se ter vários entrosas
            // o que considerei por 'vários álbuns'
            if (track >= links[album].length)
            {
                ++album
                if (album >= links.length)
                {
                    album = 0
                }
                track = 1
                // álbum posterior, carrega-se o novo Entrosa
                link_entrosa = links[album][0]
                loader()
            } else if (track < 1)
            {
                --album
                if (album < 0)
                {
                    album = links.length-1
                }
                track = links[album].length-1
                // álbum anterior, carrega-se o novo Entrosa
                link_entrosa = links[album][0]
                loader()
            } else 
            {
                // se não precisou trocar de álbum, é porquê não precisa carregar o novo entrosa
                newMusic2() // então continua na criação da musica
            }
        }
        
        public function changeMusic(album:int = 0, track:int = 1):void
        {
            if ((this.track != track || this.album != album) && pode_apertar)
            {
                pode_apertar = false // será true qdo o ID3 ficar pronto
                this.removeEventListener(Event.ENTER_FRAME, ef)
                somC.stop() // para o som atual
                if (!carregou)
                {
                    // se o som não estiver 100% carregado, fecha o stream
                    som.close()
                }
                
                
                this.track = track
                if (this.album != album)
                {
                    this.album = album
                    link_entrosa = links[album][0]
                    loader()
                } else 
                {
                    newMusic()
                }
            }
        }
        
        private function newMusic2():void
        {
            // vê o link da musica mp3
            objEntrosa.link = links[album][track]
            objEntrosa.loadLink() // manda o entrosa carregar o link enviado
            
            // lá no Entrosa tem uma var som. O nosso som daqui será uma referência à ela
            som = null
            som = objEntrosa.som 
            
            // listeners
            som.addEventListener(Event.COMPLETE, Lcomp) // acabou de carregar musica
            som.addEventListener(ProgressEvent.PROGRESS, Lprog) // carregando musica
            this.addEventListener(Event.ENTER_FRAME, id3) // pegando o ID3 da musica
            string = "Carregando música"
        }
        
        private function Lcomp(e:Event):void
        {
            // música totalmente carregada
            som.removeEventListener(Event.COMPLETE, Lcomp)
            som.removeEventListener(ProgressEvent.PROGRESS, Lprog)
            carregou = true
            // vê o valor do loading da música. Pode-se acessar essa var pelo .fla
            loading = 1 // 1 = 100%
            length = som.length // length real
        }
        
        private function Lprog(e:ProgressEvent):void
        {
            // vê o valor do loading da música. Pode-se acessar essa var pelo .fla
            loading = e.bytesLoaded / e.bytesTotal // 0 ~ 1
            length = som.length / loading // em milisegundos
        }
        
        private var tentativas:int // tentativas pra pegar o ID3
        private function id3(e:Event = null):void
        {
            if (objEntrosa.id3Pronto && !id3Pego)
            {
                if(objEntrosa.id3)
                {
                    string = (objEntrosa.id3.songName == null ? "Música desconhecida" : objEntrosa.id3.songName) + " - "  + (objEntrosa.id3.artist == null ? "Artista desconhecido" : objEntrosa.id3.artist)
                } else 
                if (nomes != null)
                {
                    if (nomes[album][track] != undefined)
                    {
                        string = nomes[album][track]
                    } else
                    {
                        string = "Nome da Música e Artista Inacessíveis"
                    }
                } else
                {
                    string = "Nome da Música e Artista Inacessíveis"
                }
                if(string == "Música desconhecida - Artista desconhecido")
                {
                    string = "Música e Artista desconhecidos"
                }
                
                id3Pego = true
                
                if (_play)
                {
                    somC = som.play()
                }
                
                pode_apertar = true
                this.addEventListener(Event.ENTER_FRAME, ef)
                
                //remove o listener desta função
                this.removeEventListener(Event.ENTER_FRAME, id3)
            }  else if (loading > 3 && ++tentativas > stage.frameRate+2) 
            {
                // desiste de pegar o ID3, então finge-se que o pegou, para os processos continuarem
                objEntrosa.id3Pronto = true
            }
        }
        
        public var _play:Boolean // pode-se ver se está tocando ou não
        public var pode_apertar:Boolean
        
        public var position:Number = 0
        public function pause(pos:Boolean = true):void
        {
            if (_play && pode_apertar)
            {
                _play = false
                if (pos)
                {
                    position = somC.position // guarda a posição
                } else
                {
                    position = 0 // reseta a posição
                }
                somC.stop()
            } else if (!pos && pode_apertar)
            {
                position = 0
            }
        }
        
        public function play():void
        {
            if (!_play && pode_apertar)
            {
                _play = true
                somC = som.play(position) // dá play no som, dependendo da posição
            }
        }
        
        public function volume(volume:Number = 0):void
        {
            if (somT.volume != volume)
            {
                somT.volume = volume
                somC.soundTransform = somT
            }
        }
        
        private function ef(e:Event):void
        {
            if(_play)
            {
                // calcula aposição do 'playing' (0 ~ 1)
                playing = somC.position / length
                // se a música acabar, vai pra próxima
                if (playing >= .99)
                {
                    this.removeEventListener(Event.ENTER_FRAME, ef)
                    // vai pro 'next', como se tivesse clicado no botão
                    changeMusic(album, track + 1)
                }
            }
        }
        
    }

//}