AudioContext.currentTime + 可变时间

AudioContext.currentTime + variable time

使用网络音频 API 使用振荡器生成基本音调,但在改变播放音符的持续时间(以秒为单位)时出现问题。

问题是 "sustain" 变量没有按预期工作以停止振荡器。对于一个音符演奏,该变量按预期工作,然后其余音符播放无限持续时间。如果我删除变量并对持续时间进行硬编码而不是使用变量,它就可以正常工作。 context.currentTime 的日志显示变量或硬编码持续时间之间没有区别。想多了。我错过了什么??

JS:

//start new audio session. Do this only once

var context = new window.webkitAudioContext();

function playSound(音符){ 振荡器 = context.createOscillator();

//create volume controller
var gainNode = context.createGain();

//connect signal to audio output(speakers by default)
oscillator.connect(gainNode);
gainNode.connect(context.destination);

//adjusts frequency played by 50%, 100% or 200% 
var octave = document.getElementById('octave').value;

//sets oscillator frequency
oscillator.frequency.value = frequencies[note] * octave;

//oscillator wave type
oscillator.type = document.getElementById('waveSelect').value;

//starts oscillator. Delayed start can be achieved by adding time(in secs) after currentTime
oscillator.start(context.currentTime + 0.01);

//determines note duration
var sustain = document.getElementById('sustain').value;

//stops oscillator by exponentially ramping down sound over .015 seconds to avoid audible click
gainNode.gain.setTargetAtTime(0, context.currentTime + sustain, 0.0015);


//for testing
console.log("Hz:" + frequencies[note] * octave + " octave:" + octave + " wave:" + oscillator.type + "duration: " + sustain + " time:" + context.currentTime);

}

HTML:

<select class="lists" id="sustain">
            <option value="0.5">EIGHTH NOTE</option>
            <option value="1.0">QUARTER NOTE</option>
            <option value="2.0">HALF NOTE</option>
            <option value="4.0">WHOLE NOTE</option>             
        </select>

感谢您的帮助!

您需要将维持 select 元素的结果值解析为浮点数,因为它返回的是字符串值。 如果您在 javascript 中组合一个字符串和一个数字,它的计算结果就是一个字符串。 看看这个 jsbin 的实际例子:

http://jsbin.com/qexusoyida/edit?html,js,console,output

只需编辑这一行

var sustain = document.getElementById('sustain').value;

像这样

var sustain = parseFloat(document.getElementById('sustain').value);