一、MIDI文件结构分析   MIDI文件包含首部块(Header Chunk)和音轨块(Track Chunk)两部分。其格式一般如下:

  MThd <数据长度> <Header数据>    //首部块
  .......
  Mtrk <数据长度> <Track数据>     //音轨块
  Header Chunk 结构为:
  char MidiId[4];
  long length;
  int  foarmt;
  int  TrackNum;
  int  division;

其中:

  MidiId称为MIDI文件头标志,一般将其设置为MThd;

  length为文件首部数据长度(除它本身和文件头标志占用的字节以外),通常它设置为6,即format,TrackNum和division共占用的字节数据长度;

  format表示MIDI文件存放的格式,当前只有3种格式:

  0 表示MIDI文件只有一个Track Chunk;
  1 表示MIDI文件只有一个或多个Track Chunk;
  2 表示MIDI文件只有一个或多个各处独立的Track Chunk。
  division指定计数的方法,一种随时间计数(最高位设置为0时),另一种使用制式的时间码(最高位设置为1时)。这里,主要介绍随时间计数的一种格式。其各位意义如下:

  ┌───┬──────────┐
  │  0   │每一拍的计数值 │
  └───┴──────────┘
  b15     b14  ̄ b0

  其最高位一定要设置为0,其它的15位表示每一拍的计数值。如该数据为96(以八分音符为一拍),则表示一个四分音符延时数应该为192。

  另外,在MIDI文件中,long和int型数据均将高字节值存放入低地址上,如一个long型数据为0x45678,则在文件中,存放的结果为:0x00,0x04,0x56,0x78。而在内存中,int,long的变量值通常将崐高字节值存放高地址上。因此,存放数据时,应该作一下调整。

  Track Chunk为用来播放歌曲的数据信息。每一个Track Chunk是一组简单的MIDI码(包括一些非MIDI码)的集合。它又由头部信息和崐若干个Mtrk event组合而成。

  头部结构和意义为:

  char TrackChunkId[4];      //Track Chunk标志MTrk
  long TrackChunkMsgLength;  //该Track Chunk信息长度

  而Mtrk event是由时间计数值(dela-time)和event(MIDI码信崐息)组合成的。即:

  <Mtrk event>=<dela-time> <event>

  <dela-time>使用可变长度的形式存储数据,它代表处理event之前要计数时间值。 它在音乐中,即表示拍数。通常音乐开始演奏时,总是将计数时间值设置为0。为了能连续处理两个event,我们可以将deta-time设置为0。如:3和5同时演奏2拍(每一拍计数值为24),可以设置如下:

  deta-time    event
  0         开始演奏3
  0         开始演奏5
  48        停止3演奏
  0         停止5演奏

  event表示MIDI码信息集,如0x9n表示开始发音,0x8n表示关闭发音等等(下有说明)。

  上述的dela-time使用可变长度的形式表示数据值。可变长度形崐式是MIDI文件中对于大于8位的数据打用的一种存储方式,它把每一个数据定义为7位,剩下的最高位作为数据长度的识别。当这一位为0时,表示数据是最后一个,若为1,则表示还有下一个。

  如:数值0x3fff,可变长度形式便为0xff,0x7f;0x4000则应该为0x81,0x80,0x00。此数据的转换可以参阅WriteLenghtToBuf()函数。

二、常见MIDI码说明

  MIDI码是制定音乐交换的信息码,它使用串行非同步传送,因此数据码是用多码形式。第一个MIDI码是状态码,剩余的都是数据码,其长度视状态而定。

  以下是一些常见的MIDI码。

  1、开始发音(0x9n)

  格式为:0x9n note speed

  它一共占用3个字节,n表示通道号,取值0-15。MIDI可以同时演奏16个通道,用此指定在哪一个通道上发音(以下n相同)。

  note表示音高数值,即音阶码值。如C4(中音1)为60,它的取值在0xc和0x6c之间(具体码值,可参考「参考书籍1」)。

  speed表示按键时的速度,用此表示音的力度。若没有力度感,可以将其设置为64,若为0,表示关闭发音。

  如:在第2通道上开始演奏3,则MIDI码便为0x91,63,40。

  MIDI规范还规定,若连续向同一通道上发送多个音,则可以不指出状态码。如上述同时演奏3,5,MIDI码便为:0x91,63,40,65,40。

  2、关闭发音(0x8n)。

  格式:0x8n note speed

  说明同上。通常它用0x9n,note,0来代替。

  3、切换音色(0xcn)。

  格式:0xcn,program

  program表示音色代码,0 ̄255之间,如Acou Piano 1(电钢1值为0),Synth Bass 1(电贝司1值为64)等(详见「参考书籍1」)。

  4、设置音量大小

  格式:0xbn ,07,size

  0xbn,39,size

  7,表示设置主音量的高字节值;39表示设置主音量的低字节值。

  5、设置时间记号

  格式:0xff 0x58 04 nn dd cc bb

  nn和dd直接对应到谱号的数字,dd使用2的指数。如3/8,则nn=3,dd=3。cc是代表第次节拍器打后的时间是几个MIDI clock。bb通常设置为8表示多少个MIDI clock等于1/4 拍。

  6、设置演奏速度

  格式:0xff 0x51 03 tt tt tt

  tt tt tt 表示第一拍定义多少个Miscro Seconds。它即是用来崐变演奏的速度。

  7、写歌词

  格式:0xff 0x05 len text

  len表示歌词的长度,text表示歌词文本码。

8、磁道结束

  格式:0xff,0x2f,00

  它表示结束点。每外track chunk后都应该有此MIDI码。

三、MIDI信息文本文件制作

  为了能制成符合规范的MIDI文件,我们在此规定MIDI信息文本制作格式如下:

  [MIDI]
  <调号>,<节拍>,<每分钟节拍数>,<音轨个数>
  [1]
  .....
  [n]
  ....

  说明:

  1、调号,占用一个字符,必须为A、B、C、D、E、F、G,否则视为C调;

  2、节拍,取值如下:2/4,3/4,4/4,3/8,6/8....等。

  3、每分钟节拍数:表示每分钟演奏的节拍总数,取值在40-200崐之间,否则视为120。

  4、音轨个数表示此歌曲声部数。如三声部,可将其设置为3。

  5、[n]后表示此音轨的音乐信息。有如下说明字符组合而成。

音高:

  高音 C  D   E   F   G   A   B
  中音 1  2   3   4   5   6   7
  低音 c  d   e   f   g   a   b

  若某音升半音,则在其后加#号;降半音,在其后加b字符。

  音长: -(延长四分音符的一拍)、_(8分音符,后可带符点)、=(16分音符,后可带符点)、.(附点音符,后不可带符点)、:(32分音符,后可带符点)、;(64分音符,后不可带符点)。

  说明:在书写时,请先写完整的音高,再写音长,如简谱中的/"3-/",则应该为/"3#-/"。

  Pn:表示设置音色,取值1-256之间。
  {}:歌词或注释。
  |: 表示小节分隔符。
  //: 后继音均降八度
  /: 后继音均升八度
  Sn:音量大小,n数值越大,音量越大。
  其它的字符,视为非法字符。

  以下为歌曲《解放军的天》片断MIDI文本文件。

  [MIDI]

  F,2/4,150,2

  [1]

  P53

  /3=3=3=2= 3_.2=  | 1_1=e= g | 3=3=3=2= 3_3=2= | 1_1=e=  g |

  //6_. 5=  6_.5=  | 6_C_ 3_5_| 6=6=6=6= 6_6_   | 5=6=C_ C_3_|

  2_.3=   5_C_    | 6=5=3_ 5   | 6_. / 1= 2_.1=| 2_0_ 3_.2= |

  1_0_ 2_2_    |  //5_.6=  /1_3_ | 3=1=a_ 1 // |

  [2]

  P53  //

  1_C_ 5_G_ |  1_c_ 5_G_ | 1_C_ 5_G_ |  1_c_ 5_G_ |

  a_6_ 4_6_ | 1_5_ 3_ 5_ | a_6_ 4_6_ | 1_5_ 3_ 5_ |

  1_3_ 5_1_ | 1_6_ 4_6_ | 2_5_ 1_5_ | g_5_ 1_5_ |

  1_5_ 3_5_  | 1_6_ 4_6_| 3_2_ 1    |

MIDI文件结构分析及生成方法相关推荐

  1. midi文件结构分析及生成方法_移动短信技术

    从网上找的,已经将用BC写的改成了VC的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹. 对于制作MIDI音乐来说,比播放MIDI文件本 ...

  2. MIDI文件结构分析及生成方法大全

    从网上找的,已经将用BC写的改成了VC的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹. 对于制作MIDI音乐来说,比播放MIDI文件本 ...

  3. Python之pyc文件作用及生成方法

    Python之pyc文件作用及生成方法_宗而研之的博客-CSDN博客 1 什么是pyc 首先了解下python的运行机制及特性:当我们运行python文件程序的时候,Python解释器将源码转换为字节 ...

  4. ios私钥证书和描述文件.mobileprovision的生成方法

    苹果官方提供的创建私钥证书的方法需要使用mac电脑,但我们很多人没有mac电脑,这样我们就需要使用第三方工具来申请ios证书. 在这里我推荐使用香蕉云编这个在线工具: https://www.yune ...

  5. patch文件介绍和生成方法

    Git 打补丁-- patch 和 diff 的使用(详细) git diff和diff产生的文件简介 git patch制作相关简介 git format-patch 用法 如果要修改的patch当 ...

  6. 用JS生成MIDI文件(附代码)

    用JS生成MIDI文件 大家好,近期我们的课程需要我们做一个应用,我的的小组打算做一个在线的伴奏制作平台,这意味着我们需要知道如何在线制作音乐以及如何用浏览器播放. 小编我这一节就跟大家讲解下如何用J ...

  7. apache2.4配置https协议(key文件、crt文件、csr文件生成方法)

    生成私钥文件: 执行命令 [plain] view plain copy openssl genrsa -out server.key 1024 说明:这是用128位rsa算法生成密钥,得到serve ...

  8. apache2.2配置https协议(key文件、crt文件、csr文件生成方法)

    配置https协议: 1.安装好apache2.2环境,注意要装ssl版本的.这里装在c:/apache目录下. 2.生成服务器证书 1)在DOS命令下进入apache/bin目录 2)在window ...

  9. python图片保存为txt文件_python实现对文件中图片生成带标签的txt文件方法

    在深度学习中经常需要生成带标签的图片名称列表,xxxlist.txt文件,下面写一个简单的python脚本生成该文件列表. import os def generate(dir,label): fil ...

最新文章

  1. Category Archives: Linux
  2. mysql myasam_MySQL锁(MyISAM和InnoDB)
  3. Android 闹钟,实现demo
  4. 组件用.vue还是.js_如何使用Vue.js 2.0构建灵活的图像上传器组件
  5. oracel动态sql实例
  6. 【华为云技术分享】基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)
  7. ssdp安全-攻击和防御
  8. 孙河php_2月20日出走孙河桥-温榆河-沙河水库
  9. error C2011: “Font”:“struct”类型重定义
  10. WSS3.0开发-过滤列表内容(2)--一个增强的列表元数据查询webpart(SmartQueryWebPart)...
  11. bzoj4754: [Jsoi2016]独特的树叶
  12. 人工智能系统的形式化验证技术研究进展与趋势
  13. MT4跟单软件的API跟单模式有多少种?
  14. 关闭Ubuntu错误报告
  15. c语言给程序加锁,C语言使用fcntl对文件加锁
  16. Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程
  17. linux下刻录光盘读取不了_Linux下刻录光盘
  18. 360cdn能挡住cc攻击_揭秘为何使用CDN后一但被cc攻击网站就瘫痪的真正原因?
  19. 2020年有寓意的领证日期_2020年领证的好日子-2020有寓意的领证日期【蜜匠婚礼】...
  20. 20个关于可视化图表设计的技巧

热门文章

  1. padding规则介绍
  2. windows10无法连接到组织网络
  3. ssh登陆的一些错误
  4. 电容笔和触屏笔一样吗?Ipad高性价比电容笔排行
  5. js定义全局变量 vue页面_vue定义全局变量,以及方法的调用
  6. UP主排名丨飞瓜数据B站平台充电周榜排行榜2022年1月17日-1月23日
  7. 一场直播获利6亿,看“美ONE”如何打造出“李佳琦”这样一个价值过亿的IP!!!
  8. 拼多多服务器端研发 Java面试经验大全
  9. 移花接木—做一个简单的软件渲染器
  10. 技嘉brix安装esxi流水