#1419·Tone.js

在启动时进行传输循环包装:过时的 Clock._lastUpdate 导致鬼节点 >= _loopEnd

作者: naomiaro创建于 2026年3月2日更新于 2026年3月3日

□ 说明

在 " Transport.start(时间,抵消) " 之前设置 " transport.loop = true " ,可立即将 " loopStart " 包装为 " loopStart " ,而不是从预定的抵消中播放。 当“ clock. lastUpdate” 停止/启动周期后, 就会发生这种情况。

□ 根源

lock. loop ()' 进程在范围[ lastUpdate, now (]' 中勾选。 停止/启动周期后:

  1. " 最后更新 " 保留上一个周期的价值
  2. " Transport.start(时间,相抵) " 拨打 " setTicksAtTime(时间,缩写) " 的电话
  3. 对于 Stale 范围内的 " tickTime " 值(最新数据 " 至 " 时间 " ), " Tick Source " 。
  4. 这些"鬼叮当"可以是 loopend'
  5. 由于 QQLoop.get(tickTime)返回 ' true " (在开始前设置), +processTick 包装到 'loopStart'
  6. 从未达到预期抵销额

这还影响到“每次”事件处理——鬼勾子可以发射“Transport.schedule ()”,在时间中线开始时,会产生重复的来源。

□再现.

独立HTML使用Tone.js 15.1.22 从CDN. 快速的停止/启动周期, 并有一个小循环区域可靠地触发错误 :

zz
cont transport = Tone.get Transport ();

// 计划一些事件( 如真实的应用程序)
transport.chedule(( ()) QQ;; ;
a. 运算表(( ())                          , 3);

// 做 5 个快速启动/ 停止循环以累积 stale TickSource 状态
为(让 i = 0; i < 5; i++) {
运输.loopStart=0;
运算.loopEnd=0.1; // ~38 滴入120bpm/192ppq
运.loop=真实;
运算.start(Tone.now(),0.05);
等待新的承诺(r QQ set Timeout(r, 20));
运算. stop( );
运输.loop=虚假;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

// 第6回播放——鬼叮当触发包
运输.loopStart=0;
运.loopEnd=0.1;
运.loop=真实;
transport.start(Tone.now (), 0.05); // 预定:从0.05s播放

// ACTUAL: 首个  process Tick 批次看到 stale ticks= 39 *  loop End=38.4
// / + 包装为循环启动=0, 而不是从相抵 0.05 播放

** 已关闭的勾选日志(标出 " 点.召回 " ):**

勾选 #0: 勾选时间=31.327, 勾选时间=39,  loop.get= true,  loopEnd=38.4 QQ 呜!
勾选 # 1 : 勾选时间 = 31. 330, 勾选时间 = 1 = QQ 被环绕开始
. . . . . . . .
勾选 # 12: 勾选时间=31.380, 勾选时间=0==========================================================================================================================================================================================================================================

关键值:cour. lastUpdate=31.326'(站点),transport.start ()',电话:31.380'。 范围`[31.327,31.380]'从累积的TickSource状态产生鬼虱.

工作间

Clock. Last Update'提前到Transport.start ()'后的起始时间。 这完全跳过 stale 勾选范围 —— “ 时钟. loop( ) ” 仅处理 ` [startTime, now ()]' , 使用当前播放周期的正确偏移 :

[JavaScript] 运算.loopStart=循环Start; 运算.loopEnd = 环行; 运算.loop = true; // safe – 幽灵勾引被跳过 页:1

/ 跳过上一个游戏周期的 stale 勾选 运算. 点. 上更新date=tone.now();


□ 环境

- 说吧
. . . . . . .