找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
楼主: 0xAA55

【C语言】Midi文件播放器(可跨平台)

  [复制链接]
发表于 2018-8-7 12:08:11 | 显示全部楼层
本帖最后由 乘简 于 2018-8-7 13:12 编辑

写的代码高深莫测啊,,这里我没看懂啊,希望楼主指点一下。
这里是声明部分:
  1. //MIDIFILE的函数调用约定
  2. #ifndef Midi_c
  3. #define Midi_c _cdecl
  4. #endif // !Midi_c

  5. //MIDIFILE的符号导出规则
  6. #ifndef Midi_x
  7.   #ifdef __cplusplus
  8.   #define Midi_x extern"C"
  9.   #else // !__cplusplus
  10.   #define Midi_x extern
  11.   #endif // !__cplusplus
  12. #endif // !Midi_x

  13. //MIDIFILE的导出函数
  14. #define Midi_fn(fn,rt) Midi_x rt Midi_c fn
复制代码

这里是调用:
  1.         //分析文件
  2.         if(!MidiParserStart(&Parser))
  3.         {
  4.                 fputs("Could not start the parser.\n",stderr);
  5.                 goto BadRet;
  6.         }
复制代码

这里是实现:
  1. //=============================================================================
  2. //MidiParserStart:
  3. //分析MIDI文件,为播放做准备。失败返回零,成功返回非零
  4. //-----------------------------------------------------------------------------
  5. Midi_fn(MidiParserStart,int)
  6. (
  7.         MidiParser_p pParser
  8. )
  9. {
  10.         ...
  11.         return 0;
  12. }
复制代码


============================================================================
哈哈。。。已经看懂了。
翻译过来就是:
extern int _cdecl MidiParserStart(MidiParser_p pParser){...}
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-8-7 18:33:48 | 显示全部楼层
乘简 发表于 2018-8-7 12:08
写的代码高深莫测啊,,这里我没看懂啊,希望楼主指点一下。
这里是声明部分:
[code]//MIDI ...

没错。这些宏是为了方便改调用约定等。
回复 赞! 靠!

使用道具 举报

发表于 2018-8-17 16:52:40 | 显示全部楼层
test~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

发表于 2018-9-25 00:07:00 | 显示全部楼层
感谢分享!
回复

使用道具 举报

发表于 2018-10-9 15:42:28 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

发表于 2018-11-1 11:21:19 | 显示全部楼层
谢谢分享,,,,,,,高手
回复 赞! 靠!

使用道具 举报

发表于 2018-11-20 18:24:16 | 显示全部楼层
我来看看,顺便挣点币币
回复 赞! 靠!

使用道具 举报

发表于 2018-12-28 10:57:17 | 显示全部楼层
写的非常好,想继续阅读
回复 赞! 靠!

使用道具 举报

发表于 2019-1-8 17:08:27 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 2019-1-12 13:17:53 | 显示全部楼层
你这个MIDI在播放时,速度是变化的,但大神分享的code是没有更新速度的,只有抓取到第一个速度就全曲不变,你更改下解析端的FF码部分执行就行了。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-1-12 14:56:15 | 显示全部楼层
kooloo 发表于 2019-1-12 13:17
你这个MIDI在播放时,速度是变化的,但大神分享的code是没有更新速度的,只有抓取到第一个速度就全曲不变, ...

难道所谓“大神”的“没有更新速度”这一点是特性而非BUG?当一个MIDI文件在中途需要调整BPM的时候怎么办?

如果BPM不应该更新,那为什么MIDI文件要在中途插入BPM更新的功能?
回复 赞! 靠!

使用道具 举报

发表于 2019-3-2 10:46:09 | 显示全部楼层
谢谢 正需要呢
回复 赞! 靠!

使用道具 举报

发表于 2019-3-21 21:00:01 | 显示全部楼层
我发现同一个进程midiOutOpen不能打开多次同一个设备,不知道A5大神你一般是咋处理的同时播放多个midi文件的?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-3-22 01:43:36 | 显示全部楼层
系统消息 发表于 2019-3-21 21:00
我发现同一个进程midiOutOpen不能打开多次同一个设备,不知道A5大神你一般是咋处理的同时播放多个midi文件 ...

方法1:开一堆exe作为播放midi的子进程。
方法2:硬解midi,自己设计时间线的管理和播放流程,并且重新分配不同的音轨(比如1、2、3给midi文件1,4、5、6给midi文件2,取决于midi文件本身使用的音轨的数量)给不同的midi文件。如果多个midi文件使用的音轨的数量超出了16,那就要复用音轨。此时可以采取记录乐器编号和乐器的参数设定,然后在相同时间里处理不同midi文件的音符的时候,重新发送设置乐器编号和参数的消息的方式,来实现无缝切换音轨。

不过,你为何要同时播放多个midi文件呢?大杂烩?
回复 赞! 靠!

使用道具 举报

发表于 2019-3-25 10:58:54 | 显示全部楼层
膜拜大神
回复

使用道具 举报

发表于 2019-5-28 14:29:16 | 显示全部楼层
偷个源码来玩玩
回复 赞! 靠!

使用道具 举报

发表于 2019-8-7 10:25:25 | 显示全部楼层
试试看,正在找类似的东西
回复 赞! 靠!

使用道具 举报

发表于 2019-8-25 15:56:10 | 显示全部楼层
非常好的midi编程文章,可以自己设置软波表,那就更好了。
回复 赞! 靠!

使用道具 举报

发表于 2019-8-28 01:20:41 | 显示全部楼层
本帖最后由 系统消息 于 2019-8-28 01:21 编辑
zly188 发表于 2019-8-25 15:56
非常好的midi编程文章,可以自己设置软波表,那就更好了。


我已经实现了,刚刚发帖,DirectMusic还有很多midiOut没有的功能:
用 DirectMusic 实现可更换音色库和多轨的 midiOut
回复 赞! 靠!

使用道具 举报

发表于 2019-8-28 01:27:44 | 显示全部楼层
0xAA55 发表于 2019-3-22 01:43
方法1:开一堆exe作为播放midi的子进程。
方法2:硬解midi,自己设计时间线的管理和播放流程,并且重新分 ...

已经解决了,用DirectMusic代替midiOut完美解决
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 21:43 , Processed in 0.029264 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表