「ステップ30 「MCIコマンドで音楽ファイルを再生する」」の編集履歴(バックアップ)一覧はこちら

ステップ30 「MCIコマンドで音楽ファイルを再生する」」(2010/05/02 (日) 07:06:02) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

今回は[[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に以下のようなコードを入力していきます。 #asciiart(blockquote){ ' ---------------------------------------------------------------------------- ' イベント プロシージャ ' ---------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、 ' グローバル領域として利用することができます。 ' ----------------------------------ここから---------------------------------- Dim mop As MCI_OPEN_PARMS ' ----------------------------------ここまで---------------------------------- } ↑MainWnd.sbpの先頭部分には、MCIデバイスのオープン情報のための構造体を用意します。 #asciiart(blockquote){ Sub MainWnd_Destroy() SoundTest_DestroyObjects() PostQuitMessage(0) End Sub } ↑Destroyイベントに変更はありません。 #asciiart(blockquote){ 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)にファイルパスを表示します。 #asciiart(blockquote){ 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コマンドでデバイスを再生します。 #asciiart(blockquote){ 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コマンドでデバイスをクローズしています。 #asciiart(blockquote){ 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変数には同じ値がセットされています。 これで作業は終了です。[[コンパイル]]&実行をして、音楽ファイルが再生できているかどうかチェックしておきましょう。
今回は[[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はこのようなコントロール配置にしておきましょう。 #ref(http://www31.atwiki.jp/abwiki?cmd=upload&act=open&pageid=231&file=screen10.gif,title=screen) コーディング MainWnd.sbpに以下のようなコードを入力していきます。 #asciiart(blockquote){ ' ---------------------------------------------------------------------------- ' イベント プロシージャ ' ---------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、 ' グローバル領域として利用することができます。 ' ----------------------------------ここから---------------------------------- Dim mop As MCI_OPEN_PARMS ' ----------------------------------ここまで---------------------------------- } ↑MainWnd.sbpの先頭部分には、MCIデバイスのオープン情報のための構造体を用意します。 #asciiart(blockquote){ Sub MainWnd_Destroy() SoundTest_DestroyObjects() PostQuitMessage(0) End Sub } ↑Destroyイベントに変更はありません。 #asciiart(blockquote){ 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)にファイルパスを表示します。 #asciiart(blockquote){ 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コマンドでデバイスを再生します。 #asciiart(blockquote){ 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コマンドでデバイスをクローズしています。 #asciiart(blockquote){ 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変数には同じ値がセットされています。 これで作業は終了です。[[コンパイル]]&実行をして、音楽ファイルが再生できているかどうかチェックしておきましょう。

表示オプション

横に並べて表示:
変化行の前後のみ表示: