/**
* Copyright insocium ( http://wonderfl.net/user/insocium )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1qPs
*/
/**
* Copyright Aksor.Al ( http://wonderfl.net/user/Aksor.Al )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/3fH5
*/
// forked from Thy's forked from: .mp3 player
// 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://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)
}
}
}
}
//}