【问题标题】:AudioContext how to play the notes in a sequenceAudioContext 如何按顺序播放音符
【发布时间】:2017-09-12 12:03:58
【问题描述】:

我已经关注了这个tutorial 并想出了那个代码:

context = new AudioContext();
play(frequency) {
    const o = this.context.createOscillator();
    const g = this.context.createGain();
    o.connect(g);
    g.connect(this.context.destination);
    g.gain.exponentialRampToValueAtTime(
      0.00001, this.context.currentTime + 1
    );
    o.frequency.value = frequency;
    o.start(0);
  }

这样我可以通过传递值11752794 等来播放tutorial 表中的任何音符

我决定创建一个音符数组,并在循环中调用了我的 play 函数,但它不起作用,因为所有音符都立即播放而没有延迟。

您将如何按顺序演奏一系列音符?

我也在研究 article,但仍然不知道如何调整上面的代码。

【问题讨论】:

  • 关于您的其他问题:while(true){for(i = 0; i < array.length; ++i){ doStuff(i); } for(i = array.length; i-- > 0; ){ doStuff(i); } }。保持简单,不要想太多。

标签: javascript sequence audiocontext


【解决方案1】:

您可以在播放函数中使用附加参数时间按顺序播放音符。这样您可以控制序列中每个音符的开始时间和结束时间。

  var context = new AudioContext();

  var notes = [1175, 2794];
  var duration = 1;
  var interval = 2;

  function play(frequency, time) {
    var o = context.createOscillator();
    var g = context.createGain();
    o.connect(g);
    g.connect(context.destination);
    g.gain.exponentialRampToValueAtTime(
      0.00001, context.currentTime + duration + time
    );
    o.frequency.value = frequency;
    o.start(time);
  }

  for (var i = 0; i < notes.length; i++) {
    play(notes[i], i * interval);
  }

但是,如果您需要更精确/更强大的调度程序,您可以使用 WAAClock.js 之类的库或从 Chris Wilson metronome 获得灵感来构建自己的。

【讨论】:

    【解决方案2】:

    这是因为您正在执行的操作在 JavaScript 中是非阻塞的。在这些之间强制延迟的最直接方法是使用 setInterval 和 setTimeout。我在this article on using AudioContext 中找到了使用这些示例的示例。

    setInterval on MDN setTimeout on MDN

    不同之处在于 setTimeout 会在延迟后执行一次,而 setInterval 会重复执行,直到您告诉它停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2013-02-05
      • 2012-02-16
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多