2008.04.28
category
comments

音波形に対応したサウンドボタン

※soundボタンをクリックすると音が鳴るので注意。
サウンドスペクトラムを使って、音にシンクロしたサウンドボタン用のクラスを作ってみた。最初にsetPixel()でピクセルを描画しておいて、スペクトラム波形に合わせてscaleYを変化させてます。下記がそのクラスファイル。

SoundSpectrum.as

ACTIONSCRIPT:
package info.five.ui
{
    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()でステージに配置。デフォルトで数値を持たしているので、カスタマイズしたくない場合は引数なしでも大丈夫です。

ACTIONSCRIPT:
var sp:SoundSpectrum = new SoundSpectrum(8, 30, 1, 0x000000);
soundBtn.addChild(sp);
sp.x = 32;
sp.y = 10;

Post a comment




Comment

Trackbacks

この記事のコメント・トラックバックRSS