私は、SoundEnvelopeクラスを作成して、分割アタック/サステインサンプルペアを維持しました。また、サスペンドループを前処理して、最後に選択したアタックチャンクのステレオサンプルとクロスフェードし、30 msのMP3エンコーダオフセットを適切な再生のためにトリミングします。AS3:ByteArrayサウンドデータループスムージング問題
私のプロジェクトではトリミングとループの両方が不可欠です。
攻撃がスムーズにサステインループに入りますが、ループが最後にデータをスキップしているように見えますが、クロスフェーディング効果と関連しているようですが、私は問題を見つけることができないようです。
ダイナミックに処理されたサウンドに精通していない人には、functionがあります。私はチャンクが私のSoundEnvelopeインスタンスのアタックまたはサスペンドに入るかどうかを判断するためにif-elseフォークを使用しています。
[UPDATE]
@A Shelly:
プロシンセサイザーでの音のエンベロープは、アタック・ディケイ・サステインリリース配列からなります。私の場合、攻撃と崩壊は同じ部分であり、リリースはサスペンドのボリュームをフェードアウトさせているだけで、スムーズにループバックする必要があります。
_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;
}
グリッチについて詳しく説明できますか?おそらく、_aと_sの2つの特有のサウンド(高周波数対低周波数の正弦波)を使用するテストを行うと、出力のプロットで問題を見ることができます。 – AShelly
遅れて申し訳ありませんが、締め切りのためにこのアプローチを止めなければなりませんでした。私は後で個人的な関心からそれに戻ってくるだろう。 –