当前位置:早雪网网络学院编程文档文件格式 → PSF (Portable Sound Format)[可移植声音格式] 规范 v1.5

PSF (Portable Sound Format)[可移植声音格式] 规范 v1.5

减小字体 增大字体 作者:未知  来源:从互联网收集整理并转载  发布时间:2005-6-3 0:56:07

-----------------------------------------------------------------------------
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语言标识符
- 空格 在一行的 开

[数据载入中...] [返回上一页] [打 印]