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

易语言实现扫描A~Z盘所有MID/MIDI格式音乐并复制到指定目录(MD5文件名,不可能有重复)

[复制链接]
发表于 2019-3-8 17:06:52 | 显示全部楼层 |阅读模式

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

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

x


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

  3. .程序集 窗口程序集_启动窗口

  4. .子程序 _启动子程序, 整数型
  5. .局部变量 行, 文本型, , "0"
  6. .局部变量 计数, 整数型
  7. .局部变量 MIDI数据, 字节集
  8. .局部变量 MD5, 文本型
  9. .局部变量 全局路径, 文本型

  10. 写到文件 (“mid.bat”, { 64, 101, 99, 104, 111, 32, 111, 110, 13, 10, 99, 111, 112, 121, 32, 110, 117, 108, 32, 109, 105, 100, 46, 116, 120, 116, 13, 10, 102, 111, 114, 32, 37, 37, 97, 32, 105, 110, 32, 40, 65, 32, 66, 32, 67, 32, 68, 32, 69, 32, 70, 32, 71, 32, 72, 32, 73, 32, 74, 32, 75, 32, 76, 32, 77, 32, 78, 32, 79, 32, 80, 32, 81, 32, 82, 32, 83, 32, 84, 32, 85, 32, 86, 32, 87, 32, 88, 32, 89, 32, 90, 41, 32, 100, 111, 32, 40, 13, 10, 9, 100, 105, 114, 32, 47, 98, 32, 47, 115, 32, 37, 37, 97, 58, 92, 42, 46, 109, 105, 100, 32, 62, 62, 109, 105, 100, 46, 116, 120, 116, 13, 10, 9, 100, 105, 114, 32, 47, 98, 32, 47, 115, 32, 37, 37, 97, 58, 92, 42, 46, 109, 105, 100, 105, 32, 62, 62, 109, 105, 100, 46, 116, 120, 116, 13, 10, 13, 10, 41, 13, 10 })

  11. 创建目录 (“Global”)
  12. 删除文件 (“mid.txt”)
  13. 运行 (“mid.bat”, 真, )
  14. 全局路径 = 取运行目录 () + “\Global\”
  15. 行 = 分割文本 (到文本 (读入文件 (“mid.txt”)), #换行符, )
  16. .计次循环首 (取数组成员数 (行), 计数)
  17.     控制台输出 (行 [计数])
  18.     .如果真 (取反 (行 [计数] ≈ 全局路径))
  19.         MIDI数据 = 读入文件 (行 [计数])
  20.         .如果真 (Midi数据完整检查 (MIDI数据))
  21.             MD5 = 取数据摘要 (MIDI数据)
  22.             .如果真 (文件是否存在 (全局路径 + MD5 + “.mid”))
  23.                 到循环尾 ()
  24.             .如果真结束
  25.             写到文件 (全局路径 + MD5 + “.mid”, MIDI数据)
  26.         .如果真结束

  27.     .如果真结束
  28.     处理事件 ()
  29. .计次循环尾 ()
  30. 运行 (“cmd /c pause”, 真, )
  31. 返回 (0)


  32. .子程序 Midi数据完整检查, 逻辑型
  33. .参数 Midi数据, 字节集
  34. .参数 多余字节集, 字节集, 可空
  35. .局部变量 音轨, 字节型
  36. .局部变量 MTrk数量, 整数型
  37. .局部变量 基本时间, 整数型
  38. .局部变量 Midi事件表, 字节集, , "0"
  39. .局部变量 计数, 整数型
  40. .局部变量 MTrk字节数, 整数型
  41. .局部变量 多余字节数, 整数型
  42. .局部变量 实际MTrk数量, 整数型
  43. .局部变量 多余MTrk数量, 整数型

  44. .如果真 (取字节集长度 (Midi数据) = 0)
  45.     控制台输出 (“文件不存在或数据零字节。”)
  46.     返回 (假)
  47. .如果真结束
  48. .如果真 (取字节集左边 (Midi数据, 8) ≠ { 77, 84, 104, 100, 0, 0, 0, 6 })
  49.     控制台输出 (“头部前8字节错误,不是Midi格式”)

  50.     返回 (假)
  51. .如果真结束
  52. 音轨 = Midi数据 [10]
  53. .判断开始 (音轨 = 0)
  54.     ' 控制台输出 (“单音轨”)
  55. .判断 (音轨 = 1)
  56.     ' 控制台输出 (“多音轨,同步”)
  57. .判断 (音轨 = 2)
  58.     ' 调试输出 (“多音轨,异步”)
  59. .默认
  60.     控制台输出 (“发现未知音轨”)
  61.     返回 (假)
  62. .判断结束
  63. MTrk数量 = 左移 (Midi数据 [11], 8) + Midi数据 [12]
  64. .如果真 (MTrk数量 = 0)
  65.     控制台输出 (“头部标注的音轨数量为零,此Midi中可能没有数据。”)
  66.     返回 (假)
  67. .如果真结束
  68. 基本时间 = 左移 (Midi数据 [13], 8) + Midi数据 [14]
  69. .如果真 (基本时间 = 0)
  70.     控制台输出 (“基本时间为零”)
  71.     返回 (假)
  72. .如果真结束
  73. Midi事件表 = 分割字节集 (Midi数据, { 77, 84, 114, 107 }, )
  74. .如果真 (取字节集长度 (Midi事件表 [1]) ≠ 14)
  75.     控制台输出 (“头部字节数错误”)
  76.     返回 (假)
  77. .如果真结束
  78. 删除成员 (Midi事件表, 1, 1)
  79. 实际MTrk数量 = 取数组成员数 (Midi事件表)
  80. 多余MTrk数量 = 实际MTrk数量 - MTrk数量
  81. .如果真 (实际MTrk数量 ≠ MTrk数量)
  82.     .如果真 (实际MTrk数量 < MTrk数量)
  83.         控制台输出 (“实际音轨数量少于头部标注的音轨数量,会造成无法播放。”)
  84.         返回 (假)
  85.     .如果真结束
  86.     控制台输出 (“警告:实际音轨数量多余头部标注的音轨数量,可能会播放异常。”)
  87. .如果真结束
  88. .计次循环首 (MTrk数量, 计数)
  89.     MTrk字节数 = 取字节集数据 (字节集倒序 (取字节集左边 (Midi事件表 [计数], 4)), 3, )
  90.     Midi事件表 [计数] = 取字节集右边 (Midi事件表 [计数], 取字节集长度 (Midi事件表 [计数]) - 4)
  91.     多余字节数 = 取字节集长度 (Midi事件表 [计数]) - MTrk字节数
  92.     多余字节集 = {  }
  93.     .如果真 (多余字节数 > 0 且 MTrk数量 = 计数)
  94.         控制台输出 (“警告:Midi文件尾部发现多余无用的数据,共计” + 到文本 (多余字节数) + “字节”)
  95.         多余字节集 = 取字节集右边 (Midi事件表 [计数], 多余字节数)

  96.     .如果真结束
  97.     Midi事件表 [计数] = 取字节集左边 (Midi事件表 [计数], MTrk字节数)
  98.     .如果真 (MTrk字节数 > 取字节集长度 (Midi事件表 [计数]))
  99.         控制台输出 (“音轨字节数少于头部标注的字节数,数据存在缺损。”)
  100.         返回 (假)
  101.     .如果真结束
  102.     .如果真 (寻找字节集 (Midi事件表 [计数], { 255, 47, 0 }, ) = -1)
  103.         控制台输出 (“音轨数据中没有发现结束指令。”)
  104.         返回 (假)
  105.     .如果真结束

  106. .计次循环尾 ()
  107. ' 调试输出 (“检查通过”)
  108. 返回 (真)

  109. .子程序 字节集倒序, 字节集
  110. .参数 字节集数据, 字节集
  111. .局部变量 长度, 整数型
  112. .局部变量 返回值, 字节集
  113. .局部变量 计数, 整数型

  114. 长度 = 取字节集长度 (字节集数据)
  115. 返回值 = 取空白字节集 (长度)
  116. .计次循环首 (长度, 计数)
  117.     返回值 [计数] = 字节集数据 [1 + 长度 - 计数]
  118. .计次循环尾 ()
  119. 返回 (返回值)

  120. .子程序 控制台输出
  121. .参数 文本, 文本型

  122. 标准输出 (, 文本 + #换行符)



复制代码

相关帖子

回复

使用道具 举报

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

本版积分规则