好吧,我正在尝试构建一个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代码吗?或者更好的做法是将所有内容放在第一帧上?
另外,我如何轻松更新酒吧?现在我相信它会清除所有图形,并重绘所有内容,留下一个非常跳跃/闪烁的可视化器。我应该只绘制矩形然后缩放高度吗?或者有没有办法使频率值的缓冲区在当前值和下一个值之间转换? (现在我认为它不是真的可能导致如果它每帧更新,你就不能在帧之间转换......)
提前致谢。
答案 0 :(得分:0)
好吧,我认为要实现你想要的,你必须重新设计并重新思考你的代码。
首先,我会删除你的ENTER_FRAME循环并使用Timer - 这样你就不会依赖帧速率。
其次,我会循环看这样的事情:
function loop(e: TimerEvent): void
{
processData();
draw();
}
在processData()中,您可以执行所需的任何计算并将其保存,以便以后在绘图期间使用。如果您愿意,可以google for Game Loop来了解更多信息。
如果你想保持简单,我可以建议你在数组或向量中保存条形高度,然后使用这些数据绘制条形图。你甚至可能有两个数组 - 一个用于旧数据,一个用于当前迭代 - 这样你可以做出一些很好的效果,比如先用旧数据绘制半透明条,然后在它们上面绘制新数据。
这只是一堆想法,但希望这会有用:)