2011-11-19 25 views
1

我想在我的VB.NET(VB 2010 Express)中播放一個MIDI文件,並且與我翻譯的代碼this other question here on Stack Overflow從C到VB。VB.NET中的MIDI聲音:暫停和恢復後,它聽起來不同

但是,我也需要暫停,而該代碼僅用於打開和停止。我編輯這樣的代碼:

Imports System.Runtime.InteropServices 
Imports System.IO 
''' <summary> 
''' MCIPlayer is based off code by Slain. 
''' Found here: http://www.sadeveloper.net/Articles_View.aspx?articleID=212 
''' </summary> 
Public Class MCIPlayer 
    Private Shared ReadOnly sAlias As String = "TeaTimerAudio" 

    <DllImport("winmm.dll")> _ 
    Private Shared Function mciSendString(ByVal strCommand As String, ByVal strReturn As StringBuilder, ByVal iReturnLength As Integer, ByVal hwndCallback As IntPtr) As Long 
    End Function 

    Public Shared Sub Open(ByVal sFileName As String) 
     If _Status() <> "" Then 
      _Close() 
     End If 
     Dim sCommand As String = "open """ & sFileName & """ alias " & sAlias 
     mciSendString(sCommand, Nothing, 0, IntPtr.Zero) 
    End Sub 

    Public Shared Sub Close() 
     Dim sCommand As String = "close " & sAlias 
     mciSendString(sCommand, Nothing, 0, IntPtr.Zero) 
    End Sub 

    Public Shared Sub Pause() 
     Dim sCommand As String = "pause " & sAlias 
     mciSendString(sCommand, Nothing, 0, IntPtr.Zero) 
    End Sub 

    Public Shared Sub Play() 
     Dim sCommand As String = "play " & sAlias 
     mciSendString(sCommand, Nothing, 0, IntPtr.Zero) 
    End Sub 

    Public Shared Function Status() As String 
     Dim sBuffer As New StringBuilder(128) 
     mciSendString("status " & sAlias & " mode", sBuffer, sBuffer.Capacity, IntPtr.Zero) 
     Return sBuffer.ToString() 
    End Function 
End Class 

我這樣稱呼它:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    MCIPlayer.Open("C:\Users\User\Desktop\aqua-roses_are_red.mid") 
End Sub 

Private Sub PlayButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayButton.Click 
    MCIPlayer.Play() 
End Sub 

Private Sub PauseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PauseButton.Click 
    MCIPlayer.Pause() 
End Sub 

Private Sub StopButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopButton.Click 
    MCIPlayer.Close() 
End Sub 

的問題是,由於某種原因,如果我點擊播放,然後暫停,然後再次,在打文件實際上是從剩下的地方繼續播放,但是樂器完全不同。旋律切換回默認的鋼琴,而在暫停之前它是完全不同的聲音。

你能幫助我嗎?

我在Win7x64

非常感謝!最好

+0

顯然,有人有同樣的問題,並能解決它: [http://www.freebasic.net/forum/viewtopic.php?p=23358&sid=937c1f6c627fec492be6eb08f837fa55][1] 我會明天檢查一下。 謝謝大家! [1]:http://www.freebasic.net/forum/viewtopic.php?p=23358&sid=937c1f6c627fec492be6eb08f837fa55 – Davide

回答

0

好的,我想出瞭如何做到這一點。下面是代碼,鬆散的啓發,我在上面的評論中提到的freebasic.net鏈接,但是很多簡單:

Public Shared Sub ResumeAfterPause() 
    MsgBox(CLng(_Status())) 'Just to make sure the status is the position, see below 
    Dim sCommand As String = "play " & sAlias & " from " & CLng(_Status()) 
    mciSendString(sCommand, Nothing, 0, IntPtr.Zero) 
End Sub 

和狀態的過程被修改如下:

Public Shared Function _Status() As String 
    Dim sBuffer As New StringBuilder(128) 
    mciSendString("status " & sAlias & " position", sBuffer, sBuffer.Capacity, IntPtr.Zero) 
    Return sBuffer.ToString() 
End Function 

我猜即從一開始播放歌曲時,播放器讀取樂器信息。當它從一個不同的位置開始時,您需要讓設備驅動程序知道他從一個不同的位置開始,以便他可以檢索先前的儀器設置。無論如何,一切都很好(儘管它還沒有結束......當我的應用程序完成後,我還需要在其他平臺上測試它,看看它是否工作相同)。