如何在没有点击的情况下在AS3中生成正弦波?

时间:2014-07-03 19:37:56

标签: actionscript-3 api haxe sound-synthesis

我已经开始使用声音来合成音频,我不知道为什么我会在声音中听到那些嘈杂的咔嗒声?

我的循环是:

for(i in 0...2048)
{
var phase:Float = position / 44100.0 * Math.PI * 2;
position+=1;
sample = Math.sin(phase * v);   // where v varies between 200 to 400
event.data.writeFloat(sample); // left
event.data.writeFloat(sample); // right
}

有什么想法吗?

修改

我需要做的是在循环内插入频率:

var phaserad:Float= 2*Math.PI/44100;
var delta:Float = current_v - new_v;
var p:Int= 2048;
for(i in 0...2048)
{
p--;
v = new_v + delta * (p / 2048); // v will interpolate from current_v to new_v
position += v * phaserad;
sample = Math.sin(position);    
event.data.writeFloat(sample); // left
event.data.writeFloat(sample); // right
}

current_v = new_v;

但是,我听不到任何声音,我尝试了另一种方法:

var delta:Float = current_v - new_v;
var p:Int= 2048;

for(i in 0...2048)
{
var phase:Float = position / 44100.0 * Math.PI * 2;
position+=1;

p--;
v = new_v + delta * (p / 2048); // v will interpolate from current_v to new_v

sample = Math.sin(phase * v);   // where v varies between 200 to 400
event.data.writeFloat(sample); // left
event.data.writeFloat(sample); // right
}

但是,频率会继续上升,并且不会停在预期的new_v

2 个答案:

答案 0 :(得分:0)

如果你想要一个连续的正弦波,你的相位需要从0 - >; 360 - > 0 - > 360度等。

答案 1 :(得分:0)

您的wave生成器设置正确,但保存position的方法要求v保持不变,position保持不变。根据您对v的描述,您会在播放过程中以某种方式更改它,但更改v会导致正弦形式中断。因此,不应从头开始重新计算position,而应根据v累加相位并添加当前位移,以接收不间断的波形。

const phaserad:Number=2*Math.PI/44100;
for(var i:int=0;i<2048;i++)
{
    position+=v*phaserad; // requires this var to be "Number" type
    sample = Math.sin(position);   // where v varies between 200 to 400
    event.data.writeFloat(sample); // left
    event.data.writeFloat(sample); // right
}