首页 >热点 > > 正文

东方Project原作BGM相关文件探究

哔哩哔哩 2023-07-02 21:07:44

本文使用Markdown语言编写,经转换为富文本后上传为专栏。


【资料图】

Markdown原文见 /posts/202307021905/ 。

(本文主要讨论的是弹幕作。格斗作不讨论。)

(没错,这是我的上一篇专栏的重写版本)

众所周知,原作的游戏大小多在400~500MB(除了体验版)。而游戏文件里最大的都是一个名为(体验版游戏中为thbgm_)的文件(th07+)或一个名为bgm的文件夹(th06)。显然这就是游戏BGM所在了。果然游戏只是音乐的载体而已。游戏BGM为什么这么大?它是如何储存的?本文将讨论原作BGM的相关文件格式。

目录

为什么BGM这么大——BGM音频部分的文件格式

还有一些信息去哪了——循环点与wav文件头的储存

红魔乡

妖妖梦及妖妖梦以后

名与实的联系——Music Room 中的曲名和文字

红妖永

花映冢

风神录

神灵庙

为什么BGM这么大——BGM音频部分的文件格式

不难发现东方红魔乡(搶曽峠杺嫿)的bgm文件夹里都是以th06_xx的格式命名的wav文件。嗯......这么pristine(原始)的不压缩的音频格式能不大吗......

而从东方妖妖梦起,bgm文件夹为文件所取代。文件格式变了吗?东方妖妖梦~东方花映冢的游戏里仍然把音频版的BGM音源叫做“WAV”,但改个后缀名直接扔进音频播放器会发现打不开。

由这篇文章 (/blumia/p/) 可知,把当成原始音频数据扔进GoldWave、Audition等软件里,便可以播放了。所以这个文件应该仍然包含wav格式的音频数据部分。

以星莲船的为例,扔进HxD Hex Editor里,可以看到这样的内容:

通过观察可以推测,文件的结构如下图所示。

本质上确实还是wav格式。

那么这就是“为什么BGM这么大”和“BGM如何储存”的全部答案。

全文终......ん?

你说游戏怎么从连续的音频数据里找到每一首曲子的位置?

曲子在游戏里不是循环播放的吗,游戏怎么知道这首曲子从哪到哪是循环部分?

原来的wav格式的文件头里还有那么多正常播放需要的信息(比如采样率、声道数、位深度),怎么在里没有?

难道这些是硬编码在游戏代码里了吗?

嗯......这些可能会改变的东西理论上不应该硬编码,尤其是循环点,肯定是每次都要改的。如果不在里,那么这一些应该放在了另外的二进制文件或者文本文件里。这样便于修改,还可以写个脚本一键生成,减少修改时的重复性工作。酒鬼正是设计了另外的文件来存放这些内容。

还有一些信息去哪了——循环点与wav文件头的储存

红魔乡

BGM仍然使用最原始的wav格式的红魔乡不存在文件头的问题,只需要解决循环点的问题。

用Touhou Toolkit中的thdat解包游戏目录下的紅魔郷,得到的除了midi格式的BGM以外,发现还有一些和BGM同名的th06_文件和一个。后者留到后面再做讨论,前者应该就是我们要找的循环点了。

以th06_为例,同样用HxD打开:

可以猜测,前一半是循坏开始点,后一半是循环结束点(顺便一提,数值的采用的字节顺序是小端序 [注1] )。Touhou Wiki上的有关信息 (/wiki/Technical_Information/BGM) 表明确实是这样:

loops in 紅魔郷/*.posFormat: <start sample>.4b <end sample>.4b

(你thb上的脚本对照表里怎么没有这个x)

这个"sample"是指什么?由这个帖子 (/p/4817367665/) 可以归纳出其数值的计算公式:

设曲目播放到第t秒时开始/结束循环.则循坏开始点/结束点的sample = 44100 * t(结果取整数)

显然44100即红魔乡所有曲目的采样率。

那么结合大学《计算机基础》(或者高中的《信息技术》)中音频数字化的相关内容 [注2] ,我们可以知道sample的取值n即表示“文件中的第 (n+1) 个采样点”。

所以我们现在知道了,红魔乡的BGM循环点用采样点表示,储存在紅魔郷里的th06_中。

妖妖梦及妖妖梦以后

这一部分就是这篇文章前两版的内容,自己看去。

妖妖梦起,游戏目录下的(xx为游戏编号,体验版游戏为thxx_)用thtk解包后会得到一个文件(体验版游戏可能是thbgm_)。

"fmt",不难想到wav文件头里的FormatChunk [注3] 。而我们刚才所说的wav文件“正常播放需要的信息”,其实就是wav文件头里的FormatChunk的数据部分。

以th19的thbgm_为例,这个也用HxD打开看看:

发现第三行确实就是完完整整的FormatChunk的数据部分,一点不差:

那其他内容呢?在HxD里可以看见,第一行对应的字符便是我们在红魔乡里见过的文件名格式:th19_

第二行则是循环点相关。具体见下面整个文件的结构。

在THBWiki上的脚本对照表 (/-/19gc/#FMT%E6%96%87%E4%BB%B6) 用了一个C语言的结构体来表示整个文件的结构,我觉得挺清晰的。唯一不清晰的点是没有对语言做任何标注,对C或类似编程语言不了解的人真看不出你在写什么。改了一下copy过来:

Touhou Wiki上的说明也贴上来,这个比较简洁:

设前奏或全曲时长为t秒,则对应 <intro length><total length>的计算公式:

至于 <start offset>,所谓的偏移量其实就是前面全部内容的length嘛。

因此,手动获取的话,可以采取前面提到的把当成原始音频数据扔进音频编辑软件里的做法。在软件中查看曲目开始的时间点的时间t,即为前面所有内容的时长t。但是注意代入公式的参数应与你打开文件时的设置一致,而不是里的参数。软件会把的文件头也当做音频数据,所以算出来的结果已经包含了文件头的长度。

但是,感觉不如写个脚本,生成的同时生成配套的。(

名与实的联系——Music Room 中的曲名和文字

现在来看看刚才提到的。在解包后的文件里也发现了这个。

试着用记事本打开红魔乡的。打开后可以看到......

嗯......Windows自带的记事本不管怎么翻新都是这么垃圾,在中文环境下打开Shift-JIS编码的文件会乱码。

换个编辑器打开就好了。

打开之后,可以发现主要是出现在Music Room里的文字,还有曲目对应的文件名。

推测应该是Music Room的曲目列表。

红妖永

对照着Music Room来看,在红魔乡中(也适用于妖和永):

那一行全角数字不知道有什么用。

格式大体上是:

文件名虽然写上了后缀.mid,但使用WAV音源时游戏应该会匹配同名的.wav文件。尝试将mid改成任意的3个字母,仍然能播放;但是改成非3个字母,在红魔乡里就不能正常播放,而在妖妖梦和永夜抄里可以正常播放。如果尝试删掉后缀名,红妖永都会发生崩溃。

另外,上面的无法正常播放的情况,仅限于在Music Room里无法播放。可以推测游戏进程中,以及标题画面中,BGM的读取并不受这个文件影响。

乐评正文的缩进是每行前敲一个全角空格实现的。

另外,在永夜抄里添加了"Now Playing"的提示。内容和 <乐评里的标题>是一样的。

花映冢中的小改动

可以发现相比红妖永少了一行 **<Music Room列表里显示的标题>**。因为Music Room里的样式改了。原来的 <乐评里的标题>不再显示在乐评中,只显示上方在“再生中”的文字旁,列表里的标题直接使用了“再生中”旁的文字。

缩进变为了每一句的开头用两个全角空格,句中换行用一个全角空格。

没有midi的曲目的后缀名仍然是.mid。后缀名相关特性同妖永。

(题外话:为什么花映冢Music Room里新加的暂停和淡出到后面又没了)

风神录中的小改动

前面添加了三行。

"#"是注释吗?似乎不是。全角数字那一行的内容变了,前面也加了个"#"。(数字里第1个0就是半角的,并不是我复制时候出错了。而且一直到兽王园这个半角的0都没改过来......)

随着MIDI音源的彻底移除,文件名的后缀改成了.wav。但后缀名相关特性仍同妖永花。

其余部分又回到了之前的三行的格式。但是原本的 <乐评里的标题>的格式继续用在列表中,现在的乐评中的标题前面加了个"♪"(于是在游戏里和正文对齐了)。

另外乐评中的空行上其实都有一个全角空格。没有全角空格的行读取时会被忽略。

神灵庙中的小改动

文件名的后缀去掉了。尝试加上后缀名无法正常播放,但不会崩溃,而是会播放标题曲。

列表中的标题的"No."与数字之间加了一个半角空格。

此外,尝试将疮痍曲加进来时,可以播放,但总是会显示为没有在游戏进程中播放过的曲目,如下图所示。暂时不知道游戏是怎么记录有没有播放过的。最后一行是我刚才说“#似乎不是注释”的原因。

[注1]: 将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。例如在这一处,值0x000409a7被记为了a7 09 04 00。后文提到的大端序则会反过来记为00 04 09 a7,和我们从左往右的阅读顺序一致。

[注2]: 在音频数字化的三个步骤“采样——量化——编码”中,“采样”时每秒采样的次数称为采样率。故采样率 * 秒数即表示使用这一采样率时,时长为这一秒数的音频包含的采样点个数。

[注3]: 该chunk开头三个字节便是字符"fmt"。

上一篇:42岁吉娘娘穿比基尼冲浪美翻!无赘肉身材让人羡慕,离婚后太潇洒 下一篇:最后一页
x
推荐阅读

东方Project原作BGM相关文件探究

2023-07-02

42岁吉娘娘穿比基尼冲浪美翻!无赘肉身材让人羡慕,离婚后太潇洒

2023-07-02

东莞虎门城管多向发力 扎实开展安全生产月系列活动

2023-07-02

潍坊核雕是用杏核做的还是桃核做的蚂蚁新村潍坊核雕今日答案7.2全新|环球简讯

2023-07-02

当前热点-7月3日温网开赛,中国选手首轮挑战不小

2023-07-02

韩国最大在野党举行抗议集会 反对日本强推核污染水排海

2023-07-02

焦点热议:小米手机出问题了可以向哪个部门投诉_怎样投诉小米手机质量问题简介介绍

2023-07-02

全球观点:60多家企事业单位600余岗位!阿拉善盟走进自治区高校“求贤引才”

2023-07-02

即时:有朝一日龙得水出处_有朝一日龙得水

2023-07-02

联想瑜伽7i Carbon推出:光面白色设计超薄机身智能功能 世界通讯

2023-07-02

中国中冶:2022年1-8月新签合同额同比增长5.9%

2023-07-02

全球热头条丨最了解东鹏饮料经营状况的人卖股票套现,引发股民质疑

2023-07-02

奔跑吧第十季每一期成员名单_第十季奔跑吧名单曝光

2023-07-02

建材行业纳入全国碳市场专项研究第一次工作会议召开|今头条

2023-07-02

【天天报资讯】打破传统母婴展会模式 Nicodad亮相CBME呈现沉浸式观展空间

2023-07-02

空军飞行员退休工资待遇(空军飞行员退休后待遇)

2023-07-02

简讯:健康之路IPO:用户量比肩京东阿里,又是一条大鱼?

2023-07-02

群众点赞社保自助服务好办事_全球微资讯

2023-07-02

宝可梦超级愿望:光与影的浑天仪(关于宝可梦超级愿望:光与影的浑天仪介绍) 世界视讯

2023-07-02

全球热点评!建设创新驱动平台“两链”融合“促进器”

2023-07-02

韩国驻沈阳领事馆签证_韩国驻沈阳领事馆

2023-07-02

中金:空调需求持续景气 企业上调未来排产预期

2023-07-02

全球观察:首届四川中小企业高质量发展大会举行 助推民营中小企业聚力合作

2023-07-02

口袋妖怪起源心金16倍经验作弊码有哪些

2023-07-02

7月份各地养老金调整方案将统一公布?不同地方上涨差距大吗? 世界独家

2023-07-02

山西多地发布高温橙色预警 各地加大喷洒降温力度

2023-07-02

消费券提升市场热度 天天播报

2023-07-02

各地广大党员以实际行动迎接中国共产党成立102周年 今热点

2023-07-02

我的世界科技枪mod仓库在哪

2023-07-02

韩国人是懂做游戏的! 《棕色尘埃2》除养成有点坑,其它高质量!-环球快资讯

2023-07-02

美媒发出警告:台海战争胜负已经敲定,美国“套路”在中国行不通

2023-07-02

路面更平整,通行更顺畅!他们积极探索社区治理新模式 每日焦点

2023-07-02

光大证券:复合铜箔首张订单落地,路线尚有分歧但技术迭代空间广阔

2023-07-02

第11届澳门国际旅游(产业)博览会开幕

2023-07-02

焦点精选!科创板IPO半年报:海通证券保荐募资额居首

2023-07-02

方国瑜文集 第5辑_关于方国瑜文集 第5辑简介 全球时讯

2023-07-02

海氧之家制氧机官网_海氧之家-当前滚动

2023-07-02

环球消息!一个「肌肉量」不足的人,代谢和寿命都会受影响

2023-07-02

热资讯!白地瓜是水果还是蔬菜?

2023-07-02

南通有什么好玩的 南通好玩的地方简述_天天讯息

2023-07-02

外媒:特朗普机密文件案或推迟至明年开审 辩方想在判刑前赢得大选撤案

2023-07-02

天天头条:技术对企业的发展具有什么重要意义_技术对企业发展的意义

2023-07-02

焦点精选!上半年徐州海铁联运已累计发送近 3700 标箱,同比增长 110% 以上

2023-07-02

格美净水器怎么样知乎 格美净水器怎么样 每日热点

2023-07-02

消息人士称,欧盟未能就电力市场改革达成协议,谈判将在7月继续进行。|热闻

2023-07-02

今日关注:为什么要坚持人与自然和谐共生走绿色发展道路 为什么要坚持人与自然和谐共生

2023-07-02

田间“志愿红”助农战“夏种”_当前资讯

2023-07-02

官三元遗址

2023-07-02

数学立体几何三棱锥外接球问题 一招解决高考立体几何外接球问题

2023-07-02

FIBA更新女篮半决赛最佳5人:韩旭17+15领衔 王思雨入选_环球热文

2023-07-02

房产证名字是不是人拥有_房产证名字有主次吗 环球速看

2023-07-02

内蒙古银行:取消发行“23内蒙古银行CD037”

2023-07-02

服装生产工艺流程与管理_对于服装生产工艺流程与管理简单介绍 全球今亮点

2023-07-02

陆家嘴:拟以发行股份方式购买陆家嘴集团持有的昌邑公司100%股权、东袤公司30%股权

2023-07-02

姚明被传身体不佳后现身 视频祝贺"明日之星"赛事

2023-07-01

天籁之爱李佳时_天籁之爱 萨顶顶

2023-07-01

破冰大亨官网在哪下载 最新官方下载安装地址 每日头条

2023-07-01

2023前海粤港澳台青年创新创业大赛正式启动

2023-07-01

VR+旅游,为文旅融合创新机遇!

2023-07-01

皇马科技: 皇马科技关于以集中竞价交易方式回购股份的进展公告 动态

2023-07-01

说尺子的中心论点_说尺子

2023-07-01

汽车会飞猜一种饮料打三个数字_汽车会飞猜一种饮料

2023-07-01

remotedesktop(关于remotedesktop的基本详情介绍)_快播

2023-07-01

两市近4000股收涨:沪指收复3200点关口,锂电池产业链普涨

2023-07-01

张恒远去世半个月,遗孀毕夏近况惹人心疼,开始工作赚钱养孩子

2023-07-01

金额大写的元怎么写_大写的元怎么写

2023-07-01

世界速递!亿缕阳光|不负人民

2023-07-01

绿萝卜怎么做 素炒绿萝卜的做法视频_绿萝卜怎么做 素炒绿萝卜的做法

2023-07-01

吉安市政府副市长陈庆寿督导食品安全“两个责任”落实情况

2023-07-01

每日观点:为期62天!2023年暑运正式开启

2023-07-01

资讯推荐:微纪录片|郭家沟新事

2023-07-01

飞利信6月30日盘中涨幅达5%

2023-07-01

业主委员会管理规约_物业管理委员会和业主委员会的区别

2023-07-01

2023安徽淮北市教育局直属学校引进中小学教师及高校毕业生体检考察公告

2023-07-01

今日快讯:畅通农食产品输华通道 中国深化中非互联互通

2023-07-01

服装工艺 第3版(对于服装工艺 第3版简单介绍)

2023-07-01

【午报】41股涨停!新能源赛道反攻 亿纬锂能涨超6% 世界观天下

2023-07-01

全国智能计算标准化工作组落户之江-全球微动态

2023-07-01

裕太微:千兆以太网物理层芯片已大规模出货

2023-07-01

《天涯明月刀》资料片《陆小凤》6月30日来临

2023-07-01

如何推进职业教育高质量发展?专家:深化产教融合同频共振

2023-07-01

荃银高科:6月29日融资净买入85.56万元,连续3日累计净买入550.56万元

2023-07-01

环球快资讯丨放贷人所得利息要交税吗(放贷人)

2023-07-01

科锐国际6月30日盘中涨幅达5%-世界快讯

2023-07-01

全球微头条丨北京普惠健康保和京惠保区别有哪些?

2023-07-01

雪佛兰科罗拉多ZR2价格和规格在美国宣布

2023-07-01

津兴铁路实现正线贯通按下开通运营“加速键”_环球快消息

2023-07-01

魔鬼身材的意思_魔鬼身材 网络流行语

2023-07-01

【环球聚看点】新华社权威快报丨2023年国家医保药品目录调整工作正式启动

2023-07-01

世界快资讯丨时隔 25 年,《银翼杀手 2033:迷宫》游戏新预告放出

2023-07-01

亚帆灯塔,点亮了! 全球通讯

2023-07-01

上浦高速建设忙 聚看点

2023-07-01

【当前独家】台风+降雨+高温,广西7月的天气“舞台”很热闹

2023-07-01

[新股]国科恒泰网上发行中签率为0.0361%

2023-07-01

速讯:富时中国A50指数期货盘初跌0.06%

2023-07-01

天天视讯!系我一生心番外_系我一生心

2023-07-01

焦点热文:上半年北交所IPO数量同比增长121% 常态化推进市场高质量扩容

2023-07-01

“死丫头”又来蹭热度,但这回依然很烂-当前热议

2023-07-01

天天观焦点:缙云丨王青海:满江红·瞻仰学习红岩精神有感

2023-07-01

世界热讯:6月29日基金净值:易方达智造优势混合A最新净值0.914,涨0.74%

2023-07-01