VC++5.0下MIDI、WAV及CD的播放

野性389

野性389

2016-02-19 19:03

图老师小编精心整理的VC++5.0下MIDI、WAV及CD的播放希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

---- 加入音乐是增强应用程序功能的所有方法中最简单的一个。几乎每个计算机游戏或多 媒体程序都以某种MIDI或CD音乐为背景。音乐可以使用户心情愉快;在合适的场合播 放恰当的音乐能够使程序员和他的VC++程序焕发光彩。

第一部分 MIDI的播放
---- 乐器数字化接口(MIDI)是由音乐界的一些大公司(包括生产电子音乐合成器的公司) 制订的一项协议,后来被计算机产业所采用并成为多媒体音乐文件的标准格式。MIDI文件 一般较小,对硬件设备的要求高。

---- 一、 原理

---- 虽然MicroSoft支持MIDI文件,然而Visual C++或MFC并没有创建任何组件来实现 这种支持,但是MicroSoft API提供了三种不同的方法来实现MIDI的播放:

MCI(The Media Control Interface)。这是最基本的方法,本文将详细讨论这种方法。

流缓冲器。这种格式允许应用程序为MIDI数据分配缓冲器。在需要精确控制MIDI播放的时候,流缓冲器将很有用处。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

低级MIDI设备。需要完全控制MIDI数据的应用程序可以使用这种方法。
---- MCI可以通过mciSendCommand()和mciSendString()来完成,本文仅使用mciSendCommand()函数。

---- 原型:DWORD mciSendCommand(UINT wDeviceID,UINT wMessage,DWORD dwParam1,DWORD dwParam2);

参数:  wDeviceID:接受消息的设备ID wMessage:MCI命令消息 dwParam1:命令的标志位 dwParam2:所使用参数块的指针
---- 返值:调用成功,返回零;否则,返回双字中的低字存放有错误信息。

二MIDI的播放控制
---- 1. 打开设备

MCI_OPEN_PARMS OpenParms;OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER;//MIDI类型OpenParms.lpstrElementName = (LPCSTR) Filename;OpenParms.wDeviceID = 0;mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE |  MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT, (DWORD)(LPVOID) &OpenParms)
---- MCI设备ID指明打开了哪个设备,当发送了MCI_OPEN命令时,这个值在参数块中返回——应被保存备用。

---- 2. 关闭设备

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
---- 3. 播放

MCI_PLAY_PARMS PlayParms;PlayParms.dwFrom = 0;// 指定从什么地方(时间)播放mciSendCommand (m_wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID) &PlayParms));
---- 4. 暂停

MCI_PLAY_PARMS PlayParms;mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &PlayParms);
---- 5. 停止

mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
---- 6. 跳跃

* 跳转到任意地方MCI_SEEK_PARMS SeekParms;SeekParms.dwTo = (nMinute * 60 + nSecond) * 1000;//跳转的目标时间,时间单位为毫秒mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT,(DWORD)(LPVOID) &SeekParms);* 跳到文件头mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);* 跳到文件尾mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_END, NULL);
---- 7. 查询当前信息

MCI_STATUS_PARMS StatusParms;StatusParms.dwItem = MCI_SEQ_STATUS_DIVTYPE;mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms);返回信息存放于StatusParms.dwReturn中。MCI_STATUS标志MCI_STATUS_LENGTH  获得文件长度MCI_STATUS_MODE  获得文件播放的当前状态MCI_STATUS_POSITION  获得文件播放的当前位置MCI_STATUS_TIME_FORMAT  获得当前的时间格式MCI_SEQ_STATUS_DIVTYPE  判断文件是PPQN类型还是SMPTE类型MCI_SEQ_STATUS_TEMPO   获得当前播放速度,PQRN类型,此值为节拍/分,SMPTE类型,此值为祯/秒
---- 8. 设置时间格式及播放速度

MCI_SET_PARMS SetParms;SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//设置时间单位为毫秒mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms);MCI_SEQ_SET_TEMPO  设置播放速度,PQRN类型,此值为节拍/分,SMPTE类型,此值为祯/秒
第二部分 WAV文件的播放
---- 一、原理

---- MicroSoft API提供了三种不同的方法来实现WAV的播放:

PlaySound()函数。它可以通过单行编码来播放Wave格式的声音。此函数有两个限制:必须将声音数据完整地载入物理内存;数据格式必须被所配置的某一音频驱动器支 持。根据经验,PlaySound()适用于100K以下的文件。

MCI(The Media Control Interface),与上一章播放MIDI文件相似,可以播放100K 以上的文件。

低级Wave音频设备。用这些设备可以运行完全控制Wave数据的应用文件。
---- 二、 WAV文件播放控制

---- 因为同样使用MCI,与上一章相同,只列出不同的部分。

---- 1. 打开设备

---- 将MIDI的MCI_DEVTYPE_SEQUENCER 改为"waveaudio"

---- 2. 录音

MCI_RECORD_PARMS RecordParms;mciSendCommand (m_wDeviceID, MCI_RECORD, NULL, (DWORD)(LPVOID) &RecordParms);
---- 3. 保存录音

MCI_SAVE_PARMS SaveParms;SaveParms.lpfilename = (LPCSTR) Filename;mciSendCommand (m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &SaveParms);
第三部分 CD的播放
---- CD的独特优势在于,它由作曲家设计,并由音乐厂家生产。不同的计算机播放MIDI 文件时,声音效果也不一样,但是CD的声音效果总是相同的。高品质的音频对计算机用 户产生的效果会使你感到吃惊。 我们依然采用MCI播放CD,大部分的播放控制与前两部分相同,只列出不同的部分

---- 1. 开光驱门

mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, NULL);
---- 2. 关光驱门

mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, NULL);
---- 3. 打开设备

将MIDI的MCI_DEVTYPE_SEQUENCER 改为MCI_DEVTYPE_CD_AUDIO
---- 4. 播放

---- 指定播放起点必须经过MCI_MAKE_TMSF(Track,Minute,Second,Frame)转化

---- 5. 查询当前信息

MCI_STATUS_CURRENT_TRACK   得到当前曲目MCI_STATUS_LENGTH  得到CD或指定曲目长度MCI_STATUS_MODE  得到驱动器的当前状态MCI_STATUS_NUMBER_OF_TRACKS  得到CD曲目的数目MCI_STATUS_POSITION   得到当前格式下的位置MCI_STATUS_READY   检查设备是否就绪MCI_STATUS_TIME_FORMAT  得到当前时间格式MCI_STATUS_MEDIA_PRESENT  检查以确认CD是否在驱动器内MCI_CDA_STATUS_TYPE_TRACK 检查已确认某曲目是否为音频曲目
---- 注意:

使用MCI_STATUS_LENGTH参数查询CD 及曲目长度,返回值通过调用MCI_MSF_MINUTE(),MCI_MSF_SECOND()转换为分、秒。

MCI_STATUS_POSITION参数返回值调用MCI_TMSF_TRACK(), MCI_TMSF_MINUTE(), MCI_TMSF_SECOND(),MCI_TMSF_FRAME才能得到当前的位置的道、分、秒、帧。
---- 6. 跳跃

---- 跳转的目标必须经过MCI_MAKE_TMSF(Track,Minute,Second,Frame)转化最好将上述三种格式分开建类,或做成动态连接库。在 Project-- Setting-- Link-- Object/library modules中加入winmm.lib,源程序中包含。

---- MCI调用简单,功能强大,可以满足日常多媒体编程的基本需要。但是,MCI一次只能播放一个文件,使用DirectSound技术可以实现八个以上WAV文件的同时播放。

展开更多 50%)
分享

猜你喜欢

VC++5.0下MIDI、WAV及CD的播放

编程语言 网络编程
VC++5.0下MIDI、WAV及CD的播放

在VC++中播放WAV文件

编程语言 网络编程
在VC++中播放WAV文件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Win XP下数字CD播放模式的设置

windows 操作系统
Win XP下数字CD播放模式的设置

VB中播放WAV文件

编程语言 网络编程
VB中播放WAV文件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何把CD抓轨成WAV文件教程

电脑入门
如何把CD抓轨成WAV文件教程

随机循环选择播放MIDI背景音乐

设计软件 平面设计软件 广告设计软件
随机循环选择播放MIDI背景音乐

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

XML入门教程:向XML文件存储数据

XML入门教程:向XML文件存储数据

用FSO操作xml

用FSO操作xml
下拉加载更多内容 ↓