マルチメディアデータの鑑賞
この章ではWAV形式やMP3形式、MID(MIDI)形式などの音声ファイル、
AVI形式やMPG形式、WMV形式などの動画ファイルを読み込んで再生させますが、
環境によってはMP3形式やWMX形式は再生できない可能性があります。
ヘルプの通り、Win95や98ではWindowsMediaPlayer5.2以降がインストールされている必要があります。
大抵の環境では問題クリアしているかと思いますが、ソフトとして公開する場合は注意してください。
サウンドやムービーを再生するためには、まずHSP側に読み込む(登録する)必要があります。
mmload ファイル名, 操作番号, モード
ファイル名再生したいマルチメディアファイルを指定する。
操作番号次回以降、読み込んだファイルはこの番号で操作する。
モード再生に関するモード(後述)を指定する。
mmload命令はMultiMediaLOADの略でしょう。
HSP2以前はsndload命令が使われていましたが、廃止されてHSP3からmmload命令となりました。
内容は全く同じですが、SouNDLOADの略だと、音声ファイルのみの読み込みを意味するように感じるために、
バージョンアップの段階で名称を変更してしまったものと考えられます。
第1パラメータにpicload命令と同じ様に読み込むファイル名を指定してください。
但し、picload命令とは異なり、指定ファイルが存在しなくてもエラーにはなりません。
exist命令を使用し、プログラム側で制御してください。
尚、再生可能なファイル形式はコチラに挙げたものになります。
第2パラメータは再生・停止する際に使用する制御用の番号を指定します。
HSP2以前は、最大登録ファイル256と言う制限がありましたが、
HSP3からは撤廃されて好きな番号が使用できるようになりました。
第3パラメータは以下の中から任意のモードを選択してください。

 内容
0通常の再生。
1無限ループ再生。
2再生終了するまで処理を停止。
3(CDのみ)指定トラック以降を再生。
+16対象ウィンドウ全体で映像再生。

モード0は音声・映像ファイルの通常再生時に利用します。
もしオーディオCDのトラック5を再生したい場合はファイル名に"CD:5"と指定してください。
モード1は、モード0同様の再生を行い、末端まで再生完了したら初めから再度再生するものです。
BGMとしてエンドレスに再生したい場合に使えますね。
但し、Midi形式は再生時に音源情報の初期化処理が入るために音楽データが途切れてしまいます。
モード2は再生が完了するまで以降のHSP処理を停止します。
モード3は指定したトラック以降のサウンドデータを再生するものです。
映像ファイルである場合、モードに16を加算すると、映像を現在のウィンドウサイズに伸縮して再生します。
尚、管理人の環境で試したところ、AVI形式とMPG形式は共に通常再生、伸縮再生ができましたが、
WMV形式のファイルは新たにウィンドウが開いて再生しました。
音声・動画ファイルを読み込んだだけでは、見た目上は何も変わりません。
実際に鑑賞するには下記の命令を実行する必要があります。
mmplay 再生番号
再生番号mmload命令で設定した登録番号を指定する。
mmplay命令もMultiMediaPLAYの略でしょう。
パラメータには、mmload命令の第2パラメータで指定した操作用の番号を指定します。
もし、再生しようとしている番号が未登録である場合でもエラーにはなりません。
動画で伸縮再生しない(モードに+16を入れない)場合、カレントポジションを基点に貼り付けられます。
尚、ファイルサイズが2MB以下のWAV形式ファイルだと、mmload命令実行時にメモリに読み込み、
mmplay命令実行時にリアルタイム再生しますが、それ以外だとmmplay命令実行時に読み込んで再生します。
 1
 2
 3
 4
	dialog "", 16, "鑑賞するファイル"
	if stat = 0 : end
	mmload refstr, 0 // 再生ファイルを0番として登録
	mmplay 0         // 登録番号0を再生
mm系最後はデータ停止を行う命令です。
mmstop
[パラメータなし]再生データを停止するだけなので、パラメータはない。
mmstop命令もMultiMediaSTOPの略でしょう。
stop命令同様に処理を停止するだけであるためにパラメータは存在しません。
mmstop命令実行時にロードされてなかったり、再生されてなくてもエラーにはなりません。
尚、再生中断後に再度、再生処理を行うと初めからとなります。
mm系命令は、単純な再生と停止のみ行うことが出来るようになっています。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
	title "簡易プレイヤー"
	objsize ginfo_winx / 4, 25
	pos ginfo_winx / 4 * 0, 0 : button gosub "読み込む", *load
	pos ginfo_winx / 4 * 1, 0 : button gosub "再生する", *play
	pos ginfo_winx / 4 * 2, 0 : button gosub "停止する", *suspend
	pos ginfo_winx / 4 * 3, 0 : button gosub "終了する", *exit
	pos 0, 25
	stop

*load
	dialog "", 16, "鑑賞するファイル"
	if stat = 0 : end
	mmload refstr, 1
	return

*play
	mmplay 1
	return

*suspend
	mmstop // 再生データを中断する
	return

*exit
	end
一時的に停止したり、指定位置から再生させたりと高度な処理を行いたい場合は、
MediaControlInterface、通称MCIと呼ばれるマルチメディア制御インタフェイスを利用します。
MCIは、Windows3.1時代にIBM社とマイクロソフト社が共同で開発した
テキスト形式のコマンド操作命令であり、HSP専用の命令ではありません。
HSPでは、MCI形式に準拠した記述を行いデバイスを制御します。
mci MCIコマンド
MCIコマンド各種マルチメディア制御コマンドを文字列テキストとして渡す。
パラメータは、下記に挙げる制御用コマンド文字列を「コマンド 要素名 パラメータ」の形式で指定します。
指定ファイルパスに半角スペースが入る場合は、パスをダブルクォートで囲んで指定するようにしましょう。
取得系コマンドを実行した際、数値結果はstatに、文字列結果はrefstrに返ります。

 コマンド 内容
breakブレイクキーを設定する。
capabilityデバイスの性能を取得する。
captureバッファに取り込み、ファイル保存する。
closeデバイスをクローズする。
copyクリップボードへデータを貼り付ける。
configureビデオの設定ダイアログを開く。
cue再生・録音の合図を出す。
cut要素を切り取り、クリップボードへデータを貼り付ける。
delete要素を削除する。
escape直接デバイスへ送る。
freezeデータを停止する。
getdevcapsスタティックデバイス情報を取得する。
index表示有無を取得する。
infoデバイスの文字列情報を取得する。
list使用可能な入力デバイス番号を取得する。
loadファイルをロードする。
mark高速に検索(seek)できるようマークする。
monitor表示モニターを指定する。
openmmload命令と同じく、再生前に登録する。
pasteクリップボードから要素に貼り付ける。
pause再生処理を一時的に停止する。
playmmplay命令と同じく再生処理を行う。
putフレーム等の各長方形出力情報を設定する。
qualityデバイスの品質を指定する。
realizeパレットを実体化できるようグラフィックデバイスに指示する。
record記録する。
reserve一時ファイルを指定する。
resume一時的に停止していたデバイスを再開する。
saveファイル保存する。
seek指定ポジション位置に再生位置を移動する。
set各種ステータス情報を更新する。
setaudio画像と音を結合する。
settimecodeタイムコードを指定する。
settuner現在のチャンネルをデバイスにする。
setvideoビデオと結合する。
signal作業領域の場所を指定する。
spinディスクの回転を開始・停止する。
status各種ステータス情報を取得する。
stepフレーム単位でステップ実行する。
stopmmstop命令と同じ様に、実行処理を中断する(一時停止としても利用可能?)。
sysinfoデバイス情報を返す。
undo元に戻す。
unfreeze停止データを解除する。
update長方形領域を更新する。
whereクリッピング長方形を取得する。
windowグラフィックウィンドウの特性を指定する。

使用するパラメータは各種様々定義されています。
例えば「capability」コマンドは、メディアの長さ検出可否、デバイスタイプ名の取得など様々あります。

 パラメータ 内容
can detect lengthメディアの長さを取得できる場合は1が返る。
can ejectCDトレイを自動で排出できる場合は1が返る。
can freeze「freeze」コマンドが使用できる場合は1が返る。
can lockデータをロックできる場合は1が返る。
can monitor sourcesリソースに依存せずモニタ出力できる場合は1が返る。
can play再生できる場合は1が返る。
can preroll「cue」コマンドの「preroll」フラグをサポートしてる場合は1が返る。
can previewプレビューできる場合は1が返る。
can record録音できる場合は1が返る。
can reverse逆再生をサポートしている場合は1が返る。
can saveデータ保存でき場合は1が返る。
can stretch指定サイズに伸縮できる場合は1が返る。
can stretch inputイメージをデジタル化する過程で伸縮できる場合は1が返る。
clock increment rate外部クロック1秒あたりの分解能をミリ秒単位で返る。
compound deviceデバイスがパラメータの要素をサポートしている場合は1が返る。
device typeオープンしたデバイスの種類が返る。(cdaudio、dat、scanner、other等)
fast play rate高速再生時の速度がフレーム数で返る。
has audioオーディオ再生をサポートしている場合は1が返る。
has clockクロックを内蔵している場合は1が返る。
has timecodeタイムコードをサポートしている場合は1が返る。
has videoビデオ再生をサポートしている場合は1が返る。
inputs入力デバイス数が返る。
maximum play rate最高再生速度がフレーム数で返る。
minimum play rate最低再生速度がフレーム数で返る。
normal play rate標準再生速度がフレーム数で返る。
number of marks使用可能なマーク数が返る。
outputs出力デバイス数が返る。
seek accuracy「seek」コマンドの正確さがフレーム数で返る。
slow play rateスロー再生時の速度がフレーム数で返る。
uses filesデバイスがファイルを使用する場合は1が返る。
uses palettesデバイスがパレットを使用する場合は1が返る。
windows同時に表示されるウィンドウ数が返る。

これらが全てではありませんし、コマンドやパラメータによっては特定デバイスで使えないものもあります。
使えるか否か、実際の詳しい使い方はテストで地道に試すなり調べるなりしてください。
サーチエンジンで「MCI」や「コマンド」と打ち込むとたくさん出てくると思います。
基本的な使い方については下記サンプルをご覧ください。
 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
88
89
90
91
92
93
94
95
	title "プレイヤー"
	objsize ginfo_winx / 6, 25
	pos ginfo_winx / 6 * 0, 0 : button gosub "トレイ開閉", *tray
	pos ginfo_winx / 6 * 1, 0 : button gosub "読込", *load
	pos ginfo_winx / 6 * 2, 0 : button gosub "再生", *play
	pos ginfo_winx / 6 * 3, 0 : button gosub "初めに移動", *start
	pos ginfo_winx / 6 * 4, 0 : button gosub "情報取得", *info
	pos ginfo_winx / 6 * 5, 0 : button gosub "終了", *exit
	pos 0, 25
	stop

*tray
	// CDの状態を取得し、逆の状態にする
	mci "status cdaudio mode"
	if refster = "open" : prm = "closed" : else : prm = "open"
	mci "set cdaudio door " + prm
	return

*load
	dialog "", 16, "鑑賞するファイル"
	if stat = 0 : stop
	file = refstr
	// デバイスをオープンし、今後からファイル名の代わりにmusicで操作する
	mci "open \"" + file + "\" alias music"
	return

*play
	// データの長さを取得する
	mci "status music length"
	if stat = -1 : dialog "再生できません。" : return
	// 再生状態を取得する
	mci "status music mode"
	if refstr = "playing" {
		mci "pause music"
		objprm 2, "再生"
	} else {
		mci "play music"
		objprm 2, "停止"
	}
	return

*start
	// データの長さを取得する
	mci "status music length"
	if stat = -1 : dialog "移動できません。" : return
	// 再生状態を取得する
	mci "status music mode"
	if refstr = "playing" {
		// 再生中だったなら移動して再生する
		mci "seek music to 0"
		mci "play music"
	} else {
		// 停止中だったなら移動のみ
		mci "seek music to 0"
	}
	return

*info
	// データの長さを取得する
	mci "status music length"
	if stat = -1 {
		infotext = "表示できません。"
	} else {
		// ファイル
		infotext = "データ\t" + file
		//プロダクト名
		mci "info music product"
		infotext += "\nプロダクト\t" + refstr  
		// デバイスタイプを取得し、CDだとトラック情報を取得する
		mci "capability music device type"
		infotext += "\nタイプ\t" + refstr
		if refstr = "cdaudio" {
			// 現在のトラックを取得する
			mci "status music current track"
			infotext += "\nトラック\t" + stat
			// 全トラック数を取得する
			mci "status music number of tracks"
			infotext += " / " + stat
		}
		// 時間フォーマットをミリ秒にする
		mci "set music time format ms"
		// 現在ポジションを取得する
		mci "status music position"
		infotext += "\n長さ\t" + refstr
		// 全体の長さを所得する
		mci "status music length"
		infotext += " / " + refstr
	}
	dialog infotext, , "Information"
	return

*exit
	// デバイスを閉じる
	mci "close music"
	end