如何在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
相关产品推荐
相关产品推荐

