Section 1
//abot_audio_1 (abotdance_fla.abot_audio_1)
package abotdance_fla {
import flash.display.*;
public dynamic class abot_audio_1 extends MovieClip {
public var midL:MovieClip;
public var midR:MovieClip;
public var tweeterL:MovieClip;
public var tweeterR:MovieClip;
public var bassR:MovieClip;
public var screen:MovieClip;
public var bassL:MovieClip;
}
}//package abotdance_fla
Section 2
//abot_audiobasspeaker1_21 (abotdance_fla.abot_audiobasspeaker1_21)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class abot_audiobasspeaker1_21 extends MovieClip {
public function abot_audiobasspeaker1_21(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 3
//abot_audiobasspeaker2_17 (abotdance_fla.abot_audiobasspeaker2_17)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class abot_audiobasspeaker2_17 extends MovieClip {
public function abot_audiobasspeaker2_17(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 4
//abot_audiochest_10 (abotdance_fla.abot_audiochest_10)
package abotdance_fla {
import flash.display.*;
public dynamic class abot_audiochest_10 extends MovieClip {
public var spos1:MovieClip;
public var spos2:MovieClip;
public var spos3:MovieClip;
public var spos0:MovieClip;
public var smask:MovieClip;
}
}//package abotdance_fla
Section 5
//abot_audioshoulderhorn_6 (abotdance_fla.abot_audioshoulderhorn_6)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class abot_audioshoulderhorn_6 extends MovieClip {
public function abot_audioshoulderhorn_6(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 6
//abot_audioshoulderhorn1_28 (abotdance_fla.abot_audioshoulderhorn1_28)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class abot_audioshoulderhorn1_28 extends MovieClip {
public function abot_audioshoulderhorn1_28(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 7
//abot_medrangerumble2_14 (abotdance_fla.abot_medrangerumble2_14)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class abot_medrangerumble2_14 extends MovieClip {
public function abot_medrangerumble2_14(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 8
//abot_midrangerumble1_24 (abotdance_fla.abot_midrangerumble1_24)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class abot_midrangerumble1_24 extends MovieClip {
public function abot_midrangerumble1_24(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 9
//darnel_bop2_46 (abotdance_fla.darnel_bop2_46)
package abotdance_fla {
import flash.display.*;
public dynamic class darnel_bop2_46 extends MovieClip {
public var foot:MovieClip;
}
}//package abotdance_fla
Section 10
//darnell_dances_35 (abotdance_fla.darnell_dances_35)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class darnell_dances_35 extends MovieClip {
public var gfx:MovieClip;
public function darnell_dances_35(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 11
//darnell_head_44 (abotdance_fla.darnell_head_44)
package abotdance_fla {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class darnell_head_44 extends MovieClip {
public function darnell_head_44(){
addFrameScript(0, frame1);
}
function frame1(){
stop();
}
}
}//package abotdance_fla
Section 12
//MainTimeline (abotdance_fla.MainTimeline)
package abotdance_fla {
import flash.display.*;
import mwelsh.audio.visualizer.*;
import flash.geom.*;
import flash.events.*;
import mwelsh.audio.visualizer.visualizations.*;
import flash.media.*;
import mwelsh.geom.*;
import flash.net.*;
import flash.utils.*;
import flash.system.*;
import flash.filters.*;
import flash.errors.*;
import flash.accessibility.*;
import flash.external.*;
import flash.text.*;
import flash.ui.*;
public dynamic class MainTimeline extends MovieClip {
public const L_BAND:uint = 3;
public const M_BAND:uint = 15;
public var darnellCount:uint;
public var filename:String;
public var music:Sound;
public var energies:Array;
public var playing:Boolean;
public var bopFrameOffset2:Number;
public var vis:AudioVisualizer;
public var sndChannel:SoundChannel;
public var a:SimpleSpectrumVisualization;
public var curSong:uint;
public var autoPlay:Boolean;
public var sObj:SharedObject;
public var distVis:DistordImage;
public var bopFrameOffset:Number;
public var maxEnergies:Array;
public var darnell:MovieClip;
public var beatParity:Boolean;
public var abot:MovieClip;
public var time:int;
public function MainTimeline(){
addFrameScript(0, frame1);
}
public function init(){
var _local1:Point;
var _local2:Point;
var _local3:Point;
var _local4:int;
stage.quality = "HIGH";
_local1 = new Point(abot.screen.spos2.x, abot.screen.spos2.y);
_local1 = abot.screen.localToGlobal(_local1);
_local2 = new Point(abot.screen.spos3.x, abot.screen.spos3.y);
_local2 = abot.screen.localToGlobal(_local2);
_local3 = new Point(abot.screen.spos1.x, abot.screen.spos1.y);
_local3 = abot.screen.localToGlobal(_local3);
vis = new AudioVisualizer(Math.ceil(((_local2.x - _local1.x) * 1.1)), Math.ceil(((_local3.y - _local1.y) * 1.1)), ["SimpleSpectrumVisualization"], "SimpleSpectrumVisualization");
darnell.gotoAndStop(1);
addEventListener("enterFrame", tick);
distVis = new DistordImage(vis.getBitmapData(), 4, 4);
distVis.mask = abot.screen.smask;
abot.screen.addChild(distVis);
abot.bassL.stop();
abot.bassR.stop();
abot.midL.stop();
abot.midR.stop();
abot.tweeterL.stop();
abot.tweeterR.stop();
darnell.gfx.stop();
sObj = SharedObject.getLocal("ABotSettings", "/");
loadSettings();
Security.allowDomain("*");
Security.allowInsecureDomain("*");
ExternalInterface.addCallback("stopMusic", stopMusic);
ExternalInterface.addCallback("playSong", playSong);
if (AudioVisualizer.DEBUG){
_local4 = AudioVisualizer.DEBUG_SONG;
if (_local4 == -1){
_local4 = int((AudioVisualizer.DEBUG_SONGS.length * Math.random()));
};
loadMusic(("songs/" + AudioVisualizer.DEBUG_SONGS[_local4]));
playMusic();
} else {
if (autoPlay){
ExternalInterface.call("Abot.Play", (4 - Math.floor((Math.log(((Math.random() * 31) + 1)) / Math.LN2))));
};
};
}
public function loadSettings(){
if (sObj.data.autoPlay != undefined){
autoPlay = sObj.data.autoPlay;
} else {
autoPlay = true;
};
}
function frame1(){
autoPlay = true;
beatParity = false;
playing = false;
darnellCount = 0;
curSong = 0;
energies = [0, 0, 0, 0, 0, 0];
maxEnergies = [0, 0, 0, 0, 0, 0];
init();
time = getTimer();
bopFrameOffset = 0;
bopFrameOffset2 = 0;
abot.gotoAndStop(15);
}
public function stopMusic(_arg1:Event=null){
if (sndChannel){
sndChannel.stop();
sndChannel.removeEventListener(Event.SOUND_COMPLETE, songComplete);
};
autoPlay = false;
playing = false;
saveSettings();
vis.pauseBeatDetection();
}
public function playMusic(_arg1:Event=null){
if (sndChannel){
sndChannel.stop();
sndChannel.removeEventListener(Event.SOUND_COMPLETE, songComplete);
};
if (!music){
return;
};
vis.resetBeatDetection();
autoPlay = true;
playing = true;
saveSettings();
sndChannel = music.play();
sndChannel.addEventListener(Event.SOUND_COMPLETE, songComplete);
}
public function songComplete(_arg1:Event):void{
nextSong();
}
public function nextSong():void{
ExternalInterface.call("Abot.NextSong");
}
public function tick(_arg1:Event){
var _local2:uint;
var _local3:SoundData;
var _local4:Boolean;
var _local5:uint;
var _local6:Number;
var _local7:Point;
var _local8:Number;
var _local9:uint;
var _local10:uint;
var _local11:Boolean;
var _local12:uint;
var _local13:Number;
_local2 = (getTimer() - time);
_local3 = vis.getSoundData();
_local4 = _local3.smartBeat;
_local5 = _local3.bpm;
if (_local4){
_local10 = (beatParity) ? 1 : 15;
_local11 = false;
_local12 = darnell.gfx.currentFrame;
if ((((_local12 > 1)) && ((_local12 < 8)))){
bopFrameOffset2 = (bopFrameOffset2 - ((_local5) ? ((60 / _local5) / 14) : (1 / 14) * (darnell.gfx.currentFrame - 1)));
} else {
if ((((_local12 > 15)) && ((_local12 < 22)))){
bopFrameOffset2 = (bopFrameOffset2 - ((_local5) ? ((60 / _local5) / 14) : (1 / 14) * (darnell.gfx.currentFrame - 15)));
} else {
if ((((_local12 > 7)) && ((_local12 < 16)))){
darnell.gfx.gotoAndStop(15);
bopFrameOffset2 = 0;
} else {
if ((((_local12 > 21)) && ((_local12 < 29)))){
darnell.gfx.gotoAndStop(1);
bopFrameOffset2 = 0;
};
};
};
};
beatParity = !(beatParity);
darnellCount++;
if (darnellCount == 16){
darnellCount = 0;
};
};
if (_local3.beat){
abot.gotoAndStop(4);
};
_local6 = 0;
if (!playing){
bopFrameOffset = (bopFrameOffset + (_local2 / 1000));
while (bopFrameOffset >= (1 / 10)) {
if (abot.currentFrame == abot.totalFrames){
abot.gotoAndStop(1);
} else {
abot.nextFrame();
};
bopFrameOffset = (bopFrameOffset - (1 / 10));
};
} else {
if (abot.currentFrame < 15){
bopFrameOffset = (bopFrameOffset + (_local2 / 1000));
_local13 = (1 / 60);
while ((((((abot.currentFrame < 15)) && (_local13))) && ((bopFrameOffset >= _local13)))) {
if (abot.currentFrame == abot.totalFrames){
abot.gotoAndStop(1);
} else {
abot.nextFrame();
};
bopFrameOffset = (bopFrameOffset - _local13);
};
} else {
bopFrameOffset = 0;
};
};
bopFrameOffset2 = (bopFrameOffset2 + (_local2 / 1000));
_local13 = (_local5) ? ((60 / _local5) / 14) : (1 / 14);
if (((1) || (((!((darnell.gfx.currentFrame == 8))) && (!((darnell.gfx.currentFrame == 22))))))){
while (((((((1) || (((!((darnell.gfx.currentFrame == 8))) && (!((darnell.gfx.currentFrame == 22))))))) && (_local13))) && ((bopFrameOffset2 >= _local13)))) {
if (darnell.gfx.currentFrame == darnell.gfx.totalFrames){
darnell.gfx.gotoAndStop(1);
} else {
darnell.gfx.nextFrame();
};
bopFrameOffset2 = (bopFrameOffset2 - _local13);
};
} else {
bopFrameOffset2 = 0;
};
distVis.setTransform(abot.screen.spos2.x, abot.screen.spos2.y, abot.screen.spos3.x, abot.screen.spos3.y, abot.screen.spos0.x, abot.screen.spos0.y, abot.screen.spos1.x, abot.screen.spos1.y);
_local7 = new Point(abot.screen.spos2.x, abot.screen.spos2.y);
_local7 = abot.screen.localToGlobal(_local7);
vis.x = _local7.x;
vis.y = _local7.y;
energies[0] = (_local3.getTotalSubbandEnergy(1, L_BAND, 0) / 3);
maxEnergies[0] = Math.max(energies[0], maxEnergies[0]);
abot.bassL.gotoAndStop(Math.max(1, Math.floor((((energies[0] / maxEnergies[0]) * abot.bassL.totalFrames) + 0.5))));
energies[1] = (_local3.getTotalSubbandEnergy(1, L_BAND, 1) / 3);
maxEnergies[1] = Math.max(energies[1], maxEnergies[1]);
abot.bassR.gotoAndStop(Math.max(1, Math.floor((((energies[1] / maxEnergies[1]) * abot.bassR.totalFrames) + 0.5))));
energies[2] = (_local3.getTotalSubbandEnergy(L_BAND, M_BAND, 0) / 2);
maxEnergies[2] = Math.max(energies[2], maxEnergies[2]);
abot.midL.gotoAndStop(Math.max(1, Math.floor((((energies[2] / maxEnergies[2]) * abot.midL.totalFrames) + 0.5))));
energies[3] = (_local3.getTotalSubbandEnergy(L_BAND, M_BAND, 1) / 2);
maxEnergies[3] = Math.max(energies[3], maxEnergies[3]);
abot.midR.gotoAndStop(Math.max(1, Math.floor((((energies[3] / maxEnergies[3]) * abot.midR.totalFrames) + 0.5))));
energies[4] = _local3.getTotalSubbandEnergy(M_BAND, 0x0100, 0);
maxEnergies[4] = Math.max(energies[4], maxEnergies[4]);
abot.tweeterL.gotoAndStop(Math.max(1, Math.floor((((energies[4] / maxEnergies[4]) * abot.tweeterL.totalFrames) + 0.5))));
energies[5] = _local3.getTotalSubbandEnergy(M_BAND, 0x0100, 1);
maxEnergies[5] = Math.max(energies[5], maxEnergies[5]);
abot.tweeterR.gotoAndStop(Math.max(1, Math.floor((((energies[5] / maxEnergies[5]) * abot.tweeterR.totalFrames) + 0.5))));
time = (time + _local2);
}
public function playSong(_arg1:String):void{
loadMusic(_arg1);
playMusic();
}
public function saveSettings(){
sObj.data.autoPlay = autoPlay;
sObj.flush();
}
public function cleanupMusic(_arg1:Event=null):void{
music.removeEventListener(IOErrorEvent.IO_ERROR, cleanupMusic);
music.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanupMusic);
music = null;
}
public function loadMusic(_arg1:String):void{
var lc:SoundLoaderContext;
var file = _arg1;
if (sndChannel){
sndChannel.stop();
sndChannel.removeEventListener(Event.SOUND_COMPLETE, songComplete);
};
filename = file;
lc = new SoundLoaderContext(1000, true);
if (music){
cleanupMusic();
};
try {
music = new Sound(new URLRequest(filename), lc);
music.addEventListener(IOErrorEvent.IO_ERROR, cleanupMusic);
music.addEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanupMusic);
} catch(e:Error) {
if ((((e is IOError)) && ((e.errorID == 2032)))){
music.close();
};
trace((("Error loading music file " + m_Filename) + "!"));
trace(e);
music = null;
};
}
}
}//package abotdance_fla
Section 13
//SimpleSpectrumVisualization (mwelsh.audio.visualizer.visualizations.SimpleSpectrumVisualization)
package mwelsh.audio.visualizer.visualizations {
import mwelsh.audio.visualizer.*;
import flash.geom.*;
import flash.filters.*;
public class SimpleSpectrumVisualization extends Visualization {
private var curMax:Array;
private var soundEq:Array;
private var calibrating:Array;
private var max:Array;
private var numBars:uint;
private var numSegs:uint;
private var colors:Array;
public function SimpleSpectrumVisualization(_arg1:uint, _arg2:uint, _arg3:Number=16, _arg4:Number=16){
var _local5:uint;
super(_arg1, _arg2);
this.numBars = _arg3;
this.numSegs = _arg4;
soundEq = new Array(_arg3);
max = new Array(_arg3);
curMax = new Array(_arg3);
calibrating = new Array(_arg3);
_local5 = 0;
while (_local5 < _arg3) {
soundEq[_local5] = 0;
max[_local5] = 0;
curMax[_local5] = 1;
calibrating[_local5] = true;
_local5++;
};
colors = [];
_local5 = 0;
while (_local5 < 48) {
colors[_local5] = ((uint((_local5 * 5.3125)) << 16) | 0xFF00);
_local5++;
};
_local5 = 48;
while (_local5 < 128) {
colors[_local5] = (0xFF0000 | (uint(((128 - _local5) * 3.1875)) << 8));
_local5++;
};
}
override public function tick(_arg1:Number, _arg2:SoundData):void{
var _local3:Number;
var _local4:uint;
var _local5:uint;
var _local6:Number;
var _local7:uint;
var _local8:uint;
var _local9:uint;
var _local10:uint;
var _local11:Number;
var _local12:Number;
var _local13:Number;
var _local14:Number;
var _local15:Number;
pixels.lock();
vectors.graphics.clear();
_local3 = Math.max(0, (1 - (4 * _arg1)));
pixels.applyFilter(pixels, pixels.rect, new Point(0, 0), new ColorMatrixFilter([_local3, 0, 0, 0, 0, 0, _local3, 0, 0, 0, 0, 0, _local3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]));
_local6 = 0;
_local7 = 0;
_local8 = (0x0100 / numBars);
_local4 = 0;
while (_local4 < numBars) {
_local9 = (_local8 - _local7);
_local6 = 0;
_local5 = _local7;
while (_local5 < _local8) {
_local6 = (_local6 + _arg2.fftAvg[_local5]);
_local5++;
};
soundEq[_local4] = Math.max((_local6 / _local9), Math.max((soundEq[_local4] - 0.05), 0));
max[_local4] = Math.max(soundEq[_local4], max[_local4]);
if (calibrating[_local4]){
if (max[_local4] > 0.1){
if (max[_local4] > 0.6){
curMax[_local4] = (curMax[_local4] + ((max[_local4] - curMax[_local4]) / 8));
} else {
if (max[_local4] > 0.3){
curMax[_local4] = (curMax[_local4] + ((max[_local4] - curMax[_local4]) / 16));
} else {
curMax[_local4] = (curMax[_local4] + ((max[_local4] - curMax[_local4]) / 32));
};
};
if (Math.abs((curMax[_local4] - max[_local4])) < 0.0001){
calibrating[_local4] = false;
};
};
} else {
curMax[_local4] = max[_local4];
};
_local7 = _local8;
_local8 = (_local8 + _local9);
_local4++;
};
vectors.graphics.lineStyle(0, 0, 0);
_local11 = (w * 0.03);
_local12 = ((w - ((numBars + 1) * _local11)) / numBars);
_local13 = (h * 0.02);
_local14 = ((h * (1.02 - (0.02 * numSegs))) / numSegs);
_local15 = (128 / numSegs);
_local4 = 0;
while (_local4 < numBars) {
_local5 = 0;
while (_local5 < Math.round(((numSegs * soundEq[_local4]) / curMax[_local4]))) {
_local10 = colors[Math.round((_local5 * _local15))];
vectors.graphics.beginFill(_local10);
vectors.graphics.drawRect(((_local11 * (_local4 + 1)) + (_local12 * _local4)), ((h - ((_local5 + 1) * _local14)) - (_local5 * _local13)), _local12, _local14);
vectors.graphics.endFill();
_local5++;
};
_local4++;
};
pixels.draw(vectors);
pixels.unlock();
}
}
}//package mwelsh.audio.visualizer.visualizations
Section 14
//Visualization (mwelsh.audio.visualizer.visualizations.Visualization)
package mwelsh.audio.visualizer.visualizations {
import flash.display.*;
import mwelsh.audio.visualizer.*;
import flash.geom.*;
import flash.events.*;
import flash.net.*;
import flash.system.*;
public class Visualization {
protected var maxDim:uint;
protected var h2:Number;
protected var vectors:Shape;
protected var loader:Loader;
protected var minDim:uint;
protected var orientation:Boolean;
protected var w2:Number;
protected var point:Point;
protected var _loaded:Boolean;
protected var bufferBmp:BitmapData;
protected var h:uint;
protected var pixels:BitmapData;
protected var bufferBmp2:BitmapData;
protected var w:uint;
public function Visualization(_arg1:uint, _arg2:uint):void{
_loaded = true;
createGfx(_arg1, _arg2);
}
public function get loaded():Boolean{
return (_loaded);
}
protected function catchIOError(_arg1:Event):void{
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadingComplete);
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, catchIOError);
}
protected function loadingComplete(_arg1:Event):void{
loader.removeEventListener(Event.COMPLETE, loadingComplete);
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, catchIOError);
_loaded = true;
}
protected function applyPolarTransform(_arg1:Function, _arg2:Function):void{
var _local3:uint;
var _local4:uint;
var _local5:Number;
var _local6:Number;
var _local7:Number;
_local3 = 0;
while (_local3 < w) {
_local4 = 0;
while (_local4 < w) {
_local4++;
};
_local3++;
};
}
public function createGfx(_arg1:uint, _arg2:uint):BitmapData{
w = _arg1;
h = _arg2;
w2 = (w / 2);
h2 = (h / 2);
maxDim = Math.max(w, h);
minDim = Math.min(w, h);
orientation = (h > w);
pixels = new BitmapData(w, h, false);
vectors = new Shape();
vectors.width = w;
vectors.height = h;
point = new Point();
pixels.fillRect(pixels.rect, 4278190080);
bufferBmp = new BitmapData(_arg1, _arg2, true);
bufferBmp2 = new BitmapData(_arg1, _arg2, true);
return (pixels);
}
protected function drawBuffer(_arg1:Matrix=null, _arg2:ColorTransform=null, _arg3:String=null, _arg4:BitmapData=null):void{
var _local5:Point;
if (_arg4 == null){
_arg4 = bufferBmp;
};
_local5 = new Point(w2, h2);
if (!_arg1){
_arg1 = new Matrix();
};
_local5 = _arg1.deltaTransformPoint(_local5);
_arg1.translate((w2 - _local5.x), (h2 - _local5.y));
pixels.draw(_arg4, _arg1, _arg2, _arg3);
}
public function tick(_arg1:Number, _arg2:SoundData):void{
pixels.lock();
pixels.fillRect(pixels.rect, 4278190080);
pixels.unlock();
}
public function get bitmapData():BitmapData{
return (pixels);
}
protected function loadContent(_arg1:String):void{
var _local2:URLRequest;
var _local3:LoaderContext;
_loaded = false;
_local2 = new URLRequest((AudioVisualizer.VIS_DATA_FOLDER + _arg1));
loader = new Loader();
_local3 = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, catchIOError);
loader.load(_local2, _local3);
}
protected function getLoadedClass(_arg1:String):Class{
return (Class(loader.contentLoaderInfo.applicationDomain.getDefinition(_arg1)));
}
protected function saveBuffer(_arg1:Matrix=null, _arg2:ColorTransform=null, _arg3:String=null, _arg4:BitmapData=null):void{
var _local5:Point;
if (_arg4 == null){
_arg4 = bufferBmp;
};
if (!_arg1){
_arg1 = new Matrix();
};
_local5 = new Point(w2, h2);
_local5 = _arg1.deltaTransformPoint(_local5);
_arg1.translate((w2 - _local5.x), (h2 - _local5.y));
_arg4.draw(pixels, _arg1, _arg2, _arg3);
}
}
}//package mwelsh.audio.visualizer.visualizations
Section 15
//AudioVisualizer (mwelsh.audio.visualizer.AudioVisualizer)
package mwelsh.audio.visualizer {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import mwelsh.audio.visualizer.visualizations.*;
import flash.utils.*;
import flash.filters.*;
public class AudioVisualizer extends Sprite {
private const BEAT_CONSTANT:Number = 3.1;
private const TRANSITION_SCROLL0:uint = 1;
private const TRANSITION_DISSOLVE:uint = 3;
private const TRANSITION_SCROLL3:uint = 4;
private const TRANSITION_SCROLL1:uint = 2;
private const MIN_BPM:uint = 60;
private const MAX_BPM:uint = 200;
private const NUM_TRANSITIONS:uint = 7;
private const BEAT_HISTORY_LEN:uint = 16;
private const TRANSITION_SPINOUT:uint = 6;
private const TRANSITION_FADE:uint = 0;
private const BPM_HISTORY_LEN:uint = 8;
private const VIS_FADE_TIME:uint = 1000;
private const TRANSITION_COLUMNWIPE:uint = 5;
private const TRANSITION_NONE:uint = 999;
private const MIN_BEAT_TIME:Number = 0.2;
private const TRANSITION_SQUARES:uint = 7;
private var _lastPredictedBeatTime:Number;
private var _visNumber:int;
private var _beatTypeHistory:Array;
private var _confidence:Number;
private var _beatPeak1Peak:Number;
private var _lastBeatTime:Number;
private var _beatDiscriminatedHistory:Array;
private var _transitionType:uint;
private var _beatsGuessed:uint;
private var h:uint;
private var _visPlaylist:Array;
private var w:uint;
private var _bpmDoubleCount:uint;
private var _stickyConfidenceCount:uint;
private var _beat:Boolean;
private var _resyncBpm:Boolean;
private var _predictedTimeUntilBeat:Number;
private var _averageBeatTime:Number;
private var _buffer0:BitmapData;
private var _buffer1:BitmapData;
private var _predictionBpm:uint;
private var _transitionSprite:Sprite;
private var _vis0:Visualization;
private var _vis1:Visualization;
private var _bpm:uint;
private var _bpmSticky:Boolean;
private var _topConfidenceCount:uint;
private var _beatTimeHistory:Array;
private var _transitionBitmap:BitmapData;
private var _BDTime:Number;
private var _bpmHistory:Array;
private var _bpmHalfCount:uint;
private var _beatDetection:Boolean;
private var _fullScreen:Boolean;
private var _visTransitionTime:uint;
private var _screen:BitmapData;
private var _beatPeak1:Number;
private var _beatPeak2:Number;
private var _time:int;
private var _bestConfidence:Number;
public var dbgSoundData:DebugSoundData;
private var _lastBeatHistoryTime:Number;
private var _visTime:int;
private var _soundData:SoundData;
private var _transitionTime:int;
public static const DEBUG_SONG:int = -1;
public static const VIS_DATA_FOLDER:String = "http://flash.ngfiles.com/";
public static const DEBUG_SONGS:Array = [];
public static const DEBUG:Boolean = false;
public static const VIS_CHANGED:String = "visChanged";
public static const VERSION:String = "1.1";
public function AudioVisualizer(_arg1:uint, _arg2:uint, _arg3:Array, _arg4=undefined):void{
addEventListener("enterFrame", visualizerTick);
_transitionTime = (_visTime = 0);
_lastBeatTime = 0;
_visPlaylist = _arg3;
this.w = _arg1;
this.h = _arg2;
_transitionBitmap = new BitmapData(_arg1, _arg2);
_transitionSprite = new Sprite();
createVis(_arg1, _arg2, _arg4);
_time = getTimer();
_BDTime = 0;
_visTransitionTime = 0;
_beatPeak1 = (_beatPeak1Peak = (_beatPeak2 = 0));
_fullScreen = false;
}
public function getBeat():Boolean{
return (_beat);
}
public function nextVis():void{
_visNumber = ((_visNumber + 1) % _visPlaylist.length);
changeVis(_visPlaylist[_visNumber]);
}
public function addedHandler(_arg1:Event):void{
}
public function set visualization(_arg1:String):void{
var _local2:uint;
_visNumber = -1;
_local2 = 0;
while (_local2 < _visPlaylist.length) {
if (_visPlaylist[_local2] == _arg1){
_visNumber = _local2;
};
_local2++;
};
changeVis(_arg1);
}
private function changeVis(_arg1:String, _arg2:uint=999):void{
var _local3:Class;
_local3 = (getDefinitionByName(("mwelsh.audio.visualizer.visualizations." + _arg1)) as Class);
_vis1 = new _local3(w, h);
_buffer1 = _vis1.bitmapData;
_transitionType = _arg2;
_visTime = 0;
dispatchEvent(new Event(VIS_CHANGED));
}
public function resetBeatDetection():void{
_beatDetection = true;
initSmartBeatDetection();
}
private function doubleBpm():void{
var _local1:uint;
var _local2:Array;
if (((_bpmSticky) && ((_bpm > MIN_BPM)))){
return;
};
trace("DOUBLE");
_local2 = [];
_local1 = 0;
while (_local1 < (BEAT_HISTORY_LEN - 1)) {
_local2[_local1] = (_beatTimeHistory[_local1] - _beatTimeHistory[(_local1 + 1)]);
_local1++;
};
_local1 = 1;
while (_local1 < BEAT_HISTORY_LEN) {
_beatTimeHistory[_local1] = (_beatTimeHistory[(_local1 - 1)] - (_local2[(_local1 - 1)] / 2));
_local1++;
};
_averageBeatTime = (_averageBeatTime / 2);
_bpm = (_bpm * 2);
_bpmDoubleCount = 0;
_bpmHistory = [];
_beatDiscriminatedHistory = [];
}
public function cleanup():void{
_vis0 = null;
_vis1 = null;
_buffer0 = (_buffer1 = (_screen = null));
removeEventListener("enterFrame", visualizerTick);
removeChildAt(0);
}
private function halfBpm():void{
var _local1:uint;
var _local2:Array;
if (((_bpmSticky) && ((_bpm < MAX_BPM)))){
return;
};
trace("HALF");
_local2 = [];
_local1 = 0;
while (_local1 < (BEAT_HISTORY_LEN - 1)) {
_local2[_local1] = (_beatTimeHistory[_local1] - _beatTimeHistory[(_local1 + 1)]);
_local1++;
};
_local1 = 1;
while (_local1 < BEAT_HISTORY_LEN) {
_beatTimeHistory[_local1] = (_beatTimeHistory[(_local1 - 1)] - (_local2[(_local1 - 1)] * 2));
_local1++;
};
_averageBeatTime = (_averageBeatTime * 2);
_bpm = (_bpm / 2);
_bpmHalfCount = 0;
_bpmHistory = [];
_beatDiscriminatedHistory = [];
}
public function getSoundData():SoundData{
return (_soundData);
}
public function getBPM():Number{
return (0);
}
public function prevVis():void{
_visNumber = ((_visNumber - 1) % _visPlaylist.length);
changeVis(_visPlaylist[_visNumber]);
}
private function fullScreenHandler(_arg1:Event):void{
}
public function pauseBeatDetection():void{
_beatDetection = false;
}
public function get visualization():String{
if (_visNumber < 0){
return (null);
};
return (_visPlaylist[_visNumber]);
}
private function initSmartBeatDetection():void{
_bpm = 0;
_bpmHistory = [];
_beatTimeHistory = [];
_beatDiscriminatedHistory = [];
_beatTypeHistory = [];
_lastPredictedBeatTime = 0;
_lastBeatHistoryTime = 0;
_bpmSticky = false;
_confidence = (_bestConfidence = 0);
_averageBeatTime = 0;
_topConfidenceCount = 0;
_predictionBpm = 0;
_beatsGuessed = 0;
_bpmHalfCount = (_bpmDoubleCount = 0);
_stickyConfidenceCount = 0;
_resyncBpm = false;
_predictedTimeUntilBeat = 0;
}
private function calcBpm():void{
var _local1:int;
var _local2:Number;
var _local3:uint;
var _local4:uint;
var _local5:Number;
var _local6:Number;
var _local7:Number;
var _local8:Number;
var _local9:Number;
var _local10:Number;
var _local11:Number;
_local2 = 0;
_local3 = 0;
_local4 = 0;
_local8 = 0;
_local10 = 0;
if (_beatTimeHistory.length != BEAT_HISTORY_LEN){
return;
};
_local1 = 0;
while (_local1 < (BEAT_HISTORY_LEN - 1)) {
_local9 = (_beatTimeHistory[_local1] - _beatTimeHistory[(_local1 + 1)]);
_local2 = (_local2 + _local9);
_local10 = Math.max(_local9, _local10);
_local8 = (_local8 + (_local9 * _local9));
_local1++;
};
_averageBeatTime = (_local2 / (BEAT_HISTORY_LEN - 1));
_local1 = 0;
while (_local1 < BEAT_HISTORY_LEN) {
if (_beatTypeHistory[_local1]){
_local3++;
};
_local1++;
};
_local5 = Math.min(((2 * _local3) / BEAT_HISTORY_LEN), 1);
_local6 = Math.sqrt(((_local8 / (BEAT_HISTORY_LEN - 1)) - (_averageBeatTime * _averageBeatTime)));
_local7 = (1 - (_local6 / _local10));
_confidence = Math.max(0, (((2 * _local5) * _local7) - 1));
_local2 = 0;
_local9 = 0;
_local1 = 0;
while (_local1 < (BEAT_HISTORY_LEN - 1)) {
_local9 = (_local9 + (_beatTimeHistory[_local1] - _beatTimeHistory[(_local1 + 1)]));
if (Math.abs((_averageBeatTime - _local9)) < _local6){
_local2 = (_local2 + _local9);
_local4++;
_local9 = 0;
} else {
if (_local9 > _averageBeatTime){
_local9 = 0;
};
};
_local1++;
};
if (_local4){
_averageBeatTime = (_local2 / _local4);
};
if (_beatsGuessed >= (BEAT_HISTORY_LEN + 2)){
_local11 = _bpm;
if (_averageBeatTime){
_local11 = (60 / _averageBeatTime);
};
if (((!(_bpmHistory.length)) || (!((_local11 == _bpmHistory[0]))))){
_bpmHistory.unshift(_local11);
if (_bpmHistory.length > BPM_HISTORY_LEN){
_bpmHistory.pop();
};
};
if (((_predictionBpm) && ((_confidence >= 0.85)))){
_stickyConfidenceCount++;
if (_stickyConfidenceCount == 8){
_bpmSticky = true;
trace("STICKED");
trace(_predictionBpm);
};
} else {
_stickyConfidenceCount = 0;
};
};
_bpm = 0;
_local1 = 0;
while (_local1 < _bpmHistory.length) {
_bpm = (_bpm + _bpmHistory[_local1]);
_local1++;
};
_bpm = (_bpm / _bpmHistory.length);
_local4 = 0;
_local1 = 0;
while (_local1 < BEAT_HISTORY_LEN) {
if (_beatDiscriminatedHistory[_local1]){
_local4++;
};
_local1++;
};
if (_bpmHistory.length){
if ((((_local4 >= (BEAT_HISTORY_LEN / 2))) && (((_bpm * 2) <= MAX_BPM)))){
doubleBpm();
_beatDiscriminatedHistory = [];
};
if (_bpm < MIN_BPM){
_bpmDoubleCount++;
if (_bpmDoubleCount > 4){
doubleBpm();
};
} else {
_bpmDoubleCount = 0;
};
if (_bpm > MAX_BPM){
_bpmHalfCount++;
if (_bpmHalfCount > 4){
halfBpm();
};
} else {
_bpmHalfCount = 0;
};
};
}
public function getBitmapData():BitmapData{
return (_screen);
}
public function unpauseBeatDetection():void{
_beatDetection = true;
}
public function set fullscreen(_arg1:Boolean):void{
_fullScreen = _arg1;
if (stage){
if (_fullScreen){
};
};
}
private function visualizerTick(_arg1:Event):void{
var _local2:uint;
var _local3:Number;
var _local4:Matrix;
var _local5:Number;
var _local6:Number;
var _local7:uint;
var _local8:uint;
var _local9:uint;
var _local10:Visualization;
_local2 = (getTimer() - _time);
_local3 = (_local2 / 1000);
_time = (_time + _local2);
_BDTime = (_BDTime + _local3);
if (!_vis0){
return;
};
_soundData = new SoundData(_beat, 0);
_beat = false;
if (_beatDetection){
_beat = beatDetect(_soundData, _local2);
_soundData.beat = _beat;
_beat = refineBeat(_beat);
if (_beat){
_predictedTimeUntilBeat = (60 / _predictionBpm);
} else {
_predictedTimeUntilBeat = (_predictedTimeUntilBeat - _local3);
if (_predictedTimeUntilBeat < 0){
_predictedTimeUntilBeat = (_predictedTimeUntilBeat + (60 / _predictionBpm));
};
};
};
_soundData.bpm = _predictionBpm;
_soundData.smartBeat = _beat;
_soundData.predictedTimeUntilBeat = _predictedTimeUntilBeat;
if (_vis1 == null){
_visTime = (_visTime + _local2);
if (((((((((_visTransitionTime) && ((_visTime >= _visTransitionTime)))) && ((_visNumber >= 0)))) && ((_visNumber < _visPlaylist.length)))) && ((_visPlaylist.length > 1)))){
_visNumber = ((_visNumber + 1) % _visPlaylist.length);
_visTime = 0;
changeVis(_visPlaylist[_visNumber], uint((Math.random() * NUM_TRANSITIONS)));
};
};
if (_vis0.loaded){
_vis0.tick(_local3, _soundData);
};
_screen.lock();
_screen.copyPixels(_buffer0, new Rectangle(0, 0, width, height), new Point());
if (((_vis1) && (_vis1.loaded))){
_transitionTime = (_transitionTime + _local2);
_vis1.tick(_local3, _soundData);
switch (_transitionType){
case TRANSITION_FADE:
_screen.draw(_buffer1, null, new ColorTransform(1, 1, 1, (_transitionTime / VIS_FADE_TIME)));
break;
case TRANSITION_SCROLL0:
_local4 = new Matrix();
_local4.createGradientBox(w, h, 0, ((((_transitionTime / VIS_FADE_TIME) * w) * 1.5) - ((1.5 * w) / 2)));
_transitionSprite.graphics.clear();
_transitionSprite.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], [1, 0], [100, 155], _local4);
_transitionSprite.graphics.lineTo(w, 0);
_transitionSprite.graphics.lineTo(w, h);
_transitionSprite.graphics.lineTo(0, h);
_transitionSprite.graphics.lineTo(0, 0);
_transitionSprite.graphics.endFill();
_transitionBitmap.fillRect(_transitionBitmap.rect, 0);
_transitionBitmap.draw(_transitionSprite);
_screen.copyPixels(_buffer1, _buffer1.rect, new Point(), _transitionBitmap, new Point(), true);
break;
case TRANSITION_SCROLL1:
_local4 = new Matrix();
_local4.createGradientBox(w, h, 0, (((w * 1.5) / 2) - (((_transitionTime / VIS_FADE_TIME) * w) * 1.5)));
_transitionSprite.graphics.clear();
_transitionSprite.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], [0, 1], [100, 155], _local4);
_transitionSprite.graphics.lineTo(w, 0);
_transitionSprite.graphics.lineTo(w, h);
_transitionSprite.graphics.lineTo(0, h);
_transitionSprite.graphics.lineTo(0, 0);
_transitionSprite.graphics.endFill();
_transitionBitmap.fillRect(_transitionBitmap.rect, 0);
_transitionBitmap.draw(_transitionSprite);
_screen.copyPixels(_buffer1, _buffer1.rect, new Point(), _transitionBitmap, new Point(), true);
break;
case TRANSITION_SCROLL3:
_screen.copyPixels(_buffer1, new Rectangle(Math.round((w * (1 - (_transitionTime / VIS_FADE_TIME)))), 0, Math.round(((w * _transitionTime) / VIS_FADE_TIME)), h), new Point(Math.round((w * (1 - (_transitionTime / VIS_FADE_TIME)))), 0));
break;
case TRANSITION_DISSOLVE:
_local5 = 10;
_local9 = 0;
while (_local9 < ((60 * _transitionTime) / VIS_FADE_TIME)) {
_local5 = _screen.pixelDissolve(_buffer1, _buffer1.rect, new Point(), _local5, uint(((w * h) / 60)));
_local9++;
};
break;
case TRANSITION_COLUMNWIPE:
_local9 = 0;
while (_local9 < 10) {
_screen.copyPixels(_buffer1, new Rectangle(Math.round(((_local9 * w) / 10)), 0, (w / 10), (h * Math.min(((2 * _transitionTime) / VIS_FADE_TIME)))), new Point(Math.round(((_local9 * w) / 10)), 0));
_local9 = (_local9 + 2);
};
if ((_transitionTime / VIS_FADE_TIME) > 0.5){
_local9 = 1;
while (_local9 < 10) {
_screen.copyPixels(_buffer1, new Rectangle(Math.round(((_local9 * w) / 10)), Math.round((h - ((h * 2) * ((_transitionTime / VIS_FADE_TIME) - 0.5)))), (w / 10), Math.round(((h * 2) * ((_transitionTime / VIS_FADE_TIME) - 0.5)))), new Point(Math.round(((_local9 * w) / 10)), Math.round((h - ((h * 2) * ((_transitionTime / VIS_FADE_TIME) - 0.5))))));
_local9 = (_local9 + 2);
};
};
break;
case TRANSITION_SQUARES:
_local6 = 0;
_local7 = 0;
_local8 = 0;
while (_local6 < (_transitionTime / VIS_FADE_TIME)) {
_screen.copyPixels(_buffer1, new Rectangle(((_local7 * w) / 10), ((_local8 * h) / 10), (w / 10), (h / 10)), new Point(((_local7 * w) / 10), ((_local8 * h) / 10)));
++_local7;
if (_local7 == 10){
_local7 = 0;
_local8++;
};
_local6 = (_local6 + (1 / 100));
};
break;
case TRANSITION_SPINOUT:
_local4 = new Matrix();
_local4.translate((w - ((w * _transitionTime) / VIS_FADE_TIME)), (h - ((h * _transitionTime) / VIS_FADE_TIME)));
_local4.scale((_transitionTime / VIS_FADE_TIME), (_transitionTime / VIS_FADE_TIME));
_screen.draw(_buffer1, _local4);
break;
default:
_transitionTime = VIS_FADE_TIME;
};
if (_transitionTime >= VIS_FADE_TIME){
_local10 = null;
_buffer0 = _buffer1;
_buffer1 = null;
_vis0 = _vis1;
_vis1 = null;
_transitionTime = 0;
};
};
_screen.unlock();
}
public function set transitionTime(_arg1:uint):void{
_visTransitionTime = (_arg1 * 1000);
}
private function createVis(_arg1:uint, _arg2:uint, _arg3:String):void{
var _local4:Class;
var _local5:uint;
if (_screen){
removeChildAt(0);
};
if ((((_arg3 == "")) || ((_arg3 == null)))){
_visNumber = uint((_visPlaylist.length * Math.random()));
} else {
_local5 = 0;
while (_local5 < _visPlaylist.length) {
if (_visPlaylist[_local5] == _arg3){
_visNumber = _local5;
};
_local5++;
};
};
_local4 = (getDefinitionByName(("mwelsh.audio.visualizer.visualizations." + _visPlaylist[_visNumber])) as Class);
_vis0 = new _local4(_arg1, _arg2);
_buffer0 = _vis0.bitmapData;
_screen = new BitmapData(_arg1, _arg2);
addChild(new Bitmap(_screen));
}
public function get fullscreen():Boolean{
return (_fullScreen);
}
private function refineBeat(_arg1:Boolean):Boolean{
var _local2:Boolean;
var _local3:Boolean;
var _local4:Boolean;
var _local5:Boolean;
var _local6:Boolean;
var _local7:uint;
var _local8:Number;
var _local9:Number;
var _local10:uint;
_local2 = false;
_local3 = false;
_local4 = false;
_local5 = false;
_local6 = false;
if (((_bpm) && ((_BDTime >= (_lastPredictedBeatTime + (60 / _bpm)))))){
_local3 = true;
};
if (_arg1){
_local2 = BeatHistoryStep(true);
};
calcBpm();
if (((((((_local2) || (_local3))) && (!(_bpmSticky)))) && (((((!(_predictionBpm)) || ((_predictionBpm > MAX_BPM)))) || ((_predictionBpm < MIN_BPM)))))){
_local6 = (_confidence >= _bestConfidence);
};
if (_confidence >= 0.5){
_topConfidenceCount++;
if (_topConfidenceCount == 8){
_local6 = true;
_topConfidenceCount = 0;
};
};
if (_local6){
_local6 = false;
_bestConfidence = _confidence;
_predictionBpm = _bpm;
};
if (!_bpmSticky){
_predictionBpm = _bpm;
};
_bpm = _predictionBpm;
if (((((_predictionBpm) && (_local2))) && (!(_local3)))){
if (_BDTime > (_lastPredictedBeatTime + ((60 / _predictionBpm) * 0.7))){
_local4 = true;
_local8 = (_predictionBpm * 1.01);
};
if (_BDTime < (_lastPredictedBeatTime + ((60 / _predictionBpm) * 0.3))){
_local5 = true;
_local8 = (_predictionBpm * 0.98);
};
if (((((!(_bpmSticky)) && (_resyncBpm))) && (((_local4) || (_local5))))){
_bpmHistory.unshift(_local8);
_local9 = 0;
_local10 = 0;
while (_local10 < BPM_HISTORY_LEN) {
_local9 = (_local9 + _bpmHistory[_local10]);
_local10++;
};
_local9 = (_local9 / BPM_HISTORY_LEN);
_predictionBpm = _local9;
};
};
if (_local4){
_lastPredictedBeatTime = _BDTime;
_resyncBpm = true;
return (true);
};
if (_local3){
_lastPredictedBeatTime = _BDTime;
if (_confidence > 0.25){
BeatHistoryStep(false);
};
_resyncBpm = false;
return (true);
} else {
if (_local5){
_lastPredictedBeatTime = _BDTime;
_resyncBpm = true;
return (false);
};
};
return (_arg1);
}
public function get transitionTime():uint{
return ((_visTransitionTime / 1000));
}
private function BeatHistoryStep(_arg1:Boolean):Boolean{
var _local2:int;
var _local3:int;
var _local4:Number;
_local4 = (_BDTime - _lastBeatHistoryTime);
if (_local4 < ((3 * _averageBeatTime) / 10)){
if (_beatTimeHistory.length == BEAT_HISTORY_LEN){
if (Math.abs((_averageBeatTime - (_BDTime - _beatTimeHistory[1]))) < Math.abs((_averageBeatTime - (_beatTimeHistory[0] - _beatTimeHistory[1])))){
_beatTimeHistory[0] = _BDTime;
_beatTypeHistory[0] = _arg1;
return (true);
};
};
return (false);
};
if (_beatTimeHistory.length == BEAT_HISTORY_LEN){
_local3 = 2;
while (_local3 < 8) {
if (Math.abs(((_averageBeatTime / _local3) - _local4)) < ((_averageBeatTime / _local3) * 0.2)){
_beatDiscriminatedHistory.unshift(true);
if (_beatDiscriminatedHistory.length > BEAT_HISTORY_LEN){
_beatDiscriminatedHistory.pop();
};
return (false);
};
_local3++;
};
};
_beatDiscriminatedHistory.unshift(false);
if (_beatDiscriminatedHistory.length > BEAT_HISTORY_LEN){
_beatDiscriminatedHistory.pop();
};
_lastBeatHistoryTime = _BDTime;
_beatTimeHistory.unshift(_BDTime);
_beatTypeHistory.unshift(_arg1);
_beatsGuessed++;
if (_beatTimeHistory.length > BEAT_HISTORY_LEN){
_beatTimeHistory.pop();
_beatTypeHistory.pop();
};
return (true);
}
protected function beatDetect(_arg1:SoundData, _arg2:uint):Boolean{
var _local3:Number;
var _local4:Boolean;
_local3 = _arg1.energy;
_local4 = false;
_beatPeak1 = (((_beatPeak1 * 121) + (_beatPeak2 * 7)) / 128);
if ((((_local3 >= (_beatPeak1 * 1.0425))) && ((_local3 > (0x0100 * 16))))){
_beatPeak1 = ((_local3 + _beatPeak1Peak) / 2);
_beatPeak1Peak = (_beatPeak1 * 1);
_local4 = true;
} else {
if (_local3 > _beatPeak2){
_beatPeak2 = _local3;
} else {
_beatPeak2 = (_beatPeak2 * 0.86);
};
};
if (_local4){
if ((_BDTime - _lastBeatTime) < MIN_BEAT_TIME){
_local4 = false;
} else {
_lastBeatTime = _BDTime;
};
};
return (_local4);
}
}
}//package mwelsh.audio.visualizer
Section 16
//DebugSoundData (mwelsh.audio.visualizer.DebugSoundData)
package mwelsh.audio.visualizer {
public class DebugSoundData extends SoundData {
public var numSubbands:uint;
public var avgEnergy:Array;
public var numEnergies:uint;
public var subbandStep:Number;
public var beatVarianceThreshold:Number;
public var curEnergy:Array;
public var subbandStepRate:Number;
public var varEnergy:Array;
public var fftAvgEnergy:Number;
public var beatConstant:Number;
public function DebugSoundData(_arg1:Boolean, _arg2:Number){
super(_arg1, _arg2);
}
}
}//package mwelsh.audio.visualizer
Section 17
//SoundData (mwelsh.audio.visualizer.SoundData)
package mwelsh.audio.visualizer {
import mwelsh.audio.*;
import flash.media.*;
import flash.utils.*;
public class SoundData {
private var _rightEnergy:Number;
private var m_PredictedTimeUntilBeat:Number;
private var _leftEnergy:Number;
private var _beat:Boolean;
private var _rawLeftData:Array;
private var _bpm:Number;
private var _fftLeftData:Array;
private var _smartBeat:Boolean;
private var _fftAvgData:Array;
private var _fftRightData:Array;
private var _rawAvgData:Array;
private var _rawRightData:Array;
private static const ENERGY_MODE:uint = 0;
public function SoundData(_arg1:Boolean, _arg2:Number){
m_PredictedTimeUntilBeat = -1;
_beat = _arg1;
_bpm = _arg2;
captureData();
}
public function set bpm(_arg1:uint):void{
_bpm = _arg1;
}
private function captureData():void{
var soundData1:ByteArray;
var soundData2:ByteArray;
var randomData:Boolean;
var i:uint;
var j:uint;
var soundFreq:Array;
var lastD:Number;
var newD:Number;
randomData = false;
soundData1 = new ByteArray();
soundData2 = new ByteArray();
if (!SoundMixer.areSoundsInaccessible()){
try {
SoundMixer.computeSpectrum(soundData1, false);
SoundMixer.computeSpectrum(soundData2, true, 1);
} catch(e:SecurityError) {
trace("computeSpectrum security error in SoundData!");
randomData = true;
};
} else {
randomData = true;
};
if (randomData){
if (AudioManager.AmIPlaying()){
lastD = 0;
j = 0;
while (j < 2) {
i = 0;
while (i < 0x0100) {
newD = ((Math.random() * 3) - 1.5);
var _local2 = (lastD + ((newD - lastD) / 8));
lastD = _local2;
soundData1.writeFloat(_local2);
soundData2.writeFloat((Math.random() * Math.pow((1 - (i / 0xFF)), 1.4)));
i = (i + 1);
};
j = (j + 1);
};
} else {
i = 0;
while (i < 0x0200) {
soundData1.writeFloat(0);
soundData2.writeFloat(0);
i = (i + 1);
};
};
soundData1.position = 0;
soundData2.position = 0;
};
_leftEnergy = (_rightEnergy = 0);
soundFreq = new Array(4);
_rawLeftData = new Array(0x0100);
_rawRightData = new Array(0x0100);
_fftLeftData = new Array(0x0100);
_fftRightData = new Array(0x0100);
_rawAvgData = new Array(0x0100);
_fftAvgData = new Array(0x0100);
i = 0;
while (i < 0x0100) {
_rawLeftData[i] = soundData1.readFloat();
_fftLeftData[i] = soundData2.readFloat();
_leftEnergy = (_leftEnergy + (Math.abs(_rawLeftData[i]) * 128));
i = (i + 1);
};
i = 0;
while (i < 0x0100) {
_rawRightData[i] = soundData1.readFloat();
_fftRightData[i] = soundData2.readFloat();
_rawAvgData[i] = ((_rawLeftData[i] + _rawRightData[i]) / 2);
_fftAvgData[i] = ((_fftLeftData[i] + _fftRightData[i]) / 2);
_rightEnergy = (_rightEnergy + (Math.abs(_rawRightData[i]) * 128));
i = (i + 1);
};
}
public function get rawAvg():Array{
return (_rawAvgData);
}
public function get rawRight():Array{
return (_rawRightData);
}
public function get rawLeft():Array{
return (_rawLeftData);
}
public function get fftRight():Array{
return (_fftRightData);
}
public function get fftLeft():Array{
return (_fftLeftData);
}
public function get predictedTimeUntilBeat():Number{
return (m_PredictedTimeUntilBeat);
}
public function get bpm():uint{
return (_bpm);
}
public function set predictedTimeUntilBeat(_arg1:Number):void{
m_PredictedTimeUntilBeat = _arg1;
}
public function set smartBeat(_arg1:Boolean):void{
_smartBeat = _arg1;
}
public function set beat(_arg1:Boolean):void{
_beat = _arg1;
}
public function getTotalSubbandEnergy(_arg1:uint=0, _arg2:uint=0x0100, _arg3:uint=2):Number{
var _local4:uint;
var _local5:Number;
_local5 = 0;
if (_arg3 == 2){
_local4 = _arg1;
while (_local4 < _arg2) {
_local5 = (_local5 + (_fftAvgData[_local4] * _fftAvgData[_local4]));
_local4++;
};
} else {
if (_arg3 == 1){
_local4 = _arg1;
while (_local4 < _arg2) {
_local5 = (_local5 + (_fftRightData[_local4] * _fftRightData[_local4]));
_local4++;
};
} else {
_local4 = _arg1;
while (_local4 < _arg2) {
_local5 = (_local5 + (_fftLeftData[_local4] * _fftLeftData[_local4]));
_local4++;
};
};
};
return (_local5);
}
public function get energy():Number{
return (Math.max(_leftEnergy, _rightEnergy));
}
public function get beat():Boolean{
return (_beat);
}
public function get smartBeat():Boolean{
return (_smartBeat);
}
public function generateSmoothedData(_arg1:uint, _arg2:Boolean, _arg3:uint=2):Array{
var _local4:Array;
var _local5:Array;
var _local6:uint;
var _local7:int;
_local4 = [];
if (_arg2){
if (_arg3 == 0){
_local5 = _fftLeftData;
} else {
if (_arg3 == 1){
_local5 = _fftRightData;
} else {
_local5 = _fftAvgData;
};
};
} else {
if (_arg3 == 0){
_local5 = _rawLeftData;
} else {
if (_arg3 == 1){
_local5 = _rawRightData;
} else {
_local5 = _rawAvgData;
};
};
};
_local6 = 0;
while (_local6 < 0x0100) {
_local4[_local6] = 0;
_local6++;
};
_local6 = 0;
while (_local6 < 0x0100) {
_local7 = Math.max(0, (_local6 - _arg1));
while (_local7 <= Math.min(0xFF, (_local6 + _arg1))) {
_local4[_local6] = (_local4[_local6] + _local5[_local7]);
_local7++;
};
_local4[_local6] = (_local4[_local6] / ((_arg1 * 2) + 1));
_local6++;
};
return (_local4);
}
public function get fftAvg():Array{
return (_fftAvgData);
}
public function getSubbandEnergy(_arg1:uint=0, _arg2:uint=0x0100, _arg3:uint=2):Number{
var _local4:uint;
var _local5:Number;
_local5 = 0;
if (_arg3 == 2){
_local4 = _arg1;
while (_local4 < _arg2) {
_local5 = (_local5 + (_fftAvgData[_local4] * _fftAvgData[_local4]));
_local4++;
};
} else {
if (_arg3 == 1){
_local4 = _arg1;
while (_local4 < _arg2) {
_local5 = (_local5 + (_fftRightData[_local4] * _fftRightData[_local4]));
_local4++;
};
} else {
_local4 = _arg1;
while (_local4 < _arg2) {
_local5 = (_local5 + (_fftLeftData[_local4] * _fftLeftData[_local4]));
_local4++;
};
};
};
return ((_local5 / (_arg2 - _arg1)));
}
}
}//package mwelsh.audio.visualizer
Section 18
//AudioManager (mwelsh.audio.AudioManager)
package mwelsh.audio {
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
import flash.errors.*;
public class AudioManager extends EventDispatcher {
private var m_SongEndTime:int;
private var m_SongPosition:uint;
private var m_Status:uint;
private var m_SoundChannel:SoundChannel;
private var m_Filename:String;
private var m_Ticker:DisplayObject;
private var m_Volume:Number;// = 1
private var m_GivenLength:uint;
private var m_Looping:Boolean;
private var m_MusicData:Sound;
private var m_Time:uint;// = 0
private static const SONG_STOPPED = 0;
private static const SONG_PLAYING = 1;
public static const SONG_COMPLETE_EVENT:String = "songCompleteEvent";
private static const SONG_PAUSED = 2;
public static var m_Instance:AudioManager;
public function AudioManager():void{
m_Volume = 1;
m_Time = 0;
super();
m_Status = SONG_STOPPED;
m_Looping = false;
m_SongPosition = 0;
m_Ticker = new Sprite();
m_Ticker.addEventListener("enterFrame", checkLoop);
m_Instance = this;
}
public function stop():void{
if (!m_MusicData){
return;
};
m_Status = SONG_STOPPED;
m_SongPosition = 0;
if (m_SoundChannel){
m_SoundChannel.removeEventListener("soundComplete", songComplete);
m_SoundChannel.stop();
m_SoundChannel = null;
};
}
public function get volume():Number{
return (m_Volume);
}
public function get music():String{
return (m_Filename);
}
public function get position():uint{
if (m_SoundChannel){
return (m_SoundChannel.position);
};
return (m_SongPosition);
}
private function cleanupMusicData(_arg1:Event=null):void{
if (m_MusicData){
m_MusicData.close();
m_MusicData.removeEventListener(IOErrorEvent.IO_ERROR, cleanupMusicData);
m_MusicData.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanupMusicData);
m_MusicData = null;
if (m_SoundChannel){
m_SoundChannel.stop();
m_SoundChannel = null;
};
};
}
public function get lengthDownloaded():uint{
if (m_MusicData){
return (m_MusicData.length);
};
return (0);
}
public function set volume(_arg1:Number):void{
m_Volume = _arg1;
if (m_SoundChannel){
m_SoundChannel.soundTransform = new SoundTransform(_arg1);
};
}
public function play():void{
if (!m_MusicData){
return;
};
if (m_Status == SONG_PAUSED){
pause();
} else {
if (m_Status == SONG_PLAYING){
stop();
};
m_SoundChannel = m_MusicData.play(m_SongPosition);
m_SoundChannel.soundTransform = new SoundTransform(m_Volume);
m_SoundChannel.addEventListener("soundComplete", songComplete);
m_Status = SONG_PLAYING;
if (downloadComplete){
m_SongEndTime = ((getTimer() + m_MusicData.length) - m_SongPosition);
};
};
}
public function get looping():Boolean{
return (m_Looping);
}
public function set position(_arg1:uint){
if (!m_MusicData){
return;
};
m_SongPosition = Math.min((length - 50), _arg1);
if (m_Status == SONG_PLAYING){
if (m_SoundChannel){
m_SoundChannel.stop();
m_SoundChannel.removeEventListener("soundComplete", songComplete);
};
m_SoundChannel = m_MusicData.play(m_SongPosition);
m_SoundChannel.soundTransform = new SoundTransform(m_Volume);
m_SoundChannel.addEventListener("soundComplete", songComplete);
if (m_MusicData.bytesLoaded == m_MusicData.bytesTotal){
m_SongEndTime = ((getTimer() + length) - m_SongPosition);
};
};
}
public function set music(_arg1:String){
loadMusic(_arg1);
}
private function loadMusic(_arg1:String){
var lc:SoundLoaderContext;
var file = _arg1;
stop();
if (m_MusicData){
cleanupMusicData();
};
m_Filename = file;
lc = new SoundLoaderContext(1000, true);
try {
m_MusicData = new Sound(new URLRequest(m_Filename), lc);
m_MusicData.addEventListener(IOErrorEvent.IO_ERROR, cleanupMusicData);
m_MusicData.addEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanupMusicData);
} catch(e:Error) {
if ((((e is IOError)) && ((e.errorID == 2032)))){
m_MusicData.close();
};
trace((("Error loading music file " + m_Filename) + "!"));
trace(e);
cleanupMusicData();
};
}
public function get downloadComplete():Boolean{
return (((((m_MusicData) && (m_MusicData.bytesTotal))) && ((m_MusicData.bytesLoaded == m_MusicData.bytesTotal))));
}
public function set length(_arg1:uint):void{
m_GivenLength = _arg1;
}
public function get length():uint{
if (downloadComplete){
return (m_MusicData.length);
};
if (m_GivenLength){
return (m_GivenLength);
};
if (m_MusicData){
return ((m_MusicData.length / (m_MusicData.bytesLoaded / m_MusicData.bytesTotal)));
};
return (0);
}
private function checkLoop(_arg1:Event){
var _local2:uint;
var _local3:Number;
_local2 = (getTimer() - m_Time);
m_Time = (m_Time + _local2);
if (((m_MusicData) && (m_SoundChannel))){
if ((((((m_SongEndTime == 0)) && ((m_Status == SONG_PLAYING)))) && (downloadComplete))){
m_SongEndTime = ((getTimer() + length) - m_SoundChannel.position);
};
_local3 = (m_SongEndTime - getTimer());
if ((((((((((((m_Status == SONG_PLAYING)) && ((m_MusicData.length > 0)))) && ((m_MusicData.bytesLoaded == m_MusicData.bytesTotal)))) && (m_Looping))) && (m_SongEndTime))) && ((_local3 <= 100)))){
trace("LOOP");
m_SoundChannel.removeEventListener("soundComplete", songComplete);
m_SoundChannel = m_MusicData.play(0);
m_SoundChannel.soundTransform = new SoundTransform(m_Volume);
m_SoundChannel.addEventListener("soundComplete", songComplete);
m_SongPosition = 0;
m_SongEndTime = ((getTimer() + m_MusicData.length) - m_SongPosition);
};
};
}
public function get status():uint{
return (m_Status);
}
private function songComplete(_arg1:Event=null):void{
dispatchEvent(new Event(SONG_COMPLETE_EVENT));
stop();
if (m_Looping){
play();
};
}
public function pause():void{
if (m_Status == SONG_PAUSED){
if (!m_MusicData){
return;
};
m_SoundChannel = m_MusicData.play(m_SongPosition);
m_SoundChannel.soundTransform = new SoundTransform(m_Volume);
if (downloadComplete){
m_SongEndTime = (((getTimer() + m_MusicData.length) - m_SongPosition) - 100);
};
m_SoundChannel.addEventListener("soundComplete", songComplete);
m_Status = SONG_PLAYING;
} else {
if (!m_MusicData){
return;
};
m_Status = SONG_PAUSED;
if (m_SoundChannel){
m_SoundChannel.stop();
m_SoundChannel.removeEventListener("soundComplete", songComplete);
m_SongPosition = m_SoundChannel.position;
m_SoundChannel = null;
} else {
m_SongPosition = 0;
};
};
}
public function set looping(_arg1:Boolean):void{
m_Looping = _arg1;
}
public static function AmIPlaying():Boolean{
if (!m_Instance){
return (false);
};
return ((m_Instance.status == SONG_PLAYING));
}
}
}//package mwelsh.audio
Section 19
//DistordImage (mwelsh.geom.DistordImage)
package mwelsh.geom {
import flash.display.*;
import flash.geom.*;
public class DistordImage extends Sprite {
private var _tri:Array;
private var _vseg:Number;
private var _yMin;
private var _hsLen:Number;
private var _yMax:Number;
private var _vsLen:Number;
private var _tMat:Matrix;
private var _s:Shape;
private var _xMin;
private var _xMax;
private var _sMat:Matrix;
private var _hseg:Number;
private var _h:Number;
private var _texture:BitmapData;
private var _p:Array;
private var _w:Number;
public function DistordImage(_arg1:BitmapData, _arg2:Number, _arg3:Number){
_s = new Shape();
addChild(_s);
_texture = _arg1;
_vseg = _arg2;
_hseg = _arg3;
_w = _texture.width;
_h = _texture.height;
__init();
}
private function __init():void{
var _local1:uint;
var _local2:uint;
var _local3:Number;
var _local4:Number;
var _local5:Number;
var _local6:Number;
_p = new Array();
_tri = new Array();
_local3 = (_w / 2);
_local4 = (_h / 2);
_xMin = (_yMin = 0);
_xMax = _w;
_yMax = _h;
_hsLen = (_w / (_hseg + 1));
_vsLen = (_h / (_vseg + 1));
_local1 = 0;
while (_local1 < (_vseg + 2)) {
_local2 = 0;
while (_local2 < (_hseg + 2)) {
_local5 = (_local1 * _hsLen);
_local6 = (_local2 * _vsLen);
_p.push({x:_local5, y:_local6, sx:_local5, sy:_local6});
_local2++;
};
_local1++;
};
_local1 = 0;
while (_local1 < (_vseg + 1)) {
_local2 = 0;
while (_local2 < (_hseg + 1)) {
_tri.push([_p[(_local2 + (_local1 * (_hseg + 2)))], _p[((_local2 + (_local1 * (_hseg + 2))) + 1)], _p[(_local2 + ((_local1 + 1) * (_hseg + 2)))]]);
_tri.push([_p[((_local2 + ((_local1 + 1) * (_hseg + 2))) + 1)], _p[(_local2 + ((_local1 + 1) * (_hseg + 2)))], _p[((_local2 + (_local1 * (_hseg + 2))) + 1)]]);
_local2++;
};
_local1++;
};
__render();
}
public function setTransform(_arg1:Number, _arg2:Number, _arg3:Number, _arg4:Number, _arg5:Number, _arg6:Number, _arg7:Number, _arg8:Number):void{
var _local9:Number;
var _local10:Number;
var _local11:Number;
var _local12:Number;
var _local13:Number;
var _local14:Number;
var _local15:Number;
var _local16:Object;
var _local17:*;
var _local18:*;
var _local19:*;
var _local20:*;
_local9 = _w;
_local10 = _h;
_local11 = (_arg7 - _arg1);
_local12 = (_arg8 - _arg2);
_local13 = (_arg5 - _arg3);
_local14 = (_arg6 - _arg4);
_local15 = _p.length;
while (--_local15 > -1) {
_local16 = _p[_local15];
_local17 = ((_local16.x - _xMin) / _local9);
_local18 = ((_local16.y - _yMin) / _local10);
_local19 = (_arg1 + (_local18 * _local11));
_local20 = (_arg2 + (_local18 * _local12));
_local16.sx = (_local19 + (_local17 * ((_arg3 + (_local18 * _local13)) - _local19)));
_local16.sy = (_local20 + (_local17 * ((_arg4 + (_local18 * _local14)) - _local20)));
};
__render();
}
private function __render():void{
var _local1:Number;
var _local2:Array;
var _local3:*;
var _local4:*;
var _local5:Object;
var _local6:Graphics;
var _local7:Array;
var _local8:Number;
var _local9:Number;
var _local10:Number;
var _local11:Number;
var _local12:Number;
var _local13:Number;
var _local14:Number;
var _local15:Number;
var _local16:Number;
var _local17:Number;
var _local18:Number;
var _local19:Number;
var _local20:Number;
_local6 = _s.graphics;
_local6.clear();
_sMat = new Matrix();
_tMat = new Matrix();
_local8 = _tri.length;
while (--_local8 > -1) {
_local7 = _tri[_local8];
_local3 = _local7[0];
_local4 = _local7[1];
_local5 = _local7[2];
_local9 = _local3.sx;
_local10 = _local3.sy;
_local11 = _local4.sx;
_local12 = _local4.sy;
_local13 = _local5.sx;
_local14 = _local5.sy;
_local15 = _local3.x;
_local16 = _local3.y;
_local17 = _local4.x;
_local18 = _local4.y;
_local19 = _local5.x;
_local20 = _local5.y;
_tMat.tx = _local15;
_tMat.ty = _local16;
_tMat.a = ((_local17 - _local15) / _w);
_tMat.b = ((_local18 - _local16) / _w);
_tMat.c = ((_local19 - _local15) / _h);
_tMat.d = ((_local20 - _local16) / _h);
_sMat.a = ((_local11 - _local9) / _w);
_sMat.b = ((_local12 - _local10) / _w);
_sMat.c = ((_local13 - _local9) / _h);
_sMat.d = ((_local14 - _local10) / _h);
_sMat.tx = _local9;
_sMat.ty = _local10;
_tMat.invert();
_tMat.concat(_sMat);
_local6.beginBitmapFill(_texture, _tMat, false, false);
_local6.moveTo(_local9, _local10);
_local6.lineTo(_local11, _local12);
_local6.lineTo(_local13, _local14);
_local6.endFill();
};
}
}
}//package mwelsh.geom