Advertisement
loveemu

Hudson SFX SOUND DRIVER (SBM5, 3) SPC Music Spec (日本語)

May 26th, 2013
762
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.83 KB | None | 0 0
  1. ===========================================================================================
  2. HUDSON SFX SOUND DRIVER (スーパーボンバーマン5 他) SPC音楽解析情報
  3. ===========================================================================================
  4. (2013-05-31 更新)
  5. 転載・改変自由
  6.  
  7. 本書はスーパーボンバーマン5の音楽データに関して解析結果を記したものです。
  8. 内容は一定の裏付けを取っているはずですが、間違いがあるかもしれません。
  9.  
  10. また、他のスーパーボンバーマンシリーズや、
  11. 同種のサウンドドライバが使用されているゲームにも言及します。
  12.  
  13. 解析対象は SPC700 側のみで、ROM 側は一切見ていません。
  14. 今後も見ることはないと思います。
  15.  
  16. 汚いコードですが、解析時に作成した MIDI コンバータ(hudspc) が下記にあります。
  17. https://code.google.com/p/loveemu/
  18.  
  19. 解析には SNES SPC700 Player と、外部 Memory Viewer (SPCMEM) が便利でした。
  20. http://dgrfactory.jp/spcplay/
  21. https://code.google.com/p/gochaism/
  22.  
  23.  
  24. □ 概要
  25. =======
  26.  
  27. 本書で取り扱うハドソンのドライバは SFX SOUND DRIVER と呼ばれています。
  28. ドライバの特徴として、APU RAM にバージョン文字列が埋め込まれていることが挙げられます。
  29. 例:SFX SOUND DRIVER Version 1.16 Copyright(c) 1993,94 Hudson Soft Program : LU.Iwabuchi Driver : Kazumi-TYPE
  30. (ただしスーパーボンバーマン2など、バージョン文字列が埋め込まれていない場合もある)
  31.  
  32. 少しずつ異なったバージョンが多くありますが、
  33. 基本的には Version 1.xx 系 と Ver 2.xx 系に大別することができます。
  34.  
  35. SFX SOUND DRIVER を使用しているゲームは下記のとおりです。
  36. (他にもあるかもしれません)
  37.  
  38. No Version String
  39. Super Bomberman 2 (1.xx 互換)
  40. Hagane (1.xx 互換)
  41. An American Tail: Fievel Goes West (1.xx と 2.xx の中間?)
  42. Version 1.xx
  43. Super Bomberman 3 (1.16)
  44. Super Genjin 2 (1.16E)
  45. Caravan Shooting Collection (1.17s)
  46. Version 2.xx
  47. Do-Re-Mi Fantasy (2.10)
  48. Tengai Makyou Zero (2.27b)
  49. Super Bomberman 4 (2.28)
  50. Kishin Douji Zenki 3 (2.28)
  51. Same Game (2.30a)
  52. Super Bomberman 5 (2.32)
  53. Bomberman B-Daman (2.32)
  54.  
  55. 本書では Ver 2.xx 系の代表として、
  56. スーパーボンバーマン5の解析情報を示した後に、
  57. Ver 1.xx 系の情報として、スーパーボンバーマン3を例に差異を示します。
  58.  
  59. □ 全体構造
  60. ===========
  61.  
  62. 内部の数値表現はリトルエンディアンです。
  63. アドレスはすべて APU RAM 上のものです。
  64. +$100 すると SPC ファイルのオフセットになります。
  65.  
  66. APU RAM 上の楽曲の内部構造は下記のとおりです。
  67.  
  68. 【凡例】
  69. 領域名 ($xxxx : 開始アドレス)
  70. + アドレス1: データ名1 = $yyyy 値の例
  71. + アドレス2: データ名2 = $zzzz 値の例
  72.  
  73. 【楽曲の構造(例)】
  74. 音声領域ポインタ領域
  75. + 0803: 楽曲データ領域ポインタ = $3000
  76.  
  77. 楽曲データ領域 ($3000)
  78. + 3000: 楽曲リストポインタ = $3002
  79.  
  80. 楽曲リスト領域 ($3002)
  81. + 3002: 楽曲ヘッダポインタ 1 = $35b6
  82. + 3004: 楽曲ヘッダポインタ 2 = $xxxx
  83.  
  84. 楽曲ヘッダ領域 ($35b6)
  85. + 35b6: ヘッダ情報 (可変長)
  86.  
  87. スーパーボンバーマン5の場合は上図のとおり、
  88. 楽曲に関わる情報は $0803 から順にたどることができます。
  89.  
  90. このドライバでは仕組み上、複数の楽曲を APU RAM に保持できるようなので、
  91. 単一の楽曲データに着く前に楽曲リストが存在します。
  92. 大抵、リストの先頭の楽曲がBGMです。
  93.  
  94. リストを辿ると、楽曲のヘッダ情報に到達します。
  95.  
  96. □ 楽曲ヘッダ
  97. =============
  98.  
  99. ヘッダは譜面データのようにイベントが連なっている形式で、
  100. 最初の1バイトがヘッダイベントの種別を示し、その後ろにパラメータが続きます。
  101. パラメータの長さはヘッダイベントの種別によって異なります。
  102. ヘッダイベント 00 がヘッダの終端を表します。
  103.  
  104. 【ヘッダの構成例】
  105. 01 ff .... ; ヘッダイベント01
  106. 02 02 ; ヘッダイベント02
  107. 00 ; ヘッダイベント00 (終端)
  108.  
  109. 譜面データの所在もヘッダイベントで示されます。
  110.  
  111. 以下はヘッダイベントの一覧です。
  112. 00 : ヘッダ終端
  113. 01 xx .. : チャンネルアドレス定義
  114. 02 xx : タイムベース設定
  115. 03 xx .. : 楽器テーブル
  116. 04 xx .. : リズムキット定義テーブル
  117. 05 xx .. : 謎のテーブル
  118. 06 xx .. : 謎のテーブル2
  119. 07 xx .. : 初期エコー設定
  120. 08 xx : 謎のバイト値
  121. 09 xx .. : 謎のテーブル3
  122.  
  123. ■01 xx .. : チャンネルアドレス定義
  124. チャンネルの有効・無効指定を行い、
  125. 有効なチャンネルのアドレスを設定します。
  126.  
  127. 最初の1バイトで楽曲が使用するチャンネルが指定されます。
  128. これはビットフラグになっていて、下位ビットから順に見ます。
  129.  
  130. 87654321 : ビット(対応するチャンネル)
  131. xxxxxxxx : 1=有効, 0=無効
  132.  
  133. その後ろに譜面データへのポインタが並びます。
  134. 個数は可変で、使用するチャンネルの数だけ並びます。(ビットに1が立っている数)
  135. 番号が若いチャンネルから順に並んでいます。
  136.  
  137. 模式的な例を示します。
  138.  
  139. 【ヘッダイベント01の例】
  140. ヘッダイベント01
  141. + 35b5: $01
  142. + 35b6: チャンネル有効フラグ (1バイト) = $ff
  143. + 35b7: 譜面データポインタ1 = $4222
  144. + 35b9: 譜面データポインタ2 = $4303
  145. : (チャンネル有効フラグが示すチャンネル数分続く、最大8つ)
  146.  
  147. 譜面データ1 ($4222)
  148. + 4222: ...
  149. 譜面データ2 ($4303)
  150. + 4303: ...
  151.  
  152. ■02 xx : タイムベース設定
  153. タイムベースを0~3で指定します。
  154. 設定されるタイムベースは (48 >> xx) になります。
  155.  
  156. ■03 xx .. : 楽器テーブル
  157. 楽器番号に対応するADSRやSRCNの値を定義します。
  158. xxはテーブルの要素数で、その後ろにテーブルが xx * 4 バイト続きます。
  159.  
  160. テーブルの内容は SRCN, ADSR(1), ADSR(2), GAIN です。
  161.  
  162. ■04 xx .. : リズムキット定義テーブル
  163. FE 03 コマンドでリズムチャンネル動作になっている際の、
  164. ノートナンバーに対応する楽器の情報を定義します。
  165. xxはテーブルの要素数で、その後ろにテーブルが xx * 4 バイト続きます。
  166.  
  167. テーブルの内容は
  168. ・D6コマンドで設定する楽器番号
  169. ・音程(ノート番号 通常範囲は0~71)
  170. ・D9コマンドで設定する音量
  171. ・DAコマンドで設定するパン
  172. です。
  173.  
  174. ■05 xx .. : 謎のテーブル
  175. 内容は不明ですが、テーブルを定義します。
  176. xxはテーブルの要素数で、その後ろにテーブルが xx * 2 バイト続きます。
  177.  
  178. ■06 xx .. : 謎のテーブル2
  179. 内容は不明ですが、テーブルを定義します。
  180. xxはテーブルの要素数で、その後ろにテーブルが xx * 2 バイト続きます。
  181.  
  182. ■07 xx .. : 初期エコー設定
  183. 楽曲のエコー初期設定を定義します。
  184.  
  185. xx が 0 の場合、後続の6バイトをエコー設定として使用します。
  186. 内容は EVOL(L), EVOL(R), EDL, EFB, FIR #, EON の順です。
  187.  
  188. xx が 0 以外の場合、デフォルトのエコー設定を使用します。
  189. 後続のデータはなく、パラメータ1バイトのイベントになります。
  190. デフォルトのエコー設定は $0858 にあります。
  191.  
  192. ■08 xx : 謎のバイト値
  193. 内容は不明です。
  194.  
  195. ■09 xx .. : 謎のテーブル3
  196. 内容は不明ですが、テーブルを定義します。
  197. xxはテーブルの要素数で、その後ろにテーブルが xx * 2 バイト続きます。
  198.  
  199. ヘッダを走査し終えたら、
  200. ヘッダイベント01で指定された各チャンネルの演奏を開始します。
  201.  
  202. □ 譜面イベント情報
  203. ===================
  204. 譜面データの各コマンドについて説明します。
  205.  
  206. 譜面データですが、かなりMML寄りの構造になっています。
  207. MIDIと同様、内部は基本的にtick単位で動きます。
  208. タイムベースは 48, 24, 12, 6 のいずれかで可変ですが、デフォルトでは12です。
  209. タイムベースの変更については楽曲ヘッダの項をご覧ください。
  210.  
  211. 以下はコマンドの一覧です。
  212. 00~CF xx : 休符・ノート (可変長)
  213. D0 : ???
  214. D1 xx : テンポ設定
  215. D2 xx : オクターブ指定
  216. D3 : オクターブ増加
  217. D4 : オクターブ減少
  218. D5 xx : クオンタイズ設定
  219. D6 xx : 楽器設定
  220. D7 : NOP
  221. D8 : NOP
  222. D9 xx : 音量
  223. DA xx : パン
  224. DB xx : 位相反転
  225. DC xx : 音量増減
  226. DD xx : 繰り返し開始
  227. DE : 繰り返し終了
  228. DF xx yy : サブルーチンジャンプ
  229. E0 xx yy : 無条件ジャンプ
  230. E1 xx : チューニング (ディチューン)
  231. E2 xx yy zz : ビブラート
  232. E3 xx : ビブラートディレイ
  233. E4 xx yy : エコー音量
  234. E5 xx yy zz : エコー設定 (ディレイ, フィードバック, FIR)
  235. E6 : エコー有効
  236. E7 xx : キーシフト(絶対)
  237. E8 xx : キーシフト(相対)
  238. E9 xx yy zz : アタック時ピッチ変化有効化
  239. EA : アタック時ピッチ変化無効化
  240. EB : ループ位置設定
  241. EC : ループ位置に戻る
  242. ED : ループ位置設定 (一回のみ)
  243. EE xx : NOP
  244. EF xx yy : 不明
  245. F0 xx : 不明
  246. F1 xx yy : ポルタメント設定
  247. F2 xx : 不明
  248. F3 xx : 不明
  249. F4~FD : NOP (未使用)
  250. FE xx .. : サブコマンド実行
  251. FF : サブルーチン終了/チャンネル演奏終了
  252.  
  253. ■00~CF (xx) : 休符・ノート (可変長)
  254. ノートバイトはビット単位で見ます。
  255. kkkktlll
  256. k 音程(0~11) 0=ド, 1=ド♯ ... 11=シ
  257. t タイ 1=タイ有効, 0=タイ無効
  258. l 音長(0~7)
  259.  
  260. 音程は上位4ビットで指定します。
  261. オクターブはオクターブ指定コマンドで行います。
  262.  
  263. タイは長い音符に対して使用します。
  264. 有効にすると次の音符と結合することができます。
  265. 休符で有効にしても、おそらく意味はありません。
  266.  
  267. 音長を0にすると、次バイトxxによるtick単位での指定となります。
  268. 0以外の場合、下記のとおりになります。
  269.  
  270. 値 長さ tick (タイムベース48の場合)
  271. --------------------------------------------------
  272. 1 全音符 192
  273. 2 2分音符 96
  274. 3 4分音符 48
  275. 4 8分音符 24
  276. 5 16分音符 12
  277. 6 32分音符 6
  278. 7 64分音符 3
  279.  
  280. 上記のtickとの対応はタイムベース48の場合です。
  281. タイムベース24の場合、tickは上記の半分になります。
  282. 64分音符のtickが1.5になりますが、誤差は内部的に吸収されます。
  283. さらに半分の0.75は内部で対応していないので壊れます。(テーブル外参照)
  284. 音符指定時の最小tickは1.5と覚えてください。
  285.  
  286. スタッカートなどの演奏は音符と休符の組み合わせでも実現可能ですが、
  287. 発音の長さは後述のクオンタイズコマンドで制御することができます。
  288.  
  289. ■D0 : ???
  290. 内容は不明です。
  291.  
  292. ■D1 xx : テンポ設定
  293. BPM単位でテンポを指定します。テンポのデフォルトは120です。
  294. MMLで言うところのTです
  295.  
  296. ■D2 xx : オクターブ指定
  297. ■D3 : オクターブ増加
  298. ■D4 : オクターブ減少
  299. オクターブを0~5の範囲で指定します。
  300. MMLで言うところのO < >です。
  301.  
  302. ■D5 xx : クオンタイズ設定
  303. クオンタイズを設定します。値の範囲で意味が変化します。
  304.  
  305. xx=0~8
  306. 全体のxx/8の長さで発音します。
  307. MMLで言うところのQです。
  308.  
  309. xx=9~
  310. 全体の長さから(xx-8)引いたtickだけ発音します。
  311. MMLで言うところの@Qです。
  312.  
  313. ■D6 xx : 楽器設定
  314. 楽器を変更します。
  315. 波形とADSRは楽器テーブルで別途設定します。
  316.  
  317. ■D7 : NOP
  318. ■D8 : NOP
  319. 何もしません。
  320.  
  321. ■D9 xx : 音量
  322. 音量を0~79で設定します。
  323. xxは符号付きの値として解釈され、
  324. 範囲外の場合は0または79に制限されます。
  325.  
  326. 内部的には、下記のテーブルによる音量設定が行われます。
  327. const byte volTableV2[] = {
  328. 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02,
  329. 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03,
  330. 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
  331. 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08,
  332. 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d,
  333. 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
  334. 0x15, 0x17, 0x18, 0x1a, 0x1b, 0x1d, 0x1e, 0x20,
  335. 0x22, 0x24, 0x26, 0x28, 0x2b, 0x2d, 0x30, 0x33,
  336. 0x36, 0x39, 0x3d, 0x40, 0x44, 0x48, 0x4c, 0x51,
  337. 0x56, 0x5b, 0x60, 0x66, 0x6c, 0x72, 0x79, 0x80,
  338. };
  339.  
  340. ■DA xx : パン
  341. パンを0~30で設定します。0が右、15が中央、30が左です。(MIDIと増減が逆)
  342. xxは符号付きの値として解釈され、
  343. 範囲外の場合は0または30に制限されます。
  344.  
  345. 変化のバランスは下記のとおりです。
  346. const byte panTable[] = {
  347. 0x00, 0x07, 0x0d, 0x14, 0x1a, 0x21, 0x27, 0x2e,
  348. 0x34, 0x3a, 0x40, 0x45, 0x4b, 0x50, 0x55, 0x5a,
  349. 0x5e, 0x63, 0x67, 0x6b, 0x6e, 0x71, 0x74, 0x77,
  350. 0x79, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7f,
  351. };
  352.  
  353. ■DB xx : 位相反転
  354. 左右の位相反転を0~3で設定します。
  355. +2で左の位相が反転、+1で右の位相が反転します。
  356.  
  357. ■DC xx : 音量増減
  358. D9コマンドの要領で、音量を-128~127で指定します。
  359. 現在の音量から相対的に変化します。
  360.  
  361. ■DD xx : 繰り返し開始
  362. リピートです。DD~DEの区間をxx回演奏します。ネストが可能です。
  363.  
  364. 16バイトの戻りスタックを3バイト消費します。
  365. スタックはサブルーチンコマンドと共用です。
  366. よってネストは最大でも5回までで、
  367. ネストの「ねじれ」は厳禁です。
  368.  
  369. ■DE : 繰り返し終了
  370. リピート終了です。回数が満たされていなければDDの位置まで戻ります。
  371.  
  372. ■DF xx yy : サブルーチンジャンプ
  373. アドレス$yyxxに演奏位置を移動します。FFコマンドで戻ります。
  374.  
  375. 16バイトの戻りスタックを2バイト消費します。
  376. スタックはサブルーチンコマンドと共用です。
  377. よってネストは最大でも8回までで、
  378. ネストの「ねじれ」は厳禁です。
  379.  
  380. ■FF : サブルーチン終了/チャンネル演奏終了
  381. DFが呼び出された位置に戻ります。
  382. DFを呼び出していなければ、チャンネルの演奏を停止します。
  383.  
  384. ■E0 xx yy : 無条件ジャンプ
  385. アドレス$yyxxに演奏位置を移動します。呼び出し元には戻りません。
  386. 曲を無限ループさせる仕組みは別にあるので、通常使用しません。
  387.  
  388. ■EB : ループ位置設定
  389. 曲のループ位置を指定します。
  390. 具体的には、ECコマンドで戻る位置の指定です。
  391.  
  392. ■EC : ループ位置に戻る
  393. EBコマンドで指定された位置に戻ります。
  394. 指定がない場合、最初に読み込まれた譜面の先頭アドレスに戻ります。
  395.  
  396. ■ED : ループ位置設定 (一回のみ)
  397. 曲のループ位置を指定します。
  398. EBと要領は同じですが、このコマンドは2回目以降は無視されます。
  399. EDを呼び出した後でも、EBコマンドではループ位置の設定が可能です。
  400.  
  401. ■E1 xx : チューニング (ディチューン)
  402. 音高を微妙にずらします。ずらす量を-128~127で指定します。
  403. 変化量は半音のxx/256に相当します。
  404.  
  405. ■E2 xx yy zz : ビブラート
  406. ビブラート(音高の震え)をかけます。
  407. xx : ビブラートの速さ?
  408. yy : ビブラートの深さ?
  409. zz : ???
  410.  
  411. ■E3 xx : ビブラートディレイ
  412. 発音からビブラート開始までの時間を指定します。
  413.  
  414. ■E4 xx yy : エコー音量
  415. エコー音量を指定します。
  416. xx : エコー音量(左)
  417. yy : エコー音量(右)
  418.  
  419. ■E5 xx yy zz : エコー設定 (ディレイ, フィードバック, FIR)
  420. エコーの各種パラメータを指定します。レジスタの値そのものです。
  421. xx : ディレイ
  422. yy : フィードバック
  423. zz : FIR (0~17?)
  424.  
  425. FIR はパターンを番号で指定します。
  426. どこまでが許される範囲なのか微妙ですが、おそらく下記が指定可能です。
  427.  
  428. 00: 7f 00 00 00 00 00 00 00
  429. 01: 58 bf db f0 fe 07 0c 0c
  430. 02: 0c 21 2b 2b 13 fe f3 f9
  431. 03: 34 33 00 d9 e5 01 fc eb
  432. 04: 23 ca f8 2c eb 08 fb 02
  433. 05: 04 f9 f8 27 27 f8 f9 04
  434. 06: 14 ff da 1d 1f e0 ff 0c
  435. 07: 1b db 33 f2 fd 0e fc fd
  436. 08: 3b ba 13 1b 02 f6 fd 01
  437. 09: 29 b9 fd 24 0d f7 fa 00
  438. 0a: 35 a8 ff 1a 12 04 f8 fb
  439. 0b: 1c cc 2f ec f8 12 00 fa
  440. 0c: 3b ba 13 1b 02 f6 fd 01
  441. 0d: fa 00 1c 29 29 1c 00 fa
  442. 0e: fe fd 16 34 34 16 fd fc
  443. 0f: fe fb 10 3a 3a 10 fb fe
  444. 10: 48 26 0a dd 08 0d f9 00
  445. 11: 38 48 14 e6 01 0a fe fe
  446.  
  447. ■E6 : エコー有効
  448. チャンネルのエコーを有効にします。
  449. 無効にするにはFEコマンドを使用します。
  450.  
  451. ■E7 xx : キーシフト(絶対)
  452. 通常よりもxxずらした音程で演奏します。-128~127で指定します。
  453. 同じE7コマンドを複数回呼び出しても、ずらす量は変化しません。
  454.  
  455. ■E8 xx : キーシフト(相対)
  456. 通常よりもxxずらした音程で演奏します。-128~127で指定します。
  457. 同じE8コマンドを複数回呼び出すと、呼び出した回数分ずれが増します。
  458.  
  459. ■E9 xx yy zz : アタック時ピッチ変化有効化
  460. アタック時に素早くピッチを変化させるようにします。
  461. xx : ピッチ変更の速さ
  462. yy : ピッチ変更の深さ
  463. zz : ピッチ変更の方向 (0=上から下、0以外=下から上)
  464.  
  465. ■EA : アタック時ピッチ変化無効化
  466. E9コマンドの効果を無効化します。
  467.  
  468. ■EE xx : NOP
  469. 何もしません。
  470.  
  471. ■F1 xx yy : ポルタメント設定
  472. ポルタメントを設定します。xxが0以外だと有効、0だと無効になります。
  473. xx : ポルタメントの速さ
  474. yy : 未使用? 通常は0
  475.  
  476. ■F4~FD : NOP (未定義領域?)
  477. 何もしません。
  478.  
  479. ■FE xx .. : サブコマンド実行
  480. xxの値に応じて各種の動作を行います。0x00~0x1eで指定します。
  481. コマンドの長さはxxの値によって異なります。
  482.  
  483. FE 00
  484. チャンネルの演奏を停止します。(サブルーチン外のFFと同様)
  485. FE 01
  486. チャンネルのエコーを無効にします。
  487. FE 03
  488. リズムチャンネル機能を有効化します。
  489.  
  490. リズムチャンネル時はMIDIのリズムチャンネルのように、
  491. ノートナンバーごとに別の楽器を鳴らします。
  492. 楽器の音色や音程はリズムキット定義テーブルで別途定義されます。
  493. FE 04
  494. リズムチャンネル機能を無効化します。
  495. FE 05
  496. FE 06
  497. FE 07
  498. FE 0E
  499. FE 0F
  500. 何もしません。
  501. FE 10 xx yy (mov rxx, #yy)
  502. FE 11 xx yy (mov rxx, ryy)
  503. FE 12 xx yy (cmp rxx, #yy)
  504. FE 13 xx yy (cmp rxx, ryy)
  505. FE 14 xx yy (bne $yyxx)
  506. FE 15 xx yy (beq $yyxx)
  507. FE 16 xx yy (bcs $yyxx)
  508. FE 17 xx yy (bcc $yyxx)
  509. FE 18 xx yy (bmi $yyxx)
  510. FE 19 xx yy (bpl $yyxx)
  511. r00~r07 の擬似レジスタを用いた演算・分岐を行います。
  512. 擬似レジスタは全チャンネルで共通のものが使用されます。
  513. FE 10 xx (AR)
  514. FE 11 xx (DR)
  515. FE 12 xx (SL)
  516. FE 13 xx (SR)
  517. FE 14 xx (RR)
  518. エンベロープ(ADSR)を設定します。
  519. DSPにリリースレートのレジスタは存在しませんが、
  520. キーオフ時に使用される GAIN の値を 0xa0 | xx で指定できます。
  521. FE 02
  522. FE 08
  523. FE 09
  524. FE 0A
  525. FE 0B
  526. FE 0C
  527. FE 0D xx
  528. それぞれ不明。
  529.  
  530. □ スーパーボンバーマン3での相違点
  531. ==================================
  532. Ver 2.x 系ドライバと比較して、Ver 1.x 系ドライバの差異を示すために、
  533. スーパーボンバーマン3を例にして説明します。
  534.  
  535. > スーパーボンバーマン5の場合は上図のとおり、
  536. > 楽曲に関わる情報は $0803 から順にたどることができます。
  537. スーパーボンバーマン3の場合、$07c2 になります。
  538. スーパーボンバーマン2の場合、$000d になります。
  539.  
  540. > □ 楽曲ヘッダ
  541. ヘッダの構造が異なります。
  542. Ver 2.xx ではヘッダイベント01でチャンネル情報を定義しましたが、
  543. Ver 1.xx ではヘッダイベント01と同等のチャンネル情報データの後に、
  544. ヘッダイベントが続く構造になっています。
  545.  
  546. 【ヘッダの構成例】
  547. ff ; Ver 2.xx ヘッダイベント01と同等のチャンネル情報
  548. 00 40
  549. 00 41
  550. 00 42
  551. 00 43
  552. 00 44
  553. 00 45
  554. 00 46
  555. 00 47
  556. 01 02 ; ヘッダイベント01
  557. 00 ; ヘッダイベント00 (終端)
  558.  
  559. ヘッダイベントの一覧も異なります。
  560. Ver 1.xx の方がヘッダイベントが少ないです。
  561. 00 : ヘッダ終端
  562. 01 xx : タイムベース設定
  563. 02 xx .. : 楽器テーブル(old)
  564. 03 xx .. : リズムキット定義テーブル(old)
  565. 04 xx .. : 楽器テーブル
  566. 05 xx .. : 謎のテーブル
  567.  
  568. ■02 xx .. : 楽器テーブル(old)
  569. 楽器番号に対応するADSRやSRCNの値を定義します。
  570. xxはテーブルのサイズ(バイト単位)を指定します。
  571.  
  572. ■03 xx .. : リズムキット定義テーブル(old)
  573. FE 03 コマンドでリズムチャンネル動作になっている際の、
  574. ノートナンバーに対応する楽器の情報を定義します。
  575. xxはテーブルのサイズ(バイト単位)を指定します。
  576.  
  577. > □ 譜面イベント情報
  578. いくつかのイベントが異なります。
  579.  
  580. D0 : NOP
  581. D7 xx : NOP (2 bytes)
  582. D8 xx : NOP (2 bytes)
  583. D9 xx : 音量
  584. DA xx : パン
  585. E2 xx yy : ビブラート
  586. EE xx : 音量設定 (テーブル使用)
  587. F2~FD : NOP (未使用)
  588. FE xx .. : サブコマンド実行
  589.  
  590. ■D9 xx : 音量
  591. 音量を0~255で設定します。
  592.  
  593. Ver 2.xx が音量テーブルを使用していたのに対して、
  594. Ver 1.xx では値を直接指定する仕様となっています。
  595. 別途EEコマンドで、音量テーブルを使った指定が可能です。
  596. (スーパーボンバーマン3ではEEコマンドが積極的に使用されています)
  597.  
  598. ■DA xx : パン
  599. パンを0~30で設定します。
  600.  
  601. 効果は Ver 2.xx と同じですが、値の範囲制限がありません。
  602. 30を超える値を設定すると、想定外の音量バランスになります。
  603.  
  604. ■E2 xx yy : ビブラート
  605. ビブラート(音高の震え)をかけます。
  606. Ver 2.xx よりもパラメータが少ないです。
  607. xx : ビブラートの速さ
  608. yy : ビブラートの深さ
  609.  
  610. ■EE xx : 音量設定 (テーブル使用)
  611. 音量を0~90の範囲で指定します。
  612. テーブルを参照して、その値で音量を設定します。
  613.  
  614. const byte volTable[] = {
  615. 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
  616. 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  617. 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05,
  618. 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09,
  619. 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e,
  620. 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
  621. 0x17, 0x18, 0x1a, 0x1b, 0x1d, 0x1e, 0x20, 0x22,
  622. 0x24, 0x26, 0x28, 0x2b, 0x2d, 0x30, 0x33, 0x36,
  623. 0x39, 0x3c, 0x40, 0x44, 0x48, 0x4c, 0x51, 0x55,
  624. 0x5a, 0x60, 0x66, 0x6c, 0x72, 0x79, 0x80, 0x87,
  625. 0x8f, 0x98, 0xa1, 0xaa, 0xb5, 0xbf, 0xcb, 0xd7,
  626. 0xe3, 0xf1, 0xff,
  627. };
  628.  
  629. ■FE xx .. : サブコマンド実行
  630. xxの値に応じて各種の動作を行います。0x00~0x09で指定します。
  631. 下記のイベントが Ver 2.xx と異なります。
  632.  
  633. FE 05
  634. FE 06
  635. FE 07
  636. ビブラートの種類をそれぞれ0~2に変更します。
  637. 実際の動作は0か0以外の2種類しかありません。
  638. 0 : 基準音から音高を上下する
  639. 1 : 基準音から上だけで波を作り、下には動かさない (速度も上がる)
  640.  
  641. 以上
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement