3

サウンド オブジェクトをミックスしてライブ再生する方法の優れたデモをいくつか見つけました。以下の実際の例を参照してください...

しかし、再生せずにプログラムで実行して、混合ファイルを出力することはできますか? また、途中でボリューム変更情報を追加する予定なので、再生バッファーの仕組みのように小さなチャンクで追加する必要があります。

[Embed(source = "audio/track01.mp3")] 
private var Track1:Class;       
[Embed(source = "audio/track02.mp3")] 
private var Track2:Class;       
[Embed(source = "audio/track03.mp3")] 
private var Track3:Class;
[Embed(source = "audio/track04.mp3")] 
private var Track4:Class;[Embed(source = "AudioMixerFilter2.pbj",mimeType = "application/octet-stream")]
private var EmbedShader:Class;

private var shader:Shader = new Shader(new EmbedShader());

private var sound:Vector.<Sound> = new Vector.<Sound>();    
private var bytes:Vector.<ByteArray> = new Vector.<ByteArray>();
private var sliders:Vector.<Number> = new Vector.<Number>();

private var sliderVol:int = 1;

private var BUFFER_SIZE:int = 0x800;

public var playback:Sound = new Sound();

public function startAudioMixer(event:FlexEvent):void{


    sound.push(new Track1(), new Track2(), new Track3(), new Track4());
    sliders.push(sliderVol,sliderVol,sliderVol,sliderVol);

    playback.addEventListener(SampleDataEvent.SAMPLE_DATA, onSoundData);
    playback.play();
}

private function onSoundData(event:SampleDataEvent):void {

    for(var i:int = 0; i < sound.length; i++){
        bytes[i] = new ByteArray();
        bytes[i].length = BUFFER_SIZE * 4 * 2;
        sound[i].extract(bytes[i], BUFFER_SIZE);                

        var volume:Number = 0;
        bytes[i].position = 0;  

        for(var j:int = 0; j < BUFFER_SIZE; j++){
            volume += Math.abs(bytes[i].readFloat());
            volume += Math.abs(bytes[i].readFloat());                   
        }



        volume = (volume / (BUFFER_SIZE * .5)) * sliderVol; // SLIDER VOL WILL CHANGE       

        shader.data['track' + (i + 1)].width    = BUFFER_SIZE / 1024;
        shader.data['track' + (i + 1)].height   = 512;
        shader.data['track' + (i + 1)].input    = bytes[i];
        shader.data['vol'   + (i + 1)].value    = [sliders[i]];

    }

    var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE / 1024,512);
    shaderJob.start(true);
}       
4

1 に答える 1

0

最も簡単な方法は、Pixel Bender のことを忘れることです。

サウンドがロードされたら、Sound.extract を使用する ENTER_FRAME を使用して各サウンドから小さい ByteArray を取得し、抽出された 4 つの ByteArrays すべてを読み取り、いくつかの基本的な計算を行って左右の信号の「混合」値に到達します。これらの値を「最終/混合/出力」ByteArray に書き込みます。サウンドの最後に到達するまで、各フレームでこのプロセスを繰り返します。サウンドの長さがすべて同じでない場合は、それを処理する方法も考える必要があります。

各トラックの振幅が時間とともに変化するミックスを実行する必要がある場合、それは良い挑戦ですが、セットアップに時間がかかります。

作業中は、Andre Michelle の Tonfall プロジェクトをチェックしてください... これは複雑ですが、AS3 でのオーディオのイン/アウトを理解することから始めるのに最適な場所です。

于 2012-07-17T19:38:37.350 に答える