0

わかりました。FFT オーディオ ビジュアライザを作成しようとしていますが、改善するために 2 つの質問があります。今のところ、私が必要としているものの基本を実行するコードが少しありますが、いつものように、もっと多くのコードが必要です。

これが私が現在持っているコードです:

var s:Sound = new Sound(new URLRequest("mix 3 v1.mp3"));
s.play(0, 1);

var ba:ByteArray = new ByteArray();

addEventListener(Event.ENTER_FRAME, loop);
function loop(e:Event):void {
    graphics.clear();
    //Create ByteArray of song
    SoundMixer.computeSpectrum(ba, true);
    //For every 8 bytes to a max of 256
    for (var i:uint=0; i<256; i+=32) {
            var index = (i / 4);//or bitshift using i >> 3
            var num:Number = -ba.readFloat()*250;
                //Generate Bars
                graphics.beginFill(0xFFFF00);
                graphics.drawRect(191 + (index * 14), 500, 12, num-2);
    }
}

私が今欲しいのは、一定時間後に色を変えられるようにすることです。どうすればそれを行うことができますか?タイムラインのそのフレームに移動して、別の AS3 コードのセットを実行しますか? それとも、すべてをフレーム 1 のままにしておくほうがよいのでしょうか?

また、バーの更新を簡単にするにはどうすればよいですか? 今のところ、すべてのグラフィックスがクリアされ、すべてが再描画され、非常にビクビク/ちらつきのあるビジュアライザーになると思います。長方形を描いてから高さを調整するだけですか?または、現在の値と次の値の間で遷移する周波数値のバッファを作成する方法はありますか? (私が考えると、すべてのフレームを更新している場合、フレーム間を移行することはできません...)

前もって感謝します。

4

1 に答える 1

0

ええと、あなたが望むものを達成するには、コードを少し再設計して再考する必要があると思います.

最初に、ENTER_FRAME ループを削除し、代わりにタイマーを使用します。この方法では、フレーム レートに依存しません。

次に、ループを次のようにします。

function loop(e: TimerEvent): void
{
  processData();
  draw();
}

processData() では、必要な計算を実行し、後で描画中に使用できるように保存できます。必要に応じて、Game Loop をググって詳細を確認することもできます。

物事をシンプルに保ちたい場合は、バーの高さを配列またはベクトルに保存し、このデータを使用してバーを描画することをお勧めします。古いデータ用と現在の反復用の 2 つの配列を使用することもできます。このようにして、最初に古いデータで半透明のバーを描画し、その上に新しいバーを描画するなどの効果を得ることができます。

これはすべて単なるアイデアの集まりですが、これが役立つことを願っています:)

于 2014-04-18T12:46:59.630 に答える