0

背景:

我目前正在尝试使用 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 && i<=40) {.. .

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

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

我将努力提出自己的解决方案,但我会非常高兴能在这个问题上提供一些指导。

谢谢

4

1 回答 1

0

这没有意义:

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

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

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);
}
于 2014-04-09T08:17:41.423 回答