新しく発言する EXIT インデックスへ
アプリケーションの停止について

  アプリケーションの停止について 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
皆さま、ありがとうございました。これを参考にプログラムを作ってみようと思います。帰省のため、お礼が遅くなりすみませんでした。
本当に有難うございました。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。