我正在尝试使用createBuffer()创建一个正弦波。喜欢以下代码。
var TWOPI = Math.PI * 2;
var Sinewave = function(freq, amp, phase){
var self = this;
this.src;
this.init = function(){
var osc = new self.Osc(phase);
var buffer = ac.createBuffer(1, osc.samplerate, osc.samplerate);
var buffering = buffer.getChannelData(0);
for(i = 0; i < buffering.length; i++){
buffering[i] = amp * this.sinetick(osc, freq);
}
this.src = ac.createBufferSource();
this.src.buffer = buffer;
this.src.loop = true;
this.src.connect(contect.destination);
}
this.Osc = function(_phase){
this.samplerate = context.sampleRate;
this.twopiovsr = TWOPI/this.samplerate;
this.curfreq = 0;
this.curphase = _phase;
this.incr = 0.0;
}
this.sinetick = function(osc, freq){
var val = Math.sin(osc.curphase);
if(osc.curfreq != freq){
osc.curfreq = freq;
osc.incr = osc.twopiovsr * freq;
}
osc.curphase += osc.incr;
if(osc.curphase >= TWOPI){
osc.curphase -= TWOPI;
}
if(osc.curphase < 0.0){
osc.curphase += TWOPI;
}
return val;
}
this.play = function(duration){
this.src.start(0);
this.src.stop(duration);
}
}
这只包含正弦波函数,但我也成功实现了其他形状。 首先是设置相位偏移的原因,如果有更好的选择,请给我一个通知。
因此,当我通过示波器观察输出信号时,它们看起来应该如何。但是,当我尝试使用上面的代码创建的信号调制常规createOscillator节点的频率时,输出并不漂亮。当常规的createOscillators节点fm本身时,示波器上的波形水平变化,只有频率变化,但是上面代码生成的信号会给出水平和垂直给定剪辑的变化
可能是什么问题?感谢
答案 0 :(得分:0)
问题是
var buffer = ac.createBuffer(1, osc.samplerate, osc.samplerate);
应该是
var buffer = ac.createBuffer(1, osc.samplerate/2, osc.samplerate);
谢谢你们