• 締切済み

EXCEL VBA でAPIを使って

EXCEL VBA でAPIを使って音源を再生しているのですが、すぐに再生されるときと、再生されるまでに3秒くらいかかるときがあるのですが、なぜでしょうか? 音源の再生のコードは下記のとおりです。 Call mciSendString("Play " & FILE_NAME1, "", 0, 0) 素人の質問で申し訳ありませんが、どなたか解決方法を教えてください。

みんなの回答

回答No.4

質問者さんからの反応が全く無いので、これっきりにしますが、 midiファイルだと長さや音源の数で 再生まで時間が掛かる場合がありますが これは仕方がないことだとおもいます。 wma、mp3 などでは10年以上前のPCでも遅延は発生しないです。 以前色々と試した時には、 まったく反応がなかったり、輪唱状態になったり (^_^;) 面白かったです orz ダメもとで再生前に Sub CloseMCI() Dim pRc As Long pRc = mciSendString("Close All", "", 0, 0) '全てのDeviceを閉じて解放 ? If pRc <> 0 Then Stop 'エラーの場合ここで止まる End If End Sub を実行すると良いかもです。 http://homepage1.nifty.com/rucio/main/dotnet/Samples151/Sample188GetErrorString.htm

回答No.3

こんばんは。 >すぐに再生されるときと、再生されるまでに3秒くらいかかるときがあるのですが、なぜでしょうか? おそらく、オーバーヘッドといって、オブジェクトを読み込むためのメモリ確保の時間でしょう。解決は方法は特別ありませんが、一端、空ファイルを起動時などに読ませることができれば、速く再生するはずです。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

原因は存じませんが、昔Wavをメモリに読み込んで演奏するコードを切り貼りしたのを思い出して引っ張り出して来ました。一旦読み込んだ後はメモリアクセスなので、時間は食わないと思います。但し、音源はWavファイル限定です。短時間の音源を即鳴らしたい時には使えるかもしれません。Win7Home(64bit) + xl2010(32bit)で動作しました。 全然短くない60M程度のファイルで試したところ、タスクマネージャで眺めるとメモリの占有も60M程度でした。ご参考まで。 '☆UserForm1モジュール 'Wav限定 Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _ ByRef pszSound As Byte, ByVal hmod As Long, ByVal fdwSound As Long) As Long 'PlaySound(0,0,0)で止まるという記事通りには止まらないので苦肉の策 Private Declare Function PlaySound2 Lib "winmm.dll" Alias "PlaySoundA" _ (ByVal pszSound As String, ByVal hmod As Long, ByVal fdwSound As Long) As Long Private Const SND_ASYNC = &H1 Private Const SND_MEMORY = &H4 Private Const SND_LOOP = &H8 Dim BufSndTest() As Byte Private Sub CommandButton1_Click() PlaySound BufSndTest(0), 0, SND_ASYNC + SND_MEMORY + SND_LOOP End Sub Private Sub CommandButton2_Click() Call PlaySound2(vbNullString, 0, 0) End Sub Private Sub UserForm_Activate() ReadSoundBuffer GetDesktopPath & "\hoge.wav" End Sub 'メモリに読み込んで、以降メモリデータを演奏 Private Function ReadSoundBuffer(WrkSndFile As String) Dim WrkNumber As Long WrkNumber = FreeFile() Open WrkSndFile For Binary As WrkNumber ReDim BufSndTest(LOF(WrkNumber)) Get WrkNumber, , BufSndTest Close WrkNumber End Function 'テスト用 Private Function GetDesktopPath() As String Dim wScriptHost As Object, strInitDir As String Set wScriptHost = CreateObject("Wscript.Shell") GetDesktopPath = wScriptHost.SpecialFolders("Desktop") Set wScriptHost = Nothing End Function

回答No.1

Open してから Play だと? http://officetanaka.net/excel/vba/tips/tips22.htm

関連するQ&A