〜 メディア 〜
任意トラックの長さを取得

音楽ファイルと違い、CDのサウンドトラックは曲の最後まで来ても停止せず、次の曲へと自動的に進みます。
つまり、1曲だけ再生させるには、再生トラック番号が指定されたものと異なったら停止を中断するか、
予め、曲の開始位置と曲の長さを取得しておき、その範囲内だけ再生するように制御しなければなりません。
当Tipsはトラックの長さを取得するもので、その他の開始位置の取得についてはコチラ、
開始位置を基準とした終了位置の算出はコチラのやり方をそれぞれ参照してください。
コチラの方法で時間フォーマットをトラック単位に変更するのが手っ取り早いとは思いますけど、
あえて、デフォルトの形式のままやりたいというコダワリ派な方のためのものですね。
	

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

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

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

mcitrackmax
[パラメータなし]選択バッファの総トラック数を取得するだけの為、パラメータは必要ない。
尚、取得トラック総数はstatに入る。

mcitrackpos トラック番号
トラック番号開始位置を取得するトラックを指定する。
尚、取得した開始位置は現在の時間フォーマットの形式でrefstrに入る。

mcitracklen トラック番号
トラック番号長さを取得するトラックを指定する。
尚、取得した長さは現在の時間フォーマットの形式でrefstrに入る。

addmsf 時間1, 時間2
時間1MSF(mm:ss:ff)形式の時間を指定する。尚、加算した結果時間はrefstrに返る。
時間2MSF(mm:ss:ff)形式の時間を指定する。

 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#module
#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 mciend onexit
	mci "stop all"
	mci "close all"
	return

#deffunc mcitrackmax
	mci "status _" + cntno + " number of tracks"
	return

#deffunc mcitrackpos int
	mref track, 0
	mci "status _" + cntno + " position track " + track
	return

#deffunc mcitracklen int
	mref track, 0
	mci "status _" + cntno + " length track " + track
	return

#deffunc addmsf str, str
	mref msf1, 32
	mref msf2, 33
	mref rstr, 65
	dim i, 3
	repeat 3
		strmid s, msf1, cnt * 3, 2 : i.cnt  = 0 + s
		strmid s, msf2, cnt * 3, 2 : i.cnt += 0 + s
	loop
	if i.2 >= 75 : i.2 -= 75 : i.1++ // 1秒=75フレーム
	if i.1 >= 60 : i.1 -= 60 : i.0++
	repeat 3
		s = "00" + i.cnt
		strmid s, s, -1, 2
		if cnt : rstr += ":" : else : rstr = ""
		rstr += s
	loop
	return
#global

	repeat 26, 1
		mciload "" + cnt
		mcitrackmax
		drv.1 = stat
		if drv < drv.1 : drv = drv.1 * 100 + cnt // トラック最多ドライブを対象とする
	loop
	if drv.1 > 0 {
		sdim track, drv / 100 * 3
		repeat drv.1, 1
			if track ! "" : track += "\n"
			track += "" + cnt
		loop
		pos 10, 10 : combox index, 100, track
		pos 80, 10 : button "再生", *play
		i = drv \ 100
		mciload "" + i
	} else {
		dialog "1つ以上のトラックが存在するドライブが見つかりませんでした"
		end
	}
	stop

*play
	mcitrackpos index + 1 : start  = refstr
	mcitracklen index + 1 : addmsf start, refstr : finish = refstr
	mciplay start, finish
	stop

mciload ファイルパス, 番号
ファイルパス再生するファイルパスを指定する。
尚、"1"ならA、"2"ならB、"26"ならZドライブとしたCDオーディオ形式でロードする。
番号割り当てるバッファ番号を指定する。

mciplay 番号, 繰り返し, 再生位置
番号再生するバッファ番号を指定する。
繰り返し最後まで再生したら自動的に初めから再生する(=1)か否(=0)かを指定する。
再生位置ミリ秒単位の再生位置を指定する。

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

トラック数 = mcitrackmax()
トラック数取得したトラック総数の受取先を指定する。
[パラメータなし]選択バッファの総トラック数を取得するだけの為、パラメータは必要ない。

開始位置 = mcitrackpos(トラック番号)
開始位置現在の時間フォーマットの形式で取得したトラック開始位置の受取先を指定する。
トラック番号開始位置を取得するトラックを指定する。

長さ = mcitracklen(トラック番号)
長さ現在の時間フォーマットの形式で取得したトラックの長さの受取先を指定する。
トラック番号長さを取得するトラックを指定する。

加算値 = addmsf(時間1, 時間2)
加算値加算した結果時間の受取先を指定する。
時間1MSF(mm:ss:ff)形式の時間を指定する。
時間2MSF(mm:ss:ff)形式の時間を指定する。

 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 mciload str file, int no, local s
	cntno = no
	mci "close _" + cntno
	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 mciend onexit
	mci "stop all"
	mci "close all"
	return

#defcfunc mcitrackmax
	mci "status _" + cntno + " number of tracks"
	return stat

#defcfunc mcitrackpos int track
	mci "status _" + cntno + " position track " + track
	return refstr

#defcfunc mcitracklen int track
	mci "status _" + cntno + " length track " + track
	return refstr

#defcfunc addmsf str msf1, str msf2, local i, local s
	s = msf1, msf2
	repeat 3
		i.cnt = int(strmid(s.0, cnt * 3, 2)) + int(strmid(s.1, cnt * 3, 2))
	loop
	if i.2 >= 75 : i.2 -= 75 : i.1++
	if i.1 >= 60 : i.1 -= 60 : i.0++
	return strf("%02d:", i.0) + strf("%02d:", i.1) + strf("%02d", i.2)
#global

	repeat 26, 1
		mciload str(cnt)
		drv.1 = mcitrackmax()
		if drv < drv.1 : drv = drv.1 * 100 + cnt	// トラック最多ドライブを対象とする
	loop
	if drv.1 > 0 {
		sdim track, drv / 100 * 3
		repeat drv.1, 1
			if track ! "" : track += "\n"
			track += str(cnt)
		loop
		pos 10, 10 : combox index, 100, track
		pos 80, 10 : button gosub "再生", *play
		mciload str(drv \ 100)
	} else {
		dialog "1つ以上のトラックが存在するドライブが見つかりませんでした"
		end
	}
	stop

*play
	mciplay mcitrackpos(index + 1), addmsf(mcitrackpos(index + 1), mcitracklen(index + 1))
	return