先来理一理一些基本事实吧。
Rix 格式的音乐从百度百科上看来是使用小尾数法储存的388h 指令,这点可以从
http://www.doczj.com/doc/3c9e9f18a8114431b90dd891-2.html 得到印证。 我查了许多资料,其中有一篇文章提到“只需将rix文件写入388h即可发声”,但现在找不到来源,姑且认为这就是软星播放的方式。
388h 是IBM 兼容机上的一个常用声卡Adilib card的默认端口,这个声卡使用的是YM3812,当时雅马哈较低端的2op FM 合成器,大部分软件习惯只交代388h,实际上389h也是需要以达成控制YM3812。此后来者 创新 通过直接克隆电路的方式兼容了adilib card,并且加入了数字音频播放、手柄接口等功能来快速取代了adilib card 使得声霸卡及其标准迅速统治了IBM 兼容机的声卡市场,这就是为什么会在YM3812 上 同时出现 .rol + .ins 和 .mid + .sbi 格式的原因,是两个统治者的遗产。
因为早期计算机资源十分有限,不可能像街机那样直接将YM3812 链接在
ISA 总线上,那样既不可靠(ISA总线速度太快,噪音大),又占用大量io线,且无法满足ISA 地址解码等必须控制,所以adilib 在YM3812 和ISA 总线间加入地址解码电路,使得adilib card 只监听ISA 端口 388 ,当程序向388h 写入一个由adilib硬件决定的指令集时,那些74原件就会解码并转发数据到YM3812 的寄存器。
(歪路1:这个指令集也并不是x86 系的机器码,我用IDA 看过了……)
因此,必须理解一个重要的点,RIX文件纪录的通过388h 操作 YM3812 寄存器的指令。现流行的解析OPL音乐的方式,大多是直接看YM3812的寄存器,因为你可以直接到yamaha去下载他们的寄存器参数,为此,必须要先对RIX文件进行第一步转化,也就是要将其从寄存器操作,变成寄存器数据。
晕了吗?我反正晕了!
那要怎么完成这个任务呢? 如果是在80-90 年代的话,我会找个逻辑分析仪连接在 74HC 系列原件和YM3812 间看总线和地址线的变化,90年代的话OPL3(ym262)可以直接实时读取寄存器参数,那现在呢?
DosBox 横空出世!
将.rix 从左变为.dro (即388h 指令变为寄存器的 1000hz dump)

此时就可以对照着雅马哈的数据表一个音符一个音符的重构了…………或者是吗?
这样虽然可行,但不止工作量大,出错的可能性也极端的高。基本不实用。
为此我暂停许久…………直到近日我在“科幻 学习 上进 网络”途中,看到了国外论坛对另外一种格式 .imf (我 被 开

)
https://keenwiki.shikadi.net/wiki/IMF ID Software Music Format. 的探讨
https://www.lemmingsforums.net/index.php?topic=1840.0我才大雾

!!!!
这个格式和rix 大同小异,只不过 rix是直接dump,imf给其修饰了下,但imf已经有工具直接识别寄存器参数,然后比较乐器参数,导出乐谱为 .mid
而且支持.dro!!!???
赶紧试了一下!

henhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh?
看起来DosBox 的DRO 还分版本?
没关系,imf维基上还有一个.dro2imf 转化工具。(左为.imf 右为.dro)

精彩刺激的找你M开始了!看看那里不同,指向大屏幕如果你发现了不同。
然后?!
----------------------------------------------
以下为日志
-----------------------------------------------
PS C:\Users\liu\Desktop\rix\dro2midi-1.5-win32> .\dro2midi.exe .\49.9.imf 48.952.mid
Input file appears to be in IMF type-0 format.
File extension is .imf - using 560Hz speed (rename to .wlf if this is too slow)
Using conversion constant of 49716.0
// Ch01 <- Inst#067 @ line 127: Marimba [13]
** New instrument in use on channel 2
** Copy this into inst.txt to assign it a MIDI patch:
NO 11-31/2D-00/C8-F5/2F-F5/0C/00-00: patch=?
>> Using similar match: Inst#270 @ line 384: Electric Guitar (muted) [29]
// Ch02 <- Inst#270 @ line 384: Electric Guitar (muted) [29]
** New instrument in use on channel 7
** Copy this into inst.txt to assign it a MIDI patch:
NO 4E-48/0F-06/20-2F/F1-05/02/00-00: patch=?
>> Using similar match: Inst#055 @ line 110: Oboe [69]
// Ch07 <- Inst#055 @ line 110: Oboe [69]
(此处省略超过5k字)
// Ch01 <- Inst#018 @ line 66: Gunshot [128]
// Ch01 <- Inst#067 @ line 127: Marimba [13]
// Ch01 <- Inst#018 @ line 66: Gunshot [128]
// Ch01 <- Inst#067 @ line 127: Marimba [13]
// Ch01 <- Inst#018 @ line 66: Gunshot [128]
Conversion complete. Wrote 48.952.mid
Total pitchbent notes: 1179
Total notes: 1179
Notes still active at end of song: 0
--------------------------------------------------------------
日志结束
----------------------------------------------------------------
此时得到了一个 48.952.mid 的文件,这里面纪录了音乐的乐谱。
等等!
** Copy this into inst.txt to assign it a MIDI patch:
NO 11-31/2D-00/C8-F5/2F-F5/0C/00-00: patch=?
>> Using similar match: Inst#270 @ line 384: Electric Guitar (muted) [29]
// Ch02 <- Inst#270 @ line 384: Electric Guitar (muted) [29]
这是什么玩意?

也就是说 NO 11-31/2D-00/C8-F5/2F-F5/0C/00-00 这是YM3812 的乐器参数
此处省略几千字关于 .ins 和 .sbi 乐器格式的研究,感兴趣我再发吧。结论就是
NO 11-31/2D-00/C8-F5/2F-F5/0C/00-00 等效于 这个sbi文件(红框内是sbi文件的有效值)

这里有个恶心的点,请注意看偏移地址46、44 45,即倒数第二行的 14 、12 13 列,其和软件列出的 /0C/00-00 刚好是相反的。
还有些乐器,软件已知是和GM 中那些乐器相近音色的就会直接映射,如下。
// Ch01 <- Inst#067 @ line 127: Marimba [13]
没关系,到其目录下找inst.txt 文件 中的第127 行

等效于 sbi 文件中有效值部分 32 11 44 00 F8 F5 FF 7F 00 00 0E
如此就可以得到.rix 文件中包含的 .ins 文件
用OpenMPT 整理整理即可得到
链接:
https://pan.baidu.com/s/1SXBejhbR6w6TfZDQYvW7kw 提取码: wjmi 复制这段内容后打开百度网盘手机App,操作更方便哦
用OpenMPT 打开。
这个过程中得到的铺子是接近100%完整的(有些神奇到不能再神奇的pitch bent 可能要手动调一下),乐器也是。
不过因为OpenMPT 不支持 打击乐模式,要是碰到像仙剑那种用打击乐的还得抓脑袋一下。
以此留存方式,望诸位多多分享,让圈内得出些更完美的“考古”结果!