Генератор записи Web Audio Api с createBuffer()

Я пытаюсь создать синусоиду с помощью 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 сами по себе, волны на осциллографе изменяются по горизонтали, только частоты, но с сигналом, сгенерированным с помощью кода выше, дает изменения как по горизонтали, так и по вертикали, давая клипы

В чем может быть проблема? Спасибо


person Yhom Torke    schedule 12.11.2014    source источник


Ответы (1)


И проблема была

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

что должно быть

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

Спасибо, парни

person Yhom Torke    schedule 12.11.2014