actionscript-3 - 如何为声音对象编写音频包络(起音时间、淡入)?

标签 actionscript-3 api audio sound-synthesis

我制作了一个简单的正弦波音调发生器。问题是,当播放音调时,可以听到强烈的咔哒声,我需要实现快速淡入(起音时间)以避免这种情况。

我尝试使用补间(如 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/

相关文章:

apache-flex - 类引用和类实例之间的区别

flash - 将 ...rest 传递给 NetConnection 调用

Python request.post 不接受字典

actionscript-3 - 如何在动态创建的 Flash 舞台上获取 MovieClip 的名称?

xml - Flex 和嵌入式 XML

node.js - 我的node.js流代码有什么问题?

audio - 如何将实时RTMP视频转换为实时mp3 Icecast流

iphone - 如何在iOS中将音频数据转换为NSString?

java - Java SE 7 何时发布?

java - 用于 Java 的 Mercurial API?