You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tone.js中检查Sequence的进度与状态?

问题分析与解决

核心问题1:回调参数错误

你的Tone.Sequence回调函数第一个参数写了1,这是错误的——Tone.Sequence的回调第一个参数应为调度时间time,这个参数用于告诉合成器何时触发音符,必须正确传入,否则会导致音符触发逻辑异常,也会间接影响状态检测。

核心问题2:未启动Tone.Transport

Tone.js的所有调度类(包括Sequence)都依赖Tone.Transport全局时间轴,仅调用seq.start(0)无法让序列真正运行,必须启动Transport才能驱动序列播放。这就是你看到progress始终为0、状态检测异常的主要原因。

修正后的代码示例

var synth = new Tone.FMSynth().toDestination(); // 务必将合成器连接到输出
var notesarray = [
  {note: "B2", duration: "16n"}, 
  {note: "B3", duration: "16n"}, 
  {note: "A2", duration: "16n"}, 
  {note: "G2", duration: "16n"}, 
  {note: "B4", duration: "16n"}
];

// 创建序列,修正回调参数
var seq = new Tone.Sequence((time, note) => {
  // 使用正确的time参数触发音符
  synth.triggerAttackRelease(note.note, note.duration, time, 0.10);
}, notesarray);

// 监听序列停止事件,触发完成逻辑
seq.onstop = () => {
  console.log("序列播放完成");
  console.log("最终状态:", seq.state);
  console.log("最终进度:", seq.progress);
};

// 启动序列和全局时间轴
seq.start(0);
Tone.Transport.start();

// 实时监听进度和状态(可选)
setInterval(() => {
  console.log("当前状态:", seq.state);
  console.log("当前进度:", seq.progress.toFixed(2));
}, 100);

关键说明

  • state属性:返回序列当前状态,可选值为"started"(已启动)、"stopped"(已停止)、"paused"(已暂停)。只有当Transport运行时,序列才会真正进入播放状态。
  • progress属性:返回0到1之间的数值,表示序列已播放的比例。仅当序列在播放中(Transport运行且序列未停止),这个值才会持续更新。
  • 序列完成检测:最可靠的方式是监听序列的onstop回调(序列播放完所有音符后会自动触发stop事件),或者在实时监听中检查progress >= 0.99(规避浮点数精度问题)。

内容的提问来源于stack exchange,提问作者garrettlynchirl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:22:31