Упростите код AS3 для визуализатора

Справочная информация:

В настоящее время я пытаюсь создать частотный визуализатор для музыки с использованием 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) {.. .

В общем, этот код работает. Но это определенно неверно, по крайней мере, исходя из моего ограниченного опыта (я полагаю, это, вероятно, заставит некоторых из вас съежиться).

Я понимаю, что, вероятно, есть способ упростить это, но трудно понять, с чего начать, и неприятно отлаживать, когда вы не знаете, что делаете (я уверен, что мы все были там в какой-то момент )

Я буду работать над тем, чтобы придумать собственное решение, но был бы очень рад получить некоторые рекомендации по этому вопросу.

Спасибо


person G-Schmu    schedule 08.04.2014    source источник
comment
Метод computeSpectrum работает с глобальными звуками, а не только с воспроизведением mp3. Я бы предложил полностью отказаться от этого и изучить это. marinbezhanov.com/web-development/14/   -  person The_asMan    schedule 09.04.2014
comment
Я ценю это предложение, но это не совсем то, что я ищу (по крайней мере, насколько я могу судить по беглому просмотру всех ссылок). Мне нужно представление каждой частоты в реальном времени. В основном я пытаюсь имитировать это, с большим контролем .   -  person G-Schmu    schedule 09.04.2014
comment
Я хочу сказать, что код есть. Как вы представляете / графически изображаете данные, зависит от вас. Вы сказали, что вы новичок в AS3, поэтому я снова предлагаю вам взять этот код и изменить его, чтобы он работал так, как вы хотите.   -  person The_asMan    schedule 09.04.2014
comment
Вам не нужно контролировать результаты. Если у звука низкие высокие частоты, зачем настраивать результат так, чтобы он выглядел выше слышимого? Визуальные эффекты должны соответствовать ушам. Также с помощью computeSpectrum учитывайте визуальную разницу между установкой FFT = true и false (время и частота доменов). И да, потеряйте if утверждения (ненужные вычисления)   -  person VC.One    schedule 10.04.2014


Ответы (1)


В этом нет смысла:

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);
}
person DFreeman    schedule 09.04.2014
comment
Я знал, что это будет что-то простое. Я думал, что пробовал сделать что-то подобное, но когда я попытался сделать это, по какой-то причине я не брал следующую часть поплавка для каждого бара. Спасибо. - person G-Schmu; 11.04.2014