理解MIDI文件结构:从Header到Track Chunks

需积分: 9 5 下载量 144 浏览量 更新于2024-10-10 收藏 104KB PDF 举报
"MIDI 文件结构详解" 在深入探讨 MIDI 文件结构之前,首先需要了解 MIDI( Musical Instrument Digital Interface)的基本概念。MIDI 是一种通信协议,允许电子乐器、计算机和其他设备之间交换音乐数据。MIDI 文件是这些数据的存储形式,它们不是音频流,而是事件序列,描述了音乐的构成元素,如音符、控制器变化和时间信息。 MIDI 文件的结构基于“块”(Chunks)的概念。每个块由三部分组成:4 字节的块类型、4 字节的长度字段以及根据长度字段确定的数据区。块类型用 ASCII 字符表示,长度字段为32位,高字节优先。这种结构使得 MIDI 文件能够灵活地容纳不同类型的块。 1. **头块(Header Chunk)** 头块的类型为 "MThd",用于定义 MIDI 文件的格式信息。它包含以下三个关键字段: - **格式(format)**:指示 MIDI 文件的结构。可能的值有 0、1 和 2,分别代表单轨、多轨和多歌曲格式。 - **轨道数量(tracks)**:头块中指定的 MIDI 轨道数量。 - **时间分隔(division)**:定义时钟信号的单位,可以是拍子数或系统实时消息的计数,决定了事件的时间间隔如何解释。 2. **轨道块(Track Chunks)** 轨道块的类型为 "MTrk",包含一系列事件,如音符开始、结束、控制器变化等。每个事件前都有一个 delta-time(相对时间),表示该事件相对于前一事件的时间间隔。事件可以是标准 MIDI 事件,如音符消息,也可以是元事件(Meta-events),如歌曲标记或时间标志。 轨道块的结构如下: - **长度(length)**:表示该轨道块内的数据长度。 - **事件序列**:由 delta-time 和事件组成。delta-time 以变长编码表示,可以节省存储空间。事件包括 MIDI 事件和元事件,每个事件由事件类型、参数组成。 3. **数值表示(Value Representations)** 在 MIDI 文件中,除了基本的 MIDI 数据,还存在如 delta-time 和元事件中的数值信息。这些数值通常有两种表示方式: - **变长编码(Variable Length Encoding)**:用于 delta-time 的表示,可以更高效地存储小数值。 - **七位二进制补码(Seven-Bit Two's Complement)**:用于 MIDI 事件中的某些参数,如音符值、控制器号等,通常不超过 127。 除了规定的 "MThd" 和 "MTrk" 块,MIDI 文件结构也允许其他类型的块存在。尽管 MIDI 规范要求软件忽略不识别的块类型,但这样的设计为扩展提供了可能性,比如添加自定义的元数据或编解码器信息。 MIDI 文件通过头块和轨道块的组合,以及灵活的数值表示,形成了一种能有效存储和传递音乐信息的数据结构。理解这一结构对于读取、创建和修改 MIDI 文件至关重要,特别是在音乐软件开发和数字音频工作流程中。