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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4978|回复: 1

【API】C语言使用mciSendCommand播放MIDI音乐

[复制链接]

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24221 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-7-17 06:06:19 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
mciSendCommand可用于播放各种多媒体文件,比如WAV、CD音乐、MP3、AVI、MID等。这个函数在百度和MSDN上已经有很充足的介绍了,键人在此不再赘述。

大致参数格式如下:

MMRESULT 返回结果=mciSendCommand(设备ID,命令,参数1,参数2);
返回结果详见MSDN。而设备ID可以通过使用命令MCI_OPEN获取。

直接贴源码。大家看看它是怎么用的就行。
  1. //=============================================================================
  2. //作者:0xAA55
  3. //论坛:http://www.0xaa55.com/
  4. //版权所有(C) 2013-2014 技术宅的结界
  5. //请保留原作者信息,否则视为侵权。
  6. //-----------------------------------------------------------------------------
  7. #include<stdio.h>
  8. #include<conio.h>
  9. #include<Windows.h>

  10. void Usage(char*argv0)
  11. {
  12.     if(!argv0)
  13.         argv0="MidiPlay";
  14.     fprintf(stderr,
  15.         "Usage\n"
  16.         "%s midifile.mid",argv0);
  17. }

  18. int main(int argc,char**argv)
  19. {
  20.     MCIERROR result;

  21.     MCI_OPEN_PARMS mciOpenParms={0};
  22.     MCI_PLAY_PARMS mciPlayParms={0};
  23.     MCI_STATUS_PARMS mciStatusParms={0};
  24.     MCI_SEQ_SET_PARMS mciSeqSetParms={0};

  25.     if(argc<2)
  26.     {
  27.         Usage(argv[0]);
  28.         return 1;
  29.     }

  30.     //打开MCI设备
  31.     mciOpenParms.dwCallback=0;
  32.     mciOpenParms.wDeviceID=0;
  33.     mciOpenParms.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_SEQUENCER;//设置文件格式为MIDI序列。改这里,可以使其用于播放其他格式的多媒体文件。
  34.     mciOpenParms.lpstrElementName=argv[1];//文件名
  35.     mciOpenParms.lpstrAlias=NULL;//别名
  36.     result=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD_PTR)(&mciOpenParms));//取得设备ID。
  37.     if(result)
  38.         goto BadReturn;

  39.     //取得状态
  40.     mciStatusParms.dwItem=MCI_SEQ_STATUS_PORT;
  41.     result=mciSendCommand(mciOpenParms.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)(&mciStatusParms));
  42.     if(result)
  43.         goto BadReturn;

  44.     //判断MIDI映射
  45.     if(LOWORD(mciStatusParms.dwReturn)!=MIDI_MAPPER)
  46.     {
  47.         fputs("The MIDI mapper is not available. Continue?[Y/N]\n",stdout);
  48.         for(;;)//这样按错键也没关系
  49.         {
  50.             char ch=_getch();
  51.             if(ch=='Y'||ch=='y')
  52.                 break;
  53.             else if(ch=='N'||ch=='n')
  54.             {
  55.                 mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
  56.                 return 0;
  57.             }
  58.         }
  59.     }

  60.     //播放
  61.     result=mciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,0,(DWORD_PTR)&mciPlayParms);
  62.     if(result)
  63.         goto BadReturn;

  64.     fputs("Press any key to stop playing.\n",stdout);
  65.     _getch();

  66.     //停止并结束
  67.     mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);

  68.     return 0;
  69. BadReturn:
  70.     fprintf(stderr,"MCIERROR=0x%08X\n",result);
  71.     if(mciOpenParms.wDeviceID)
  72.         mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
  73.     return 2;
  74. }
复制代码
BIN: MidiPlay.exe (40 KB, 下载次数: 0, 售价: 1 个宅币)
SRC: MidiPlay.7z (16.57 KB, 下载次数: 0, 售价: 2 个宅币)
这个实例只能用于播放文件,如果要用于播放内存中的MIDI文件,你需要额外的手段。
要编译源码你需要链接winmm.lib,这意味着编译出的程序依赖于winmm.dll运行。winmm是系统DLL,不过也不排除某些GHOST系统缺失这个DLL。

本帖被以下淘专辑推荐:

回复

使用道具 举报

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24221 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
 楼主| 发表于 2014-7-17 06:07:40 | 显示全部楼层
播放MIDI可以使用DirectX的专有套件:DirectMusic
回复 赞! 靠!

使用道具 举报

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

GMT+8, 2024-4-18 13:51 , Processed in 0.046494 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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