背景
我目前正在尝试使用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){...
总而言之,此代码有效。但这绝对不是正确的,至少从我有限的经验来看(我想这可能会让你们中的一些人感到畏缩。)
我意识到可能有一种方法可以简化它,但是很难弄清楚从哪里开始,并且当你不知道自己在做什么时调试很令人沮丧(我确信我们都在那里在某一点上)
我将努力提出自己的解决方案,但我对此问题的一些指导非常满意。
由于
答案 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);
}