-----------------------------------------------------------------------------
PSF (Portable Sound Format){可移植声音格式} 规范 v1.5
by Neill Corlett
-----------------------------------------------------------------------------
绪论
------------
PSF 是把 "NSF", "SID", "SPC" 和 "GBS" 的功能性带给了次时代家用机{next-generation consoles}.
PSF 利用每一个游戏的原始的音乐驱动{设备?}代码完美而可信回放音乐序列, 而且尺寸极佳{size-efficient}{还是太大}.
一般的方法是 一个 PSF 文件包含一个 用zlib压缩过(zlib-compressed) 的程序, 这个程序如果能在真实的家用机上执行, 能简单的回放音乐.
想知道有哪些改变, 请参看底部的本文修正历史.
-----------------------------------------------------------------------------
基本文件结构
--------------------
每个 FSF 文件都有相同的基本结构, 下面描述.
不但保在 PSF 文件中连接到的任何大于一字节(byte)的数据. 练习适当的谨慎.
{翻译的垃圾呀,Tx=xT}
- 首先 3个字节: ASCII字符: "PSF" (大小写敏感)
- 然后 1字节: 版本字节
版本字节用来决定 PSF 文件的类型. 它完全不会影响到文件的基本结构.{!不会影响哟!}
当前公认的版本字节是:
0x01: Playstation (PSF1) {PS}
0x02: Playstation 2 (PSF2) {PS2}
0x11: Saturn (SSF) [试验中] {SS 土星哟!!}
0x12: Dreamcast (DSF) [试验中] {DC!!}
0x21: Nintendo 64 (USF) N64 [保留]
0x41: Capcom QSound (QSF) {CPS1-QSound, CPS2-QSound, CP-ZN1-QSound, CP-ZN2-QSound, 还有么??}
- 然后 4字节: 预留空间的大小 ®, little-endian 无符号长整形
{little-endian: 低位放低字节, 高位放高字节(??对么??). 例如 x86 系列的内存数据格式. 相对应的 68K 就是big-endian.}
- 然后 4字节: 压缩过的程序长 (N), little-endian 无符号长整形
这个长度是程序{program data}压缩{_after_}后的长度.
- 然后 4字节: 压缩过的程序的 CRC-32 值, little-endian 无符号长整形
{CRC-32 32位循环冗余校检}
{!! CRC-32 !!又是它,Tx=xT最近就是它搞不定.}
这是程序{program data}压缩{_after_}后的 CRC-32 值.
这个数值必须强制填充, 作为一个 PSF 文件如果这个数值不匹配就意味着是损坏的.
- 然后 R 字节: 预留空间
如果 R 是 0 字节则为空
- 然后 N 字节: 压缩过的程序, 由 zlib 压缩格式. {compress() 为虾米带(),说不定是个 zlib 的函数.记下来.}
如果 N 是 0 字节则为空
然后的数据是可选的, 可以省略:
- 然后 5字节: ASCII字符: "[TAG]" (大小写敏感)
如果这 5字节不匹配, 则剩下的部分当作无效的, 将被丢弃.
- 文件的剩余部分: 没有压缩的 ASCII 标签{TAG} 数据.
如果剩下的数据超过 50,000 字节, 那 标签 数据可以被切断, 也包括切除文件本身的多余数据. 这个设计故意的.
为将来的兼容性考虑, 标签编辑器和压缩器可能会假定 任何 PSF 文件都使用这个基本结构.
可是, 预留的区域必须保持完整, 没有假定可能会造成 解压缩后的程序 和 预留的部分 的 格式 或 内容 附近没有 首先核对的版本字节.
{完了~~这回垃圾大发了.Tx=xT}
有关 zlib 的信息请去 http://www.gzip.org/zlib/ .
-----------------------------------------------------------------------------
标签格式 {TAG}
----------
标签由一系列的单行的格式如 变量=数值 构成, 像下面的例子:
title=Earth Painting
artist=Yoko Shimomura
game=Legend of Mana
year=1999
{这就是传说中我不知道的LoM,灭哈哈哈哈}
标签将被像下面那样分析:
- 所有为 0x01-0x20 字符将被过滤为 空格{whitespace}
- 必须没有 null (0x00) 字符; 这次发布时, 接收到 null 字节的行为未定义
- 0x0A 是新一行的字符 {0x0A: 就是 ASCII 的换行符, 符合 UNIX 标准, Win 系列回车是 2个字节, 一个是 0x0D, 然后是 0x0A}
- "变量=数值" 这样的附加行可以在后面跟着
- 变量名是大小写不敏感的, 必须是合法的 C语言标识符
- 空格 在一行的 开始/结尾, = 的前/后 将被忽略
- 空行将被忽略
- 多行变量必须为 连续的行且具有相同的变量名. 举例:
comment=This is a
comment=multiple-line
comment=comment.
- 标签的文本用系统默认的编码表来编码/解码.
{哇AAAaaa---!!!为什么不用UTF-8!!!为什么!!!}
变量名出现多于一次, 多行变量零散的在不相干行 等等, 这些行为都没有定义.
以下的变量名已经预先定义:
title, artist, game, year, genre, comment, copyright
(这些是不需要加以说明的.)