看midi内容跟网络抓包后分析一样,头很昏,随便写东西。
0x4D , 0x54 , 0x68 , 0x64 , // "MThd" 0x00 , 0x00 , 0x00 , 0x06 , // 头块长度:不包括前4字节和本4字节 0x00 , 0x01 , // 格式;1-多轨,同步 0x00 , 0x03 , // 轨道数 = 3 0x01 , 0xE0 , // 基本时间格式 0x01E0 = 480; 0x4D , 0x54 , 0x72 , 0x6B , // "MTrk" 0x00 , 0x00 , 0x00 , 0x15 , // 21 该规长度:不包括前4字节和本4字节 0x00 , // 时间差 0xFF , 0x58 , 0x04 , 0x04 , 0x02 , 0x18 , 0x08 , // 其他功能、节拍、长度4、分子4、分母4、节拍器时钟24、一个四分音符包含的32分音符的个数8 0x00 , // 时间差 0xFF , 0x51 , 0x03 , 0x0C , 0x35 , 0x00 , // 其他功能、速度、长度3:1个四分音符的微秒数800,000 0x84 , 0xE7 , 0x00 , // 时间差:128^2*4+128*103+0 = 78720 0xFF , 0x2F , 0x00 , // 音轨结束标志。 0x4D , 0x54 , 0x72 , 0x6B , // "MTrk" 0x00 , 0x00 , 0x09 , 0xC9 , // 2505 该规长度: 0x00 , // 时间差 0xFF , 0x03 , 0x07 , // 歌曲标题,音轨名称,长度7 0x54 , 0x72 , 0x61 , 0x63 , 0x6B , 0x20 , 0x31 , // "Track 1" 0x00 , // 时间差 0xFF , 0x04 , 0x1F , // 乐器名称,长度31,--"Microsoft GS Wavetable SW Synth" 0x4D , 0x69 , 0x63 , 0x72 , 0x6F , 0x73 , 0x6F , 0x66 , 0x74 , 0x20 , 0x47 , 0x53 , 0x20 , 0x57 , 0x61 , 0x76 , 0x65 , 0x74 , 0x61 , 0x62 , 0x6C , 0x65 , 0x20 , 0x53 , 0x57 , 0x20 , 0x53 , 0x79 , 0x6E , 0x74 , 0x68 , 0x00 , // 时间差 0xB0 , 0x0A , 0x40 , // 调换控制,控制号10(声像控制器),(CAKEWALK默认值是64)新值64 0x89 , 0x30 , // 时间差=128*9+48=1200us 0x90 , 0x40 , 0x50 , // 音符打开,音符号64,速度80 (E5 : MI) 0x81 , 0x58 , // 时间差=128*1+88=216us 0x80 , 0x40 , 0x40 , // 音符关闭,音符号64,速度64 (E5 : MI) 0x18 , // 时间差=24us 0x90 , 0x45 , 0x50 , // 音符打开,音符号69,速度80 (A5 : La) 0x81 , 0x58 , // 时间差=128*1+88=216us 0x80 , 0x45 , 0x40 , // 音符关闭,音符号69,速度64 (A5 : La) 0x18 , 0x90 , 0x47 , 0x50 , // 音符打开,音符号71,速度80 (B5 : Si) 0x81 , 0x58 , // 时间差=128*1+88=216us 0x80 , 0x47 , 0x40 , // 音符关闭,音符号71,速度64 (B5 : Si) 0x18 , 0xB0 , 0x40 , 0x7F , // 调换控制,控制号64(延音控制器),新值117 0x00 , // 时间差 0x90 , 0x48 , 0x64 , // 音符打开,音符号72,速度100 (C6 : Do) 0x00 , // 时间差 0x90 , 0x45 , 0x50 , // 音符打开,音符号69,速度80 (A5 : La) 0x83 , 0x60 , // 时间差=128*3+96=480us 0x80 , 0x48 , 0x40 , // 音符关闭,音符号72,速度64 (C6 : Do) 0x00 , // 时间差 0x80 , 0x45 , 0x40 , // 音符关闭,音符号69,速度64 (A5 : La) 0x00 , // 时间差 0x90 , 0x4A , 0x64 , // 音符打开,音符号74,速度100 (D6 : RE) 0x81 , 0x70 , // 时间差=128*1+102=230us 0x80 , 0x4A , 0x40 , // 音符关闭,音符号74,速度64 (D6 : RE) 0x00 , // 时间差 0x90 , 0x4C , 0x64 , // 音符打开,音符号76,速度100 (E6 : MI) 0x81 , 0x70 , // 时间差=128*1+102=230us 0x80 , 0x4C , 0x40 , // 音符关闭,音符号76,速度100 (E6 : MI) 0x00 , 0xB0 , 0x40 , 0x7F , // 调换控制,控制号64(延音控制器),新值117 0x00 , 0x90 , 0x4A , 0x64 , // 音符打开,音符号74,速度100 (D6 : RE)
MIDI看起来是这样的东西,它本身就是简单的二进制协议,可以方便的与合成器或者其他电子音乐设备进行通信。最开始是针对8位微型控制器涉及的,每一个音符都由三个字节表示,例如
92 3C 64
92 — 9 == 音符信息种类
2 == 2个通道
3C — 音符 60 (中央 C)
64 — 速度
这么看起来太麻烦了,上次说过一些库直接就可以转换成人容易理解的方式(mido)
import mido msg = mido.Message('note_on', note=60) mid = mido.MidiFile('jesu.mid') for i, track in enumerate(mid.tracks): print('Track {}: {}'.format(i, track.name)) for msg in track: print(msg)
是不是很容易理解了呢,note:音高(MIDI格式里面的),velocity:速度,time:时值。
还有一些开头结尾的标识也能方便地看出来。
厉害
厉害