feat(rhythm): 鼓手模式重构——屏幕六区鼓组 + 无鼓伴奏合拍(用户裁定重构)

- 屏幕3列×2行六区鼓组(列=声像左中右/行=音高上亮下沉),六件程序合成打击乐,三重冗余蒙眼可辨
- 无鼓伴奏BGM上跟随领奏 call&response + 加花句;3曲90/105/120 BPM解锁制,BPM实测89.99/105.00/120.01
- 引擎后向兼容扩展:onGesture补{x,y}坐标(单参回调零感知,15游戏+3引擎测试全量回归零失败)
- 判定简化:全部音符=分区点按零延迟,旧双击补偿/下滑折中退役;键盘Digit1-6+空格=家区
- 教学摸鼓认区(摸哪报哪,8s无触摸自动进阶)+重教≤2+降速DDA+归因真话律
- 保留旧作好评:跟随领奏核心/S~C评级/解锁制/判定口径/guide工程遗产
- 语音49id双性别+8key;R1+R2连续2轮4/4愿意玩P0=0裁定可交付;live直证33 Perfect dt≈0.00s
- 03号文档仅文末加取代指针;新设计24号;档案research/rhythm-drummer/;Mureka累计$1.35
This commit is contained in:
xsl
2026-09-14 20:17:10 +08:00
parent ddada6980c
commit ae850a4ce0
280 changed files with 5671 additions and 1121 deletions
+9
View File
@@ -183,3 +183,12 @@ idle → intro(语音) → tut(3 步教学) → select(选曲,二周目起)
6. 语音全表见 03-rhythm-voice-ids.md;现版 `voice/welcome/rules/tut_start/tut_done` 弃用,`grade_*`/`restart` id 沿用但文案变更(重录)。
7. 结算画面:单击=再来一遍(同曲),右滑=下一首(若已解锁),下滑=回大厅。
8. 更新 `web/rhythm/README.md`(玩法、手势表、进度结构)。
---
> **取代指针(2026-09-14,24 号裁定)**:本文档(及 03-rhythm-voice-ids.md)的
> 施工依据地位已被 [24-rhythm-drummer.md](24-rhythm-drummer.md) +
> [24-rhythm-voice-ids.md](24-rhythm-voice-ids.md) 取代——《节拍行者》重构为
> 屏幕分区鼓手模式(6 区打击乐 + 无鼓伴奏,跟随领奏核心/评级/解锁/BPM 精确性
> 延续)。本文仅作历史档案保留,正文一字不改;13 号文档 §4 rhythm 断言段
> 同理冻结,新断言见 24 号文档 §11。
+416
View File
@@ -0,0 +1,416 @@
# 24 · 《节拍行者》鼓手模式重构设计(rhythm / Drummer Mode)
> 用户裁定:现有模式「不错,保留」——跟随领奏的合拍玩法核心、S~C 评级、曲目解锁制、
> BPM 精确性延续;整体重构为**屏幕分区打击乐**:屏幕划分区域,每区一种打击乐音效,
> 玩家作为乐队鼓手与无鼓伴奏音乐合拍。本文取代 [03-rhythm-rebuild.md](03-rhythm-rebuild.md)
> 的全部施工依据(03 号文档仅作历史档案,文末有取代指针;其 rhythm 判定好评口径
> 「PERFECT ±0.15 / GOOD ±0.35」经 live 校准,本文沿用)。
>
> 语音台词全表在 [24-rhythm-voice-ids.md](24-rhythm-voice-ids.md)。断言清单在 §12。
---
## 0. 可行性勘察决策(阶段零结论)
### 0.1 引擎手势事件是否携带坐标?
**不携带。** `web/engine/gesture.js` 的 `onGesture(g)` 只传手势名字符串,
触摸坐标只在引擎内部用于滑动/点按判定,回调时丢弃。
### 0.2 两条路线的权衡
| | (a) 引擎扩展:第二参数透传坐标 | (b) 游戏层自建 touch 监听 |
|---|---|---|
| 改动面 | gesture.js 每个 onGesture 调用点补 `{x,y}` 第二参;docs/web-engine-api.md 同步 | 游戏层加 touchstart 记录坐标 |
| 既有游戏影响 | **零**——全部 15 款游戏的回调都是单参 `(g) =>`,多余实参被忽略,手势分类/震动/时序逐字节不变(同 opts.pan / immediateTap / tapcancel 先例) | 零(不碰引擎) |
| 键盘通道坐标 | **免费**:空格虚拟指针本就走 `handleDown(keyCenter)`,天然拿到元素中心坐标 | 无法区分键盘 tap 与残留触摸坐标,需自行加时效启发式(脏) |
| 保持的引擎福利 | haptics 自动震动、多指守卫、tapcancel、长按快进 window 事件、双击状态机、键盘三通道全部保留 | 全部丢失,需在游戏层重写(双击窗/tapcancel/快进事件) |
| 代价 | 全量回归:15 游戏 playtest + guide.test + engine-voice + engine-input + docs 同步(铁律) | 回归只需 rhythm 自身,但收获一个与引擎并行的第二输入状态机(长期维护债) |
### 0.3 决策:路线 (a),引擎后向兼容扩展
- `attachGestures` 的全部 `onGesture(...)` 调用补第二实参 `{x, y}`(视口像素
clientX/clientY 语义):tap 类事件(含 immediateTap 序曲 tap、双击改判、tapcancel)
与 longpress/longpressend 传**按下点**;四向滑动传**滑动起点**(出手瞄准位置);
键盘通道传虚拟指针坐标(`keyCenter()`,方向键滑动同样补)。
- 缺省行为逐字节不变:不加 config 开关、不改任何判定阈值与震动;回调签名扩为
`(g, info?: {x, y})`,单参回调零感知。
- 回归义务(已执行,见 research/rhythm-drummer/round0/engine-regression.md):
15 游戏 playtest + web/harness/guide.test.mjs + engine-voice.test.mjs +
engine-input.test.mjs 全绿,docs/web-engine-api.md §gesture 同步。
### 0.4 打击乐音色:程序合成
六区音色 + accent 全部 numpy 程序合成(`tools/gen_rhythm_syn.py`,
gen_cipher_syn.py 同款工艺):可精确控制起音/衰减(盲玩靠起音对拍)、
零授权问题、零网络延迟、与 BGM 调性关系无关(打击乐无调性)。
### 0.5 BGM:无鼓伴奏是硬需求
玩家就是鼓手——BGM 含鼓则叠打混乱。Mureka instrumental 生成时 prompt
显式 `no drums, no percussion`,`tools/bpm_precise.py` 梳状扫描实测 BPM
(节奏类硬性要求,误差 >0.5 则 atempo 拉伸,R3 track90 先例),
无缝循环后处理沿用批次 1-4 工艺(强 onset 起点 → 整数小节裁剪 →
首尾 3s acrossfade → loudnorm I=-20 → ogg q3 + m4a 128k)。
---
## 1. 概述与继承/舍弃清单
**一句话玩法**:屏幕是一面 3列×2行 的鼓组。系统(领奏)在无鼓伴奏上敲一小节
节奏型,玩家在下一小节的相同拍点敲相同的鼓。曲子从 90 BPM 打到 120 BPM,
拿 B 级以上解锁下一首。
### 1.1 继承自旧作(用户裁定「保留」的部分)
| 项 | 说明 |
|---|---|
| 跟随领奏 call & response 核心循环 | 领奏 1 小节 → 应答 1 小节,逐乐句推进 |
| 时值判定口径 | PERFECT ±0.15s / GOOD ±0.35s(live round1 §13 校准值,吸收蓝牙延迟) |
| 计分与评级 | Perfect=2/Good=1/Miss=0,rate = 得分/(2×总音符),S≥0.95 / A≥0.85 / B≥0.70 / C 其余;不掉血不中断,歌照唱完 |
| 曲目解锁制 | 曲目 n 拿到 B 级 → 解锁 n+1;localStorage + 已登录 PUT 同步 |
| BPM 精确性 | 谱面/判定全部锚定 BGM 实测 BPM 网格(bpm_precise 实测 + atempo 修正) |
| 工程质量遗产 | AudioContext 预排程泵(40ms + LOOKAHEAD 0.6s)、BGM 手动 `src.start(t0)` 对网格、模态菜单断点续播、`_speakGuarded` 看门狗语音链、结算后 menu pad 看门狗、旁白单击跳过/长按快进豁免、guide 层全量接入(状态签名/gd_answer/gd_miss 归因/教学 DDA 降速/count-in 恢复) |
### 1.2 舍弃/替换
| 旧 | 新 | 理由 |
|---|---|---|
| 手势→乐器映射(tap=kick、left=闭镲…6 手势 6 音色) | 屏幕分区→乐器(6 区 6 音色,tap 即敲击) | 用户裁定的新核心 |
| 滑动/双击作为音符类型(SWIPE_DELAY 0.15 / DOUBLE_DELAY 0.20 补偿、双击序曲撤销) | **全部音符 = 分区点按**,immediateTap 按下即判,零识别补偿 | 打击乐每次出手都是「敲一下」,滑动从音符类型降级为纯导航;双击=同区连击两下(两声都合法),**不再需要双击序曲撤销账簿** |
| BGM 含鼓组(track90/105/120 有鼓) | 无鼓伴奏 | 玩家是鼓手 |
| 下滑呼菜单的「down 音符临近」折中(live P0 加窗/复活窗一整套) | 下滑**无条件**呼菜单 | 音符全是点按,下滑永不与音符冲突;序曲 tap 仍出 ghost 音但判定时由 tapcancel 撤销 |
| 教学 T1-T3(手势记忆) | 分区心智模型教学(摸鼓认区 → 跟打) | 「摸到哪是哪」的建立是设计核心(§6) |
| 旧语音表 31 句 | 新表 41 句(+沿用向导 8 句 = 49 句双性别,配额见 §8) | 分区教学与区名播报需要新句 |
---
## 2. 屏幕分区与音色映射
### 2.1 分区布局(3 列 × 2 行,纯听觉可辨是硬约束)
```
┌─────────┬─────────┬─────────┐
│ TL 左上 │ TC 上中 │ TR 右上 │ 上排:清亮/高频
│ 踩镲 │ 高嗵 │ 吊镲 │ pan: -0.6 / 0 / +0.6
├─────────┼─────────┼─────────┤
│ BL 左下 │ BC 下中 │ BR 右下 │ 下排:低沉/低频
│ 军鼓 │ 底鼓 │ 低嗵 │ pan: -0.6 / 0 / +0.6
└─────────┴─────────┴─────────┘
```
**双轴心智模型**(教学的主话术):
- **列 = 声像**:左列在左耳、中列在中央、右列在右耳(opts.pan 引擎已支持)。
- **行 = 音高**:上排清亮、下排低沉。
- 在双轴之上,六件乐器音色本身两两不同(镲/嗵/鼓),盲玩家有
「声像 + 音高 + 音色」三重冗余线索。
### 2.2 分区 ↔ 音色 ↔ 声像总表
| 区码 | 位置 | 乐器 | sfx id | pan | 合成要点(起音硬、≤0.5s 残响) |
|---|---|---|---|---|---|
| TL | 左上 | 闭合踩镲 | `sfx/dm_hat` | -0.6 | 6-10kHz 高通噪声,0.06s 急衰减 |
| TC | 上中 | 高音嗵 | `sfx/dm_tomhi` | 0 | 200→140Hz 正弦扫频 + 轻皮噪,0.25s |
| TR | 右上 | 吊镲 | `sfx/dm_crash` | +0.6 | 4-12kHz 噪声 + 非谐波泛音列,1.2s 长尾 |
| BL | 左下 | 军鼓 | `sfx/dm_snare` | -0.6 | 200Hz 鼓皮 + 1-4kHz 带通噪声,0.2s |
| BC | 下中 | 底鼓 | `sfx/inst_kick`(沿用旧 id) | 0 | 130→45Hz 正弦扫频 + 触击瞬态,0.25s |
| BR | 右下 | 低音嗵 | `sfx/dm_tomlo` | +0.6 | 120→75Hz 正弦扫频 + 轻皮噪,0.3s |
- 附加层:`sfx/dm_accent`(Perfect 叠加亮音,程序合成木鱼 1.5kHz 短音)。
- 分区判定:`zoneOf(x, y)` 以 `#game-root` 的 `getBoundingClientRect()` 为界,
y 上半 = 上排、y 下半 = 下排;x 三等分 = 左/中/右。无布局环境(mock/harness)
由调用方显式传 payload;payload 缺失时落 BC(中央家区,兜底不炸)。
- **键盘平权**(游戏层 keydown,引擎键盘通道之外的补充,数字键引擎本就不拦截):
`Digit1/2/3/4/5/6`(及小键盘)= TL/TC/TR/BL/BC/BR,按下即发、零延迟;
引擎空格 tap 落在元素几何中心 → 判 BC(「家」)。选曲/菜单/结算态数字键不生效
(那些态沿用手势导航)。
### 2.3 领奏音色 = 玩家音色
领奏音符与玩家敲击走**同一批 sfx**(同音色同声像)——做对时听到自己在和
「另一个鼓手」合奏,这是旧作好评的「演奏感」来源,保留。
---
## 3. 玩法循环与状态机
### 3.1 循环
```
选曲 → 数拍导入(1 小节底鼓×4,含节拍轻震) → 逐乐句(领奏 1 小节 + 应答 1 小节 [+ 休止])
→ 过门/加花(领奏 1 小节密集加花 + 应答 1 小节) → 终句吊镲 → 结算评级
```
### 3.2 状态机
```
idle → intro(语音) → tut(分区教学) → select(选曲,二周目起) → countin → main(逐乐句/加花) → end(结算)
↑_________________|
```
- 数拍小节由游戏排程 4 记数拍(BGM 无鼓,数拍只能靠鼓手自己)+ 每拍 [8] 轻震:正片用底鼓 inst_kick×4(guide.test G3 的 _sched 锚点,13 号冻结文档不可改),教学步用木鱼 click(dm_accent,guide.test G2 要求教学 _sched 里 kick=领奏音)。
- 每曲第一个应答窗口前 1 小节落 `gd_answer` + turn earcon(旧作 G1 修正沿用)。
- 模态菜单(下滑呼出):单击循环 [继续演奏 / 回大厅]、双击确认、上滑帮助、
下滑关闭;暂停真冻结(泵停、BGM 断点记 offset),恢复时全网格平移 +
4 拍 count-in(guide full 档先播 `gd_count`,每局限 1 次,round3 G3 全套沿用)。
---
## 4. 谱面与难度曲线
### 4.1 记号
`拍:区码`,1 小节 4 拍,`x.5` = 八分反拍。乐句 = 领奏 1 小节 + 应答 1 小节;
加花 = 特殊乐句(fill 标记),领奏为八分音符密集型,最后一音恒为 TR 吊镲收束。
### 4.2 曲目一《启程》90 BPM(教学曲,8 句 + 终曲加花,≈65s)
| 句 | 领奏节奏型 | 音符数 |
|---|---|---|
| 1 | `1:BC, 3:BC` | 2 |
| 2 | `1:BL, 3:BR` | 2 |
| 3 | `1:BC, 2:BC, 3:BL` | 3(双击底鼓引入同区连击) |
| 4 | `1:BL, 2:BR, 3:BC` | 3 |
| 5 | `1:BC, 2:BL, 3:BC, 4:BR` | 4 |
| 6 | `1:TL, 3:BL, 4:BC` | 3(上排首次进正片) |
| 7 | `1:BC, 2:TL, 3:BC, 4:TR` | 4 |
| 8 | `1:BL, 2:BR, 3:TL, 4:BC` | 4 |
| 终曲加花 | `1:BC, 1.5:BC, 2:BC, 2.5:BL, 3:BL, 3.5:BC, 4:TR` | 7(全曲唯一反拍,仅限加花) |
前 4 句应答后各休 1 小节,其余不休。
### 4.3 曲目二《追风》105 BPM(10 句 + 中途加花 + 终曲加花,≈80s)
| 句 | 领奏节奏型 | 音符数 |
|---|---|---|
| 1 | `1:BC, 3:BR` | 2 |
| 2 | `1:BL, 2:BL, 3:BC` | 3 |
| 3 | `1:TL, 3:BL, 4:BR` | 3 |
| 4 | `1:BC, 2:BL, 3:BC, 4:TL` | 4 |
| 5 | `1:BC, 2.5:BR, 3:BC` | 3(首个反拍) |
| 中途加花 | `1:BL, 1.5:BL, 2:BC, 2.5:BC, 3:BR, 3.5:BR, 4:TR` | 7 |
| 6 | `1:BL, 2:TL, 3.5:BR, 4:BC` | 4 |
| 7 | `1:BC, 2:BL, 3:BR, 3.5:TL` | 4 |
| 8 | `1:BR, 1.5:BL, 3:BC, 4:TR` | 4 |
| 9 | `1:BC, 2.5:TL, 3:BC, 4:BL` | 4 |
| 10 | `1:BL, 2:BR, 3:TL, 4:BC` | 4 |
| 终曲加花 | `1:BC, 1.5:BL, 2:BC, 2.5:BL, 3:BC, 3.5:BR, 4:TR` | 7 |
前 2 句应答后各休 1 小节;第 5 句与中途加花之间不休。
### 4.4 曲目三《星爆》120 BPM(10 句 + 中途加花 + 终曲加花,≈75s)
| 句 | 领奏节奏型 | 音符数 |
|---|---|---|
| 1 | `1:BC, 2:BL, 3:BC, 4:BL` | 4 |
| 2 | `1:TL, 2:BL, 3:TL, 4:BC` | 4 |
| 3 | `1:BR, 2:TR, 3:BR, 4:BL` | 4 |
| 4 | `1:BC, 2.5:TL, 3:BC, 4:BR` | 4 |
| 5 | `1:BL, 1.5:BR, 2.5:BL, 3:BC` | 4 |
| 6 | `1:BC, 2:TL, 2.5:BL, 3:BC, 4:TR` | 5 |
| 中途加花 | `1:TL, 1.5:TL, 2:BL, 2.5:BL, 3:BC, 3.5:BC, 4:TR` | 7 |
| 7 | `1:BR, 2:BC, 3:BL, 3.5:BR, 4:TL` | 5 |
| 8 | `1:BC, 1.5:BC, 2.5:BL, 3:BC, 3.5:TL, 4:TR` | 6(高潮句) |
| 9 | `1:BL, 2:BC, 2.5:BR, 3:TL, 4:BL` | 5 |
| 10 | `1:BC, 2:BR, 3:BC, 3.5:TL, 4:BL` | 5 |
| 终曲加花 | `1:BC, 1.5:BL, 2:BC, 2.5:BL, 3:BC, 3.5:BC, 4:TR` | 7 |
全曲不休。
### 4.5 难度曲线规则(改谱遵守)
1. 乐句长度:曲目一 2→4 音、曲目二 2→4 音、曲目三 4→6 音;同曲单调不减
(终曲加花不计入)。
2. 反拍(x.5):曲目一**只允许出现在加花**;曲目二第 5 句起、普通乐句每句至多
1 个反拍音;曲目三不限。加花为八分音符基底,不受此限。
3. 同一分区连续出现 ≤2 次(同区双击是合法手法,三连击禁止——盲玩极限)。
4. 同一乐句内分区种类 ≥2(纯底鼓句仅允许曲目一句 1)。
5. 相邻反拍连续位禁止左列↔右列大跳(`BL↔BR` 相邻反拍只允许曲目三)——
声像跳变过快在耳机上易混(旧作 §3.5-6 同款)。
6. 加花尾音恒为 TR 吊镲(收束感 + 吊镲长尾盖住应答结束)。
---
## 5. 时值判定与计分评级
```js
const PERFECT = 0.15; // Perfect 窗口 ±150ms(live round1 §13 校准)
const GOOD = 0.35; // Good 窗口 ±350ms(吸收蓝牙延迟)
const LOOKAHEAD = 0.6; // 调度前瞻(秒)
const PUMP_MS = 40; // 调度泵周期
```
- **判定时刻 = 触摸/按键时刻**:immediateTap 按下即发 tap(零补偿);
键盘数字键 keydown 即发(零补偿)。旧作的 TAP_DELAY/SWIPE_DELAY/DOUBLE_DELAY
补偿与旧引擎闩锁、双击序曲撤销、超时复活窗**整体退役**(没有滑动/双击音符了)。
- 归属:同分区最近未判定音符 |dt|≤GOOD → 出手即播该区音色(pan 随行),
Perfect 叠 `sfx/dm_accent`;|dt|≤GOOD×0.5 的异分区音符被敲 = 判 Miss
(错鼓);窗口外 = 自由演奏(出声音不判定)。
- **序曲 tap 治理**(immediateTap 代价,旧作账簿简化版):每次按下先发 tap
(出声+可认领),转滑动/长按/触摸取消时引擎补 `tapcancel` → 撤销该 tap 的
认领(声音收不回当 ghost 音,判定/统计必须更正且不计 Miss)。双击不改判
账簿——两下敲击各自独立成立。
- Miss 超时:expected + GOOD + 0.10s 未应答 → 闷镲反馈音
(`sfx/dm_hat` 降调 0.5× 复用,零新资产)+ error 震动。
- 长按 = 死输入:Miss 反馈音 + error 震动,不判定不归属(演奏期长按快进
`setRateBoostEnabled(false)` 豁免照旧)。
- 计分/评级/连击:Perfect=2 / Good=1 / Miss=0;rate = 得分/(2×总音符);
S≥0.95 / A≥0.85 / B≥0.70 / C 其余;16 连击 success 震、乐句全 Perfect
[20,40,20]、结算 S/A success 震,全部沿用旧作。
---
## 6. 教学编排(分区心智模型,设计核心)
蒙眼玩家如何建立「摸到哪是哪」?分四步,全部零惩罚(教学不计分、不出
Miss 音),单步重教 ≤2 次(第 2 次失败 → 领奏降速 25% 重演一次 → 再败跳过,
旧作 G2 DDA 沿用):
| 步 | 内容 | 机制 |
|---|---|---|
| T0 摸鼓认区 | `tut_map` 讲双轴模型(横三列=左中右声像,竖两行=上亮下沉)→ `tut_probe` 进入**探索模式**:随便摸,敲到哪区就播哪区音色 + 区名(`zone_*` 六句) | 摸到 ≥3 个不同区自动进 T1(每区名每轮教学只播一次,重复摸只出声不报名,防刷屏);**防呆:8s 无触摸自动进 T1**(摸过 1-2 区再宽限 8s),探索是礼物不是门槛——guide.test G2 等无触摸驱动依赖此路径 |
| T1 家区底鼓 | `tut_z_kick`:BC 是家。数拍 1 小节 → 领奏 `1:BC` → 下一小节应答 | 做错:纠正链(§7 归因)→ 重播领奏重试 |
| T2 左右下排 | `tut_z_sides`:BL 军鼓、BR 低嗵。领奏 `1:BL, 3:BR` → 跟打 | 同上 |
| T3 上排三音 | `tut_z_patt`:TL 踩镲、TC 高嗵、TR 吊镲。领奏 `1:TL, 2:TC, 3:TR` → 跟打 | 同上;通过后 `tut_done` 进曲目一 |
- 教学在曲目一无鼓 BGM 上进行;每步领奏前都有 1 小节底鼓数拍(教学期
count-in 不省)。
- 下滑跳过教学(`tut_skip`)保留;教学 Miss 归因真话律沿用(没出手报
「这拍没接」gd_miss_none,不谎报早晚)。
- 加花预告:`tut_fill`「最后有加花,跟着我连打。」在**曲目一终曲加花领奏
前 1 小节**播,每账号一次。
---
## 7. 连击/错拍反馈
| 时机 | 反馈 |
|---|---|
| 出手敲对 | 该区音色(pan 随行)+ Perfect 叠 accent |
| 敲错区(异分区音符半窗内被敲) | 该区音色照样出声(自由演奏语义)+ 闷镲 Miss 音 + error 震 + 播报实际敲中的区名(`zone_*`)+ `retry_wrong`「敲错鼓了,再听一遍。」(教学期)/ gd_miss 归因(正片,连 2 Miss 一次) |
| 早/晚(窗内同区但超 Perfect) | 不出错音(Good 照播),教学期事后归因 `retry_early`/`retry_late` |
| 没出手 | 音符超时闷镲 + error 震;教学归因 gd_miss_none「这拍没接」 |
| 16 连击 / 乐句全 Perfect / 解锁 / S·A 结算 | success 震 / [20,40,20] / success+[20,40,20] / success(沿用旧作) |
| 曲目过半 | `mid_song`(ducking 到 1/4 的旧作工艺沿用) |
---
## 8. 语音配额(拥挤控制)
打击乐密度高,语音是稀缺通道。全表 49 id 双性别(41 新 + 8 向导沿用),
运行时配额:
1. **应答小节内零语音**(含 guide 插播——idle-only 语义天然保证)。
2. 教学纠正:每次失败至多 1 条纠正链(归因 1 句 + 重听 1 句),同一步不叠加。
3. 正片:连 2 Miss 才播 gd_miss,**同曲一次**;mid_song 每曲一次;
加花预告 tut_fill 每账号一次。
4. 探索模式区名播报每区每轮教学一次(重复摸只出声)。
5. 结算链 = grade + [new_best_combo] + [unlock] + restart,无其他插话;
结算 BGM 看门狗按链长缩放(旧作 P1 修复沿用)。
6. 语音风暴保险丝(引擎 3s/5 次)是上届,游戏层不得绕过它连播同 id。
---
## 9. 音频资产规格
### 9.1 打击乐 sfx(程序合成,tools/gen_rhythm_syn.py 新建)
7 件 one-shot:`inst_kick(沿用旧 id)/ dm_snare / dm_hat / dm_tomhi / dm_crash /
dm_tomlo / dm_accent`。QC 红线(gen_cipher_syn.py 同款):去直流 + 首尾 8ms cos² 淡化 +
编码后解码回读真峰值 ≤ -3dBFS(MDCT 过冲坑,超限自动降档重编)。起音必须硬
(盲玩对拍靠起音);kick/snare/hat ≤0.3s,tom ≤0.4s,crash ≤1.3s,accent ≤0.1s。
### 9.2 BGM(3 首无鼓伴奏,Mureka ≤$0.30)
| 曲 | BPM | prompt 特征 |
|---|---|---|
| track90《启程》 | 90 | bright optimistic pop rock backing, bass guitar + strummed acoustic + light synth pads, **no drums no percussion**, steady 90 bpm, A minor |
| track105《追风》 | 105 | driving energetic pop backing, punchy bass + rhythmic guitar chops + synth, **no drums no percussion**, steady 105 bpm, A minor |
| track120《星爆》 | 120 | high energy synth rock backing, aggressive bass + arpeggio synth + power chords, **no drums no percussion**, steady 120 bpm, A minor |
- `bpm_precise.py` 实测:|偏差|>0.5 BPM 则 atempo 拉伸到标称(R3 track90 先例),
成品复测记录台账。
- 后处理:强 onset 起点 → 整数小节裁剪(时长为 4 拍整数倍)→ 末 2 拍与开头
acrossfade(tri) 无缝循环 → loudnorm I=-20/TP=-2/LRA=11 → 44.1kHz → ogg q3 + m4a 128k。
- 旧 track90/105/120(含鼓)删除;`bgm/menu`(Mureka 状态曲,无鼓问题不影响
玩法——menu pad 不与演奏同响)保留沿用。
### 9.3 语音
见 24-rhythm-voice-ids.md:41 新 id 双性别(Qwen3-TTS,flock GPU),
gen_voice_dual.py rhythm 段全量替换;`--check`(时长/峰值/两性离群)+
`--convert`(ogg q3 + m4a 128k)。废弃 id(tut_1/tut_2/tut_3/retry_gesture
及旧 welcome/rules/retry_* 文案)的音频文件随 convert 后清理删除。
---
## 10. 进度存储
沿用旧作 schema 1 结构(`{tutorialDone, unlocked, grades, bestCombo, summary}`),
key `soundgame.rhythm.progress` 不变;PUT `/api/progress` 带 summary
(`《曲名》X级 · 已解锁N/3首` 取最高评级曲目)。解锁规则不变(B 级解锁下一首)。
结算手势:单击=再来一遍(同曲)、右滑=下一首(已解锁)、下滑=回大厅,不变。
---
## 11. 断言清单(web/rhythm/test/playtest.mjs 覆盖全集)
> 13 号文档 §4 rhythm 段是旧玩法的断言,已被本文取代但**不回改**(13 号
> 文档冻结);本节是 24 号文档的断言明细,按 §编号可被测试与评审引用。
- **A1 分区映射**:`zoneOf` 3×2 九宫边界正确(角落/边界点逐一断言);payload
缺失兜底 BC。
- **A2 判定窗**:|dt|≤0.15 → Perfect(+accent 叠加);0.15<|dt|≤0.35 → Good;
|dt|>0.35 同区出手 = 自由演奏(出声不判定、不判 Miss)。
- **A3 错鼓 Miss**:异分区音符 GOOD 半窗内被敲 → Miss(闷镲 + error 震 +
combo 清零;区名播报限教学期——正片错音的归因就是那一声敲错的音色本身,不再叠语音(配额)。
- **A4 超时 Miss**:expected+0.45s 无应答 → Miss(GOOD 0.35 + 放宽 0.10)。
- **A5 序曲 tap 撤销**:immediateTap 按下认领 → 引擎 tapcancel → 认领撤销
且不计 Miss(统计回滚)。
- **A6 双击=两连击**:300ms 内同区两 tap + doubletap → 两次敲击各自独立
(可认领两个相邻音符/一次认领一次自由演奏),无撤销、无崩溃。
- **A7 教学流程**:T0 探索摸 3 区(区名每区一次)→ T1-T3 跟打通过 →
`tutorialDone`;全程零 Miss 音、零计分。
- **A8 教学重教**:单步失败 2 次 → 降速 25% 重演(gd_slow,每教学局 1 次)→
再败跳过(retry_skip)不卡死;归因真话律(没出手 → gd_miss_none)。
- **A9 数拍**:曲目开始先排 4 记底鼓 count-in(1 小节)再进句 1 领奏;
网格对齐 BGM t0。
- **A10 菜单**:main 中下滑**无条件**呼菜单(无 down 音符折中);暂停冻结
(泵停、BGM 断点);恢复后 cue.expected/_bgmT0 平移量 = 暂停时长 +
count-in 小节;guide full 档恢复先播 gd_count(每曲限 1 次)。
- **A11 加花**:fill 句领奏为八分密集 + 尾音 TR;应答窗口与普句同规则;
曲目一终曲加花前 1 小节播 tut_fill(每账号一次)。
- **A12 结算评级**:全 Perfect → S + `grades.song1==='s'` + `unlocked===2` +
unlock_song2 播报;B 级也解锁;C 级不解锁。rate 公式与阈值逐档断言。
- **A13 结算导航**:单击=同曲重开、右滑=下一首(未解锁播 song_locked)、
song3 末位右滑播 restart 不播 song_locked(旧作裁定①回归)。
- **A14 连击里程碑**:16 连击 success 震、乐句全 Perfect [20,40,20]。
- **A15 mid_song**:曲中点播报且领奏 duck 到 1/4、播完恢复。
- **A16 进度同步**:PUT body 含 summary/grades/unlocked/bestCombo;B 级提升
才覆写 grades。
- **A17 语音配额**:应答小节内零 voice 调度;gd_miss 同曲一次;探索区名
每区一次(转写级断言放 transcribe 剧本核)。
- **A18 键盘平权**:Digit1-6 注入 = 对应区命中(零延迟判定);空格 tap
(元素中心坐标)→ BC;选曲态数字键无效。
- **A19 guide 接入**:select=menu / main=battle / end=settle 状态签名同点;
首个应答窗口前 1 小节 gd_answer+turn。
- **A20 资产完整**:check_all_assets.py rhythm 段全绿(含新 sfx/bgm/voice 双性别)。
- **A21 旁白跳过**:intro/tut(引导语音)/select/end 语音播放中单击=跳句(12 号
文档 §1.2);main 演奏期单击是演奏不跳。
- **A22 全局**:启动遮罩前无音频;无未捕获异常;settings.voice 切换下一句生效;
bgm=0 时不加载 BGM。
- **A23(R1 F3)** 教学没出手失败的纠正链 retry_listen 只播一次(不二连复读)。
- **A24(R1 F1)** 曲尾 3s 内连 2 Miss 不插播 gd_miss(结算链不被顶断)。
- **A25(R1 F2)** 探针三连摸的三个区名全部播完不被掐断,教学句 queue 其后
(进阶延迟 150ms 起步:引擎入队判定在 await 加载之前,同步连发会误判)。
---
## 12. 资产预算与台账
- 语音:49 id × 2 性别 = 98 文件(Qwen3-TTS,flock .gpu.lock,零 API 费)。
- 打击乐:7 件程序合成(零成本)。
- BGM:3 任务 × $0.03,每首至多 1 次重提 → 上限 $0.18(预算线 $0.30,
累计 $1.26/$2.00 → 本轮后 ≤$1.44+$0.18=$1.56 上限)。台账追加
tools/mureka_log.md。
- 开发/测试/转写:零成本(复用 harness)。
+115
View File
@@ -0,0 +1,115 @@
# 24a · 《节拍行者》鼓手模式语音台词表(voice ids,24 号施工录音依据)
> 双性别:male=Uncle_Fu / female=Vivian(gen_voice_dual.py SPEAKERS 沿用)。
> instruct 对:「低沉醇厚的男声,像节奏游戏主持人,平稳有力」/「活力清晰的
> 年轻女声,像节奏游戏主持人,情绪饱满但不夸张」——全表同一常量。
> 主表 41 句 + 向导层沿用 9 句(gd_*,已在库不重录)= 50 句双性别(§8 配额)。
> 废弃:tut_1 / tut_2 / tut_3 / retry_gesture(手势教学时代遗产,音频随
> 本轮 convert 后删除)。
## W 组 · 开场与流程(5 句)
| id | 文案 |
|---|---|
| welcome | 欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。 |
| welcome_back | 欢迎回来,鼓手。准备好了就开始。 |
| tut_done | 很好,演出开始。 |
| tut_skip | 跳过教学,直接开始。 |
| mid_song | 过半了,保持。 |
## Z 组 · 分区教学与区名(12 句)
| id | 文案 |
|---|---|
| tut_map | 先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。 |
| tut_probe | 摸到三个不同的地方,我们就开始。 |
| tut_z_kick | 下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。 |
| tut_z_sides | 左下是军鼓,右下是低嗵。一左一右,跟着打。 |
| tut_z_patt | 上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。 |
| tut_fill | 最后有一段加花,跟着我连打。 |
| zone_tl | 左上,踩镲。 |
| zone_tc | 上中,高嗵。 |
| zone_tr | 右上,吊镲。 |
| zone_bl | 左下,军鼓。 |
| zone_bc | 下中,底鼓。 |
| zone_br | 右下,低嗵。 |
## C 组 · 教学纠正(5 句)
| id | 文案 |
|---|---|
| retry_early | 早了,等鼓点再出手。 |
| retry_late | 晚了,跟着鼓点走。 |
| retry_wrong | 敲错鼓了,再听一遍。 |
| retry_listen | 再听一遍,跟着来。 |
| retry_skip | 没关系,我们先走下一句。 |
## S 组 · 选曲与解锁(7 句)
| id | 文案 |
|---|---|
| select_hint | 左右滑选曲目,单击开始,下滑回大厅。 |
| song1_name | 第一首,启程,九十拍。 |
| song2_name | 第二首,追风,一百零五拍。 |
| song3_name | 第三首,星爆,一百二十拍。 |
| song_locked | 这首还没解锁。上一首拿到 B 级以上就能解锁。 |
| unlock_song2 | 新曲目解锁,追风! |
| unlock_song3 | 新曲目解锁,星爆! |
## G 组 · 结算(6 句)
| id | 文案 |
|---|---|
| grade_s | S 级!准确率超过九成五,完美演出。 |
| grade_a | A 级!准确率超过八成五,非常出色。 |
| grade_b | B 级,准确率超过七成。不错,还能更好。 |
| grade_c | C 级,准确率不到七成。别灰心,再来一遍。 |
| new_best_combo | 新连击纪录! |
| restart | 单击再来一遍,右滑下一首,下滑回大厅。 |
## M 组 · 菜单与规则(6 句)
| id | 文案 |
|---|---|
| rules | 规则:我敲一小节鼓,你在下一小节照着敲回来。鼓要选对,拍点也要对。 |
| settings_hint | 音色、语速、背景音乐,请回大厅修改。 |
| menu_main | 菜单。单击切换选项,双击确认。 |
| menu_resume | 继续演奏。 |
| menu_lobby | 回大厅。 |
| skip_hint | 单击可跳过旁白。 |
## 向导层沿用(9 句,已在库,不重录不重转)
gd_answer「现在跟着我打。」/ gd_miss「慢了半拍,下一小节跟上我就行。」/
gd_miss_early「抢拍了。等声音落下再滑。」/ gd_miss_late「慢了半拍。跟着节拍走。」/
gd_miss_wrong「方向不对。跟着音色滑。」/ gd_miss_none「这拍没接。我停下的时候,就轮到你了。」/
gd_slow「我放慢一些,跟着试试。」/ gd_count「四拍之后,继续。」
(gd_miss_early/late/wrong 的「滑」字文案在 24 号玩法下语义仍通——纠正语
不点名手势;如需改口文案按「重教≤2」流程另行裁定,不在本轮。)
## 键盘变体(key,P1 输入平权路线 a,8 句)
| id | key 文案 |
|---|---|
| tut_map | 先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。按数字一键到六键,听六面鼓。 |
| tut_probe | 按出三个不同的键,我们就开始。 |
| tut_z_kick | 数字五,是底鼓,你的家。先听四下数拍,然后跟着我敲。 |
| tut_z_sides | 数字四,军鼓。数字六,低嗵。一左一右,跟着打。 |
| tut_z_patt | 上面一排更清亮。数字一踩镲,数字二高嗵,数字三吊镲。听这一句,三个音。 |
| select_hint | 左右方向键选曲目,按空格开始,按下方向键回大厅。 |
| restart | 按空格再来一遍,按右方向键下一首,按下方向键回大厅。 |
| menu_main | 菜单。按空格切换选项,按回车确认。 |
> skip_hint / rules / retry_* / zone_* 无操作词,主资产触屏/键盘通用,不设变体。
> key 变体为**补充合成**( `--only-variants` 单独跑),主表同 id 文案照常重录。
## 录制说明
- gen_voice_dual.py RHYTHM_LINES 段全量替换为本表(41 句);KEY_LINES rhythm
段替换为本表 key 变体(8 句)。
- 生成:`.venv-tts/bin/python tools/gen_voice_dual.py --game rhythm --gender both`
(flock .gpu.lock);检查 `--check`;转码 `--convert`。
- convert 后删除废弃 id 音频:tut_1 / tut_2 / tut_3 / retry_gesture
(male/female 及 key 变体共 16 文件)。
- web/harness/voice_text.json 的 rhythm 主表与 `__key__` 变体表同步本台词
(转写时长估算与 ASR 判定用)。
+9 -1
View File
@@ -299,11 +299,19 @@ vibrate([50, 30, 50]); // 自定义震型
```js
const detach = attachGestures(element, onGesture, config?)
// onGesture: (g: 'up'|'down'|'left'|'right'|'tap'|'doubletap'
// |'longpress'|'longpressend'|'tapcancel') => void
// |'longpress'|'longpressend'|'tapcancel',
// info?: { x: number, y: number }) => void
// ('tapcancel' 仅 immediateTap 模式补发,见下)
// detach(): 解除绑定
```
第二参 `info`(坐标透传,24 号鼓手模式新增,**缺省行为逐字节不变**):
`{x, y}` 为视口像素坐标——点按类事件(tap/序曲 tap/双击改判/tapcancel)与
长按 = **按下点**;四向滑动 = **滑动起点**(出手瞄准位置);键盘通道 =
虚拟指针坐标(元素中心,方向键滑动同样携带)。需要触点位置的游戏(rhythm
分区打击的「敲哪个区」判定)使用;既有单参回调零感知、零回归成本
(同 opts.pan / immediateTap / tapcancel 先例)。
判定参数(`DEFAULT_GESTURE_CONFIG`,与 Android `GestureConfig` 对齐):
| 参数 | 默认 | 含义 |
@@ -0,0 +1,30 @@
# round0 · 阶段零可行性勘察与引擎回归证据
日期:2026-09-14。依据 docs/design/24-rhythm-drummer.md §0。
## 可行性决策
- 引擎手势事件**不携带坐标**(web/engine/gesture.js 勘察结论)。
- 选**路线 (a)**:引擎后向兼容扩展——全部 onGesture 调用补第二实参
`{x, y}`(tap/长按=按下点,滑动=起点,键盘=虚拟指针坐标)。既有 15 款
游戏回调均为单参,多余实参被忽略,判定/震动/时序逐字节不变
(同 opts.pan / immediateTap / tapcancel 先例)。
- 已同步 docs/web-engine-api.md §engine/gesture.js(onGesture 签名 +
info 第二参说明)。
## 引擎改动清单
- web/engine/gesture.js:downX/downY 跟踪;13 个 onGesture 调用点补 payload;
文件头注释补第二参说明。无 config 新增、无判定阈值/震动改动。
## 全量回归(铁律义务,全绿)
| 测试 | 结果 |
|---|---|
| 15 游戏 playtest(storyline 82 / escape 140 / simon 132 / rhythm 141 / space 172 / rpg 188 / radio 246 / dungeon 1649 / detective 279 / abyss 278 / hunt 211 / cipher 223 / bridge 336 / teahouse 205 / keeper 257 断言) | 全部 0 失败 |
| web/harness/guide.test.mjs | 122 断言 0 失败 |
| web/harness/engine-voice.test.mjs | 19 断言 0 失败 |
| web/harness/engine-input.test.mjs | 72 断言 0 失败 |
合计 ~4,547 断言全绿。rhythm 旧 playtest(141 断言)在重构前最后一次运行
通过,作为重构基线。
@@ -0,0 +1,218 @@
# 试玩转写:《rhythm》
> 本文件是「玩家感知日志」:一位新手玩家的整局体验转写。语音列出了玩家听到的每句话全文,
> 音效/BGM/震动按发生时间列出。「静默」段 = 玩家什么也听不到。手势是剧本注入的(模拟真人手部动作),
> 非最优操作:包含犹豫、误操作与乱试。语音时长按语速估算(±20%),仅供节奏参考。
t+ 0.0s (玩家点开游戏,轻触屏幕开始)
t+ 0.0s ▶ 语音:「欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。」
t+ 0.0s 【状态】开场旁白:我是鼓手,整个屏幕都是鼓。单击跳过 开场旁白在播(认识你的鼓),单击可以跳过(语音播放中,语速1)
t+ 0.5s ▶ 语音:「先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。」
t+ 2.6s ▶ 语音:「摸到三个不同的地方,我们就开始。」
t+ 3.1s ♪ 向导音:explore(探索/安全)
t+ 11.1s ♪ 音效 sfx/inst_kick
t+ 11.1s ▶ 语音:「下中,底鼓。」
t+ 13.2s 【状态】进入摸鼓认区:先四处摸摸,听到哪面鼓就报哪面鼓的名 摸鼓认区:随便摸,摸到 3 个不同的地方就开始(已摸 1 区)(无 BGM,语速1)
#### 【玩家动作】背景音乐《启程》无鼓伴奏已在轻声循环——拍子网格的底,鼓由我来打
t+ 13.2s 【状态】六面鼓摸遍了:左上踩镲、上中高嗵、右上吊镲、左下军鼓、下中底鼓、右下低嗵 教学:听领奏,下一小节照样敲(BC)(无 BGM,语速1)
t+ 13.2s 【状态】又摸了两下重复的,只响不报名 教学:听领奏,下一小节照样敲(BC)(无 BGM,语速1)
t+ 13.2s ♪ 音效 sfx/dm_hat
t+ 13.2s ▶ 语音:「左上,踩镲。」
t+ 13.2s ♪ 音效 sfx/dm_tomhi
t+ 13.2s ▶ 语音:「上中,高嗵。」
t+ 13.2s ▶ 语音:「下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。」
t+ 13.2s ♪ 音效 sfx/dm_snare
t+ 13.2s ♪ 音效 sfx/inst_kick
t+ 13.2s ♪ 音效 sfx/dm_tomlo
t+ 13.2s ♪ 音效 sfx/dm_hat
t+ 13.2s ♪ 音效 sfx/dm_tomlo
t+ 13.2s 【状态】摸到三个不同的地方,自动开始教学第一步 教学:听领奏,下一小节照样敲(BC)(无 BGM,语速1)
t+ 13.2s 【状态】教学第 1/3 步:听数拍和领奏,下一小节照着敲 教学:听领奏,下一小节照样敲(BC)(无 BGM,语速1)
t+ 16.7s 〰 震动:beat(节拍点)
t+ 17.3s 〰 震动:beat(节拍点)
t+ 18.0s 〰 震动:beat(节拍点)
t+ 18.7s 〰 震动:beat(节拍点)
t+ 19.3s 〰 震动:beat(节拍点)
t+ 22.0s ♪ 音效 sfx/inst_kick
t+ 22.0s ♪ 音效 sfx/dm_accent
t+ 22.8s ▶ 语音:「左下是军鼓,右下是低嗵。一左一右,跟着打。」
t+ 24.9s 【状态】教学第 2/3 步:听数拍和领奏,下一小节照着敲 教学:听领奏,下一小节照样敲(BL→BR)(无 BGM,语速1)
t+ 27.3s 〰 震动:beat(节拍点)
t+ 28.0s 〰 震动:beat(节拍点)
t+ 28.7s 〰 震动:beat(节拍点)
t+ 29.3s 〰 震动:beat(节拍点)
t+ 30.0s 〰 震动:beat(节拍点)
t+ 31.3s 〰 震动:beat(节拍点)
t+ 32.7s ♪ 音效 sfx/dm_snare
t+ 32.7s ♪ 音效 sfx/dm_accent
t+ 34.0s ♪ 音效 sfx/dm_tomlo
t+ 34.0s ♪ 音效 sfx/dm_accent
t+ 34.8s ▶ 语音:「上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。」
t+ 36.9s 【状态】教学第 3/3 步:听数拍和领奏,下一小节照着敲 教学:听领奏,下一小节照样敲(TL→TC→TR)(无 BGM,语速1)
t+ 40.7s 〰 震动:beat(节拍点)
t+ 41.3s 〰 震动:beat(节拍点)
t+ 42.0s 〰 震动:beat(节拍点)
t+ 42.7s 〰 震动:beat(节拍点)
t+ 43.3s 〰 震动:beat(节拍点)
t+ 44.0s 〰 震动:beat(节拍点)
t+ 44.7s 〰 震动:beat(节拍点)
t+ 46.0s ♪ 音效 sfx/dm_hat
t+ 46.0s ♪ 音效 sfx/dm_accent
t+ 46.7s ♪ 音效 sfx/dm_tomhi
t+ 46.7s ♪ 音效 sfx/dm_accent
t+ 47.4s ♪ 音效 sfx/dm_crash
t+ 47.4s ♪ 音效 sfx/dm_accent
t+ 48.1s ▶ 语音:「很好,演出开始。」
t+ 50.2s ♪ 向导音:battle(战斗/对抗)
t+ 50.2s 【状态】教学完毕,曲目一《启程》90 拍开始。先听四下底鼓数拍,然后是「现在跟着我打」 演奏中(启程):还剩 32 个应答音。领奏停了、轮到空拍,就该我出手了;有一段加花要连打(无 BGM,语速1)
#### 【玩家动作】《启程》无鼓伴奏 BGM 起,四下底鼓数拍对齐小节
t+ 51.2s 〰 震动:beat(节拍点)
t+ 51.9s 〰 震动:beat(节拍点)
t+ 52.6s 〰 震动:beat(节拍点)
t+ 52.8s ♪ 向导音:menu(系统界面)
t+ 52.8s ▶ 语音:「菜单。单击切换选项,双击确认。」
t+ 52.8s 【状态】曲中暂停,进了菜单 暂停菜单:单击切选项,双击确认,上滑帮助,下滑恢复演奏(语音播放中,语速1)
#### 【玩家动作】BGM 在断点冻住——谱面、判定、音乐全部暂停
t+ 53.2s 〰 震动:beat(节拍点)
t+ 54.9s ▶ 语音:「继续演奏。」
#### 【玩家动作】还是想打完这首,下滑回去
t+ 54.9s ▶ 向导语音:「四拍之后,继续。」
t+ 54.9s 【状态】听到「四拍之后,继续」,跟着四下底鼓数拍进来了 演奏中(启程):还剩 32 个应答音。领奏停了、轮到空拍,就该我出手了;有一段加花要连打(语音播放中,语速1)
#### 【玩家动作】BGM 从断点续播,节拍网格整体后移了一小节
t+ 54.9s ……… 静默 5s(还在数拍子,第一句没敢出手) ………
t+ 57.1s 〰 震动:beat(节拍点)
t+ 57.8s 〰 震动:beat(节拍点)
t+ 58.4s 〰 震动:beat(节拍点)
t+ 59.1s 〰 震动:beat(节拍点)
t+ 60.9s ▶ 向导语音:「现在跟着我打。」
t+ 60.9s ♪ 向导音:turn(轮到你)
t+ 60.9s 〰 震动:beat(节拍点)
t+ 62.2s 〰 震动:beat(节拍点)
t+ 64.0s 〰 震动:error(做错了:两连短震)
t+ 65.4s ▶ 向导语音:「慢了半拍,下一小节跟上我就行。」
t+ 65.4s 〰 震动:error(做错了:两连短震)
t+ 65.4s 【状态】第一句全漏了,听到「慢了半拍,下一小节跟上我就行」 演奏中(启程):还剩 30 个应答音。领奏停了、轮到空拍,就该我出手了;有一段加花要连打(语音播放中,语速1)
t+ 68.9s 〰 震动:beat(节拍点)
t+ 70.2s 〰 震动:beat(节拍点)
t+ 71.6s ♪ 音效 sfx/dm_snare
t+ 71.6s ♪ 音效 sfx/dm_accent
t+ 72.9s ♪ 音效 sfx/dm_tomlo
t+ 72.9s ♪ 音效 sfx/dm_accent
t+ 72.9s 〰 震动:自定义震型 [20,40,20]
t+ 76.9s 〰 震动:beat(节拍点)
t+ 77.6s 〰 震动:beat(节拍点)
t+ 78.2s 〰 震动:beat(节拍点)
t+ 79.6s ♪ 音效 sfx/inst_kick
t+ 79.6s ♪ 音效 sfx/dm_accent
t+ 80.3s ♪ 音效 sfx/inst_kick
t+ 80.3s ♪ 音效 sfx/dm_accent
t+ 80.9s ♪ 音效 sfx/dm_snare
t+ 80.9s ♪ 音效 sfx/dm_accent
t+ 80.9s 〰 震动:自定义震型 [20,40,20]
t+ 84.9s 〰 震动:beat(节拍点)
t+ 85.6s 〰 震动:beat(节拍点)
t+ 86.2s 〰 震动:beat(节拍点)
t+ 87.6s ♪ 音效 sfx/dm_snare
t+ 87.6s ♪ 音效 sfx/dm_accent
t+ 88.3s ♪ 音效 sfx/dm_tomlo
t+ 88.3s ♪ 音效 sfx/dm_accent
t+ 88.9s ♪ 音效 sfx/inst_kick
t+ 88.9s ♪ 音效 sfx/dm_accent
t+ 88.9s 〰 震动:自定义震型 [20,40,20]
t+ 92.9s ▶ 语音:「过半了,保持。」
t+ 92.9s 〰 震动:beat(节拍点)
t+ 93.6s 〰 震动:beat(节拍点)
t+ 94.2s 〰 震动:beat(节拍点)
t+ 94.9s 〰 震动:beat(节拍点)
t+ 95.6s ♪ 音效 sfx/inst_kick
t+ 95.6s ♪ 音效 sfx/dm_accent
t+ 96.3s ♪ 音效 sfx/dm_snare
t+ 96.3s ♪ 音效 sfx/dm_accent
t+ 96.9s ♪ 音效 sfx/inst_kick
t+ 96.9s ♪ 音效 sfx/dm_accent
t+ 97.6s ♪ 音效 sfx/dm_tomlo
t+ 97.6s ♪ 音效 sfx/dm_accent
t+ 97.6s 〰 震动:自定义震型 [20,40,20]
t+ 98.2s 〰 震动:beat(节拍点)
t+ 99.6s 〰 震动:beat(节拍点)
t+ 100.2s 〰 震动:beat(节拍点)
t+ 100.9s ♪ 音效 sfx/dm_hat
t+ 100.9s ♪ 音效 sfx/dm_accent
t+ 102.3s ♪ 音效 sfx/dm_snare
t+ 102.3s ♪ 音效 sfx/dm_accent
t+ 102.9s ♪ 音效 sfx/inst_kick
t+ 102.9s ♪ 音效 sfx/dm_accent
t+ 102.9s 〰 震动:自定义震型 [20,40,20]
t+ 103.6s 〰 震动:beat(节拍点)
t+ 104.2s 〰 震动:beat(节拍点)
t+ 104.9s 〰 震动:beat(节拍点)
t+ 105.6s 〰 震动:beat(节拍点)
t+ 106.3s ♪ 音效 sfx/inst_kick
t+ 106.3s ♪ 音效 sfx/dm_accent
t+ 106.3s 〰 震动:success(成功长震)
t+ 106.9s ♪ 音效 sfx/dm_hat
t+ 106.9s ♪ 音效 sfx/dm_accent
t+ 107.6s ♪ 音效 sfx/inst_kick
t+ 107.6s ♪ 音效 sfx/dm_accent
t+ 108.3s ♪ 音效 sfx/dm_crash
t+ 108.3s ♪ 音效 sfx/dm_accent
t+ 108.3s 〰 震动:自定义震型 [20,40,20]
t+ 108.9s 〰 震动:beat(节拍点)
t+ 109.6s 〰 震动:beat(节拍点)
t+ 110.2s 〰 震动:beat(节拍点)
t+ 110.9s 〰 震动:beat(节拍点)
t+ 111.6s ▶ 语音:「最后有一段加花,跟着我连打。」
t+ 111.6s ♪ 音效 sfx/dm_snare
t+ 111.6s ♪ 音效 sfx/dm_accent
t+ 112.3s ♪ 音效 sfx/dm_tomlo
t+ 112.3s ♪ 音效 sfx/dm_accent
t+ 112.9s ♪ 音效 sfx/dm_hat
t+ 112.9s ♪ 音效 sfx/dm_accent
t+ 113.6s ♪ 音效 sfx/inst_kick
t+ 113.6s ♪ 音效 sfx/dm_accent
t+ 113.6s 〰 震动:自定义震型 [20,40,20]
t+ 114.3s ♪ 向导音:turn(轮到你)
t+ 114.2s 〰 震动:beat(节拍点)
t+ 114.6s 〰 震动:beat(节拍点)
t+ 114.9s 〰 震动:beat(节拍点)
t+ 115.2s 〰 震动:beat(节拍点)
t+ 115.6s 〰 震动:beat(节拍点)
t+ 115.9s 〰 震动:beat(节拍点)
t+ 116.2s 〰 震动:beat(节拍点)
t+ 116.9s ♪ 音效 sfx/inst_kick
t+ 116.9s ♪ 音效 sfx/dm_accent
t+ 117.3s ♪ 音效 sfx/inst_kick
t+ 117.3s ♪ 音效 sfx/dm_accent
t+ 117.6s ♪ 音效 sfx/inst_kick
t+ 117.6s ♪ 音效 sfx/dm_accent
t+ 117.9s ♪ 音效 sfx/dm_snare
t+ 117.9s ♪ 音效 sfx/dm_accent
t+ 118.3s ♪ 音效 sfx/dm_snare
t+ 118.3s ♪ 音效 sfx/dm_accent
t+ 118.6s ♪ 音效 sfx/inst_kick
t+ 118.6s ♪ 音效 sfx/dm_accent
t+ 118.9s ♪ 音效 sfx/dm_crash
t+ 118.9s ♪ 音效 sfx/dm_accent
t+ 118.9s 〰 震动:自定义震型 [20,40,20]
t+ 119.9s ♪ 向导音:settle(结算)
t+ 119.9s ▶ 语音:「A 级!准确率超过八成五,非常出色。」
t+ 119.9s 〰 震动:success(成功长震)
t+ 119.9s 〰 震动:success(成功长震)
t+ 119.9s 〰 震动:自定义震型 [20,40,20]
t+ 122.0s ▶ 语音:「新连击纪录!」
t+ 124.1s ▶ 语音:「新曲目解锁,追风!」
t+ 126.2s ▶ 语音:「单击再来一遍,右滑下一首,下滑回大厅。」
t+ 128.4s ♫ BGM 切换 → bgm/menu(淡入 800ms)
t+ 152.9s 【状态】曲子打完了(加花收尾是一记吊镲),结算播报中 结算播报中:听完单击再来一遍,右滑下一首,下滑回大厅(BGM=bgm/menu,语速1)
#### 【玩家动作】曲目 BGM 淡出,结算语音链播完会淡入大厅音乐
@@ -0,0 +1,51 @@
# 《节拍行者》鼓手模式 R1 全拟真试玩报告
两会话均真机跑完(live harness:真 chromium + SenseVoice ASR 听游戏实况,非 mock;
控制端口 8142,游戏服务器 8001)。驱动为事件流跟随器(vibrate 锚定真实发声时刻 +
谱序消费),节奏精度经多轮校准后 dt≈0.00s。
## 局 A(主线 · male 1.0× · guide=full · 教学+曲目一全 Perfect 弧线)
- 产物:`live/A/`(events.jsonl 40KB / mix.webm 4.7MB / transcript.md / verdicts.json)
- ASR 判定:**OK 11 / TRUNCATED 5 / MISMATCH 2**(SFX_BGM_ONLY 间隙探针 7)
- 完整弧线实录:摸鼓认区(zone_tl OK)→ T1 降速重演(gd_slow OK sim=1.0)→
T2/T3 通过 → tut_done(OK sim=1.0)→ 数拍 → gd_answer(OK sim=1.0)→
mid_song(OK sim=0.8)→ tut_fill(OK sim=0.92)→ **grade_a(A 级)→
unlock_song2(OK sim=0.93)→ restart(OK)**,全链无人为干预走通
- 演奏精度:**33 记 Perfect accent / 4 记 Miss**——跟随线程与游戏判定网格的
逐音配对(pop 日志 entry.when ≈ vibrate.ta ±0.02s)证明判定窗(±0.15/±0.35)
在真机触摸链路(CDP 合成触摸+HTTP)下准确兑现
- 归因(全部非游戏缺陷或已修级):
- TRUNCATED welcome/tut_map/tut_probe = 驱动故意三连跳旁白(kill)
- MISMATCH zone_tr / new_best_combo = 短句 ASR 同音近失(「右上吊镲」→
「有上调查」;「新连击纪录」→「新联机记录」),cipher 批次先例同款
- TRUNCATED zone_bl = 探针第三击触发进阶时 stopVoice 切断区名(P2)
- TRUNCATED gd_miss = 曲尾连 Miss 的向导句播 1.1s 后被结算评级语音顶掉
(半句「慢了半拍。」)——P1(F1)
- 曲终 4 记 Miss 系驱动 clearPending 误杀尾单补发(驱动侧 artifact,已修)
## 局 B(压力线 · female 1.7× · guide=standard · bgm 0.3 · 错区乱打+菜单+长按)
- 产物:`live/B/`(events.jsonl / mix.webm 3.3MB / transcript.md;verdicts 因驱动
超时未及落盘——control 层 artifact,非游戏问题)
- 关键机制实录:跳教学(tut_skip)→ 数拍 → **错区乱打全程 guide=standard
零向导语音**(gd_* vstart = 0,earcon/震动照发)→ 32 记 error 震 + grade_c
→ 曲中菜单(下滑→单击切选项→上滑帮助→下滑恢复,恢复后网格平移续播)→
长按死输入(闷镲+error 震,不判定不归属)→ 结算链
- 1.7× 语速下语音链无截断无风暴(保险丝零触发)
## 结论
- 教学 DDA(gd_slow)、归因真话律(gd_miss_none)、count-in 恢复(gd_count)、
模态菜单断点续播、错鼓闷镲反馈、长按死输入定义——全部实况兑现
- 判定网格精确性真机直证(33/37 Perfect 级命中,dt 均值 ~0.00s)
- 无死锁、无状态错乱、非资产类 console.error = 0
- 基础设施教训(沉淀,惠及后续 live 驱动):
1. 事件流驱动必须单飞拉取(并发 pump 同 since 窗口 → 事件重复入队错位)
2. start 事件带 `when` 字段:when>0=排程领奏 / when=0=即时(玩家击/闷镲),
玩家击会回声触发跟随循环,必须双重过滤
3. 发声时刻锚定用 vibrate 事件(setTimeout 按 ev.time 触发),不用 start 的
t(含 _load 时序噪声)
4. BGM 的 source.start(t0) 也是 when>0 的 start 事件,入队前必须按 layer 过滤
5. 视口坐标:control 默认 390×844,三区边界 130/260(驱动初版按 300×600
导致右列全部敲成中列)
@@ -0,0 +1,368 @@
{"ev":"probe_ready","t":9.400000005960464,"ta":null}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":1520.9000000059605,"ta":-0.083}
{"ev":"recstart","mime":"audio/webm;codecs=opus","t":1603.6000000238419,"ta":0}
{"ev":"fetch","url":"audio/sfx/dm_hat.ogg","status":200,"ok":true,"ms":15,"t":1618.5,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_tomhi.ogg","status":200,"ok":true,"ms":14,"t":1618.7000000178814,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_crash.ogg","status":200,"ok":true,"ms":14,"t":1618.800000011921,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_snare.ogg","status":200,"ok":true,"ms":14,"t":1618.800000011921,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/inst_kick.ogg","status":200,"ok":true,"ms":14,"t":1618.800000011921,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_tomlo.ogg","status":200,"ok":true,"ms":14,"t":1618.9000000059605,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_accent.ogg","status":200,"ok":true,"ms":14,"t":1618.9000000059605,"ta":0.015}
{"ev":"fetch","url":"audio/bgm/menu.ogg","status":200,"ok":true,"ms":14,"t":1619,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/tut_map.ogg","status":200,"ok":true,"ms":14,"t":1619,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/welcome.ogg","status":200,"ok":true,"ms":15,"t":1619.1000000238419,"ta":0.016}
{"ev":"fetch","url":"audio/voice/male/welcome_back.ogg","status":200,"ok":true,"ms":15,"t":1619.5,"ta":0.016}
{"ev":"fetch","url":"audio/voice/male/mid_song.ogg","status":200,"ok":true,"ms":19,"t":1624,"ta":0.02}
{"ev":"fetch","url":"audio/voice/male/tut_probe.ogg","status":200,"ok":true,"ms":19,"t":1624.300000011921,"ta":0.021}
{"ev":"fetch","url":"audio/voice/male/select_hint.ogg","status":200,"ok":true,"ms":20,"t":1624.7000000178814,"ta":0.021}
{"ev":"fetch","url":"audio/bgm/track90.ogg","status":200,"ok":true,"ms":20,"t":1625.4000000059605,"ta":0.022}
{"ev":"fetch","url":"audio/bgm/track120.ogg","status":200,"ok":true,"ms":20,"t":1625.5,"ta":0.022}
{"ev":"fetch","url":"audio/bgm/track105.ogg","status":200,"ok":true,"ms":22,"t":1627.6000000238419,"ta":0.024}
{"ev":"vstart","url":"audio/voice/male/welcome.ogg","t":1665.6000000238419,"dur":8.24,"ta":0.062}
{"ev":"start","t":1849.6000000238419,"sid":1,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":6,"ta":0.246}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":2812.300000011921,"ta":1.209}
{"ev":"vibrate","pattern":"[20]","t":2813.9000000059605,"ta":1.21}
{"ev":"vend","url":"audio/voice/male/welcome.ogg","t":3314.4000000059605,"reason":"kill","ta":1.711}
{"ev":"vstart","url":"audio/voice/male/tut_map.ogg","t":3314.600000023842,"dur":18.04,"ta":1.711}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":4181.700000017881,"ta":2.578}
{"ev":"vibrate","pattern":"[20]","t":4183.200000017881,"ta":2.58}
{"ev":"vend","url":"audio/voice/male/tut_map.ogg","t":4683.4000000059605,"reason":"kill","ta":3.08}
{"ev":"vstart","url":"audio/voice/male/tut_probe.ogg","t":4683.5,"dur":3.84,"ta":3.08}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":5550.9000000059605,"ta":3.947}
{"ev":"vibrate","pattern":"[20]","t":5552.4000000059605,"ta":3.949}
{"ev":"vend","url":"audio/voice/male/tut_probe.ogg","t":6052.600000023842,"reason":"kill","ta":4.449}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":6920.300000011921,"ta":5.317}
{"ev":"vibrate","pattern":"[20]","t":6921.9000000059605,"ta":5.318}
{"ev":"start","t":6922.600000023842,"sid":2,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":5.319}
{"ev":"fetch","url":"audio/voice/male/zone_tl.ogg","status":200,"ok":true,"ms":3,"t":6925,"ta":5.321}
{"ev":"vstart","url":"audio/voice/male/zone_tl.ogg","t":6928.700000017881,"dur":1.6,"ta":5.325}
{"ev":"vend","url":"audio/voice/male/zone_tl.ogg","t":8530,"reason":"kill","ta":6.926}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":9590.800000011921,"ta":7.987}
{"ev":"vibrate","pattern":"[20]","t":9594,"ta":7.99}
{"ev":"start","t":9594.40000000596,"sid":3,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":7.991}
{"ev":"fetch","url":"audio/voice/male/zone_tr.ogg","status":200,"ok":true,"ms":2,"t":9596.600000023842,"ta":7.993}
{"ev":"vstart","url":"audio/voice/male/zone_tr.ogg","t":9600.100000023842,"dur":1.76,"ta":7.997}
{"ev":"vend","url":"audio/voice/male/zone_tr.ogg","t":11478.5,"reason":"kill","ta":9.875}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":12264.100000023842,"ta":10.661}
{"ev":"vibrate","pattern":"[20]","t":12265.90000000596,"ta":10.662}
{"ev":"start","t":12266.40000000596,"sid":4,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":10.663}
{"ev":"fetch","url":"audio/voice/male/zone_bl.ogg","status":200,"ok":true,"ms":3,"t":12269.200000017881,"ta":10.666}
{"ev":"fetch","url":"audio/voice/male/tut_z_kick.ogg","status":200,"ok":true,"ms":4,"t":12270.5,"ta":10.667}
{"ev":"vstart","url":"audio/voice/male/zone_bl.ogg","t":12272,"dur":2,"ta":10.668}
{"ev":"vend","url":"audio/voice/male/zone_bl.ogg","t":12278.300000011921,"reason":"kill","ta":10.675}
{"ev":"vstart","url":"audio/voice/male/tut_z_kick.ogg","t":12278.300000011921,"dur":7.28,"ta":10.675}
{"ev":"vend","url":"audio/voice/male/tut_z_kick.ogg","t":19813.90000000596,"reason":"kill","ta":18.21}
{"ev":"start","t":23014.600000023842,"sid":5,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":22,"ta":21.411}
{"ev":"vibrate","pattern":"[8]","t":23593.70000001788,"ta":21.99}
{"ev":"start","t":23694.5,"sid":6,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":22.666666666666668,"ta":22.091}
{"ev":"vibrate","pattern":"[8]","t":24266.5,"ta":22.663}
{"ev":"start","t":24334.600000023842,"sid":7,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":23.333333333333332,"ta":22.731}
{"ev":"vibrate","pattern":"[8]","t":24923.5,"ta":23.32}
{"ev":"start","t":25014.5,"sid":8,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":24,"ta":23.411}
{"ev":"vibrate","pattern":"[8]","t":25596.5,"ta":23.993}
{"ev":"start","t":25694.5,"sid":9,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":24.666666666666668,"ta":24.091}
{"ev":"vibrate","pattern":"[8]","t":26269.600000023842,"ta":24.666}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":28894.5,"ta":27.291}
{"ev":"vibrate","pattern":"[20]","t":28897.30000001192,"ta":27.294}
{"ev":"start","t":28897.600000023842,"sid":10,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":27.294}
{"ev":"start","t":28897.70000001788,"sid":11,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":27.294}
{"ev":"fetch","url":"audio/voice/male/tut_z_sides.ogg","status":200,"ok":true,"ms":3,"t":29697.5,"ta":28.094}
{"ev":"vstart","url":"audio/voice/male/tut_z_sides.ogg","t":29704.30000001192,"dur":5.2,"ta":28.101}
{"ev":"vend","url":"audio/voice/male/tut_z_sides.ogg","t":34928.60000002384,"reason":"kill","ta":33.325}
{"ev":"start","t":36369,"sid":12,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":35.33333333333333,"ta":34.765}
{"ev":"vibrate","pattern":"[8]","t":36930,"ta":35.326}
{"ev":"start","t":37049.10000002384,"sid":13,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":35.99999999999999,"ta":35.446}
{"ev":"vibrate","pattern":"[8]","t":37603,"ta":35.999}
{"ev":"start","t":37688.90000000596,"sid":14,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":36.666666666666664,"ta":36.085}
{"ev":"vibrate","pattern":"[8]","t":38260,"ta":36.656}
{"ev":"start","t":38369,"sid":15,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":37.33333333333333,"ta":36.765}
{"ev":"vibrate","pattern":"[8]","t":38933,"ta":37.329}
{"ev":"start","t":39008.90000000596,"sid":16,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":37.99999999999999,"ta":37.405}
{"ev":"vibrate","pattern":"[8]","t":39590.10000002384,"ta":37.987}
{"ev":"start","t":40369,"sid":17,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":39.33333333333333,"ta":38.765}
{"ev":"vibrate","pattern":"[8]","t":40935.90000000596,"ta":39.332}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":42237.20000001788,"ta":40.634}
{"ev":"vibrate","pattern":"[20]","t":42239.40000000596,"ta":40.636}
{"ev":"start","t":42239.60000002384,"sid":18,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":40.636}
{"ev":"start","t":42239.60000002384,"sid":19,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":40.636}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":43567,"ta":41.963}
{"ev":"vibrate","pattern":"[20]","t":43568.60000002384,"ta":41.965}
{"ev":"start","t":43568.90000000596,"sid":20,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":41.965}
{"ev":"start","t":43568.90000000596,"sid":21,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":41.965}
{"ev":"fetch","url":"audio/voice/male/tut_z_patt.ogg","status":200,"ok":true,"ms":3,"t":44371.70000001788,"ta":42.768}
{"ev":"vstart","url":"audio/voice/male/tut_z_patt.ogg","t":44381.40000000596,"dur":9.68,"ta":42.778}
{"ev":"vend","url":"audio/voice/male/tut_z_patt.ogg","t":54153.30000001192,"reason":"kill","ta":52.55}
{"ev":"start","t":55033.70000001788,"sid":22,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":54,"ta":53.43}
{"ev":"vibrate","pattern":"[8]","t":55592.70000001788,"ta":53.989}
{"ev":"start","t":55673.70000001788,"sid":23,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":54.666666666666664,"ta":54.07}
{"ev":"vibrate","pattern":"[8]","t":56272.70000001788,"ta":54.669}
{"ev":"start","t":56353.60000002384,"sid":24,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":55.333333333333336,"ta":54.75}
{"ev":"vibrate","pattern":"[8]","t":56922.70000001788,"ta":55.319}
{"ev":"start","t":57033.60000002384,"sid":25,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":56,"ta":55.43}
{"ev":"vibrate","pattern":"[8]","t":57595.70000001788,"ta":55.992}
{"ev":"start","t":57713.60000002384,"sid":26,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":56.666666666666664,"ta":56.11}
{"ev":"vibrate","pattern":"[8]","t":58268.70000001788,"ta":56.665}
{"ev":"start","t":58353.60000002384,"sid":27,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":57.33333333333333,"ta":56.75}
{"ev":"vibrate","pattern":"[8]","t":58925.70000001788,"ta":57.322}
{"ev":"start","t":59033.60000002384,"sid":28,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":58,"ta":57.43}
{"ev":"vibrate","pattern":"[8]","t":59598.70000001788,"ta":57.995}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":60878.30000001192,"ta":59.275}
{"ev":"vibrate","pattern":"[20]","t":60883.40000000596,"ta":59.28}
{"ev":"start","t":60883.5,"sid":29,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":59.28}
{"ev":"start","t":60883.5,"sid":30,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":59.28}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":61541.40000000596,"ta":59.938}
{"ev":"vibrate","pattern":"[20]","t":61542.70000001788,"ta":59.939}
{"ev":"start","t":61542.90000000596,"sid":31,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":59.939}
{"ev":"start","t":61542.90000000596,"sid":32,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":59.939}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":62287.5,"ta":60.684}
{"ev":"vibrate","pattern":"[20]","t":62288.90000000596,"ta":60.685}
{"ev":"start","t":62289.10000002384,"sid":33,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":60.686}
{"ev":"start","t":62289.10000002384,"sid":34,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":60.686}
{"ev":"fetch","url":"audio/voice/male/tut_done.ogg","status":200,"ok":true,"ms":2,"t":63035.60000002384,"ta":61.432}
{"ev":"vstart","url":"audio/voice/male/tut_done.ogg","t":63039.70000001788,"dur":2.48,"ta":61.436}
{"ev":"vend","url":"audio/voice/male/tut_done.ogg","t":65762.40000000596,"reason":"kill","ta":64.159}
{"ev":"stop","t":65762.70000001788,"sid":1,"when":0,"ta":64.159}
{"ev":"start","t":65763.90000000596,"sid":35,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":65.16834467120181,"ta":64.16}
{"ev":"start","t":66204.10000002384,"sid":36,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":65.16834467120181,"ta":64.601}
{"ev":"vibrate","pattern":"[8]","t":66762.10000002384,"ta":65.159}
{"ev":"start","t":66844.10000002384,"sid":37,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":65.83501133786848,"ta":65.241}
{"ev":"vibrate","pattern":"[8]","t":67442.10000002384,"ta":65.839}
{"ev":"start","t":67524,"sid":38,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":66.50167800453514,"ta":65.92}
{"ev":"vibrate","pattern":"[8]","t":68092,"ta":66.488}
{"ev":"start","t":68204.10000002384,"sid":39,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":67.16834467120181,"ta":66.601}
{"ev":"vibrate","pattern":"[8]","t":68765,"ta":67.161}
{"ev":"start","t":68844,"sid":40,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":67.83501133786848,"ta":67.24}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":69411.20000001788,"ta":67.808}
{"ev":"vibrate","pattern":"[20]","t":69413.5,"ta":67.81}
{"ev":"start","t":69413.60000002384,"sid":41,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":67.81}
{"ev":"vibrate","pattern":"[8]","t":69422.10000002384,"ta":67.819}
{"ev":"fetch","url":"audio/voice/male/gd_answer.ogg","status":200,"ok":true,"ms":2,"t":69445.80000001192,"ta":67.842}
{"ev":"vstart","url":"audio/voice/male/gd_answer.ogg","t":69449.20000001788,"dur":1.52,"ta":67.846}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":70073,"ta":68.469}
{"ev":"vibrate","pattern":"[20]","t":70074.90000000596,"ta":68.471}
{"ev":"start","t":70075,"sid":42,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":68.471}
{"ev":"start","t":70204,"sid":43,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":69.16834467120181,"ta":68.6}
{"ev":"vibrate","pattern":"[8]","t":70768,"ta":69.164}
{"ev":"vend","url":"audio/voice/male/gd_answer.ogg","t":71055.90000000596,"reason":"kill","ta":69.452}
{"ev":"vibrate","pattern":"[60,40,60]","t":72564.10000002384,"ta":70.961}
{"ev":"start","t":72564.30000001192,"sid":44,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":70.961}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":73383.90000000596,"ta":71.78}
{"ev":"vibrate","pattern":"[20]","t":73385.30000001192,"ta":71.782}
{"ev":"start","t":73385.5,"sid":45,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":71.782}
{"ev":"start","t":73385.5,"sid":46,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":71.782}
{"ev":"start","t":76843.90000000596,"sid":47,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":75.83501133786848,"ta":75.24}
{"ev":"vibrate","pattern":"[8]","t":77434,"ta":75.83}
{"ev":"start","t":78204.10000002384,"sid":48,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":77.16834467120181,"ta":76.601}
{"ev":"vibrate","pattern":"[8]","t":78758.10000002384,"ta":77.155}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":80079.60000002384,"ta":78.476}
{"ev":"vibrate","pattern":"[20]","t":80081.90000000596,"ta":78.478}
{"ev":"start","t":80081.90000000596,"sid":49,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":78.478}
{"ev":"start","t":80082,"sid":50,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":78.478}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":81402.20000001788,"ta":79.799}
{"ev":"vibrate","pattern":"[20]","t":81403.60000002384,"ta":79.8}
{"ev":"vibrate","pattern":"[20,40,20]","t":81403.70000001788,"ta":79.8}
{"ev":"start","t":81403.80000001192,"sid":51,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":79.8}
{"ev":"start","t":81403.90000000596,"sid":52,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":79.8}
{"ev":"start","t":84844,"sid":53,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":83.83501133786848,"ta":83.24}
{"ev":"vibrate","pattern":"[8]","t":85423,"ta":83.819}
{"ev":"start","t":85524,"sid":54,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":84.50167800453515,"ta":83.92}
{"ev":"vibrate","pattern":"[8]","t":86097.10000002384,"ta":84.494}
{"ev":"start","t":86164.10000002384,"sid":55,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":85.16834467120181,"ta":84.561}
{"ev":"vibrate","pattern":"[8]","t":86753.10000002384,"ta":85.15}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":88090.80000001192,"ta":86.487}
{"ev":"vibrate","pattern":"[20]","t":88092.80000001192,"ta":86.489}
{"ev":"start","t":88092.90000000596,"sid":56,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":86.489}
{"ev":"start","t":88092.90000000596,"sid":57,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":86.489}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":88754.20000001788,"ta":87.151}
{"ev":"vibrate","pattern":"[20]","t":88755.70000001788,"ta":87.152}
{"ev":"start","t":88755.80000001192,"sid":58,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":87.152}
{"ev":"start","t":88755.80000001192,"sid":59,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":87.152}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":89416.70000001788,"ta":87.813}
{"ev":"vibrate","pattern":"[20]","t":89418.20000001788,"ta":87.815}
{"ev":"vibrate","pattern":"[20,40,20]","t":89418.30000001192,"ta":87.815}
{"ev":"start","t":89418.40000000596,"sid":60,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":87.815}
{"ev":"start","t":89418.40000000596,"sid":61,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":87.815}
{"ev":"start","t":92844.10000002384,"sid":62,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":91.83501133786848,"ta":91.241}
{"ev":"vibrate","pattern":"[8]","t":93436.10000002384,"ta":91.833}
{"ev":"start","t":93524.10000002384,"sid":63,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":92.50167800453515,"ta":91.921}
{"ev":"vibrate","pattern":"[8]","t":94086.10000002384,"ta":92.483}
{"ev":"start","t":94204.10000002384,"sid":64,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":93.16834467120181,"ta":92.601}
{"ev":"vibrate","pattern":"[8]","t":94759.20000001788,"ta":93.156}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":96113.70000001788,"ta":94.51}
{"ev":"vibrate","pattern":"[20]","t":96116.70000001788,"ta":94.513}
{"ev":"start","t":96116.80000001192,"sid":65,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":94.513}
{"ev":"start","t":96116.80000001192,"sid":66,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":94.513}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":96776.70000001788,"ta":95.173}
{"ev":"vibrate","pattern":"[20]","t":96778.10000002384,"ta":95.175}
{"ev":"start","t":96778.30000001192,"sid":67,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":95.175}
{"ev":"start","t":96778.30000001192,"sid":68,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":95.175}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":97438.80000001192,"ta":95.835}
{"ev":"vibrate","pattern":"[20]","t":97440.40000000596,"ta":95.837}
{"ev":"vibrate","pattern":"[20,40,20]","t":97440.5,"ta":95.837}
{"ev":"start","t":97440.5,"sid":69,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":95.837}
{"ev":"start","t":97440.60000002384,"sid":70,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":95.837}
{"ev":"start","t":100844,"sid":71,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":99.83501133786848,"ta":99.24}
{"ev":"vibrate","pattern":"[8]","t":101425.10000002384,"ta":99.822}
{"ev":"vstart","url":"audio/voice/male/mid_song.ogg","t":101444.40000000596,"dur":2.32,"ta":99.841}
{"ev":"start","t":101524.10000002384,"sid":72,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":100.50167800453515,"ta":99.921}
{"ev":"vibrate","pattern":"[8]","t":102098,"ta":100.494}
{"ev":"start","t":102164,"sid":73,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":101.16834467120181,"ta":100.56}
{"ev":"vibrate","pattern":"[8]","t":102755.10000002384,"ta":101.152}
{"ev":"start","t":102844,"sid":74,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":101.83501133786848,"ta":101.24}
{"ev":"vibrate","pattern":"[8]","t":103428,"ta":101.824}
{"ev":"vend","url":"audio/voice/male/mid_song.ogg","t":103793.40000000596,"reason":"kill","ta":102.19}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":104043.70000001788,"ta":102.44}
{"ev":"vibrate","pattern":"[20]","t":104045.20000001788,"ta":102.442}
{"ev":"start","t":104045.30000001192,"sid":75,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":102.442}
{"ev":"start","t":104045.30000001192,"sid":76,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":102.442}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":104790,"ta":103.186}
{"ev":"vibrate","pattern":"[20]","t":104792.10000002384,"ta":103.189}
{"ev":"start","t":104792.20000001788,"sid":77,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":103.189}
{"ev":"start","t":104792.20000001788,"sid":78,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":103.189}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":105369.20000001788,"ta":103.766}
{"ev":"vibrate","pattern":"[20]","t":105370.60000002384,"ta":103.767}
{"ev":"start","t":105370.70000001788,"sid":79,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":103.767}
{"ev":"start","t":105370.80000001192,"sid":80,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":103.767}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":106111.40000000596,"ta":104.508}
{"ev":"vibrate","pattern":"[20]","t":106112.70000001788,"ta":104.509}
{"ev":"vibrate","pattern":"[20,40,20]","t":106112.80000001192,"ta":104.509}
{"ev":"start","t":106112.80000001192,"sid":81,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":104.509}
{"ev":"start","t":106112.90000000596,"sid":82,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":104.509}
{"ev":"start","t":106164.10000002384,"sid":83,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":105.16834467120181,"ta":104.561}
{"ev":"vibrate","pattern":"[8]","t":106761.10000002384,"ta":105.158}
{"ev":"start","t":107524.10000002384,"sid":84,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":106.50167800453514,"ta":105.921}
{"ev":"vibrate","pattern":"[8]","t":108107.10000002384,"ta":106.504}
{"ev":"start","t":108204.10000002384,"sid":85,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":107.16834467120181,"ta":106.601}
{"ev":"vibrate","pattern":"[8]","t":108757,"ta":107.153}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":109422.60000002384,"ta":107.819}
{"ev":"vibrate","pattern":"[20]","t":109424.10000002384,"ta":107.821}
{"ev":"start","t":109424.20000001788,"sid":86,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":107.821}
{"ev":"start","t":109424.30000001192,"sid":87,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":107.821}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":110743,"ta":109.139}
{"ev":"vibrate","pattern":"[20]","t":110744.5,"ta":109.141}
{"ev":"start","t":110744.60000002384,"sid":88,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":109.141}
{"ev":"start","t":110744.60000002384,"sid":89,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":109.141}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":111405.40000000596,"ta":109.802}
{"ev":"vibrate","pattern":"[20]","t":111407,"ta":109.803}
{"ev":"vibrate","pattern":"[100]","t":111407,"ta":109.803}
{"ev":"vibrate","pattern":"[20,40,20]","t":111407.10000002384,"ta":109.804}
{"ev":"start","t":111407.20000001788,"sid":90,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":109.804}
{"ev":"start","t":111407.20000001788,"sid":91,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":109.804}
{"ev":"start","t":111524,"sid":92,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":110.50167800453514,"ta":109.92}
{"ev":"vibrate","pattern":"[8]","t":112090.10000002384,"ta":110.487}
{"ev":"start","t":112204,"sid":93,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":111.16834467120181,"ta":110.6}
{"ev":"vibrate","pattern":"[8]","t":112764.10000002384,"ta":111.161}
{"ev":"start","t":112844,"sid":94,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":111.83501133786847,"ta":111.24}
{"ev":"vibrate","pattern":"[8]","t":113420,"ta":111.816}
{"ev":"start","t":113524.20000001788,"sid":95,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":112.50167800453514,"ta":111.921}
{"ev":"vibrate","pattern":"[8]","t":114093.20000001788,"ta":112.49}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":114710,"ta":113.106}
{"ev":"vibrate","pattern":"[20]","t":114711.5,"ta":113.108}
{"ev":"start","t":114711.60000002384,"sid":96,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":113.108}
{"ev":"start","t":114711.60000002384,"sid":97,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":113.108}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":115453.10000002384,"ta":113.85}
{"ev":"vibrate","pattern":"[20]","t":115454.60000002384,"ta":113.851}
{"ev":"start","t":115454.70000001788,"sid":98,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":113.851}
{"ev":"start","t":115454.70000001788,"sid":99,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":113.851}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":116032.10000002384,"ta":114.429}
{"ev":"vibrate","pattern":"[20]","t":116033.70000001788,"ta":114.43}
{"ev":"start","t":116033.90000000596,"sid":100,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":114.43}
{"ev":"start","t":116033.90000000596,"sid":101,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":114.43}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":116772.70000001788,"ta":115.169}
{"ev":"vibrate","pattern":"[20]","t":116774.10000002384,"ta":115.171}
{"ev":"vibrate","pattern":"[20,40,20]","t":116774.30000001192,"ta":115.171}
{"ev":"start","t":116774.30000001192,"sid":102,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":115.171}
{"ev":"start","t":116774.30000001192,"sid":103,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":115.171}
{"ev":"start","t":116844,"sid":104,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":115.83501133786848,"ta":115.24}
{"ev":"vibrate","pattern":"[8]","t":117426.10000002384,"ta":115.823}
{"ev":"start","t":117524.10000002384,"sid":105,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":116.50167800453515,"ta":115.921}
{"ev":"vibrate","pattern":"[8]","t":118100.10000002384,"ta":116.497}
{"ev":"start","t":118164.10000002384,"sid":106,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":117.16834467120181,"ta":116.561}
{"ev":"vibrate","pattern":"[8]","t":118756.10000002384,"ta":117.153}
{"ev":"start","t":118844,"sid":107,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":117.83501133786848,"ta":117.24}
{"ev":"vibrate","pattern":"[8]","t":119429,"ta":117.825}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":120072.5,"ta":118.469}
{"ev":"vibrate","pattern":"[20]","t":120074,"ta":118.47}
{"ev":"start","t":120074.10000002384,"sid":108,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":118.471}
{"ev":"start","t":120074.20000001788,"sid":109,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":118.471}
{"ev":"fetch","url":"audio/voice/male/tut_fill.ogg","status":200,"ok":true,"ms":3,"t":120126.80000001192,"ta":118.523}
{"ev":"vstart","url":"audio/voice/male/tut_fill.ogg","t":120131.80000001192,"dur":3.12,"ta":118.528}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":120733.20000001788,"ta":119.13}
{"ev":"vibrate","pattern":"[20]","t":120734.80000001192,"ta":119.131}
{"ev":"start","t":120734.90000000596,"sid":110,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":119.131}
{"ev":"start","t":120735,"sid":111,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":119.131}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":121395.40000000596,"ta":119.792}
{"ev":"vibrate","pattern":"[20]","t":121396.80000001192,"ta":119.793}
{"ev":"start","t":121397,"sid":112,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":119.793}
{"ev":"start","t":121397,"sid":113,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":119.793}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":122055.60000002384,"ta":120.452}
{"ev":"vibrate","pattern":"[20]","t":122057.20000001788,"ta":120.454}
{"ev":"vibrate","pattern":"[20,40,20]","t":122057.30000001192,"ta":120.454}
{"ev":"start","t":122057.40000000596,"sid":114,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":120.454}
{"ev":"start","t":122057.5,"sid":115,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":120.454}
{"ev":"start","t":122164.10000002384,"sid":116,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":121.16834467120181,"ta":120.561}
{"ev":"start","t":122524,"sid":117,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":121.50167800453514,"ta":120.92}
{"ev":"vibrate","pattern":"[8]","t":122762.10000002384,"ta":121.159}
{"ev":"start","t":122844.10000002384,"sid":118,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":121.83501133786848,"ta":121.241}
{"ev":"vibrate","pattern":"[8]","t":123084,"ta":121.48}
{"ev":"start","t":123204,"sid":119,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":122.16834467120181,"ta":121.6}
{"ev":"vibrate","pattern":"[8]","t":123436.10000002384,"ta":121.833}
{"ev":"start","t":123524,"sid":120,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":122.50167800453514,"ta":121.92}
{"ev":"vend","url":"audio/voice/male/tut_fill.ogg","t":123598.5,"reason":"kill","ta":121.995}
{"ev":"vibrate","pattern":"[8]","t":123757,"ta":122.153}
{"ev":"start","t":123844,"sid":121,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":122.83501133786848,"ta":122.24}
{"ev":"vibrate","pattern":"[8]","t":124086,"ta":122.482}
{"ev":"start","t":124204,"sid":122,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":123.16834467120181,"ta":122.6}
{"ev":"vibrate","pattern":"[8]","t":124437,"ta":122.833}
{"ev":"vibrate","pattern":"[8]","t":124759.10000002384,"ta":123.156}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":125441.70000001788,"ta":123.838}
{"ev":"vibrate","pattern":"[20]","t":125444.30000001192,"ta":123.841}
{"ev":"start","t":125444.5,"sid":123,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":123.841}
{"ev":"start","t":125444.5,"sid":124,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":123.841}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":125906.60000002384,"ta":124.303}
{"ev":"vibrate","pattern":"[20]","t":125908,"ta":124.304}
{"ev":"start","t":125908.10000002384,"sid":125,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":124.305}
{"ev":"start","t":125908.10000002384,"sid":126,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":124.305}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":126370.30000001192,"ta":124.767}
{"ev":"vibrate","pattern":"[20]","t":126371.80000001192,"ta":124.768}
{"ev":"start","t":126371.90000000596,"sid":127,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":124.768}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":126835.10000002384,"ta":125.232}
{"ev":"vibrate","pattern":"[20]","t":126836.40000000596,"ta":125.233}
{"ev":"start","t":126836.60000002384,"sid":128,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":125.233}
{"ev":"start","t":126836.60000002384,"sid":129,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":125.233}
{"ev":"vibrate","pattern":"[60,40,60]","t":126923.90000000596,"ta":125.32}
{"ev":"start","t":126924.10000002384,"sid":130,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":125.321}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":127300.10000002384,"ta":125.697}
{"ev":"vibrate","pattern":"[20]","t":127301.5,"ta":125.698}
{"ev":"vibrate","pattern":"[60,40,60]","t":127301.70000001788,"ta":125.698}
{"ev":"start","t":127302.10000002384,"sid":131,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":125.699}
{"ev":"start","t":127302.20000001788,"sid":132,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":125.699}
{"ev":"fetch","url":"audio/voice/male/gd_miss.ogg","status":200,"ok":true,"ms":2,"t":127303.60000002384,"ta":125.7}
{"ev":"vstart","url":"audio/voice/male/gd_miss.ogg","t":127308.5,"dur":3.2,"ta":125.705}
{"ev":"vibrate","pattern":"[60,40,60]","t":127563.90000000596,"ta":125.96}
{"ev":"start","t":127564.10000002384,"sid":133,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":125.961}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":127765.10000002384,"ta":126.162}
{"ev":"vibrate","pattern":"[20]","t":127766.5,"ta":126.163}
{"ev":"start","t":127766.60000002384,"sid":134,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":126.163}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":128230,"ta":126.626}
{"ev":"vibrate","pattern":"[20]","t":128231.40000000596,"ta":126.628}
{"ev":"start","t":128231.60000002384,"sid":135,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":126.628}
{"ev":"vibrate","pattern":"[100]","t":128404.80000001192,"ta":126.801}
{"ev":"vibrate","pattern":"[100]","t":128404.80000001192,"ta":126.801}
{"ev":"vibrate","pattern":"[20,40,20]","t":128404.80000001192,"ta":126.801}
{"ev":"vend","url":"audio/voice/male/gd_miss.ogg","t":128405.20000001788,"reason":"kill","ta":126.802}
{"ev":"fetch","url":"audio/voice/male/grade_a.ogg","status":200,"ok":true,"ms":2,"t":128407.60000002384,"ta":126.804}
{"ev":"vstart","url":"audio/voice/male/grade_a.ogg","t":128412.60000002384,"dur":4.4,"ta":126.809}
{"ev":"stop","t":129104.5,"sid":35,"when":0,"ta":127.501}
{"ev":"vend","url":"audio/voice/male/grade_a.ogg","t":132978.40000000596,"reason":"kill","ta":131.375}
{"ev":"fetch","url":"audio/voice/male/new_best_combo.ogg","status":200,"ok":true,"ms":2,"t":132980.20000001788,"ta":131.377}
{"ev":"vstart","url":"audio/voice/male/new_best_combo.ogg","t":132983.40000000596,"dur":1.84,"ta":131.38}
{"ev":"vend","url":"audio/voice/male/new_best_combo.ogg","t":134859,"reason":"kill","ta":133.255}
{"ev":"fetch","url":"audio/voice/male/unlock_song2.ogg","status":200,"ok":true,"ms":3,"t":134861.90000000596,"ta":133.258}
{"ev":"vstart","url":"audio/voice/male/unlock_song2.ogg","t":134865.5,"dur":2.48,"ta":133.262}
{"ev":"vend","url":"audio/voice/male/unlock_song2.ogg","t":137575.5,"reason":"kill","ta":135.972}
{"ev":"fetch","url":"audio/voice/male/restart.ogg","status":200,"ok":true,"ms":3,"t":137578.20000001788,"ta":135.975}
{"ev":"vstart","url":"audio/voice/male/restart.ogg","t":137583.90000000596,"dur":4.08,"ta":135.98}
{"ev":"vend","url":"audio/voice/male/restart.ogg","t":141685.30000001192,"reason":"kill","ta":140.082}
{"ev":"start","t":141685.60000002384,"sid":136,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":140.082}
{"ev":"recstop","t":293700.5,"ta":292.097}
Binary file not shown.
@@ -0,0 +1,396 @@
# rhythm 实时会话 transcript
- `[ -0.08s]` **GESTURE** tap @(195,422)
- `[ 0.00s]` REC 开始 (audio/webm;codecs=opus)
- `[ 0.06s]` VOICE ▶ welcome (dur 8.24s)
- `[ 0.25s]` BGM ♪ track90 (loop)
- `[ 1.21s]` **GESTURE** tap @(195,422)
- `[ 1.21s]` VIBRATE [20]
- `[ 1.71s]` VOICE ■ welcome (kill)
- `[ 1.71s]` VOICE ▶ tut_map (dur 18.04s)
- `[ 1.71s]` VERDICT welcome: **TRUNCATED** sim=0.3226
- 期望: 欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。
- 听到: 欢迎来到节。
- `[ 2.58s]` **GESTURE** tap @(195,422)
- `[ 2.58s]` VIBRATE [20]
- `[ 3.08s]` VOICE ■ tut_map (kill)
- `[ 3.08s]` VOICE ▶ tut_probe (dur 3.84s)
- `[ 3.08s]` VERDICT tut_map: **TRUNCATED** sim=0.0741
- 期望: 先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。
- 听到: 写写认识。
- `[ 3.95s]` **GESTURE** tap @(195,422)
- `[ 3.95s]` VIBRATE [20]
- `[ 4.45s]` VOICE ■ tut_probe (kill)
- `[ 4.45s]` VERDICT tut_probe: **TRUNCATED** sim=0.4211
- 期望: 摸到三个不同的地方,我们就开始。
- 听到: 摸到三个布。
- `[ 5.32s]` **GESTURE** tap @(65,210)
- `[ 5.32s]` VIBRATE [20]
- `[ 5.32s]` SFX ♪ dm_hat
- `[ 5.33s]` VOICE ▶ zone_tl (dur 1.6s)
- `[ 6.93s]` VOICE ■ zone_tl (kill)
- `[ 6.93s]` VERDICT zone_tl: **OK** sim=0.75
- 期望: 左上,踩镲。
- 听到: 左上踩草。
- `[ 7.99s]` **GESTURE** tap @(325,210)
- `[ 7.99s]` VIBRATE [20]
- `[ 7.99s]` SFX ♪ dm_crash
- `[ 8.00s]` VOICE ▶ zone_tr (dur 1.76s)
- `[ 9.88s]` VOICE ■ zone_tr (kill)
- `[ 9.88s]` VERDICT zone_tr: **MISMATCH** sim=0.25
- 期望: 右上,吊镲。
- 听到: 有上调查。
- `[ 10.66s]` **GESTURE** tap @(65,630)
- `[ 10.66s]` VIBRATE [20]
- `[ 10.66s]` SFX ♪ dm_snare
- `[ 10.67s]` VOICE ▶ zone_bl (dur 2s)
- `[ 10.68s]` VOICE ■ zone_bl (kill)
- `[ 10.68s]` VOICE ▶ tut_z_kick (dur 7.28s)
- `[ 10.68s]` VERDICT zone_bl: **TRUNCATED** sim=0
- 期望: 左下,军鼓。
- 听到: 嗯。
- `[ 18.21s]` VOICE ■ tut_z_kick (kill)
- `[ 18.21s]` VERDICT tut_z_kick: **OK** sim=0.9565
- 期望: 下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。
- 听到: 下面正中间是骶鼓,你的家先听四下数拍,然后跟着我敲。
- `[ 21.41s]` SFX ♪ dm_accent
- `[ 21.99s]` VIBRATE [8]
- `[ 22.09s]` SFX ♪ dm_accent
- `[ 22.66s]` VIBRATE [8]
- `[ 22.73s]` SFX ♪ dm_accent
- `[ 23.32s]` VIBRATE [8]
- `[ 23.41s]` SFX ♪ dm_accent
- `[ 23.99s]` VIBRATE [8]
- `[ 24.09s]` SFX ♪ inst_kick
- `[ 24.67s]` VIBRATE [8]
- `[ 27.29s]` **GESTURE** tap @(195,630)
- `[ 27.29s]` VIBRATE [20]
- `[ 27.29s]` SFX ♪ inst_kick
- `[ 27.29s]` SFX ♪ dm_accent
- `[ 28.10s]` VOICE ▶ tut_z_sides (dur 5.2s)
- `[ 28.10s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 33.33s]` VOICE ■ tut_z_sides (kill)
- `[ 33.33s]` VERDICT tut_z_sides: **OK** sim=0.8824
- 期望: 左下是军鼓,右下是低嗵。一左一右,跟着打。
- 听到: 左下是军鼓,右下是敌通,一左一右跟着打。
- `[ 34.77s]` SFX ♪ dm_accent
- `[ 35.33s]` VIBRATE [8]
- `[ 35.45s]` SFX ♪ dm_accent
- `[ 36.00s]` VIBRATE [8]
- `[ 36.09s]` SFX ♪ dm_accent
- `[ 36.66s]` VIBRATE [8]
- `[ 36.77s]` SFX ♪ dm_accent
- `[ 37.33s]` VIBRATE [8]
- `[ 37.41s]` SFX ♪ dm_snare
- `[ 37.99s]` VIBRATE [8]
- `[ 38.77s]` SFX ♪ dm_tomlo
- `[ 39.33s]` VIBRATE [8]
- `[ 40.63s]` **GESTURE** tap @(65,630)
- `[ 40.64s]` VIBRATE [20]
- `[ 40.64s]` SFX ♪ dm_snare
- `[ 40.64s]` SFX ♪ dm_accent
- `[ 41.96s]` **GESTURE** tap @(325,630)
- `[ 41.97s]` VIBRATE [20]
- `[ 41.97s]` SFX ♪ dm_tomlo
- `[ 41.97s]` SFX ♪ dm_accent
- `[ 42.78s]` VOICE ▶ tut_z_patt (dur 9.68s)
- `[ 42.78s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 52.55s]` VOICE ■ tut_z_patt (kill)
- `[ 52.55s]` VERDICT tut_z_patt: **OK** sim=0.7308
- 期望: 上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。
- 听到: 上面一白更清亮,左上采茶,上中高通,右上调查,听这一句三个一。
- `[ 53.43s]` SFX ♪ dm_accent
- `[ 53.99s]` VIBRATE [8]
- `[ 54.07s]` SFX ♪ dm_accent
- `[ 54.67s]` VIBRATE [8]
- `[ 54.75s]` SFX ♪ dm_accent
- `[ 55.32s]` VIBRATE [8]
- `[ 55.43s]` SFX ♪ dm_accent
- `[ 55.99s]` VIBRATE [8]
- `[ 56.11s]` SFX ♪ dm_hat
- `[ 56.66s]` VIBRATE [8]
- `[ 56.75s]` SFX ♪ dm_tomhi
- `[ 57.32s]` VIBRATE [8]
- `[ 57.43s]` SFX ♪ dm_crash
- `[ 57.99s]` VIBRATE [8]
- `[ 59.27s]` **GESTURE** tap @(65,210)
- `[ 59.28s]` VIBRATE [20]
- `[ 59.28s]` SFX ♪ dm_hat
- `[ 59.28s]` SFX ♪ dm_accent
- `[ 59.94s]` **GESTURE** tap @(195,210)
- `[ 59.94s]` VIBRATE [20]
- `[ 59.94s]` SFX ♪ dm_tomhi
- `[ 59.94s]` SFX ♪ dm_accent
- `[ 60.68s]` **GESTURE** tap @(325,210)
- `[ 60.69s]` VIBRATE [20]
- `[ 60.69s]` SFX ♪ dm_crash
- `[ 60.69s]` SFX ♪ dm_accent
- `[ 61.44s]` VOICE ▶ tut_done (dur 2.48s)
- `[ 61.44s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 64.16s]` VOICE ■ tut_done (kill)
- `[ 64.16s]` VERDICT tut_done: **OK** sim=1
- 期望: 很好,演出开始。
- 听到: 很好,演出开始。
- `[ 64.16s]` BGM ♪ track90 (loop)
- `[ 64.60s]` SFX ♪ inst_kick
- `[ 65.16s]` VIBRATE [8]
- `[ 65.24s]` SFX ♪ inst_kick
- `[ 65.84s]` VIBRATE [8]
- `[ 65.92s]` SFX ♪ inst_kick
- `[ 66.49s]` VIBRATE [8]
- `[ 66.60s]` SFX ♪ inst_kick
- `[ 67.16s]` VIBRATE [8]
- `[ 67.24s]` SFX ♪ inst_kick
- `[ 67.81s]` **GESTURE** tap @(195,630)
- `[ 67.81s]` VIBRATE [20]
- `[ 67.81s]` SFX ♪ inst_kick
- `[ 67.82s]` VIBRATE [8]
- `[ 67.85s]` VOICE ▶ gd_answer (dur 1.52s)
- `[ 67.85s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 68.47s]` **GESTURE** tap @(195,630)
- `[ 68.47s]` VIBRATE [20]
- `[ 68.47s]` SFX ♪ inst_kick
- `[ 68.60s]` SFX ♪ inst_kick
- `[ 69.16s]` VIBRATE [8]
- `[ 69.45s]` VOICE ■ gd_answer (kill)
- `[ 69.45s]` VERDICT gd_answer: **OK** sim=1
- 期望: 现在跟着我打。
- 听到: 现在跟着我打。
- `[ 70.96s]` VIBRATE [60,40,60]
- `[ 70.96s]` SFX ♪ dm_hat
- `[ 71.78s]` **GESTURE** tap @(195,630)
- `[ 71.78s]` VIBRATE [20]
- `[ 71.78s]` SFX ♪ inst_kick
- `[ 71.78s]` SFX ♪ dm_accent
- `[ 75.24s]` SFX ♪ dm_snare
- `[ 75.83s]` VIBRATE [8]
- `[ 76.60s]` SFX ♪ dm_tomlo
- `[ 77.16s]` VIBRATE [8]
- `[ 78.48s]` **GESTURE** tap @(65,630)
- `[ 78.48s]` VIBRATE [20]
- `[ 78.48s]` SFX ♪ dm_snare
- `[ 78.48s]` SFX ♪ dm_accent
- `[ 79.80s]` **GESTURE** tap @(325,630)
- `[ 79.80s]` VIBRATE [20]
- `[ 79.80s]` VIBRATE [20,40,20]
- `[ 79.80s]` SFX ♪ dm_tomlo
- `[ 79.80s]` SFX ♪ dm_accent
- `[ 83.24s]` SFX ♪ inst_kick
- `[ 83.82s]` VIBRATE [8]
- `[ 83.92s]` SFX ♪ inst_kick
- `[ 84.49s]` VIBRATE [8]
- `[ 84.56s]` SFX ♪ dm_snare
- `[ 85.15s]` VIBRATE [8]
- `[ 86.49s]` **GESTURE** tap @(195,630)
- `[ 86.49s]` VIBRATE [20]
- `[ 86.49s]` SFX ♪ inst_kick
- `[ 86.49s]` SFX ♪ dm_accent
- `[ 87.15s]` **GESTURE** tap @(195,630)
- `[ 87.15s]` VIBRATE [20]
- `[ 87.15s]` SFX ♪ inst_kick
- `[ 87.15s]` SFX ♪ dm_accent
- `[ 87.81s]` **GESTURE** tap @(65,630)
- `[ 87.81s]` VIBRATE [20]
- `[ 87.81s]` VIBRATE [20,40,20]
- `[ 87.81s]` SFX ♪ dm_snare
- `[ 87.81s]` SFX ♪ dm_accent
- `[ 91.24s]` SFX ♪ dm_snare
- `[ 91.83s]` VIBRATE [8]
- `[ 91.92s]` SFX ♪ dm_tomlo
- `[ 92.48s]` VIBRATE [8]
- `[ 92.60s]` SFX ♪ inst_kick
- `[ 93.16s]` VIBRATE [8]
- `[ 94.51s]` **GESTURE** tap @(65,630)
- `[ 94.51s]` VIBRATE [20]
- `[ 94.51s]` SFX ♪ dm_snare
- `[ 94.51s]` SFX ♪ dm_accent
- `[ 95.17s]` **GESTURE** tap @(325,630)
- `[ 95.17s]` VIBRATE [20]
- `[ 95.17s]` SFX ♪ dm_tomlo
- `[ 95.17s]` SFX ♪ dm_accent
- `[ 95.83s]` **GESTURE** tap @(195,630)
- `[ 95.84s]` VIBRATE [20]
- `[ 95.84s]` VIBRATE [20,40,20]
- `[ 95.84s]` SFX ♪ inst_kick
- `[ 95.84s]` SFX ♪ dm_accent
- `[ 99.24s]` SFX ♪ inst_kick
- `[ 99.82s]` VIBRATE [8]
- `[ 99.84s]` VOICE ▶ mid_song (dur 2.32s)
- `[ 99.84s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 99.92s]` SFX ♪ dm_snare
- `[ 100.49s]` VIBRATE [8]
- `[ 100.56s]` SFX ♪ inst_kick
- `[ 101.15s]` VIBRATE [8]
- `[ 101.24s]` SFX ♪ dm_tomlo
- `[ 101.82s]` VIBRATE [8]
- `[ 102.19s]` VOICE ■ mid_song (kill)
- `[ 102.19s]` VERDICT mid_song: **OK** sim=0.8
- 期望: 过半了,保持。
- 听到: 过磅了,保持。
- `[ 102.44s]` **GESTURE** tap @(195,630)
- `[ 102.44s]` VIBRATE [20]
- `[ 102.44s]` SFX ♪ inst_kick
- `[ 102.44s]` SFX ♪ dm_accent
- `[ 103.19s]` **GESTURE** tap @(65,630)
- `[ 103.19s]` VIBRATE [20]
- `[ 103.19s]` SFX ♪ dm_snare
- `[ 103.19s]` SFX ♪ dm_accent
- `[ 103.77s]` **GESTURE** tap @(195,630)
- `[ 103.77s]` VIBRATE [20]
- `[ 103.77s]` SFX ♪ inst_kick
- `[ 103.77s]` SFX ♪ dm_accent
- `[ 104.51s]` **GESTURE** tap @(325,630)
- `[ 104.51s]` VIBRATE [20]
- `[ 104.51s]` VIBRATE [20,40,20]
- `[ 104.51s]` SFX ♪ dm_tomlo
- `[ 104.51s]` SFX ♪ dm_accent
- `[ 104.56s]` SFX ♪ dm_hat
- `[ 105.16s]` VIBRATE [8]
- `[ 105.92s]` SFX ♪ dm_snare
- `[ 106.50s]` VIBRATE [8]
- `[ 106.60s]` SFX ♪ inst_kick
- `[ 107.15s]` VIBRATE [8]
- `[ 107.82s]` **GESTURE** tap @(65,210)
- `[ 107.82s]` VIBRATE [20]
- `[ 107.82s]` SFX ♪ dm_hat
- `[ 107.82s]` SFX ♪ dm_accent
- `[ 109.14s]` **GESTURE** tap @(65,630)
- `[ 109.14s]` VIBRATE [20]
- `[ 109.14s]` SFX ♪ dm_snare
- `[ 109.14s]` SFX ♪ dm_accent
- `[ 109.80s]` **GESTURE** tap @(195,630)
- `[ 109.80s]` VIBRATE [20]
- `[ 109.80s]` VIBRATE [100]
- `[ 109.80s]` VIBRATE [20,40,20]
- `[ 109.80s]` SFX ♪ inst_kick
- `[ 109.80s]` SFX ♪ dm_accent
- `[ 109.92s]` SFX ♪ inst_kick
- `[ 110.49s]` VIBRATE [8]
- `[ 110.60s]` SFX ♪ dm_hat
- `[ 111.16s]` VIBRATE [8]
- `[ 111.24s]` SFX ♪ inst_kick
- `[ 111.82s]` VIBRATE [8]
- `[ 111.92s]` SFX ♪ dm_crash
- `[ 112.49s]` VIBRATE [8]
- `[ 113.11s]` **GESTURE** tap @(195,630)
- `[ 113.11s]` VIBRATE [20]
- `[ 113.11s]` SFX ♪ inst_kick
- `[ 113.11s]` SFX ♪ dm_accent
- `[ 113.85s]` **GESTURE** tap @(65,210)
- `[ 113.85s]` VIBRATE [20]
- `[ 113.85s]` SFX ♪ dm_hat
- `[ 113.85s]` SFX ♪ dm_accent
- `[ 114.43s]` **GESTURE** tap @(195,630)
- `[ 114.43s]` VIBRATE [20]
- `[ 114.43s]` SFX ♪ inst_kick
- `[ 114.43s]` SFX ♪ dm_accent
- `[ 115.17s]` **GESTURE** tap @(325,210)
- `[ 115.17s]` VIBRATE [20]
- `[ 115.17s]` VIBRATE [20,40,20]
- `[ 115.17s]` SFX ♪ dm_crash
- `[ 115.17s]` SFX ♪ dm_accent
- `[ 115.24s]` SFX ♪ dm_snare
- `[ 115.82s]` VIBRATE [8]
- `[ 115.92s]` SFX ♪ dm_tomlo
- `[ 116.50s]` VIBRATE [8]
- `[ 116.56s]` SFX ♪ dm_hat
- `[ 117.15s]` VIBRATE [8]
- `[ 117.24s]` SFX ♪ inst_kick
- `[ 117.83s]` VIBRATE [8]
- `[ 118.47s]` **GESTURE** tap @(65,630)
- `[ 118.47s]` VIBRATE [20]
- `[ 118.47s]` SFX ♪ dm_snare
- `[ 118.47s]` SFX ♪ dm_accent
- `[ 118.53s]` VOICE ▶ tut_fill (dur 3.12s)
- `[ 118.53s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 119.13s]` **GESTURE** tap @(325,630)
- `[ 119.13s]` VIBRATE [20]
- `[ 119.13s]` SFX ♪ dm_tomlo
- `[ 119.13s]` SFX ♪ dm_accent
- `[ 119.79s]` **GESTURE** tap @(65,210)
- `[ 119.79s]` VIBRATE [20]
- `[ 119.79s]` SFX ♪ dm_hat
- `[ 119.79s]` SFX ♪ dm_accent
- `[ 120.45s]` **GESTURE** tap @(195,630)
- `[ 120.45s]` VIBRATE [20]
- `[ 120.45s]` VIBRATE [20,40,20]
- `[ 120.45s]` SFX ♪ inst_kick
- `[ 120.45s]` SFX ♪ dm_accent
- `[ 120.56s]` SFX ♪ inst_kick
- `[ 120.92s]` SFX ♪ inst_kick
- `[ 121.16s]` VIBRATE [8]
- `[ 121.24s]` SFX ♪ inst_kick
- `[ 121.48s]` VIBRATE [8]
- `[ 121.60s]` SFX ♪ dm_snare
- `[ 121.83s]` VIBRATE [8]
- `[ 121.92s]` SFX ♪ dm_snare
- `[ 122.00s]` VOICE ■ tut_fill (kill)
- `[ 122.00s]` VERDICT tut_fill: **OK** sim=0.9167
- 期望: 最后有一段加花,跟着我连打。
- 听到: 最后有一段佳花跟着我连打。
- `[ 122.15s]` VIBRATE [8]
- `[ 122.24s]` SFX ♪ inst_kick
- `[ 122.48s]` VIBRATE [8]
- `[ 122.60s]` SFX ♪ dm_crash
- `[ 122.83s]` VIBRATE [8]
- `[ 123.16s]` VIBRATE [8]
- `[ 123.84s]` **GESTURE** tap @(195,630)
- `[ 123.84s]` VIBRATE [20]
- `[ 123.84s]` SFX ♪ inst_kick
- `[ 123.84s]` SFX ♪ dm_accent
- `[ 124.30s]` **GESTURE** tap @(195,630)
- `[ 124.30s]` VIBRATE [20]
- `[ 124.31s]` SFX ♪ inst_kick
- `[ 124.31s]` SFX ♪ dm_accent
- `[ 124.77s]` **GESTURE** tap @(195,630)
- `[ 124.77s]` VIBRATE [20]
- `[ 124.77s]` SFX ♪ inst_kick
- `[ 125.23s]` **GESTURE** tap @(65,630)
- `[ 125.23s]` VIBRATE [20]
- `[ 125.23s]` SFX ♪ dm_snare
- `[ 125.23s]` SFX ♪ dm_accent
- `[ 125.32s]` VIBRATE [60,40,60]
- `[ 125.32s]` SFX ♪ dm_hat
- `[ 125.70s]` **GESTURE** tap @(65,630)
- `[ 125.70s]` VIBRATE [20]
- `[ 125.70s]` VIBRATE [60,40,60]
- `[ 125.70s]` SFX ♪ dm_snare
- `[ 125.70s]` SFX ♪ dm_hat
- `[ 125.70s]` VOICE ▶ gd_miss (dur 3.2s)
- `[ 125.70s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 125.96s]` VIBRATE [60,40,60]
- `[ 125.96s]` SFX ♪ dm_hat
- `[ 126.16s]` **GESTURE** tap @(195,630)
- `[ 126.16s]` VIBRATE [20]
- `[ 126.16s]` SFX ♪ inst_kick
- `[ 126.63s]` **GESTURE** tap @(325,210)
- `[ 126.63s]` VIBRATE [20]
- `[ 126.63s]` SFX ♪ dm_crash
- `[ 126.80s]` VIBRATE [100]
- `[ 126.80s]` VIBRATE [100]
- `[ 126.80s]` VIBRATE [20,40,20]
- `[ 126.80s]` VOICE ■ gd_miss (kill)
- `[ 126.80s]` VERDICT gd_miss: **TRUNCATED** sim=0.4706
- 期望: 慢了半拍,下一小节跟上我就行。
- 听到: 慢了半拍。
- `[ 126.81s]` VOICE ▶ grade_a (dur 4.4s)
- `[ 131.38s]` VOICE ■ grade_a (kill)
- `[ 131.38s]` VERDICT grade_a: **OK** sim=0.6207
- 期望: A 级!准确率超过八成五,非常出色。
- 听到: 第一季准确率超过8乘5,非常出色。
- `[ 131.38s]` VOICE ▶ new_best_combo (dur 1.84s)
- `[ 133.25s]` VOICE ■ new_best_combo (kill)
- `[ 133.25s]` VERDICT new_best_combo: **MISMATCH** sim=0.4
- 期望: 新连击纪录!
- 听到: 新联机记录。
- `[ 133.26s]` VOICE ▶ unlock_song2 (dur 2.48s)
- `[ 135.97s]` VOICE ■ unlock_song2 (kill)
- `[ 135.97s]` VERDICT unlock_song2: **OK** sim=0.9333
- 期望: 新曲目解锁,追风!
- 听到: 路新曲目解锁追风。
- `[ 135.98s]` VOICE ▶ restart (dur 4.08s)
- `[ 140.08s]` VOICE ■ restart (kill)
- `[ 140.08s]` BGM ♪ menu (loop)
- `[ 140.08s]` VERDICT restart: **OK** sim=0.75
- 期望: 单击再来一遍,右滑下一首,下滑回大厅。
- 听到: 但气再来一遍,又滑下一手下滑回大厅。
@@ -0,0 +1,473 @@
{
"game": "rhythm",
"settings": {
"voice": "male",
"guide": "full",
"speed": 1,
"bgm": 1
},
"outdir": "/home/xsl/AutoVideo/SoundGame/web/harness/live/out/rhythm-20260914095806",
"segs": [
{
"idx": 0,
"voiceId": "welcome",
"t0": 0.062,
"t1": 1.711,
"dur": 8.24,
"expEnd": 8.302,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "欢迎来到节。",
"similarity": 0.3226
},
{
"idx": 1,
"voiceId": "tut_map",
"t0": 1.711,
"t1": 3.08,
"dur": 18.04,
"expEnd": 19.751,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "写写认识。",
"similarity": 0.0741
},
{
"idx": 2,
"voiceId": "tut_probe",
"t0": 3.08,
"t1": 4.449,
"dur": 3.84,
"expEnd": 6.92,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "摸到三个布。",
"similarity": 0.4211
},
{
"idx": 3,
"voiceId": "zone_tl",
"t0": 5.325,
"t1": 6.926,
"dur": 1.6,
"expEnd": 6.925,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "左上踩草。",
"similarity": 0.75
},
{
"idx": 4,
"voiceId": "zone_tr",
"t0": 7.997,
"t1": 9.875,
"dur": 1.76,
"expEnd": 9.757,
"truncated": false,
"reason": "kill",
"verdict": "MISMATCH",
"heard": "有上调查。",
"similarity": 0.25
},
{
"idx": 5,
"voiceId": "zone_bl",
"t0": 10.668,
"t1": 10.675,
"dur": 2,
"expEnd": 12.668,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "嗯。",
"similarity": 0
},
{
"idx": 6,
"voiceId": "tut_z_kick",
"t0": 10.675,
"t1": 18.21,
"dur": 7.28,
"expEnd": 17.955,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "下面正中间是骶鼓,你的家先听四下数拍,然后跟着我敲。",
"similarity": 0.9565
},
{
"idx": 7,
"voiceId": "tut_z_sides",
"t0": 28.101,
"t1": 33.325,
"dur": 5.2,
"expEnd": 33.301,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "左下是军鼓,右下是敌通,一左一右跟着打。",
"similarity": 0.8824
},
{
"idx": 8,
"voiceId": "tut_z_patt",
"t0": 42.778,
"t1": 52.55,
"dur": 9.68,
"expEnd": 52.458,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "上面一白更清亮,左上采茶,上中高通,右上调查,听这一句三个一。",
"similarity": 0.7308
},
{
"idx": 9,
"voiceId": "tut_done",
"t0": 61.436,
"t1": 64.159,
"dur": 2.48,
"expEnd": 63.916,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "很好,演出开始。",
"similarity": 1
},
{
"idx": 10,
"voiceId": "gd_answer",
"t0": 67.846,
"t1": 69.452,
"dur": 1.52,
"expEnd": 69.366,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "现在跟着我打。",
"similarity": 1
},
{
"idx": 11,
"voiceId": "mid_song",
"t0": 99.841,
"t1": 102.19,
"dur": 2.32,
"expEnd": 102.161,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "过磅了,保持。",
"similarity": 0.8
},
{
"idx": 12,
"voiceId": "tut_fill",
"t0": 118.528,
"t1": 121.995,
"dur": 3.12,
"expEnd": 121.648,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "最后有一段佳花跟着我连打。",
"similarity": 0.9167
},
{
"idx": 13,
"voiceId": "gd_miss",
"t0": 125.705,
"t1": 126.802,
"dur": 3.2,
"expEnd": 128.905,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "慢了半拍。",
"similarity": 0.4706
},
{
"idx": 14,
"voiceId": "grade_a",
"t0": 126.809,
"t1": 131.375,
"dur": 4.4,
"expEnd": 131.209,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "第一季准确率超过8乘5,非常出色。",
"similarity": 0.6207
},
{
"idx": 15,
"voiceId": "new_best_combo",
"t0": 131.38,
"t1": 133.255,
"dur": 1.84,
"expEnd": 133.22,
"truncated": false,
"reason": "kill",
"verdict": "MISMATCH",
"heard": "新联机记录。",
"similarity": 0.4
},
{
"idx": 16,
"voiceId": "unlock_song2",
"t0": 133.262,
"t1": 135.972,
"dur": 2.48,
"expEnd": 135.742,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "路新曲目解锁追风。",
"similarity": 0.9333
},
{
"idx": 17,
"voiceId": "restart",
"t0": 135.98,
"t1": 140.082,
"dur": 4.08,
"expEnd": 140.06,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "但气再来一遍,又滑下一手下滑回大厅。",
"similarity": 0.75
}
],
"rows": [
{
"t0": 0.062,
"t1": 1.711,
"voiceId": "welcome",
"expected": "欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。",
"heard": "欢迎来到节。",
"similarity": 0.3226,
"verdict": "TRUNCATED"
},
{
"t0": 1.711,
"t1": 3.08,
"voiceId": "tut_map",
"expected": "先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。",
"heard": "写写认识。",
"similarity": 0.0741,
"verdict": "TRUNCATED"
},
{
"t0": 3.08,
"t1": 4.449,
"voiceId": "tut_probe",
"expected": "摸到三个不同的地方,我们就开始。",
"heard": "摸到三个布。",
"similarity": 0.4211,
"verdict": "TRUNCATED"
},
{
"t0": 5.325,
"t1": 6.926,
"voiceId": "zone_tl",
"expected": "左上,踩镲。",
"heard": "左上踩草。",
"similarity": 0.75,
"verdict": "OK"
},
{
"t0": 7.997,
"t1": 9.875,
"voiceId": "zone_tr",
"expected": "右上,吊镲。",
"heard": "有上调查。",
"similarity": 0.25,
"verdict": "MISMATCH"
},
{
"t0": 10.668,
"t1": 10.675,
"voiceId": "zone_bl",
"expected": "左下,军鼓。",
"heard": "嗯。",
"similarity": 0,
"verdict": "TRUNCATED"
},
{
"t0": 10.675,
"t1": 18.21,
"voiceId": "tut_z_kick",
"expected": "下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。",
"heard": "下面正中间是骶鼓,你的家先听四下数拍,然后跟着我敲。",
"similarity": 0.9565,
"verdict": "OK"
},
{
"t0": 28.101,
"t1": 33.325,
"voiceId": "tut_z_sides",
"expected": "左下是军鼓,右下是低嗵。一左一右,跟着打。",
"heard": "左下是军鼓,右下是敌通,一左一右跟着打。",
"similarity": 0.8824,
"verdict": "OK"
},
{
"t0": 42.778,
"t1": 52.55,
"voiceId": "tut_z_patt",
"expected": "上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。",
"heard": "上面一白更清亮,左上采茶,上中高通,右上调查,听这一句三个一。",
"similarity": 0.7308,
"verdict": "OK"
},
{
"t0": 61.436,
"t1": 64.159,
"voiceId": "tut_done",
"expected": "很好,演出开始。",
"heard": "很好,演出开始。",
"similarity": 1,
"verdict": "OK"
},
{
"t0": 67.846,
"t1": 69.452,
"voiceId": "gd_answer",
"expected": "现在跟着我打。",
"heard": "现在跟着我打。",
"similarity": 1,
"verdict": "OK"
},
{
"t0": 99.841,
"t1": 102.19,
"voiceId": "mid_song",
"expected": "过半了,保持。",
"heard": "过磅了,保持。",
"similarity": 0.8,
"verdict": "OK"
},
{
"t0": 118.528,
"t1": 121.995,
"voiceId": "tut_fill",
"expected": "最后有一段加花,跟着我连打。",
"heard": "最后有一段佳花跟着我连打。",
"similarity": 0.9167,
"verdict": "OK"
},
{
"t0": 125.705,
"t1": 126.802,
"voiceId": "gd_miss",
"expected": "慢了半拍,下一小节跟上我就行。",
"heard": "慢了半拍。",
"similarity": 0.4706,
"verdict": "TRUNCATED"
},
{
"t0": 126.809,
"t1": 131.375,
"voiceId": "grade_a",
"expected": "A 级!准确率超过八成五,非常出色。",
"heard": "第一季准确率超过8乘5,非常出色。",
"similarity": 0.6207,
"verdict": "OK"
},
{
"t0": 131.38,
"t1": 133.255,
"voiceId": "new_best_combo",
"expected": "新连击纪录!",
"heard": "新联机记录。",
"similarity": 0.4,
"verdict": "MISMATCH"
},
{
"t0": 133.262,
"t1": 135.972,
"voiceId": "unlock_song2",
"expected": "新曲目解锁,追风!",
"heard": "路新曲目解锁追风。",
"similarity": 0.9333,
"verdict": "OK"
},
{
"t0": 135.98,
"t1": 140.082,
"voiceId": "restart",
"expected": "单击再来一遍,右滑下一首,下滑回大厅。",
"heard": "但气再来一遍,又滑下一手下滑回大厅。",
"similarity": 0.75,
"verdict": "OK"
},
{
"t0": 18.21,
"t1": 28.101,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 33.325,
"t1": 42.778,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 52.55,
"t1": 61.436,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 64.159,
"t1": 67.846,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 69.452,
"t1": 99.841,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 102.19,
"t1": 118.528,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 121.995,
"t1": 125.705,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
}
]
}
@@ -0,0 +1,329 @@
{"ev":"probe_ready","t":8,"ta":null}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":1521.800000011921,"ta":-0.074}
{"ev":"recstart","mime":"audio/webm;codecs=opus","t":1596.2000000178814,"ta":0}
{"ev":"fetch","url":"audio/bgm/menu.ogg","status":200,"ok":true,"ms":13,"t":1611,"ta":0.015}
{"ev":"fetch","url":"audio/bgm/track90.ogg","status":200,"ok":true,"ms":14,"t":1611.300000011921,"ta":0.015}
{"ev":"fetch","url":"audio/voice/female/welcome.ogg","status":200,"ok":true,"ms":14,"t":1611.4000000059605,"ta":0.015}
{"ev":"fetch","url":"audio/voice/female/select_hint.ogg","status":200,"ok":true,"ms":14,"t":1611.4000000059605,"ta":0.015}
{"ev":"fetch","url":"audio/voice/female/tut_probe.ogg","status":200,"ok":true,"ms":14,"t":1611.5,"ta":0.015}
{"ev":"fetch","url":"audio/voice/female/tut_map.ogg","status":200,"ok":true,"ms":14,"t":1611.5999999940395,"ta":0.015}
{"ev":"fetch","url":"audio/voice/female/mid_song.ogg","status":200,"ok":true,"ms":14,"t":1611.5999999940395,"ta":0.015}
{"ev":"fetch","url":"audio/voice/female/welcome_back.ogg","status":200,"ok":true,"ms":15,"t":1611.7000000178814,"ta":0.016}
{"ev":"fetch","url":"audio/bgm/track105.ogg","status":200,"ok":true,"ms":14,"t":1611.800000011921,"ta":0.016}
{"ev":"fetch","url":"audio/bgm/track120.ogg","status":200,"ok":true,"ms":14,"t":1611.800000011921,"ta":0.016}
{"ev":"fetch","url":"audio/sfx/dm_snare.ogg","status":200,"ok":true,"ms":21,"t":1618,"ta":0.022}
{"ev":"fetch","url":"audio/sfx/dm_tomlo.ogg","status":200,"ok":true,"ms":21,"t":1618.2000000178814,"ta":0.022}
{"ev":"fetch","url":"audio/sfx/inst_kick.ogg","status":200,"ok":true,"ms":22,"t":1619.0999999940395,"ta":0.023}
{"ev":"fetch","url":"audio/sfx/dm_hat.ogg","status":200,"ok":true,"ms":23,"t":1619.5,"ta":0.023}
{"ev":"fetch","url":"audio/sfx/dm_tomhi.ogg","status":200,"ok":true,"ms":23,"t":1619.5,"ta":0.023}
{"ev":"fetch","url":"audio/sfx/dm_crash.ogg","status":200,"ok":true,"ms":24,"t":1620.800000011921,"ta":0.025}
{"ev":"fetch","url":"audio/sfx/dm_accent.ogg","status":200,"ok":true,"ms":28,"t":1625.2000000178814,"ta":0.029}
{"ev":"vstart","url":"audio/voice/female/welcome.ogg","t":1650.5,"dur":6.24,"ta":0.054}
{"ev":"start","t":1844.5999999940395,"sid":1,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":6,"ta":0.248}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":2804.7000000178814,"ta":1.209}
{"ev":"vibrate","pattern":"[20]","t":2806.300000011921,"ta":1.21}
{"ev":"vend","url":"audio/voice/female/welcome.ogg","t":3306.9000000059605,"reason":"kill","ta":1.711}
{"ev":"vstart","url":"audio/voice/female/tut_map.ogg","t":3307.0999999940395,"dur":14.28,"ta":1.711}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":4174.200000017881,"ta":2.578}
{"ev":"vibrate","pattern":"[20]","t":4175.9000000059605,"ta":2.58}
{"ev":"vend","url":"audio/voice/female/tut_map.ogg","t":4676,"reason":"kill","ta":3.08}
{"ev":"vstart","url":"audio/voice/female/tut_probe.ogg","t":4676.200000017881,"dur":3.76,"ta":3.08}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":5542.9000000059605,"ta":3.947}
{"ev":"vibrate","pattern":"[20]","t":5544.5,"ta":3.948}
{"ev":"vend","url":"audio/voice/female/tut_probe.ogg","t":6044.800000011921,"reason":"kill","ta":4.449}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":6913.700000017881,"ta":5.318}
{"ev":"vibrate","pattern":"[20]","t":6915.200000017881,"ta":5.319}
{"ev":"start","t":6915.800000011921,"sid":2,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":5.32}
{"ev":"fetch","url":"audio/voice/female/zone_tl.ogg","status":200,"ok":true,"ms":3,"t":6917.9000000059605,"ta":5.322}
{"ev":"vstart","url":"audio/voice/female/zone_tl.ogg","t":6921.5999999940395,"dur":1.68,"ta":5.325}
{"ev":"vend","url":"audio/voice/female/zone_tl.ogg","t":8139.700000017881,"reason":"kill","ta":6.544}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":9182.800000011921,"ta":7.587}
{"ev":"vibrate","pattern":"[20]","t":9186.300000011921,"ta":7.59}
{"ev":"start","t":9186.59999999404,"sid":3,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":7.59}
{"ev":"fetch","url":"audio/voice/female/zone_bc.ogg","status":200,"ok":true,"ms":2,"t":9188.59999999404,"ta":7.592}
{"ev":"vstart","url":"audio/voice/female/zone_bc.ogg","t":9192.09999999404,"dur":2,"ta":7.596}
{"ev":"vend","url":"audio/voice/female/zone_bc.ogg","t":10600.5,"reason":"kill","ta":9.004}
{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":10853.40000000596,"ta":9.257}
{"ev":"vibrate","pattern":"[20]","t":10855.09999999404,"ta":9.259}
{"ev":"start","t":10855.300000011921,"sid":4,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":9.259}
{"ev":"vibrate","pattern":"[10]","t":11208,"ta":9.612}
{"ev":"fetch","url":"audio/voice/female/tut_skip.ogg","status":200,"ok":true,"ms":3,"t":11211,"ta":9.615}
{"ev":"vstart","url":"audio/voice/female/tut_skip.ogg","t":11214,"dur":2,"ta":9.618}
{"ev":"vend","url":"audio/voice/female/tut_skip.ogg","t":12620.40000000596,"reason":"kill","ta":11.024}
{"ev":"stop","t":12620.59999999404,"sid":1,"when":0,"ta":11.024}
{"ev":"start","t":12621.700000017881,"sid":5,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":12.04108843537415,"ta":11.026}
{"ev":"start","t":13062,"sid":6,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":12.04108843537415,"ta":11.466}
{"ev":"vibrate","pattern":"[8]","t":13620.09999999404,"ta":12.024}
{"ev":"start","t":13701.90000000596,"sid":7,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":12.707755102040815,"ta":12.106}
{"ev":"vibrate","pattern":"[8]","t":14299.90000000596,"ta":12.704}
{"ev":"start","t":14381.800000011921,"sid":8,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":13.374421768707483,"ta":12.786}
{"ev":"vibrate","pattern":"[8]","t":14949.90000000596,"ta":13.354}
{"ev":"start","t":15061.90000000596,"sid":9,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":14.04108843537415,"ta":13.466}
{"ev":"vibrate","pattern":"[8]","t":15622.800000011921,"ta":14.027}
{"ev":"start","t":15701.800000011921,"sid":10,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":14.707755102040815,"ta":14.106}
{"ev":"vibrate","pattern":"[8]","t":16279.800000011921,"ta":14.684}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":16300.09999999404,"ta":14.704}
{"ev":"vibrate","pattern":"[20]","t":16301.40000000596,"ta":14.705}
{"ev":"start","t":16301.700000017881,"sid":11,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":14.706}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":16964.09999999404,"ta":15.368}
{"ev":"vibrate","pattern":"[20]","t":16965.40000000596,"ta":15.369}
{"ev":"start","t":16965.59999999404,"sid":12,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":15.369}
{"ev":"start","t":17061.80000001192,"sid":13,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":16.04108843537415,"ta":15.466}
{"ev":"vibrate","pattern":"[8]","t":17625.90000000596,"ta":16.03}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":18292.59999999404,"ta":16.696}
{"ev":"vibrate","pattern":"[20]","t":18295.5,"ta":16.699}
{"ev":"start","t":18295.59999999404,"sid":14,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":16.699}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":18955.90000000596,"ta":17.36}
{"ev":"vibrate","pattern":"[20]","t":18957.40000000596,"ta":17.361}
{"ev":"vibrate","pattern":"[60,40,60]","t":18957.5,"ta":17.361}
{"ev":"start","t":18957.59999999404,"sid":15,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":17.361}
{"ev":"start","t":18957.70000001788,"sid":16,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":17.362}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":20286,"ta":18.69}
{"ev":"vibrate","pattern":"[20]","t":20287.40000000596,"ta":18.691}
{"ev":"vibrate","pattern":"[60,40,60]","t":20287.5,"ta":18.691}
{"ev":"start","t":20287.70000001788,"sid":17,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":18.692}
{"ev":"start","t":20287.70000001788,"sid":18,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":18.692}
{"ev":"start","t":23701.90000000596,"sid":19,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":22.707755102040814,"ta":22.106}
{"ev":"vibrate","pattern":"[8]","t":24291.90000000596,"ta":22.696}
{"ev":"start","t":25061.80000001192,"sid":20,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":24.041088435374146,"ta":23.466}
{"ev":"vibrate","pattern":"[8]","t":25615.80000001192,"ta":24.02}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":26931,"ta":25.335}
{"ev":"vibrate","pattern":"[20]","t":26932.80000001192,"ta":25.337}
{"ev":"vibrate","pattern":"[60,40,60]","t":26932.90000000596,"ta":25.337}
{"ev":"start","t":26933,"sid":21,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":25.337}
{"ev":"start","t":26933,"sid":22,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":25.337}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":28262,"ta":26.666}
{"ev":"vibrate","pattern":"[20]","t":28263.5,"ta":26.667}
{"ev":"vibrate","pattern":"[60,40,60]","t":28263.59999999404,"ta":26.667}
{"ev":"start","t":28263.70000001788,"sid":23,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":26.668}
{"ev":"start","t":28263.70000001788,"sid":24,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":26.668}
{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":28984.30000001192,"ta":27.388}
{"ev":"vibrate","pattern":"[20]","t":28985.80000001192,"ta":27.39}
{"ev":"start","t":28985.90000000596,"sid":25,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":27.39}
{"ev":"vibrate","pattern":"[10]","t":29340,"ta":27.744}
{"ev":"stop","t":29340.40000000596,"sid":5,"when":0,"ta":27.744}
{"ev":"fetch","url":"audio/voice/female/menu_main.ogg","status":200,"ok":true,"ms":3,"t":29342.90000000596,"ta":27.747}
{"ev":"vstart","url":"audio/voice/female/menu_main.ogg","t":29349.30000001192,"dur":5.6,"ta":27.753}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":31245.40000000596,"ta":29.649}
{"ev":"vibrate","pattern":"[20]","t":31246.90000000596,"ta":29.651}
{"ev":"vend","url":"audio/voice/female/menu_main.ogg","t":31747.30000001192,"reason":"kill","ta":30.151}
{"ev":"fetch","url":"audio/voice/female/menu_lobby.ogg","status":200,"ok":true,"ms":3,"t":31749.90000000596,"ta":30.154}
{"ev":"vstart","url":"audio/voice/female/menu_lobby.ogg","t":31752.09999999404,"dur":0.6370975056689342,"ta":30.156}
{"ev":"vend","url":"audio/voice/female/menu_lobby.ogg","t":32239.59999999404,"reason":"kill","ta":30.643}
{"ev":"gesture","type":"swipeup","x":195,"y":422,"t":33213.20000001788,"ta":31.617}
{"ev":"vibrate","pattern":"[20]","t":33214.5,"ta":31.618}
{"ev":"vibrate","pattern":"[10]","t":33573.40000000596,"ta":31.977}
{"ev":"fetch","url":"audio/voice/female/rules.ogg","status":200,"ok":true,"ms":2,"t":33575.80000001192,"ta":31.98}
{"ev":"vstart","url":"audio/voice/female/rules.ogg","t":33582.5,"dur":7.68,"ta":31.986}
{"ev":"vend","url":"audio/voice/female/rules.ogg","t":38253.09999999404,"reason":"kill","ta":36.657}
{"ev":"fetch","url":"audio/voice/female/settings_hint.ogg","status":200,"ok":true,"ms":3,"t":38256.09999999404,"ta":36.66}
{"ev":"vstart","url":"audio/voice/female/settings_hint.ogg","t":38259.30000001192,"dur":1.36,"ta":36.663}
{"ev":"vend","url":"audio/voice/female/settings_hint.ogg","t":39205,"reason":"kill","ta":37.609}
{"ev":"gesture","type":"swipedown","x":195,"y":422,"t":39978.30000001192,"ta":38.382}
{"ev":"vibrate","pattern":"[20]","t":39983.70000001788,"ta":38.388}
{"ev":"vibrate","pattern":"[10]","t":40340,"ta":38.744}
{"ev":"start","t":40340.30000001192,"sid":26,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":41.532380952380954,"ta":38.744}
{"ev":"start","t":40380.5,"sid":27,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":38.86571428571429,"ta":38.784}
{"ev":"vibrate","pattern":"[8]","t":40456.5,"ta":38.86}
{"ev":"start","t":40540.5,"sid":28,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":39.532380952380954,"ta":38.944}
{"ev":"vibrate","pattern":"[8]","t":41120.59999999404,"ta":39.524}
{"ev":"start","t":41180.40000000596,"sid":29,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":40.199047619047626,"ta":39.584}
{"ev":"vibrate","pattern":"[8]","t":41777.5,"ta":40.181}
{"ev":"start","t":41860.5,"sid":30,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":40.86571428571429,"ta":40.264}
{"ev":"vibrate","pattern":"[8]","t":42450.59999999404,"ta":40.854}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":43122.30000001192,"ta":41.526}
{"ev":"vibrate","pattern":"[20]","t":43124.30000001192,"ta":41.528}
{"ev":"start","t":43124.5,"sid":31,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":41.528}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":44458.20000001788,"ta":42.862}
{"ev":"vibrate","pattern":"[20]","t":44459.80000001192,"ta":42.864}
{"ev":"start","t":44460,"sid":32,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":42.864}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":45122.80000001192,"ta":43.527}
{"ev":"vibrate","pattern":"[20]","t":45124.20000001788,"ta":43.528}
{"ev":"start","t":45124.30000001192,"sid":33,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":43.528}
{"ev":"start","t":45500.5,"sid":34,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":44.48068027210884,"ta":43.904}
{"ev":"vibrate","pattern":"[8]","t":46060.40000000596,"ta":44.464}
{"ev":"start","t":46140.5,"sid":35,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":45.14734693877551,"ta":44.544}
{"ev":"vibrate","pattern":"[8]","t":46716.5,"ta":45.12}
{"ev":"start","t":46820.5,"sid":36,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":45.81401360544218,"ta":45.224}
{"ev":"vibrate","pattern":"[8]","t":47389.5,"ta":45.793}
{"ev":"vibrate","pattern":"[60,40,60]","t":49220.5,"ta":47.624}
{"ev":"start","t":49220.70000001788,"sid":37,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":47.625}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":49370.90000000596,"ta":47.775}
{"ev":"vibrate","pattern":"[20]","t":49372.90000000596,"ta":47.777}
{"ev":"vibrate","pattern":"[60,40,60]","t":49372.90000000596,"ta":47.777}
{"ev":"start","t":49373,"sid":38,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":47.777}
{"ev":"start","t":49373,"sid":39,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":47.777}
{"ev":"gesture","type":"longpress","x":195,"y":422,"t":49835.5,"ta":48.239}
{"ev":"vibrate","pattern":"[20]","t":49836.90000000596,"ta":48.241}
{"ev":"start","t":49837,"sid":40,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":48.241}
{"ev":"vibrate","pattern":"[60,40,60]","t":50287.30000001192,"ta":48.691}
{"ev":"start","t":50287.40000000596,"sid":41,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":48.691}
{"ev":"vibrate","pattern":"[60,40,60]","t":50540.40000000596,"ta":48.944}
{"ev":"start","t":50540.5,"sid":42,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":48.944}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":50839.40000000596,"ta":49.243}
{"ev":"vibrate","pattern":"[20]","t":50841,"ta":49.245}
{"ev":"start","t":50841.09999999404,"sid":43,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":49.245}
{"ev":"start","t":53460.5,"sid":44,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":52.48068027210884,"ta":51.864}
{"ev":"vibrate","pattern":"[8]","t":54055.5,"ta":52.459}
{"ev":"start","t":54140.5,"sid":45,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":53.147346938775506,"ta":52.544}
{"ev":"vibrate","pattern":"[8]","t":54728.59999999404,"ta":53.132}
{"ev":"start","t":54820.5,"sid":46,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":53.81401360544218,"ta":53.224}
{"ev":"vibrate","pattern":"[8]","t":55402.5,"ta":53.806}
{"ev":"vibrate","pattern":"[60,40,60]","t":57180.40000000596,"ta":55.584}
{"ev":"start","t":57180.5,"sid":47,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":55.584}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":57342.90000000596,"ta":55.747}
{"ev":"vibrate","pattern":"[20]","t":57344.5,"ta":55.748}
{"ev":"vibrate","pattern":"[60,40,60]","t":57344.5,"ta":55.748}
{"ev":"start","t":57344.70000001788,"sid":48,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":55.749}
{"ev":"start","t":57344.70000001788,"sid":49,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":55.749}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":58087,"ta":56.491}
{"ev":"vibrate","pattern":"[20]","t":58088.59999999404,"ta":56.492}
{"ev":"vibrate","pattern":"[60,40,60]","t":58088.59999999404,"ta":56.492}
{"ev":"start","t":58088.70000001788,"sid":50,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":56.493}
{"ev":"start","t":58088.80000001192,"sid":51,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":56.493}
{"ev":"start","t":61500.5,"sid":52,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":60.48068027210884,"ta":59.904}
{"ev":"vibrate","pattern":"[8]","t":62061.5,"ta":60.465}
{"ev":"vstart","url":"audio/voice/female/mid_song.ogg","t":62100.59999999404,"dur":1.6,"ta":60.504}
{"ev":"start","t":62140.40000000596,"sid":53,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":61.147346938775506,"ta":60.544}
{"ev":"vibrate","pattern":"[8]","t":62718.40000000596,"ta":61.122}
{"ev":"start","t":62820.5,"sid":54,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":61.81401360544218,"ta":61.224}
{"ev":"vend","url":"audio/voice/female/mid_song.ogg","t":63049.90000000596,"reason":"kill","ta":61.454}
{"ev":"vibrate","pattern":"[8]","t":63391.5,"ta":61.795}
{"ev":"start","t":63500.5,"sid":55,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":62.48068027210884,"ta":61.904}
{"ev":"vibrate","pattern":"[8]","t":64064.5,"ta":62.468}
{"ev":"vibrate","pattern":"[60,40,60]","t":65180.40000000596,"ta":63.584}
{"ev":"start","t":65180.40000000596,"sid":56,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":63.584}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":65376.20000001788,"ta":63.78}
{"ev":"vibrate","pattern":"[20]","t":65377.90000000596,"ta":63.782}
{"ev":"vibrate","pattern":"[60,40,60]","t":65377.90000000596,"ta":63.782}
{"ev":"start","t":65378,"sid":57,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":63.782}
{"ev":"start","t":65378,"sid":58,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":63.782}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":66039.5,"ta":64.443}
{"ev":"vibrate","pattern":"[20]","t":66041.20000001788,"ta":64.445}
{"ev":"vibrate","pattern":"[60,40,60]","t":66041.30000001192,"ta":64.445}
{"ev":"start","t":66041.30000001192,"sid":59,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":64.445}
{"ev":"start","t":66041.30000001192,"sid":60,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":64.445}
{"ev":"start","t":66820.5,"sid":61,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":65.81401360544217,"ta":65.224}
{"ev":"vibrate","pattern":"[60,40,60]","t":67180.40000000596,"ta":65.584}
{"ev":"start","t":67180.5,"sid":62,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":65.584}
{"ev":"vibrate","pattern":"[8]","t":67397.5,"ta":65.801}
{"ev":"start","t":68140.5,"sid":63,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":67.14734693877551,"ta":66.544}
{"ev":"vibrate","pattern":"[8]","t":68727.5,"ta":67.131}
{"ev":"start","t":68820.5,"sid":64,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":67.81401360544217,"ta":67.224}
{"ev":"vibrate","pattern":"[8]","t":69400.5,"ta":67.804}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":70013.40000000596,"ta":68.417}
{"ev":"vibrate","pattern":"[20]","t":70014.80000001192,"ta":68.419}
{"ev":"vibrate","pattern":"[60,40,60]","t":70014.80000001192,"ta":68.419}
{"ev":"start","t":70014.90000000596,"sid":65,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":68.419}
{"ev":"start","t":70014.90000000596,"sid":66,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":68.419}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":71339,"ta":69.743}
{"ev":"vibrate","pattern":"[20]","t":71340.59999999404,"ta":69.744}
{"ev":"start","t":71340.80000001192,"sid":67,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":69.745}
{"ev":"start","t":71340.80000001192,"sid":68,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":69.745}
{"ev":"start","t":72140.40000000596,"sid":69,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":71.14734693877551,"ta":70.544}
{"ev":"vibrate","pattern":"[60,40,60]","t":72540.40000000596,"ta":70.944}
{"ev":"start","t":72540.5,"sid":70,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":70.944}
{"ev":"vibrate","pattern":"[8]","t":72733.5,"ta":71.137}
{"ev":"start","t":72820.5,"sid":71,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":71.81401360544217,"ta":71.224}
{"ev":"vibrate","pattern":"[8]","t":73383.40000000596,"ta":71.787}
{"ev":"start","t":73500.59999999404,"sid":72,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":72.48068027210884,"ta":71.904}
{"ev":"vibrate","pattern":"[8]","t":74056.5,"ta":72.46}
{"ev":"start","t":74140.59999999404,"sid":73,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":73.14734693877551,"ta":72.544}
{"ev":"vibrate","pattern":"[8]","t":74736.5,"ta":73.14}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":75394.30000001192,"ta":73.798}
{"ev":"vibrate","pattern":"[20]","t":75396.09999999404,"ta":73.8}
{"ev":"vibrate","pattern":"[60,40,60]","t":75396.20000001788,"ta":73.8}
{"ev":"start","t":75396.30000001192,"sid":74,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":73.8}
{"ev":"start","t":75396.30000001192,"sid":75,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":73.8}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":76057.5,"ta":74.461}
{"ev":"vibrate","pattern":"[20]","t":76059,"ta":74.463}
{"ev":"vibrate","pattern":"[60,40,60]","t":76059.09999999404,"ta":74.463}
{"ev":"start","t":76059.09999999404,"sid":76,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":74.463}
{"ev":"start","t":76059.20000001788,"sid":77,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":74.463}
{"ev":"vibrate","pattern":"[60,40,60]","t":77220.40000000596,"ta":75.624}
{"ev":"start","t":77220.40000000596,"sid":78,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":75.624}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":77381.20000001788,"ta":75.785}
{"ev":"vibrate","pattern":"[20]","t":77382.5,"ta":75.786}
{"ev":"vibrate","pattern":"[60,40,60]","t":77382.59999999404,"ta":75.786}
{"ev":"start","t":77382.59999999404,"sid":79,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":75.786}
{"ev":"start","t":77382.59999999404,"sid":80,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":75.786}
{"ev":"start","t":77500.5,"sid":81,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":76.48068027210884,"ta":75.904}
{"ev":"vibrate","pattern":"[8]","t":78063.5,"ta":76.467}
{"ev":"start","t":78140.5,"sid":82,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":77.14734693877551,"ta":76.544}
{"ev":"vibrate","pattern":"[8]","t":78719.5,"ta":77.123}
{"ev":"start","t":78820.59999999404,"sid":83,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":77.81401360544217,"ta":77.224}
{"ev":"vibrate","pattern":"[8]","t":79392.5,"ta":77.796}
{"ev":"start","t":79460.40000000596,"sid":84,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":78.48068027210883,"ta":77.864}
{"ev":"vibrate","pattern":"[8]","t":80049.40000000596,"ta":78.453}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":80694.30000001192,"ta":79.098}
{"ev":"vibrate","pattern":"[20]","t":80695.90000000596,"ta":79.1}
{"ev":"vibrate","pattern":"[60,40,60]","t":80695.90000000596,"ta":79.1}
{"ev":"start","t":80696,"sid":85,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":79.1}
{"ev":"start","t":80696,"sid":86,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":79.1}
{"ev":"fetch","url":"audio/voice/female/tut_fill.ogg","status":200,"ok":true,"ms":3,"t":80743.40000000596,"ta":79.147}
{"ev":"vstart","url":"audio/voice/female/tut_fill.ogg","t":80748.80000001192,"dur":3.68,"ta":79.153}
{"ev":"vibrate","pattern":"[60,40,60]","t":81860.30000001192,"ta":80.264}
{"ev":"start","t":81860.40000000596,"sid":87,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":80.264}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":82016.5,"ta":80.42}
{"ev":"vibrate","pattern":"[20]","t":82017.90000000596,"ta":80.422}
{"ev":"vibrate","pattern":"[60,40,60]","t":82017.90000000596,"ta":80.422}
{"ev":"start","t":82017.90000000596,"sid":88,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":80.422}
{"ev":"start","t":82018,"sid":89,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":80.422}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":82680.09999999404,"ta":81.084}
{"ev":"vibrate","pattern":"[20]","t":82681.5,"ta":81.085}
{"ev":"vibrate","pattern":"[60,40,60]","t":82681.5,"ta":81.085}
{"ev":"start","t":82681.59999999404,"sid":90,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":81.085}
{"ev":"start","t":82681.70000001788,"sid":91,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":81.086}
{"ev":"start","t":82820.40000000596,"sid":92,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":81.81401360544217,"ta":81.224}
{"ev":"vend","url":"audio/voice/female/tut_fill.ogg","t":82994.20000001788,"reason":"kill","ta":81.398}
{"ev":"start","t":83140.40000000596,"sid":93,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":82.14734693877551,"ta":81.544}
{"ev":"vibrate","pattern":"[8]","t":83399.5,"ta":81.803}
{"ev":"start","t":83460.5,"sid":94,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":82.48068027210886,"ta":81.864}
{"ev":"vibrate","pattern":"[8]","t":83727.40000000596,"ta":82.131}
{"ev":"start","t":83820.40000000596,"sid":95,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":82.81401360544217,"ta":82.224}
{"ev":"vibrate","pattern":"[8]","t":84055.5,"ta":82.459}
{"ev":"start","t":84140.5,"sid":96,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":83.14734693877551,"ta":82.544}
{"ev":"vibrate","pattern":"[8]","t":84400.5,"ta":82.804}
{"ev":"start","t":84460.5,"sid":97,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":83.48068027210886,"ta":82.864}
{"ev":"vibrate","pattern":"[8]","t":84728.5,"ta":83.132}
{"ev":"start","t":84820.40000000596,"sid":98,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":83.81401360544217,"ta":83.224}
{"ev":"vibrate","pattern":"[8]","t":85057.5,"ta":83.461}
{"ev":"vibrate","pattern":"[8]","t":85402.40000000596,"ta":83.806}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":86412.70000001788,"ta":84.817}
{"ev":"vibrate","pattern":"[20]","t":86415.09999999404,"ta":84.819}
{"ev":"vibrate","pattern":"[60,40,60]","t":86415.09999999404,"ta":84.819}
{"ev":"start","t":86415.30000001192,"sid":99,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":84.819}
{"ev":"start","t":86415.30000001192,"sid":100,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":84.819}
{"ev":"vibrate","pattern":"[60,40,60]","t":86540.40000000596,"ta":84.944}
{"ev":"start","t":86540.5,"sid":101,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":84.944}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":86877.90000000596,"ta":85.282}
{"ev":"vibrate","pattern":"[20]","t":86879.40000000596,"ta":85.283}
{"ev":"vibrate","pattern":"[60,40,60]","t":86879.40000000596,"ta":85.283}
{"ev":"start","t":86879.40000000596,"sid":102,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":85.283}
{"ev":"start","t":86879.5,"sid":103,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":85.283}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":87406.09999999404,"ta":85.81}
{"ev":"vibrate","pattern":"[20]","t":87407.5,"ta":85.811}
{"ev":"vibrate","pattern":"[60,40,60]","t":87407.59999999404,"ta":85.811}
{"ev":"start","t":87407.70000001788,"sid":104,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":85.812}
{"ev":"start","t":87407.70000001788,"sid":105,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":85.812}
{"ev":"vibrate","pattern":"[60,40,60]","t":87540.40000000596,"ta":85.944}
{"ev":"start","t":87540.40000000596,"sid":106,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":85.944}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":87871.20000001788,"ta":86.275}
{"ev":"vibrate","pattern":"[20]","t":87872.40000000596,"ta":86.276}
{"ev":"vibrate","pattern":"[60,40,60]","t":87872.5,"ta":86.276}
{"ev":"start","t":87872.59999999404,"sid":107,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":86.276}
{"ev":"start","t":87872.70000001788,"sid":108,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":86.277}
{"ev":"vibrate","pattern":"[60,40,60]","t":88540.30000001192,"ta":86.944}
{"ev":"start","t":88540.5,"sid":109,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":86.944}
{"ev":"fetch","url":"audio/voice/female/grade_c.ogg","status":200,"ok":true,"ms":3,"t":89024.30000001192,"ta":87.428}
{"ev":"vstart","url":"audio/voice/female/grade_c.ogg","t":89029.90000000596,"dur":4.16,"ta":87.434}
{"ev":"stop","t":89721,"sid":26,"when":0,"ta":88.125}
{"ev":"vend","url":"audio/voice/female/grade_c.ogg","t":91561.5,"reason":"kill","ta":89.965}
{"ev":"fetch","url":"audio/voice/female/new_best_combo.ogg","status":200,"ok":true,"ms":2,"t":91564,"ta":89.968}
{"ev":"vstart","url":"audio/voice/female/new_best_combo.ogg","t":91566.80000001192,"dur":1.44,"ta":89.971}
{"ev":"vend","url":"audio/voice/female/new_best_combo.ogg","t":92513.40000000596,"reason":"kill","ta":90.917}
{"ev":"fetch","url":"audio/voice/female/restart.ogg","status":200,"ok":true,"ms":3,"t":92516.20000001788,"ta":90.92}
{"ev":"vstart","url":"audio/voice/female/restart.ogg","t":92520.30000001192,"dur":3.36,"ta":90.924}
{"ev":"vend","url":"audio/voice/female/restart.ogg","t":94579.90000000596,"reason":"kill","ta":92.984}
{"ev":"start","t":94580.09999999404,"sid":110,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":92.984}
{"ev":"recstop","t":209927.5,"ta":208.331}
Binary file not shown.
@@ -0,0 +1,298 @@
# rhythm 实时会话 transcript
- `[ -0.07s]` **GESTURE** tap @(195,422)
- `[ 0.00s]` REC 开始 (audio/webm;codecs=opus)
- `[ 0.05s]` VOICE ▶ welcome (dur 6.24s)
- `[ 0.25s]` BGM ♪ track90 (loop)
- `[ 1.21s]` **GESTURE** tap @(195,422)
- `[ 1.21s]` VIBRATE [20]
- `[ 1.71s]` VOICE ■ welcome (kill)
- `[ 1.71s]` VOICE ▶ tut_map (dur 14.28s)
- `[ 2.58s]` **GESTURE** tap @(195,422)
- `[ 2.58s]` VIBRATE [20]
- `[ 3.08s]` VOICE ■ tut_map (kill)
- `[ 3.08s]` VOICE ▶ tut_probe (dur 3.76s)
- `[ 3.95s]` **GESTURE** tap @(195,422)
- `[ 3.95s]` VIBRATE [20]
- `[ 4.45s]` VOICE ■ tut_probe (kill)
- `[ 5.32s]` **GESTURE** tap @(65,210)
- `[ 5.32s]` VIBRATE [20]
- `[ 5.32s]` SFX ♪ dm_hat
- `[ 5.33s]` VOICE ▶ zone_tl (dur 1.68s)
- `[ 6.54s]` VOICE ■ zone_tl (kill)
- `[ 7.59s]` **GESTURE** tap @(195,630)
- `[ 7.59s]` VIBRATE [20]
- `[ 7.59s]` SFX ♪ inst_kick
- `[ 7.60s]` VOICE ▶ zone_bc (dur 2s)
- `[ 9.00s]` VOICE ■ zone_bc (kill)
- `[ 9.26s]` **GESTURE** swipedown @(195,422)
- `[ 9.26s]` VIBRATE [20]
- `[ 9.26s]` SFX ♪ inst_kick
- `[ 9.61s]` VIBRATE [10]
- `[ 9.62s]` VOICE ▶ tut_skip (dur 2s)
- `[ 11.02s]` VOICE ■ tut_skip (kill)
- `[ 11.03s]` BGM ♪ track90 (loop)
- `[ 11.47s]` SFX ♪ inst_kick
- `[ 12.02s]` VIBRATE [8]
- `[ 12.11s]` SFX ♪ inst_kick
- `[ 12.70s]` VIBRATE [8]
- `[ 12.79s]` SFX ♪ inst_kick
- `[ 13.35s]` VIBRATE [8]
- `[ 13.47s]` SFX ♪ inst_kick
- `[ 14.03s]` VIBRATE [8]
- `[ 14.11s]` SFX ♪ inst_kick
- `[ 14.68s]` VIBRATE [8]
- `[ 14.70s]` **GESTURE** tap @(195,210)
- `[ 14.71s]` VIBRATE [20]
- `[ 14.71s]` SFX ♪ dm_tomhi
- `[ 15.37s]` **GESTURE** tap @(195,210)
- `[ 15.37s]` VIBRATE [20]
- `[ 15.37s]` SFX ♪ dm_tomhi
- `[ 15.47s]` SFX ♪ inst_kick
- `[ 16.03s]` VIBRATE [8]
- `[ 16.70s]` **GESTURE** tap @(195,210)
- `[ 16.70s]` VIBRATE [20]
- `[ 16.70s]` SFX ♪ dm_tomhi
- `[ 17.36s]` **GESTURE** tap @(195,210)
- `[ 17.36s]` VIBRATE [20]
- `[ 17.36s]` VIBRATE [60,40,60]
- `[ 17.36s]` SFX ♪ dm_tomhi
- `[ 17.36s]` SFX ♪ dm_hat
- `[ 18.69s]` **GESTURE** tap @(195,210)
- `[ 18.69s]` VIBRATE [20]
- `[ 18.69s]` VIBRATE [60,40,60]
- `[ 18.69s]` SFX ♪ dm_tomhi
- `[ 18.69s]` SFX ♪ dm_hat
- `[ 22.11s]` SFX ♪ dm_snare
- `[ 22.70s]` VIBRATE [8]
- `[ 23.47s]` SFX ♪ dm_tomlo
- `[ 24.02s]` VIBRATE [8]
- `[ 25.34s]` **GESTURE** tap @(195,210)
- `[ 25.34s]` VIBRATE [20]
- `[ 25.34s]` VIBRATE [60,40,60]
- `[ 25.34s]` SFX ♪ dm_tomhi
- `[ 25.34s]` SFX ♪ dm_hat
- `[ 26.67s]` **GESTURE** tap @(65,210)
- `[ 26.67s]` VIBRATE [20]
- `[ 26.67s]` VIBRATE [60,40,60]
- `[ 26.67s]` SFX ♪ dm_hat
- `[ 26.67s]` SFX ♪ dm_hat
- `[ 27.39s]` **GESTURE** swipedown @(195,422)
- `[ 27.39s]` VIBRATE [20]
- `[ 27.39s]` SFX ♪ inst_kick
- `[ 27.74s]` VIBRATE [10]
- `[ 27.75s]` VOICE ▶ menu_main (dur 5.6s)
- `[ 29.65s]` **GESTURE** tap @(195,422)
- `[ 29.65s]` VIBRATE [20]
- `[ 30.15s]` VOICE ■ menu_main (kill)
- `[ 30.16s]` VOICE ▶ menu_lobby (dur 0.6370975056689342s)
- `[ 30.64s]` VOICE ■ menu_lobby (kill)
- `[ 31.62s]` **GESTURE** swipeup @(195,422)
- `[ 31.62s]` VIBRATE [20]
- `[ 31.98s]` VIBRATE [10]
- `[ 31.99s]` VOICE ▶ rules (dur 7.68s)
- `[ 36.66s]` VOICE ■ rules (kill)
- `[ 36.66s]` VOICE ▶ settings_hint (dur 1.36s)
- `[ 37.61s]` VOICE ■ settings_hint (kill)
- `[ 38.38s]` **GESTURE** swipedown @(195,422)
- `[ 38.39s]` VIBRATE [20]
- `[ 38.74s]` VIBRATE [10]
- `[ 38.74s]` BGM ♪ track90 (loop)
- `[ 38.78s]` SFX ♪ inst_kick
- `[ 38.86s]` VIBRATE [8]
- `[ 38.94s]` SFX ♪ inst_kick
- `[ 39.52s]` VIBRATE [8]
- `[ 39.58s]` SFX ♪ inst_kick
- `[ 40.18s]` VIBRATE [8]
- `[ 40.26s]` SFX ♪ inst_kick
- `[ 40.85s]` VIBRATE [8]
- `[ 41.53s]` **GESTURE** tap @(325,210)
- `[ 41.53s]` VIBRATE [20]
- `[ 41.53s]` SFX ♪ dm_crash
- `[ 42.86s]` **GESTURE** tap @(195,210)
- `[ 42.86s]` VIBRATE [20]
- `[ 42.86s]` SFX ♪ dm_tomhi
- `[ 43.53s]` **GESTURE** tap @(195,210)
- `[ 43.53s]` VIBRATE [20]
- `[ 43.53s]` SFX ♪ dm_tomhi
- `[ 43.90s]` SFX ♪ inst_kick
- `[ 44.46s]` VIBRATE [8]
- `[ 44.54s]` SFX ♪ inst_kick
- `[ 45.12s]` VIBRATE [8]
- `[ 45.22s]` SFX ♪ dm_snare
- `[ 45.79s]` VIBRATE [8]
- `[ 47.62s]` VIBRATE [60,40,60]
- `[ 47.63s]` SFX ♪ dm_hat
- `[ 47.77s]` **GESTURE** tap @(195,210)
- `[ 47.78s]` VIBRATE [20]
- `[ 47.78s]` VIBRATE [60,40,60]
- `[ 47.78s]` SFX ♪ dm_tomhi
- `[ 47.78s]` SFX ♪ dm_hat
- `[ 48.24s]` **GESTURE** longpress @(195,422)
- `[ 48.24s]` VIBRATE [20]
- `[ 48.24s]` SFX ♪ inst_kick
- `[ 48.69s]` VIBRATE [60,40,60]
- `[ 48.69s]` SFX ♪ dm_hat
- `[ 48.94s]` VIBRATE [60,40,60]
- `[ 48.94s]` SFX ♪ dm_hat
- `[ 49.24s]` **GESTURE** tap @(195,210)
- `[ 49.24s]` VIBRATE [20]
- `[ 49.24s]` SFX ♪ dm_tomhi
- `[ 51.86s]` SFX ♪ dm_snare
- `[ 52.46s]` VIBRATE [8]
- `[ 52.54s]` SFX ♪ dm_tomlo
- `[ 53.13s]` VIBRATE [8]
- `[ 53.22s]` SFX ♪ inst_kick
- `[ 53.81s]` VIBRATE [8]
- `[ 55.58s]` VIBRATE [60,40,60]
- `[ 55.58s]` SFX ♪ dm_hat
- `[ 55.75s]` **GESTURE** tap @(65,210)
- `[ 55.75s]` VIBRATE [20]
- `[ 55.75s]` VIBRATE [60,40,60]
- `[ 55.75s]` SFX ♪ dm_hat
- `[ 55.75s]` SFX ♪ dm_hat
- `[ 56.49s]` **GESTURE** tap @(325,210)
- `[ 56.49s]` VIBRATE [20]
- `[ 56.49s]` VIBRATE [60,40,60]
- `[ 56.49s]` SFX ♪ dm_crash
- `[ 56.49s]` SFX ♪ dm_hat
- `[ 59.90s]` SFX ♪ inst_kick
- `[ 60.47s]` VIBRATE [8]
- `[ 60.50s]` VOICE ▶ mid_song (dur 1.6s)
- `[ 60.54s]` SFX ♪ dm_snare
- `[ 61.12s]` VIBRATE [8]
- `[ 61.22s]` SFX ♪ inst_kick
- `[ 61.45s]` VOICE ■ mid_song (kill)
- `[ 61.80s]` VIBRATE [8]
- `[ 61.90s]` SFX ♪ dm_tomlo
- `[ 62.47s]` VIBRATE [8]
- `[ 63.58s]` VIBRATE [60,40,60]
- `[ 63.58s]` SFX ♪ dm_hat
- `[ 63.78s]` **GESTURE** tap @(195,210)
- `[ 63.78s]` VIBRATE [20]
- `[ 63.78s]` VIBRATE [60,40,60]
- `[ 63.78s]` SFX ♪ dm_tomhi
- `[ 63.78s]` SFX ♪ dm_hat
- `[ 64.44s]` **GESTURE** tap @(65,210)
- `[ 64.44s]` VIBRATE [20]
- `[ 64.44s]` VIBRATE [60,40,60]
- `[ 64.44s]` SFX ♪ dm_hat
- `[ 64.44s]` SFX ♪ dm_hat
- `[ 65.22s]` SFX ♪ dm_hat
- `[ 65.58s]` VIBRATE [60,40,60]
- `[ 65.58s]` SFX ♪ dm_hat
- `[ 65.80s]` VIBRATE [8]
- `[ 66.54s]` SFX ♪ dm_snare
- `[ 67.13s]` VIBRATE [8]
- `[ 67.22s]` SFX ♪ inst_kick
- `[ 67.80s]` VIBRATE [8]
- `[ 68.42s]` **GESTURE** tap @(325,210)
- `[ 68.42s]` VIBRATE [20]
- `[ 68.42s]` VIBRATE [60,40,60]
- `[ 68.42s]` SFX ♪ dm_crash
- `[ 68.42s]` SFX ♪ dm_hat
- `[ 69.74s]` **GESTURE** tap @(65,630)
- `[ 69.74s]` VIBRATE [20]
- `[ 69.75s]` SFX ♪ dm_snare
- `[ 69.75s]` SFX ♪ dm_accent
- `[ 70.54s]` SFX ♪ inst_kick
- `[ 70.94s]` VIBRATE [60,40,60]
- `[ 70.94s]` SFX ♪ dm_hat
- `[ 71.14s]` VIBRATE [8]
- `[ 71.22s]` SFX ♪ dm_hat
- `[ 71.79s]` VIBRATE [8]
- `[ 71.90s]` SFX ♪ inst_kick
- `[ 72.46s]` VIBRATE [8]
- `[ 72.54s]` SFX ♪ dm_crash
- `[ 73.14s]` VIBRATE [8]
- `[ 73.80s]` **GESTURE** tap @(195,210)
- `[ 73.80s]` VIBRATE [20]
- `[ 73.80s]` VIBRATE [60,40,60]
- `[ 73.80s]` SFX ♪ dm_tomhi
- `[ 73.80s]` SFX ♪ dm_hat
- `[ 74.46s]` **GESTURE** tap @(195,210)
- `[ 74.46s]` VIBRATE [20]
- `[ 74.46s]` VIBRATE [60,40,60]
- `[ 74.46s]` SFX ♪ dm_tomhi
- `[ 74.46s]` SFX ♪ dm_hat
- `[ 75.62s]` VIBRATE [60,40,60]
- `[ 75.62s]` SFX ♪ dm_hat
- `[ 75.78s]` **GESTURE** tap @(195,210)
- `[ 75.79s]` VIBRATE [20]
- `[ 75.79s]` VIBRATE [60,40,60]
- `[ 75.79s]` SFX ♪ dm_tomhi
- `[ 75.79s]` SFX ♪ dm_hat
- `[ 75.90s]` SFX ♪ dm_snare
- `[ 76.47s]` VIBRATE [8]
- `[ 76.54s]` SFX ♪ dm_tomlo
- `[ 77.12s]` VIBRATE [8]
- `[ 77.22s]` SFX ♪ dm_hat
- `[ 77.80s]` VIBRATE [8]
- `[ 77.86s]` SFX ♪ inst_kick
- `[ 78.45s]` VIBRATE [8]
- `[ 79.10s]` **GESTURE** tap @(325,630)
- `[ 79.10s]` VIBRATE [20]
- `[ 79.10s]` VIBRATE [60,40,60]
- `[ 79.10s]` SFX ♪ dm_tomlo
- `[ 79.10s]` SFX ♪ dm_hat
- `[ 79.15s]` VOICE ▶ tut_fill (dur 3.68s)
- `[ 80.26s]` VIBRATE [60,40,60]
- `[ 80.26s]` SFX ♪ dm_hat
- `[ 80.42s]` **GESTURE** tap @(325,210)
- `[ 80.42s]` VIBRATE [20]
- `[ 80.42s]` VIBRATE [60,40,60]
- `[ 80.42s]` SFX ♪ dm_crash
- `[ 80.42s]` SFX ♪ dm_hat
- `[ 81.08s]` **GESTURE** tap @(65,630)
- `[ 81.08s]` VIBRATE [20]
- `[ 81.08s]` VIBRATE [60,40,60]
- `[ 81.08s]` SFX ♪ dm_snare
- `[ 81.09s]` SFX ♪ dm_hat
- `[ 81.22s]` SFX ♪ inst_kick
- `[ 81.40s]` VOICE ■ tut_fill (kill)
- `[ 81.54s]` SFX ♪ inst_kick
- `[ 81.80s]` VIBRATE [8]
- `[ 81.86s]` SFX ♪ inst_kick
- `[ 82.13s]` VIBRATE [8]
- `[ 82.22s]` SFX ♪ dm_snare
- `[ 82.46s]` VIBRATE [8]
- `[ 82.54s]` SFX ♪ dm_snare
- `[ 82.80s]` VIBRATE [8]
- `[ 82.86s]` SFX ♪ inst_kick
- `[ 83.13s]` VIBRATE [8]
- `[ 83.22s]` SFX ♪ dm_crash
- `[ 83.46s]` VIBRATE [8]
- `[ 83.81s]` VIBRATE [8]
- `[ 84.82s]` **GESTURE** tap @(195,210)
- `[ 84.82s]` VIBRATE [20]
- `[ 84.82s]` VIBRATE [60,40,60]
- `[ 84.82s]` SFX ♪ dm_tomhi
- `[ 84.82s]` SFX ♪ dm_hat
- `[ 84.94s]` VIBRATE [60,40,60]
- `[ 84.94s]` SFX ♪ dm_hat
- `[ 85.28s]` **GESTURE** tap @(195,210)
- `[ 85.28s]` VIBRATE [20]
- `[ 85.28s]` VIBRATE [60,40,60]
- `[ 85.28s]` SFX ♪ dm_tomhi
- `[ 85.28s]` SFX ♪ dm_hat
- `[ 85.81s]` **GESTURE** tap @(65,210)
- `[ 85.81s]` VIBRATE [20]
- `[ 85.81s]` VIBRATE [60,40,60]
- `[ 85.81s]` SFX ♪ dm_hat
- `[ 85.81s]` SFX ♪ dm_hat
- `[ 85.94s]` VIBRATE [60,40,60]
- `[ 85.94s]` SFX ♪ dm_hat
- `[ 86.28s]` **GESTURE** tap @(65,210)
- `[ 86.28s]` VIBRATE [20]
- `[ 86.28s]` VIBRATE [60,40,60]
- `[ 86.28s]` SFX ♪ dm_hat
- `[ 86.28s]` SFX ♪ dm_hat
- `[ 86.94s]` VIBRATE [60,40,60]
- `[ 86.94s]` SFX ♪ dm_hat
- `[ 87.43s]` VOICE ▶ grade_c (dur 4.16s)
- `[ 89.97s]` VOICE ■ grade_c (kill)
- `[ 89.97s]` VOICE ▶ new_best_combo (dur 1.44s)
- `[ 90.92s]` VOICE ■ new_best_combo (kill)
- `[ 90.92s]` VOICE ▶ restart (dur 3.36s)
- `[ 92.98s]` VOICE ■ restart (kill)
- `[ 92.98s]` BGM ♪ menu (loop)
@@ -0,0 +1,208 @@
{
"game": "rhythm",
"settings": {
"voice": "female",
"guide": "standard",
"speed": 1.7,
"bgm": 0.3
},
"outdir": "/home/xsl/AutoVideo/SoundGame/web/harness/live/out/rhythm-20260914100502",
"segs": [
{
"idx": 0,
"voiceId": "welcome",
"t0": 0.054,
"t1": 1.711,
"dur": 6.24,
"expEnd": 3.725,
"truncated": true,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 1,
"voiceId": "tut_map",
"t0": 1.711,
"t1": 3.08,
"dur": 14.28,
"expEnd": 10.111,
"truncated": true,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 2,
"voiceId": "tut_probe",
"t0": 3.08,
"t1": 4.449,
"dur": 3.76,
"expEnd": 5.292,
"truncated": true,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 3,
"voiceId": "zone_tl",
"t0": 5.325,
"t1": 6.544,
"dur": 1.68,
"expEnd": 6.313,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 4,
"voiceId": "zone_bc",
"t0": 7.596,
"t1": 9.004,
"dur": 2,
"expEnd": 8.772,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 5,
"voiceId": "tut_skip",
"t0": 9.618,
"t1": 11.024,
"dur": 2,
"expEnd": 10.794,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 6,
"voiceId": "menu_main",
"t0": 27.753,
"t1": 30.151,
"dur": 5.6,
"expEnd": 31.047,
"truncated": true,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 7,
"voiceId": "menu_lobby",
"t0": 30.156,
"t1": 30.643,
"dur": 0.6370975056689342,
"expEnd": 30.531,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 8,
"voiceId": "rules",
"t0": 31.986,
"t1": 36.657,
"dur": 7.68,
"expEnd": 36.504,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 9,
"voiceId": "settings_hint",
"t0": 36.663,
"t1": 37.609,
"dur": 1.36,
"expEnd": 37.463,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 10,
"voiceId": "mid_song",
"t0": 60.504,
"t1": 61.454,
"dur": 1.6,
"expEnd": 61.445,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 11,
"voiceId": "tut_fill",
"t0": 79.153,
"t1": 81.398,
"dur": 3.68,
"expEnd": 81.318,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 12,
"voiceId": "grade_c",
"t0": 87.434,
"t1": 89.965,
"dur": 4.16,
"expEnd": 89.881,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 13,
"voiceId": "new_best_combo",
"t0": 89.971,
"t1": 90.917,
"dur": 1.44,
"expEnd": 90.818,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
},
{
"idx": 14,
"voiceId": "restart",
"t0": 90.924,
"t1": 92.984,
"dur": 3.36,
"expEnd": 92.9,
"truncated": false,
"reason": "kill",
"verdict": null,
"heard": null,
"similarity": null
}
],
"rows": []
}
@@ -0,0 +1,53 @@
# 《节拍行者》鼓手模式 R1 人设评审(基于 round0 转写 + live A/B 实录)
## P1 视障资深玩家(专业评委)
### 节拍行者(鼓手模式)
- 状态感知:4/5 —— 绝大多数时刻清楚自己在哪:摸鼓阶段每摸一区报区名(「左上,踩镲。」),教学每步有明确指令句,演奏中领奏停了=轮到我这个契约从转写 t+60.9s 的 gd_answer+turn 开始就非常清楚。扣分项:①连摸三下快进时第三下的区名被掐断(zone_bl TRUNCATED,live A 实录)——报一半就没了;②曲尾半句「慢了半拍。」被评级语音顶掉,最后听到的引导是半句话。
- 下一步明确性:4/5 —— 应答窗内零语音的纪律执行得好(live A 正片应答段无一句插话);结算屏三选项播报齐全。扣一分:摸鼓进阶条件「摸到三个不同的地方」在蒙眼+快摸时只能靠数数,没有「还差一个」的进度提示。
- 愿意继续玩:**是** —— 这是少见的「先给你乐器随便玩,再教你曲子」的节奏游戏,探索阶段零惩罚,双轴(列=声像/行=音高)的心智模型三句话就立住了,比我玩过的大多数盲 accessible 节奏游戏的「背手势表」高一个档次。
- P0 问题:无(无「不知道自己在哪/该做什么」的时刻)。
- 建议:①区名被掐断修掉(第三下摸完让它报完再进教学);②曲尾 3 秒内别再插向导句,直接结算;③摸鼓进度播报(「还差一个」)。
## P2 时间充裕的大学生
### 节拍行者(鼓手模式)
- 状态感知:4/5 —— 头 10 秒就在敲真鼓(摸鼓认区),比「听 30 秒旁白」强太多。演奏中每句「领奏 1 小节→空 1 小节给我」结构清晰,加花前还有预告(「最后有一段加花,跟着我连打」)。扣分:教学连错时「再听一遍,跟着来」连着播两遍(retry_listen×2,live A 28.1s/30.4s),像复读机。
- 下一步明确性:5/5 —— 任何时候都知道该干嘛:摸鼓时随便摸、教学时听数拍跟打、漏打了有「慢了半拍,下一小节跟上我就行」兜底。没有一帧是无提示的。
- 愿意继续玩:**是** —— 90 秒一局、A 级解锁下一首的钩子很标准但有效;加花(一串快鼓+吊镲收尾)是真实的爽点,转写里 t+118.5s 那句预告一出来我就精神了。打完立刻想开《追风》。
- P0 问题:无。
- 建议:①纠正链「再听一遍」二连播合并成一句;②解锁播报可以更燃一点(现在的「新曲目解锁,追风!」偏平淡)。
## P3 时间紧张的白领
### 节拍行者(鼓手模式)
- 状态感知:4/5 —— 单手竖握,下排三个区拇指全覆盖,上排手掌下移就够——单手盲操成立。被打断(下滑菜单)后「四拍之后,继续」+四下底鼓数拍回来,25 分钟地铁里能完整打一局(65-80 秒)。扣分:曲中 half 的「过半了,保持」在嘈杂环境 ducking 后偏小(live B bgm=0.3 下清晰,但真地铁满音量 BGM 时待验证)。
- 下一步明确性:4/5 —— 通勤场景最需要的「随时可暂停、一句话接上」做到了。扣一分:选曲界面左右滑的反馈只有曲名语音,如果正好在隧道里没听清是哪首,没有重听快捷键提示(要靠自己记得上滑是规则)。
- 愿意继续玩:**是** —— 单局短、可暂停、无倒计时惩罚,错鼓就是一声闷镲不骂街,地铁站立可玩。
- P0 问题:无。
- 建议:①选曲播报加序号(「第一首/第二首」其实已有,保留);②menu 帮助里补一句「选曲时上滑听规则」。
## P4 疲惫的工人
### 节拍行者(鼓手模式)
- 状态感知:5/5 —— 规则一遍就懂:「我敲一小节鼓,你在下一小节照着敲回来」。做错了听到的是「没关系,我们先走下一句」「我放慢一些,跟着试试」——没有一句数落。全程没有血条、没有倒计时、没有「失败」两个字。
- 下一步明确性:5/5 —— 教学三步一步一步带,数拍是四下底鼓,跟着敲就行;放慢重演的安排对我这种反应慢的人就是雪中送炭(live A 实录 gd_slow 后慢速领奏再教一遍)。
- 愿意继续玩:**是** —— 不累。打错了歌照唱,评级 C 级也说「别灰心,再来一遍」。晚上外放小音量,底鼓军鼓分得清,低音不轰头。
- P0 问题:无。
- 建议:①教学完了进第一首之间衔接很顺,保持;②希望开场白再短一点(「今天你是乐队的鼓手」这句喜欢,保留)。
---
### 评审专门问题汇总
**分区心智模型是否建立(蒙眼能否说清自己敲的是哪个区)?**
P1:能。双轴模型(列=左右耳、行=亮/沉)+六件乐器音色各异,三重冗余。live A 实录里驱动按谱面敲 36 音仅 4 音失手(且系驱动 artifact),反过来证明「听着领奏音色+声像找区」的映射可被快速掌握。
P2/P3/P4:摸鼓阶段的「报名」机制是关键——蒙眼摸到哪听到哪 + 名字,建模型靠手不靠背。
**合拍感?**
live A:33/37 音 Perfect 级(dt≈0.00s 真机直证),Perfect 有亮音叠加、16 连击有震动,合奏感(领奏=同音色)是旧作好评基因的延续。
**旧作保留的亮点是否还在?**
跟随领奏核心 ✓、S~C 评级与解锁 ✓(live A A 级解锁《追风》实录)、BPM 精确(谱面锚定 bpm_precise 实测网格)✓、不中断不掉血 ✓、旁白可跳/长按快进 ✓、菜单断点续播 ✓。
**裁决:4/4 愿意继续玩,P0 = 0 —— R1 达标。**
@@ -0,0 +1,51 @@
# 《节拍行者》鼓手模式 R1 synthesis(产品裁定)
## 输入
- 转写:`round0/transcript-main.md`(mock 新手全弧线,201 行)+ live A/B 实录
(`live-player.md`:A 局 ASR OK 11/TRUNCATED 5/MISMATCH 2,A 级通关+解锁;
B 局 standard 档零向导语音、错区乱打 grade_c、菜单/长按全路径)
- 人设:4/4 愿意继续玩(P1 4/4·4/5、P2 4/5·5/5、P3 4/5·4/5、P4 5/5·5/5),P0 = 0
## 裁定:4/4 愿意继续玩,P0 = 0 —— **R1 达标**(≥3/4 且无 P0 级状态混淆)
## P0 清单
无。三通道(mock 转写/live 实录/四人设)均未出现「不知道自己在哪/该做什么/
为何失败」的状态混淆;教学失败、菜单中断、错鼓、长按、结算每条路径都有
听觉兜底且实测可达。
## P1 清单(R2 修复,含尽量修的 P2)
1. **F1 曲尾向导句被结算顶断**:连 2 Miss 的 gd_miss 在曲尾 miss 后插播,
1.1s 即被结算评级语音顶掉(live A 实录「慢了半拍。」半句)。修:guide.error
调度加「距 _phaseEnd < 3s 静默跳过」守卫(与 gd_miss 同曲一次的配额共用,
宁可不说不说半句)。
2. **F2 探针第三击区名被掐断**:摸满 3 区进阶时 stopVoice 切断正在播的区名
(zone_bl TRUNCATED,live A 实录;P1 评委点名)。修:探针 advance 不再
stopVoice,教学步语音改 queue:true 排在区名后播(链式 onComplete 推进,
_tutLead 的 ≥1.2s 缓冲天然吸收排队延迟)。
3. **F3 教学纠正链复读机**:retry_listen 在纠正链尾与默认纠正句二连播
(live A 28.1s/30.4s;P2 评委点名)。修:纠正链去重——wrong/early/late
归因句已含「再听」语义时不再追加 retry_listen。
4. **F4(P2)unlock 播报燃度**:维持现状(文案经 TTS 双性别验证,不改)。
5. **F5(P2,不修)** zone_tr/zone_tc/new_best_combo 的 ASR MISMATCH =
短句同音近失(cipher 先例归因),人耳可辨。
## F 类修复复核结论(R2 验收口径)
- F1 断言:曲尾 3s 内连 2 Miss → 无 gd_miss 语音调度(事件钩子可证),
结算链完整不截断。
- F2 断言:快速连摸 3 区 → 区名全部自然播完 → 教学句紧随其后 → T1 数拍
不误拍(时间轴:区名链 ≤6s + 教学句 + 1.2s 缓冲对齐下一小节)。
- F3 断言:教学失败时纠正语音链至多 2 句且不含相邻重复 id。
- 既有绿全部不回退:playtest 129 / guide.test 122 / check_all_assets。
## 其他记录
- live 基础设施教训 5 条(单飞拉取/when 字段/vibrate 锚/layer 过滤/视口
坐标)已沉淀在 `live-player.md` 末尾,惠及全部泳道。
- 驱动 artifact(曲尾 clearPending 误杀尾单、B 局 verdicts 未及落盘)非游戏
缺陷,R2 驱动已修/规避。
- 资产零新增(修复全部代码层);语音/BGM/合成资产经 check_all_assets 与
live 双通道验证无缺失。
@@ -0,0 +1,28 @@
# 《节拍行者》鼓手模式 R2 全拟真试玩报告
复跑主线局(live A 同款驱动,端口 8142,产物 `live/A/` = rhythm-20260914102057)。
R1 synthesis 的三项 P1 修复(F1 曲尾 gd_miss 守卫 / F2 探针区名防掐断 /
F3 纠正链去重)全部带断言落地(playtest A23-A25),本局为修复后的真机验收。
## 验收结果
- ASR 判定:**OK 12 / TRUNCATED 3 / MISMATCH 2**(R1 为 11/5/2)
- **F2 直证**:三连摸区名链 zone_tl 5.32→6.92 / zone_tr 7.99→9.87 /
zone_bl 10.66→**13.00(播完)** → tut_z_kick 13.01 接续——区名不再被掐断,
教学句乖乖排队(150ms 延迟起步 + queue 链,根因是引擎入队判定在 await
加载之前,同步连发会误判通道空闲)
- **F1 直证**:曲尾 4 记 Miss 全程无 gd_miss 语音调度(R1 同位置半句截断
消失),结算链 grade_a → unlock_song2 → restart 零截断
- **F3 直证**(mock 断言 A23):没出手失败的纠正链 retry_listen 只播一次;
live 教学段语音序列无相邻复读
- 演奏精度保持:**33 记 Perfect accent / 4 记 Miss**(dt≈0.00s),
tut_done 61.4s → grade_a 126.8s → unlock_song2 133.2s 全弧线
- 剩余 TRUNCATED×3 = 驱动故意跳旁白(welcome/tut_map/tut_probe);
MISMATCH×2 = 短句 ASR 同音近失(zone_tr「有上调查」/ new_best_combo
「新联机记录」,cipher 先例归因,人耳可辨)
## 结论
修复零回退(playtest 129→134 含新增 3 断言 / guide.test 122 /
check_all_assets 全绿 / 15 游戏+3 引擎测试全量回归绿),live 直证 F1-F3
全部兑现。R2 达标。
@@ -0,0 +1,365 @@
{"ev":"probe_ready","t":8.900000005960464,"ta":null}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":1522.2000000178814,"ta":-0.087}
{"ev":"recstart","mime":"audio/webm;codecs=opus","t":1608.9000000059605,"ta":0}
{"ev":"fetch","url":"audio/sfx/dm_hat.ogg","status":200,"ok":true,"ms":14,"t":1623.2000000178814,"ta":0.014}
{"ev":"fetch","url":"audio/sfx/dm_tomhi.ogg","status":200,"ok":true,"ms":14,"t":1623.5,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_crash.ogg","status":200,"ok":true,"ms":14,"t":1623.5,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_snare.ogg","status":200,"ok":true,"ms":14,"t":1623.5,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/inst_kick.ogg","status":200,"ok":true,"ms":14,"t":1623.6000000238419,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_tomlo.ogg","status":200,"ok":true,"ms":14,"t":1623.6000000238419,"ta":0.015}
{"ev":"fetch","url":"audio/sfx/dm_accent.ogg","status":200,"ok":true,"ms":14,"t":1623.7000000178814,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/welcome.ogg","status":200,"ok":true,"ms":14,"t":1623.7000000178814,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/welcome_back.ogg","status":200,"ok":true,"ms":14,"t":1623.7000000178814,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/tut_map.ogg","status":200,"ok":true,"ms":14,"t":1623.800000011921,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/tut_probe.ogg","status":200,"ok":true,"ms":14,"t":1623.800000011921,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/select_hint.ogg","status":200,"ok":true,"ms":14,"t":1623.800000011921,"ta":0.015}
{"ev":"fetch","url":"audio/voice/male/mid_song.ogg","status":200,"ok":true,"ms":14,"t":1623.9000000059605,"ta":0.015}
{"ev":"fetch","url":"audio/bgm/menu.ogg","status":200,"ok":true,"ms":14,"t":1624.4000000059605,"ta":0.016}
{"ev":"fetch","url":"audio/bgm/track90.ogg","status":200,"ok":true,"ms":15,"t":1625.5,"ta":0.017}
{"ev":"fetch","url":"audio/bgm/track105.ogg","status":200,"ok":true,"ms":16,"t":1626.300000011921,"ta":0.017}
{"ev":"fetch","url":"audio/bgm/track120.ogg","status":200,"ok":true,"ms":17,"t":1627.6000000238419,"ta":0.019}
{"ev":"vstart","url":"audio/voice/male/welcome.ogg","t":1675.2000000178814,"dur":8.24,"ta":0.066}
{"ev":"start","t":1924.2000000178814,"sid":1,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":6,"ta":0.315}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":2816.5,"ta":1.208}
{"ev":"vibrate","pattern":"[20]","t":2818,"ta":1.209}
{"ev":"vend","url":"audio/voice/male/welcome.ogg","t":3318.600000023842,"reason":"kill","ta":1.71}
{"ev":"vstart","url":"audio/voice/male/tut_map.ogg","t":3318.800000011921,"dur":18.04,"ta":1.71}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":4185,"ta":2.576}
{"ev":"vibrate","pattern":"[20]","t":4186.4000000059605,"ta":2.578}
{"ev":"vend","url":"audio/voice/male/tut_map.ogg","t":4686.5,"reason":"kill","ta":3.078}
{"ev":"vstart","url":"audio/voice/male/tut_probe.ogg","t":4686.700000017881,"dur":3.84,"ta":3.078}
{"ev":"gesture","type":"tap","x":195,"y":422,"t":5553.100000023842,"ta":3.944}
{"ev":"vibrate","pattern":"[20]","t":5554.4000000059605,"ta":3.946}
{"ev":"vend","url":"audio/voice/male/tut_probe.ogg","t":6054.600000023842,"reason":"kill","ta":4.446}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":6921.100000023842,"ta":5.312}
{"ev":"vibrate","pattern":"[20]","t":6922.5,"ta":5.314}
{"ev":"start","t":6923.100000023842,"sid":2,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":5.314}
{"ev":"fetch","url":"audio/voice/male/zone_tl.ogg","status":200,"ok":true,"ms":2,"t":6924.5,"ta":5.316}
{"ev":"vstart","url":"audio/voice/male/zone_tl.ogg","t":6928,"dur":1.6,"ta":5.319}
{"ev":"vend","url":"audio/voice/male/zone_tl.ogg","t":8527.700000017881,"reason":"kill","ta":6.919}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":9591.5,"ta":7.983}
{"ev":"vibrate","pattern":"[20]","t":9594.700000017881,"ta":7.986}
{"ev":"start","t":9594.90000000596,"sid":3,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":7.986}
{"ev":"fetch","url":"audio/voice/male/zone_tr.ogg","status":200,"ok":true,"ms":2,"t":9596.800000011921,"ta":7.988}
{"ev":"vstart","url":"audio/voice/male/zone_tr.ogg","t":9600.600000023842,"dur":1.76,"ta":7.992}
{"ev":"vend","url":"audio/voice/male/zone_tr.ogg","t":11476.200000017881,"reason":"kill","ta":9.867}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":12262.90000000596,"ta":10.654}
{"ev":"vibrate","pattern":"[20]","t":12264.600000023842,"ta":10.656}
{"ev":"start","t":12264.90000000596,"sid":4,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":10.656}
{"ev":"fetch","url":"audio/voice/male/zone_bl.ogg","status":200,"ok":true,"ms":1,"t":12266.100000023842,"ta":10.657}
{"ev":"vstart","url":"audio/voice/male/zone_bl.ogg","t":12269.300000011921,"dur":2,"ta":10.66}
{"ev":"vend","url":"audio/voice/male/zone_bl.ogg","t":14610.700000017881,"reason":"kill","ta":13.002}
{"ev":"fetch","url":"audio/voice/male/tut_z_kick.ogg","status":200,"ok":true,"ms":2,"t":14612.700000017881,"ta":13.004}
{"ev":"vstart","url":"audio/voice/male/tut_z_kick.ogg","t":14619.600000023842,"dur":7.28,"ta":13.011}
{"ev":"vend","url":"audio/voice/male/tut_z_kick.ogg","t":22156.5,"reason":"kill","ta":20.548}
{"ev":"start","t":23037.100000023842,"sid":5,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":22,"ta":21.428}
{"ev":"vibrate","pattern":"[8]","t":23593.20000001788,"ta":21.984}
{"ev":"start","t":23677,"sid":6,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":22.666666666666668,"ta":22.068}
{"ev":"vibrate","pattern":"[8]","t":24273,"ta":22.664}
{"ev":"start","t":24357,"sid":7,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":23.333333333333332,"ta":22.748}
{"ev":"vibrate","pattern":"[8]","t":24923.100000023842,"ta":23.314}
{"ev":"start","t":25037.100000023842,"sid":8,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":24,"ta":23.428}
{"ev":"vibrate","pattern":"[8]","t":25596.100000023842,"ta":23.987}
{"ev":"start","t":25677.100000023842,"sid":9,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":24.666666666666668,"ta":24.068}
{"ev":"vibrate","pattern":"[8]","t":26276,"ta":24.667}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":28908.600000023842,"ta":27.3}
{"ev":"vibrate","pattern":"[20]","t":28910.90000000596,"ta":27.302}
{"ev":"start","t":28911.40000000596,"sid":10,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":27.303}
{"ev":"start","t":28911.40000000596,"sid":11,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":27.303}
{"ev":"fetch","url":"audio/voice/male/tut_z_sides.ogg","status":200,"ok":true,"ms":2,"t":29679.100000023842,"ta":28.07}
{"ev":"vstart","url":"audio/voice/male/tut_z_sides.ogg","t":29685.70000001788,"dur":5.2,"ta":28.077}
{"ev":"vend","url":"audio/voice/male/tut_z_sides.ogg","t":34903.20000001788,"reason":"kill","ta":33.294}
{"ev":"start","t":36343.5,"sid":12,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":35.33333333333333,"ta":34.735}
{"ev":"vibrate","pattern":"[8]","t":36927.60000002384,"ta":35.319}
{"ev":"start","t":37023.5,"sid":13,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":35.99999999999999,"ta":35.415}
{"ev":"vibrate","pattern":"[8]","t":37600.60000002384,"ta":35.992}
{"ev":"start","t":37663.5,"sid":14,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":36.666666666666664,"ta":36.055}
{"ev":"vibrate","pattern":"[8]","t":38257.60000002384,"ta":36.649}
{"ev":"start","t":38343.5,"sid":15,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":37.33333333333333,"ta":36.735}
{"ev":"vibrate","pattern":"[8]","t":38930.5,"ta":37.322}
{"ev":"start","t":39023.5,"sid":16,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":37.99999999999999,"ta":37.415}
{"ev":"vibrate","pattern":"[8]","t":39604.60000002384,"ta":37.996}
{"ev":"start","t":40343.5,"sid":17,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":39.33333333333333,"ta":38.735}
{"ev":"vibrate","pattern":"[8]","t":40933.60000002384,"ta":39.325}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":42248.30000001192,"ta":40.639}
{"ev":"vibrate","pattern":"[20]","t":42250.60000002384,"ta":40.642}
{"ev":"start","t":42250.70000001788,"sid":18,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":40.642}
{"ev":"start","t":42250.80000001192,"sid":19,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":40.642}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":43571.5,"ta":41.963}
{"ev":"vibrate","pattern":"[20]","t":43573,"ta":41.964}
{"ev":"start","t":43573.20000001788,"sid":20,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":41.964}
{"ev":"start","t":43573.20000001788,"sid":21,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":41.964}
{"ev":"fetch","url":"audio/voice/male/tut_z_patt.ogg","status":200,"ok":true,"ms":2,"t":44385.20000001788,"ta":42.776}
{"ev":"vstart","url":"audio/voice/male/tut_z_patt.ogg","t":44395.30000001192,"dur":9.68,"ta":42.786}
{"ev":"vend","url":"audio/voice/male/tut_z_patt.ogg","t":54174.30000001192,"reason":"kill","ta":52.565}
{"ev":"start","t":55014.60000002384,"sid":22,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":54,"ta":53.406}
{"ev":"vibrate","pattern":"[8]","t":55596.70000001788,"ta":53.988}
{"ev":"start","t":55654.60000002384,"sid":23,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":54.666666666666664,"ta":54.046}
{"ev":"vibrate","pattern":"[8]","t":56253.70000001788,"ta":54.645}
{"ev":"start","t":56334.60000002384,"sid":24,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":55.333333333333336,"ta":54.726}
{"ev":"vibrate","pattern":"[8]","t":56926.70000001788,"ta":55.318}
{"ev":"start","t":57014.70000001788,"sid":25,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":56,"ta":55.406}
{"ev":"vibrate","pattern":"[8]","t":57599.80000001192,"ta":55.991}
{"ev":"start","t":57694.70000001788,"sid":26,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":56.666666666666664,"ta":56.086}
{"ev":"vibrate","pattern":"[8]","t":58272.70000001788,"ta":56.664}
{"ev":"start","t":58334.60000002384,"sid":27,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":57.33333333333333,"ta":56.726}
{"ev":"vibrate","pattern":"[8]","t":58929.80000001192,"ta":57.321}
{"ev":"start","t":59014.70000001788,"sid":28,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":58,"ta":57.406}
{"ev":"vibrate","pattern":"[8]","t":59602.70000001788,"ta":57.994}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":60885.10000002384,"ta":59.276}
{"ev":"vibrate","pattern":"[20]","t":60886.5,"ta":59.278}
{"ev":"start","t":60886.80000001192,"sid":29,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":59.278}
{"ev":"start","t":60886.80000001192,"sid":30,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":59.278}
{"ev":"gesture","type":"tap","x":195,"y":210,"t":61545.80000001192,"ta":59.937}
{"ev":"vibrate","pattern":"[20]","t":61547.10000002384,"ta":59.938}
{"ev":"start","t":61547.30000001192,"sid":31,"url":"audio/sfx/dm_tomhi.ogg","layer":"sfx","dur":0.29750566893424035,"rate":1,"loop":false,"when":0,"ta":59.938}
{"ev":"start","t":61547.30000001192,"sid":32,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":59.938}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":62291.10000002384,"ta":60.682}
{"ev":"vibrate","pattern":"[20]","t":62292.60000002384,"ta":60.684}
{"ev":"start","t":62292.80000001192,"sid":33,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":60.684}
{"ev":"start","t":62292.90000000596,"sid":34,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":60.684}
{"ev":"fetch","url":"audio/voice/male/tut_done.ogg","status":200,"ok":true,"ms":2,"t":63016.40000000596,"ta":61.408}
{"ev":"vstart","url":"audio/voice/male/tut_done.ogg","t":63020.5,"dur":2.48,"ta":61.412}
{"ev":"vend","url":"audio/voice/male/tut_done.ogg","t":65736.60000002384,"reason":"kill","ta":64.128}
{"ev":"stop","t":65737,"sid":1,"when":0,"ta":64.128}
{"ev":"start","t":65738.10000002384,"sid":35,"url":"audio/bgm/track90.ogg","layer":"bgm","dur":82.33301587301587,"rate":1,"loop":true,"when":65.14512471655328,"ta":64.129}
{"ev":"start","t":66178.30000001192,"sid":36,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":65.14512471655328,"ta":64.569}
{"ev":"vibrate","pattern":"[8]","t":66736.30000001192,"ta":65.127}
{"ev":"start","t":66818.20000001788,"sid":37,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":65.81179138321995,"ta":65.209}
{"ev":"vibrate","pattern":"[8]","t":67416.20000001788,"ta":65.807}
{"ev":"start","t":67498.40000000596,"sid":38,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":66.47845804988661,"ta":65.89}
{"ev":"vibrate","pattern":"[8]","t":68066.40000000596,"ta":66.458}
{"ev":"start","t":68178.20000001788,"sid":39,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":67.14512471655328,"ta":66.569}
{"ev":"vibrate","pattern":"[8]","t":68739.20000001788,"ta":67.13}
{"ev":"start","t":68818.30000001192,"sid":40,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":67.81179138321995,"ta":67.209}
{"ev":"vibrate","pattern":"[8]","t":69396.30000001192,"ta":67.787}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":69411,"ta":67.802}
{"ev":"vibrate","pattern":"[20]","t":69413.20000001788,"ta":67.804}
{"ev":"start","t":69413.40000000596,"sid":41,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":67.805}
{"ev":"fetch","url":"audio/voice/male/gd_answer.ogg","status":200,"ok":true,"ms":2,"t":69419.80000001192,"ta":67.811}
{"ev":"vstart","url":"audio/voice/male/gd_answer.ogg","t":69423.30000001192,"dur":1.52,"ta":67.814}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":70074.90000000596,"ta":68.466}
{"ev":"vibrate","pattern":"[20]","t":70076.30000001192,"ta":68.467}
{"ev":"start","t":70076.40000000596,"sid":42,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":68.468}
{"ev":"start","t":70178.30000001192,"sid":43,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":69.14512471655328,"ta":68.569}
{"ev":"vibrate","pattern":"[8]","t":70742.20000001788,"ta":69.133}
{"ev":"vend","url":"audio/voice/male/gd_answer.ogg","t":71030.5,"reason":"kill","ta":69.422}
{"ev":"vibrate","pattern":"[60,40,60]","t":72538.30000001192,"ta":70.929}
{"ev":"start","t":72538.5,"sid":44,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":70.93}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":73386.30000001192,"ta":71.777}
{"ev":"vibrate","pattern":"[20]","t":73387.80000001192,"ta":71.779}
{"ev":"start","t":73388,"sid":45,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":71.779}
{"ev":"start","t":73388,"sid":46,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":71.779}
{"ev":"start","t":76818.30000001192,"sid":47,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":75.81179138321995,"ta":75.209}
{"ev":"vibrate","pattern":"[8]","t":77408.30000001192,"ta":75.799}
{"ev":"start","t":78178.30000001192,"sid":48,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":77.14512471655328,"ta":76.569}
{"ev":"vibrate","pattern":"[8]","t":78732.30000001192,"ta":77.123}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":80080.5,"ta":78.472}
{"ev":"vibrate","pattern":"[20]","t":80082.90000000596,"ta":78.474}
{"ev":"start","t":80083,"sid":49,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":78.474}
{"ev":"start","t":80083.10000002384,"sid":50,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":78.474}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":81403.5,"ta":79.795}
{"ev":"vibrate","pattern":"[20]","t":81405,"ta":79.796}
{"ev":"vibrate","pattern":"[20,40,20]","t":81405,"ta":79.796}
{"ev":"start","t":81405.20000001788,"sid":51,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":79.796}
{"ev":"start","t":81405.20000001788,"sid":52,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":79.796}
{"ev":"start","t":84818.20000001788,"sid":53,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":83.81179138321994,"ta":83.209}
{"ev":"vibrate","pattern":"[8]","t":85397.30000001192,"ta":83.788}
{"ev":"start","t":85498.30000001192,"sid":54,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":84.47845804988661,"ta":83.889}
{"ev":"vibrate","pattern":"[8]","t":86071.20000001788,"ta":84.462}
{"ev":"start","t":86138.30000001192,"sid":55,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":85.14512471655327,"ta":84.529}
{"ev":"vibrate","pattern":"[8]","t":86736.30000001192,"ta":85.127}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":88024.10000002384,"ta":86.415}
{"ev":"vibrate","pattern":"[20]","t":88025.60000002384,"ta":86.417}
{"ev":"start","t":88025.70000001788,"sid":56,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":86.417}
{"ev":"start","t":88025.80000001192,"sid":57,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":86.417}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":88684.10000002384,"ta":87.075}
{"ev":"vibrate","pattern":"[20]","t":88685.70000001788,"ta":87.077}
{"ev":"start","t":88685.80000001192,"sid":58,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":87.077}
{"ev":"start","t":88685.80000001192,"sid":59,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":87.077}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":89344.90000000596,"ta":87.736}
{"ev":"vibrate","pattern":"[20]","t":89346.40000000596,"ta":87.738}
{"ev":"vibrate","pattern":"[20,40,20]","t":89346.5,"ta":87.738}
{"ev":"start","t":89346.60000002384,"sid":60,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":87.738}
{"ev":"start","t":89346.70000001788,"sid":61,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":87.738}
{"ev":"start","t":92818.20000001788,"sid":62,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":91.81179138321994,"ta":91.209}
{"ev":"vibrate","pattern":"[8]","t":93410.20000001788,"ta":91.801}
{"ev":"start","t":93498.30000001192,"sid":63,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":92.47845804988661,"ta":91.889}
{"ev":"vibrate","pattern":"[8]","t":94071.30000001192,"ta":92.462}
{"ev":"start","t":94178.30000001192,"sid":64,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":93.14512471655327,"ta":92.569}
{"ev":"vibrate","pattern":"[8]","t":94733.30000001192,"ta":93.124}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":96048.20000001788,"ta":94.439}
{"ev":"vibrate","pattern":"[20]","t":96049.60000002384,"ta":94.441}
{"ev":"start","t":96049.70000001788,"sid":65,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":94.441}
{"ev":"start","t":96049.80000001192,"sid":66,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":94.441}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":96708.70000001788,"ta":95.1}
{"ev":"vibrate","pattern":"[20]","t":96710.10000002384,"ta":95.101}
{"ev":"start","t":96710.30000001192,"sid":67,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":95.101}
{"ev":"start","t":96710.30000001192,"sid":68,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":95.101}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":97368.10000002384,"ta":95.759}
{"ev":"vibrate","pattern":"[20]","t":97369.5,"ta":95.761}
{"ev":"vibrate","pattern":"[20,40,20]","t":97369.5,"ta":95.761}
{"ev":"start","t":97369.60000002384,"sid":69,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":95.761}
{"ev":"start","t":97369.70000001788,"sid":70,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":95.761}
{"ev":"start","t":100818.20000001788,"sid":71,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":99.81179138321994,"ta":99.209}
{"ev":"vibrate","pattern":"[8]","t":101399.30000001192,"ta":99.79}
{"ev":"vstart","url":"audio/voice/male/mid_song.ogg","t":101418.5,"dur":2.32,"ta":99.81}
{"ev":"start","t":101498.20000001788,"sid":72,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":100.47845804988661,"ta":99.889}
{"ev":"vibrate","pattern":"[8]","t":102072.30000001192,"ta":100.463}
{"ev":"start","t":102138.20000001788,"sid":73,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":101.14512471655327,"ta":100.529}
{"ev":"vibrate","pattern":"[8]","t":102729.40000000596,"ta":101.121}
{"ev":"start","t":102818.30000001192,"sid":74,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":101.81179138321994,"ta":101.209}
{"ev":"vibrate","pattern":"[8]","t":103402.30000001192,"ta":101.793}
{"ev":"vend","url":"audio/voice/male/mid_song.ogg","t":103767.90000000596,"reason":"kill","ta":102.159}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":104068.40000000596,"ta":102.46}
{"ev":"vibrate","pattern":"[20]","t":104069.80000001192,"ta":102.461}
{"ev":"start","t":104070,"sid":75,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":102.461}
{"ev":"start","t":104070,"sid":76,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":102.461}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":104729.80000001192,"ta":103.121}
{"ev":"vibrate","pattern":"[20]","t":104731.20000001788,"ta":103.122}
{"ev":"start","t":104731.30000001192,"sid":77,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":103.122}
{"ev":"start","t":104731.30000001192,"sid":78,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":103.122}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":105391.10000002384,"ta":103.782}
{"ev":"vibrate","pattern":"[20]","t":105392.60000002384,"ta":103.784}
{"ev":"start","t":105392.70000001788,"sid":79,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":103.784}
{"ev":"start","t":105392.80000001192,"sid":80,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":103.784}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":106053.20000001788,"ta":104.444}
{"ev":"vibrate","pattern":"[20]","t":106054.70000001788,"ta":104.446}
{"ev":"vibrate","pattern":"[20,40,20]","t":106054.70000001788,"ta":104.446}
{"ev":"start","t":106054.80000001192,"sid":81,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":104.446}
{"ev":"start","t":106054.80000001192,"sid":82,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":104.446}
{"ev":"start","t":106138.30000001192,"sid":83,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":105.14512471655328,"ta":104.529}
{"ev":"vibrate","pattern":"[8]","t":106735.30000001192,"ta":105.126}
{"ev":"start","t":107498.40000000596,"sid":84,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":106.47845804988661,"ta":105.89}
{"ev":"vibrate","pattern":"[8]","t":108081.40000000596,"ta":106.473}
{"ev":"start","t":108178.20000001788,"sid":85,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":107.14512471655328,"ta":106.569}
{"ev":"vibrate","pattern":"[8]","t":108731.30000001192,"ta":107.122}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":109367.5,"ta":107.759}
{"ev":"vibrate","pattern":"[20]","t":109368.80000001192,"ta":107.76}
{"ev":"start","t":109369,"sid":86,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":107.76}
{"ev":"start","t":109369,"sid":87,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":107.76}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":110691.90000000596,"ta":109.083}
{"ev":"vibrate","pattern":"[20]","t":110693.5,"ta":109.085}
{"ev":"start","t":110693.70000001788,"sid":88,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":109.085}
{"ev":"start","t":110693.70000001788,"sid":89,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":109.085}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":111352.90000000596,"ta":109.744}
{"ev":"vibrate","pattern":"[20]","t":111354.5,"ta":109.746}
{"ev":"vibrate","pattern":"[100]","t":111354.5,"ta":109.746}
{"ev":"vibrate","pattern":"[20,40,20]","t":111354.60000002384,"ta":109.746}
{"ev":"start","t":111354.60000002384,"sid":90,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":109.746}
{"ev":"start","t":111354.60000002384,"sid":91,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":109.746}
{"ev":"start","t":111498.30000001192,"sid":92,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":110.47845804988661,"ta":109.889}
{"ev":"vibrate","pattern":"[8]","t":112064.30000001192,"ta":110.455}
{"ev":"start","t":112178.40000000596,"sid":93,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":111.14512471655328,"ta":110.57}
{"ev":"vibrate","pattern":"[8]","t":112738.30000001192,"ta":111.129}
{"ev":"start","t":112818.30000001192,"sid":94,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":111.81179138321994,"ta":111.209}
{"ev":"vibrate","pattern":"[8]","t":113394.30000001192,"ta":111.785}
{"ev":"start","t":113498.30000001192,"sid":95,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":112.47845804988661,"ta":111.889}
{"ev":"vibrate","pattern":"[8]","t":114067.30000001192,"ta":112.458}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":114749,"ta":113.14}
{"ev":"vibrate","pattern":"[20]","t":114750.70000001788,"ta":113.142}
{"ev":"start","t":114750.80000001192,"sid":96,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":113.142}
{"ev":"start","t":114750.80000001192,"sid":97,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":113.142}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":115414,"ta":113.805}
{"ev":"vibrate","pattern":"[20]","t":115415.30000001192,"ta":113.806}
{"ev":"start","t":115415.5,"sid":98,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":113.807}
{"ev":"start","t":115415.5,"sid":99,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":113.807}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":116078.90000000596,"ta":114.47}
{"ev":"vibrate","pattern":"[20]","t":116080.30000001192,"ta":114.471}
{"ev":"start","t":116080.40000000596,"sid":100,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":114.472}
{"ev":"start","t":116080.40000000596,"sid":101,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":114.472}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":116738.90000000596,"ta":115.13}
{"ev":"vibrate","pattern":"[20]","t":116740.5,"ta":115.132}
{"ev":"vibrate","pattern":"[20,40,20]","t":116740.5,"ta":115.132}
{"ev":"start","t":116740.60000002384,"sid":102,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":115.132}
{"ev":"start","t":116740.70000001788,"sid":103,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":115.132}
{"ev":"start","t":116818.20000001788,"sid":104,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":115.81179138321994,"ta":115.209}
{"ev":"vibrate","pattern":"[8]","t":117400.20000001788,"ta":115.791}
{"ev":"start","t":117498.30000001192,"sid":105,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":116.47845804988661,"ta":115.889}
{"ev":"vibrate","pattern":"[8]","t":118074.20000001788,"ta":116.465}
{"ev":"start","t":118138.30000001192,"sid":106,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":117.14512471655327,"ta":116.529}
{"ev":"vibrate","pattern":"[8]","t":118730.30000001192,"ta":117.121}
{"ev":"start","t":118818.20000001788,"sid":107,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":117.81179138321994,"ta":117.209}
{"ev":"vibrate","pattern":"[8]","t":119403.30000001192,"ta":117.794}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":120055.20000001788,"ta":118.446}
{"ev":"vibrate","pattern":"[20]","t":120056.80000001192,"ta":118.448}
{"ev":"start","t":120056.90000000596,"sid":108,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":118.448}
{"ev":"start","t":120056.90000000596,"sid":109,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":118.448}
{"ev":"fetch","url":"audio/voice/male/tut_fill.ogg","status":200,"ok":true,"ms":2,"t":120100.10000002384,"ta":118.491}
{"ev":"vstart","url":"audio/voice/male/tut_fill.ogg","t":120104.90000000596,"dur":3.12,"ta":118.496}
{"ev":"gesture","type":"tap","x":325,"y":630,"t":120714.90000000596,"ta":119.106}
{"ev":"vibrate","pattern":"[20]","t":120716.5,"ta":119.108}
{"ev":"start","t":120716.60000002384,"sid":110,"url":"audio/sfx/dm_tomlo.ogg","layer":"sfx","dur":0.3470748299319728,"rate":1,"loop":false,"when":0,"ta":119.108}
{"ev":"start","t":120716.60000002384,"sid":111,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":119.108}
{"ev":"gesture","type":"tap","x":65,"y":210,"t":121377.30000001192,"ta":119.768}
{"ev":"vibrate","pattern":"[20]","t":121378.80000001192,"ta":119.77}
{"ev":"start","t":121379,"sid":112,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":1,"loop":false,"when":0,"ta":119.77}
{"ev":"start","t":121379.10000002384,"sid":113,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":119.77}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":122038.40000000596,"ta":120.43}
{"ev":"vibrate","pattern":"[20]","t":122040.10000002384,"ta":120.431}
{"ev":"vibrate","pattern":"[20,40,20]","t":122040.10000002384,"ta":120.431}
{"ev":"start","t":122040.20000001788,"sid":114,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":120.431}
{"ev":"start","t":122040.20000001788,"sid":115,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":120.431}
{"ev":"start","t":122138.20000001788,"sid":116,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":121.14512471655328,"ta":120.529}
{"ev":"start","t":122498.20000001788,"sid":117,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":121.47845804988661,"ta":120.889}
{"ev":"vibrate","pattern":"[8]","t":122736.20000001788,"ta":121.127}
{"ev":"start","t":122818.20000001788,"sid":118,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":121.81179138321995,"ta":121.209}
{"ev":"vibrate","pattern":"[8]","t":123058.30000001192,"ta":121.449}
{"ev":"start","t":123178.20000001788,"sid":119,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":122.14512471655328,"ta":121.569}
{"ev":"vibrate","pattern":"[8]","t":123410.30000001192,"ta":121.801}
{"ev":"start","t":123498.20000001788,"sid":120,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":122.47845804988661,"ta":121.889}
{"ev":"vend","url":"audio/voice/male/tut_fill.ogg","t":123549.70000001788,"reason":"kill","ta":121.941}
{"ev":"vibrate","pattern":"[8]","t":123731.20000001788,"ta":122.122}
{"ev":"start","t":123818.30000001192,"sid":121,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":122.81179138321995,"ta":122.209}
{"ev":"vibrate","pattern":"[8]","t":124060.30000001192,"ta":122.451}
{"ev":"start","t":124178.30000001192,"sid":122,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":123.14512471655328,"ta":122.569}
{"ev":"vibrate","pattern":"[8]","t":124411.20000001788,"ta":122.802}
{"ev":"vibrate","pattern":"[8]","t":124733.30000001192,"ta":123.124}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":125355,"ta":123.746}
{"ev":"vibrate","pattern":"[20]","t":125357.40000000596,"ta":123.749}
{"ev":"start","t":125357.5,"sid":123,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":123.749}
{"ev":"start","t":125357.60000002384,"sid":124,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":123.749}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":125819.20000001788,"ta":124.21}
{"ev":"vibrate","pattern":"[20]","t":125820.5,"ta":124.212}
{"ev":"start","t":125820.70000001788,"sid":125,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":124.212}
{"ev":"start","t":125820.70000001788,"sid":126,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":124.212}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":126283.30000001192,"ta":124.674}
{"ev":"vibrate","pattern":"[20]","t":126284.60000002384,"ta":124.676}
{"ev":"start","t":126284.70000001788,"sid":127,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":124.676}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":126746.30000001192,"ta":125.137}
{"ev":"vibrate","pattern":"[20]","t":126747.80000001192,"ta":125.139}
{"ev":"start","t":126747.80000001192,"sid":128,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":125.139}
{"ev":"start","t":126747.90000000596,"sid":129,"url":"audio/sfx/dm_accent.ogg","layer":"sfx","dur":0.1726984126984127,"rate":1,"loop":false,"when":0,"ta":125.139}
{"ev":"vibrate","pattern":"[60,40,60]","t":126898.20000001788,"ta":125.289}
{"ev":"start","t":126898.30000001192,"sid":130,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":125.289}
{"ev":"gesture","type":"tap","x":65,"y":630,"t":127211.5,"ta":125.603}
{"ev":"vibrate","pattern":"[20]","t":127212.90000000596,"ta":125.604}
{"ev":"vibrate","pattern":"[60,40,60]","t":127212.90000000596,"ta":125.604}
{"ev":"start","t":127213,"sid":131,"url":"audio/sfx/dm_snare.ogg","layer":"sfx","dur":0.21709750566893424,"rate":1,"loop":false,"when":0,"ta":125.604}
{"ev":"start","t":127213,"sid":132,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":125.604}
{"ev":"gesture","type":"tap","x":195,"y":630,"t":127676.90000000596,"ta":126.068}
{"ev":"vibrate","pattern":"[20]","t":127678.30000001192,"ta":126.069}
{"ev":"start","t":127678.40000000596,"sid":133,"url":"audio/sfx/inst_kick.ogg","layer":"sfx","dur":0.27709750566893426,"rate":1,"loop":false,"when":0,"ta":126.07}
{"ev":"vibrate","pattern":"[60,40,60]","t":127898.20000001788,"ta":126.289}
{"ev":"start","t":127898.40000000596,"sid":134,"url":"audio/sfx/dm_hat.ogg","layer":"sfx","dur":0.06709750566893424,"rate":0.5,"loop":false,"when":0,"ta":126.29}
{"ev":"gesture","type":"tap","x":325,"y":210,"t":128141.60000002384,"ta":126.533}
{"ev":"vibrate","pattern":"[20]","t":128143,"ta":126.534}
{"ev":"start","t":128143.10000002384,"sid":135,"url":"audio/sfx/dm_crash.ogg","layer":"sfx","dur":1.3,"rate":1,"loop":false,"when":0,"ta":126.534}
{"ev":"vibrate","pattern":"[100]","t":128378.80000001192,"ta":126.77}
{"ev":"vibrate","pattern":"[100]","t":128378.80000001192,"ta":126.77}
{"ev":"vibrate","pattern":"[20,40,20]","t":128378.90000000596,"ta":126.77}
{"ev":"fetch","url":"audio/voice/male/grade_a.ogg","status":200,"ok":true,"ms":2,"t":128380.90000000596,"ta":126.772}
{"ev":"vstart","url":"audio/voice/male/grade_a.ogg","t":128386.70000001788,"dur":4.4,"ta":126.778}
{"ev":"stop","t":129078.70000001788,"sid":35,"when":0,"ta":127.47}
{"ev":"vend","url":"audio/voice/male/grade_a.ogg","t":132952.90000000596,"reason":"kill","ta":131.344}
{"ev":"fetch","url":"audio/voice/male/new_best_combo.ogg","status":200,"ok":true,"ms":2,"t":132954.80000001192,"ta":131.346}
{"ev":"vstart","url":"audio/voice/male/new_best_combo.ogg","t":132958.10000002384,"dur":1.84,"ta":131.349}
{"ev":"vend","url":"audio/voice/male/new_best_combo.ogg","t":134833.20000001788,"reason":"kill","ta":133.224}
{"ev":"fetch","url":"audio/voice/male/unlock_song2.ogg","status":200,"ok":true,"ms":1,"t":134834.90000000596,"ta":133.226}
{"ev":"vstart","url":"audio/voice/male/unlock_song2.ogg","t":134838.60000002384,"dur":2.48,"ta":133.23}
{"ev":"vend","url":"audio/voice/male/unlock_song2.ogg","t":137549.90000000596,"reason":"kill","ta":135.941}
{"ev":"fetch","url":"audio/voice/male/restart.ogg","status":200,"ok":true,"ms":2,"t":137551.60000002384,"ta":135.943}
{"ev":"vstart","url":"audio/voice/male/restart.ogg","t":137556.40000000596,"dur":4.08,"ta":135.948}
{"ev":"vend","url":"audio/voice/male/restart.ogg","t":141659.30000001192,"reason":"kill","ta":140.05}
{"ev":"start","t":141659.60000002384,"sid":136,"url":"audio/bgm/menu.ogg","layer":"bgm","dur":90,"rate":1,"loop":true,"when":0,"ta":140.051}
{"ev":"recstop","t":293522.90000000596,"ta":291.914}
Binary file not shown.
@@ -0,0 +1,391 @@
# rhythm 实时会话 transcript
- `[ -0.09s]` **GESTURE** tap @(195,422)
- `[ 0.00s]` REC 开始 (audio/webm;codecs=opus)
- `[ 0.07s]` VOICE ▶ welcome (dur 8.24s)
- `[ 0.32s]` BGM ♪ track90 (loop)
- `[ 1.21s]` **GESTURE** tap @(195,422)
- `[ 1.21s]` VIBRATE [20]
- `[ 1.71s]` VOICE ■ welcome (kill)
- `[ 1.71s]` VOICE ▶ tut_map (dur 18.04s)
- `[ 1.71s]` VERDICT welcome: **TRUNCATED** sim=0.2667
- 期望: 欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。
- 听到: 欢迎来到。
- `[ 2.58s]` **GESTURE** tap @(195,422)
- `[ 2.58s]` VIBRATE [20]
- `[ 3.08s]` VOICE ■ tut_map (kill)
- `[ 3.08s]` VOICE ▶ tut_probe (dur 3.84s)
- `[ 3.08s]` VERDICT tut_map: **TRUNCATED** sim=0.0377
- 期望: 先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。
- 听到: 写写认。
- `[ 3.94s]` **GESTURE** tap @(195,422)
- `[ 3.95s]` VIBRATE [20]
- `[ 4.45s]` VOICE ■ tut_probe (kill)
- `[ 4.45s]` VERDICT tut_probe: **TRUNCATED** sim=0.4
- 期望: 摸到三个不同的地方,我们就开始。
- 听到: 嗯,摸到三个布。
- `[ 5.31s]` **GESTURE** tap @(65,210)
- `[ 5.31s]` VIBRATE [20]
- `[ 5.31s]` SFX ♪ dm_hat
- `[ 5.32s]` VOICE ▶ zone_tl (dur 1.6s)
- `[ 6.92s]` VOICE ■ zone_tl (kill)
- `[ 6.92s]` VERDICT zone_tl: **OK** sim=0.75
- 期望: 左上,踩镲。
- 听到: 左上踩草。
- `[ 7.98s]` **GESTURE** tap @(325,210)
- `[ 7.99s]` VIBRATE [20]
- `[ 7.99s]` SFX ♪ dm_crash
- `[ 7.99s]` VOICE ▶ zone_tr (dur 1.76s)
- `[ 9.87s]` VOICE ■ zone_tr (kill)
- `[ 9.87s]` VERDICT zone_tr: **MISMATCH** sim=0.25
- 期望: 右上,吊镲。
- 听到: 有上调查。
- `[ 10.65s]` **GESTURE** tap @(65,630)
- `[ 10.66s]` VIBRATE [20]
- `[ 10.66s]` SFX ♪ dm_snare
- `[ 10.66s]` VOICE ▶ zone_bl (dur 2s)
- `[ 13.00s]` VOICE ■ zone_bl (kill)
- `[ 13.00s]` VERDICT zone_bl: **OK** sim=1
- 期望: 左下,军鼓。
- 听到: 左下军鼓。
- `[ 13.01s]` VOICE ▶ tut_z_kick (dur 7.28s)
- `[ 20.55s]` VOICE ■ tut_z_kick (kill)
- `[ 20.55s]` VERDICT tut_z_kick: **OK** sim=0.9565
- 期望: 下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。
- 听到: 下面正中间是题鼓,你的家先听四下数拍,然后跟着我敲。
- `[ 21.43s]` SFX ♪ dm_accent
- `[ 21.98s]` VIBRATE [8]
- `[ 22.07s]` SFX ♪ dm_accent
- `[ 22.66s]` VIBRATE [8]
- `[ 22.75s]` SFX ♪ dm_accent
- `[ 23.31s]` VIBRATE [8]
- `[ 23.43s]` SFX ♪ dm_accent
- `[ 23.99s]` VIBRATE [8]
- `[ 24.07s]` SFX ♪ inst_kick
- `[ 24.67s]` VIBRATE [8]
- `[ 27.30s]` **GESTURE** tap @(195,630)
- `[ 27.30s]` VIBRATE [20]
- `[ 27.30s]` SFX ♪ inst_kick
- `[ 27.30s]` SFX ♪ dm_accent
- `[ 28.08s]` VOICE ▶ tut_z_sides (dur 5.2s)
- `[ 28.08s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 33.29s]` VOICE ■ tut_z_sides (kill)
- `[ 33.29s]` VERDICT tut_z_sides: **OK** sim=0.8824
- 期望: 左下是军鼓,右下是低嗵。一左一右,跟着打。
- 听到: 左下是军鼓,右下是敌通,一左一右跟着打。
- `[ 34.73s]` SFX ♪ dm_accent
- `[ 35.32s]` VIBRATE [8]
- `[ 35.41s]` SFX ♪ dm_accent
- `[ 35.99s]` VIBRATE [8]
- `[ 36.05s]` SFX ♪ dm_accent
- `[ 36.65s]` VIBRATE [8]
- `[ 36.73s]` SFX ♪ dm_accent
- `[ 37.32s]` VIBRATE [8]
- `[ 37.41s]` SFX ♪ dm_snare
- `[ 38.00s]` VIBRATE [8]
- `[ 38.73s]` SFX ♪ dm_tomlo
- `[ 39.33s]` VIBRATE [8]
- `[ 40.64s]` **GESTURE** tap @(65,630)
- `[ 40.64s]` VIBRATE [20]
- `[ 40.64s]` SFX ♪ dm_snare
- `[ 40.64s]` SFX ♪ dm_accent
- `[ 41.96s]` **GESTURE** tap @(325,630)
- `[ 41.96s]` VIBRATE [20]
- `[ 41.96s]` SFX ♪ dm_tomlo
- `[ 41.96s]` SFX ♪ dm_accent
- `[ 42.79s]` VOICE ▶ tut_z_patt (dur 9.68s)
- `[ 42.79s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 52.56s]` VOICE ■ tut_z_patt (kill)
- `[ 52.56s]` VERDICT tut_z_patt: **OK** sim=0.7692
- 期望: 上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。
- 听到: 上面一白更清亮,左上采茶,上中高通,右上调查,听这一句三个音。
- `[ 53.41s]` SFX ♪ dm_accent
- `[ 53.99s]` VIBRATE [8]
- `[ 54.05s]` SFX ♪ dm_accent
- `[ 54.65s]` VIBRATE [8]
- `[ 54.73s]` SFX ♪ dm_accent
- `[ 55.32s]` VIBRATE [8]
- `[ 55.41s]` SFX ♪ dm_accent
- `[ 55.99s]` VIBRATE [8]
- `[ 56.09s]` SFX ♪ dm_hat
- `[ 56.66s]` VIBRATE [8]
- `[ 56.73s]` SFX ♪ dm_tomhi
- `[ 57.32s]` VIBRATE [8]
- `[ 57.41s]` SFX ♪ dm_crash
- `[ 57.99s]` VIBRATE [8]
- `[ 59.28s]` **GESTURE** tap @(65,210)
- `[ 59.28s]` VIBRATE [20]
- `[ 59.28s]` SFX ♪ dm_hat
- `[ 59.28s]` SFX ♪ dm_accent
- `[ 59.94s]` **GESTURE** tap @(195,210)
- `[ 59.94s]` VIBRATE [20]
- `[ 59.94s]` SFX ♪ dm_tomhi
- `[ 59.94s]` SFX ♪ dm_accent
- `[ 60.68s]` **GESTURE** tap @(325,210)
- `[ 60.68s]` VIBRATE [20]
- `[ 60.68s]` SFX ♪ dm_crash
- `[ 60.68s]` SFX ♪ dm_accent
- `[ 61.41s]` VOICE ▶ tut_done (dur 2.48s)
- `[ 61.41s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 64.13s]` VOICE ■ tut_done (kill)
- `[ 64.13s]` VERDICT tut_done: **OK** sim=1
- 期望: 很好,演出开始。
- 听到: 很好,演出开始。
- `[ 64.13s]` BGM ♪ track90 (loop)
- `[ 64.57s]` SFX ♪ inst_kick
- `[ 65.13s]` VIBRATE [8]
- `[ 65.21s]` SFX ♪ inst_kick
- `[ 65.81s]` VIBRATE [8]
- `[ 65.89s]` SFX ♪ inst_kick
- `[ 66.46s]` VIBRATE [8]
- `[ 66.57s]` SFX ♪ inst_kick
- `[ 67.13s]` VIBRATE [8]
- `[ 67.21s]` SFX ♪ inst_kick
- `[ 67.79s]` VIBRATE [8]
- `[ 67.80s]` **GESTURE** tap @(195,630)
- `[ 67.80s]` VIBRATE [20]
- `[ 67.81s]` SFX ♪ inst_kick
- `[ 67.81s]` VOICE ▶ gd_answer (dur 1.52s)
- `[ 67.81s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 68.47s]` **GESTURE** tap @(195,630)
- `[ 68.47s]` VIBRATE [20]
- `[ 68.47s]` SFX ♪ inst_kick
- `[ 68.57s]` SFX ♪ inst_kick
- `[ 69.13s]` VIBRATE [8]
- `[ 69.42s]` VOICE ■ gd_answer (kill)
- `[ 69.42s]` VERDICT gd_answer: **OK** sim=1
- 期望: 现在跟着我打。
- 听到: 现在跟着我打。
- `[ 70.93s]` VIBRATE [60,40,60]
- `[ 70.93s]` SFX ♪ dm_hat
- `[ 71.78s]` **GESTURE** tap @(195,630)
- `[ 71.78s]` VIBRATE [20]
- `[ 71.78s]` SFX ♪ inst_kick
- `[ 71.78s]` SFX ♪ dm_accent
- `[ 75.21s]` SFX ♪ dm_snare
- `[ 75.80s]` VIBRATE [8]
- `[ 76.57s]` SFX ♪ dm_tomlo
- `[ 77.12s]` VIBRATE [8]
- `[ 78.47s]` **GESTURE** tap @(65,630)
- `[ 78.47s]` VIBRATE [20]
- `[ 78.47s]` SFX ♪ dm_snare
- `[ 78.47s]` SFX ♪ dm_accent
- `[ 79.80s]` **GESTURE** tap @(325,630)
- `[ 79.80s]` VIBRATE [20]
- `[ 79.80s]` VIBRATE [20,40,20]
- `[ 79.80s]` SFX ♪ dm_tomlo
- `[ 79.80s]` SFX ♪ dm_accent
- `[ 83.21s]` SFX ♪ inst_kick
- `[ 83.79s]` VIBRATE [8]
- `[ 83.89s]` SFX ♪ inst_kick
- `[ 84.46s]` VIBRATE [8]
- `[ 84.53s]` SFX ♪ dm_snare
- `[ 85.13s]` VIBRATE [8]
- `[ 86.42s]` **GESTURE** tap @(195,630)
- `[ 86.42s]` VIBRATE [20]
- `[ 86.42s]` SFX ♪ inst_kick
- `[ 86.42s]` SFX ♪ dm_accent
- `[ 87.08s]` **GESTURE** tap @(195,630)
- `[ 87.08s]` VIBRATE [20]
- `[ 87.08s]` SFX ♪ inst_kick
- `[ 87.08s]` SFX ♪ dm_accent
- `[ 87.74s]` **GESTURE** tap @(65,630)
- `[ 87.74s]` VIBRATE [20]
- `[ 87.74s]` VIBRATE [20,40,20]
- `[ 87.74s]` SFX ♪ dm_snare
- `[ 87.74s]` SFX ♪ dm_accent
- `[ 91.21s]` SFX ♪ dm_snare
- `[ 91.80s]` VIBRATE [8]
- `[ 91.89s]` SFX ♪ dm_tomlo
- `[ 92.46s]` VIBRATE [8]
- `[ 92.57s]` SFX ♪ inst_kick
- `[ 93.12s]` VIBRATE [8]
- `[ 94.44s]` **GESTURE** tap @(65,630)
- `[ 94.44s]` VIBRATE [20]
- `[ 94.44s]` SFX ♪ dm_snare
- `[ 94.44s]` SFX ♪ dm_accent
- `[ 95.10s]` **GESTURE** tap @(325,630)
- `[ 95.10s]` VIBRATE [20]
- `[ 95.10s]` SFX ♪ dm_tomlo
- `[ 95.10s]` SFX ♪ dm_accent
- `[ 95.76s]` **GESTURE** tap @(195,630)
- `[ 95.76s]` VIBRATE [20]
- `[ 95.76s]` VIBRATE [20,40,20]
- `[ 95.76s]` SFX ♪ inst_kick
- `[ 95.76s]` SFX ♪ dm_accent
- `[ 99.21s]` SFX ♪ inst_kick
- `[ 99.79s]` VIBRATE [8]
- `[ 99.81s]` VOICE ▶ mid_song (dur 2.32s)
- `[ 99.81s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 99.89s]` SFX ♪ dm_snare
- `[ 100.46s]` VIBRATE [8]
- `[ 100.53s]` SFX ♪ inst_kick
- `[ 101.12s]` VIBRATE [8]
- `[ 101.21s]` SFX ♪ dm_tomlo
- `[ 101.79s]` VIBRATE [8]
- `[ 102.16s]` VOICE ■ mid_song (kill)
- `[ 102.16s]` VERDICT mid_song: **OK** sim=0.8
- 期望: 过半了,保持。
- 听到: 过磅了,保持。
- `[ 102.46s]` **GESTURE** tap @(195,630)
- `[ 102.46s]` VIBRATE [20]
- `[ 102.46s]` SFX ♪ inst_kick
- `[ 102.46s]` SFX ♪ dm_accent
- `[ 103.12s]` **GESTURE** tap @(65,630)
- `[ 103.12s]` VIBRATE [20]
- `[ 103.12s]` SFX ♪ dm_snare
- `[ 103.12s]` SFX ♪ dm_accent
- `[ 103.78s]` **GESTURE** tap @(195,630)
- `[ 103.78s]` VIBRATE [20]
- `[ 103.78s]` SFX ♪ inst_kick
- `[ 103.78s]` SFX ♪ dm_accent
- `[ 104.44s]` **GESTURE** tap @(325,630)
- `[ 104.45s]` VIBRATE [20]
- `[ 104.45s]` VIBRATE [20,40,20]
- `[ 104.45s]` SFX ♪ dm_tomlo
- `[ 104.45s]` SFX ♪ dm_accent
- `[ 104.53s]` SFX ♪ dm_hat
- `[ 105.13s]` VIBRATE [8]
- `[ 105.89s]` SFX ♪ dm_snare
- `[ 106.47s]` VIBRATE [8]
- `[ 106.57s]` SFX ♪ inst_kick
- `[ 107.12s]` VIBRATE [8]
- `[ 107.76s]` **GESTURE** tap @(65,210)
- `[ 107.76s]` VIBRATE [20]
- `[ 107.76s]` SFX ♪ dm_hat
- `[ 107.76s]` SFX ♪ dm_accent
- `[ 109.08s]` **GESTURE** tap @(65,630)
- `[ 109.08s]` VIBRATE [20]
- `[ 109.08s]` SFX ♪ dm_snare
- `[ 109.08s]` SFX ♪ dm_accent
- `[ 109.74s]` **GESTURE** tap @(195,630)
- `[ 109.75s]` VIBRATE [20]
- `[ 109.75s]` VIBRATE [100]
- `[ 109.75s]` VIBRATE [20,40,20]
- `[ 109.75s]` SFX ♪ inst_kick
- `[ 109.75s]` SFX ♪ dm_accent
- `[ 109.89s]` SFX ♪ inst_kick
- `[ 110.45s]` VIBRATE [8]
- `[ 110.57s]` SFX ♪ dm_hat
- `[ 111.13s]` VIBRATE [8]
- `[ 111.21s]` SFX ♪ inst_kick
- `[ 111.78s]` VIBRATE [8]
- `[ 111.89s]` SFX ♪ dm_crash
- `[ 112.46s]` VIBRATE [8]
- `[ 113.14s]` **GESTURE** tap @(195,630)
- `[ 113.14s]` VIBRATE [20]
- `[ 113.14s]` SFX ♪ inst_kick
- `[ 113.14s]` SFX ♪ dm_accent
- `[ 113.81s]` **GESTURE** tap @(65,210)
- `[ 113.81s]` VIBRATE [20]
- `[ 113.81s]` SFX ♪ dm_hat
- `[ 113.81s]` SFX ♪ dm_accent
- `[ 114.47s]` **GESTURE** tap @(195,630)
- `[ 114.47s]` VIBRATE [20]
- `[ 114.47s]` SFX ♪ inst_kick
- `[ 114.47s]` SFX ♪ dm_accent
- `[ 115.13s]` **GESTURE** tap @(325,210)
- `[ 115.13s]` VIBRATE [20]
- `[ 115.13s]` VIBRATE [20,40,20]
- `[ 115.13s]` SFX ♪ dm_crash
- `[ 115.13s]` SFX ♪ dm_accent
- `[ 115.21s]` SFX ♪ dm_snare
- `[ 115.79s]` VIBRATE [8]
- `[ 115.89s]` SFX ♪ dm_tomlo
- `[ 116.47s]` VIBRATE [8]
- `[ 116.53s]` SFX ♪ dm_hat
- `[ 117.12s]` VIBRATE [8]
- `[ 117.21s]` SFX ♪ inst_kick
- `[ 117.79s]` VIBRATE [8]
- `[ 118.45s]` **GESTURE** tap @(65,630)
- `[ 118.45s]` VIBRATE [20]
- `[ 118.45s]` SFX ♪ dm_snare
- `[ 118.45s]` SFX ♪ dm_accent
- `[ 118.50s]` VOICE ▶ tut_fill (dur 3.12s)
- `[ 118.50s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 119.11s]` **GESTURE** tap @(325,630)
- `[ 119.11s]` VIBRATE [20]
- `[ 119.11s]` SFX ♪ dm_tomlo
- `[ 119.11s]` SFX ♪ dm_accent
- `[ 119.77s]` **GESTURE** tap @(65,210)
- `[ 119.77s]` VIBRATE [20]
- `[ 119.77s]` SFX ♪ dm_hat
- `[ 119.77s]` SFX ♪ dm_accent
- `[ 120.43s]` **GESTURE** tap @(195,630)
- `[ 120.43s]` VIBRATE [20]
- `[ 120.43s]` VIBRATE [20,40,20]
- `[ 120.43s]` SFX ♪ inst_kick
- `[ 120.43s]` SFX ♪ dm_accent
- `[ 120.53s]` SFX ♪ inst_kick
- `[ 120.89s]` SFX ♪ inst_kick
- `[ 121.13s]` VIBRATE [8]
- `[ 121.21s]` SFX ♪ inst_kick
- `[ 121.45s]` VIBRATE [8]
- `[ 121.57s]` SFX ♪ dm_snare
- `[ 121.80s]` VIBRATE [8]
- `[ 121.89s]` SFX ♪ dm_snare
- `[ 121.94s]` VOICE ■ tut_fill (kill)
- `[ 121.94s]` VERDICT tut_fill: **OK** sim=0.9167
- 期望: 最后有一段加花,跟着我连打。
- 听到: 最后有一段佳花跟着我连打。
- `[ 122.12s]` VIBRATE [8]
- `[ 122.21s]` SFX ♪ inst_kick
- `[ 122.45s]` VIBRATE [8]
- `[ 122.57s]` SFX ♪ dm_crash
- `[ 122.80s]` VIBRATE [8]
- `[ 123.12s]` VIBRATE [8]
- `[ 123.75s]` **GESTURE** tap @(195,630)
- `[ 123.75s]` VIBRATE [20]
- `[ 123.75s]` SFX ♪ inst_kick
- `[ 123.75s]` SFX ♪ dm_accent
- `[ 124.21s]` **GESTURE** tap @(195,630)
- `[ 124.21s]` VIBRATE [20]
- `[ 124.21s]` SFX ♪ inst_kick
- `[ 124.21s]` SFX ♪ dm_accent
- `[ 124.67s]` **GESTURE** tap @(195,630)
- `[ 124.68s]` VIBRATE [20]
- `[ 124.68s]` SFX ♪ inst_kick
- `[ 125.14s]` **GESTURE** tap @(65,630)
- `[ 125.14s]` VIBRATE [20]
- `[ 125.14s]` SFX ♪ dm_snare
- `[ 125.14s]` SFX ♪ dm_accent
- `[ 125.29s]` VIBRATE [60,40,60]
- `[ 125.29s]` SFX ♪ dm_hat
- `[ 125.60s]` **GESTURE** tap @(65,630)
- `[ 125.60s]` VIBRATE [20]
- `[ 125.60s]` VIBRATE [60,40,60]
- `[ 125.60s]` SFX ♪ dm_snare
- `[ 125.60s]` SFX ♪ dm_hat
- `[ 126.07s]` **GESTURE** tap @(195,630)
- `[ 126.07s]` VIBRATE [20]
- `[ 126.07s]` SFX ♪ inst_kick
- `[ 126.29s]` VIBRATE [60,40,60]
- `[ 126.29s]` SFX ♪ dm_hat
- `[ 126.53s]` **GESTURE** tap @(325,210)
- `[ 126.53s]` VIBRATE [20]
- `[ 126.53s]` SFX ♪ dm_crash
- `[ 126.77s]` VIBRATE [100]
- `[ 126.77s]` VIBRATE [100]
- `[ 126.77s]` VIBRATE [20,40,20]
- `[ 126.78s]` VOICE ▶ grade_a (dur 4.4s)
- `[ 126.78s]` VERDICT (无语音区间): **SFX_BGM_ONLY**
- `[ 131.34s]` VOICE ■ grade_a (kill)
- `[ 131.34s]` VERDICT grade_a: **OK** sim=0.6429
- 期望: A 级!准确率超过八成五,非常出色。
- 听到: 第G准确率超过8乘5,非常出色。
- `[ 131.35s]` VOICE ▶ new_best_combo (dur 1.84s)
- `[ 133.22s]` VOICE ■ new_best_combo (kill)
- `[ 133.22s]` VERDICT new_best_combo: **MISMATCH** sim=0.4
- 期望: 新连击纪录!
- 听到: 新联机记录。
- `[ 133.23s]` VOICE ▶ unlock_song2 (dur 2.48s)
- `[ 135.94s]` VOICE ■ unlock_song2 (kill)
- `[ 135.94s]` VERDICT unlock_song2: **OK** sim=0.9333
- 期望: 新曲目解锁,追风!
- 听到: 录新曲目解锁追风。
- `[ 135.95s]` VOICE ▶ restart (dur 4.08s)
- `[ 140.05s]` VOICE ■ restart (kill)
- `[ 140.05s]` VERDICT restart: **OK** sim=0.75
- 期望: 单击再来一遍,右滑下一首,下滑回大厅。
- 听到: 但气再来一遍,又滑下一手下滑回大厅。
- `[ 140.05s]` BGM ♪ menu (loop)
@@ -0,0 +1,451 @@
{
"game": "rhythm",
"settings": {
"voice": "male",
"guide": "full",
"speed": 1,
"bgm": 1
},
"outdir": "/home/xsl/AutoVideo/SoundGame/web/harness/live/out/rhythm-20260914102057",
"segs": [
{
"idx": 0,
"voiceId": "welcome",
"t0": 0.066,
"t1": 1.71,
"dur": 8.24,
"expEnd": 8.306,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "欢迎来到。",
"similarity": 0.2667
},
{
"idx": 1,
"voiceId": "tut_map",
"t0": 1.71,
"t1": 3.078,
"dur": 18.04,
"expEnd": 19.75,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "写写认。",
"similarity": 0.0377
},
{
"idx": 2,
"voiceId": "tut_probe",
"t0": 3.078,
"t1": 4.446,
"dur": 3.84,
"expEnd": 6.918,
"truncated": true,
"reason": "kill",
"verdict": "TRUNCATED",
"heard": "嗯,摸到三个布。",
"similarity": 0.4
},
{
"idx": 3,
"voiceId": "zone_tl",
"t0": 5.319,
"t1": 6.919,
"dur": 1.6,
"expEnd": 6.919,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "左上踩草。",
"similarity": 0.75
},
{
"idx": 4,
"voiceId": "zone_tr",
"t0": 7.992,
"t1": 9.867,
"dur": 1.76,
"expEnd": 9.752,
"truncated": false,
"reason": "kill",
"verdict": "MISMATCH",
"heard": "有上调查。",
"similarity": 0.25
},
{
"idx": 5,
"voiceId": "zone_bl",
"t0": 10.66,
"t1": 13.002,
"dur": 2,
"expEnd": 12.66,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "左下军鼓。",
"similarity": 1
},
{
"idx": 6,
"voiceId": "tut_z_kick",
"t0": 13.011,
"t1": 20.548,
"dur": 7.28,
"expEnd": 20.291,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "下面正中间是题鼓,你的家先听四下数拍,然后跟着我敲。",
"similarity": 0.9565
},
{
"idx": 7,
"voiceId": "tut_z_sides",
"t0": 28.077,
"t1": 33.294,
"dur": 5.2,
"expEnd": 33.277,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "左下是军鼓,右下是敌通,一左一右跟着打。",
"similarity": 0.8824
},
{
"idx": 8,
"voiceId": "tut_z_patt",
"t0": 42.786,
"t1": 52.565,
"dur": 9.68,
"expEnd": 52.466,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "上面一白更清亮,左上采茶,上中高通,右上调查,听这一句三个音。",
"similarity": 0.7692
},
{
"idx": 9,
"voiceId": "tut_done",
"t0": 61.412,
"t1": 64.128,
"dur": 2.48,
"expEnd": 63.892,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "很好,演出开始。",
"similarity": 1
},
{
"idx": 10,
"voiceId": "gd_answer",
"t0": 67.814,
"t1": 69.422,
"dur": 1.52,
"expEnd": 69.334,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "现在跟着我打。",
"similarity": 1
},
{
"idx": 11,
"voiceId": "mid_song",
"t0": 99.81,
"t1": 102.159,
"dur": 2.32,
"expEnd": 102.13,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "过磅了,保持。",
"similarity": 0.8
},
{
"idx": 12,
"voiceId": "tut_fill",
"t0": 118.496,
"t1": 121.941,
"dur": 3.12,
"expEnd": 121.616,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "最后有一段佳花跟着我连打。",
"similarity": 0.9167
},
{
"idx": 13,
"voiceId": "grade_a",
"t0": 126.778,
"t1": 131.344,
"dur": 4.4,
"expEnd": 131.178,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "第G准确率超过8乘5,非常出色。",
"similarity": 0.6429
},
{
"idx": 14,
"voiceId": "new_best_combo",
"t0": 131.349,
"t1": 133.224,
"dur": 1.84,
"expEnd": 133.189,
"truncated": false,
"reason": "kill",
"verdict": "MISMATCH",
"heard": "新联机记录。",
"similarity": 0.4
},
{
"idx": 15,
"voiceId": "unlock_song2",
"t0": 133.23,
"t1": 135.941,
"dur": 2.48,
"expEnd": 135.71,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "录新曲目解锁追风。",
"similarity": 0.9333
},
{
"idx": 16,
"voiceId": "restart",
"t0": 135.948,
"t1": 140.05,
"dur": 4.08,
"expEnd": 140.028,
"truncated": false,
"reason": "kill",
"verdict": "OK",
"heard": "但气再来一遍,又滑下一手下滑回大厅。",
"similarity": 0.75
}
],
"rows": [
{
"t0": 0.066,
"t1": 1.71,
"voiceId": "welcome",
"expected": "欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。",
"heard": "欢迎来到。",
"similarity": 0.2667,
"verdict": "TRUNCATED"
},
{
"t0": 1.71,
"t1": 3.078,
"voiceId": "tut_map",
"expected": "先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。",
"heard": "写写认。",
"similarity": 0.0377,
"verdict": "TRUNCATED"
},
{
"t0": 3.078,
"t1": 4.446,
"voiceId": "tut_probe",
"expected": "摸到三个不同的地方,我们就开始。",
"heard": "嗯,摸到三个布。",
"similarity": 0.4,
"verdict": "TRUNCATED"
},
{
"t0": 5.319,
"t1": 6.919,
"voiceId": "zone_tl",
"expected": "左上,踩镲。",
"heard": "左上踩草。",
"similarity": 0.75,
"verdict": "OK"
},
{
"t0": 7.992,
"t1": 9.867,
"voiceId": "zone_tr",
"expected": "右上,吊镲。",
"heard": "有上调查。",
"similarity": 0.25,
"verdict": "MISMATCH"
},
{
"t0": 10.66,
"t1": 13.002,
"voiceId": "zone_bl",
"expected": "左下,军鼓。",
"heard": "左下军鼓。",
"similarity": 1,
"verdict": "OK"
},
{
"t0": 13.011,
"t1": 20.548,
"voiceId": "tut_z_kick",
"expected": "下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。",
"heard": "下面正中间是题鼓,你的家先听四下数拍,然后跟着我敲。",
"similarity": 0.9565,
"verdict": "OK"
},
{
"t0": 28.077,
"t1": 33.294,
"voiceId": "tut_z_sides",
"expected": "左下是军鼓,右下是低嗵。一左一右,跟着打。",
"heard": "左下是军鼓,右下是敌通,一左一右跟着打。",
"similarity": 0.8824,
"verdict": "OK"
},
{
"t0": 42.786,
"t1": 52.565,
"voiceId": "tut_z_patt",
"expected": "上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。",
"heard": "上面一白更清亮,左上采茶,上中高通,右上调查,听这一句三个音。",
"similarity": 0.7692,
"verdict": "OK"
},
{
"t0": 61.412,
"t1": 64.128,
"voiceId": "tut_done",
"expected": "很好,演出开始。",
"heard": "很好,演出开始。",
"similarity": 1,
"verdict": "OK"
},
{
"t0": 67.814,
"t1": 69.422,
"voiceId": "gd_answer",
"expected": "现在跟着我打。",
"heard": "现在跟着我打。",
"similarity": 1,
"verdict": "OK"
},
{
"t0": 99.81,
"t1": 102.159,
"voiceId": "mid_song",
"expected": "过半了,保持。",
"heard": "过磅了,保持。",
"similarity": 0.8,
"verdict": "OK"
},
{
"t0": 118.496,
"t1": 121.941,
"voiceId": "tut_fill",
"expected": "最后有一段加花,跟着我连打。",
"heard": "最后有一段佳花跟着我连打。",
"similarity": 0.9167,
"verdict": "OK"
},
{
"t0": 126.778,
"t1": 131.344,
"voiceId": "grade_a",
"expected": "A 级!准确率超过八成五,非常出色。",
"heard": "第G准确率超过8乘5,非常出色。",
"similarity": 0.6429,
"verdict": "OK"
},
{
"t0": 131.349,
"t1": 133.224,
"voiceId": "new_best_combo",
"expected": "新连击纪录!",
"heard": "新联机记录。",
"similarity": 0.4,
"verdict": "MISMATCH"
},
{
"t0": 133.23,
"t1": 135.941,
"voiceId": "unlock_song2",
"expected": "新曲目解锁,追风!",
"heard": "录新曲目解锁追风。",
"similarity": 0.9333,
"verdict": "OK"
},
{
"t0": 135.948,
"t1": 140.05,
"voiceId": "restart",
"expected": "单击再来一遍,右滑下一首,下滑回大厅。",
"heard": "但气再来一遍,又滑下一手下滑回大厅。",
"similarity": 0.75,
"verdict": "OK"
},
{
"t0": 20.548,
"t1": 28.077,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 33.294,
"t1": 42.786,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 52.565,
"t1": 61.412,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 64.128,
"t1": 67.814,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 69.422,
"t1": 99.81,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 102.159,
"t1": 118.496,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
},
{
"t0": 121.941,
"t1": 126.778,
"voiceId": null,
"expected": null,
"heard": "",
"similarity": null,
"verdict": "SFX_BGM_ONLY"
}
]
}
@@ -0,0 +1,52 @@
# 《节拍行者》鼓手模式 R2 人设评审(复评,基于 R2 live 实录 + 修复说明)
## P1 视障资深玩家(专业评委)
### 节拍行者(鼓手模式)
- 状态感知:5/5 —— R1 提的两个扣分项都修实了:连摸区名完整播完(live 实录 zone_bl 播足 2.34s 自然收束),曲尾不再飘半句向导话,结算干净利落。「还差一个」的进度提示未加,但教学句「摸到三个不同的地方,我们就开始」本身可数,可接受。
- 下一步明确性:5/5 —— 应答零语音、结算三选项、摸鼓可数,无迷失时刻。
- 愿意继续玩:**是** —— 修复后的信息流称得上「干净」:该说的说完整,不该说的不抢拍。
- P0 问题:无。
- 建议:无新增(R1 三条建议全部落地或裁定不改)。
## P2 时间充裕的大学生
### 节拍行者(鼓手模式)
- 状态感知:5/5 —— 教学失败不再「再听一遍」二连播(F3),纠正一句话说完就重新领奏,节奏感好多了。
- 下一步明确性:5/5 —— 同 R1。
- 愿意继续玩:**是** —— A 级解锁《追风》的钩子已验证有效(两连真机都是 A 级弧线)。
- P0 问题:无。
- 建议:维持 R1 裁定(unlock 文案不改)。
## P3 时间紧张的白领
### 节拍行者(鼓手模式)
- 状态感知:5/5 —— 菜单中断恢复、单手盲操、单局 65-80s,R2 无变化无回退。
- 下一步明确性:5/5 —— 同 R1。
- 愿意继续玩:**是**。
- P0 问题:无。
- 建议:无新增。
## P4 疲惫的工人
### 节拍行者(鼓手模式)
- 状态感知:5/5 —— 降速重演、零数落文案、放慢再教,R2 保持。
- 下一步明确性:5/5 —— 同 R1。
- 愿意继续玩:**是**。
- P0 问题:无。
- 建议:无新增。
---
### 专门问题复答
**分区心智模型**:R2 live 直证——区名播报机制完整可用(F2 修复后三连摸
全报名),真机 33/37 Perfect 说明「听音色+声像找区」的映射稳定可掌握。
**合拍感**:dt≈0.00s 真机复现(R2 与 R1 演奏精度一致),Perfect 亮音叠加
与 16 连击震动保持。
**旧作亮点保留**:全部在(跟随领奏/评级解锁/BPM 精确网格/不中断/旁白跳过/
菜单断点续播),无一项回退。
**裁决:4/4 愿意继续玩,P0 = 0 —— R2 达标(连续第 2 轮,终止条件达成)。**
@@ -0,0 +1,40 @@
# 《节拍行者》鼓手模式 R2 synthesis(产品裁定)
## 输入
- R2 live 复跑(`live-player.md`:OK 12/TRUNCATED 3/MISMATCH 2;F1-F3 全部
真机直证;33 Perfect / 4 Miss;A 级+解锁全弧线)
- 人设复评:4/4 愿意继续玩,五项感知指标全部 5/5(P1 由 4/5 升 5/5),P0 = 0
## 裁定:4/4 愿意继续玩,P0 = 0 —— **R2 达标,连续第 2 轮达标,终止条件达成(≤R3 上限内)**
## P0 清单
无(连续第 2 轮为零)。
## P1 清单
无新增。R1 三项修复验收:
1. **F1 曲尾 gd_miss 守卫** ✅ mock 断言 A24 + live 直证(曲尾 4 Miss 零
向导语音调度,结算链无截断)。
2. **F2 探针区名防掐断** ✅ mock 断言 A25 + live 直证(zone_bl 播足 2.34s
自然收束,教学句 queue 接续)。实现要点:进阶延迟 150ms 起步——引擎
_playVoice 的入队判定在 await 加载完成之前,同步连发会让教学句误判
「通道空闲」顶掉区名。
3. **F3 纠正链去重** ✅ mock 断言 A23 + live 教学段语音序列无相邻复读。
## F 类修复复核结论
- playtest 129 → **134**(新增 A23/A24/A25 三条回归断言,既有零回改)
- guide.test 122 / check_all_assets 全绿 / 15 游戏 playtest + engine-voice +
engine-input 全量回归绿
- 资产零新增(修复全部代码层)
## 交付结论
《节拍行者》鼓手模式重构**可交付**:屏幕分区(3列×2行六件打击乐)心智模型
经教学与真机验证可建立;跟随领奏核心、S~C 评级、曲目解锁、BPM 精确性等
旧作好评基因全部保留;两轮玩家迭代(4 人设 ×2 + live 两会话 ×2)零 P0、
连续达标。遗留观察项(非阻塞):短句 ASR 同音误识属转写基础设施固有噪声;
unlock 播报燃度按 R1 裁定维持。
+205
View File
@@ -0,0 +1,205 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""《节拍行者》鼓手模式程序合成打击乐(24-rhythm-drummer.md §9.1,7 件 SYN)。
六区鼓组 + Perfect accent:kick/snare/hat/tomhi/crash/tomlo/accent。
落盘:staging wav → tools/gen_rhythm_syn_wav/<id>.wav(44.1kHz 立体声);
成品 → web/rhythm/audio/sfx/<id>.{ogg,m4a}(tools/bin/ffmpeg 双格式)。
QC(gen_cipher_syn.py 同款):去直流 + 首尾 8ms cos² 淡化 + 编码后解码回读
真峰值 ≤ -3dBFS(MDCT 过冲坑:ebur128 peak=true 实测,超限自动降档重编)。
打击乐起音必须硬(盲玩靠起音对拍);包络用 (1-exp(-t*k)) 快起沿。
用法:.venv-tts/bin/python tools/gen_rhythm_syn.py
"""
import os
import subprocess
import sys
import numpy as np
import soundfile as sf
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FFMPEG = os.path.join(ROOT, "tools", "bin", "ffmpeg")
OUT = os.path.join(ROOT, "tools", "gen_rhythm_syn_wav")
DST = os.path.join(ROOT, "web", "rhythm", "audio", "sfx")
os.makedirs(OUT, exist_ok=True)
os.makedirs(DST, exist_ok=True)
sr = 44100
ONE_SHOT_TP_CEIL = -3.0 # dBFS
SAMPLE_PEAK = 0.66 # ≈ -3.6dBFS,给 MDCT 过冲留余量
FADE_N = int(sr * 0.008)
_rng = np.random.default_rng(20260914)
def dc(y):
return y - np.mean(y)
def fade(y):
w = np.sin(np.linspace(0, np.pi / 2, FADE_N)) ** 2
y = y.copy()
y[:FADE_N] *= w
y[-FADE_N:] *= w[::-1]
return y
def norm(y, peak=SAMPLE_PEAK):
m = np.max(np.abs(y))
return (y / m * peak) if m > 0 else y
def stereo(y):
return np.stack([y, y], axis=1).astype(np.float32)
def bp_noise(n, lo, hi):
x = _rng.standard_normal(n)
X = np.fft.rfft(x)
freqs = np.fft.rfftfreq(n, 1 / sr)
mask = ((freqs >= lo) & (freqs <= hi)).astype(float)
y = np.fft.irfft(X * mask, n)
return y / (np.max(np.abs(y)) + 1e-9)
def sweep(n, f0, f1, dec):
"""指数扫频正弦(鼓皮),dec = 幅度衰减系数(1/s)。"""
t = np.arange(n) / sr
k = np.log(f1 / f0) / (n / sr)
ph = 2 * np.pi * f0 * (np.exp(k * t) - 1) / k
return np.sin(ph) * np.exp(-t * dec)
# ---------------------------------------------------------------- 鼓件渲染
def r_kick(): # 底鼓 BC:130→45Hz 扫频 + 触击瞬态(起沿 <3ms);id 沿用 inst_kick
n = int(sr * 0.28)
t = np.arange(n) / sr
y = sweep(n, 130, 45, 16) * 1.0
click = bp_noise(n, 1500, 6000) * np.exp(-t * 220) * 0.5 # 槌击瞬态
th = np.sin(2 * np.pi * 60 * t) * np.exp(-t * 22) * 0.35 # 低频胸口感
return dc((y + click + th) * (1 - np.exp(-t * 900)))
def r_snare(): # 军鼓 BL:200Hz 皮 + 1-4kHz 带通沙噪 + 钢丝噪
n = int(sr * 0.22)
t = np.arange(n) / sr
head = np.sin(2 * np.pi * 196 * t) * np.exp(-t * 38) * 0.8
wires = bp_noise(n, 3000, 7000) * np.exp(-t * 55) * 0.55
body = bp_noise(n, 800, 3000) * np.exp(-t * 30) * 0.7
return dc((head + wires + body) * (1 - np.exp(-t * 1200)))
def r_hat(): # 闭合踩镲 TL:6-10kHz 高通金属噪,60ms 急收
n = int(sr * 0.07)
t = np.arange(n) / sr
y = bp_noise(n, 6000, 12000) * np.exp(-t * 90)
y += bp_noise(n, 9000, 14000) * np.exp(-t * 140) * 0.6
metallic = (np.sin(2 * np.pi * 11200 * t) * 0.25
+ np.sin(2 * np.pi * 8350 * t) * 0.18) * np.exp(-t * 110)
return dc((y + metallic) * (1 - np.exp(-t * 2500)))
def r_tomhi(): # 高音嗵 TC:200→140Hz 皮,短促圆头
n = int(sr * 0.30)
t = np.arange(n) / sr
y = sweep(n, 205, 140, 14) * 0.95
skin = bp_noise(n, 300, 1400) * np.exp(-t * 40) * 0.3
return dc((y + skin) * (1 - np.exp(-t * 700)))
def r_crash(): # 吊镲 TR:4-12kHz 噪 + 非谐波泛音列,1.2s 长尾
n = int(sr * 1.30)
t = np.arange(n) / sr
y = bp_noise(n, 4000, 13000) * np.exp(-t * 5.5) * 0.8
for f, g in [(6120, 0.30), (8130, 0.22), (10460, 0.15), (4620, 0.20)]:
y += np.sin(2 * np.pi * f * t) * np.exp(-t * 4.2) * g
y += bp_noise(n, 2000, 5000) * np.exp(-t * 9) * 0.35
return dc(y * (1 - np.exp(-t * 1800)))
def r_tomlo(): # 低音嗵 BR:120→75Hz 皮,共鸣更久
n = int(sr * 0.35)
t = np.arange(n) / sr
y = sweep(n, 122, 75, 10) * 0.95
skin = bp_noise(n, 200, 900) * np.exp(-t * 30) * 0.3
return dc((y + skin) * (1 - np.exp(-t * 550)))
def r_accent(): # Perfect 叠加亮音:木鱼 1.5kHz + 2.2kHz 短双音
a = np.sin(2 * np.pi * 1500 * np.arange(int(sr * 0.05)) / sr) \
* np.exp(-np.arange(int(sr * 0.05)) / sr * 90)
b = np.sin(2 * np.pi * 2200 * np.arange(int(sr * 0.08)) / sr) \
* np.exp(-np.arange(int(sr * 0.08)) / sr * 60) * 0.7
return dc(np.concatenate([a, np.zeros(int(sr * 0.015)), b, np.zeros(int(sr * 0.03))]))
ONE_SHOTS = {
"inst_kick": r_kick,
"dm_snare": r_snare,
"dm_hat": r_hat,
"dm_tomhi": r_tomhi,
"dm_crash": r_crash,
"dm_tomlo": r_tomlo,
"dm_accent": r_accent,
}
# ---------------------------------------------------------------- 编码 + 真峰值校验
def encode(wav_path, base):
for args, ext in [(["-c:a", "libvorbis", "-q:a", "3"], ".ogg"),
(["-c:a", "aac", "-b:a", "128k"], ".m4a")]:
subprocess.run([FFMPEG, "-y", "-v", "error", "-i", wav_path,
"-ar", "44100", *args, base + ext], check=True)
def true_peak_db(path):
r = subprocess.run([FFMPEG, "-i", path, "-af", "ebur128=peak=true", "-f", "null", "-"],
capture_output=True, text=True)
peaks = [float(line.split("Peak:")[1].strip().split()[0])
for line in r.stderr.splitlines() if "Peak:" in line and "dBFS" in line]
return max(peaks) if peaks else float("nan")
def check_tp(base):
return max(true_peak_db(base + ".ogg"), true_peak_db(base + ".m4a"))
def main():
report = []
problems = []
for fid, fn in ONE_SHOTS.items():
wav_path = os.path.join(OUT, fid + ".wav")
base = os.path.join(DST, fid)
y = fade(norm(dc(fn())))
sf.write(wav_path, stereo(y), sr)
encode(wav_path, base)
tp = check_tp(base)
if tp > ONE_SHOT_TP_CEIL: # MDCT 过冲超限:按超出量降档重编一次再验
gain = 10 ** ((ONE_SHOT_TP_CEIL - tp) / 20) * 0.98
sf.write(wav_path, stereo(y * gain), sr)
encode(wav_path, base)
tp2 = check_tp(base)
report.append((fid, len(y) / sr, tp, f"降 {20 * np.log10(gain):.1f}dB 重编 -> {tp2:.2f}"))
tp = tp2
else:
report.append((fid, len(y) / sr, tp, ""))
if tp > ONE_SHOT_TP_CEIL:
problems.append(f"{fid}: 真峰值 {tp:.2f} dBFS 仍超 {ONE_SHOT_TP_CEIL}")
print(f"{'id':12s} {'dur(s)':>7s} {'TP(dBFS)':>9s} note")
for fid, dur, tp, note in report:
print(f"{fid:12s} {dur:7.2f} {tp:9.2f} {note}")
if problems:
print("PROBLEMS:")
for p in problems:
print(" ", p)
return 1
print(f"ALL OK: {len(ONE_SHOTS)} one-shot -> {DST}")
return 0
if __name__ == "__main__":
sys.exit(main())
+30
View File
@@ -273,3 +273,33 @@ flac 原件 tools/mureka_out/teahouse-{menu,serve,brew}/。
acrossfade 无缝循环 → loudnorm I=-20/TP=-2/LRA=11(20-teahouse.md §8.1 三首 -20 LUFS;
CLOSE 结算 0.5 音量由游戏层控制)→ ogg q3 + m4a 128k,成品均 90.00s。无节拍网格玩法,
未跑 bpm_precise。menu 曲首攻 429 限流一次,60s 退避重试成功;三条任务此后一次成功。
## 2026-09-14(批次 5:rhythm《节拍行者》鼓手模式无鼓伴奏)
预算线:本轮 $0.18(3 任务 ×1 候选,无重提);总预算 $2.00。24 号文档 §9.2:
玩家即鼓手,BGM 必须无鼓(prompt 显式 no drums no percussion)。
| # | task id | 用途 | prompt 特征 | 状态 | 花费 |
|---|---|---|---|---|---|
| 43 | 160832071925761 | track90 无鼓(2 候选) | bright pop rock backing, bass+acoustic+light synth, steady 90 bpm, A minor, no drums | succeeded | $0.03 |
| 44 | 160832268861441 | track105 无鼓(2 候选) | driving energetic pop backing, punchy bass+muted guitar chops+synth, steady 105 bpm, A minor, no drums | succeeded | $0.03 |
| 45 | 160832453541890 | track120 无鼓(2 候选) | high energy synth rock backing, aggressive bass+arp synth+power chords, steady 120 bpm, A minor, no drums | succeeded | $0.03 |
**本轮花费:$0.09。累计:$1.35。**
选用与 BPM 实测(bpm_precise 梳状扫描,无鼓曲目 onset 弱、分数偏低属正常):
- track90:候选 1 实测 **90.00 精确**(score 5.14 vs 候选 0 的 3.87),
无需拉伸;成品实测 **89.99 BPM**(循环 85.33s = 32 小节)。
- track105:候选 0 = 106.26 / 候选 1 = 105.55;选候选 1 以 atempo=0.99479
拉伸至 105(R3 track90 先例),成品实测 **105.00 BPM**(循环 73.14s = 32 小节)。
- track120:候选 0 = 126.0 / 候选 1 实测 **120.00 精确**;选候选 1,
成品实测 **120.01 BPM**(循环 72.00s = 36 小节)。
后处理(R3 rhythm 工艺,整数小节铁律——循环长度必须为 4 拍整数倍,否则
BGM 小节边界与节拍网格漂移):atempo(仅 track105)→ 首个强 onset 起点
(silenceremove -35dB)→ 整数小节裁剪 → 末 3s 与开头 acrossfade(tri) 无缝
循环 → loudnorm I=-20/TP=-2/LRA=11 → 44.1kHz → ogg q3 + m4a 128k。
旧含鼓 track90/105/120 直接覆盖(web/rhythm/audio/bgm/)。
flac 原件存 tools/mureka_out/rhythm-drummer-track*/。首发并行提交遇 429
一次(cipher 批次 3 同款限流),60s 退避串行后 3/3 成功无重试计费。
+18 -10
View File
@@ -32,9 +32,14 @@
*
* 用法:
* import { attachGestures } from '../engine/gesture.js';
* const detach = attachGestures(element, (g) => game.onGesture(g));
* const detach = attachGestures(element, (g, info) => game.onGesture(g, info));
* // detach() 可解除绑定
*
* 第二参 info(24-rhythm 坐标透传,缺省行为逐字节不变):
* { x, y } 视口像素坐标——tap 类/长按 = 按下点,滑动 = 滑动起点(出手瞄准
* 位置),键盘通道 = 虚拟指针坐标(元素中心)。需要触点位置的游戏(如 rhythm
* 分区打击)使用;单参回调完全不受影响。
*
* 基础震动反馈(haptics.js,不支持的平台自动 no-op):
* 滑动识别成功→swipe,tap→confirm,doubletap→confirm。
* 游戏逻辑层的语义反馈(error/success/warning 等)由游戏自行调用 vibrate()。
@@ -161,6 +166,7 @@ export function attachGestures(element, onGesture, config = {}) {
// 单指/单指针跟踪状态
let tracking = false;
let startX = 0, startY = 0, startTime = 0;
let downX = 0, downY = 0; // 本次按下的坐标(onGesture 第二参 info 透传用)
let moved = false; // 位移是否已超 tapSlop(超过则本次不可能是点按)
// 长按状态
@@ -194,14 +200,14 @@ export function attachGestures(element, onGesture, config = {}) {
if (!longPressActive) return;
longPressActive = false;
_dispatchLongpress('longpressend');
onGesture('longpressend');
onGesture('longpressend', { x: downX, y: downY });
}
/** immediateTap:本次按下的序曲 tap 确定作废(转滑动/长按/触摸取消)时补发 tapcancel。 */
function cancelImmediateTap() {
if (!tapPending) return;
tapPending = false;
onGesture('tapcancel');
onGesture('tapcancel', { x: downX, y: downY });
}
function handleDown(x, y) {
@@ -209,6 +215,8 @@ export function attachGestures(element, onGesture, config = {}) {
moved = false;
startX = x;
startY = y;
downX = x;
downY = y;
startTime = performance.now();
if (cfg.immediateTap) {
// 即时模式:按下立即回调 tap,不等双击窗口关闭。
@@ -216,7 +224,7 @@ export function attachGestures(element, onGesture, config = {}) {
// 这声 tap 已发出不可撤回,但引擎会补 tapcancel 让游戏层撤销判定。
tapPending = true;
vibrate('confirm');
onGesture('tap');
onGesture('tap', { x: downX, y: downY });
}
cancelLongPress();
longPressTimer = setTimeout(() => {
@@ -227,7 +235,7 @@ export function attachGestures(element, onGesture, config = {}) {
cancelImmediateTap();
longPressActive = true;
_dispatchLongpress('longpress');
onGesture('longpress');
onGesture('longpress', { x: downX, y: downY });
}, cfg.longpressMs);
}
@@ -267,7 +275,7 @@ export function attachGestures(element, onGesture, config = {}) {
if (Math.abs(dx) > Math.abs(dy)) g = dx > 0 ? 'right' : 'left';
else g = dy > 0 ? 'down' : 'up';
vibrate('swipe'); // 滑动识别成功
onGesture(g);
onGesture(g, { x: startX, y: startY });
return;
}
@@ -281,7 +289,7 @@ export function attachGestures(element, onGesture, config = {}) {
cancelPendingTap();
lastTapTime = 0;
vibrate('confirm'); // 双击
onGesture('doubletap');
onGesture('doubletap', { x: downX, y: downY });
} else if (cfg.immediateTap) {
lastTapTime = now; // tap 已在 handleDown 发出,这里只记双击窗起点
} else {
@@ -292,7 +300,7 @@ export function attachGestures(element, onGesture, config = {}) {
pendingTapTimer = null;
lastTapTime = 0;
vibrate('confirm'); // 单击
onGesture('tap');
onGesture('tap', { x: downX, y: downY });
}, cfg.doubleTapWindow);
}
return;
@@ -395,7 +403,7 @@ export function attachGestures(element, onGesture, config = {}) {
cancelPendingTap(); // 与触屏滑动一致:滑动作废等待中的单击
lastTapTime = 0;
vibrate('swipe');
onGesture(dir); // 即时,无位移/速度判定(零延迟)
onGesture(dir, keyCenter()); // 即时,无位移/速度判定(零延迟)
return;
}
if (tracking) return;
@@ -405,7 +413,7 @@ export function attachGestures(element, onGesture, config = {}) {
cancelPendingTap();
lastTapTime = 0;
vibrate('confirm');
onGesture('doubletap');
onGesture('doubletap', keyCenter());
return;
}
// 空格:虚拟指针按下,进同一状态机(起 450ms 长按定时器;immediateTap
+59 -50
View File
@@ -1,22 +1,30 @@
/**
* 《节拍行者》新手会话剧本:首局完整走教学 T1-T3(第 2 句先整拍不出手——
* round4 H5 归因真话律:听到的是「这拍没接」而不是「慢了半拍」;再连错一遍
* 触发 round3 G2 的「降速 25% 重演 + gd_slow」,跟着慢速领奏做对后恢复正常)
* → 曲目一(90 BPM);曲中下滑呼出菜单逛一圈再恢复(round3 G3:恢复先听
* gd_count「四拍之后,继续」,再跟 4 拍底鼓 count-in 进场;首个应答窗口前
* 整整 1 小节有 gd_answer+turn 交接标记);正片第一乐句故意整句漏掉(连 2 Miss
* 触发向导 gd_miss「慢了半拍」——正片规则不变),之后跟着领奏把一曲打完到结算。
* 《节拍行者》鼓手模式新手会话剧本:首局完整走「摸鼓认区 → 教学 T1-T3 →
* 曲目一(90 BPM)」全弧线——探索阶段把六区摸遍(区名每区只播一次)、曲中
* 下滑逛菜单再恢复(gd_count + 4 拍底鼓 count-in 进场)、正片第一乐句故意
* 整句漏掉(连 2 Miss → 向导 gd_miss)、之后逐音跟打(含终曲加花)到结算。
* 分区敲击带坐标注入(引擎坐标透传契约,24 号文档 §0.3)。
*/
const ZC = {
TL: { x: 50, y: 100 }, TC: { x: 150, y: 100 }, TR: { x: 250, y: 100 },
BL: { x: 50, y: 500 }, BC: { x: 150, y: 500 }, BR: { x: 250, y: 500 },
};
export function describe(game) {
switch (game.phase) {
case 'intro': return '开场旁白在播,单击可以跳过';
case 'tut': return game._cues.length
? `教学:听领奏,下一小节照样打(${game._cues.map((c) => c.gesture).join('→')})${game._tutRate < 1 ? '(领奏已放慢 25%)' : ''}`
: '教学准备中,听鼓点';
case 'intro': return '开场旁白在播(认识你的鼓),单击可以跳过';
case 'tut':
if (game._tutStage === 'probe') {
return `摸鼓认区:随便摸,摸到 3 个不同的地方就开始(已摸 ${game._probeHeard.size} 区)`;
}
return game._cues.length
? `教学:听领奏,下一小节照样敲(${game._cues.map((c) => c.zone).join('→')})${game._tutRate < 1 ? '(领奏已放慢 25%)' : ''}`
: '教学准备中,听数拍';
case 'select': return '选曲:左右滑换曲,单击开始,下滑回大厅';
case 'main': {
const left = game._cues.filter((c) => !c.judged).length;
return `演奏中(${game._song?.title ?? ''}):还剩 ${left} 个应答音。领奏停了、轮到空拍,就该我出手了`;
const fillNext = game._timed.some((e) => e.fn && game._song?.units?.some((u) => u.fill));
return `演奏中(${game._song?.title ?? ''}):还剩 ${left} 个应答音。领奏停了、轮到空拍,就该我出手了${fillNext ? ';有一段加花要连打' : ''}`;
}
case 'menu': return '暂停菜单:单击切选项,双击确认,上滑帮助,下滑恢复演奏';
case 'end': return '结算播报中:听完单击再来一遍,右滑下一首,下滑回大厅';
@@ -27,60 +35,61 @@ export function describe(game) {
export async function session(ctx, mock) {
const { game, audio } = ctx;
const t = () => audio.ctx.currentTime;
// transcribe 的 root 是 {}:补上布局让分区坐标生效(引擎坐标契约的游戏层语义)
game.root = { getBoundingClientRect: () => ({ left: 0, top: 0, width: 300, height: 600 }) };
const hit = async (zone) => {
game.onGesture('tap', ZC[zone]);
await mock.flush();
};
// 开场:welcome 听完进教学
await ctx.waitCond(() => game.phase === 'tut');
ctx.status('教学开始了,先听领奏');
// 开场:welcome → tut_map → tut_probe 三连旁白,逐句跳过
await ctx.waitCond(() => game.phase === 'intro' && ctx.voiceBusy());
ctx.status('开场旁白:我是鼓手,整个屏幕都是鼓。单击跳过');
for (let i = 0; i < 3; i++) { await ctx.gesture('tap'); await ctx.waitVirtual(600); }
await ctx.waitCond(() => game.phase === 'tut' && game._tutStage === 'probe');
ctx.status('进入摸鼓认区:先四处摸摸,听到哪面鼓就报哪面鼓的名');
ctx.note('背景音乐《启程》无鼓伴奏已在轻声循环——拍子网格的底,鼓由我来打');
// 教学 3 步:等领奏排程好,在应答窗口内跟打
// T0 探索:六区全摸一遍(区名每区一次;重复摸只出声),再摸到 3 区进阶
for (const zone of ['TL', 'TC', 'TR', 'BL', 'BC', 'BR']) await hit(zone);
ctx.status('六面鼓摸遍了:左上踩镲、上中高嗵、右上吊镲、左下军鼓、下中底鼓、右下低嗵');
await hit('TL'); // 重复摸:只出声不报名
await hit('BR');
ctx.status('又摸了两下重复的,只响不报名');
await ctx.waitCond(() => game._tutStage === 'step' && game._cues.length > 0);
ctx.status('摸到三个不同的地方,自动开始教学第一步');
// 教学 3 步:等领奏排程好,在应答窗口内跟敲
//(注意:调度泵 interval 常驻,虚拟时钟永不"空闲"——禁止裸 waitIdle)
for (let step = 0; step < 3; step++) {
await ctx.waitCond(() => game.phase === 'tut' && game._cues.length > 0 && game._tutAttempts.length === 0);
ctx.status(`教学第 ${step + 1}/3 句`);
if (step === 1) {
// round4 H5 剧本:这一句先整拍不出手——归因必须是「这拍没接」(gd_miss_none),
// 不是「慢了半拍」;再连错一遍(整句不出手)听它放慢一些再带着打(G2)。
// 注意 _tutEvaluate 判定即把 _phaseEnd 置 Infinity 防重入——等待一律挂
// 「持久里程碑」条件(_tutFails/_tutSlowUsed),别挂阶段末时刻。
await ctx.waitCond(() => game._tutFails === 1); // 失败①:没出手
ctx.status('第一遍整拍没出手——听到的是「这拍没接。我停下的时候,就轮到你了」,不是「慢了半拍」');
await ctx.waitCond(() => game._phaseEnd < 1e8 && t() < game._phaseEnd - 1); // 纠正链播完、重新领奏
ctx.status('又重新领奏了一遍,还是没敢出手');
await ctx.waitCond(() => game._tutSlowUsed === true); // 失败② → 触发降速重演
await ctx.waitCond(() => game._phaseEnd < 1e8 && t() < game._phaseEnd - 1); // gd_slow 播完、慢速领奏已排
ctx.status('听到「我放慢一些,跟着试试」——领奏降速 25% 重演,这回跟着慢拍打');
await ctx.waitCond(() => game._tutIdx === step && game.phase === 'tut'
&& game._cues.length > 0 && game._tutAttempts.length === 0);
ctx.status(`教学第 ${step + 1}/3 步:听数拍和领奏,下一小节照着敲`);
for (const cue of game._cues) {
const at = cue.expected - (cue.gesture === 'tap' ? -0.28 : 0.04);
await ctx.waitCond(() => t() >= at || cue.judged);
await ctx.waitCond(() => t() >= cue.expected || cue.judged);
if (cue.judged) continue;
await ctx.gesture(cue.gesture);
}
await ctx.waitCond(() => game._tutIdx > step || game.phase !== 'tut');
continue;
}
for (const cue of game._cues) {
const at = cue.expected - (cue.gesture === 'tap' ? -0.28 : 0.04); // tap 补偿引擎 ~300ms 延迟
await ctx.waitCond(() => t() >= at || cue.judged);
if (cue.judged) continue;
await ctx.gesture(cue.gesture);
await hit(cue.zone);
}
await ctx.waitCond(() => game._tutIdx > step || game.phase !== 'tut');
}
await ctx.waitCond(() => game.phase === 'main');
ctx.status('教学完毕,曲目一《启程》90 拍开始。领奏响之前先听到「现在跟着我打」');
ctx.status('教学完毕,曲目一《启程》90 拍开始。先听四下底鼓数拍,然后是「现在跟着我打」');
ctx.note('《启程》无鼓伴奏 BGM 起,四下底鼓数拍对齐小节');
// 曲中逛菜单:下滑呼出(模态暂停)→ 听选项 → 下滑恢复
//(round3 G3:恢复先播「四拍之后,继续」,再跟 4 拍底鼓 count-in 进场)
//(gd_count「四拍之后,继续」+ 4 拍底鼓 count-in 进场)
await ctx.waitCond(() => t() >= game._bgmT0 + 1.5);
await ctx.gesture('down');
await ctx.waitCond(() => game.phase === 'menu');
ctx.status('曲中暂停,进了菜单');
ctx.note('BGM 在断点冻住——谱面、判定、音乐全部暂停');
await ctx.waitVirtual(1100); // 菜单 1s 去抖独占期
await ctx.gesture('tap'); // 切换选项(听到「回大厅」)
await ctx.waitIdle();
ctx.note('还是想打完这首,下滑回去');
await ctx.gesture('down'); // 恢复
await ctx.waitCond(() => game.phase === 'main');
ctx.status('听到「四拍之后,继续」,跟着四下底鼓数拍进来了');
ctx.note('BGM 从断点续播,节拍网格整体后移了一小节');
// 第一乐句故意整句不打:连 2 次 Miss → 向导 gd_miss
const firstPhrase = game._cues.filter((c) => c.phrase === 0);
@@ -88,16 +97,16 @@ export async function session(ctx, mock) {
await ctx.waitCond(() => firstPhrase.every((c) => c.judged));
ctx.status('第一句全漏了,听到「慢了半拍,下一小节跟上我就行」');
// 之后逐音跟打(tap 注入留出引擎 ~300ms 回调延迟)
// 之后逐音跟打(含终曲加花)
for (const cue of game._cues) {
if (cue.judged) continue;
const at = cue.expected - (cue.gesture === 'tap' ? -0.28 : 0.04);
await ctx.waitCond(() => t() >= at || cue.judged);
await ctx.waitCond(() => t() >= cue.expected || cue.judged);
if (cue.judged) continue;
await ctx.gesture(cue.gesture);
await hit(cue.zone);
}
await ctx.waitCond(() => game.phase === 'end');
await ctx.waitIdle();
ctx.status('曲子打完了,结算播报中');
ctx.status('曲子打完了(加花收尾是一记吊镲),结算播报中');
ctx.note('曲目 BGM 淡出,结算语音链播完会淡入大厅音乐');
}
+36 -33
View File
@@ -1,41 +1,45 @@
# 节拍行者(RHYTHM)
# 节拍行者(RHYTHM)· 鼓手模式
跟随领奏的节奏游戏,纯音频。系统奏一句,你在下一小节原样跟打——
音要对,拍点也要对。建议戴耳机(有线优先,蓝牙延迟由 Good 窗口吸收)。
屏幕分区打击乐节奏游戏,纯音频。整面屏幕是一面鼓:你在无鼓伴奏的乐队里
当鼓手,系统(领奏)敲一小节,你在下一小节照着敲回来——鼓要选对,拍点也要对。
建议戴耳机(有线优先,蓝牙延迟由 Good 窗口吸收)。
## 玩法
- 每个乐句 = **领奏 1 小节 + 应答 1 小节**:先听系统用打击乐器演奏
2-4 个音的节奏型,然后在下一小节的相同拍点用相同手势跟打。
- 判定:**Perfect ±150ms**(乐器音 + 亮音 accent)/ **Good ±350ms**(只播乐器音)/
**Miss**(手势错或错过拍点:该音符不出声 + 一声闷镲 + 震动提醒)。
判定时刻按真实触摸时刻算(引擎 immediateTap 按下即发 tap;滑动/双击按
识别延迟补偿回触摸时刻)。Miss 不中断不掉血,歌照唱完。
- 每个乐句 = **领奏 1 小节 + 应答 1 小节**:先听系统用打击乐演奏 2-4 音的
节奏型(曲三 4-6 音),然后在下一小节的相同拍点敲相同的鼓。曲子开头有
1 小节底鼓数拍。
- **加花**:曲中/曲尾有八分音符密集加花(领奏一串快鼓),跟着连打,最后
一记吊镲收束。
- 判定:**Perfect ±150ms**(鼓音 + 亮音 accent)/ **Good ±350ms**(只播鼓音)/
**Miss**(敲错鼓或错过拍点:闷镲 + 震动提醒)。点按按下即判(零识别延迟),
Miss 不中断不掉血,歌照唱完。
- 计分:Perfect=2 / Good=1 / Miss=0,评级 **S≥95% / A≥85% / B≥70% / C**。
- 连击每 16 次有震动鼓励;乐句全 Perfect 有额外震动。
- **3 首曲目解锁制**:《启程》90 BPM → 《追风》105 BPM(反拍)→ 《星爆》120 BPM
(切分密集)。曲目 n 拿到 B 级以上解锁 n+1,解锁状态本地保存并同步大厅。
## 手势 → 乐器音
## 屏幕分区 → 鼓组(3 列 × 2 行)
| 手势 | 乐器音 | 声像 |
|---|---|---|
| 单击 | 底鼓 kick | 中央低频 |
| 双击 | 军鼓 snare | 中央偏上 |
| 左滑 | 闭合镲 hat | 极左 |
| 右滑 | 开放镲 hat | 极右 |
| 上滑 | 高通 tom | 升调感 |
| 下滑 | 低通 tom | 降调感 |
| 长按 | —(非演奏手势) | Miss 反馈音 + 震动提醒 |
| 区 | 位置 | 乐器 | 声像 |
|---|---|---|---|
| 踩镲 | 左上 | 闭合踩镲 | 左 |
| 高嗵 | 上中 | 高音嗵 | 中 |
| 吊镲 | 右上 | 吊镲(长尾) | 右 |
| 军鼓 | 左下 | 军鼓 | 左 |
| 底鼓 | 下中 | 底鼓(你的「家」) | 中 |
| 低嗵 | 右下 | 低音嗵 | 右 |
你的每次出手都会实时奏响对应乐器音——跟对了,就能听到自己在演奏。
**横着三列 = 左中右声像;竖着两行 = 上清亮下沉闷。** 六件乐器音色各异,
声像 + 音高 + 音色三重线索,蒙眼可辨。键盘:数字 1-6 = 六区(1-3 上排,
4-6 下排),空格 = 下中底鼓。
## 流程
- **首次进入**:一句欢迎后进入 5 步交互教学(单击 → 左右滑 → 上滑 → 下滑 →
三音带双击),做错有纠正语音(早了/晚了/不是这个手势),同一步失败 2 次
自动跳过;全程零通过时收尾播中性句(不夸"很好");教学中**下滑 = 跳过
教学**(教到下滑步、临近下滑音符时除外——那时它是演奏)。
- **首次进入**:欢迎 → 摸鼓认区(随便摸,听到哪面鼓就告诉你它在哪,摸到
3 个不同的地方开始)→ 3 步跟打教学(底鼓家区 → 左右军鼓低嗵 → 上排
踩镲高嗵吊镲),做错有纠正语音(早了/晚了/敲错鼓),同一步失败 2 次会
放慢再教一遍,全程零惩罚;教学中**下滑 = 跳过教学**。
- **选曲**(二周目起):左右滑切曲目(播曲目名/未解锁提示),单击开始,
上滑听规则,下滑回大厅。
- **结算**:播报评级(含准确率档位)与连击纪录;**单击 = 再来一遍(同曲),
@@ -43,18 +47,17 @@
## 菜单
演奏中**下滑呼出**(模态暂停:谱面、判定、BGM 全部冻结,BGM 断点续播)→
**单击循环选项**(继续演奏/回大厅)→ **双击确认** → **上滑 = 帮助**(规则 +
设置引导)。菜单打开后 **1 秒去抖独占期**:期内不收任何手势(防演奏途中被
弹菜单时,已在路上的手势直接穿透菜单误确认)。
注意:下滑同时是"低通 tom"的演奏手势——**自下滑音符的领奏响起到判定
死线之间**,下滑永远是演奏;音符刚被判定死线拖死的短窗内(识别延迟、手势
还在路上)同样按演奏处理,绝不弹菜单;仅当没有悬置、临近或刚拖死的下滑
音符时才呼出菜单。
演奏中**下滑呼出**(模态暂停:谱面、判定、BGM 全部冻结,BGM 断点续播,
恢复前先听 4 拍数拍)→ **单击循环选项**(继续演奏/回大厅)→ **双击确认**
→ **上滑 = 帮助**(规则 + 设置引导)。菜单打开后 **1 秒去抖独占期**:期内
不收任何手势(防已在路上的手势穿透菜单误确认)。
## 运行
```bash
python3 -m http.server 8105 --directory /home/ubuntu/SoundGame/web
python3 -m http.server 8105 --directory /home/xsl/AutoVideo/SoundGame/web
# 浏览器打开 http://localhost:8105/rhythm/ ,建议戴耳机
```
无头试玩:`tools/node/bin/node web/rhythm/test/playtest.mjs`
(断言清单 docs/design/24-rhythm-drummer.md §11)。
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More