Pretty Music
13/04/2008Just an experiment using the SoundMixer and BitmapData class.
Source code:
Actionscript:
-
package {
-
-
import flash.display.MovieClip;
-
import flash.media.Sound;
-
import flash.media.SoundChannel;
-
import flash.media.SoundMixer;
-
import flash.net.URLRequest;
-
import flash.events.Event;
-
import flash.events.ProgressEvent;
-
import flash.display.Bitmap;
-
import flash.display.BitmapData;
-
import flash.utils.ByteArray;
-
import flash.geom.Rectangle;
-
import flash.geom.Point;
-
import flash.filters.BlurFilter;
-
import flash.text.TextField;
-
import flash.text.TextFormat;
-
-
public class Main extends MovieClip {
-
-
public var sound:Sound;
-
public var soundChannel:SoundChannel;
-
public var byteArray:ByteArray;
-
public var bmp:Bitmap;
-
public var bmpData:BitmapData;
-
public var rect:Rectangle;
-
public var pt:Point;
-
public var blur:BlurFilter;
-
public var loadDisplay:TextField;
-
-
public function Main() {
-
sound = new Sound(new URLRequest("sound.mp3"));
-
sound.addEventListener(ProgressEvent.PROGRESS,soundLoading);
-
sound.addEventListener(Event.COMPLETE,soundLoaded);
-
-
byteArray = new ByteArray();
-
-
bmpData = new BitmapData(550,400,false,0xFF000000);
-
bmp = new Bitmap(bmpData);
-
addChild(bmp);
-
-
rect = new Rectangle(0,0,550,200);
-
pt = new Point(0,0);
-
blur = new BlurFilter(10,10,1);
-
-
loadDisplay = new TextField();
-
loadDisplay.x = 215;
-
loadDisplay.y = 190;
-
loadDisplay.selectable = false;
-
addChild(loadDisplay);
-
-
-
}
-
public function soundLoaded(e:Event){
-
soundChannel = sound.play(0,1000);
-
addEventListener(Event.ENTER_FRAME,enterFrame);
-
removeChild(loadDisplay);
-
}
-
public function soundLoading(e:ProgressEvent){
-
bmpData.fillRect(new Rectangle(0,0,550,400),0xFFFF0000);
-
loadDisplay.text = "Loading ("+Math.round((e.bytesLoaded/e.bytesTotal)*100)+"%)";
-
}
-
-
public function enterFrame(e:Event) {
-
SoundMixer.computeSpectrum(byteArray,true,0);
-
bmpData.scroll(0,10);
-
for (var i=0; i <256; i+=2) {
-
var a:Number = byteArray.readFloat();
-
var num:Number = a*500;
-
var r:Rectangle = new Rectangle(i*2.2,1,a*40,a*40);
-
bmpData.fillRect(r,0xFF0000|num <<8);
-
}
-
bmpData.applyFilter(bmpData,rect,pt,blur);
-
}
-
-
}
-
}
There are 3 comments in this article: