MIDI二进制文件格式简析

这篇博客详细解析了MIDI二进制文件格式,包括Chunks结构、Header Chunks和Track Chunks的内容,以及MIDI事件如MIDI event、sysex event和meta-event的详细信息。文中还介绍了header chunk的format、ntrks和division字段,以及track chunk的delta-time和event结构。此外,还提及了General MIDI Sound Set Groupings和Percussion Map。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MIDI二进制文件格式简析

本文主要参考自Official MIDI Specifications

Chunks

每个MIDI文件由一系列chunk组成,每个chunk的前四个字节为魔数(magic number),是由四个ASCII字符所组成的类型标识。目前标准格式中已定义的chunk类型只有headertrack两种,其魔数分别为"MThd""MTrk",对于类型未被定义的chunk则应该被忽略。

每个chunk在其四字符类型之后紧跟一个32位无符号整数,意味这一chunk后续将要读入的字节个数,每个chunk已经读入的这八个字节不包含在内。

通常来说,一个MIDI文件中首先要存在一个header chunk,然后一系列track chunk紧随其后,格式大致如下:

MThd <length of header data>

<header data>

MTrk <length of track data>

<track data>

MTrk <length of track data>

<track data>

Header Chunks

在目前的标准中,header chunk长度固定为14,其由五个部分所组成:

<Header Chunk> = <chunk type> <length> <format> <ntrks> <division>

其中type固定为"MThd"formatntrksdivision均为16位,因此length固定为0x00000006

format指定了整个文件的组织结构,在当前的标准下,仅支持0x00000x00010x0002这三种可能的值。

0 the file contains a single multi-channel track

1 the file contains one or more simultaneous tracks (or MIDI outputs) of a
sequence

2 the file contains one or more sequentially independent single-track patterns

ntrks表示整个文件中track chunk的总个数,对于format为零的文件来说ntrks的值总是0x0001

最后的division表示了delta-times的含义,有metrical timetime-code-based time这两种形式,这取决于其最高位是否为零。

假如division最高位为零,那么就属于metrical time形式,这个16位无符号整数的意义为每个四分音符的ticks个数。否则属于time-code-based time形式,其低8位表示每帧的ticks个数,高8位为一个8位负数补码,有-24-25-29-30这四种可能的值,其意义与SMPTE有关,以下内容摘抄自维基百科:

Sub-second timecode time values are expressed in terms of frames. Common supported frame rates include:

24 frame/sec (film, ATSC, 2K, 4K, 6K)

25 frame/sec (PAL (Europe, Uruguay, Argentina, Australia), SECAM, DVB, ATSC)

29.97 (30 ÷ 1.001) frame/sec (NTSC American System (US, Canada, Mexico, Colombia, etc.), ATSC, PAL-M (Brazil))

30 frame/sec (ATSC)

在这里可以发现,凭借division是完全不足以描述每个时间间隔的实际长度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值