プロが教えるわが家の防犯対策術!

VISUAL BASIC 6.0 で音楽再生ソフトを作ろうとしました。
windows API の「mciSendString」を使って、
例1のようにすると b.wav の音楽しか再生されません。
そこで、例2のようにすると、a.wav と b.wav が再生されましたが、
曲の途中では、"pause" と "resume" の命令が効きません。
連続再生ができて、曲の途中でも "pause" や "resume" の命令が効く方法を知りたいのですが、ご指導をお願いします。

<例1>
Call mciSendString("open c:\a.wav ", "", 0, 0)
Call mciSendString("play c:\a.wav ", "", 0, 0)
Call mciSendString("close c:\a.wav ", "", 0, 0)
Call mciSendString("open c:\b.wav ", "", 0, 0)
Call mciSendString("play c:\b.wav ", "", 0, 0)
Call mciSendString("close c:\b.wav ", "", 0, 0)

<例2>
Call mciSendString("open c:\a.wav ", "", 0, 0)
Call mciSendString("play c:\a.wav wait ", "", 0, 0)
Call mciSendString("close c:\a.wav ", "", 0, 0)
Call mciSendString("open c:\b.wav ", "", 0, 0)
Call mciSendString("play c:\b.wav wait ", "", 0, 0)
Call mciSendString("close c:\b.wav ", "", 0, 0)

A 回答 (4件)

> 具体的にイベント取得関数とはどのようなものでしょうか。



MCI へ Notify オプション付きのコマンドを渡して、コールバックされた終了
メッセージを受け取る...ということです。それしかないと思いますよ。

#2 の参考 URL にこのことが書いてあります。MCI を使った例でコールバック
のサンプルプロシージャも同サイトに記事がありますし...

http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/98 …

とりあえず、読んでみましょうよ。

ただ、#3 の方もコメントされてますが、VB ではサブクラス化という特殊な
技法が必要です。うっかりデバッグモードでプログラムを停止したりすると
OS ごとフリーズしますので、難易度は非常に高いです。
    • good
    • 0
この回答へのお礼

丁寧な回答有り難うございます。
Notify オプション付きのコマンドを用いて、Doneイベントで対処したらうまくいきました。
又、timerコントロール内で演奏残時間が0になったら、次の曲へ移るSubプロシージャを呼ぶ出すプログラムを当初作っていてうまく動作しませんでしたが、再度チェックしたら、間違い箇所が見つかり、このプログラムもうまく動くようになりました。
色々お騒がせをし申し訳ありませんでした。

お礼日時:2006/12/16 09:05

すでにANo.2の方がとても参考になるURLを示されているので、意味なくなったんですが(笑)



基本的に、mciは GDIコントロールとして存在するので、VBからは限界があるのです。
おそらく、曲が終わったら次の曲へ。。としたいのだと思いますが、
これがCDのようにトラックになっている場合ならVBだけでできるんですが、
質問されているような、自作のwave形式のファイルの羅列のような場合は、
getYield/setYieldでイベント取得関数を作って、曲の終了を受け取って
次の曲へ移動するような仕組みが必要です。
でも、VBでは受け取る関数(コールバック)を作るのは、そうとう難易度高いと思います。
ANo.2さんの示されたURLからたどれば、可能な方法にたどりつけるようですので、がんばってみられてもよいかとおもいます。
    • good
    • 0
この回答へのお礼

1)[Timer]コントロールを用いて、 [mcisendstring]の”status”コマンドで、曲終了時の「STOPPED」という戻り値が来たら(又は残演奏時間が0になった時)次の曲に行くようにプログラムを既に組んでいました。2曲目が長い曲であれば、次の曲がPlayできるのですが、2曲目が1曲目より演奏時間が短いと、次の曲がplayできずに、ストップされたままでした。なぜかよくわからず、今回の質問に至りました。曲の演奏時間の長短でPlayできない理由がよくわかりません。
2)「getYield/setYieldでイベント取得関数を作って、曲の終了を受け取って次の曲へ移動するような仕組みが必要です。」とありますが、具体的にイベント取得関数とはどのようなものでしょうか。 [mcisendstring]の”status”コマンドでよろしいのでしょうか。

お礼日時:2006/12/14 18:33

この記事も参考になりますよ。



・[VB Magazine ライブラリ]
 マルチメディア自由自在! 高レベルMCIを使う
 http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/98 …

参考URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/98 …
    • good
    • 0

お世話になります。



こちらは、もうご覧になりましたか?
http://homepage1.nifty.com/rucio/main/dotnet/Sam …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!