今回はMCIコマンドを使って、WAVE、MIDI、MP3等の音楽ファイルを再生することができる簡易プレーヤーを作ってみます。

MCIコマンドって何?

"Multimedia Control Interface" のことです。ようは、音楽ファイルをオープンしたり、再生、停止したりする、サウンド関連のコマンドのことです。
mciSendCommand関数を使用すれば、MCI_OPEN、MCI_PLAY、MCI_STOPなどのMCIコマンドを送ることができます。

mciSendCommand ( _
      mciId As Long, _        'MCIデバイスのID
      uMsg As Long, _         'コマンド(MCI_OPEN、MCI_PLAY、MCI_STOPなど…)
      dwParam1 As Long, _     'パラメータ1(コマンドにより異なります)
ByRef dwParam2 As Any _       'パラメータ2(コマンドにより異なります)
      ) As Long

作り方
ノーマルウィンドウベースのプロジェクトを新規作成します(プロジェクト名を "SoundTest" とします)。プロジェクト オプションで、「マルチメディアAPIを使用する」にチェックを入れておいて下さい。


MainWndはこのようなコントロール配置にしておきましょう。


コーディング

MainWnd.sbpに以下のようなコードを入力していきます。

' ----------------------------------------------------------------------------
' イベント プロシージャ
' ----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、
' グローバル領域として利用することができます。
' ----------------------------------ここから----------------------------------

Dim mop As MCI_OPEN_PARMS

' ----------------------------------ここまで----------------------------------


↑MainWnd.sbpの先頭部分には、MCIデバイスのオープン情報のための構造体を用意します。


Sub MainWnd_Destroy()
SoundTest_DestroyObjects()
PostQuitMessage(0)
End Sub


↑Destroyイベントに変更はありません。


Sub MainWnd_OpenButton_Click()
Dim ofn As OPENFILENAME
Dim buffer[MAX_PATH-1] As Byte

'ファイル名を取得
ofn.lStructSize=76
ofn.hwndOwner=hMainWnd
ofn.lpstrFilter=Ex"音楽 ファイル(*.wav;*.mid;*.mp3)\0*.wav;*.mid;*.mp3\0すべてのファイル(*.*)\0*\0\0"
ofn.nFilterIndex=1
ofn.nMaxFile=MAX_PATH
ofn.lpstrFile=buffer
GetOpenFileName(ofn)

'テキストボックスにパスを設定する
SetWindowText(GetDlgItem(hMainWnd,Static_Path),ofn.lpstrFile)
End Sub

↑OPENボタンがクリックされたときに呼び出されるイベントです。GetOpenFileName関数でファイル名を取得し、テキストボックス(Static_Path)にファイルパスを表示します。


Sub MainWnd_PlayButton_Click()
Dim bErr As Long
Dim mpp As MCI_PLAY_PARMS
Dim buffer[MAX_PATH-1] As Byte

'再生中の場合は停止させる
If mop.wDeviceID Then MainWnd_StopButton_Click()

'サウンド ファイルのパスを設定します。
mop.lpstrElementName=buffer
GetWindowText(GetDlgItem(hMainWnd,Static_Path),mop.lpstrElementName,260)

'メッセージ通知のためのウィンドウを指定
mop.dwCallback=hMainWnd

'MCIデバイスをオープン
bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
If bErr Then
MessageBox(hMainWnd,"デバイスのオープンに失敗","error",MB_OK)
Exit Sub
End If

'再生
mpp.dwCallback=hMainWnd
bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp)
If bErr Then
MessageBox(hMainWnd,"デバイスの再生に失敗","error",MB_OK)
Exit Sub
End If
End Sub


↑PLAYボタンがクリックされたときに呼び出されるイベントです。MCI_OPENコマンドでMCIデバイスを開き、MCI_PLAYコマンドでデバイスを再生します。


Sub MainWnd_StopButton_Click()
Dim bErr As Long
Dim dwCallback As DWord

'停止
bErr=mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
If bErr Then
MessageBox(hMainWnd,"デバイスの停止に失敗","error",MB_OK)
Exit Sub
End If

'デバイスを閉じる
mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)

mop.wDeviceID=0
End Sub

↑STOPボタンがクリックされたときに呼び出されるイベントです。MCI_STOPコマンドでデバイスを停止させ、MCI_CLOSEコマンドでデバイスをクローズしています。


Sub MainWnd_MciNotify(flags As Long, DevID As Long)
Dim dwCallback As DWord

If flags=MCI_NOTIFY_SUCCESSFUL Then
'デバイスを閉じる
mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback)

mop.wDeviceID=0
MessageBox(hMainWnd,"再生終了","Sound test",MB_OK)
End If
End Sub


↑MciNotifyは、再生が終了した場合などにMCIコマンドから送られるイベントです。RADツールの「イベント処理」ダイアログのMMSYSタブで表示されています。
再生が正常に終了した場合(flagsパラメータに MCI_NOTIFY_SUCCESSFUL フラグがセットされていたとき)はMCI_CLOSEコマンドを送り、MCIデバイスをクローズします。DevID変数とmop.wDeviceID変数には同じ値がセットされています。


これで作業は終了です。コンパイル&実行をして、音楽ファイルが再生できているかどうかチェックしておきましょう。

添付ファイル