摘要:文章简单地介绍了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 : 指向DirectMusicAudioPath8的指针(可选)
3.StopEx : 停止回放
调用:object.StopEx (objectToStop As Unknown, _
lStopTime As Long, _
lFlags As Long)
参数:object : DirectMusicPerformance8对象
objectToStop : DirectMusicSegment8、DirectMusicSegmentState8或DirectMusicAudioPath8对象
lStopTime : 指定停止时间
lFlags : 指定停止事件标志
我们可以通过一个“打开”对话框来指定要被用来回放的MIDI文件,程序代码如下:
CommonDialog1.Filter = "*.mid|*.mid"
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> "" Then
Me.Caption = CommonDialog1.FileName
Set dxms = dxml.LoadSegment(CommonDialog1.FileName) '将文件名所指向的文件读入段中
If Right$(CommonDialog.FileName, 4) = ".mid" Then
dxms.SetStandardMidiFile
End If
End If
等数据段文件被成功的装入后,就可以用下面的代码实现声音的回放和停止操作了。
dxmp.PlaySegmentEx dxms, DMUS_SEGF_DEFAULT, 0 ‘回放
dxmp.StopEx dxms, 0, DMUS_SEGF_DEFAULT ‘停止
在结束程序的时候可一定要记得释放对象!
If Not (dxms Is Nothing) Then dxmp.StopEx dxms, 0, 0
Set dxms = Nothing
Set dxml = Nothing
If Not (dxmp Is Nothing) Then dxmp.CloseDown
Set dxmp = Nothing
下面是一段用VB编写的MIDI播放程序,其中大部分代码在上面都有详细介绍。程序中使用了DirectMusicPerformance8对象的其它一些方法,这部分内容不是重点,在源代码中只作简单的注释,有兴趣的朋友可以查看有关于DirectX SDK的资料。
‘程序调试环境:Microsoft Windows 9x/Me、DirectX8.0、Microsoft VisualBasic 6.0
Common Declarations
Dim dxml As DirectMusicLoader8 '定义DirectMusicLoader对象
Dim dxmp As DirectMusicPerformance8 '定义DirectMusicPerformance对象
Dim dxms As DirectMusicSegment8 '定义DirectMusicSegment对象
Dim audParams As DMUS_AUDIOPARAMS '定义DMUS_AUDIOPARAMS变量
Dim dx8 As New DirectX8 '定义DirectX8对象
Private Sub Command1_Click()
Command1.Enabled = False '设置按钮属性
Command2.Enabled = True
Command3.Enabled = False
dxmp.PlaySegmentEx dxms, DMUS_SEGF_DEFAULT, 0 '播放音乐
End Sub
Private Sub Command2_Click()
Command1.Enabled = True '设置按钮属性
Command2.Enabled = False
Command3.Enabled = True
dxmp.StopEx dxms, 0, DMUS_SEGF_DEFAULT '停止播放音乐
End Sub
Private Sub Command3_Click()
CommonDialog1.Filter = "*.mid|*.mid|*.wav|*.wav|*.sgt|*.sgt" '设置打开文件过滤器
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> "" Then
Me.Caption = CommonDialog1.FileName
Set dxms = dxml.LoadSegment(CommonDialog1.FileName) '将文件名所指向的文件读入段中
If Right$(CommonDialog1.FileName, 4) = ".mid" Then '如果文件为MIDI文件则将段属性设置为
dxms.SetStandardMidiFile '标准的MIDI文件
End If
Command1.Enabled = True
Command3.Enabled = False
End If
End Sub
Private Sub Form_Load()
Command1.Enabled = False
Command2.Enabled = False
Command3.Enabled = True
Init_Audio '初始化音频
End Sub
Private Sub Form_Unload(Cancel As Integer)
Clear_Audio
End Sub
Private Sub Slider1_Scroll()
dxmp.SetMasterVolume Slider1.Value '设置主控音量
End Sub
Private Sub Slider2_Scroll()
dxmp.SetMasterTempo Slider2.Value '设置主控播放速度
End Sub
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
Private Sub Clear_Audio()
dxmp.RemoveNotificationType DMUS_NOTIFY_ON_SEGMENT
If Not (dxms Is Nothing) Then dxmp.StopEx dxms, 0, 0
Set dxms = Nothing
Set dxml = Nothing
If Not (dxmp Is Nothing) Then dxmp.CloseDown
Set dxmp = Nothing
End Sub
参考文献:Microsoft Developer Network(MSDN®)
Microsoft DirectX8® Software Developing Kit (SDK)