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

