ここでは、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」が参考になります。