如何在VB中进行MIDI的编程?播放,制作等.

解决方案 »

  1.   

    播放好办,就象播放其他多媒体文件一样,使用MCI系列的API;至于编辑,需要弄明白mdi文件的格式,需要处理采集声音信息与转换的知道,这很少有人会
      

  2.   

    用API函数播放声音文件比用VB的Multimedia控件占用系统资源少,速度快,而且程序发布时不用打包Mci32.ocx文件。本文介绍用mciSendString函数实现当前路径下全部MIDI音乐文件的随机循环播放。
      用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