2011-11-29 26 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