none
winmm.dllのPlaySoundで連続再生 RRS feed

  • 質問

  • 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
    

    を使えばVBAで音が再生できますが

    普通にやると音は切り替え時に途切れます。

    この切り替えを滑らかにする方法を知っている方は教えてください。

    今回したいことは同じファイルを連続で滑らかに再生です。

    今:♪___

    目標:

    2018年2月15日 15:56

すべての返信

  • winmm.dllの、PlaySound、waveOutOpen、waveOutWrite、waveOutCloseを使うことができれば「切り替えを滑らかにする」は可能です。ただ、VBAから呼び出せるかどうか、すいません、確認していません。

    これらの用法の考え方は、メモリ上に音データを格納する2本のバッファを用意しておき、まず1本目のバッファにデータを入れて再生しますが、再生の途中で2本目のバッファにデータを流し込んで「次はこれを再生」というように指示する、というものです。1本目のバッファの再生が終われば、2本目のバッファの再生の途中に、さらに次のデータを1本目のバッファに流し込んで「次はこれを再生」と指示します。この繰り返しで延々と途切れずに再生できます。

    この流れを自分でプログラムすることになりますが、小生がC#でプログラムした際は上手く行きました。VB.NETでも上手くいくはずです。

    ただ、ある程度長い音を複数のファイルから呼び出して連続して再生するということは・・・、
    その間、VBAのプログラムは音の再生に専念すればいいんでしょうか? それとも別のタスクもさせたいのでしょうか?

    音の再生を傍らでしつつ、本命の別の作業もこなす、ということはC#やVB.NETであれば複数スレッドで対応できますが、VBAの場合どうすれば良いか、ちょっと見当がつきません。


    • 編集済み 外池 2018年2月16日 1:09
    2018年2月16日 0:53
  • 音声ファイルのフォーマット(mp3 や wav など)は何でしょうか?

    もし wav でしたら、外池 さんのおっしゃるように PlaySound を使って、下記のようなコードで連続再生ができました。

    Option Explicit
    
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
    
    Private Const SND_FILENAME = &H20000
    Private Const SND_ASYNC = &H1
    Private Const SND_LOOP = &H8
    
    Sub PlayBGM()
        Call PlaySound("C:\bgm.wav", 0, SND_FILENAME Or SND_ASYNC Or SND_LOOP)
    End Sub
    
    Sub StopBGM()
        Call PlaySound(vbNullString, 0, SND_FILENAME Or SND_ASYNC Or SND_LOOP)
    End Sub
    2018年2月16日 2:03
  • 質問者さんは、おそらく、ですが、wavファイルからwavファイルへ切り替えつつ連続して音を再生したいんだろうな、と想像します。その切り替えのときに、プツっと音が切れることを嫌っているんじゃないかと。

    2018年2月16日 4:19