ここでは、MIDI(.mid)やMP3(.mp3)形式などのオーディオファイルを再生する方法を紹介します。これらのファイルの再生は、.NET Frameworkの機能としては用意されていませんので、Win32 APIなどを使用する必要があります。
なおWAVE(.wav)形式のファイルを再生する方法は、こちらで紹介しています。
まずは、MCI(Media Control Interface)を使用して再生する方法です。この方法では、WAVE、MIDI形式のファイルを再生できます(MP3を再生する方法も後述します)。
下の例では、mciSendString関数を使用してMIDIファイルを再生しています。Button1で再生を開始し、Button2で停止します(Button2で停止しないと、再生できなくなります)。
<System.Runtime.InteropServices.DllImport("winmm.dll", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function mciSendString(ByVal command As String, _ ByVal buffer As System.Text.StringBuilder, _ ByVal bufferSize As Integer, ByVal hwndCallback As IntPtr) As Integer End Function Private aliasName As String = "MediaFile" 'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click '再生するファイル名 Dim fileName As String = "C:\music.mid" Dim cmd As String 'ファイルを開く cmd = "open """ + fileName + """ alias " + aliasName If mciSendString(cmd, Nothing, 0, IntPtr.Zero) <> 0 Then Return End If '再生する cmd = "play " + aliasName mciSendString(cmd, Nothing, 0, IntPtr.Zero) End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim cmd As String '再生しているWAVEを停止する cmd = "stop " + aliasName mciSendString(cmd, Nothing, 0, IntPtr.Zero) '閉じる cmd = "close " + aliasName mciSendString(cmd, Nothing, 0, IntPtr.Zero) End Sub
[System.Runtime.InteropServices.DllImport("winmm.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private static extern int mciSendString(string command, System.Text.StringBuilder buffer, int bufferSize, IntPtr hwndCallback); private string aliasName = "MediaFile"; //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //再生するファイル名 string fileName = "C:\\music.mid"; string cmd; //ファイルを開く cmd = "open \"" + fileName + "\" alias " + aliasName; if (mciSendString(cmd, null, 0, IntPtr.Zero) != 0) return; //再生する cmd = "play " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { string cmd; //再生しているWAVEを停止する cmd = "stop " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); //閉じる cmd = "close " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); }
大抵の場合は、上記の方法でMP3も再生できます。もし再生できないようであれば、ファイルを開くときにmciSendString関数に渡すコマンドを以下のように変更してください。
<System.Runtime.InteropServices.DllImport("winmm.dll", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function mciSendString(ByVal command As String, _ ByVal buffer As System.Text.StringBuilder, _ ByVal bufferSize As Integer, ByVal hwndCallback As IntPtr) As Integer End Function Private aliasName As String = "MediaFile" 'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click '再生するファイル名 Dim fileName As String = "C:\music.mp3" Dim cmd As String 'ファイルを開く cmd = "open """ + fileName + """ type mpegvideo alias " + aliasName If mciSendString(cmd, Nothing, 0, IntPtr.Zero) <> 0 Then Return End If '再生する cmd = "play " + aliasName mciSendString(cmd, Nothing, 0, IntPtr.Zero) End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim cmd As String '再生しているWAVEを停止する cmd = "stop " + aliasName mciSendString(cmd, Nothing, 0, IntPtr.Zero) '閉じる cmd = "close " + aliasName mciSendString(cmd, Nothing, 0, IntPtr.Zero) End Sub
[System.Runtime.InteropServices.DllImport("winmm.dll")] private static extern int mciSendString(String command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback); private string aliasName = "MediaFile"; //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //再生するファイル名 string fileName = "C:\\music.mp3"; string cmd; //ファイルを開く cmd = "open \"" + fileName + "\" type mpegvideo alias " + aliasName; if (mciSendString(cmd, null, 0, IntPtr.Zero) != 0) return; //再生する cmd = "play " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { string cmd; //再生しているWAVEを停止する cmd = "stop " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); //閉じる cmd = "close " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); }
次に、ActiveXコントロールのWindows Media Player Controlを使って再生する方法を紹介します。
まず、Visual StudioのツールボックスにWindows Media Player Controlを追加します。手順は、次のとおりです。
Windows Media Player Controlを使うには、「Windows Media Player」をフォームに配置します。サウンドを再生するだけであればユーザーインターフェイスは必要ありませんので、VisibleプロパティをFalseにします(さらに、uiModeプロパティを"invisible"、Size.WidthとHeightプロパティを0にすれば、確実です)。
フォームにWindows Media Playerを配置し、その名前を「axWindowsMediaPlayer1」としたとき、次のようなコードによりオーディオファイルの再生と停止が可能です。
'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click 'URLプロパティが指定されたら自動的に再生されるようにする AxWindowsMediaPlayer1.settings.autoStart = True 'オーディオファイルを指定する(自動的に再生される) AxWindowsMediaPlayer1.URL = "C:\music.mid" 'autoStartがfalseのときは、次のようにして再生する 'AxWindowsMediaPlayer1.Ctlcontrols.play() End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click '再生しているオーディオを停止する AxWindowsMediaPlayer1.Ctlcontrols.stop() End Sub
//Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //URLプロパティが指定されたら自動的に再生されるようにする axWindowsMediaPlayer1.settings.autoStart = true; //オーディオファイルを指定する(自動的に再生される) axWindowsMediaPlayer1.URL = "C:\\music.mid"; //autoStartがfalseのときは、次のようにして再生する //axWindowsMediaPlayer1.Ctlcontrols.play(); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { //再生しているオーディオを停止する axWindowsMediaPlayer1.Ctlcontrols.stop(); }
ユーザーインターフェイスが必要なければ、フォームに配置する必要もありません。フォームに配置しない場合は、次のようなコードを書きます。なお、wmp.dllとWMPLib.dllを参照に追加する必要があります(フォームにWindows Media Playerを一度配置すれば、これらは自動的に追加されます)。
Dim mediaPlayer As New WMPLib.WindowsMediaPlayer() 'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click 'オーディオファイルを指定する(自動的に再生される) mediaPlayer.URL = "C:\music.mid" '再生する mediaPlayer.controls.play() End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click '再生しているオーディオを停止する mediaPlayer.controls.stop() End Sub
WMPLib.WindowsMediaPlayer mediaPlayer = new WMPLib.WindowsMediaPlayer(); //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //オーディオファイルを指定する(自動的に再生される) mediaPlayer.URL = "C:\\music.mid"; //再生する mediaPlayer.controls.play(); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { //再生しているオーディオを停止する mediaPlayer.controls.stop(); }
Managed DirectXを使えば、音楽ファイルを簡単に再生できます。
Managed DirectXが使える状態にないのであれば、まずマイクロソフトのサイトから「DirectX Redistributable for Software Developers」をダウンロードし、インストールしておきます。
そして参照に「Microsoft.DirectX」と「Microsoft.DirectX.AudioVideoPlayback」を追加し、次のようなコードを書くだけです。
'オーディオファイル名 Dim fileName As String = "C:\music.mid" 'ファイルを開く Dim audio As New Microsoft.DirectX.AudioVideoPlayback.Audio(fileName) '再生する audio.Play()
//オーディオファイル名 string fileName = "C:\\music.mid"; //ファイルを開く Microsoft.DirectX.AudioVideoPlayback.Audio audio = new Microsoft.DirectX.AudioVideoPlayback.Audio(fileName); //再生する audio.Play();
WAVEファイルの再生であれば、DirectSoundを使って再生することもできます。DirectSoundに関しては、「DirectSound」等をご覧ください。
Ogg形式のファイルの再生に関しては、「.NET Implementation of an Ogg Vorbis Player」が参考になります。