我做了一个简单的正弦波音调发生器。问题是当播放音调时可以听到强烈的咔嗒声,我需要实现快速淡入(攻击时间)以避免这种情况。
我尝试使用补间(如 tweenmax),但它会导致音频失真(可能是补间中的步骤?)。我发现了一些关于这个主题的模糊教程,但没有关于攻击时间的具体内容。
我怎样才能做到这一点?
我做了一个简单的正弦波音调发生器。问题是当播放音调时可以听到强烈的咔嗒声,我需要实现快速淡入(攻击时间)以避免这种情况。
我尝试使用补间(如 tweenmax),但它会导致音频失真(可能是补间中的步骤?)。我发现了一些关于这个主题的模糊教程,但没有关于攻击时间的具体内容。
我怎样才能做到这一点?
为了使渐变听起来平滑,它必须在您的合成循环内基于每个样本递增。补间引擎可能每秒更新多次,但您的耳朵仍然可以听到咔哒声。
在您的 sampleData 事件处理程序中,您必须将单个样本乘以一个体积修饰符,范围为 0 到 1,每个样本递增。
要快速淡入声音,首先将音量设置为 0,然后为每个样本添加一个小值,直到达到 1.0。您可以稍后将其扩展为更复杂的包络控制器。
这是您可能开始的粗略示例:
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。