アプリケーションの停止について Urabutyou 2006/12/22 23:28:56 ├実現方式を考える 山中和義 2006/12/23 09:08:52 │└曲データは全曲フルコーラスあるデータで行... Urabutyou 2006/12/23 14:48:09 │ └MCIコマンドで実現できると思います。 山中和義 2006/12/23 16:24:42 │ └そういう問題ではなくて 河川屋 2006/12/24 10:01:13 │ ├強制的に終了させることはwinAPIから可能で... 哲 2006/12/24 11:37:47 │ └MCIコマンドに,STOPやCLOSEというのがある... 白石 和夫 2006/12/24 13:27:27 │ └失礼しました。 哲 2006/12/24 14:13:39 └具体的なコードへの模索 山中和義 2006/12/24 15:20:38 └その2MCIコマンドを調べてみました。 山中和義 2006/12/24 15:28:06 └皆さま、ありがとうございました。これを参... Urabutyou 2006/12/28 22:19:15
アプリケーションの停止について Urabutyou 2006/12/22 23:28:56 ツリーへ
アプリケーションの停止について |
返事を書く |
Urabutyou 2006/12/22 23:28:56 | |
おききしたいのですが、今、イントロクイズのようなものを作ろうと思っています。そのために音楽を再生するアプリケーションをある時間になったら消去するようにしたいのですが、外部DLLを使わなければできないっていうことは分かるんですが、そのあとが分かりません。音楽はexecute nowait文で行い、ある一定時間を計るためにはwait delay文を使おうと思っています。
いい方法があれば、教えてください。よろしくお願いします。 |
├実現方式を考える 山中和義 2006/12/23 09:08:52 ツリーへ
Re: アプリケーションの停止について |
返事を書く |
山中和義 2006/12/23 09:08:52 | |
実現方式を考える
曲データのファイル形式(フォーマット) ・wav、midi、mp3 wavが一番操作が簡単です。 曲データの内容 ・「やさしい」、「ふつう」、「難しい」、「正解」のように個々にファイルとして持つ。 この場合、プログラムは曲を選択して「全部(初めから終りまで)」を再生すればよい。 ただし、曲データを個別に作る必要がある。 ・「正解」1つのみをファイルとして持つ。 この場合、「一部(区間)」を再生すればよい。 wavデータで個別ファイルなら、拡張機能のplaysound文ではどうですか? 使用例 playsound "c:\windows\media\chord.wav" !同期 ※ファイルの場所はWindowsMEの場合 また、Win32 APIなら、mciコマンド(wav/midi/mp3)になります。 |
│└曲データは全曲フルコーラスあるデータで行... Urabutyou 2006/12/23 14:48:09 ツリーへ
Re: 実現方式を考える |
返事を書く |
Urabutyou 2006/12/23 14:48:09 | |
曲データは全曲フルコーラスあるデータで行いたいのですが。あと、曲ファイルとしては、mp3ファイルを用いるつもりです。
この前提ではやはりできないでしょうか。 |
│ └MCIコマンドで実現できると思います。 山中和義 2006/12/23 16:24:42 ツリーへ
Re: 曲データは全曲フルコーラスあるデータで行... |
返事を書く |
山中和義 2006/12/23 16:24:42 | |
MCIコマンドで実現できると思います。
●MCIコマンドの発行手順 open (set time format) play from to close ●MCIコマンド発行プログラムのサンプル !MCIコマンド(wav/midi/mp3) DECLARE EXTERNAL FUNCTION MciSendString !Win32 API (ここに各MCIコマンド発行のコードを書く) END !winmm.dll EXTERNAL FUNCTION MciSendString(Command$, ReturnString$, uReturnLength, hwndCallback) ASSIGN "winmm.dll","mciSendStringA" END FUNCTION 個々のMCIコマンドの発行は、たとえば「open」の場合、mp3形式なので、 LET f$="c:\My Documents\harukaze.mp3" LET s$="open "&CHR$(34)&f$&CHR$(34)&" type mpegvideo alias BGM" LET n=MciSendString(s$,"",0,0) !メディアファイルを準備する となります。 s$にMCIコマンドを記述します。(後の引数は今回は固定となる) |
│ └そういう問題ではなくて 河川屋 2006/12/24 10:01:13 ツリーへ
Re: MCIコマンドで実現できると思います。 |
返事を書く |
河川屋 2006/12/24 10:01:13 | |
そういう問題ではなくて
mp3ファイルは1曲分だから、3分くらいの演奏時間のファイルのわけで、 そのうち、最初の5秒だけを鳴らしたいがどうすればよいか とういうが質問の趣旨と見ます。 (5秒だけのmp3ファイルを予め切り出しておく、という手段はとりたくない、と明記されている。) 付帯条件としては、おそらく、 ・音楽の鳴っている5秒間は、10進basic同一プログラム内で並行作業(たとえば、「わかった」という意思表示(何かのキーを押したのを検出、など)を行なう必要は無い。 といったところか。 実装方法としては、 1.mp3(等)を鳴らす命令のときに、5秒後止めるという命令までを押し込む。 2.5秒後に、mp3(等)を止める命令を送り込む。 のいずれかになると予想できるけど、 山中さんのプログラムでは、 1.の方法と仮定:演奏時間に当たるパラメータらしきものが無い。 2.の方法と仮定:演奏を止めるときのコマンド発行方法、および、 どうすれば5秒待つことができるか がわからない。 と、こうなります。 ・どうすれば5秒待つことができるか というほうだけなら、たとえば、 <あるファイルを演奏開始する命令> WAIT DELAY 5 !5の部分に演奏したい時間が入る <演奏を強制的に止める命令> で、たぶんokですが、肝心な箇所(演奏を強制的に止める命令がそもそも存在するか)が..... |
│ ├強制的に終了させることはwinAPIから可能で... 哲 2006/12/24 11:37:47 ツリーへ
Re: そういう問題ではなくて |
返事を書く |
哲 2006/12/24 11:37:47 | |
強制的に終了させることはwinAPIから可能ですが少々面倒です。
mp3を演奏するとMPLAYERで開くと思いますが、これを終了させることになります。 方法としてはこんな形です。 MPLAYERのwindowハンドルを取得 hWnd=Function FindWindow (ClassName ,WindowName) MPLAYERを終了させる resuit=CloseWindow(hWnd) |
│ └MCIコマンドに,STOPやCLOSEというのがある... 白石 和夫 2006/12/24 13:27:27 ツリーへ
Re: そういう問題ではなくて |
返事を書く |
白石 和夫 2006/12/24 13:27:27 | |
MCIコマンドに,STOPやCLOSEというのがあるので,それらを使うのではないでしょうか?
MciSendStringで検索してみてください。 |
│ └失礼しました。 哲 2006/12/24 14:13:39 ツリーへ
Re: MCIコマンドに,STOPやCLOSEというのがある... |
返事を書く |
哲 2006/12/24 14:13:39 | |
失礼しました。
mciSendStringを使った場合はそうでした。 こんなところが参考になりそうです。 http://www.ne.jp/asahi/oh/landd/prog_html/prog59.html |
└具体的なコードへの模索 山中和義 2006/12/24 15:20:38 ツリーへ
Re: アプリケーションの停止について |
返事を書く |
山中和義 2006/12/24 15:20:38 | |
具体的なコードへの模索
実験1 !EXECUTE NOWAITで起動したアプリケーション(MediaPlayer)の停止 LET WM_CLOSE=BVAL("10",16) LET ClassName$="" LET sAppCaption$="Windows Media Player" LET hWnd=FindWindow(ClassName$,sAppCaption$) !ハンドルを取得 PRINT hWnd LET f$="D:\Temp\Combattler V\Combattler V.mp3" !再生する曲のファイル名 EXECUTE NOWAIT f$ !標準ではMediaPlayerが起動される !起動や再生の多少のもたつきが気になる WAIT DELAY 8 !起動を待つ ※8は調整要 LET ClassName$="" LET sAppCaption$="Windows Media Player" LET hWnd=FindWindow(ClassName$,sAppCaption$) !MediaPlayerのハンドルを取得する PRINT hWnd WAIT DELAY 5 !演奏したい時間 !LET n=CloseWindow(hWnd) !MediaPlayerを終了させる !PRINT n LET n=PostMessage(hWnd,WM_CLOSE,0,0) !MediaPlayerを終了させる PRINT n END !user32.dll EXTERNAL FUNCTION FindWindow(lpClassName$, lpWindowName$) ASSIGN "user32.dll","FindWindowA" END FUNCTION EXTERNAL FUNCTION CloseWindow(hWnd) ASSIGN "user32.dll","CloseWindow" END FUNCTION EXTERNAL FUNCTION PostMessage(hWnd, wMsg, wParam, lParam) ASSIGN "user32.dll","PostMessageA" END FUNCTION |
└その2MCIコマンドを調べてみました。 山中和義 2006/12/24 15:28:06 ツリーへ
Re: 具体的なコードへの模索 |
返事を書く |
山中和義 2006/12/24 15:28:06 | |
その2 MCIコマンドを調べてみました。
実験2 !MCIコマンド(wav/midi/mp3/CDなど) DECLARE EXTERNAL FUNCTION MciSendString !Win32 API LET n=MciSendString("close BGM","",0,0) !debug debug debug LET f$="D:\Temp\Combattler V\Combattler V.mp3" LET s$="open "&ToString$(f$)&" type mpegvideo alias BGM" LET n=MciSendString(s$,"",0,0) !メディアファイルを準備する PRINT "open";n !結果確認 IF n=0 THEN !準備ができたら LET s$="set BGM time format milliseconds" !タイム形式をミリ秒単位にする LET n=MciSendString(s$,"",0,0) !※tmsf,msf,ms,milliseconds PRINT "set";n !----------------------------- LET st=10000 !10秒から LET ed=15000 !15秒まで !●ケース1 演奏時間(開始と終了)の指定、演奏中にBASIC側の処理がある場合 PRINT "ケース1" LET s$="play BGM from "&STR$(st)&" to "&STR$(ed)&" notify" !非同期にシーク付き再生する LET n=MciSendString(s$,"",0,0) PRINT "play";n WAIT DELAY (ed-st)/1000+2 !非同期、鳴り終わるのを待つ ※2は余裕 !●ケース2 演奏時間(開始と終了)の指定、演奏中にBASIC側の処理なし PRINT "ケース2" LET s$="play BGM from "&STR$(st)&" to "&STR$(ed)&" wait" !同期にシーク付き再生する LET n=MciSendString(s$,"",0,0) PRINT "play";n !●ケース3 演奏時間(開始のみ)の指定(演奏を止めるためにBASIC側の処理は必須) PRINT "ケース3" LET s$="play BGM from "&STR$(st)&" notify" !非同期にシーク付き再生する LET n=MciSendString(s$,"",0,0) PRINT "play";n WAIT DELAY (ed-st)/1000 !非同期、鳴り終わるのを待つ LET s$="stop BGM" LET n=MciSendString(s$,"",0,0) !停止する PRINT "stop";n !----------------------------- LET s$="close BGM" LET n=MciSendString(s$,"",0,0) !ファイルを開放する PRINT n PRINT "close";n END IF END EXTERNAL FUNCTION ToString$(s$) !クォーテーション付きの文字列へ LET ToString$=CHR$(34)&s$&CHR$(34) END FUNCTION !winmm.dll EXTERNAL FUNCTION MciSendString(Command$, ReturnString$, uReturnLength, hwndCallback) ASSIGN "winmm.dll","mciSendStringA" END FUNCTION |
└皆さま、ありがとうございました。これを参... Urabutyou 2006/12/28 22:19:15 ツリーへ
Re: その2MCIコマンドを調べてみました。 |
返事を書く |
Urabutyou 2006/12/28 22:19:15 | |
皆さま、ありがとうございました。これを参考にプログラムを作ってみようと思います。帰省のため、お礼が遅くなりすみませんでした。
本当に有難うございました。 |