createOscillator noteOn不工作

Phi*_*enn 1 javascript html5-audio

我从一个网站获得了这个片段(现在不记得在哪里)并且它已经停止工作了.

我用它来演奏音调.

这是我做错了还是Chrome最近改变了?

Play = (function () {
	var ctx = new(window.audioContext || window.webkitAudioContext);
	return function (duration, freq, finishedCallback) {
		duration = +duration;
		if (typeof finishedCallback != "function") {
			finishedCallback = function () {};
		}
		var osc = ctx.createOscillator();
		osc.type = 0;
		osc.connect(ctx.destination);
		osc.frequency.value = freq;
		osc.noteOn(0);
		setTimeout(
			function () {
				osc.noteOff(0);
				finishedCallback();
			}
			,duration
		);
	};
})();
Play(50,500)
Run Code Online (Sandbox Code Playgroud)

小智 5

这里有两个问题 - 没有audioContext(小"a",但此刻不影响Chrome).只需将其更改为:

var ctx = new (window.AudioContext || window.webkitAudioContext);
Run Code Online (Sandbox Code Playgroud)

添加对start()的支持,这是最新的方法.有几种方法可以做到这一点,这是一个基本的例子:

if (osc.start) {
    osc.start(0);
}
else {
    osc.noteOn(0);
}
Run Code Online (Sandbox Code Playgroud)

(当然,osc.noteOff(0)osc.stop(0)也是如此)

Play = (function() {
  
  var ctx = new(AudioContext || webkitAudioContext);
  
  return function(duration, freq, finishedCallback) {
    duration = +duration;
    if (typeof finishedCallback != "function") {
      finishedCallback = function() {};
    }
    var osc = ctx.createOscillator();
    osc.type = 0;
    osc.connect(ctx.destination);
    osc.frequency.value = freq;
    
    if (osc.start) osc.start();
    else osc.noteOn(0);
    
    setTimeout(
      function() {
        if (osc.stop) osc.stop(0);
        else osc.noteOff(0);
        finishedCallback();
      }, duration
    );
  };
})();
Play(50, 500)
Run Code Online (Sandbox Code Playgroud)