第13章 MCI和MMAPI编程C.doc_第1页
第13章 MCI和MMAPI编程C.doc_第2页
第13章 MCI和MMAPI编程C.doc_第3页
第13章 MCI和MMAPI编程C.doc_第4页
第13章 MCI和MMAPI编程C.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7 第13章 MCI和MMAPI编程第13章 MCI和MMAPI编程本章介绍Windows多媒体的两种传统编程接口高层的MCI和底层的MMAPI,主要讨论MCI的命令串和命令消息方式编程和MMAPI中的MMIO与MIDI编程。MCI和MMAPI都没有被封装入MFC,为Windows SDK中的API。在Visual Studio 2008的帮助系统中,MCI和MMAPI的帮助文档位于“目录 / Win32和COM开发 / Graphics and Multimedia / Windows Multimedia / SDK Documentation / Windows Multimedia”的各子目录中。在Visual Studio 2010的帮助系统中,MCI和MMAPI的帮助文档位于“库主页Win32 and COM DevelopmentGraphics and MultimediaAudio and VideoWindows Multimedia”的各子目录中。13.1 MCI编程MCI(Media Control Interface,媒体控制接口)是Windows中控制多媒体设备的高层命令接口,用于事件协调及与MCI设备驱动程序的通信。MCI的主要特点是其设备独立性。通过设备驱动程序,MCI提供了与设备无关的虚拟接口。参见图13-1。MCI的核心是MCI的设备驱动程序,它用于解释和执行MCI的命令,可分成如下三类:MCI设备驱动程序MCI命令多媒体设备多媒体应用程序l 直接控制媒体设备硬件,如CD音乐、影碟机;l 通过低层MMAPI间接控制目标设备,如MIDI、WAV;l 提供DLL高层接口,如AVI/MPEG影片播放器。13.1.1 MCI设备图13-1 MCI的设备独立性MCI设备可分为如下两种类型:l 简单设备不需要提供数据文件,如CD音乐、DVD机;l 复合设备需要提供数据文件,如MIDI音序器(.MID)、波形音频设备(.WAV)、影片播放器(.AVI/.MPG)。每类MCI设备都有对应的命令集,但也有若干同类MCI驱动程序共用同一命令集,为了区分不同的驱动程序,MCI引入设备名:(按字母序排列)l animation动画播放设备;l cdaudioCD音乐播放设备;l dat数字音频磁带机(DAT = Digital Audio Tape数字录音带);l digitalvideo数字视频(不基于GUI);l mmmovie多媒体影片播放设备;l other未定义的MCI设备(扩展用);l overlay窗口中的模拟视频接口(基于GUI);l scanner图像扫描仪;l sequencerMIDI音序器;l vcr盒式磁带录像机(VCR = Video Cassette Recorder);l videodisc影碟机;l waveaudio波形音频设备。13.1.2 接口、函数与命令多媒体应用程序通过发送命令来控制多媒体设备,MCI有串和消息两种命令接口方式。这些命令接口,又由若干MCI函数来具体实现。1. 接口应用程序通过向MCI设备发送命令来控制它,这种命令有两种功能等价的接口方式:l 命令串方式用近似英语的句法与MCI设备通信,直观、面向用户。是一种文本形式的接口,常用于VB等可视化编程平台和ToolBook等多媒体著作工具。如mciSendString(Lplay cdaudio from 2 to 5, NULL, 0, NULL);l 命令消息方式利用消息和数据结构与MCI设备通信,快速、面向程序员。常用于C/C+语言的应用程序,以直接控制多媒体设备。如:MCI_PLAY_PARMS playParms;playParms.dwFrom = MCI_MAKE_TMSF(2, 0, 0, 0);playParms.dwTo = MCI_MAKE_TMSF(6, 0, 0, 0);mciSendCommand(wDevID, MCI_PLAY, MCI_FROM | MCI_TO, (DWORD)(LPVOID)&playParms); 2. 函数MCI函数中,有些只适用于一种接口方式,有些则两种接口都可以用。1)仅命令串方式只适用于命令串接口方式的只有如下一个函数:(命令串中的字符不区分大小写)l mciSendString(发送命令串),函数原型为:MCIERROR mciSendString( / 出错返回非零值(错误代码)/ 可用mciGetErrorString获得错误的文本描述 LPCTSTR lpszCommand, / 指向以null结尾的命令字符串:”命令 设备 参数” LPTSTR lpszReturnString,/ 指向接收返回信息的缓冲区,为NULL时不返回信息 UINT cchReturn, / 上述缓冲区的大小 HANDLE hwndCallback / 在命令串中含notify时,它指定一个回调窗口的句柄/ 一般为NULL);如:mciSendString(Lopen sample.wav type waveaudio alias wave, NULL, 0, NULL);2)仅命令消息方式只适用于命令消息接口方式的也只有一个函数:l mciSendCommand(发送命令),函数原型为:MCIERROR mciSendCommand( / 出错返回非零值(低字错误代码,高字驱动程序ID) / 也可用mciGetErrorString获得错误的文本描述 MCIDEVICEID IDDevice, / 接收命令消息的MCI设备ID/ 对MCI_OPEN消息为NULL UINT uMsg, / 命令消息 DWORD fdwCommand, / 命令消息的附加标志 DWORD dwParam / 命令消息参数的结构指针(可统一函数形式));如:MCI_OPEN_PARMS openParms;openParms.lpstrDeviceType = Lwaveaudio;openParms.lpstrElementName = Lsample.wav;openParms.lpstrAlias = Lwave;mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS, (DWORD)(LPVOID)&playParms);MCIDEVICEID wDevID = openParms.wDeviceID;3)两种接口方式两种接口方式都支持的函数有五个:l mciGetErrorString(获得出错文本串)BOOL mciGetErrorString( / 成功返回TRUE DWORD fdwError, / 由mciSendString或mciSendCommand返回的错误代码 LPTSTR lpszErrorText, / 指向接收返回错误信息的文本缓冲区 UINT cchErrorText / 上述缓冲区的长度 );如:MCIERROR err = mciSendString(Lopen sample.wav type waveaudio alias wave, NULL, 0, NULL);if (err) wchar_t errStr256;if (mciGetErrorString(err, errStr, 256) MessageBox(errStr, LError); l mciGetDeviceID(获得设备ID),函数原型为:MCIDEVICEID mciGetDeviceID( / 出错返回非零 LPCTSTR lpszDevice / 已经打开的设备别名);如:wDevID = mciGetDeviceID(Lwaveaudio); 或 wDevID = mciGetDeviceID(Lwave);MCI中还有3个少用的回调过程函数:mciSetYieldProc(设置等待时调用的过程)、mciGetYieldProc(获得等待时调用的过程)和mciGetCreatorTask(获取创建任务)。以上7个MCI函数中,最常用的是mciSendString、mciSendCommand和mciGetErrorString这三个。3. 命令MCI的命令很多,可以分为如下四类:n 系统命令直接由MCI系统解释和处理,不传送到MCI设备。如break或MCI_BREAKn 通用命令所有MCI设备都支持的命令。如open或MCI_OPENn 可选命令MCI设备可选择使用的命令。如play或MCI_PLAYn 专用命令为某类MCI设备集专有。如list或MCI_LIST(DV/VCR)前三类中部分命令参见表13-1:表13-1 部分MCI命令(字母序)类型消息串说明系统MCI_BREAKbreak为指定MCI设备设置终止键MCI_SOUNDsound播放Windows指定的系统声音MCI_SYSINFOsysinfo返回有关MCI设备的信息通用MCI_CLOSEclose关闭MCI设备MCI_GETDEVCAPSgetdevcaps获得MCI设备的性能参数MCI_INFOinfo获得MCI设备的有关信息MCI_OPENopen打开(初始化)MCI设备MCI_STATUSstatus返回MCI设备的状态信息可选MCI_LOADload从文件中加载数据MCI_PAUSEpause暂停播放/记录MCI_PLAYplay开始播放数据MCI_RECORDrecord开始记录数据MCI_RESUMEresume重新开始播放/记录MCI_SAVEsave保存数据到文件MCI_SEEKseek改变当前位置MCI_SETset改变控制设置MCI_STOPstop停止播放/记录标志MCI_WAITwaitMCI命令执行完后才返回MCI_NOTIFYnotifyMCI命令执行完后向应用程序发送MM_MCINOTIFY消息4. 附加标志与参数结构复杂的命令消息一般都有附加标志,并需要设置相应数据结构。如打开命令MCI_OPEN消息的附加标志见表13-2(可以位或“|”)。其中,结构MCI_OPEN_PARMS的定义为:表13-2 打开命令的部分附加标志typedef struct 标志含义(在MCI_OPEN_PARMS结构中)MCI_OPEN_ALIASlpstrAlias域指定了别名MCI_OPEN_ELEMENTlpstrElementName域指定了元素(文件)名MCI_OPEN_SHAREABLE按共享方式打开MCI设备MCI_OPEN_TYPElpstrDeviceType域指定了设备类型MCI_OPEN_TYPE_IDwDeviceID域指定了设备类型的ID DWORD dwCallback; MCIDEVICEID wDeviceID; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; MCI_OPEN_PARMS;13.1.3 编程下面以播放CD音乐、波形音频文件与MIDI为例,介绍简单与复杂MCI设备的多媒体命令串编程。为了使用MCI编程,必须包含多媒体头文件mmsystem.h,并在项目属性中添加对多媒体库winmm.lib链接。在VS05/08/10中的具体做法:选“项目/Midi属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”栏的右边,键入winmm.lib后按“应用”钮,最后按“确定”钮关闭对话框。1. CDwchar_t buf256;MCIERROR err = mciSendString(Lopen cdaudio alias cd, NULL, 0, NULL); / 打开CDif (err) / 获得并显示错误串后返回if (mciGetErrorString(err, buf, 256) MessageBox(buf, LError); return;mciSendString(Lstatus cd number of tracks, buf, 256, NULL); / 获得音轨总数m_nTracks = wcstol(buf, NULL, 10); / 这里使用了宽字符版的字符串到整数的/ 转换函数:long wcstol( const wchar_t *nptr, wchar_t *endptr, int base );wsprintf(buf, Lplay cd from %d to %d, m, n); / m和n为表示起止音轨的整型变量mciSendString(buf, NULL, 0, NULL); / 从音轨m头播放到音轨n1尾其他常用命令:mciSendString(Lset cd time format tmsf, NULL,0,NULL); / 设置时间格式为/ 轨(100):分(100):秒(60):帧(strFilePath);MCIERROR err = mciSendString(buf, NULL, 0, NULL);if (err) if (mciGetErrorString(err, buf, 256) MessageBox(buf, L“Error”);return;/ t1和t2为用户指定的起止时间(单位为秒,浮点变量)DWORD start = (DWORD)(t1 * 1000 + 0.5), end = (DWORD)(t2 * 1000 + 0.5);wsprintf(buf, Lplay sound from %ld to %ld, start, end);mciSendString(buf, NULL, 0, NULL);其他常用命令有:mciSendString(Lstatus sound length, buf, 256, NULL); / 获取声音长度mciSendString(Lpause sound, NULL, 0, NULL); / 暂停声音播放mciSendString(Lresume sound, NULL, 0, NULL); / 恢复声音播放mciSendString(Lplay sound, NULL, 0, NULL); / 从当前位置播放到文件尾mciSendString(Lstop sound, NULL, 0, NULL); / 停止声音播放mciSendString(Lclose sound, NULL, 0, NULL); / 关闭波形音频设备3. MIDIMIDI所对应的MCI设备名为sequencer(音序器),打开MIDI设备的命令串常用格式为:Lopen MIDI文件路径 alias 别名 type sequencer;播放MIDI文件的命令串一般格式为:Lplay 别名 from 位置1 to 位置2,其中位置的单位为毫秒。若无“from 位置1”则从头播放,若无“to 位置2”则播放到文件尾。如“play 别名”是从头到尾播放。例如:CString str = Lopen + ar.GetFile()-GetFilePath() + Ltype sequencer alias midiwchar_t buf256;MCIERROR err = mciSendString(str, NULL, 0, NULL); / 打开MIDI文件和设备if (err) / 获得并显示错误串后返回if (mciGetErrorString(err, buf, 256) MessageBox(NULL, buf, LError, MB_OK);return;mciSendString(Lplay midi, NULL, 0, NULL); / 播放MIDI文件其他常用的命令还有:暂停播放(pause)、恢复播放(resume)、停止播放(stop)、关闭设备(close)等。13.2 MMAPI简介MMAPI(MultiMedia API)是Windows的底层多媒体编程接口,包括波形音频处理(44个函数)、MIDI操作(41个函数)、多媒体计时器管理(8个函数)、操作杆控制(8个函数)和多媒体文件I/O(19个函数),共120个函数、44条消息和14个数据结构。本节只是列出各类MMAPI函数的名称,其中的MMIO和MIDI部分会在后面两节中介绍,其他MMAPI的函数和功能可参见Visual C+的帮助系统。13.2.1 波形音频处理函数MMAPI中含有44个波形音频处理函数(5个aux*+2个* PlaySound+37个waveIn/Out*):auxGetDevCapsauxGetNumDevsauxGetVolumeauxOutMessageauxSetVolumePlaySoundsndPlaySoundwaveInAddBufferwaveInClosewaveInGetDevCapswaveInGetErrorTextwaveInGetIDwaveInGetNumDevswaveInGetPositionwaveInMessagewaveInOpenwaveInPrepareHeaderwaveInProcwaveInResetwaveInStartwaveInStopwaveInUnprepareHeaderwaveOutBreakLoopwaveOutClosewaveOutGetDevCapswaveOutGetErrorTextwaveOutGetIDwaveOutGetNumDevswaveOutGetPitchwaveOutGetPlaybackRatewaveOutGetPositionwaveOutGetVolumewaveOutMessagewaveOutOpenwaveOutPausewaveOutPrepareHeaderwaveOutProcwaveOutResetwaveOutRestartwaveOutSetPitchwaveOutSetPlaybackRatewaveOutSetVolumewaveOutUnprepareHeaderwaveOutWrite13.2.2 MIDI函数MMAPI中含有41个MIDI函数:midiConnect midiDisconnectmidiInAddBuffermidiInClosemidiInGetDevCapsmidiInGetErrorTextmidiInGetIDmidiInGetNumDevsmidiInMessagemidiInOpenmidiInPrepareHeadermidiInProcmidiInResetmidiInStartmidiInStopmidiInUnprepareHeadermidiOutCacheDrumPatchesmidiOutCachePatchesmidiOutClosemidiOutGetDevCapsmidiOutGetErrorTextmidiOutGetIDmidiOutGetNumDevsmidiOutGetVolumemidiOutLongMsgmidiOutMessagemidiOutOpenmidiOutPrepareHeaderMidiOutProcmidiOutResetmidiOutSetVolumemidiOutShortMsgmidiOutUnprepareHeadermidiStreamClosemidiStreamOpenmidiStreamOutmidiStreamPausemidiStreamPositionmidiStreamPropertymidiStreamRestartmidiStreamStop13.2.3 计时器函数MMAPI中含有8个多媒体时间函数:timeBeginPeriodtimeEndPeriodtimeGetDevCapstimeGetSystemTimetimeGetTimetimeKillEventTimeProctimeSetEvent13.2.4 操作杆函数MMAPI中含有8个操作杆(joystick)函数:joyGetDevCapsjoyGetNumDevsjoyGetPosjoyGetPosExjoyGetThresholdjoyReleaseCapturejoySetCapturejoySetThreshold13.2.5 多媒体文件I/O函数这里只罗列MMIO定义的2个数据类型和2个结构,以及它所提供的18个函数和1个宏,还有7个专用消息。有关MMIO的详细内容,将在后面的13.4节中作部分介绍。l 数据类型:FOURCC; / 4字符代码MMRESULT; / 错误返回代码(0表示正确)l 结构:MMIOINFO; / I/O信息MMCKINFO; / 块信息l 函数或宏:n 基本I/O(6个):mmioClose、mmioOpen、mmioRead、mmioRename、mmioSeek、mmioWriten 缓冲I/O(5个):mmioAdvance、mmioFlush、mmioGetInfo、mmioSetBuffer、mmioSetInfon RIFF I/O(5个):mmioAscend、mmioCreateChunk、mmioDescend、mmioFOURCC(宏)、mmioStringToFOURCCn 定制I/O 过程(3个):IOProc、mmioInstallIOProc、mmioSendMessage其中,常用的用于读取和播放波形/AVI文件的函数有:mmioOpen、mmioClose、mmioRead、mmioDescend、mmioAscend。l 消息MMIO的专用消息有(字母序):MMIOM_CLOSE、MMIOM_OPEN、MMIOM_READ、MMIOM_RENAME、MMIOM_SEEK、MMIOM_WRITE、MMIOM_WRITEFLUSH,这些消息都用于定制的I/O过程。13.3 MIDI编程本节先介绍MMAPI中的基本MIDI函数,然后通过一个虚拟电子琴的实例来演示MIDI的功能和使用。13.3.1 MMAPI中的基本MIDI函数在13.2.2中已经列出了MMAPI中含有的41个MIDI函数的名称,下面将介绍其中常用的一些基本MIDI函数的功能、原型和参数。1. 查询MIDI设备可以利用midiOutGetNumDevs和midiOutGetDevCaps函数来查询当前系统的MIDI设备和性能:UINT midiOutGetNumDevs(VOID); / 返回MIDI输出设备的数目(非0表示支持MIDI)MMRESULT midiOutGetDevCaps( / 检查MIDI输出设备的性能 UINT_PTR uDeviceID, / 设备ID(0 设备数-1) LPMIDIOUTCAPS lpMidiOutCaps, / 指向MIDI输出设备的性能结构的指针 UINT cbMidiOutCaps / 性能结构的大小(字节数)); / 成功时返回MMSYSERR_NOERROR(=0)typedef struct / MIDI输出设备的性能结构 WORD wMid; / 厂商ID WORD wPid; / 产品ID MMVERSION vDriverVersion; / 驱动程序版本号(高/低位字节分别为主/次版本号) CHAR szPnameMAXPNAMELEN; / 产品名称表13-3 MIDI设备类型 WORD wTechnology; / 设备类型wTechnology数值设备类型MOD_MIDIPORT1MIDI硬件端口 MOD_SYNTH2合成器MOD_SQSYNTH3方波合成器MOD_FMSYNTH4调频合成器MOD_MAPPER5微软MIDI映射器MOD_WAVETABLE6硬件波表合成器 MOD_SWSYNTH7软件合成器 WORD wVoices; / 同时音色数 WORD wNotes; / 复音数 WORD wChannelMask; / 通道数 DWORD dwSupport; / 支持的可选功能 MIDIOUTCAPS;dwSupport数值功能MIDICAPS_VOLUME1支持音量控制MIDICAPS_LRVOLUME2支持分离左右音量控制MIDICAPS_CACHE4支持音色(patch)缓冲MIDICAPS_STREAM8提供对midiStreamOut函数的直接支持表13-4 支持的可选功能其中,typedef UINT MMVERSION;,设备类型wTechnology的取值见表13-3。支持的可选功能dwSupport的取值可为表13-4中值的组合。例如:(查询并显示MIDI设备的性能,输出结果如图13-2所示)UINT dn = midiOutGetNumDevs();if (dn = 0) MessageBox(LNo MIDI device!, LError);else / dn 0CString str;MIDIOUTCAPS moc;for (UINT i = 0; i TextOut(10, 10 + i*20, str);图13-2 查询并显示MIDI设备性能程序的输出结果例如,其中设备号为1的MIDI设备:制造商ID为1(创新公司)、产品ID为102、版本号为5.10、产品名为SB Live! MIDI Synth、采用硬件波表合成器技术、可同时有32种音色和32个复音、有64K个通道、并支持对主音量和左右音量的控制。2. 打开和关闭MIDI设备为了播放MIDI数据,必须首先调用函数midiOutOpen打开指定序号的MIDI输出设备,利用它所返回的设备句柄指针,再来调用其它函数来播放MIDI数据,最后调用函数midiOutClose来关闭MIDI输出设备。在播放MIDI数据的过程中,还可以调用函数midiOutReset来停止播放。下面是这两个函数的原型和参数含义:MMRESULT midiOutOpen( / 打开MIDI输出设备,成功返回MMSYSERR_NOERROR LPHMIDIOUT lphmo, / 设备句柄指针(用于返回值) UINT_PTR uDeviceID, / 设备ID(一般取为MIDI_MAPPER=1) DWORD_PTR dwCallback, / 回调函数指针(一般取为NULL0) DWORD_PTR dwCallbackInstance, / 回调函数使用的数据(一般取为NULL0) DWORD dwFlags / 打开设备标志(用于回调函数参数的类型,(一般取为0));MMRESULT midiOutClose(HMIDIOUT hmo); / 关闭MIDI输出设备MMRESULT midiOutReset(HMIDIOUT hmo); / 停止播放例如:HMIDIOUT hmo; / MIDI输出设备的句柄midiOutOpen(&hmo, MIDI_MAPPER, NULL, NULL, 0); / 打开MIDI输出设备midiOutReset(hmo); / 停止MIDI输出设备的播放midiOutClose(hmo); / 关闭MIDI输出设备3. 播放MIDI数据在打开MIDI输出设备后,可以调用函数midiOutShortMsg来发送短消息,从而能够动态控制MIDI输出设备和播放乐音。其函数的原型和参数含义为:MMRESULT midiOutShortMsg( / 发送短MIDI消息到指定的MIDI输出设备 HMIDIOUT hmo, / 设备句柄指针 DWORD dwMsg / MIDI消息 );字节序号0123字节内容状态值数据1数据2保留为0图13-3 MIDI消息的字节其中,MIDI消息为4字节无符号整数,其高字的高位字节保留为0、低位字节为MIDI数据的第2个字节,低字的高位字节MIDI数据的第1个字节、低位字节为MIDI的状态。因为在Intel CPU中,多字节整数的低位字节在前,所以实际的MIDI消息的字节顺序见图13-3。可定义双字与4字节数组的联合,前者用于函数调用,后者用于按字节赋值,例如:union DWORD dwData; BYTE bData4; midi;midi.bData0 = status;midi.bData1 = data1;midi.bData2 = data2;midi.bData3 = 0;midiOutShortMsg(hmo, midi.dwData); 至于MIDI消息的具体内容,会在下面的13.3.3小节中进行介绍。4. 设置音量MMRESULT midiOutSetVolume( / 设置MIDI输出设备的音量 HMIDIOUT hmo, / 设备句柄指针 DWORD dwVolume / 低/高字为左单/右声道的音量 = 0 0xFFFF);MMRESULT midiOutGetVolume( / 获取MIDI输出设备的当前音量 HMIDIOUT hmo, / 设备句柄指针 LPDWORD lpdwVolume / 指向音量双字变量的指针);上面只是简单的介绍了对MIDI输出设备进行操作的一些基本MMAPI函数,还有对MIDI输入设备和MIDI流设备进行操作的各种MMAPI函数。例如,可调用函数midiOutPrepareHeader来准备信息头缓冲区后,再调用函数midiOutLongMsg来播放MIDI数据,在完成播放后调用函数midiOutUnprepareHeader来清除信息头缓冲区。有兴趣的读者,可以参看Visual Studio的帮助文档。13.3.2 MIDI消息MIDI应用程序,通过调用MMAPI函数midiOutShortMsg和midiOutLongMsg,向MIDI设备发送各种消息,来使用和控制MIDI设备、播放MIDI文件和输出MIDI数据。参见图13-4。图13-4 MIDI消息的输出MIDI消息分为两大类:通道消息和系统消息(参见图13-5),前者由函数midiOutShortMsg发送,后者则由函数midiOutLongMsg来发送。最常用的是通道声音消息中的音符开/关和程序变换(选择音色/乐器种类)消息。图13-5 MIDI消息的分类MIDI消息通道系统实时通用系统专用模式声音MIDI消息由若干(23个)字节组成,第一个字节为状态字节,后跟12个数据字节。为了能区分状态字节和数据字节,MIDI规定状态字节的高位为1(即值1280x80),而各数据字节的高位为0(即值128)。对通道声音消息,状态字节的高4位用来表示种类(8E)、而其低4位则用来表示通道序号(n = 0F)。表13-5为MIDI通道声音消息的状态字节类型和所对应的数据字节的个数和含义。表13-5 MIDI通道声音消息功能描述状态字节数据字节英文中文(n = 0F)数量含义Note Off音符关0x8n21:音高、2:速率(音量)Note On音符开0x9n21:音高、2:速率(音量)Key Pressure按键力度0xAn21:音高、2:速率(音量)Control Change控制改变0xBn21:控制器编号、2:控制值Program Change程序改变0xCn11:程序编号(音色/乐器种类)Channel Pressure通道力度0xDn11:压力值Pitch Bend音高弯度0xEn21:粗调、2:微调下面只对其中最常用的音符开关(发出/停止乐音)和程序改变(选择音色/乐器种类)消息的具体内容加以说明:l 0x9n状态:音符开(发出乐音)让MIDI通道n中的乐器发出指定音高和音强的乐音。n 通道序号n = 0F(15),每个通道可选择一种当前音色(乐器种类);n 音高(pitch)= 0(C3 = 8.16Hz) 127(g6 = 12543.84Hz),采用12平均律,步长为半音阶。如中音的17对应于60(c1 = 1)、62(d1 = 2)、64(e1 = 3)、65(f1 = 4)、67(g1 = 5)、69(a1 = 6)、71(b1 = 7) 、72(c2 = );n 音强键被按下的速率(velocity)常对应于音符的强度 = 0(无声) 127(最强声)。例如:midi.bData0 = 0x90; / 由通道0发出乐音midi.bData1 = 60; / 中音C(c1 = 1)midi.bData2 = 127; / 最大音强midi.bData3 = 0; / 保留为0midiOutShortMsg(hmo, midi.dwData); / 播放指定乐音l 0x8n状态:音符关(停止乐音)停止MIDI通道n中的乐器所发出的指定音高和音强的乐音。其中通道n、音高和音强的含义同上。l 0xCn状态:程序改变(选择音色)设置MIDI通道n中的乐器为指定的乐器种类(音色)。状态字节0xCn后跟的单个数据字节为音色/乐器种类。缺省乐器序号为0(三角钢琴)。在GM标准中定义了128种标准的音色/乐器(patch / timbre / voice),见表13-6。表13-6 GM旋律乐器音色编号分组序号英文名中文名分组序号英文名中文名Piano钢琴0Acoustic Grand Piano非电声三角钢琴Reed簧片乐器64Soprano Sax高音萨克斯1Bright Acoustic Piano明亮非电声钢琴65Alto Sax中音萨克斯2Electric Grand Piano电三角钢琴66Tenor Sax次中音萨克斯3Honky-Tonk Piano酒吧钢琴67Baritone Sax低音萨克斯4Electric Piano 1 (Rhodes)电钢琴1(罗得斯/柔和)68Oboe双簧管5Electric Piano 2 (Chorused)电钢琴2(合唱电钢琴)69English Horn英国号6Harpsichord大键琴(拨弦古钢琴)70Bassoon巴松(大管)7Clavichord翼琴(击弦古钢琴)71Clarinet单簧管(黑管)AcousticPercussion非电打击乐器 8Celesta钢片琴Pipe木管乐器72Piccolo短笛9Glockenspiel钟琴73Flute长笛10Music Box八音盒74Recorder竖笛11Vibraphone颤音琴75Pan Flute排箫12Marimba马林巴琴76Blown Bottle吹瓶13Xylophone木琴77Skakuhachi日本笛14Tubular Bells管钟78Whistle口哨15Dulcimer洋琴79Ocarina洋埙Organ风琴16Drawbar(Hammond) Organ拉杆式(哈蒙德)管风琴Synth Lead合成导音80Lead 1 (square)导音1(方波)17Percussive Organ敲击式管风琴81Lead 2 (sawtooth)导音2(锯齿波)18Rock Organ摇滚管风琴82Lead 3 (calliope)导音3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论