質問者
winmm.dllのPlaySoundで連続再生

質問
-
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で音が再生できますが
普通にやると音は切り替え時に途切れます。
この切り替えを滑らかにする方法を知っている方は教えてください。
今回したいことは同じファイルを連続で滑らかに再生です。
今:♪_♪_♪_♪
目標:♪♪♪♪
すべての返信
-
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
-
音声ファイルのフォーマット(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
- 編集済み kenjinoteMVP 2018年2月16日 2:05