0

好吧,我正在尝试构建一个 FFT 音频可视化器,并且有两个问题可以让它变得更好。现在我有一些工作代码可以完成我想要的基本功能,但与往常一样,我想要更多。

这是我目前拥有的代码:

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 代码吗?还是将所有内容都放在第一帧上是更好的做法?

另外,我将如何简化酒吧的更新?现在我相信它会清除所有图形,并重新绘制所有内容,留下一个非常跳跃/闪烁的可视化器。我应该只绘制矩形然后缩放高度吗?或者有没有办法让频率值在当前值和下一个值之间转换?(现在我认为这是不可能的,因为如果它正在更新每一帧,你就不能在帧之间转换......)

提前致谢。

4

1 回答 1

0

好吧,我认为要实现你想要的,你必须重新设计和重新思考你的代码。

起初,我会删除您的 ENTER_FRAME 循环并改用 Timer - 这样您就不会依赖于帧速率。

其次,我会做这样的循环:

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

在 processData() 中,您可以执行所需的任何计算并将其保存以供以后在绘图期间使用。如果您愿意,您可以在 Google 上搜索 Game Loop 以了解更多信息。

如果您想保持简单,我建议您将条形高度保存在数组或向量中,然后使用此数据绘制条形。你甚至可以有两个数组——一个用于旧数据,一个用于当前迭代——这样你可以做出一些很好的效果,比如首先用旧数据绘制半透明条,然后在它们上面绘制新条。

这只是一堆想法,但希望这会有用:)

于 2014-04-18T12:46:59.630 回答