Осцилатор за запис на 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 със сигнала, създаден от кода по-горе, изходът не е красив. Когато редовните възли createOscillator се променят, вълните на осцилоскопа се променят хоризонтално, само честотите, но със сигнала, генериран с кода по-горе, дава промени както в хоризонталните, така и във вертикалните даващи клипове

какъв може да е проблема? Благодаря


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