2011-11-29 50 views
0

我已經創建了一個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; 

} 
+0

你能提供一個更好的故障描述嗎?也許在你使用兩個獨特的_a和_s(高頻vs低頻正弦波?)聲音的情況下進行測試,可以讓你在輸出圖中看到問題。 – AShelly

+0

對不起,我遲到了,但由於截止日期的原因,我不得不放棄這種做法。我很可能會在以後出於個人興趣回來。 –

回答

0

只是一個猜測:是不是fade總是不等於1你的問題的根源的事實?你可能會寫fade = i/(fadeStereoSamples - 1)

+0

對不起,它沒有工作。它實際上只決定兩個混合波形之間的音量。 –

0

你不想淡出_a並淡入_s?看起來你正在做相反的事情 - _a會越來越大聲。

另外,爲什麼你開始在_s的結尾,而不是開始?你不應該混淆_a的結尾和_s的開頭嗎?

我不確定爲什麼要將該部分描述爲循環。每次攻擊只能有一次轉換,對嗎?如果您多次撥打電話,_s會因您覆蓋它而變得更安靜和安靜。

+0

我寫了一個例子來解釋爲什麼我按照自己的方式褪色。希望能幫助到你。 :) –

+0

我從來沒有使用ActionScript,但我寫了一個MIDI合成器,所以我明白你想要解決什麼。我對代碼的最後一部分感到困惑,在這裏你將交叉漸變片段寫回到_s的尾部。在再次調用此函數之前,_s是否會從源重新加載?如果沒有,看起來你會逐漸混合越來越多的_a,將其從線性漸變變爲指數型漸變。 – AShelly

+0

或者這隻作爲預處理調用一次?在這種情況下,我會查看您的音頻API調用,因爲這看起來很合理。 – AShelly