sloptainment/slopgs
GitHub: sloptainment/slopgs
该项目是 Microsoft GS Wavetable Synth 的可移植重实现版本,基于 C 和 WebAssembly 还原经典 MIDI 音色合成。
Stars: 1 | Forks: 0
= slopgs
:sectnums:
这是对 `swmidi.sys`(即 _Microsoft GS Wavetable Synth_ (MSGS))的一个 [.underline]#凭感觉重写#。现在
很可能已经有类似的东西了——如果是这样的话,我也不会感到惊讶。
我只是来凑个热闹。
请注意,这*不是*反编译。它的目标不是
1:1 地编译出一个软件驱动程序,而是提供 **一个可移植的实现**
来还原经典的 MIDI 音色™。
目前在我的 https://zumi.neocities.org/stuff/midi/[MIDI 页面] 中安装了一个演示。
欢迎提交人工或 LLM 辅助的 PR。
提交 issue 时,请使用 `compare-*.html` 工具来辅助说明。
== 如何使用这个东西
=== 需要准备的东西
. 一个 C 编译器(已测试:GCC) - 用于编译 `msgs-render` 工具。
. Clang - 用于编译 `msgs.wasm`
. Asciidoc(可选) - 用于编译文档
. Python - 用于运行探测器生成程序。
. `dist/gm.dls` - 从你的 `C:\WINDOWS\system32` 获取
. `field/*.mid` - 任何你想要测试的真实 MIDI。
. `field/*.flac` - 你需要提供参考渲染音频,与对应的 `.mid` 文件配对
=== 构建
. 在项目根目录下运行 make。
. 尝试使用 `dist/msgs-render dist/gm.dls your.mid 1 999999 your.wav` 导出音轨
=== A/B 测试
## . 挑选一个真实的 MIDI,如果可用的话,使用 Windows Media Player
和立体声混音进行录制。
. 将其导出为与 MIDI 同名的 FLAC 文件(例如:
`mylittlething.mid` 对应 `mylittlething.flac`)并存入 `field/` 目录
. 确保你已经运行了 `make dist/msgs.wasm`。
. 使用文本编辑器编辑 `dist/compare-field.html`:
+
[source,diff]
(() => {
const STEMS = [
+ "mylittlething",
- "onestop_extract",
- "serum_opening",
- "corridor",
- "CrystalOscillator",
- "eek_the",
- "flourish",
- "HueArme-Weekend",
- "Kot_and_A64-GENERAL_SERUM",
- "onestop",
- "Strobe-faffaeefafaefae",
- "town",
];
--
. 在项目根目录下运行一个静态文件 Web 服务器:
+
## [source,sh]
## python -m http.server
. 访问 `http://localhost:/dist/compare-field.html`。你应该会看到
一系列包含所列 `STEMS` 的卡片。
. 点击 `Load and compare`,就会弹出一个精美的频谱图。你可以
缩放、点击、播放它等等。如果你认为
某个问题用波形图展示更清楚,那里也有波形视图。
=== 探测器
## . `artifacts/probe-results` - 将 `artifacts/probes` 中的 MIDI 录制为 FLAC 并放在这里。
. 在项目根目录下运行一个静态文件 Web 服务器:
+
[source,sh]
## python -m http.server
. 访问 `http://localhost:/dist/compare-probes.html`。
== 免责声明
我不能声称:
* 对其进行了逆向工程;这是 LLM 做的。
* 编写了代码;这也是 LLM 做的。
* 它是“我的”;_我_ 在这方面做的工作很少。
...所以我不认为我可以为它附加一个 `LICENSE`。但我_可以_声称:
* 指导了它。
* 筛选了结果。
* 至少写了这个 `README`。我有一个 https://en.wikipedia.org/wiki/Compose_key[Compose 键]。
那么我能说我_发现_了它吗?我不知道。但我
_知道_ 的是 **我期盼这东西已经有一阵子了**。现在,我拥有了它。你也可以拥有
它。
至少它能_几乎_准确地播放 GENERAL SERUM...
== 重新实现了什么
Windows XP Service Pack 3 的 `swmidi.sys`:``5.1.2600.5512
(xpsp.080413-2108)``
如果可能的话,我可能会将其与 Windows 98 和 Windows 10 附带的
驱动程序版本进行比较。
它们将作为编译时的条件编译选项。
== 为什么...
=== 你为什么要做这个?
我刚好有个空闲的周末。面对这个崭新的世界,
我尝试了 LLM——或者说,只是尝试了_某一个特定的_ LLM。
它已经做过:
* https://github.com/zoomten/shi-kong-xing-shou[一个反汇编项目]... 好吧,不管怎样算是给它加了火箭。
* 一个包含了我所有想要的完整 GB 模拟器
我觉得实现一些 Matt Montag 在给我的一封电子邮件中提到过的东西会很有趣:
[quote, Matt]
\……如果有一天能加入一个完整的 MSGS 模拟作为合成器引擎,那就太棒了..
[quote, 我]
哈哈,确实。我觉得一个能在任何地方运行的 MSGS 克隆合成器绝对会很惊艳。
现在是当前年份,它终于来了。
技术多多少少让我感到有些害怕。
=== 为什么你要动用那些吞噬资源的怪物?
在看到它的能力之后,我很遗憾地对这些东西上瘾了。
我周围的大多数人非常理解为什么现在 LLM 的使用率如此之高,
但我仍然忍不住感到纠结。
它加速了反编译工作,并创造出了我梦寐以求的模拟器。
这一次,它又帮我实现了另一个梦想。
这真的有点让我害怕。
== 你是怎么做到的?
一开始我给了它:
. 实际的文件,`swmidi.sys`。
. 为其设计的 `gm.dls` 文件。
. 我关于 MSGS 的网页、Furmilion 的 MSGS 研究资料,以及 BotB 上关于 MIDI 的页面。
. 我的 MIDI 页面,用于替换其中的内容。
. 一份计划,上面写着:
.. 反汇编 `swmidi.sys` 并生成一份 `SPEC.md`。
.. 根据这份 `SPEC.md`,指派一个 Agent 将其实现为 C 语言合成器,并提供一个 wasm 构建版本。
.. 用一个加载了这个 wasm 化 MSGS 的最小替代方案,替换我网页上的 `bg-sound.js`。
它给了我一些探测器 MIDI。这是一些用于判断重采样器到底是什么的小型支线任务:`kmixer`、`portcls`、`ks`、`sysaudio`,而最终事实证明只要合成器原生渲染到 22050 Hz,这些其实都无关紧要……
我让计划循环运行了一整夜,第一版就完成了。最初的声音
有些颤抖。我没有立刻将它记录在版本控制中,
但是每一个音符都没有停止。不过,它*可以被认出*是衍生自 MSGS 的。
有很多东西它只能从代码中推断,但使其成为 MSGS 的道路在于倾听,以及由我指出哪里可以改进。
从那以后,这就是一场微调的游戏。[.underline]#80% 的工作大概花了 3 个小时。而真正起决定性作用的是最后的那 20%,那才是最耗时的部分。#
我觉得自己就像那些 ROM 黑客一样,
在模拟器精确度上瞎折腾,并且从一开始就拒绝接受“不精确的模拟器”,
也不管这种所谓的精确性是否真的有意义。
顺便说一句:*所有的模拟器都是幻想主机!* 只是它们“幻想”的程度
有所不同 :)
=== 目前我测试过的内容
* 我自己那些无聊的 MIDI
* Kot & A64 - GENERAL SERUM
* Strobe - faffaeefafaefae
* HueArme - Weekend
* furmillion 未完成的 Crystal Oscillator
* flourish, town, onestop
标签:AI工具, MIDI, WebAssembly, 多媒体, 客户端加密, 波表合成, 逆向工具, 音频处理