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, 多媒体, 客户端加密, 波表合成, 逆向工具, 音频处理