2011-11-29 12 views
0

私は、SoundEnvelopeクラスを作成して、分割アタック/サステインサンプルペアを維持しました。また、サスペンドループを前処理して、最後に選択したアタックチャンクのステレオサンプルとクロスフェードし、30 msのMP3エンコーダオフセットを適切な再生のためにトリミングします。AS3:ByteArrayサウンドデータループスムージング問題

私のプロジェクトではトリミングとループの両方が不可欠です。

攻撃がスムーズにサステインループに入りますが、ループが最後にデータをスキップしているように見えますが、クロスフェーディング効果と関連しているようですが、私は問題を見つけることができないようです。

ダイナミックに処理されたサウンドに精通していない人には、functionがあります。私はチャンクが私のSoundEnvelopeインスタンスのアタックまたはサスペンドに入るかどうかを判断するためにif-elseフォークを使用しています。

[UPDATE]

@A Shelly:プロシンセサイザーでの音のエンベロープは、アタック・ディケイ・サステインリリース配列からなります。私の場合、攻撃と崩壊は同じ部分であり、リリースはサスペンドのボリュームをフェードアウトさせているだけで、スムーズにループバックする必要があります。

たちは tfweeeewweeeewweeeewweeeepようになり、生のトランペットのサンプルを持っている、のは言ってみましょう、と私の抽出物は、 _a = [tfweeeew]_s = [weeeewweeeewwe]部分から構成されています。さて、これはどのサンプルでもかまいません。ここでは、均一な0.5秒の攻撃と1.0秒のサステインループを使用しています。それで、音を連続的にするには、ループの終わりをフェードアウトさせる必要があります。それは、それ自身の先頭に一致しないので、攻撃部分の終わり部分を同時にフェードインするので、サンプルタイリングがシームレスになります。ここで

[CODE]

がループです...もちろん、これはサンプルのエンドポイントのわずかな気息性をもたらすだろうが、それはまだdeewdeewdeewdeewdeew ... のようにループしながら、それはポップ持つよりはましです機能、私は本当に誰かが私を助けることを願って、事前に感謝:

public function fadeLoop(fadeStereoSamples:uint):void { 

    var volume:Number; 
    var helper:ByteArray = new ByteArray(); 
    var fade:Number; 

    // moves the pointer to the overlapping part's beginning of sustain and attack ByteArrays 
    // _a and _s are the two chunk arrays in the SoundEnvelope object 
    _a.position = _a.length - fadeStereoSamples * 8; 
    _s.position = _s.length - fadeStereoSamples * 8; 

    // crossfade through input amount of sample-pairs 
    for (var i:uint = 0; i < fadeStereoSamples; i++) { 

     fade = i/fadeStereoSamples; 

     // fadestep left 
     helper.writeFloat(_a.readFloat() * fade + _s.readFloat() * (1 - fade)); 
     // fadestep right 
     helper.writeFloat(_a.readFloat() * fade + _s.readFloat() * (1 - fade)); 

    } 

    _s.position = _s.length - fadeStereoSamples * 8; 

    for (i = 0; i < fadeStereoSamples; i++) { 

     helper.position = 0; 

     _s.writeFloat(helper.readFloat()); 
     _s.writeFloat(helper.readFloat()); 

    } 

    _a.position = 0; 
    _s.position = 0; 

} 
+0

グリッチについて詳しく説明できますか?おそらく、_aと_sの2つの特有のサウンド(高周波数対低周波数の正弦波)を使用するテストを行うと、出力のプロットで問題を見ることができます。 – AShelly

+0

遅れて申し訳ありませんが、締め切りのためにこのアプローチを止めなければなりませんでした。私は後で個人的な関心からそれに戻ってくるだろう。 –

答えて

0

ただの推測では:fadeはあなたの問題の1人の起源に等しいことがないという事実ではないでしょうか?あなたはおそらくfade = i/(fadeStereoSamples - 1)と書くかもしれません。

+0

申し訳ありませんが、動作しませんでした。実際には、2つの混合波形間の音量のみを決定します。 –

0

_aをフェードアウトして_sをフェードインしようとしていませんか?あなたが反対をしているように見えます - _aは最後に向かって大きくなります。

また、最初ではなく、_sの最後から始めるのはなぜですか? _aの終わりと_sの始まりを混同してはいけませんか?

なぜ、あなたはそのセクションをループとして記述しているのか分かりません。攻撃ごとに1つのトランジションのみが必要です。複数回呼び出すと、上書きしているので、_sは静かになり静かになります。

+0

私は私がそれを退色させる理由を説明するための例を書いた。それが役に立てば幸い。 :) –

+0

私はActionScriptを使用したことはありませんが、私はMIDIシンセを書いているので、あなたが解決しようとしていることを理解しています。コードの最後の部分で混乱しています。そこでは、クロスフェードされたセグメントを_sの末尾に書き戻します。この関数を再度呼び出す前に、_sがソースからリロードされますか?そうでない場合は、線形フェードから指数関数的に変化するようになるにつれ、ますます多くの_aを混合するように見えます。 – AShelly

+0

これは前処理として一度だけ呼び出されますか?この場合、私はあなたのオーディオAPIコールを見ていますが、これは妥当と思われます。 – AShelly

関連する問題