【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )

本文详细介绍了MIDI文件的结构,包括MIDI文件头的识别、长度、格式、轨道数量以及基本时间单位。通过实例解析了一个简单的MIDI文件,指出其只有一个轨道且每个四分音符包含480个tick。内容适合对音乐数字化和信息技术感兴趣的读者。
摘要由CSDN通过智能技术生成





一、MIDI 文件简介



下面的 mid 文件是一个简单 midi , 其中只有一条轨道 , 一个音符 ;

这个 mid 文件很简单 , 但是麻雀虽小 , 五脏俱全 , 其中有所有的必须的 midi 文件头 , midi 轨道头 , 时间标志 , 等信息 ;

下面开始逐个字节 , 解析上述 midi 文件 ;

4D 54 68 64 00 00 00 06 00 00 00 01 01 E0 4D 54 
72 6B 00 00 00 25 00 FF 03 05 B2 E2 CA D4 30 00 
FF 51 03 07 A1 20 00 FF 58 04 04 02 18 08 00 90 
3C 64 8E 7E 80 3C 40 00 FF 2F 00

在这里插入图片描述

在这里插入图片描述





二、MIDI 文件头解析



文件头数据 :

4D 54 68 64 00 00 00 06 00 00 00 01 01 E0

在这里插入图片描述


1、MIDI 文件头标识


4D 54 68 64 : 0 ~ 3 字节 , " MThd " 字符串 ASCII 码 , 这是 mid 文件的标识 ;


2、MIDI 文件头长度


00 00 00 06 : 4 ~ 7 字节 , 这是个 4 字节整型数据 , 大端格式显示 , 整型低位在高字节 , 整型高位在低字节 , 该数据表示 mid 文件文件头长度 , 这里的文件头长度为 6 , 表示后面 6 字节是 mid 文件文件头的范围 ;

在这里插入图片描述
大端格式 : 高位存储在低字节中 , 符合人的书写习惯 ;

在这里插入图片描述

小端格式 : 低位存储在低字节中 , 符合计算机处理逻辑 ;

在这里插入图片描述


3、MIDI 文件格式


00 00 : 8 ~ 9 字节 , 表示 mid 文件的格式 ; 这两个字节是 short 类型整型 , 大端格式 ;

  • 0 : mid 文件只有一条轨道 , 所有的通道都在一条轨道中 ;
  • 1 : mid 文件有多个音轨 , 并且是同步的 , 即所有的轨道同时播放 ;
  • 2 : mid 文件有多个音轨 , 不同步 ;

这里是 0 格式 , 也就是说只有一条轨道 ;

在这里插入图片描述


4、MIDI 轨道个数


00 01 : 10 ~ 11 字节 , 表示 MIDI 轨道个数 , short 类型 , 大端格式 ;

此处表示有一条轨道 , 所有通道的音符和节拍信息都在该轨道中 ;

在这里插入图片描述


5、基本时间


01 E0 : 12 ~ 13 字节 , 用于指定基本时间 ;

2 个字节 , 要拆分成 3 部分 , 最高位 ( 第 15 位 ) 作为标识位 , 第 8 ~ 14 位 作为一部分 , 第 0 ~ 7 位 作为一部分 ;

由于是大端格式排列 , mid 文件第 12 字节 ( 低地址 ) 是 高位 , mid 文件第 13 字节 ( 高地址 ) 是低位 ;

01 E0 的二进制形式如下 : 0000 0001 11110 0000 ;

最高位 0000 0001 11110 0000 是 0 , 红色的是最高位 , 表示当前 代表的事件格式是 类型1 , 第 0 ~ 14 位 代表的是 四分音符的 tick 数 ;

十六进制 01 E0 对应的十进制数字是 480 , 也就是说一个四分音符有 480 tick ;

tick 是时间单位 , 这是 mid 文件中计算时间的最基本单位 ;

在这里插入图片描述

根据提供的引用内容,我们可以了解到MIDI是一种数字音乐标准格式,而STM32是一种微控制器,那么STM32 MIDI文件解析就是指STM32微控制器对MIDI文件进行解析的过程。在STM32中,可以使用MIDI库来解析MIDI文件,该库提供了一些函数和数据结构,可以方便地读取MIDI文件中的音符、控制参数等信息,并将其转换为MIDI消息进行处理。在解析MIDI文件时,需要注意MIDI文件格式,一般有标准MIDI文件和扩展MIDI文件两种格式,需要根据不同的格式进行相应的解析处理。 下面是STM32 MIDI文件解析的一些步骤: ```c // 代码类型:C语言 // 读取MIDI文件信息 void readMidiHeader(FILE *fp, MidiHeader *header); // 读取MIDI文件中的音符和控制参数等信息 void readMidiTrack(FILE *fp, MidiTrack *track); // 解析MIDI消息 void parseMidiMessage(uint8_t *message, uint8_t *status, uint8_t *data1, uint8_t *data2); // 处理MIDI消息 void handleMidiMessage(uint8_t status, uint8_t data1, uint8_t data2); // 主函数 int main(void) { // 打开MIDI文件 FILE *fp = fopen("example.mid", "rb"); if (fp == NULL) { printf("Failed to open MIDI file.\n"); return -1; } // 读取MIDI文件信息 MidiHeader header; readMidiHeader(fp, &header); // 读取MIDI文件中的音符和控制参数等信息 MidiTrack track; readMidiTrack(fp, &track); // 解析MIDI消息并处理 uint8_t message[3]; uint8_t status, data1, data2; for (int i = 0; i < track.length; i += track.events[i].length) { memcpy(message, track.events[i].data, 3); parseMidiMessage(message, &status, &data1, &data2); handleMidiMessage(status, data1, data2); } // 关闭MIDI文件 fclose(fp); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值