〜 メディア 〜
デバイスの開閉・再生・停止

HSP2ではsnd系、HSP3ではmm系を使用すれば音楽・ムービーの再生及び停止を行うことが出来ます。
しかし、いずれも一時停止や巻戻し・早送りといったメディアの再生と停止以外の高度なことが出来ません。
メディアの再生と停止以外のことを標準命令だけで実現するには「MCI」を利用します。
MCIとは「MediaControlInterface」のことで、マルチメディア制御用APIのことです。
「●●を××しろ」と言った制御コマンドを文字列として渡すことで処理するという仕様となっていて、
HSPでも例外ではなく、このコマンド文字列を渡す方法で問題なく処理することが可能です。
ただ、このTIPSでは、snd系、mm系と同レベルまでしか解説していません。
これらを超える制御を行うには次のTIPSをご覧ください。

それでは、サンプルの前にMCI命令を説明しておきましょう。
MCIに送るコマンドは全て「mci "コマンド文字列 パラメータ"」と書きます。
そして、メディアを再生するなり、情報を取得するなり、MCI処理を初めるには
まず「open」コマンドでデバイスをオープンします。
デバイスとは機器や装置という意味で、ココで言うデバイスもほぼ同様の意味で、
WindowsフォルダWin.iniの[MCI Extensions.BAK]セクションがコレに該当します。
で、オープンするだけなら「open 開くデバイス」だけでよいのですが、
下記サンプルのようにファイル指定の場合は、処理の度に毎回デバイスを指定すると汎用性に欠けるので、
エイリアス(別名とか通称ということ)を付けて、この名称で指定するようにしましょう。
エイリアスの付け方は開くものの後にスペースを開けて「alias エイリアス名」を書けばOKです。
さて、サンプルではファイル名の前後にダブルクォーテーションを入れてますが、
コレはファイル及びフォルダパス内に半角スペースがある場合に再生に失敗するので、それの防止策です。
…で、開くものがファイルだとファイルパスを指定して、CDを再生する場合は「cdaudio」と指定しましょう。
以上をまとめると「mci "open \"開くもの\" alias エイリアス名"」です。
この記述でHSP2のsnd系だと、sndload処理、HSP3のmm系だとmmloadしたことになります。

次に、再生を行うsndmmplayに当たる部分はというと「play」コマンドになり、
先ほど付けたエイリアスで「mci "play エイリアス名"」で再生を開始します。

停止を行うsndoffmmstopに当たるのは「stop」コマンドとなり、
「mci "stop エイリアス名"」と書けば停止コマンドを送信し、再生を中断します。
但し、「stop」コマンドは完全に停止するものではないので、
直後に再生位置を指定していない「play」コマンドを実行すると続きから再開させることができます。

snd系、mm系ではデバイスの解放処理を書きませんが、
MCIでは最後にデバイスクローズ「close」コマンドを送信して終了させましょう。
HSPだと「mci "close エイリアス名"」と書けばデバイスを解放できますので、
再生の途中でHSPウィンドウを終了されても大丈夫なようにonexitで対応するとよいでしょう。
全てのデバイスを指定するにはエイリアス名部にallとすることで一斉操作できます。

下記のサンプルは、snd系、mm系と同じ様に指定するMCIモジュール命令群です。
尚、複数同時に読み込めて、HSPウィンドウ終了時に読み込んだ全ファイルを自動的に解放してくれます。
読込時、ファイルパスパラメータに1〜26の数値文字列を指定すると、
1をA、2をB…26をZドライブとしたCDオーディオ形式でロードするようになっています。
再生命令の開始・終了位置指定は、現在のフォーマットで指定しなければなりません。
フォーマットの変更はコチラの命令で行えますが、変更してない場合は「分:秒:フレーム」形式です。
例えば、MSF形式の時に、5分を指定したければ「"5:0:0"」というようにしますが、
省略部は自動的に0が補完されるので、「"5"」だけでも前記と同じ5分を指し示したことになります。
	

mcisel 番号
番号以後の操作対象バッファの番号を指定する。

mciload ファイルパス, 番号
ファイルパス再生するファイルパスを指定する。
尚、"1"ならA、"2"ならB、"26"ならZドライブとしたCDオーディオ形式でロードする。
番号割り当てるバッファ番号を指定する。
尚、当命令を実行すると、自動的に指定番号が操作対象バッファとなる。

mciplay 開始位置, 終了位置, 繰り返し
開始位置省略可能(省略時は空文字""を指定すること)。再生開始位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
終了位置省略可能(省略時は空文字""を指定すること)。再生終了位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
繰り返し最後まで再生したら自動的に初めから再生する(=1)か否(=0)かを指定する。

mcistop
[パラメータなし]現在の操作対象バッファの再生を停止するだけである為、パラメータは必要ない。

mciexit
[パラメータなし]全デバイスを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#module
#deffunc mcisel int
	mref no, 0
	cntno = no
	return

#deffunc mciload str, int
	mref file, 32 : mref no, 1
	cntno = no
	mci "close _" + cntno
	strmid i, file, , 2 : int i
	if i {
		file = "cdaudio!?"
		poke file, 8, i + 64
	}
	mci "open \"" + file + "\" alias _" + cntno
	return

#deffunc mciplay str, str, int
	mref start, 32 : mref finish, 33 : mref re, 2
	if start ! "" : s = " from " + start : else : s = ""
	if finish ! "" : s += " to " + finish
	if re : s += " repeat"
	mci "play _" + cntno + s
	return

#deffunc mcistop
	mci "stop _" + cntno
	return

#deffunc mciend onexit
	mci "stop all"
	mci "close all"
	return
#global

	sdim list, 256
	num = 10
	notesel list
	repeat num
		noteadd "未登録" + cnt, -1
	loop
	objsize 200, 25
	listbox item, 100, list
	button "読込", *load
	button "再生", *play
	button "停止", *suspend
	stop

*load
	dialog "wav;*.mid;*.mp3;*.asf;*.wma", 16
	if stat {
		getpath tmp, refstr, 8
		noteadd tmp, item, 1
		mciload refstr, item
		item.1 = item		// リスト更新時に非選択となるので退避しておく
		objprm 0, list
		objprm 0, item.1	// 再度選択
	}
	stop

*play
	mcisel item
	mciplay "", ""
	stop

*suspend
	mcisel item
	mcistop
	stop

mcisel 番号
番号以後の操作対象バッファの番号を指定する。

mciload ファイルパス, 番号
ファイルパス再生するファイルパスを指定する。
尚、"1"ならA、"2"ならB、"26"ならZドライブとしたCDオーディオ形式でロードする。
番号割り当てるバッファ番号を指定する。
尚、当命令を実行すると、自動的に指定番号が操作対象バッファとなる。

mciplay 開始位置, 終了位置, 繰り返し
開始位置省略可能(省略時は空文字""を指定すること)。再生開始位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
終了位置省略可能(省略時は空文字""を指定すること)。再生終了位置を指定する。
尚、指定は数値文字列、現在のフォーマット(初期はMSF"mm:ss:ff")で行う。
繰り返し最後まで再生したら自動的に初めから再生する(=1)か否(=0)かを指定する。

mcistop
[パラメータなし]現在の操作対象バッファの再生を停止するだけである為、パラメータは必要ない。

mciexit
[パラメータなし]全デバイスを解放するだけの為、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#module
#deffunc mcisel int no
	cntno = no
	return

#deffunc mciload str file, int no, local s
	cntno = no
	mci "close _" + cntno
	// 数値文字列ならCDオーディオのドライブ指定
	if int(file) {
		s = "cdaudio!?"
		poke s, 8, int(file) + 64
	} else {
		s = file
	}
	mci "open \"" + s + "\" alias _" + cntno
	return

#deffunc mciplay str start, str finish, int re, local s
	if start ! "" : s = " from " + start : else : s = ""
	if finish ! "" : s += " to " + finish
	if re : s += " repeat"
	mci "play _" + cntno + s
	return

#deffunc mcistop
	mci "stop _" + cntno
	return

#deffunc mciend onexit
	mci "stop all"
	mci "close all"
	return
#global

	sdim list, 256
	num = 10
	notesel list
	repeat num
		noteadd "未登録" + cnt
	loop
	objsize 200, 25
	listbox item, 100, list
	button gosub "読込", *load
	button gosub "再生", *play
	button gosub "停止", *suspend
	stop

*load
	dialog "wav;*.mid;*.mp3;*.asf;*.wma", 16
	if stat {
		noteadd getpath(refstr, 8), item, 1
		mciload refstr, item
		objprm 0, list
	}
	return

*play
	mcisel item
	mciplay "", ""
	return

*suspend
	mcisel item
	mcistop
	return