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 を「グローバル」にし、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 に答える