两个AS3问题 - Audio Visualizer

时间:2014-04-17 18:37:02

标签: actionscript-3 flash audio visualizer

好吧,我正在尝试构建一个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代码吗?或者更好的做法是将所有内容放在第一帧上?

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

首先,我会删除你的ENTER_FRAME循环并使用Timer - 这样你就不会依赖帧速率。

其次,我会循环看这样的事情:

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

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

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

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