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

如何让Tone.Sequence首次从指定位置循环,后续从开头循环?

解决方案

核心思路是利用Tone.Sequence(继承自Tone.Part)start方法的第二个参数——序列内部的起始偏移量,而非修改Tone.Transport的起始时间。这样能让序列首次从指定内部位置启动,循环时自动回到序列开头(默认loopStart为0)。

修改后的代码

export const scheduleChords = (chords, offset, bars, numerator, denominator, callback) => {
  Tone.Transport.timeSignature = numerator;
  const durationScale = getDurationScale(denominator);

  const part = new Tone.Sequence(((time, value) => {
    playNotes(value.notes, durationScale * (value.duration || 0), time, 0, false);
    Tone.Draw.schedule(() => callback(value), time);
  }), chords, denominator);
  
  // start第二个参数为序列内部起始位置,首次从offset开始播放
  part.start(0, offset);
  part.loop = true;
  // 可选:若需自定义循环结束位置,默认是序列总长度,可省略
  // part.loopEnd = `${bars}m`;

  Tone.context.resume();
  Tone.Transport.start();
}

关键说明

  • part.start(0, offset):第一个0是序列在Transport时间轴上的启动时机(立即启动),第二个offset是序列内部事件的起始位置(比如想从第2小节开始,offset设为2m;若用秒数,Tone会自动解析)。
  • 当序列播放到内部loopEnd(默认是序列总长度)时,会自动回到loopStart(默认0)进入循环,完美实现「首次从指定位置启动,后续循环从开头运行」的需求。
  • 无需修改Tone.Transport的起始时间,保持其从0开始运行即可,避免循环时重复从指定位置启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:50:35