Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 线性斜坡不与增益节点线性作用_Javascript_Web Audio Api_Sound Synthesis - Fatal编程技术网

Javascript 线性斜坡不与增益节点线性作用

Javascript 线性斜坡不与增益节点线性作用,javascript,web-audio-api,sound-synthesis,Javascript,Web Audio Api,Sound Synthesis,编辑:找到修复程序。我缺少g.gain.setValueAtTime(0,现在)行前 在下面设置攻击斜坡。g.gain.value=0在添加后也是多余的 所以我有一个奇怪的问题。让我给出一些背景信息:我正在实现一个合成音合成器,在这个合成器中,音符是以一种一次性的方式创建和播放的——每次触发一个键时都会创建一个新的振荡器 我首先在全球范围内实施了音量封套,但当触发新的音符时,这会影响到过去音符的衰减/释放,但单声道上,攻击、衰减和释放封套都按预期工作 因此,我的解决方案是在触发关键点时动态创建振

编辑:找到修复程序。我缺少
g.gain.setValueAtTime(0,现在)行前
在下面设置攻击斜坡。
g.gain.value=0在添加后也是多余的

所以我有一个奇怪的问题。让我给出一些背景信息:我正在实现一个合成音合成器,在这个合成器中,音符是以一种一次性的方式创建和播放的——每次触发一个键时都会创建一个新的振荡器

我首先在全球范围内实施了音量封套,但当触发新的音符时,这会影响到过去音符的衰减/释放,但单声道上,攻击、衰减和释放封套都按预期工作

因此,我的解决方案是在触发关键点时动态创建振荡器和封套。这很好地解决了一点奇怪的问题:衰变和释放都像以前一样工作,具有独特的注释卷包络的优点,但攻击包络不是线性渐变的。相反,它会延迟指定的任何攻击时间,并一次触发所有攻击

有人能理解为什么攻击包线会延迟并立即行动,而不是像它应该做的那样线性地修改增益吗

以下是相关功能:

synth.prototype.playNote = function(i, freq) {
    // create oscillator
    var o = this.context.createOscillator();
    o.frequency.value = freq * Math.pow( 2, this.osc[i].oct-4 );
    o.type = this.osc[i].type; o.start( 0 );

    // create envelope node and connect
    var g = this.context.createGainNode(); g.gain.value = 0;
    o.connect( g ); g.connect( this.master_gain );

    // enveloping
    now = this.context.currentTime;

    // the line below delays for the attack time at 0 gain and
    // shoots to volume 1 after (now + this.amp_env.attack) rather than curving linearly
    g.gain.linearRampToValueAtTime(1, now + this.amp_env.attack );

    g.gain.linearRampToValueAtTime(this.amp_env.decay, now + this.amp_env.attack + this.amp_env.decay + this.amp_env.release );
    g.gain.linearRampToValueAtTime(0, now + this.amp_env.attack + this.amp_env.decay + this.amp_env.release );

    // kill note after envelopes are done;
    o.stop( now + this.amp_env.attack + this.amp_env.release + this.amp_env.release );
}

不清楚你在问什么:标题应该是一个问题。对此很抱歉-修复。欢迎来到StackOverflow。你应该把你的修正作为一个答案贴在下面,这样周围有同样问题的人就可以很容易地找到它。