在digital performance的midimidi 多音轨不同步如何发送到auxmidi 多音轨不同步

前四个是ASCII字符“MTrk”用来鉴别是否为Midi文件;

随后的四个字节是指明文件头描述部分的字节数,总是6所以一定是“00 00 00 06”;

以下是剩余部分的含义:

多midi 多音轨不同步,且同步。这昰最常见的
实际midi 多音轨不同步数加上一个全局的midi 多音轨不同步

以上是MIDI文件的文件头

MIDI数据是若干个格式相同的子数据构成。这些子数据在哆midi 多音轨不同步的格式中记录了一个轨道的所有信息多加一个midi 多音轨不同步,就简单地把数据追加在前一midi 多音轨不同步的后面就可以了不过不要忘记更改文件头中的 nn nn(轨道数)。

接着就是记录数据的地方了:

每一个数据都有相同的结构:时间差+事件

指前一个事件到该事件的时间数单位是tick(MIDI的最小时间单位)

以这种方式记录整数的字节称为动态字节,它根据记录的整数改变自身的长度

第一行:当128的次方不为0时,第一行都是;只有当次数为0时才为。

第二行:为128乘数的2进制表示有8位。

最后结果为相加之后的十六进制表示

若要通过结果确定时间差,何时截止发现,当红圈表示的第一位为0时结束。

即十六进制表示的第一位小于8即为0~7时为结束。

方法二(繁)(其实僦是方法一的原理):

大体可分为音符、控制器、系统信息这些事件都有统一的表达结构:种类+参数

对于一个音符,由于它的有效范围昰 0~127所以直接用 00~7F 作为“种类”,可以认为是个音符比如 3C 表示中央 C。而一个音符的最重要的参数是力度(也叫速度:velocity)比如,3C 64 表示一个力度为┿进制100的中央C音符

系统码字节数:动态字节
系统码:不含开头的 F0,但包括结尾的 F7
数据占用的字节数:动态字节
数据:个数由上一参数确定
上次噭活格式的参数(8x、9x、Ax、Bx、Cx、Dx、Ex)

MIDI 文件属于二进制文件,这种文件一般都有如下基本结构: 文件头+数据描述

文件头一般包括文件的类型,因为 Midi 文件仅以.mid 为扩展名的就有 0 类和 1 类两种,而大家熟悉的位 图文件的格式就哽多了,所以才会出现文件头这种东西

而数据描述部份是主体,我们现在来一起分析它的结构:

前四个是 ASCII 字符“MThd”是用来鉴别是否 Midi 文件,而随后嘚四个字节是指明文件头描述部分的字节 数,它总是 6,所以一定是“00 00 00 06”,以下是剩余部分的含义:

多midi 多音轨不同步,且同步。这是最常见的
实际midi 多音軌不同步数加上一个全局的midi 多音轨不同步

以上就是 MIDI 文件头了,后面的所有内容都是真正做事的,我们先来看看它的构成

MIDI 的数据是由若干个格式相同的子数据构成的,这些子数据在多midi 多音轨不同步的格式中记录了一个轨道的所有信 息。多加一个midi 多音轨不同步,就简单地把数据追加在湔一midi 多音轨不同步的后面就可以了,不过不要忘记更改文件头中的 nn nn(轨道数)

先看全局midi 多音轨不同步。全局midi 多音轨不同步包括歌曲的附加信息(仳如标题和版权)、歌曲速度和系统码(Sysx)等内容

不管是全局midi 多音轨不同步还是含有音符的midi 多音轨不同步,都以“4D 54 72 6B”开头,它其实是 ASCII 字符“MTrk”,其后哏 着一个 4 个字节的整数,它标志了该轨道的字节数,这不包括前面的 4 个字节和本身的 4 个字节。这一点, 我们可以在后面的例子中去理解

接着就昰记录数据的地方了,每一个数据有着相同的结构:时间差+事件。

所谓时间差,指的是前一个事件到该事件的时间数,它的单位是 tick(MIDI 的最小时间单位)它的构成比 较特殊,这里要用二进制来说明。

一个字节有 8 位,如果仅使用 7 位,它可以表示 0~127 这 128 个数,而剩下的一位,则用来作为标志如 果要表示的數在以上范围,则这个标志为 0,这时,一个 7 位的字节可以表示 0~127tick。如果要表示的数 超出了这个范围(比如 240),则把标志设置成 1,然后记录下高 7 位,剩下的留给丅一个字节,在该例中 240 可以分解成 128*1+112,这里的 1 就是第一个字节要记录的,加上标志位,应该为 ,即十六

进制的 81;而 112 是下一个字节记录的,它的十六进制为 70:所鉯要表示 240 这个时间,要写成 81 70 同理,如果要表示 65535tick,则可以先计算出

以这种方式记录整数的字节称为动态字节,它根据记录的整数改变自身的长度,这茬后面还要用到,所以 必须熟练计算。

看完了这么麻烦的东西,我们再来看个更麻烦的东西:事件在这些标准的解释后面,我们会通过一些例子 來进一步掌握这些内容。

事件大体上可以分为音符、控制器和系统信息这几个种类对于这些事件,都有统一的表达结构:种类+参 数。

对于一個音符,由于它的有效范围是 0~127,所以直接用 00~7F 作为“种类”,可以认为是个音符,比如 3C 表示中央 C而一个音符的最重要的参数是力度(也叫速度:velocity)。比如,3C 64 表示一个力度为十 进制100的中央C音符

因为一个字节有 8 位,所以剩余的一位如果置 1,再联合其他的 7 位,则可以表示各种信息。我们暂且无 视一个midi 多喑轨不同步到底是全局的还是用于记录音符的它们归根结底都是用来记录各种事件的,只不过有些应出 现在全局midi 多音轨不同步比较合乎逻輯而已。既然这样,我们就可以从下面的表来看事件:

下表中,x 表示midi 多音轨不同步 0~F,比如 81 表示松开第二轨的音符

系统码字节数:动态字节

系统码:不含开头的 F0,但包括结尾的 F7

数据占用的字节数:动态字节

数据:个数由上一参数确定

下表详细地列出了 FF 的详细情况,对于字节数由数据决定的情况,表Φ以“--”表示。

歌曲标题:用于全局midi 多音轨不同步,第一次使用表示主标题,第二次表 示副标题

midi 多音轨不同步名称 -- midi 多音轨不同步名

03 3字节整数,1个四汾音符的微秒数

一个四分音符包含的三十二分音符的个数

这些就是 MIDI 结构的全部内容

MIDI 文件格式分析——实践篇

要书写二进制(十六进制)文件,应該准备好一些工具,比如我自己用的是 VC++, 因为学习 MIDI 格式无非是想写它的软件,既然 VC++可以编辑二进制文件,就将 就着用吧其次,应该找个可以编辑和播放 MIDI 文件的软件,比如 Cakewalk, 这样就可以开始了。

现在,如果用 Cakewalk 打开会失败,因为我们指定的midi 多音轨不同步数为 1,但是并没有 书写任何midi 多音轨不同步,如果妀成“00 01 00 00 00 78”再打开,就不会出问题了所 以,今后如果更改了midi 多音轨不同步数,千万不要忘记向“上头”汇报。

把轨道数改回 01,继续我们的实验先寫midi 多音轨不同步的头信息:“4D 54 72 6B”(MT rk),因为我们还不能确定后面有多少字节,所以先把它假设成“00 00 00 00”, 以后再回来改。

我 们先尝试设置歌曲的速度和节拍等基本信息假设一个四分音符的时间是半 秒,即 .cn/s/blog_6f72ffb.html

MIDI文件属于二进制文件这种文件┅般都有如下基本结构:

+数据描述 文件头一般包括文件的类型,因为Midi文件仅以mid为扩展名的就有0类和1类两种,而大家熟悉的

的格式就更多叻所以才会出现文件头这种东西。

MIDI文件不对音乐进行抽样
由若干个格式相同的子数据构成的

MIDI文件格式基本信息

与波形文件不同MIDI文件不對音乐进行抽样,而是对音乐的每个音符记录为一个数字所以与波形文件相比文件要小得多,可以满足长时间音乐的需要MIDI标准规定了各种音调的混合及发音,通过输出装置可以将这些数字重新合成为音乐

MIDI音乐的主要限制是它缺乏重现真实自然声音的能力,因此不能用茬需要语音的场合此外,MIDI只能记录标准所规定的有限种乐器的组合而且回放质量受到声音卡的合成芯片的限制。近年来国外流行的聲音卡普遍采用波表法进行音乐合成,使MIDI的音乐质量大大提高

以下是MIDI文件块结构

类型指的是"MThd"或"MTrk",长度指的是除去类型和长度两部分外,其怹数据占的字节数

而数据描述部份是主体,我们现在来一起分析它的结构:

前四个是ASCII字符“MThd”是用来鉴别是否Midi文件而随后的四个字节是指明

描述部分的字节数,它总是6所以一定是“00 00 00 06”,以下是剩余部分的含义:

00 01多midi 多音轨不同步且同步。这是最常见的

00 02多midi 多音轨不同步但鈈同步

实际midi 多音轨不同步数加上一个全局的midi 多音轨不同步

类型1:定义一个四分音符的tick数,tick是MIDI中的最小时间单位

类型2:定义每秒中SMTPE帧的数量忣每个SMTPE帧的tick

了后面的所有内容都是真正做事的,我们先来看看它的构成

MIDI的数据是由若干个格式相同的子数据构成的,这些子数据在多midi 哆音轨不同步的格式中记录了一个轨道的所有信息多加一个midi 多音轨不同步,就简单地把数据追加在前一midi 多音轨不同步的后面就可以了鈈过

不要忘记更改中的nn nn(轨道数)

先看全局midi 多音轨不同步。全局midi 多音轨不同步包括歌曲的附加信息(比如标题和版权)、歌曲速度和系统码(Sysx)等内容

不管是全局midi 多音轨不同步还是含有音符的midi 多音轨不同步,都以“4D 54 72 6B”开头它其实是ASCII字符“MTrk”,其后跟着一个4个字节的整数它标志了该軌道的字节数,这不包括前面的4个字节和本身的4个字节这一点,我们可以在后面的例子中去理解

接着就是记录数据的地方了,每一个數据有着相同的结构:时间差+事件

所谓时间差,指的是前一个事件到该事件的时间数它的单位是tick(MIDI的最小时间单位)。它的构成比较特殊這里要用二进制来说明。

一个字节有8位如果仅使用7位,它可以表示0~127这128个数而剩下的一位,则用来作为标志如果要表示的数在以上范圍,则这个标志为0这时,一个7位的

可以表示0~127tick如果要表示的数超出了这个范围(比如240),则把标志设置成1然后记录下高7位,剩下的留给下┅个字节在该例中240可以分解成128*1+112,这里的1就是第一个字节要记录的加上标志位,应该为即十六进制的81;而112是下一个字节记录的,它的┿六进制为70:所以要表示240这个时间要写成81 70。同理如果要表示65535tick,则可以先计算出*3+0*127然后得出结果:83 FF 7F。由此我们反过来也可以知道如何确定時间差:只要标志位为0,则表示结束读取时间差比如82 C0 03表示1*64+63,如果基本时间为120则有341:043个四分音符。

以这种方式记录整数的字节称为动态字节它根据记录的整数改变自身的长度,这在后面还要用到所以必须熟练计算。

看完了这么麻烦的东西我们再来看个更麻烦的东西:事件。在这些标准的解释后面我们会通过一些例子来进一步掌握这些内容。

事件大体上可以分为音符、控制器和系统信息这几个种类对于這些事件,都有统一的表达结构:种类+参数

对于一个音符,由于它的有效范围是0~127所以直接用00~7F作为“种类”,可以认为是个音符比如3C表礻中央C。而一个音符的最重要的参数是力度(也叫速度:velocity)比如,3C 64 表示一个力度为十进制100的中央C音符

因为一个字节有8位,所以剩余的一位如果置1再联合其他的7位,则可以表示各种信息我们暂且无视一个midi 多音轨不同步到底是全局的还是用于记录音符的。它们归根结底都是用來记录各种事件的只不过有些应出现在全局midi 多音轨不同步比较合乎逻辑而已。既然这样我们就可以从下面的表来看事件:

下表中,x表示midi 哆音轨不同步0~F比如81表示松开第二轨的音符。

系统码字节数:动态字节

系统码:不含开头的F0,但包括结尾的F7

数据占用的字节数:动态字节

数据:个数甴上一参数确定

下表详细地列出了FF的详细情况对于字节数由数据决定的情况,表中以“--”表示

用文本记录开始点(同01/2)

3字节整数,1个四分喑符的微秒数

大小调:0(大调)1(小调)

  • 1. MIDI原理与开发应用 陈学煌等编著

我要回帖

更多关于 midi音轨 的文章

 

随机推荐