VB2008で音楽早送り再生する方法を教えてください

タグの編集
投稿者 たわし君  (中学生) 投稿日時 2010/6/4 16:12:38
VB中学校の「vb.netサンプル」で音楽ファイルを再生する方法がありますが、
早送り再生(音が高くなるやつ)する方法を教えてください
投稿者 るきお  (社会人) 投稿日時 2010/6/5 00:20:57
こんにちは。
シンプルに書くとこんな感じです。

    
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As StringByVal lpstrReturnString As StringByVal uReturnLength As IntegerByVal hwndCallback As IntegerAs Integer
Private Declare Function mciExecute Lib "winmm.dll" (ByVal IpstrCommand As StringAs Integer

'■再生 
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

    Dim FileName As String = "C:\Test\Test.mp3"

    Call mciSendString(String.Format("open ""{0}"" alias MySound", FileName), "", 0, 0)
    Call mciExecute("set MySound speed 2000 ")
    Call mciSendString("play MySound""", 0, 0)

End Sub
'■再生終了(完全停止) 
Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click

    Call mciSendString("stop MySound""", 0, 0)
    Call mciSendString("close MySound""", 0, 0)

End Sub


これだと原理がわかりやすいのはよく、機能的にも問題ないのでサンプルではこの書き方で紹介していますが、あまりにもアンチオブジェクト指向なので実際に組み込む際には
私としては下の方に書くのが好みです。

    
Public Class Form1

    Dim sound As Sound

    '■再生 
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        sound = New Sound("C:\Test\Test.mp3")
        sound.Speed = 2000
        sound.Play()

    End Sub
    '■再生終了(完全停止) 
    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click

        sound.Stop()

    End Sub

End Class

Public Class Sound

    Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As StringByVal lpstrReturnString As StringByVal uReturnLength As IntegerByVal hwndCallback As IntegerAs Integer
    Private Declare Function mciExecute Lib "winmm.dll" (ByVal IpstrCommand As StringAs Integer

    Public Sub New(ByVal fileName As String)
        Me.FileName = fileName
    End Sub

    Public Overridable Sub Play()
        Call mciSendString(String.Format("open ""{0}"" alias MySound", FileName), "", 0, 0)
        Call mciExecute("set MySound speed " & Me.Speed)
        Call mciSendString("play MySound""", 0, 0)
    End Sub

    Public Overridable Sub [Stop]()
        Call mciSendString("stop MySound""", 0, 0)
        Call mciSendString("close MySound""", 0, 0)
    End Sub

    Private _FileName As String
    Public Overridable Property FileName As String
        Get
            Return _FileName
        End Get
        Set(ByVal value As String)
            _FileName = value
        End Set
    End Property

    Private _Speed As Integer = 1000
    Public Overridable Property Speed As Integer
        Get
            Return _Speed
        End Get
        Set(ByVal value As Integer)
            _Speed = value
        End Set
    End Property

End Class


※サンプルの都合上フォームのすぐ下にClassを書いていますが、これも実際には別のSound.vbというファイルを作成してその中に書くのが良いです。蛇足でした。
投稿者 たわし君  (中学生) 投稿日時 2010/6/7 15:02:37
返答遅れてすみません。
ありがとうございました。
投稿者 たわし君  (中学生) 投稿日時 2010/6/16 16:25:08
こんにちは
質問した日から2週間近くたちましたが、2点ほど気になったことがあったので質問させていただきます

(1)上の方法で試してみたところ、再生時間の取得がうまく出来なくなってしまいました。(実際よりも速くなってしまいます)
このバグを修正する方法を教えてください。
再生時間はTimerコントロールで100/1秒周期で以下のコードで取得しています

Dim Buffer As String = New String(Chr(0), 255)
    Dim Position As Double

    Call mciSendString("status MySound position", Buffer, Len(Buffer), 0)

    Position = Val(Buffer)


(2).WMVや.WMAを早送りする方法を教えたください
http://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm のコードでWMVやWMAを
再生することができますが、速度を変更するとエラーが発生します
修正方法を教えてください。
しかし、こちらはついでのようなものなので、無理なら「無理」という返答で構いません

以上の2点をお願いします
投稿者 neptune  (社会人) 投稿日時 2010/6/16 17:15:35
「mcisendcommand 早送り」をキーワードにググるとたくさんヒットします。
一番上にヒットする
マルチメディア自由自在! 高レベルMCIを使う
を見て下さい。今ならキャッシュで見られます。

VB5での解説ですが、APIの使い方は同じですから、十分な情報を得られるはずです。
この中にmsisendcommand関数の解説もありますからそれも検討してみれば如何?

Timerコントロールで100/1秒の精度はなかったと思いますよ。もっと悪いです。
投稿者 たわし君  (中学生) 投稿日時 2010/6/17 16:06:07
>>neptuneさん
ありがとうございました。
もう少しMCIを勉強しなおしてみようと思います
また質問があるかもしれませんが、今後もよろしくお願いします。