TetraSsky/DualRip

GitHub: TetraSsky/DualRip

DualRip 通过模拟 Nintendo DS 声音驱动,将 ROM 中的 SSAR 音效和 SSEQ 音乐序列渲染提取为带循环点信息的 WAV 文件,同时提供 CLI 和 GUI 两种操作方式。

Stars: 2 | Forks: 0

# DualRip 通过模拟 DS 声音驱动,将 `sound_data.sdat` 中的 Nintendo DS 音效 (SSAR) 和音乐 (SSEQ) 提取为 WAV。支持 CLI + GUI。 ## 你能得到什么 - 每个声音或歌曲进行一次循环迭代,包含完整的释放包络,并保留原生的休止符。 - 循环点保存在 `manifest.csv` 中,并作为 `smpl` 块嵌入到 WAV 文件中。 ## 截图 打开一个 `.nds` ROM:从选择对话框中选择一个或多个 SDAT(按住 Ctrl/Shift 点击可多选): ![多 SDAT 导入](https://static.pigsec.cn/wp-content/uploads/repos/cas/9c/9c2c0b471c32e4cec668362925687448847ef1f06b7b966c68493a1cd7ba1672.png) 并排浏览多个 SDAT,按归档分组: ![每个 SDAT 的布局](https://static.pigsec.cn/wp-content/uploads/repos/cas/e4/e4bb54ffa7bb48f8e634096a00113bc53e6d5466b852024593f36575511a6b81.png) 浏览 SDAT,使用内置播放器预览音效(支持定位、暂停、在声音自身的循环点上循环): ![归档预览](https://static.pigsec.cn/wp-content/uploads/repos/cas/31/3116a98c5e35543b3fc7fa0e1f39ad771ac7b540e5f3157d454824703a95f82f.png) 带有全长进度条和实时播放的音乐序列: ![音乐预览](https://static.pigsec.cn/wp-content/uploads/repos/cas/cc/cc2243a7a87ded9f1e430b091e33ca3b612dc9bfe78dab2b77fb6a38d898d5dc.png) 带有逐项日志、循环点和 bank 自动解析说明的批量导出: ![导出对话框](https://static.pigsec.cn/wp-content/uploads/repos/cas/1f/1ffa4f03a02d28b110f231f85d7ab8a11ab2f6dfa3fda9f7d673c2b0efd5dfd7.png) ## 用法 ``` dualrip --sdat sound_data.sdat --archive all --out MyRip dualrip --sdat sound_data.sdat --sequence all --out MyMusic dualrip --sdat game.nds --sdat-index 0 --archive all --out MyRip ``` | 选项 | 效果 | |---|---| | `--sdat PATH` | `.sdat` 文件或 `.nds` ROM 的路径 | | `--sdat-index N` | 当使用包含多个 SDAT 的 `.nds` ROM 时,选择其中一个(0 = 第一个)。省略此项以列出它们。 | | `--archive N` | 提取一个 SSAR 归档,或设为 `all`(当未指定 `--sequence` 时的默认值) | | `--sequence N...` | 提取这些 SSEQ 音乐索引,或设为 `all`(提取到 `SSEQ/` 子文件夹中) | | `--rate N` | 采样率(默认为 44100) | | `--only I J...` | 仅提取这些条目索引 | | `--bank-map "4=32+33"` | 覆盖 bank 解析 | GUI:打开 `.sdat` 或 `.nds`,浏览/过滤,双击以预览任何音效或音乐曲目(定位、暂停、在其自身的循环点上循环),按住 Ctrl/Shift 选择音效、归档或序列并导出。 包含多个 SDAT 的 ROM(例如《Sonic Colors》有 12 个)允许你通过选择对话框一次选择多个;它们将在树形结构中显示为顶级组。 ## 动态 bank 插槽 某些游戏会将 SDAT 中的 bank 插槽留空,并在运行时填充它们。 DualRip 会自动解析这些插槽(基于家族亲和性 + 覆盖率排名)。 解析结果显示在清单中 (`4->33`);可以使用 `--bank-map` 进行覆盖。 ## 代码 ``` dualrip/tables.py, cprims.py lookup tables, C-semantics primitives dualrip/formats/ SWAR/SWAV, SBNK, SDAT, NDS/SDAT extraction dualrip/engine/ sequencer, envelopes/synthesis, raw-export policy dualrip/bankmap.py static patch scan + auto bank resolution dualrip/export.py WAV/manifest, public API: render_one / rip_archive / rip_sequences dualrip/cli.py, gui/ frontends ``` 依赖项是单向的:GUI → export/bankmap → engine → tables。`gui/` 之外的任何内容都不会导入 Qt。`tests/test_golden.py` 中的 Golden 测试(需要设置 `DUALRIP_TEST_SDAT` 环境变量)确保渲染器逐位匹配。 ## 环境要求 Python ≥ 3.10,`numpy`,`ndspy`,`PySide6`,`sounddevice`。不包含任何游戏数据。 ## 构建 ``` pip install -e .[gui] pyinstaller pyinstaller dualrip.spec # dualrip_linux.spec / dualrip_macos.spec elsewhere ``` 单文件构建,捆绑了 Python、PySide6 和图标。`build_exe.bat` / `build_linux.sh` / `build_macos.sh` 为各个平台封装了相同的命令。 Linux 要求构建机器上安装了 `libportaudio2` 和 Qt xcb 库(参见 `.github/workflows/release.yml` 中的 `apt-get` 步骤)。 Windows、Linux 和 macOS 的预编译二进制文件可在 releases 页面获取。
标签:任天堂DS, 桌面GUI, 游戏开发, 漏洞挖掘, 逆向工具, 音频提取, 音频模拟器