如何编辑一种水果机模拟器使用的声音文件?

逆向工程 拆卸
2021-07-07 16:27:15

我有两个具有扩展名的文件.P1.P2

这些文件是来自特定“真实世界”水果机(也称为老虎机)的 ROM 声音文件。

有一些水果机仿真软件 (MFME) 可以读取声音 ROM 文件和游戏 ROM 文件,以便在 PC 中重新创建水果机。

我正在尝试使用 MFME 的编辑器端创建自己的水果机,基于现有的水果机,并想在这台机器上编辑声音。

不幸的是,MFME 没有编辑声音文件的功能,只能读取它们。

声音 ROM 显然由所有声音组成,一个接一个地打包,在开始处有一张表格,指向每个声音文件的位置(许多短促的哔哔声、嗡嗡声、砰砰声等,正如您对水果机所期望的那样)。

有谁知道我需要用什么软件来编辑这些文件才能插入我自己的声音?我最初认为我需要一个反汇编程序,但是当我下载一个反汇编程序时它不会打开它们,因为它们不是 .exe 或 .dll 文件(我尝试更改文件的扩展名,但反汇编程序仍然知道它们不是正确的文件类型)。

我怎样才能对这些文件进行逆向工程以编辑它们?有任何想法吗?

谢谢。:-)

1个回答

MFME源代码可阅读。

您可能希望从 interface.cpp 开始,它具有决定加载哪种声音格式的大部分逻辑TForm1::Load(String)从外观上看,至少有十种左右的不同格式。

然后,您可以查看sample.cpp哪个具有加载文件的实现。LoadJPMSound是特别有趣的,但还有其他格式需要考虑。

以下是 JPM 声音的关键事实:

  • 文件以 1 字节样本计数前缀开头(所以我猜最多 255 个样本?)
  • 接下来是一个 4 字节的幻数 (0x5569A55A)
  • 之后是某种页表,它描述了 ROM 中声音数据的地址。
  • 每个音频“页面”在开头都有一个 1 字节的标志值。两个 MSB 指定声音的种类。
    • 00 表示静默,其中字节的其余部分(即flag & 0x3F)指定静默应以 20 个样本为增量持续多长时间。此处的零值表示空音频样本。
    • 01 表示有 256 个“半字节”音频。我不确定这是否意味着 4 位值,但我在解码中没有看到任何位操作。采样率设置为 160000 除以标志值的余数加 1。
    • 10 表示与上述相同,除了“半字节”的数量存储为标志后的一个字节。
    • 11 表示样本是一个重复循环。重复次数计算如下(flag & 0x7) + 1

对于 YMZ 样本,该文件包含 250 个样本条目,每个条目包括:

  • 16 位屏蔽样本计数,计算为 count = (((value & 0xFF00) >> 8) / 6) * 1000
  • 缓冲区指针的高字节。
  • 样本指针的高字节。
  • 缓冲区指针的中间字节。
  • 样本指针的中间字节。
  • 缓冲区指针的低字节。
  • 样本指针的低字节。
  • 以下格式的示例数据:
    • 4 位 YMZ280B 格式样本数据(通道 A)
    • 4 位 YMZ280B 格式样本数据(通道 B)

YMZ280B 格式是基于步进的格式,其中波形中的每个下一个信号值都被编码为与前一个信号值的差异(或第一个样本为 0)。4 位值是包含可能步骤的查找表的索引: 步骤 LUT 计算如下:

// nib from 0000 to 1111
for (nib = 0; nib < 16; nib++) {
    int value = (nib & 0x07) * 2 + 1;
    diff_lookup[nib] = (nib & 0x08) ? -value : value;
}

这应该会让你开始。源代码应该让你剩下的。