gpt4 book ai didi

actionscript-3 - 如何为声音对象编码音频包络(攻击时间,淡入)?

转载 作者:行者123 更新时间:2023-12-02 22:28:21 24 4
gpt4 key购买 nike

我做了一个简单的正弦波音调发生器。问题在于,播放音调时会听到强烈的喀哒声,因此我需要执行快速淡入(攻击时间)以避免这种情况。

我尝试使用补间(例如tweenmax),但它会导致音频失真(也许是补间中的步骤?)。我发现有关该主题的一些模糊教程,但没有明确涉及攻击时间。

我怎样才能做到这一点?

最佳答案

为了使淡入淡出听起来平滑,必须在合成循环内以每个样本为基础对其进行递增。补间引擎每秒可能会更新多次,但是您的耳朵仍然可以通过单击听到其变化。

在sampleData事件处理程序中,您将必须将单个样本乘以音量修改器,范围为0到1,每个样本递增。

要快速淡入声音,请先将音量设置为0,然后为每个采样添加一个小值,直到达到1.0。您以后可以将其扩展为更复杂的信封 Controller 。

这是一个大概的例子:

for( i = 0; i < length; i++ ) {
_count++;
factor = _frequency * Math.PI * 2 / 4400;
volume += 1.0 / 4400;
if( volume > 1.0 ) volume = 1.0; //don't actually do it like this, ok?
n = Math.sin( (_count) * factor ) * volume;
_buffer.writeFloat(n);
_buffer.writeFloat(n);
}

注意:我尚未测试此代码段,也不建议将其用于生产。只是为了向您大致说明我的意思。

另一种可能对您有用的技术是减轻音量/延迟音量。使用volumeEase变量,该变量始终以一定速度“追赶”目标音量。这将防止在更改音量时产生咔嗒声,并可用于制作更长的信封:
var volume:Number = 0; // the target volume
var volumeEase:Number = 1.0; // the value to use in the signal math
var volumeEaseSpeed:Number = 0.001; // tweak this to control responsiveness of ease

for( i = 0; i < length; i++ ) {
_count++;

// bring the volumeEase closer to the target:
volumeEase += ( volume - volumeEase ) * volumeEaseSpeed;

factor = _frequency * Math.PI * 2 / 4400;

//use volumeEase in the maths, rather than 'volume':
n = Math.sin( (_count) * factor ) * volumeEase;
_buffer.writeFloat(n);
_buffer.writeFloat(n);
}

如果需要,可以使用线性插值,然后以恒定的速度“朝”目标移动。

再次,该代码段未经过测试,因此您可能需要调整volumeEaseSpeed。

关于actionscript-3 - 如何为声音对象编码音频包络(攻击时间,淡入)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com