HSPからサウンド(音楽ファイル)の再生

ONION softwareさんが製作する無料のプログラミングツール『HSP』(Hot Soup Processor)で、サウンド(音楽BGM、効果音など)を再生する一般的な手段は大きく3つあります。

  1. mmload命令、mmplay命令、mmstop命令
    (HSP2の場合はsndload命令、snd命令、sndoff命令になりますが、ここでは取り上げません。)
  2. mci命令
  3. HSP拡張プラグイン・汎用ライブラリ (DirectX)

[1] mm〜系命令 (標準命令)

HSPの標準命令で、一番手軽で単純なものです。純粋に音楽ファイルを読み込んで(mmload命令)、 再生(mmplay命令)し、停止(mmstop命令)する、の3段階の処理のみ実現できます。これ以外の機能はありません。
 対応フォーマットは、WAVEファイル(*.wav)、MP3ファイル(*.mp3)、MIDIファイル(*.mid)、 WMAファイル(*.wma)です。内部では「Media Control Interface」(MCI)に放り投げてます。同形式の 同時再生は基本的にできません。

//	[HSP3] mmload、mmplay、mmstopのサンプル

;	ボタン
	button "PLAY", *sound_play
	button "STOP", *sound_stop
	stop

*sound_play
;	ファイル読み込みダイアログ
	dialog "wav;*.mp3;*.mid;*.wma", 16, "音楽ファイル"
	if stat = 0 : stop
	mes "ファイルパス: "+refstr

;	音楽ファイルの読み込み
	mmload refstr, 0

;	音楽ファイルの再生
	mmplay 0

	stop

*sound_stop
;	音楽ファイルの再生停止
	mmstop 0

	stop

HSPのPACKFILE機能を利用して、実行ファイル内に埋め込んだ音楽 ファイルを直で利用できますが、これは唯一WAVEファイルだけです。これ以外のMP3ファイルやMIDI ファイルなどは、ハードディスク上にファイルとして存在するものしか読み込めないので注意してください。

なお、再生する音楽ファイルというのがあらかじめ特定されてる場合は、スクリプトの最初でファイルを あらかじめ読み込ん(mmload命令)でおき、実際に再生したい時点ではmmplay命令のみ行うような処理 にしましょう。まったく同じ音楽ファイルを何回にも渡ってmmload命令するのは、ものすごいムダです。

[2] mci命令 (標準命令)

Windowsの「Media Control Interface」(MCI)を利用した音楽ファイルの再生です。
 これはmm〜系命令と違って、音楽ファイルの再生&停止以外にも様々な処理(再生位置、音量など)をある程度実現できるように なってます。「MCI」に対してコマンド文字列を送信して制御します。同形式の同時再生は基本的にできません。
 コマンドの公式ドキュメントは、MicrosoftのMSDNのページ(英語)に一覧が掲載されてます。

対応フォーマットは、WAVEファイル(*.wav)、MP3ファイル(*.mp3)、MIDIファイル(*.mid)、 WMAファイル(*.wma)です。
 ただ、HSPのPACKFILE機能を利用して実行ファイル内に埋め込んだ 音楽ファイル(全形式)はいっさい利用できず、ハードディスク上にファイルとして存在するものしか 読み込めないので注意してください。

mci命令 (HSP命令講座)

[3] HSP拡張プラグイン・汎用ライブラリ

音楽再生をサポートするHSP拡張プラグイン(*.dll、*.hpi)や汎用ライブラリ(*.dll)です。 HSPから利用できるものがいろいろとリリースされてます。
 対応フォーマットは、WAVEファイル(*.wav)、MP3ファイル(*.mp3)、MIDIファイル(*.mid)、 WMAファイル(*.wma)、Ogg Vorbisファイル(*.ogg)といったところです。

それぞれの拡張プラグインや汎用ライブラリの機能・性能次第ですが、基本的にDirectXを 利用するものが多いので、もっともパフォーマンス良く高度な音楽再生処理が実現できると言えます。(途切れのないループ再生、同時の多重再生など)
 HSPのPACKFIEL機能を利用して、実行ファイル内に埋め込んだメモリ上の 音楽ファイルを直で利用できるものも中にはあります。(HSP拡張プラグインそのものは実行ファイルに埋め込む ことはできません!)

HSPプログラミングTIPS サウンド関連拡張プラグイン
 ⇒ HSPTV! 拡張プラグイン紹介 (サウンド・マルチメディア他)

HSPサウンド メモ

・ 一般的に、短いサウンド(効果音系)はWAVEファイルを利用し、長いサウンド(音楽BGM系)は MP3ファイル、MIDIファイル、WMAファイル、Ogg Vorbisファイルを利用したストリーミング再生です。

・ 実際のところ、mm〜系命令やmci命令というのは、ゲームプログラミングでの利用を想定した処理では ありません。どちらも内部的にはWindows 95の前のWindows 3.x時代に作られた旧世代のシロモノを利用しており、 Microsoftはこの分野専門にDirectXを用意してます。 その中で音楽を担当するコンポーネントが「DirectX Audio」(旧DirectSound・DirectMusic)です。
 市販されてるPCゲームも必要環境として必ずといっていいほどDirecXの表記があるはずです。
 HSP(HSP3)の標準命令だけでDirectXコンポーネントを呼ぶというのは、かなーりメンドイこと(hiroさんの事例、ちょくとさんのHSP2事例)になるので、 DirectXの知識がなくてもOKなHSP拡張プラグインや汎用ライブラリを利用するのがもっとも手軽な手段です。

・ 上でも触れてるように、mm〜命令(WAVEファイルを除く)とmci命令は、PACKFIEL機能で埋め 込まれてるファイルを直で呼び出すことができません。ただ、PACKFILE機能はありとあらゆるファイルを実行 ファイルに埋め込めるわけで、たとえばbcopy命令を使って実行ファイルにパックされたMP3ファイルを一度 ハードディスク上に吐き出し、これを再生して、プログラムの終了段階(onexit命令)で削除する手法も いちおうあります。

・ mm〜命令で読み込んだ音楽ファイル(WAVEファイルを除く)や動画ファイルは、mci命令からでもいちおう 制御できます。エイリアス名は「myid」です。(メリットは・・・なし?

//	mmload+mciのタッグ?

	onexit *exit

	dialog "mid;*.mp3;*.wma;*.wmv;*.avi;*.mpg", 16
	if stat = 0 : stop

	mmload refstr
	mmplay		; 一度再生命令を呼ばないとだめ

	mci "stop myid"	; 停止
	mci "status myid length"
	mes "長さ: "+stat

	stop

*exit
	mci "close myid"
	end

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク