關(guān)于東方原作(限彈幕作)的thbgm.fmt
零、建議閱讀新版
本篇專(zhuān)欄的內(nèi)容為舊版,僅留作存檔,建議閱讀新版本。
新版本中本文內(nèi)容經(jīng)過(guò)重新整理,且新增了紅魔鄉(xiāng)的BGM循環(huán)點(diǎn)、thbgm.dat、Music Room樂(lè)評(píng)musiccmt.txt等的相關(guān)內(nèi)容。
一、什么是thbgm.fmt?
從東方妖妖夢(mèng)起,wav格式的游戲BGM被儲(chǔ)存在游戲主程序同級(jí)目錄下的thbgm.dat中(限彈幕作)。但文件中只儲(chǔ)存了采樣數(shù)據(jù),不包含各BGM的循環(huán)點(diǎn)以及wav文件頭,這些內(nèi)容被儲(chǔ)存在了thbgm.fmt中。(請(qǐng)區(qū)分這兩個(gè)文件)
thbgm.fmt可以通過(guò)使用thtk(Touhou Toolkit)中的thdat解包游戲主程序同級(jí)目錄下的thxx.dat獲得(xx為游戲編號(hào))。它是一個(gè)二進(jìn)制文件,可以使用HxD等十六進(jìn)制編輯器打開(kāi)。

二、文件的內(nèi)容
1.簡(jiǎn)述
文件由多首BGM的數(shù)據(jù)依次串聯(lián)而成。
2.格式
單首BGM的數(shù)據(jù)遵循如下格式。

3.對(duì)格式的說(shuō)明
(1).上面的偏移地址是相對(duì)的,將該首曲目文件名部分第一字節(jié)視為00H。
(2).文件名部分使用ASCII編碼。該部分內(nèi)容如果修改,會(huì)導(dǎo)致游戲不能正常讀取BGM(即使只是交換了兩首曲子的文件名)。文件名通常短于16字節(jié),如th18_08.wav為11字節(jié),剩余5個(gè)字節(jié)在文件名部分的末尾以0補(bǔ)齊。
(3)10H~1FH部分為循環(huán)點(diǎn)數(shù)據(jù)。
(4).起始點(diǎn)指的是曲目起始點(diǎn)在thbgm.dat中的偏移地址。
(5).循環(huán)開(kāi)始點(diǎn)、循環(huán)結(jié)束點(diǎn)的單位均為字節(jié)。這三個(gè)時(shí)間點(diǎn)是相對(duì)于起始點(diǎn)而言的,即它們的值是以它們?cè)趖hbgm.dat中實(shí)際的偏移地址分別減去起始點(diǎn)得到的。
(14H~17H的作用尚不明確)
(6).20H~33H部分為wav文件頭數(shù)據(jù)。該部分內(nèi)容需要與thbgm.dat中的采樣數(shù)據(jù)相對(duì)應(yīng)。原版中東方神靈廟的靈界BGM的wav文件頭與其他BGM有差異(主要是采樣率不同導(dǎo)致的不同)。
(7).格式種類(lèi)的值一般為1,表示使用線(xiàn)性PCM編碼。
(8).采樣率的單位為Hz;采樣深度的單位為bit。
(9).除了文件名部分以外,其它數(shù)據(jù)內(nèi)容的儲(chǔ)存遵循小端格式,例如:原版東方虹龍洞中第二首曲目的起始點(diǎn)為0x1281230,則實(shí)際上在十六進(jìn)制編輯器中應(yīng)記作“30?12?28?01”。第四個(gè)字節(jié)的“0”是將0x1281230補(bǔ)齊為0x01281230得到的。
(10).在最后一首曲目的數(shù)據(jù)后面,除去本身末尾的4個(gè)為0的字節(jié),總是有17個(gè)為0的字節(jié)。
(11).一些數(shù)據(jù)的計(jì)算:
時(shí)間點(diǎn)對(duì)應(yīng)偏移地址=時(shí)間點(diǎn)秒數(shù)*每秒字節(jié)數(shù)+文件頭長(zhǎng)度
注:原版thbgm.dat存在16字節(jié)的文件頭。如果時(shí)間點(diǎn)秒數(shù)是將原版thbgm.dat以原始數(shù)據(jù)格式導(dǎo)入Audition等軟件得出的,則不需要考慮文件頭長(zhǎng)度。
每秒字節(jié)數(shù)=采樣率*每次采樣字節(jié)數(shù)
每次采樣字節(jié)數(shù)=聲道數(shù)*采樣深度
注:采樣深度在此處的計(jì)算中使用的單位為字節(jié),而thbgm.fmt中采樣深度的單位為bit,請(qǐng)注意單位換算。