MID格式详解
(2013-06-24 03:48:04)
标签:
it |
分类: 音频资料 |
1.概述:
一个MIDI文件基本上由两个部分组成,头块和轨道块。第二节讲述头块,第三节讲述轨
道块。一个MIDI文件有一个头块用来描述文件的格式、许多的轨道块等内容。一个轨道可以
想象为像一个大型多音轨录音机那样,你可以为某种声音、某种乐谱、某种乐器或者你需要
的任何东西分配一个轨道。
2.头块:
头块出现在文件的开头,有三种方式来描述文件。头块看起来一直是这样的:
4D 54 68 64 00 00 00 06 ff ff nn nn dd dd
前4个字节等同于ASCII码MThd,接着MThd之后的4个字节是头的大小。它将一直是00
00 00 00 06,因为现行的头信息将一直是6字节。
ff ff是文件的格式,有3种格式:
0-单轨
1-多规,同步
2-多规,异步
单轨,很显然就只有一个轨道。同步多轨意味着所有轨道都是垂直同步的,或者其他的
措辞为他们都在同一时间开始,并且可以表现一首歌的不同部分。异步多轨没有必要同时开
始,而且可以完全的不同步。
nn nn 是MIDI文件中的轨道数。
dd dd 是每个4分音符delta-time节奏数(这之后将做详细介绍)。
3.轨道块:
头块之后剩下的文件部分是轨道块。每一个轨道包含一个头,并且可以包含你所希望的
许多MIDI命令。轨道头与文件头及其相似:
4D 54 72 6B xx xx xx xx
与头一致,前4个字节是ASCII吗,这个是MTrk,紧跟MTrk的4个字节给出了以字节为单
位的轨道的长度(不包括轨道头)。
在头之下是MIDI事件,这些事件同现行的可以被带有累加的MIDI合成器端口接受和发送
的数据是相同的。一个MIDI 事件先于一个delta-time。一个delta-time是一个MIDI事件被
执行后的节奏数,每个四分之一音符的节奏数先前已经定义在了文件的头块中。这个delta-
time是一个可变长度的编码值。这种格式虽然混乱,可是允许根据需要利用多位表示较大的
数值,这不会因为需求小的数值情况下以添零的方式浪费掉一些字节!数值被转换为7位的
字节,并且除了最后一个字节以最高有效位是0外,各个字节最有意义的一位是1,。这就允
许一个数值被一次一个字节地读取,你如果发现最高有效位是0,则这就是这个数值的最后
一位(意义比较小)。依照MIDI说明,全部delta-time的长度最多超过4字节。
delta-time 之后就是MIDI事件,每个MIDI事件(除了正在运行的事件外)带有一个最
高有效位总是1的命令字节(值将>128)。大部分命令的列表在附录A中。每个命令都有不同
的参数和长度,但是接下来的数据将是最高有效位为零(值将<128)。这里有个例外就是
meta-event,最高有效位可以是1。然而,meta-events需要一个长的参数以区分。
微小失误就可以导致混乱的是运行模式,这是现行MIDI命令所忽略的地方,并且最终发
行的MIDI命令是假定的。这就意味这如果包含了命令,那么MIDI事件就是由delta-time与参
数组成而转换的。
4.综述:
如果这份说明仅仅是使问题更加混乱,那么以下提供的例子可能有助于澄清问题!同
时,两个公用程序和一个图解文件包含在这个文档里面:
DEC.EXE——这个公共程序是将二进制文件(比如.MID)转换成以十进制表示的对应每
个字节的有标记界限的文本文件。
REC.EXE——这个公共程序是将有标记界限的十进制数文本文件对应的每一字节转换成
二进制文件。
MIDINOTE.PS——这是一个对应键盘和五线谱的音符数字附录页。
附录A
1.MIDI事件命令
每个命令字节有两部分,左nybble(4位)包含现行的命令,右nybble包含将被执行的命
令的通道号,这里有16各MIDI通道8个MIDI命令(命令nybble必须最高有效位是1的)。在下
表中,X表示MIDI通道号。所有的音符即数据字节都<128(最高有效位是0)。
十六进制 二进制 数据 描述
8x
9x
Ax
Bx
Cx
Dx
cc=管道号
Ex
(什么意思搞不懂:)
下表是没有通道的 meta-events列表 ,他们的格式是:
FF xx nn dd
所有的 meta-events 是以 FF 开头的命令 (xx),长度,或者含在数据的字节数(nn),
现行的数据(dd)
十六进制 二进制 数据 描述
00
01
02
03
04
05
06
07
2F
51
58
59
7F
下表列出了控制整个系统的系统消息。这里没有MIDI通道数 (这些一般仅应用于MIDI键
盘等.)
十六进制
F8
FA
FB
FC
下表列出的是与音符相对应的命令标记。
八度音阶||
-----------------------------------------------------------------------------
参考资料:
"MIDI Systems and Control" Francis
Rumsey
"MIDI and Sound Book for the Atari ST" Bernd Enders
and Wolfgang Klem 1989 M&T
Publishing, Inc.
MIDI file specs and general MIDI specs were also
obtained by sending e-mail to
LISTSERV@AUVM.AMERICAN.EDU with the phrase GET MIDISPEC PACKAGE in the message.
------------------------------ DEC.CPP ------------------------------------
#include
#include
#include
void helpdoc();
main()
{
}
void
helpdoc()
{
}
---------------------------- REC.CPP ----------------------------------
#include
#include
#include
#include
void helpdoc();
main()
{
}
void
helpdoc()
{
}