サウンドの同時再生

タグの編集
投稿者 ugonight  (中学生) 投稿日時 2011/8/31 11:32:42
久しぶりにやったんでいろいろ忘れてますort

ListBoxのコレクションに登録されている音楽ファイルを再生したいのですが、一度にそれを全部再生するのにいい方法はありませんか?

サンプルのやつをみると変数をいくつも用意しなければならないように思われますが…
投稿者 るきお  (社会人) 投稿日時 2011/8/31 13:03:03
こんにちは。

2つ同時再生であれば、
My.Computer.Audio.PlayとWindows APIのmciSendStringを使うことで比較的簡単に同時再生できます。
これはサンプルで公開しているシューティングゲーム「スターエース」で実際にやっています。
http://homepage1.nifty.com/rucio/main/DownLoad/Index_dl.htm#StarAce


もっとたくさんあったり複雑なのであればDirectSoundを使うとできるようですが、私は経験がありません。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=9995

>サンプルのやつをみると変数をいくつも用意しなければならないように思われますが… 
スターエースのことでしょうか?
逆に変数をいくつか用意すれば実現できるということならばなかなか有望な解決策だと思います。
投稿者 ugonight  (中学生) 投稿日時 2011/8/31 14:20:11
ありがとうございます。

サンプルというのはこれ☟のことです
http://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm

これのサウンドを鳴らすっていうやつでリストボックスに入っているファイル名のファイルを同時に再生させたいのですが…
投稿者 ugonight  (中学生) 投稿日時 2011/8/31 15:08:41
リストボックスで指定したインデックスの項目を取得するにはどうしたらいいですか?

例)
ListBox1





コード
0の項目は?

戻り値
投稿者 ugonight  (中学生) 投稿日時 2011/8/31 15:13:32
あれ?でも…
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As StringByVal lpstrReturnString As StringByVal uReturnLength As IntegerByVal hwndCallback As IntegerAs Integer

は一つしかならせませんよね…どうしたらいいでしょうか…
投稿者 るきお  (社会人) 投稿日時 2011/9/1 12:55:35
>リストボックスで指定したインデックスの項目を取得するにはどうしたらいいですか?
話題が違う質問は別投稿にしてください。

リストボックスで指定したインデックスの項目を取得するには、Itemsプロパティを使用します。
http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample106ListBoxGetItem.htm

>は一つしかならせませんよね…どうしたらいいでしょうか… 
なので、My.Computer.Audio.Playを使うと2つは同時にならせます。

※3つ以上は、前にも書きましたがDirectSoundを使うとできるようですが、私は経験がありません。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=9995
投稿者 ugonight  (中学生) 投稿日時 2011/9/1 18:05:26
いや…最初の質問からリストボックスのことは書いておきましたけど…

ありがとうございます。

リストボックスは解決しました
DirectSoundというのを使ってみます!
投稿者 ugonight  (中学生) 投稿日時 2011/9/1 18:11:10
…どこ調べてもわからない……
DirectSoundってどうやって使うか知っている方はいませんか…?
投稿者 zakiYoshi  (高校生) 投稿日時 2013/5/4 17:38:13
はじめまして。

最近、mcisendstring について調べている中で、役に立ちそうなことがいくつか見つかったので、
ここで投稿しておきます。

(1)mcisendstring で同時再生ができる。

 そもそも、mcisendstring は同時再生ができるようです。
 方法としては単に、別のエイリアスを使うだけです。
 

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
        (ByVal LpstrCommand As StringByVal LpstrReturnString As String, _
         ByVal uReturnLength As IntegerByVal HWndCallback As IntegerAs Integer

Public Sub Play()

    ' 再生するファイルを「sound1」「sound2」というエイリアス(別名)で開く。 
         mciSendString("open " & "(再生するファイルのパス)" & " alias sound1"Nothing , 0 , 0 )
         mciSendString("open " & "(再生するファイルのパス)" & " alias sound2"Nothing , 0 , 0 )

         mciSendString("play sound1"Nothing , 0 , 0 )
         mciSendString("play sound2"Nothing , 0 , 0 )

End Sub
 (VB2010, .wav ファイルでテスト済み。)

(2)再生などの終了時にコールバック(終了通知)を受け取れる。

 これは、NativeWindow クラスの継承を活用して実現できます。ここでは、紹介にとどめておきます。
投稿者 Suzuran  (社会人) 投稿日時 2013/5/6 10:54:48
My.Computer.Audio.Play("パス",AudioPlayMode.Background)
                                                           ↑
こうすることで、二つ再生できるのでは・・・
投稿者 zakiYoshi  (高校生) 投稿日時 2013/5/6 15:26:56
>>My.Compuper.Audio.Play("パス", AudioPlayMode.Background) こうすることで、...

私個人としては、思わぬ動作を防ぐために、そのように書くのがよいと思います。

ちなみに、msdnライブラリで調べたところ、第2引数(AudioPlayMode.Background)を省略するのと、
第2引数に AudioPlayMode.Background を指定するのは同じことになるそうです。

リンク先 : http://msdn.microsoft.com/ja-jp/library/cf1shcah(v=vs.90).aspx

--------------------------------------------------------------------------------------
<< 前回の投稿の補足 >>
 
 前回の投稿で掲載したコードサンプルでは、2つのファイルしか同時に再生していませんが、
3つ以上のファイルを同時に再生することもできます。