CrazyCritic89/SteamHapticsSinger
GitHub: CrazyCritic89/SteamHapticsSinger
这是一个通过 Steam 控制器和 Steam Deck 播放 MIDI 音乐文件的触觉反馈工具。
Stars: 180 | Forks: 7
# Steam 触觉歌手
本项目旨在延续 SteamControllerSinger(从 [Roboron3042 的分支](https://github.com/Roboron3042/SteamControllerSinger) fork 而来,最初由 [Pila](https://gitlab.com/Pilatomic/SteamControllerSinger) 开发),通过修复问题、增加功能,并最值得注意地支持 Steam Deck 和 Steam Controller (2026)。
我创建了一个小型 [Discord 服务器](https://discord.gg/TWpvAxX5GW),方便感兴趣的人分享 MIDI 文件和获取更新。
## 如何使用
1. 打开您的 Steam Controller (2015 或 2026) 或 Steam Deck
2. 将 MIDI 文件拖放到 steam-haptics-singer 可执行文件上
3. 如果出现提示,请按 Enter 键
4. 享受吧!
### 在哪里可以找到 MIDI 歌曲?
准备好播放的歌曲可以在原作者的 [个人收藏](https://mega.nz/#F!BWpEWKzB!r7WPw5bZ_domN4pk-FJsjg) 中找到(正如他所称)。或者,您可以尝试播放一个 MIDI 文件看看效果(大多数时候效果可能不理想)。
### 从命令提示符使用:
```
Usage: steam-haptics-singer [-p] [-y] [-d DEBUG_LEVEL] [-i INTERVAL] MIDI_FILE
-i INTERVAL Player sleep interval (in microseconds). Lower generally means better song fidelity, but higher cpu usage, and at some point going lower won't improve any more. Default value is 10000
-d DEBUG_LEVEL Libusb debug level. Default is 0, no debug output. max is 4, max verbosity output
-p Repeat song, plays again after ending
-e Direct velocity to gain control, the MIDI file will set the gain"
-t (Steam Controller 2026 Only) Limit to only two channels"
-s (Steam Controller 2026 Only) Swap rumble and trackpad channels"
```
### MIDI 文件提示:
MIDI 文件可能需要使用如 [MidiEditor](https://www.midieditor.org/) 这样的软件进行编辑,以便通过 Steam 触觉歌手正确播放,请遵循以下提示:
* MIDI 通道 0 上的音符通过右侧触觉/震动播放
* MIDI 通道 1 上的音符通过左侧触觉/震动播放
* MIDI 通道 2 上的音符通过右侧触觉播放(仅限 Steam Controller 2026)
* MIDI 通道 3 上的音符通过左侧触觉播放(仅限 Steam Controller 2026)
* 其他通道上的音符将被忽略
* **避免同一通道上同时有多个音符激活**,因为触觉执行器一次只能播放一个音符。
## 编译
您需要 libusb(-dev) 和 pkgconf。如果您已经安装了它们,只需输入 `make`。
建议在容器中编译此项目,例如 [steam-runtime](https://github.com/ValveSoftware/steam-runtime?tab=readme-ov-file#building-in-the-runtime) 或 [holo-docker](https://github.com/SteamDeckHomebrew/holo-docker),以便软件包与 Steam Deck 兼容。
如果选择 steam-runtime 方式,请确保使用 sniper,因为 scout 已经过时。
### 指南:
```
git clone -b master https://github.com/CrazyCritic89/SteamHapticsSinger.git
cd SteamHapticsSinger
podman run --rm -v ./:/src -it registry.gitlab.steamos.cloud/steamrt/sniper/sdk bash
cd src
make
exit
```
## 更新日志
[v1.11.1]
* Steam Controller (2026) 现在默认使用震动播放前两个通道
* 移除了 -t 和 -b 参数
* 添加了 -s 参数以交换震动和触控板通道(感谢 @Pixel1011 提出的想法)
* 添加了 -t 参数以限制为仅两个通道(可与 -s 联合使用)
* 修复了 -d 参数
* 在播放显示中将“震动”重命名为“触觉”(临时)
* 错误信息现在显示名称而非数值
[v1.11]
* 为 Steam Controller (2026) 添加了背面震动触觉支持
* 通道计数现在是一个单独的变量,允许更改,但仍然不是完全动态的,因为除 2 或 4 以外的任何值都会导致问题
* Note on 现在之前会发送 note off。这特别解决了 Steam Controller (2026) 的问题,即没有间断的音符序列可能会音准漂移,并且更重要的是,防止了在使用背面震动触觉时控制器重启
* 添加了直接力度(velocity)到增益(gain)控制,允许 MIDI 控制触觉反馈的强度。要使 MIDI 文件自动解析为直接力度,请在文件名中添加“dv”。否则,您可以使用 -e 参数
* 为 Steam Controller (2026) 添加了 -t 参数,仅使用触控板以防止 MIDI 文件中仍有上层通道音符时的播放问题
* 为 Steam Controller (2026) 添加了 -b 参数,将前两个通道映射到背面震动触觉
[v1.10.2]
* 添加了 Steam Puck 支持
* Steam Dongle 能连接但仍然无法工作
* Steam Controller (2026) 上的触觉反馈已交换,以匹配 2015 版和 Steam Deck
* 增益/音量现在恢复到中等水平,因为最高设置可能导致损坏 (#11),需要进一步测试
* 在 Windows 上使用 Puck 连接时,由于 Puck 会重新连接,显示重新连接控制器消息
[v1.10.1]
* 添加了有线 Steam Controller (2026) 支持,通过 Puck 和蓝牙的无线支持仍在开发中
* 原始 Steam Controller 已重命名为 Steam Controller (2015)
* 控制器现在在代码中有自己的类型
* 暂时移除了 legacy 参数
* 音符现在以全音量播放(新的 Steam Controller 除外,以防止失真)
[v1.10]
* 实现了针对 Steam Deck 的特定触觉命令。现在歌曲可以在其上正确播放。
* 更新了 midifile 库
* 音符停止现在将频率设置为 0
* 移除了回收期(reclaim period),不再需要且曾导致问题
* 通过 -y 切换 legacy 命令
* 重复歌曲的切换从 -r 更改为 -p
* 调试级别参数从 -l 改回 -d
* 更新了使用说明以显示更多信息
* 自然音现在中间有连字符(C5 -> C-5)
[My v1.9 Build :> (EXCLUSIVE)]
* 糟糕地添加了 Deck 支持。没有改进。
[v1.8]
* 用户现在可以通过 -c 选项定义回收期。
[v1.7]
* 修复了播放几秒后音乐停止的问题
[v1.6]
* 修复了播放算法中的主要错误
[v1.5]
* 将调试级别参数从 -d 改为 -l
* 添加了 -r 参数以启用演示模式
* 增强了参数解析
* 不再依赖 Steam Controller 的持续时间
* 更新了音符显示
* 现在中断进程时(按 Ctrl+C)会停止播放
[v1.4]
* 修复了 MIDI 库中的一个错误,当 ON 事件和之前的 OFF 事件具有相同的时间点时,会导致音符持续时间为零
[v1.3]
* 添加了 -iINTERVAL 参数
* 添加了 -dDEBUG_LEVEL 参数
[v1.2]
* 修复了在播放时断开控制器连接会卡在“Command error”的问题。现在会继续播放(即使持续失败)
* 移除了现已弃用的 20ms 音符持续时间减少
标签:libusb, MIDI处理, MIDI文件支持, Steam Deck, Steam控制器, USB通信, 客户端加密, 振动控制, 振动音乐, 游戏硬件, 游戏辅助, 硬件控制, 触觉反馈, 请求拦截, 软件工具, 音乐播放, 音频工程