0xAA55 发表于 2014-7-17 06:06:19

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

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

大致参数格式如下:

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

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

void Usage(char*argv0)
{
    if(!argv0)
      argv0="MidiPlay";
    fprintf(stderr,
      "Usage\n"
      "%s midifile.mid",argv0);
}

int main(int argc,char**argv)
{
    MCIERROR result;

    MCI_OPEN_PARMS mciOpenParms={0};
    MCI_PLAY_PARMS mciPlayParms={0};
    MCI_STATUS_PARMS mciStatusParms={0};
    MCI_SEQ_SET_PARMS mciSeqSetParms={0};

    if(argc<2)
    {
      Usage(argv);
      return 1;
    }

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

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

    //判断MIDI映射
    if(LOWORD(mciStatusParms.dwReturn)!=MIDI_MAPPER)
    {
      fputs("The MIDI mapper is not available. Continue?\n",stdout);
      for(;;)//这样按错键也没关系
      {
            char ch=_getch();
            if(ch=='Y'||ch=='y')
                break;
            else if(ch=='N'||ch=='n')
            {
                mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
                return 0;
            }
      }
    }

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

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

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

    return 0;
BadReturn:
    fprintf(stderr,"MCIERROR=0x%08X\n",result);
    if(mciOpenParms.wDeviceID)
      mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,0,0);
    return 2;
}BIN:
SRC:
这个实例只能用于播放文件,如果要用于播放内存中的MIDI文件,你需要额外的手段。
要编译源码你需要链接winmm.lib,这意味着编译出的程序依赖于winmm.dll运行。winmm是系统DLL,不过也不排除某些GHOST系统缺失这个DLL。

0xAA55 发表于 2014-7-17 06:07:40

播放MIDI可以使用DirectX的专有套件:DirectMusic
页: [1]
查看完整版本: 【API】C语言使用mciSendCommand播放MIDI音乐