drewmerc302/valeton-gp50

GitHub: drewmerc302/valeton-gp50

基于逆向工程 MIDI SysEx 协议的纯浏览器端 Valeton GP-50/GP-5 效果器预设编辑器,支持通过 WebMIDI 实时读写和管理设备音色。

Stars: 2 | Forks: 0

# Valeton GP-50 编辑器 这是一款基于浏览器的 **Valeton GP-50**(以及 GP-5)编辑器,通过从零开始 逆向工程解码设备的 MIDI SysEx 协议构建。它通过 **WebMIDI** 实时读写设备 —— 无需厂商 SDK,无需驱动,无需后端。 **在线演示:** [valeton-gp50-woad.vercel.app](https://valeton-gp50-woad.vercel.app) —— 零配置,完全在浏览器中运行。支持 Chrome 或 Edge,踏板通过 USB 连接。 **功能简介:** - **Preset 浏览器** —— 读取已连接踏板上的所有 preset;展示每个 preset 的完整信号链, 区块标签根据类型以颜色区分。 - **实时编辑** —— 在浏览器中编辑 preset 的区块、模型和参数; 修改会通过 WebMIDI 直接同步到踏板。 - **模型选择器** —— 使用 Valeton 官方硬件名称替换任何区块的模型, 而不仅仅是内部 ID。 - **重命名 Preset** —— 编辑 preset 的名称并将其写回设备。 - **Preset 与区块重排** —— 拖动以重新排列 bank 中的 preset,或 preset 信号链中的区块;每次重排都是一次批量且最小化的写入操作。 - **清除 Preset** —— 将某个槽位重置为出厂空白 preset。 - **Captures 与 IRs 浏览器** —— 展示设备上的所有 SnapTone capture 和用户 IR, 以及可复用的模板。 - **Capture 使用情况查询** —— 选择一个 SnapTone 或 IR,准确查看哪些 preset 引用了它。 - **基于 Capture 构建 Patch** —— 将模板的效果链封装在 SnapTone/IR 外围,并将结果写入槽位。 - **从 Preset 创建模板** —— 将任何 preset 的效果链保存为 可复用的模板。 - **Preset 转换器** —— 在客户端完全实现 GP-5 和 GP-50 格式之间的 `.prst` preset 文件转换。 以上所有功能均在客户端运行。在线演示即为完整应用;本地 FastAPI 服务器([设置](#setup))仅用于开发和仓库内旧版的 NAM 转换器。 ## 将 NAM captures 导入踏板 **该功能已迁移至独立项目: [nam-a2a1-converter](https://github.com/drewmerc302/nam-a2a1-converter)** —— 一款独立的 桌面应用(支持 Windows / macOS / Linux,可选 NVIDIA 加速)。 **[下载发布版 →](https://github.com/drewmerc302/nam-a2a1-converter/releases)** GP-50 仅支持 NAM **A1**,且无法进行 A2 到 A1 的格式降级 —— 它们属于 不同的神经网络架构,因此权重无法直接转移。该转换器采用的是**蒸馏**(distill)方式: 通过 A2 模型渲染一段 DI(直录信号),然后训练一个 A1 模型来重现该输出。 它不依赖于特定设备,因此可为任何仅支持 A1 的设备或插件提供服务,不仅限于 GP-50。 本仓库仍然保留了该引擎的前身(`a2a1/`,已接入本地应用中), 但你实际需要使用的是独立的转换器。 ## 截图 | | | | --- | --- | | ![Preset 浏览器 — 包含区块标签的完整 preset 列表](https://static.pigsec.cn/wp-content/uploads/repos/cas/c9/c99ac59c60c82a962c09425e38e0c8be53afab950cd06d7bf5844c68eb5442af.png) **Preset 浏览器** — 展示踏板上的每个 preset,区块标签根据类型以颜色区分。 | ![Preset 详情 — 信号链、区块参数、实时编辑](https://static.pigsec.cn/wp-content/uploads/repos/cas/b6/b63380c718083eb46a938d0bbee440a963d6a6d891927c25bd9fccc42a2418fd.png) **Preset 详情** — 完整信号链,区块参数,实时直接同步到踏板。 | | ![模型选择器 — 区块的官方硬件名称](https://static.pigsec.cn/wp-content/uploads/repos/cas/5e/5ed122ec44e55aace4d80df139bc9e8e9b01ca347407a8f2ee5ca32bf0a54ba7.png) **模型选择器** — 替换区块模型,包含官方硬件名称。 | ![Captures 与 IRs — 模板与 SnapTone captures](https://static.pigsec.cn/wp-content/uploads/repos/cas/50/507523231ed84f59d248abdf88d62ab273a5f5d90a780a11c0157ef56082bd7c.png) **Captures 与 IRs** — 已保存的模板以及设备上的每一个 SnapTone capture。 | | ![SnapTone 使用情况 — 哪些 patch 引用了该 capture](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/09fc92b13704afaa7985e7ae1d1e015e0db9d278d946b9e6196bd2c879dedd8d.png) **Capture 使用情况** — 准确查看哪些 patch 引用了该 SnapTone。 | ![基于 capture 构建 patch](https://static.pigsec.cn/wp-content/uploads/repos/cas/3e/3ef39d0f384f2f9e3dfafd3eab36ded1aab3c0667b1cacfb76e9b1d61b0ab7e4.png) **构建 Patch** — 将模板封装在 SnapTone 外围并写入槽位。 | | ![从 preset 创建模板](https://static.pigsec.cn/wp-content/uploads/repos/cas/d9/d97d36ca0bcf096a3f909da4627c92539aeae37dbe4c322e18d8af9a6908d6f6.png) **创建模板** — 将任何 preset 的效果链保存为可复用的封装。 | ![Preset 转换器 — GP-5 到 GP-50 转换](https://static.pigsec.cn/wp-content/uploads/repos/cas/4c/4cd4f7592f5412aeff276c84f7e30ad5eedf8329e2ab4005be5e5998375d6875.png) **Preset 转换器** — 在 GP-5 和 GP-50 之间转换 `.prst` preset。 | ## 设置 使用该应用无需进行以下任何操作 —— 直接打开 [在线演示](https://valeton-gp50-woad.vercel.app)即可。本地设置仅供开发使用。 ``` cd /Users/drewmerc/workspace/valeton # web app venv python3 -m venv .venv-app && ./.venv-app/bin/python -m pip install fastapi "uvicorn[standard]" python-multipart pytest httpx ```
可选:仓库内的 NAM 引擎(已被 nam-a2a1-converter 取代) ``` # engine venv (A2 render + train + 0.7.0 export;0.5.x 通过 in-process transcode) python3 -m venv .venv && ./.venv/bin/python -m pip install -r a2a1/requirements-a2.txt # NAM 0.13.0 ``` 只需一个 venv,而不是两个 —— 请参阅 [`a2a1/README.md`](a2a1/README.md) 了解为何移除了 旧的第二个 venv。默认的 DI 是 `refs/v3_0_0.wav`(官方 NAM 输入)。可以通过 trainer 获取,或者生成一个合成的备用版本: `./.venv/bin/python a2a1/make_di.py refs/v3_0_0.wav`。
## 运行 ``` ./run.sh ``` 然后打开 **http://127.0.0.1:8756**。 - **Preset 浏览器 / Captures 与 IRs:** 通过 WebMIDI 连接踏板(Chrome/Edge, HTTPS 或 localhost),扫描,并实时浏览/编辑真实设备数据 —— 请参阅 上方列出的各项功能。 - **Preset 转换器:** 拖入一个 `.prst` 文件,在 GP-5 和 GP-50 格式之间进行转换。 - **NAM 转换器:** 仅存在于本地构建版本中,且需要配置上述引擎的 venv。 托管版本改为链接到独立的转换器。 ## 测试 ``` ./.venv-app/bin/python -m pytest app/tests -q -m "not slow" # fast unit/API/frontend suite ./.venv-app/bin/python -m pytest app/tests/test_e2e.py -q -s # slow: real headless browser conversion + screenshots ``` ## 目录结构 - `app/` —— FastAPI Web 应用 + WebMIDI 前端(设备 I/O、解码器、编辑器 UI)。 - `a2a1/` —— GP-50 MIDI 逆向工程工具,以及原始的 A2 到 A1 引擎 ([README](a2a1/README.md));最终发布的转换器现存放于 [nam-a2a1-converter](https://github.com/drewmerc302/nam-a2a1-converter)。 - `docs/`、`re/`、`design/` —— 协议说明、逆向工程 captures 及格式研究。 - `refs/` —— 示例模型 + DI 输入。 - `MVP_REQUIREMENTS.md`、`AUTONOMY.md`、`STATUS.md` —— MVP 规范、构建循环 协议以及实时构建状态。 ## 许可证 [MIT](LICENSE) ## 适用范围 设备的实时读写(浏览器、实时编辑、重排、重命名、清除、capture 使用情况查询、 构建/创建模板)均通过逆向工程实现,并可在 WebMIDI 上正常运行。仅当你通过 浏览器或 Captures 与 IRs 页面显式连接并扫描/写入时,应用才会与物理踏板通信。
标签:SysEx协议, WebMIDI, 前端工具, 数据可视化, 硬件控制, 逆向工具, 音乐设备控制