如何重叠循环AudioBufferSourceNode(使用相同的AudioBuffer)

时间:2016-05-04 13:47:13

标签: web-audio

我需要使用一些交叉参数(以秒为单位)循环我的源代码。在不中断示例边界的情况下监听循环将是很棒的.AudioBufferSourceNode是我的代码中的audioNode。 我遇到了无法重用缓冲区的问题,是否有可能解决这个问题?

    playNoteOn: function(indexNote){
        var attack = this.get('attack'),
            release = this.get('release'),
            volume = 1 + this.get('volume') / 100,
            reverb = _.clone(this.get('reverb')),
            loop = this.get('loop'), cross;

        //peace for Loop process
        if (loop) {
            //milli sec
            attack = this.get('startLoop')*1000;
            release = this.get('endLoop')*1000;
            //sec
            cross = this.get('crossLoop');
        }

        //peace for ADSR process
        var t0 = this.get('audioNode').context.currentTime,
            spread = attack/1000 + release/1000,
            attackSpread = t0 + attack/1000;

        [this.get('schema').leftGain, this.get('schema').rightGain].forEach(function(gain, index){
            gain.gain.cancelScheduledValues(0);
            gain.gain.setValueAtTime(0, t0);
            gain.gain.linearRampToValueAtTime(volume, attackSpread);
            // gain.gain.setValueAtTime(volume, decaySpread);
            // gain.gain.linearRampToValueAtTime(0, releaseSpread);
        });
        this.get('audioNode').connect(this.get('schema').splitter, 0, 0);
        this.get('audioNode').connect(this.get('schema').leftGain);
        this.get('audioNode').connect(this.get('schema').rightGain);
        this.get('audioNode').connect(this.get('schema').reverb);
        this.get('audioNode').connect(APP.Models.Synth.get('schema').reverb);

        APP.Models.Synth.get('effects').where({active: false}).forEach(function(effect){
            effect.get('node').disconnect();
        });

        APP.Models.Synth.get('effects').where({active: true}).forEach(function(effect){
            effect.get('node').disconnect();
            effect.get('node').setParams(effect.toJSON()).getNode(this.get('audioNode'), [this.get('schema').leftGain, this.get('schema').rightGain]);
        }, this);

        if(loop){
            this.get('audioNode').loop = true;
            this.get('audioNode').loopEnd = this.get('audioNode').buffer.duration - cross;
        }
        this.get('audioNode').start(t0);
    },

1 个答案:

答案 0 :(得分:0)

您无法重复使用缓冲区。一旦停止,sourcebuffer就会永远消失。无论如何,你的音频节点对象在哪里?但那没问题。从声音文件解码后,您可以再次使用解码缓冲区。只需创建更多缓冲源。您可以根据自己的喜好创建。你还用什么语言?说出你正在做什么以及你使用哪些框架的背景。

注意缓冲区与解码和缓冲区之间的区别。您的audionode是一个缓冲源,可以通过缓冲区进行处理。您可以重用缓冲区而不是缓冲区源。所以在你的playnote代码中创建缓冲源。