我已經創建了一個SoundEnvelope類來保持分割攻擊/維持樣本對。該類還預處理維持環以與最後選擇的攻擊組塊的立體聲樣本量進行交叉淡入淡出,並對30毫秒的MP3編碼器偏移量進行調整以便正確播放。AS3:ByteArray聲音數據循環平滑問題
修剪和循環都是我的項目必不可少的。
現在,攻擊建立良好,順利進入維持循環,但循環似乎在最後跳過一些數據,似乎主要與交叉淡入效果有關,這可能是一個計時問題,但我似乎無法找到問題。
對於那些不熟悉動態處理聲音的人來說,這裏是function,我用一個if-else分叉的循環來判斷這個塊是否進入了我的SoundEnvelope實例的攻擊或維持變量。
[UPDATE]
@A Shelly:
在專業合成聲音包絡包括一個攻擊衰變維持釋放序列。在我的情況下,攻擊和衰減是相同的部分,並且釋放正在淡化持續的音量,需要順利地循環回去。
比方說,我們有去像tfweeeewweeeewweeeewweeeep原始小號樣品,和我的提取物包括_a
= [tfweeeew]和_s
= [weeeewweeeewwe]部分。現在,這可以是任何樣本,我在這裏使用統一的0.5秒攻擊和1.0秒維持循環。因此,爲了讓聲音連續不斷,我需要淡出循環的結尾,因爲它與自己的開始不匹配,並且同時淡入攻擊部分的末端部分,這將使樣本平鋪無縫。當然,這會產生樣品的端點略有breathiness,但它仍然不是它彈出,而循環像... deewdeewdeewdeewdeew更好...
[CODE]
這裏的循環功能,我真的希望有人能幫助我,在此先感謝:
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(高頻vs低頻正弦波?)聲音的情況下進行測試,可以讓你在輸出圖中看到問題。 – AShelly
對不起,我遲到了,但由於截止日期的原因,我不得不放棄這種做法。我很可能會在以後出於個人興趣回來。 –