DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

MIDI、MP3などの音楽ファイルを再生する

ここでは、MIDI(.mid)やMP3(.mp3)形式などのオーディオファイルを再生する方法を紹介します。これらのファイルの再生は、.NET Frameworkの機能としては用意されていませんので、Win32 APIなどを使用する必要があります。

なおWAVE(.wav)形式のファイルを再生する方法は、こちらで紹介しています。

MCIを使用する方法

まずは、MCI(Media Control Interface)を使用して再生する方法です。この方法では、WAVE、MIDI形式のファイルを再生できます(MP3を再生する方法も後述します)。

下の例では、mciSendString関数を使用してMIDIファイルを再生しています。Button1で再生を開始し、Button2で停止します(Button2で停止しないと、再生できなくなります)。

VB.NET
コードを隠すコードを選択
<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
C#
コードを隠すコードを選択
[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ファイルを再生する

大抵の場合は、上記の方法でMP3も再生できます。もし再生できないようであれば、ファイルを開くときにmciSendString関数に渡すコマンドを以下のように変更してください。

VB.NET
コードを隠すコードを選択
<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
C#
コードを隠すコードを選択
[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);
}

Windows Media Player Controlを使用する方法

次に、ActiveXコントロールのWindows Media Player Controlを使って再生する方法を紹介します。

まず、Visual StudioのツールボックスにWindows Media Player Controlを追加します。手順は、次のとおりです。

  1. Visaul Studioのツールボックス上で右クリックして、メニューから「アイテムの選択」(Visual Studio .NET 2003以前では、「アイテムの追加と削除」)をクリックします。
  2. 「ツールボックスアイテムの選択」ダイアログで「COMコンポーネント」タブを選択します。
  3. リストから「Windows Media Player」を探し、チェックボックスにチェックを入れ、「OK」ボタンをクリックします。
    ツールボックスアイテムの選択
  4. これでツールボックスに「Windows Media Player」が表示されるようになります。

Windows Media Player Controlを使うには、「Windows Media Player」をフォームに配置します。サウンドを再生するだけであればユーザーインターフェイスは必要ありませんので、VisibleプロパティをFalseにします(さらに、uiModeプロパティを"invisible"、Size.WidthとHeightプロパティを0にすれば、確実です)。

フォームにWindows Media Playerを配置し、その名前を「axWindowsMediaPlayer1」としたとき、次のようなコードによりオーディオファイルの再生と停止が可能です。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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();
}

Windows Media Playerをフォームに配置せずに再生する

ユーザーインターフェイスが必要なければ、フォームに配置する必要もありません。フォームに配置しない場合は、次のようなコードを書きます。なお、wmp.dllとWMPLib.dllを参照に追加する必要があります(フォームにWindows Media Playerを一度配置すれば、これらは自動的に追加されます)。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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();
}

DirectXを使用して再生する方法

注意:Managed DirectXのサポートは終了しました。代わりになるものとしては、SlimDXSharpDXなどがあります。

Managed DirectXを使えば、音楽ファイルを簡単に再生できます。

Managed DirectXが使える状態にないのであれば、まずマイクロソフトのサイトから「DirectX Redistributable for Software Developers」をダウンロードし、インストールしておきます。

そして参照に「Microsoft.DirectX」と「Microsoft.DirectX.AudioVideoPlayback」を追加し、次のようなコードを書くだけです。

VB.NET
コードを隠すコードを選択
'オーディオファイル名
Dim fileName As String = "C:\music.mid"

'ファイルを開く
Dim audio As New Microsoft.DirectX.AudioVideoPlayback.Audio(fileName)
'再生する
audio.Play()
C#
コードを隠すコードを選択
//オーディオファイル名
string fileName = "C:\\music.mid";

//ファイルを開く
Microsoft.DirectX.AudioVideoPlayback.Audio audio =
    new Microsoft.DirectX.AudioVideoPlayback.Audio(fileName);
//再生する
audio.Play();

WAVEファイルの再生であれば、DirectSoundを使って再生することもできます。DirectSoundに関しては、「DirectSound」等をご覧ください。

Ogg形式のファイルを再生する

Ogg形式のファイルの再生に関しては、「.NET Implementation of an Ogg Vorbis Player」が参考になります。

  • 履歴:
  • 2014/8/31 誤字修正。
  • 2015/11/7 Managed DirectXのサポートが終了したことを追記など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。