仙剑吧 关注:63,467贴子:2,020,353
  • 7回复贴,共1

RIX 格式的分析与分离实践。

只看楼主收藏回复

https://www.bilibili.com/video/bv1VF411Y7WQ
此为快速烤出的视频!
仙剑1的音乐用了opl2 的特殊的打击乐模式,OpenMPT 不支持,就找了轩辕剑的代替测试了理论,成功!
众所周知,仙剑95版中有些音乐并没有midi版,所以98版中就少了那些音乐(好像是045?),现将rix格式打回原形(即.rol 和 .ins 文件)即可实现100%重置!!
不用看发帖时间! 现在是 12 20 年!(小尾数储存)
下面为图片

左边是轩辕剑的pattern(即.rol 的等效替代) 右边是4号乐器的参数,sbi 文件和.ins 文件等效。

这个是使用与仙剑95相同特殊打击乐模式的 大富翁2 的rix 转出的pattern,因为OpenMPT不支持,我现在还在抓脑袋,你可以明显看出并不是YM3812的常规9通道,而是12个通道。
https://www.bilibili.com/video/BV11g411K7rs?pop_share=1


IP属地:贵州1楼2021-11-08 18:11回复
    先来理一理一些基本事实吧。
    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 不支持 打击乐模式,要是碰到像仙剑那种用打击乐的还得抓脑袋一下。
    以此留存方式,望诸位多多分享,让圈内得出些更完美的“考古”结果!


    IP属地:贵州2楼2021-11-08 21:38
    回复
      2025-06-12 05:24:23
      广告
      楼主你好,我在网上下载的仙剑98版,运行游戏有切换rix和mid音频选项,可是买了steam版仙剑98,MUSIC文件夹里都是mid格式音频,结果进游戏还是rix格式,我就喜欢mid版的,请问怎么改成mid格式呢?


      IP属地:青海3楼2021-12-15 19:12
      收起回复
        现在steam版的98包含了rix版本音乐 游戏中发现98版打怪使用的是“风起云涌” 而mid里面并没有这首曲子,难道是使用的rix???


        IP属地:浙江4楼2022-08-05 13:37
        回复
          楼主,我就想怎么转换rix成mp3,能教个方法吗


          5楼2022-10-18 14:19
          收起回复