** 摘要: ** 文章简单地介绍了 Microsoft® DirectX® 以及它在 VB 多媒体程序设计中的应用。 DirectX® 是 Microsoft® 推出的硬件应用程序接口( APIs ),它包括 DirectX® Graphics® 和 DirectX® Audio® 等,使用它能够方便地实现二维、三维动画、音频数据段回放等功能。 DirectMusic® 是 DirectX® 的基本组件之一,主要用于 MIDI 、 WAVE 等文件的回放。本文着重介绍它在 VB 多媒体程序设计中的应用。
** 关键词: ** DirectX® 、 VB 、 API 、 DirectMusic® 、 MIDI
** 一、 ** ** DirectX ** ** 介绍 ** ** **
Microsoft® DirectX® 是用于游戏开发和高品质多媒体应用程序开发的一系列底层程序接口。它包括了对二维、三维图形、声音、音乐、输入的支持,它甚至可以在应用程序中支持网络通讯,比如允许多用户参与的网络游戏。 DirectX 包括了如下几个部分: DirectDraw® 、 Direct3D® 、 DirectMusic® 、 DirectSound® 、 DirectInput® 、 DirectPlay® 。
DirectX APIs
DirectX Graphics
DirectX Audio
DirectShow
DirectDraw
Direct3D
DirectSound
DirectMusic
DirectInput
DirectPlay
DirectSetup
DirectDraw® : DirectX API 的一个组成部分,它能够直接将显示缓冲区的内容直接输出,提供对显示设备的直接存取并在 Windows 图形设备接口上保留兼容性。
Direct3D® :提供三维图形的编程接口。
DirectMusic® :与 DirectSound 不同,它并不是为数字音频的捕获和回放设计的,而是一种基于消息机制的接口,它能通过硬件或软件合成器将数字音乐转换为声音样本并回放输出。 VB 中使用 DirectX 播放 MIDI 音乐也主要是使用这一组编程接口来实现。
DirectSound® :它提供对声音的高效混音、硬件加速以及对声音设备的直接存取。
DirectInput® :用于输入设备(如鼠标、键盘、游戏控制器等)控制的 API 。
DirectShow® :是 Microsoft Windows 平台的流媒体构造接口,使用 DirectShow 技术能使应用程序完成高质量的音频、视频捕获和回放。
DirectPlay® :提供多用户网络游戏的支持。
DirectSetup® :安装 DirectX 组件的 API 接口。
二、 ** 在 ** ** VB ** ** 中使用 ** ** DirectX ** ® ** 实现 ** ** MIDI ** ** 文件的回放 **
要在 VB 中使用 DirectX ,请先按如下的过程初始化系统环境:
1、 启动 Microsoft Visual Basic 6.0 ,新建一个标准的 EXE 文件( Standard EXE file );
2、 选择“ Project ”菜单并在菜单中选择“ References ”;
3、 在列表框中选中“ DirectX8 for Visual Basic Type Library ”后,点击“确定”按钮。
通过以上的设置, DirectX8 APIs 就被成功地引用到了 Visual Basic 编程环境中,现在就可以方便地使用 DirectX8 API 函数了。
使用 DirectX 编程实现 MIDI 回放有三个步骤:初始化、播放和停止、释放对象。也就是说,在调用并回放 MIDI 文件以前要对 DirectMusic 对象进行初始化(包括对象的创建、数据段装载和声音通道初始化)。下面的几个函数可以实现这一初始化过程:
1. DirectMusicPerformanceCreate :创建一个 DirectMusicPerformance8 对象
调用: object.DirectMusicPerformanceCreate() As DirectMusicPerformance8
参数: object : DirectX8 对象
返回: DirectMusicPerformance8 对象
错误:如果调用不成功, Err.Number 置位
2. DirectMusicLoaderCreate :创建一个 DirectMusicLoader8 对象
调用: Object.DirectMusicLoaderCreate() As DirectMusicLoader8
参数: object : DirectX8 对象
返回: DirectMusicLoader8 对象
错误:如果调用不成功, Err.Number 置位
3.InitAudio :初始化 Performance 对象,要让声音能够正常播放,此函数应该首先被调用。
调用: object.InitAudio (hWnd As Long, lFlags As CONST_DMUS_AUDIO, _
AudioParams As DMUS_AUDIOPARAMS, _
[DirectSound As DirectSound8], _
[lDefaultPathType As CONST_DMUSIC_STANDARD_AUDIO_PATH, _
[lpChannelCount As Long])
参数: object : DirectMusicPerformance8 对象
hWnd : 建立 DirectSound 所使用的窗口句柄,如果为 0 ,则使用前台窗口;
lFlags : 枚举类型 CONST_DMUS_AUDIO 变量,用于指定所需要的特性。此结构包括:
DMUS_AUDIOF_3D : 3-D 缓冲
DMUS_AUDIOF_ALL : 其它各种标志的组合
DMUS_AUDIOF_BUFFERS : 多缓冲区
DMUS_AUDIOF_EAX : EAX 效果
DMUS_AUDIOF_ENVIRON : 环境模型
DMUS_AUDIOF_STREAMING : 支持流媒体类型
AudioParams : 结构类型 DMUS_AUDIOPARAMS 变量。通过它可以将指定的参数传给音乐合成器,也可以读取当前的参数设置。此结构类型包括:
ClsidDefaultSynth : 当前默认的音乐合成器
FInitNow : 布尔型变量,用于指定合成槽和合成器是否立即建立
Lfeatures : 指定可能的通道标志
LSampleRate : 合成槽与合成器频率,范围 11KHz 到 96KHz ,默认 22KHz
LValidData : 指定此结构的哪些部分包含了有效数据标志
LVoices : 声音数量,默认值为 64
DirectSound : 声波输出时作为缺省值的 DirectSound8 对象(此项为可选项)
LpChannelCount : 指定 Performance 通道数量
返回值:如果调用不成功, Err.Number 置位
在理解了初始化的过程以后,就可以用 VB 编写初始化程序了。在使用函数以前首先要创建对象:
Dim dx8 As New DirectX8 ' 定义 DirectX8 对象
Dim dxml As DirectMusicLoader8 ' 定义 DirectMusicLoader 对象
Dim dxmp As DirectMusicPerformance8 ' 定义 DirectMusicPerformance 对象
Dim dxms As DirectMusicSegment8 ' 定义 DirectMusicSegment 对象
Dim audParams As DMUS_AUDIOPARAMS ' 定义 DMUS_AUDIOPARAMS 变量
音频初始化函数如下:
Private Sub Init_Audio()
Set dxmp = dx8.DirectMusicPerformanceCreate ' 建立 DirectMusicPerformance 对象
Set dxml = dx8.DirectMusicLoaderCreate ' 建立 DirectMusicLoader 对象
' 初始化 DirectMusicPerformance 对象
dxmp.InitAudio Me.hWnd, DMUS_AUDIOF_ALL, audParams, _
Nothing, DMUS_APATH_SHARED_STEREOPLUSREVERB, 16
dxmp.SetMasterAutoDownload True
End Sub
至此,初始化过程完成,现在就可以装载 MIDI 文件并实现回放了。实现播放和停止要用到三个函数:
1. LoadSegment : 装载音频数据段文件
调用: object.LoadSegment (filename As String) As DirectMusicSegment8
参数: object : DirectMusicLoader8 对象
filename : 指定的文件名
返回: DirectMusicSegment8 对象
错误:如果调用不成功, Err.Number 置位
2. PlaySegmentEx : 回放数据段
调用: object.PlaySegmentEx (Source As Unknown, _
lFlags As CONST_DMUS_SEGF_FLAGS, _
startTime As Long, _
[from As Unknown], _
[AudioPath As Unknown]) As DirectMusicSegmentState8
参数: object : DirectMusicPerformance8 对象
Source : 要被回放的 DirectMusicSegment8 对象
LFlags : 修改方法行为的标志
StartTime : 开始回放的位置
From : DirectMusicSegmentState8 或 DirectMusicAudioPath8 对象(可选)
AudioPath : <SPAN style="FONT-