设为首页收藏本站帮助中心
查看: 486|回复: 5
收起左侧

易语言实现分析Midi文件头部信息实现检查音乐数据是否完整或破损

[复制链接]
发表于 2018-5-4 15:21:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?加入我们

x

  1. .版本 2
  2. .支持库 spec

  3. .程序集 程序集1

  4. .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码


  5. _临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
  6. 返回 (0)  ' 可以根据您的需要返回任意数值

  7. .子程序 _临时子程序

  8. ' 易语言实现分析Midi文件头部信息实现检查音乐数据是否完整或破损

  9. 调试输出 (Midi数据完整检查 (读入文件 (“test.mid”)))


  10. .子程序 Midi数据完整检查, 逻辑型, 公开
  11. .参数 Midi数据, 字节集
  12. .参数 多余字节集, 字节集, 可空
  13. .局部变量 音轨, 字节型
  14. .局部变量 MTrk数量, 整数型
  15. .局部变量 基本时间, 整数型
  16. .局部变量 Midi事件表, 字节集, , "0"
  17. .局部变量 计数, 整数型
  18. .局部变量 MTrk字节数, 整数型
  19. .局部变量 多余字节数, 整数型
  20. .局部变量 实际MTrk数量, 整数型
  21. .局部变量 多余MTrk数量, 整数型

  22. .如果真 (取字节集长度 (Midi数据) = 0)
  23.     调试输出 (“文件不存在或数据零字节。”)
  24.     返回 (假)
  25. .如果真结束
  26. .如果真 (取字节集左边 (Midi数据, 8) ≠ { 77, 84, 104, 100, 0, 0, 0, 6 })
  27.     调试输出 (“头部前8字节错误,不是Midi格式”)
  28.     返回 (假)
  29. .如果真结束
  30. 音轨 = Midi数据 [10]
  31. .判断开始 (音轨 = 0)
  32.     ' 调试输出 (“单音轨”)
  33. .判断 (音轨 = 1)
  34.     ' 调试输出 (“多音轨,同步”)
  35. .判断 (音轨 = 2)
  36.     ' 调试输出 (“多音轨,异步”)
  37. .默认
  38.     调试输出 (“发现未知音轨”)
  39.     返回 (假)
  40. .判断结束
  41. MTrk数量 = 左移 (Midi数据 [11], 8) + Midi数据 [12]
  42. .如果真 (MTrk数量 = 0)
  43.     调试输出 (“头部标注的音轨数量为零,此Midi中可能没有数据。”)
  44.     返回 (假)
  45. .如果真结束
  46. 基本时间 = 左移 (Midi数据 [13], 8) + Midi数据 [14]
  47. .如果真 (基本时间 = 0)
  48.     调试输出 (“基本时间为零”)
  49.     返回 (假)
  50. .如果真结束
  51. Midi事件表 = 分割字节集 (Midi数据, { 77, 84, 114, 107 }, )
  52. .如果真 (取字节集长度 (Midi事件表 [1]) ≠ 14)
  53.     调试输出 (“头部字节数错误”)
  54.     返回 (假)
  55. .如果真结束
  56. 删除成员 (Midi事件表, 1, 1)
  57. 实际MTrk数量 = 取数组成员数 (Midi事件表)
  58. 多余MTrk数量 = 实际MTrk数量 - MTrk数量
  59. .如果真 (实际MTrk数量 ≠ MTrk数量)
  60.     .如果真 (实际MTrk数量 < MTrk数量)
  61.         调试输出 (“实际音轨数量少于头部标注的音轨数量,会造成无法播放。”)
  62.         返回 (假)
  63.     .如果真结束
  64.     调试输出 (“警告:实际音轨数量多余头部标注的音轨数量,可能会播放异常。”)
  65. .如果真结束
  66. .计次循环首 (MTrk数量, 计数)
  67.     MTrk字节数 = 取字节集数据 (字节集倒序 (取字节集左边 (Midi事件表 [计数], 4)), 3, )
  68.     Midi事件表 [计数] = 取字节集右边 (Midi事件表 [计数], 取字节集长度 (Midi事件表 [计数]) - 4)
  69.     多余字节数 = 取字节集长度 (Midi事件表 [计数]) - MTrk字节数
  70.     多余字节集 = {  }
  71.     .如果真 (多余字节数 > 0 且 MTrk数量 = 计数)
  72.         调试输出 (“警告:Midi文件尾部发现多余无用的数据,共计” + 到文本 (多余字节数) + “字节”)
  73.         多余字节集 = 取字节集右边 (Midi事件表 [计数], 多余字节数)

  74.     .如果真结束
  75.     Midi事件表 [计数] = 取字节集左边 (Midi事件表 [计数], MTrk字节数)
  76.     .如果真 (MTrk字节数 > 取字节集长度 (Midi事件表 [计数]))
  77.         调试输出 (“音轨字节数少于头部标注的字节数,数据存在缺损。”)
  78.         返回 (假)
  79.     .如果真结束
  80.     .如果真 (寻找字节集 (Midi事件表 [计数], { 255, 47, 0 }, ) = -1)
  81.         调试输出 (“音轨数据中没有发现结束指令。”)
  82.         返回 (假)
  83.     .如果真结束

  84. .计次循环尾 ()
  85. 调试输出 (“检查通过”)
  86. 返回 (真)

  87. .子程序 字节集倒序, 字节集
  88. .参数 字节集数据, 字节集
  89. .局部变量 长度, 整数型
  90. .局部变量 返回值, 字节集
  91. .局部变量 计数, 整数型

  92. 长度 = 取字节集长度 (字节集数据)
  93. 返回值 = 取空白字节集 (长度)
  94. .计次循环首 (长度, 计数)
  95.     返回值 [计数] = 字节集数据 [1 + 长度 - 计数]
  96. .计次循环尾 ()
  97. 返回 (返回值)
复制代码


相关帖子

回复

使用道具 举报

发表于 2018-5-4 16:56:37 | 显示全部楼层
路过,没研究过这玩意。
回复 支持 反对

使用道具 举报

发表于 2018-5-4 18:51:50 | 显示全部楼层
我也没整过,路过看看
回复 支持 反对

使用道具 举报

发表于 2018-5-4 21:14:13 | 显示全部楼层
黑科技,路过谢谢那啥
回复 支持 反对

使用道具 举报

发表于 2018-5-7 15:03:47 | 显示全部楼层
我也没弄明白后来
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则