音调 JS - Transport.stop();不适用于预定事件

Tone JS - Transport.stop(); does not work with scheduled events

我正在为一个项目使用 Tone JS,并且我正在使用它的 Transport.scheduleOnce to schedule events with the Sampler. Here is what I have so far, also here is a fiddle(您可能需要点击 运行 几次才能听到 fiddle 时的音频最初加载)

我的代码:

const sound = 'https://archive.org/download/testmp3testfile/mpthreetest.mp3';
let samplerBuffer;

const sampler = new Promise((resolve, reject) => {
   samplerBuffer = new Tone.Sampler(
    { 
      A1: sound
    },
    {
      onload: () => {
        resolve()
      }}
  ).toMaster();
})


sampler.then(() => {
  Tone.Transport.scheduleOnce(() => {
    samplerBuffer.triggerAttack(`A1`, `0:0`)
  });

  Tone.Transport.start();
  
  setTimeout(() => {
    console.log('Now should be stopping');
    Tone.Transport.stop();
  },1000)
})

我试图使用 Transport.stop() 方法在 1 秒后停止播放音频,但它似乎不起作用。我想我已经按照我应该的方式遵循了文档,所以我哪里出错了?

Tone.Transport 正在触发您的样本。
如果您只想播放“自动点唱机”之类的声音,您要做的是使用 Tone.Player

如果你真的需要采样器,那么应​​该查看 Envelopes 因为采样器使用了一个。

简而言之:Tone.Transport就像音乐会中的指挥家。 Transport 只设置时间(只设置 BPM,不设置播放速度)。 Tone.Transport.start() 将触发所有已注册的乐器(在您的情况下为采样器)开始执行您为其编程的任何操作。如果您想停止采样器在此模式下播放。你可以做 samplerBuffer.releaseAll()

const sound = 'https://archive.org/download/testmp3testfile/mpthreetest.mp3';
let samplerBuffer;

const sampler = new Promise((resolve, reject) => {
   samplerBuffer = new Tone.Sampler(
    { 
      A1: sound
    },
    {
      onload: () => {
        resolve()
      }}
  ).toMaster();
})


sampler.then(() => {
  Tone.Transport.scheduleOnce(() => {
    samplerBuffer.triggerAttack(`A1`, `0:0`)
  });

  Tone.Transport.start();
  setTimeout(function() {
    console.log('Now should be stopping');
    samplerBuffer.releaseAll();
    // samplerBuffer.disconnect();
  },1000)
})

https://jsfiddle.net/9zns7jym/6/