音波形に対応したサウンドボタン
※soundボタンをクリックすると音が鳴るので注意。
サウンドスペクトラムを使って、音にシンクロしたサウンドボタン用のクラスを作ってみた。最初にsetPixel()でピクセルを描画しておいて、スペクトラム波形に合わせてscaleYを変化させてます。下記がそのクラスファイル。
SoundSpectrum.as
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.media.SoundMixer;
import flash.utils.ByteArray;
public class SoundSpectrum extends Sprite
{
private var lineNum:uint;
private var lineHeight:uint;
private var lineInterval:uint;
private var bmAry:Array = [];
//------------------------------
// コンストラクタ
//------------------------------
public function SoundSpectrum(targetNum:uint = 5, targetHeight:uint = 20, targetInterval:uint = 1, targetColor:uint = 0x000000)
{
lineNum = targetNum;
lineHeight = targetHeight;
lineInterval = targetInterval;
this.addEventListener(Event.ENTER_FRAME, onRender);
//-----[ピクセルの描画]
var bmd:BitmapData;
var bm:Bitmap;
for (var i = 0; i <lineNum; i++)
{
bmd = new BitmapData(1, 100);
bm = new Bitmap(bmd);
this.addChild(bm);
bm.x = i * (lineInterval + 1);
bmd.setPixel(0, 0, targetColor);
bmAry.push(bm);
}
bmd.dispose();
}
//------------------------------
// レンダー
//------------------------------
private function onRender(e:Event):void
{
var count:uint = 256 / lineNum;
var value:Number;
var ba:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(ba, false, 0);
for (var i:uint = 0; i <256; i++)
{
value = -ba.readFloat() * lineHeight - 1;
for (var j:uint = 0; j <lineNum; j++)
{
if (i == Math.floor(count * j)) bmAry[j].scaleY = value;
}
}
}
}
}
続いてドキュメントクラスには以下のように記述します。引数はSoundSpectrum(ラインを何本にするか, ラインの最大高さ, ラインの間隔, ラインの色)となります。インスタンス化した後にx,yプロパティを与えてaddChild()でステージに配置。デフォルトで数値を持たしているので、カスタマイズしたくない場合は引数なしでも大丈夫です。
soundBtn.addChild(sp);
sp.x = 32;
sp.y = 10;




