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

PSF(Portable Sound Format)是一种将不同平台的音乐格式移植到下一代家用机上的规范,它利用游戏原始音乐驱动代码实现高质量回放。PSF文件由一个zlib压缩的程序组成,该程序在真实硬件上执行以播放音乐。文件结构包括版本字节、预留空间、压缩程序的大小和CRC-32值等。此外,文件可包含'[TAG]'标签,用于存储ASCII格式的元数据,如标题、艺术家和发行年份。PSF支持多种平台,如PlayStation(PSF1)和PlayStation 2(PSF2),并且允许通过MiniPSF和PSFLib文件共享代码和数据。
摘要由CSDN通过智能技术生成

-----------------------------------------------------------------------------
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
  (这些是不需要加以说明的.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值