概要
NSF (NES Sound Format) とは、ファミコン(NES)のカートリッジ又はディスクシステムのディスクからサウンド関係の部分を切り出したもの。ファミコン音源のエミュレーションや実機再生での標準規格である。
ファミコン音源による自作の音楽(Chiptune)がしばしばNSFの形式で配布されるため、ニコニコではNSFを再生した音楽を使った動画等でこのタグが用いられる。
プレイヤー
NSFを再生するには、単体のNSFプレイヤーを使用するか、メディアプレーヤーにNSF再生プラグインを追加する必要がある。なお、NSFフォーマットは、演奏時間およびマルチトラックNSFの各曲ごとの情報を記録しないため、それを補う拡張プレイリストフォーマットもしくはtaginfo.tagファイルに対応しているプレイヤーが望ましい。(なお、この欠点を解消するNSFEフォーマットが提唱されているが、普及していない。)
Windows
- NSFPlay
- NSFプレイヤー。
- version 2.4より、NSF2に対応。
- VirtuaNSF
- 単体で動作するシンプルかつ軽量なNSFプレイヤー。ただしプレイリスト非対応。
- Winamp + NSF再生プラグイン
- Winampは、Windows用プラグイン拡張型メディアプレイヤー。拡張プレイリストに対応している。Winamp用NSF再生プラグインは、Brezza作のNSFplugが定番であるが、現在開発が停滞している。現在、実機演奏に最も近いといえるのは、OffGao作のNEZplug++であろう。
Mac
- Audio Overload
- Macでは事実上標準のChiptuneプレイヤー。
Linux
残念ながら、各拡張音源を完全に再生できるプレイヤーは現在存在しない。よってWine上で前述のWindows用プレイヤーを使ったほうが良いだろう。以下、参考までに記す。
- Gstreamer使用のプレイヤー
- GStreamerは、フリー(自由)なマルチメディアフレームワークである。GStreamerを使用している代表的なプレイヤーは、Amarok・Rhythmbox・Bansheeが挙げられる。GStreamer Bad PluginsをインストールすることによりNSFを再生できる。
- Audacious
- GTK+2を用いたXMMS後継のメディアプレーヤー。NSF再生プラグインはプリインストールされている。
作成ソフトウェア
ppmck及びFamiTrackerが代表的である。
- ppmck
- ファミコン音源ドライバおよびMMLコンパイラである。ほとんどの拡張音源が使用可能。CUIであるためプラットフォームを選ばない。
- FamiTracker
- Windows用のトラッカータイプのNSF作成ソフトである。こちらもほとんどの拡張音源が使用可能である。
ファイルのフォーマット構造
NSFの中身は、0x80バイトのヘッダーと、それ以降のプログラムデータによって構成されている。
NSF2より、文字列のエンコーディングはUTF-8が推奨(SHOULD)されている。
ヘッダーの詳細は以下のとおり。
アドレス | データ長 | 説明 |
0x00 | 5 | ファイルがNSFであることを示す文字列。 "NESM"+0x1A |
0x05 | 1 | NSFバージョン。1もしくは2。 |
0x06 | 1 | 曲数。3曲なら3になる。 |
0x07 | 1 | NSFを読み込んだときに最初に指定する曲番号。2曲目から再生させたいときは2になる。 |
0x08 | 2 | ロード開始アドレス。データはこのアドレスからロードされる。 |
0x0A | 2 | 初期化アドレス。再生前にここで指定されたアドレスにジャンプする。 |
0x0C | 2 | 再生アドレス。再生時にここで指定されたアドレスに何度もジャンプする。 |
0x0E | 32 | タイトル。文字列の終わりはNULL(0)。 |
0x2E | 32 | アーティスト名。文字列の終わりはNULL(0)。 |
0x4E | 32 | 著作権所持者。文字列の終わりはNULL(0)。 |
0x6E | 2 | 再生アドレスが呼び出される周期(NTSCモード時)。 1/1000000秒単位で計算される。通常は「1A 41(60Hz)」が入る。 |
0x70 | 8 | 初期バンク指定。全部0ならバンクを使用しない。 ヘッダアドレスと対応するメモリアドレスは以下のとおり。 0x70:8000~8FFF 0x71:9000~9FFF 0x72:A000~AFFF 0x73:B000~BFFF 0x74:C000~CFFF 0x75:D000~DFFF 0x76:E000~EFFF (拡張音源:FDS有効の場合は6000~6FFFも含む) 0x77:F000~FFFF (拡張音源:FDS有効の場合は7000~7FFFも含む) |
0x78 | 2 | 再生アドレスが呼び出される周期(PALモード時)。 1/1000000秒単位で計算される。通常は「20 4E(50Hz)」が入る。 |
0x7A | 1 | NTSC/PALモード指定。0ならNTSC、1ならPAL、2,3なら両方使う。 |
0x7B | 1 | 拡張音源フラグ。ビットが立っていれば、その拡張音源をサポートする。 0bit目:VRC6 1bit目:VRC7 2bit目:FDS 3bit目:MMC5 4bit目:Namco106/163 5bit目:Sunsoft5B |
0x7C | 4 | (NSF1)0x00固定 (NSF2)フラグ 0-3bit目:0固定 4bit目:IRQデバイスを有効化 5bit目:初期化ルーチンからRETされない事を示す。 6bit目:再生ルーチンを使用しない事を示す。 7bit目:NSFeのメタデータを使用する事を示す。 |
0x7D | 3 | (NSF1)0x00固定 (NSF2)ROMデータのサイズ。ROMデータの後ろにNSFeメタデータが続く。 |
0x80 | ??? | 0x7Cの7bit目が0の場合、データがファイルの終わりまで続く。 0x7Cの7bit目が1の場合、0x7D~0x7Fの24bit(リトルエンディアン)のサイズ分だけデータが続く。 |
??? | ??? | (NSF2)NSFeメタデータ |
メモリマップ
0000~07FF | RAM |
0800~1FFF | 0000~07FFのミラー |
2000~3FFF | 未使用 |
4000~4017 | ファミコン内蔵音源(2A03)レジスタ |
4018~4019 | 未使用 |
401A~401B | (NSF2)IRQ timer カウンター |
401C | (NSF2)IRQ timer 有効 bit 0:Activate |
401D | (NSF2)IRQ timer IRQ応答 bit0:Status / bit 7:flag |
401E~5FF7 | 未使用 |
5FF6~5FF7 | (拡張音源:FDS有効の場合のみ)バンクレジスタ 5FF6:6000~6FFF 5FF7:7000~7FFF |
5FF8~5FFF | バンクレジスタ 5FF8:8000~8FFF 5FF9:9000~9FFF 5FFA:A000~AFFF 5FFB:B000~BFFF 5FFC:C000~CFFF 5FFD:D000~DFFF 5FFE:E000~EFFF 5FFF:F000~FFFF |
6000~7FFF | RAM |
8000~FFFF | ROM (ただし、拡張音源:FDS有効の場合はRAM) |
4040~4092 | (拡張音源:FDS有効の場合のみ)FDS音源レジスタ |
4800,F800 | (拡張音源:Namco106/163有効の場合のみ)Namco106/163音源レジスタ |
5000~5015 | (拡張音源:MMC5有効の場合のみ)MMC5音源レジスタ |
5205~5206 | (拡張音源:MMC5有効の場合のみ)MMC5計算レジスタ |
5C00~5FF7 | (拡張音源:MMC5有効の場合のみ)MMC5拡張RAM |
9000~9002 A000~A002 B000~B002 |
(拡張音源:VRC6有効の場合のみ)VRC6音源レジスタ |
9010,9030 | (拡張音源:VRC7有効の場合のみ)VRC7音源レジスタ |
C000,E000 | (拡張音源:Sunsoft5B有効の場合のみ)Sunsoft5B音源レジスタ |
FFFA-FFFB | (NSF2)NMI vectorベクタ。NMIを使用する場合にベクタを設定する。 |
FFFC-FFFD | (NSF2)Resetベクタ。リセットを使用する場合にベクタを設定する。 |
FFFE-FFFF | (NSF2)IRQベクタ。IRQデバイスを用いる場合にベクタを設定する。 |
初期化時の動作
0000~07FF,6000~7FFF(MMC5有効なら5C00~5FF6も、FDS有効なら8000~FFFFも)を0クリアされた後、ロード開始アドレスからデータがロードされていく。ロードの際、ヘッダに初期バンク指定がある場合、ロード開始アドレスから0xFFFをANDしたアドレスから、バンク0から順にロードされる。
ファミコン内蔵音源(2A03)レジスタは以下のように初期化される。
4000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4010: 10 00 00 00 ?? 0F |
その後、アキュームレータ(Aレジスタ)に曲番号(1曲目なら0、255曲目なら0xFE)が代入される。
NTSC/PALモード指定で両方使用する設定の場合には、XレジスタにNTSC動作なら0、PAL動作なら1が代入される。
その後、初期化アドレスにジャンプされる。
初期化が終わったあと、指定された周期で再生アドレスに何度もジャンプされる。
メタデータ
メタデータは、ROMデータの直後に追加でき、ROMデータ長は、NSFヘッダーの0x7C~0x7Fに24bit(リトルエンディアン)で示される。
NSFeのメタデータと同じですが、以下の違いがある。
- NSF2メタデータの先頭には、"NSFE"は不要。
- "INFO", "DATA", "BANK", "NSF2"チャンクは使用してはならない。
- "RATE"及び"regn"チャンクはNSFヘッダーと冗長になるが、Dendy再生情報のために含めても良い。
チャンクの構造は以下表を参照。
オフセット | サイズ | 機能 |
0x0000 | 4 DWORD | チャンクのデータサイズ。8Byteのヘッダーは含まない。 |
0x0004 | 4 fourCC | チャンクの文字列ID。 |
0x0008 | ---- | チャンクデータ |
NSF2で使用しないチャンクを除き、以下のチャンクが使用できる。各チャンクの詳細はNSFeの規格を参照。
- NEND ファイルの最後に必ず必要
- RATE 再生アドレスが呼び出される周期
- VRC7 VRC7を別の音源に換装する
- plst 曲の再生順番の指定
- psfx 効果音の再生順番の指定
- time 各トラックの再生時間の指定
- fade 各トラックのフェードアウト時間の指定
- tlbl 各トラックの曲名の指定
- taut 各トラックの作曲者の指定
- auth ゲームタイトル、作曲家、著作権者、抜き出し者の指定
- text その他のテキスト
- mixe 各拡張音源の音量バランスの指定
- regn リージョンの指定(bit 0:NTSC / bit 1:PAL / bit 2:Denty )
NSFサンプル
このサンプルの場合、0x80~0xAEまでがプログラムで、0xAF~0xC2までが音楽データになっている。
0000: 4E 45 53 4D 1A 01 01 01 00 80 00 80 0C 80 4E 69 NESM..........Ni 0010: 63 6F 56 69 64 65 6F 20 2D 20 4F 66 66 69 63 61 coVideo - Offica 0020: 6C 20 54 69 6D 65 20 53 69 67 6E 61 6C 00 4E 69 l Time Signal.Ni 0030: 63 6F 20 4E 69 63 6F 20 44 6F 75 67 61 00 00 00 co Nico Douga... 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 30 ..............20 0050: 30 37 20 4E 69 77 61 6E 67 6F 00 00 00 00 00 00 07 Niwango...... 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1A 41 ...............A 0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0080: A9 00 85 00 85 01 A9 81 8D 08 40 60 A5 01 30 FB ..........@`..0. 0090: C6 00 10 F7 A5 01 AA BD 2F 80 30 10 85 00 E8 BD ......../.0..... 00A0: 2F 80 8D 0A 40 A9 00 8D 0B 40 E8 8A 85 01 60 34 /...@....@....`4 00B0: 38 0C 00 08 47 08 3F 08 00 08 38 18 3F 10 47 01 8...G.?...8.?.G. 00C0: 00 FF .. |
関連動画
関連項目
関連リンク
- 5
- 0pt