使用createBuffer()的Web Audio Api写入振荡器

时间:2014-11-12 02:56:41

标签: javascript html5-audio

我正在尝试使用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本身时,示波器上的波形水平变化,只有频率变化,但是上面代码生成的信号会给出水平和垂直给定剪辑的变化

可能是什么问题?感谢

1 个答案:

答案 0 :(得分:0)

问题是

var buffer = ac.createBuffer(1, osc.samplerate, osc.samplerate);

应该是

var buffer = ac.createBuffer(1, osc.samplerate/2, osc.samplerate);

谢谢你们