简化Visualizer的AS3代码

时间:2014-04-08 20:27:02

标签: actionscript-3 flash simplify visualizer

背景

我目前正在尝试使用Flash和AS3为音乐创建频率可视化器(出于各种原因)。我对AS3来说是全新的,对Flash来说有些新手,但是有一些javascript的背景知识,这对我的帮助有很大帮助。无论如何,我有这个代码,我已经修改了一个教程,为每个频率范围的幅度创建条形。

然而,因为我希望它首先工作,所以我可能使用计算每个柱的效率最低的方法。

守则:

import flash.media.Sound;
import flash.net.URLRequest;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.display.FrameLabel;

var s:Sound = new Sound(new URLRequest("Mix 1 v4.mp3"));
s.play(0, 1);

var ba:ByteArray = new ByteArray();

addEventListener(Event.ENTER_FRAME, loop);
function loop(e:Event):void {
    graphics.clear();
    graphics.beginFill(0xFFFF00);
    graphics.drawRect(0, 502, 1280, 4);
    SoundMixer.computeSpectrum(ba, true);
    for (var i:uint=0; i<256; i+=8) {
        if (i<=8) {
        var num:Number = -ba.readFloat()*250;
        graphics.beginFill(0xFFFF00);
        graphics.drawRect(110, 500, 32, num);
        }
        if (i>8 && i<=16) {...

代码继续增加每个if语句8和每个drawRect(110(34 * x),500 ......)

我正在寻找的是使computeSpectrum和ByteArray“全局”并且为每个频率值部分自动绘制图形的方法,而不是具有32个if的实例(i> 32&amp;&amp; i&lt; = 40){...

总而言之,此代码有效。但这绝对不是正确的,至少从我有限的经验来看(我想这可能会让你们中的一些人感到畏缩。)

我意识到可能有一种方法可以简化它,但是很难弄清楚从哪里开始,并且当你不知道自己在做什么时调试很令人沮丧(我确信我们都在那里在某一点上)

我将努力提出自己的解决方案,但我对此问题的一些指导非常满意。

由于

1 个答案:

答案 0 :(得分:0)

这没有意义:

for (var i:uint=0; i<256; i+=8) {
    if (i<=8) ...
    if (i>8 && i<=16) ...

您不需要if语句,知道我在每个循环中的内容,因此您可以将其简化为:

for (var i:uint=0; i<256; i+=8)
{
    var index = (i / 8);//or bitshift using i >> 3
    var num:Number = -ba.readFloat()*250;
    graphics.beginFill(0xFFFF00);
    graphics.drawRect(110 + (index * 32), 500, 32, num);
}