0

インポートされたmp3サウンドサンプルを処理する仮想ピアノキーボードに取り組んでいます。この質問で解決策が見つかりましたが、以下のテストコードを実行すると、サウンドは各音源の最後のデータチャンクを永久にループします。明らかに、抽出されたサウンドデータの最後で停止する必要があります。抽出されたサンプルデータでも同じことが起こります。混合する必要はありません。動的に描画されるグラフィック波形を追加して、何が起こっているかを視覚的に確認できるようにしました。ByteArrayクラスを使用するのはこれが初めてなので、この問題を解決する方法がわかりません。

import flash.media.Sound;
import flash.utils.ByteArray;
import flash.geom.Point;
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.events.MouseEvent;

var t0:Sound = new Sound(new URLRequest("5_C.mp3")); //sound imported
var t1:Sound = new Sound(new URLRequest("5_E.mp3")); //other sound imported
//var t0:Sound = new C4(); //sound in library
//var t1:Sound = new E4(); //other sound in library
var t0p:Point = new Point();
var t1p:Point = new Point();
var t0a:ByteArray = new ByteArray();
var t1a:ByteArray = new ByteArray();
var mix:Sound = new Sound();

var spr:Sprite = new Sprite();
addChild(spr);
spr.y = 10;
var lx:Number = 0;
var ly:Number = 0;
spr.graphics.lineStyle(1,0,1,true);

mix.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);

stage.addEventListener(MouseEvent.CLICK, mce);
function mce(e:MouseEvent) {
    mix.play();
}

function onSampleData(e:SampleDataEvent):void {

    t0a.position = 0;
    t1a.position = 0;

    t0.extract(t0a, 3072);
    t1.extract(t1a, 3072);

    t0a.position = 0;
    t1a.position = 0;

    for(var i:int = 0; i < 3072; i++) {

        t0p.x = t0a.readFloat();
        t0p.y = t0a.readFloat();
        t1p.x = t1a.readFloat();
        t1p.y = t1a.readFloat();

        var tmp:Point = new Point(Math.max(Math.min(t0p.x + t1p.x, 1), -1), Math.max(Math.min(t0p.y + t1p.y, 1), -1));

        e.data.writeFloat(tmp.x); // left
        e.data.writeFloat(tmp.y); // right

        if (lx > 549) {
            lx = 0;
            ly += 10;
            if (ly > 399) {
                spr.graphics.clear();
                ly = 0;
                spr.graphics.lineStyle(1,0,1,true);
            }
            spr.graphics.moveTo(lx, (tmp.x + tmp.y) * 4 + ly);
        } else {
            spr.graphics.lineTo(lx, (tmp.x + tmp.y) * 4 + ly);
        }
        lx += 0.05;

    }
}

これには非常に簡単な解決策があるはずです。生データを処理した経験がないので、何か手伝っていただければ幸いです。

4

1 に答える 1

1

さて、私は数日前に解決策を考え出しました、私はちょうどそれをここに投稿する時間がありませんでした。

サウンドのByteArrayサンプルの長さを計算する簡単な方法はsamplesLength = sound.length * 44.1;です。

これは、サウンドの長さがミリ秒単位で表示されるためです。これは、1秒あたり1000ステレオサンプルペアであり、フラッシュ内のサウンドのサンプリング解像度は44100 Hz(1秒あたりのサンプルペアでもあります)であるため、44.1サンプルペアがレンダリングされます。短いミリ秒。

また、サンプルは32ビットのFloat値であり、サンプルペアの長さは64ビット(8バイト)なので、正しければ、ですsamplesLength = soundExtract.length / 8;

于 2011-11-25T16:16:06.740 に答える