如何在VB中进行MIDI的编程?播放,制作等.
解决方案 »
- 怎么用listview
- 关于ado2.1的 增加删除数据的问题
- 联机版的财务管理系统应该选择什么数据库比较合理。
- 求助!在VB中有没有实现滚动窗体的控件
- 关于ini操作(WritePrivateProfileStruct),谢谢!
- 如何执行"宏"替换(在线等候)
- 请文一个VB的窗口上可以放多少个控件???
- 请教,MSHFlexGrid中,如何将一列设为隐藏的??在线等待
- 大家能不能解释这个问题
- VB5.0。CrystalReport已经连接了一个数据库data.mdb,并且能预览,能不能再连接一个数据库,也能预览!
- 怎样把,word activex 和程序打包进来,以实现在无word的机子上生成word 格式文件
- 如何创建一个程序退出依然存在的变量?
用mciSendString函数播放声音文件需要为文件指明完整的路径,而且这个路径应该是8.3格式的短路径名(对文件名没有要求),为此我们要用GetShortPathName函数把当前路径的路径名转换为8.3格式的短路径名。要实现多首MIDI音乐文件的随机循环播放必须检测当前播放着的MID音乐何时终止,我们用另一个API函数mciGetCreatorTask,当该函数返回值为0时说明音乐播放完毕,(利用一个时钟控件每隔一定时间检测一次该函数的返回值,当返回值为0时控制开始播放下一首音乐)。mciGetCreatorTask函数需要一个MCI播放设备的ID号,我们用第四个API函数mciGetDeviceID来获得。下面通过一个具体实例说明如何用API函数实现同一路径下全部MID音乐随机循环播放并接受"暂停"与"继续"控制。
首先为当前窗体添加菜单(背景音乐的播放与暂停用菜单控制),将一个子菜单命名为"背景音乐",并勾中"复选";在窗体上放置一个时钟控件,更名为Timer0。窗体的完整代码如下。Option Explicit
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Declare Function mciGetDeviceID Lib "winmm.dll" Alias "mciGetDeviceIDA" (ByVal lpstrName As String) As Long
Private Declare Function mciGetCreatorTask Lib "winmm.dll" (ByVal wDeviceID As Long) As Long
Dim SOUNDNAME As String '当前播放的音乐文件
Dim ID As Long '当前播放的声音文件ID
Dim SHU As Integer '当前路径下MID音乐文件总数
Dim SHUZU(200) As String 'MID音乐文件名数组
Private Sub Form_Load()
Dim A as Integer, path As String, APPPATH As String
Timer0.Enabled = False: Timer0.Interval = 1000
'获得当前路径8.3格式的短路径名
If Right(App.path, 1) = "\" Then path = App.path Else path = App.path & "\"
APPPATH = String$(165, 0)
A = GetShortPathName(path, APPPATH, 164)
APPPATH = Left(APPPATH, InStr(APPPATH, Chr(0)) - 1)
'取得当前路径下的MID文件个数并将文件名存入数组
SOUNDNAME = Dir(APPPATH)
Do While SOUNDNAME <> ""
If SOUNDNAME <> "." And SOUNDNAME <> ".." Then
If Right(SOUNDNAME, 3) = "MID" Or Right(SOUNDNAME, 3) = "mid" Or _
Right(SOUNDNAME, 3) = "RMI" Or Right(SOUNDNAME, 3) = "rmi" Then
SHU = SHU + 1
SHUZU(SHU) = APPPATH & SOUNDNAME
End If
End If
SOUNDNAME = Dir
Loop
Call yinyueSUB '程序启动后自动播放背景音乐
End Sub
Private Sub yinyueSUB()
Dim Res As Integer, Ret As String * 1024
Randomize (Timer)
SOUNDNAME = SHUZU(1 + Int(SHU * Rnd(1)))
Res = mciSendString("play " & SOUNDNAME, Ret, 1024, 0)
If Res <> 0 Then '如果播放不成功
背景音乐.Checked = False
Timer0.Enabled = False
Else
ID = mciGetDeviceID(SOUNDNAME) '获得ID
Timer0.Enabled = True
End If
End Sub
Private Sub Timer0_Timer()
'定时检测当前音乐是否播放完毕
If mciGetCreatorTask(ID) = 0 Then Call yinyueSUB
End Sub
Private Sub 背景音乐_Click()
Dim Ret As String * 1024, Res As Integer
If 背景音乐.Checked = True Then
背景音乐.Checked = False
Timer0.Enabled = False '停止计时
Res = mciSendString("pause " & SOUNDNAME, Ret, 1024, 0)
Else
背景音乐.Checked = True
Call yinyueSUB '去播放音乐子程序
End If
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim Res As Integer, Ret As String * 1024
Res = mciSendString("close all", Ret, 1024, 0)
End
End Sub