简体中文 繁體中文 English Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français Japanese

站内搜索

搜索
AI 风月

活动公告

03-01 22:34
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

想请教一下有关音击的灯光同步相关的问题

1

主题

40

科技点

47

积分

太初窥星

积分
47
发表于 2025-12-22 17:00:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近自己用RP2040搓了个手台, 已经能用了,

但是看到segatools.ini里那一段LED相关的注释就又想再折腾一下,

我在电脑上尝试用Python读取那个ongeki_led的管道(打算之后搞明白了再用串口给传到手台去), 把那些led颜色数据显示出来, 发现好乱, 六个主键的灯光倒是没问题, 但是其他的就感觉乱七八糟, 明明都是按照segatools.ini里的说明来排列的, 下面链接贴上视频和代码, 代码主要是找AI写的

视频
LEDRead.py
image.webp

我那个seagatools.ini的LED那一段内容
  1. ; -----------------------------------------------------------------------------
  2. ; LED settings
  3. ; -----------------------------------------------------------------------------

  4. [led15093]
  5. ; Enable emulation of the 15093-06 controlled lights, which handle the air tower
  6. ; RGBs and the rear LED panel (billboard) on the cabinet.
  7. enable=1

  8. [led]
  9. ; Output billboard LED strip data to a named pipe called "\\.\pipe\ongeki_led"
  10. cabLedOutputPipe=1
  11. ; Output billboard LED strip data to serial
  12. cabLedOutputSerial=0

  13. ; Output slider LED data to the named pipe
  14. controllerLedOutputPipe=1
  15. ; Output slider LED data to the serial port
  16. controllerLedOutputSerial=0

  17. ; Serial port to send data to if using serial output. Default is COM5.
  18. ;serialPort=COM5
  19. ; Baud rate for serial data
  20. ;serialBaud=921600

  21. ; Data output a sequence of bytes, with JVS-like framing.
  22. ; Each "packet" starts with 0xE0 as a sync. To avoid E0 appearing elsewhere,
  23. ; 0xD0 is used as an escape character -- if you receive D0 in the output, ignore
  24. ; it and use the next sent byte plus one instead.
  25. ;
  26. ; After the sync is one byte for the board number that was updated, followed by
  27. ; the red, green and blue values for each LED.
  28. ;
  29. ; Board 0 has 61 LEDs:
  30. ;   [0]-[1]: left side button
  31. ;   [2]-[8]: left pillar lower LEDs
  32. ;   [9]-[17]: left pillar center LEDs
  33. ;   [18]-[24]: left pillar upper LEDs
  34. ;   [25]-[35]: billboard LEDs
  35. ;   [36]-[42]: right pillar upper LEDs
  36. ;   [43]-[51]: right pillar center LEDs
  37. ;   [52]-[58]: right pillar lower LEDs
  38. ;   [59]-[60]: right side button
  39. ;
  40. ; Board 1 has 6 LEDs:
  41. ;   [0]-[5]: 3 left and 3 right controller buttons
  42. ;
复制代码



温馨提示:看帖回帖是一种美德,您的每一次发帖、回帖都是对论坛最大的支持,谢谢! [这是默认签名,点我更换签名]
回复

使用道具 举报

790

主题

581

科技点

1249

积分

白金月票

积分
1249
发表于 2025-12-22 17:48:41 | 显示全部楼层
segatools 就是一个翻译器,你要解决翻译是否正确的问题吧,segatools 不同来源获取的可能也有些许区别,具体需要按照映射关系来指定。你键位的控制程序发送的信号键能对得上吗?对得上再写颜色不是吗。

点评

不好意思, 你后面这句话我没明白说的是什么. 我再补充一下吧, 我现在RP2040用的Arduino框架, 只是在模拟键盘按键输入, 虽然听说过其他手台有什么hid模式, 但是我搞不明白, 所以还是用的最简单的方法. 这个灯光  详情 回复 发表于 2025-12-23 09:48
我真服辣

790

主题

581

科技点

1249

积分

白金月票

积分
1249
发表于 2025-12-22 17:51:29 | 显示全部楼层

顺便帮你问了一下 gpt

segatools LED 输出混乱问题总结

一、问题背景

  • 使用 RP2040 自制手台,基础功能已可正常使用。
  • 进一步尝试解析 segatools.ini 中的 LED 输出说明。
  • 通过 Python 读取 \\.\pipe\ongeki_led 管道,将 LED RGB 数据解析并显示。

现象

  • Board 1(6 个主键灯)显示完全正常
  • Board 0(pillar + billboard)颜色与位置明显混乱,与 segatools.ini 注释描述不一致。

二、核心结论(一句话版)

segatools 的 LED 输出并不是严格的硬件协议,而是一个“尽力而为”的翻译层。
你遇到的并不是 Python 或 RP2040 的问题,而是 逻辑 LED 顺序真实物理灯顺序 不一致导致的。


三、为什么主键灯正常,其他灯混乱?

1️⃣ Board 1(Controller / 主键 LED)

  • 数量少(6 个)
  • 与按键输入一一对应
  • segatools 内部 硬编码映射

✅ 结果:

  • 顺序稳定
  • 含义明确
  • 易于解析

👉 这是 “逻辑 LED”,而非装饰灯。


2️⃣ Board 0(Pillar / Billboard LED)

这是问题集中区域,原因叠加至少有 4 层

(1)游戏逻辑顺序 ≠ 真实物理顺序

  • 游戏中按“左下 → 左中 → 左上 → billboard → 右上 → 右中 → 右下”逻辑组织
  • 真实机器中灯带:

    • 可能蛇形走线
    • 左右镜像
    • 中途反向焊接

segatools 并不知道你的真实灯带焊接方式


(2)segatools 并非直接读取官方 LED DMA 数据

  • 实际流程是:

    • 拦截 JVS / IO 指令
    • 推断当前灯效状态
    • 重新组织数组后输出

👉 这一过程本身就可能 重排 / 合并 / 简化


(3)LED 数据是“局部更新”,不是全量帧

segatools.ini 中的关键点:

After the sync is one byte for the board number that was updated

含义:

  • 并非每一帧都发送完整 61 个 LED
  • 有时只更新其中一部分
  • 如果按“整帧刷新”理解,就会看到颜色错位、跳变

(4)E0 / D0 转义机制极易导致错位

  • 0xE0:帧同步字节
  • 0xD0:转义字符
  • 若转义处理 漏一个字节或 +1 还原错误

👉 后续所有 RGB 数据都会整体错位,看起来就像“乱七八糟”。


四、正确的解决思路(工程视角)

你的整体路线是正确的

Python → 串口 → RP2040

这是一条标准、可调试、可回退的工程路径。

但需要调整验证方式。


五、推荐的验证与校准方法

Step 1:颜色探针(强烈推荐)

目的:反向推导真实物理映射

做法:

  • 每次只点亮 一个 logical LED index(纯红)
  • 其余全部关闭
  • index 从 0 → 60 依次测试

记录:

logical index  →  实际物理位置

你会发现:

  • 顺序与 segatools.ini 注释不完全一致
  • pillar 左右往往是镜像
  • billboard 可能是反向排列

👉 这是不可跳过的步骤。


Step 2:建立你自己的 Mapping Table

示意:

segatools logical index → physical LED index
  • segatools 只提供 logical 顺序
  • 你需要定义 physical 顺序

Step 3:RP2040 只认“物理顺序”

一旦映射完成:

  • MCU 不再依赖 segatools 的注释
  • 可自由更换模拟器 / 输出源
  • 整个系统更稳定、可维护

六、最终结论

  • segatools 不是硬件规格书
  • LED 输出只是逻辑状态的一种近似表达
  • 真正需要解决的是:

“segatools 认为的 LED 顺序” ↔ “你眼前真实灯的位置”

你已经站在正确的位置上,只差完成 物理映射反推 这一关键一步。


七、可选下一步(如果继续深入)

  • 编写自动 LED 探针脚本(Python)
  • 设计更健壮的 MCU 通信协议(抗丢包 / 抗错位)
  • 甚至绕开 segatools,设计自己的 LED 数据通道

这已经不是“玩具级 DIY”,而是外设仿真工程了。

我真服辣

1

主题

40

科技点

47

积分

太初窥星

积分
47
 楼主| 发表于 2025-12-23 09:48:48 | 显示全部楼层
kohaD 发表于 2025-12-22 17:48
segatools 就是一个翻译器,你要解决翻译是否正确的问题吧,segatools 不同来源获取的可能也有些许区别,具 ...
  1. "你键位的控制程序发送的信号键能对得上吗?对得上再写颜色不是吗。"
复制代码


不好意思, 你后面这句话我没明白说的是什么.

我再补充一下吧, 我现在RP2040用的Arduino框架, 只是在模拟键盘按键输入, 虽然听说过其他手台有什么hid模式, 但是我搞不明白, 所以还是用的最简单的方法.

这个灯光相关的代码只是在电脑上试验, 我打算是先弄清楚一些再尝试写到RP2040里去, 在segatools.ini里改成灯光数据输出到串口给RP2040读取(我还不清楚, 能做到这样吗?).

点评

[md]问的 GPT( ## 一、问题现象 * 使用 **Python 读取 `\\.\pipe\ongeki_led`**,将 LED 颜色数据显示出来 * **Board 1(6 个主键 LED)显示完全正常** * **Board 0(pillar / billboard LED)显示混乱** * 已严  详情 回复 发表于 2025-12-23 10:29
温馨提示:看帖回帖是一种美德,您的每一次发帖、回帖都是对论坛最大的支持,谢谢! [这是默认签名,点我更换签名]

790

主题

581

科技点

1249

积分

白金月票

积分
1249
发表于 2025-12-23 10:29:33 | 显示全部楼层

roasal 发表于 2025-12-23 09:48

不好意思, 你后面这句话我没明白说的是什么.

我再补充一下吧, 我现在RP2040用的Arduino框架, 只是在模 ...

问的 GPT(

一、问题现象

  • 使用 Python 读取 \\.\pipe\ongeki_led,将 LED 颜色数据显示出来
  • Board 1(6 个主键 LED)显示完全正常
  • Board 0(pillar / billboard LED)显示混乱
  • 已严格按照 segatools.ini 中的 LED 顺序注释进行排列

二、核心结论

segatools 输出的 LED 数据不是“完整帧缓冲”,而是“增量更新流”。
你现在看到的“乱”,本质上是把“局部更新”当成了“全量状态”来渲染。

六个主键 LED 没问题,正是这个结论的直接证据。


三、关键误解点

❌ 误解:每个 E0 帧都包含完整的 LED 状态

直觉上你可能认为 segatools 输出的是:

E0 | board_id | LED[0] | LED[1] | ... | LED[n]

但真实语义是:

E0 | board_id | 本次被“更新”的 LED RGB 数据

这一点在 ini 中被一句话点出,但非常容易被忽略:

board number that was updated


四、为什么 Board 1 看起来完全正常

Board 1(6 个主键 LED)的特性

  • LED 数量少
  • 与按键强绑定(按下 / 放开)
  • 游戏逻辑中几乎每帧都会整体更新

👉 结果:

  • 每次收到的数据,等价于一次完整状态刷新
  • 即使错误地“整帧重绘”,也不会出问题

这会造成一个错觉:

“segatools 的 LED 输出是完整数组”


五、为什么 Board 0 会表现为“乱七八糟”

Board 0 的真实属性:装饰灯 + 特效灯

  • 包含 pillar / billboard
  • 灯效以:

    • 渐变
    • 波浪
    • 扩散
    • 局部闪烁
      为主

特性是:

  • 大量 LED 在很长时间内不会被更新

当前渲染方式的问题

你现在的 Python 程序逻辑等价于:

每收到一包数据 → 按 index 重画全部 LED

但 segatools 实际输出的是:

每一包数据 → 只描述“这次变了哪些 LED”

👉 结果就是:

  • 有的 LED 是新数据
  • 有的 LED 是旧残留
  • 有的 LED 被错误覆盖

视觉上就像:

索引错位 / 颜色乱跳 / 顺序混乱

索引本身可能完全是对的


六、工程级类比(帮助理解)

可以把 LED 看成一块屏幕:

  • Board 1:每帧整屏刷新(Full Frame)
  • Board 0:只发送“脏矩形更新”(Dirty Rectangles)

而当前实现是:

用“脏矩形数据”当成“整屏帧缓冲”去绘制

结果必然花屏。


七、验证该结论的最简单方法

在 Python 中引入“状态缓存”

正确的处理逻辑应为:

为每个 board 维护一份 LED 状态数组

收到新数据时:
    只更新本次出现的 LED index
    其他 LED 保留上一次的状态

而不是:

收到一包数据 → 重绘所有 LED

👉 只要这样修改,pillar / billboard 的显示会立刻正常很多。


八、segatools.ini 注释的正确使用方式

segatools.ini 中的 LED 注释:

  • ✅ 描述 logical index 的分区含义
  • ❌ 不保证:

    • 每一帧都会出现
    • 连续更新
    • 等间隔刷新

正确理解是:

注释定义“这个 index 是什么灯”,
而不是“什么时候、以什么频率更新”。


九、现在阶段的正确推进方式

在上 RP2040 之前,建议在 PC 端先完成:

  1. 完整的 E0 / D0 转义与帧同步解析
  2. Board 0 / Board 1 各自的 LED 状态缓存
  3. 只对“本次更新的 LED”做增量修改

完成后:

  • 管道 → 串口 只是传输方式变化
  • Python → MCU 只是语言迁移

十、最终结论

你看到的混乱,并不是因为你没按 segatools.ini 排列,
而是因为 segatools 的 LED 输出语义是“增量更新流”,而不是帧缓冲快照

六个主键 LED 正常,反而是这个事实的最好证明。

理解这一点之后,后续无论是 Python 显示、串口转发还是 RP2040 驱动,都会顺畅得多。

我真服辣
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|联系我们|小黑屋|TG频道|RSS |网站地图

Powered by Pixtech

© 2025-2026 Pixtech Team.

>