文章目录

  • 一、从 MIDI 文件中可以获取的信息
    • 1、音符速度设置事件
    • 2、拍号设置事件
    • 3、文件头基本时间
  • 二、节拍时值计算
  • 三、小节时值计算

一、从 MIDI 文件中可以获取的信息


MIDI 时间标志原始信息来源 , 就是 MIDI 文件中的 Meta 事件 ;

Meta 事件 以 FF 开始 , 其格式如下 :

FF xx nn dd

  • FF : 表示 Meta 事件的 开始标志 ;
  • xx : 表示 该 Meta 事件的类型 , 如 03 类型表示该 Meta 事件是 " 音符速度设置事件 " , 04 类型表示该 Meta 事件是 " 拍号设置事件 " ;
  • nn : 表示 该 Meta 事件有多少个字节 , 该数值可以是可变长度的数值 , 一般情况下只占 111 字节 ;
  • dd : Meta 事件的实际数据 , 有 nn 个字节 ;

MIDI 文件中的 " 音符速度设置 Meta 事件 " , " 拍号设置 Meta 事件 " , " 文件头的 基本时间 " , 决定了该 MIDI 曲子的事件标志 ;

1、音符速度设置事件

参考 【BLE MIDI】MIDI 文件格式分析总结 ★★★ 八、FF 51 03 四分音符时长 博客章节 , 可以知道 , FF 51 03 是时间设定的标志 ;

FF 51 03 07 A1 20 : 32 ~ 37 字节 , 音符速度标志 ;

FF 51 03 是音符速度标志位 , 后面的 07 A1 20 3 字节是一个数字 , 代表 四分音符 的时长 , 单位是微秒 ;

07 A1 20 对应十进制数是 500000 , 五十万 , 也就是一个四分音符是 50 万微秒 ;

在之前的 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 ) 二、MIDI 文件头解析 5、基本时间 博客章节 解析到一个四分音符有 480 个 tick ;

此时可以计算出每个 tick 的时长为 500000480\cfrac{500000}{480}480500000​ 微秒 ;

再回顾下 delta-time 的计算 :

8E 7E 对应的二进制位数为 : 1000 1110 0111 1110

第一个字节 8E 对应的二进制数据位 1000 1110 , 其中第七位的 1 表示这是 delta-time 的高位字节 , 后面的 000 1110 是实际的数值数据 ;

第一个字节 7E 对应的二进制数据位 0111 1110 , 其中第七位的 0 表示这是 delta-time 的低位字节 , 后面的 111 1110 是实际的数值数据 ;

则该 delta-time 的实际数据是 000 1110 111 1110 , 重新组合后为 111 0111 1110 , 该 delta-time 的值是 1918 , 也就是 1918 个 tick 数 ;

上述的 delta-time 是 1918 个 tick , 对应的时间是 500000×1918480\cfrac{500000 \times 1918}{480}480500000×1918​ 微秒

2、拍号设置事件

FF 58 04 04 02 18 08 : 39 ~ 45 字节 , 拍子记号 ;

FF 58 04 是拍子记号的标志 ;

04 02 18 08 分别表示 :

  • 04 : 拍子记号的分子 ;
  • 02 : 拍子记号分母标志 , 这里的值是 2 的次幂值 , 如当前设置的值是 2 , 则拍子记号的分母是 22=42^2 = 422=4 , 分母是 4 ;
  • 18 : 每个 MIDI 时钟包含的 tick 数 ; 标准值是 24 , 一般不会改变 ;
  • 08 : 每 24 个 MIDI 时钟 , 对应的 32 分音符的数目 ; 标准值是 8 , 一般不会改变 ;

后面的 00 是 delta-time , 与下一个 midi 事件间隔的 tick 数 ;

delta-time 参考 【BLE MIDI】MIDI 文件格式分析 ( MIDI 轨道分析 | MIDI 轨道头 | MIDI 轨道长度 | delta-time 间隔 ) 四、delta-time 间隔 博客章节 ;

3、文件头基本时间

参考 【BLE MIDI】MIDI 文件格式分析总结 ★★★ 二、MIDI 文件头解析 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 文件中计算时间的最基本单位 ;

二、节拍时值计算


在文件头的基本时间中 , 可以获取到每个 四分音符的 tick 或 pulse 数 ;

在 Meta 事件 音符速度设置事件 中 , 可以获取到每个 四分音符的 微秒数 ;

此时可以将 tick 或 pulse 值 , 与 现实的 微秒 时间 对应起来 ;

如果要计算具体的小节位置 , 需要结合拍号来计算 ,

上面只是获取了 四分音符 的时值信息 , 即 四分音符的 tick 数 , 以及 四分音符 的 微秒数 ;

如果要计算 节拍 时间 , 要看 拍号中的分母值 ,

  • 如果分母是 222 , 则每拍的时值 直接使用 四分音符 时值乘以 222 ;

  • 如果分母是 444 , 则每拍的时值 就是 四分音符的时值 ;

  • 如果分母是 888 , 则每拍的时值 直接使用 四分音符 时值除以 222 ;

三、小节时值计算


每个小节的时值 就是 每拍的时值 乘以 拍号分子 ;

【BLE MIDI】MIDI 时间标志分析 ( 音符速度设置事件 | 拍号设置事件 | 基本时间 - 每个四分音符有多少 tick 或 pulse | 节拍时值计算 | 小节时值计算 )相关推荐

  1. 1分钟设置快递单号的自动刷新时间

    最近有很多朋友在问,导入快递单号查询物流后,如何设置自动刷新时间呢?不知道如何操作的宝贝们,下面请随小编一起来试试. 所需工具 快递批量查询高手 快递单号若干 操作步骤 运行[快递批量查询高手],进入 ...

  2. 【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )

    文章目录 前言 一.FF 03 轨道名称 二.FF 51 03 四分音符时长 前言 在博客 [BLE MIDI]MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI ...

  3. 【四分之四拍】四分之四拍每拍实际占多长时间?【用最理科的方式解释音乐里的这些玩意,不对之处欢迎指正】

    文末具体例子完了有通用公式 首先,需要明确一下,每首音乐都有个这么个东西 那个1=D就不管了,是音调的偏移,与速度时间无关 后面需要注意的就是这个4/4(其他曲谱也许6/8,3/4等等,为了方便描述区 ...

  4. FLStudio 四分音符八分音符 四四拍四二拍

    长的是四分音符 短的是八分音符 经过长期的实践,人们发现,人耳听到的两个音,当它们的频率是2倍关系时,会让人觉得是等音距的.就是从人的听觉来说,会觉得这两个音的距离"相等".比如 ...

  5. 【BLE MIDI】MIDI 文件格式分析 ( FF 58 04 拍号 | 音符开指令 | 音符关指令 | 音轨结束标志 )

    文章目录 前言 一.FF 58 04 拍号 二.音符开指令 三.音符关指令 四.音轨结束标志 前言 在博客 [BLE MIDI]MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标 ...

  6. springboot大学生时间管理分析系统毕业设计源码130930

    摘  要 时间是一种无形资源,但可以对其进行有效的使用与管理.时间管理倾向是个体在运用时间方式上所表现出来的心理和行为特征,具有多维度.多层次的心理结构,由时间价值感.时间监控观和时间效能感构成.时间 ...

  7. (附源码)ssm大学生时间管理分析系统设计与实现 毕业设计130930

    摘 要 时间是一种无形资源,但可以对其进行有效的使用与管理.时间管理倾向是个体在运用时间方式上所表现出来的心理和行为特征,具有多维度.多层次的心理结构,由时间价值感.时间监控观和时间效能感构成.时间是 ...

  8. ssm大学生时间管理分析系统设计与实现 毕业设计-附源码130930

    摘 要 时间是一种无形资源,但可以对其进行有效的使用与管理.时间管理倾向是个体在运用时间方式上所表现出来的心理和行为特征,具有多维度.多层次的心理结构,由时间价值感.时间监控观和时间效能感构成.时间是 ...

  9. 2009年下半年11月份信息系统项目管理师上午试题答案(分析与解答)(第5次修订 修订时间:2010年03月14日02时02分)

    笔者欲:诚交软考高级资格朋友,搭建高级资格俱乐部 ● 一般可以将信息系统的开发分成5个阶段,即总体规划阶段.系统分析阶段.系统设计阶段.系统实施阶段.系统运行和评价阶段,在各个阶段中工作量最大的是(1 ...

最新文章

  1. 第五章ThinkingInJava
  2. Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
  3. cognos学习轨迹
  4. go标准库的学习-sync互斥
  5. QT udp自动获取对方ip和端口号
  6. python中定义函数常用关键字_Python 中定义函数的关键字是 _________________ 。_学小易找答案...
  7. 解决:object_detection/protos/*.proto: Invalid argument.
  8. 安全测试的一些漏洞和测试方法
  9. GC(垃圾处理机制)面试加薪必备
  10. linux查找命令、find、grep总结
  11. 润乾V5打印完成后事务处理
  12. addeventlistener事件参数_从Chrome源码看浏览器的事件机制
  13. tomcat加上了https后访问不了_西部数码使用指南:部署https后访问提示存在安全隐患的排查解决方法...
  14. 2017android 最强旗舰,2017年世界六大旗舰机,华为第五,第一惊艳全球!
  15. 【Kafka】Kafka Failed to send SSL Close message IOException: Broken pipe
  16. CSS教程--CSS 属性选择器
  17. jQuery加载js脚本
  18. pythonyield详解_yield详解
  19. JavaScript的一些名词(持续更新中-取自javaScript高级程序设计)
  20. origin中文版散点图拟合曲线_Origin使用自定义函数拟合曲线函数

热门文章

  1. 【iptables】编写iptables防火墙规则-1
  2. java基础 关于转换流
  3. ActiveMQ简单使用介绍
  4. Windows 8实用窍门系列:10.Windows 8的基本变换和矩阵变换以及AppBar应用程序栏
  5. Avalon-MM 阿窝龙妹妹应用笔记
  6. Windows蓝屏(Beginning Dump of Physical Memory)
  7. Google的成果回报型广告
  8. 石川es6课程---18、ES6 复习
  9. 八皇后问题 (递归 搜索)
  10. [SSH] Eclipse+Struts+Hibernate的简单应用