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,按归档分组:

浏览 SDAT,使用内置播放器预览音效(支持定位、暂停、在声音自身的循环点上循环):

带有全长进度条和实时播放的音乐序列:

带有逐项日志、循环点和 bank 自动解析说明的批量导出:

## 用法
```
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, 游戏开发, 漏洞挖掘, 逆向工具, 音频提取, 音频模拟器