オーディオスペクトラム
MP3のスペクトラムを作成しました。
これが、一番単純な形だと思います。
MP3の素材は、Methuselah様より使わせていただきました。
サンプルはこちら(注意:音がでます)。
以下がソースです。
(2009/3 ソース書き直しました。)
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.media.Sound;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[SWF(backgroundColor="#000000")]
public class Main extends Sprite
{
private var bytes:ByteArray;
private var spectrum:Array;
private var bmpd:BitmapData;
private var bmp:Bitmap;
public function Main()
{
stage.frameRate=40;
stage.quality=StageQuality.HIGH;
stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
bytes=new ByteArray();
spectrum=new Array();
bmpd=new BitmapData(1000, 600, false, 0x111111);
bmp=new Bitmap(bmpd);
addChild(bmp);
bmp.x=(stage.stageWidth - bmp.width) / 2;
bmp.y=(stage.stageHeight - bmp.height) / 2;
stage.addEventListener(Event.RESIZE, onResize);
var sound:Sound=new Sound();
sound.addEventListener(Event.COMPLETE, onComplete);
sound.load(new URLRequest("sound.mp3"));
}
private function onResize(e:Event):void
{
bmp.x=(stage.stageWidth - bmp.width) / 2;
bmp.y=(stage.stageHeight - bmp.height) / 2;
}
private function onComplete(e:Event):void
{
(e.target as Sound).play();
addEventListener(Event.ENTER_FRAME, makeSpectrum);
}
public function makeSpectrum(e:Event):void
{
bmpd.fillRect(bmpd.rect, 0x111111);
SoundMixer.computeSpectrum(bytes, true, 0);
for (var i:int=0; i < 256; ++i)
spectrum[i]=bytes.readFloat();
for (var i:int=0; i < 256; ++i)
{
var h:int=400 * spectrum[i];
bmpd.fillRect(new Rectangle(i * 3 + 100, 500 - h, 3, h), HSBtoRGB(i / 256, 1, 1));
}
}
private function HSBtoRGB(hue:Number, saturation:Number, brightness:Number):uint
{
var r:int=0;
var g:int=0;
var b:int=0;
if (saturation == 0)
{
r=g=b=brightness * 255.0 + 0.5;
}
else
{
var h:Number=(hue - Math.floor(hue)) * 6.0;
var f:Number=h - Math.floor(h);
var p:Number=brightness * (1.0 - saturation);
var q:Number=brightness * (1.0 - saturation * f);
var t:Number=brightness * (1.0 - (saturation * (1.0 - f)));
switch (int(h))
{
case 0:
r=brightness * 255.0 + 0.5;
g=t * 255.0 + 0.5;
b=p * 255.0 + 0.5;
break;
case 1:
r=q * 255.0 + 0.5;
g=brightness * 255.0 + 0.5;
b=p * 255.0 + 0.5;
break;
case 2:
r=p * 255.0 + 0.5;
g=brightness * 255.0 + 0.5;
b=t * 255.0 + 0.5;
break;
case 3:
r=p * 255.0 + 0.5;
g=q * 255.0 + 0.5;
b=brightness * 255.0 + 0.5;
break;
case 4:
r=t * 255.0 + 0.5;
g=p * 255.0 + 0.5;
b=brightness * 255.0 + 0.5;
break;
case 5:
r=brightness * 255.0 + 0.5;
g=p * 255.0 + 0.5;
b=q * 255.0 + 0.5;
break;
}
}
return (r << 16) | (g << 8) | (b << 0);
}
}
}
| 固定リンク

コメント