WinFormsでサウンドを鳴らす最短ルートと実践レシピ

広告

目次

はじめに

これまでの学習では、ボタンを押すと何かが起きるアプリを作ってきました。

今回は、ボタンを押すと音が鳴るアプリを作ります。 通知音や効果音を鳴らす方法はいくつかあります。用途に合わせて選べるように、最短ルートと実践レシピを紹介します。

プロジェクトの種類について: .NET Framework と .NET 6/8/10 では、参照の追加方法が異なります。MP3 の MediaPlayer を使う場合など、該当セクションで両方の手順を記載しています。

この記事で使う用語

用語説明
TL;DR「結論から言うと」の意味。忙しい人向けの要約
WAV / MP3音声ファイルの形式。WAV はそのまま、MP3 は圧縮された形式
参照追加プロジェクトで他のライブラリを使えるようにする設定
参照(R)….NET Framework で、アセンブリ(PresentationCore 等)を追加するメニュー。追加 → 参照(R)…
COM 参照Windows Media Player などの COM コンポーネントを追加するメニュー。追加 → COM 参照(C)…
NuGet.NET 用のパッケージ管理ツール。外部ライブラリを簡単に追加できる
COMWindows に昔からある仕組み。ツールボックスや COM 参照から追加する
ロードファイルをメモリに読み込むこと

TL;DR(用途別の選び方)

やりたいこと使うものこんな人向け
短い効果音(ピッ、ポンなど)を鳴らしたいSoundPlayer★☆☆ まずはここから。設定が一番簡単
MP3 を鳴らしたいWPF の MediaPlayer★★☆ .NET Framework は参照追加、.NET 6/8/10 は UseWPF で使える
ループ再生したい(BGM など)AxWindowsMediaPlayer★★☆ ツールボックスまたは COM 参照から追加。ループ設定が簡単
音量を細かく変えたいNAudio★★★ NuGet で追加。少し難しいが柔軟

最短で動かす(WAV):SoundPlayer [難易度:★☆☆ 初心者向け]

参照の追加は不要です。標準機能なので、そのまま使えます。

手順1:音声ファイルを用意する

  1. プロジェクトに fanfare.wav を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…
  2. 追加したファイルを選択し、プロパティウィンドウで「出力ディレクトリにコピー」を「常にコピー」に変更
    • これで exe と同じフォルダに音声がコピーされ、相対パスで指定できます

手順2:フォームにボタンを配置する

フォームに次のコントロールを配置します。

コントロール名前テキスト
Buttonbutton1Play WAV

手順3:ボタンのクリックイベントにコードを書く

ボタンをダブルクリックすると、クリックイベントが作成されます。button1_Click の中に次のコードを書きます。ファイル先頭に using System.Media; が必要です。

using var player = new SoundPlayer(@"fanfare.wav");
player.Play();

完成コード

using System;
using System.Media;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        using var player = new SoundPlayer(@"fanfare.wav");
        player.Play();
    }
}

プログラムの流れ

ボタンをクリック
        ↓
button1_Click が呼ばれる
        ↓
SoundPlayer が fanfare.wav を読み込む
        ↓
Play() で再生開始
        ↓
音が鳴る(プログラムはすぐ次の処理へ)

SoundPlayer.Play() は、まだロードされていなければ内部でロードして再生します。

一部環境(Windows 11 のセキュリティ設定)で Load を明示すると不安定になる事例があるため、Play だけにすると回避できたという知見があります(環境依存)。

重要ポイント

  • 標準機能なので、参照の追加は不要
  • WAV 形式のみ対応(MP3 は不可)
  • 短い効果音(1〜2秒程度)向け。長い音は途中で止まる可能性あり
  • 同時再生・ミキシング不可。素早く連続で鳴らすと遅延や途切れが出る場合あり
  • 音声ファイルは「出力ディレクトリにコピー」を設定しておく

補足:コードだけで作る場合

ボタンもコードで生成する場合は、Form1() 内で new Button して Controls.Add し、Click += でイベントを登録します。デザイナーに慣れている場合は、上記の「ボタンを配置→イベントにコード」の流れが分かりやすいです。

参考:new + ラムダ式のパターン

デザイナーで配置したボタンの button1_Click と、次の Click += (_, __) => { } は同じ仕組みです。=> を使う書き方をラムダ式といい、サンプルコードなどでよく使われます。

var btn = new Button { Text = "Play WAV" };
btn.Click += (_, __) =>
{
    using var player = new SoundPlayer(@"fanfare.wav");
    player.Play();
};
Controls.Add(btn);

(_, __) はクリックイベントの引数(送信元・イベントデータ)で、今回は使わないため _ で省略しています。

補足:リソース埋め込みでファイルパス問題を回避

音声ファイルをプロジェクトのリソースに埋め込むと、exe に同梱され、ファイルパスの問題を避けられます。

  1. プロジェクトに fanfare.wav を追加
  2. プロパティで「ビルドアクション」を「埋め込みリソース」に変更
  3. 次のコードで再生:
using var stream = GetType().Assembly.GetManifestResourceStream("プロジェクト名.fanfare.wav");
var player = new SoundPlayer(stream);
player.Play();

"プロジェクト名.fanfare.wav" は、ソリューションエクスプローラーでリソースの完全修飾名を確認してください(名前空間を含む場合あり)。短い効果音向けです。

参考: SoundPlayer クラス(Microsoft Learn)


MP3 をシンプルに鳴らす:WPF の MediaPlayer を併用 [難易度:★★☆ 参照追加が必要]

手順1:参照を追加する

プロジェクトの種類で手順が違います。 ソリューションエクスプローラーで確認してください。

  • 「参照」ノードがトップレベルにある → .NET Framework
  • 「参照」ノードがなく「依存関係」がある → .NET 6/8/10(SDK スタイル)

.NET Framework の場合

  1. プロジェクトを右クリック → 追加 → 参照(R)…
  2. 参照マネージャーで「アセンブリ」→「フレームワーク」を選択
  3. 以下にチェックして OK
    • PresentationCore
    • WindowsBase

.NET 6/8/10(SDK スタイル)の場合

「参照の追加」メニューはありません。.csproj を編集します。

  1. プロジェクトを右クリック → プロジェクト ファイルの編集
  2. <PropertyGroup> 内に次を追加:
<UseWPF>true</UseWPF>

例(UseWindowsForms の下に追加。TargetFramework は net8.0-windows や net10.0-windows などプロジェクトに合わせて):

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net8.0-windows</TargetFramework>
  <UseWindowsForms>true</UseWindowsForms>
  <UseWPF>true</UseWPF>
</PropertyGroup>

手順2:音声ファイルを用意する

  1. プロジェクトに sound.mp3 を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…
  2. 追加したファイルを選択し、プロパティで「出力ディレクトリにコピー」を「常にコピー」に変更

手順3:フォームにボタンを配置する

フォームに次のコントロールを配置します。

コントロール名前テキスト
Buttonbutton1Play MP3

手順4:Form1 に MediaPlayer のフィールドを追加する

Form1.cs のクラス内に、次のフィールドを追加します。ファイル先頭に using System.Windows.Media; が必要です。

MediaPlayer _player;

手順5:Form1 の Load イベントでファイルを開く

フォームをダブルクリックするか、プロパティの ⚡ 雷マークから Load イベントをダブルクリックし、次のコードを書きます。

_player = new MediaPlayer();
_player.Open(new Uri(@"sound.mp3", UriKind.Relative));

手順6:ボタンのクリックイベントにコードを書く

ボタンをダブルクリックし、button1_Click に次のコードを書きます。

_player.Position = TimeSpan.Zero;
_player.Play();

完成コード

using System;
using System.Windows.Forms;
using System.Windows.Media; // WPF

public partial class Form1 : Form
{
    MediaPlayer _player;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _player = new MediaPlayer();
        _player.Open(new Uri(@"sound.mp3", UriKind.Relative));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _player.Position = TimeSpan.Zero;
        _player.Play();
    }
}

重要ポイント

  • MP3 など多形式に対応
  • 一度 Open しておき、クリック時に Position = TimeSpan.Zero で先頭から再生
  • 一部環境でフォームの見た目が微妙に変わる等の副作用を避けたい場合、次の AxWindowsMediaPlayer も選択肢

補足:コードだけで作る場合

ボタンもコードで生成する場合は、Form1() 内で new Button して Controls.Add し、Click += でイベントを登録します。

参考: MediaPlayer クラス(Microsoft Learn)


ループやUI組み込みを手軽に:AxWindowsMediaPlayer(COM) [難易度:★★☆ COM の追加が必要]

BGM のように同じ曲を繰り返し再生したいときに向いています。

注意: AxWindowsMediaPlayer は Windows Media Player SDK のレガシー機能です。Microsoft は新規開発では WPF の MediaPlayer や NAudio の使用を推奨しています。既存コードの維持など、やむを得ない場合に利用してください。

手順1:Windows Media Player をツールボックスに追加する

  1. ツールボックスを右クリック → 「項目の選択
  2. 「COM コンポーネント」タブで「Windows Media Player」にチェック
  3. OK をクリック
  4. ツールボックスに「Windows Media Player」が表示される

手順2:音声ファイルを用意する

  1. プロジェクトに sound.mp3 を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…
  2. 追加したファイルを選択し、プロパティで「出力ディレクトリにコピー」を「常にコピー」に変更

手順3:フォームにコントロールを配置する

フォームに次のコントロールを配置します。

コントロール名前
Buttonbutton1
Windows Media PlayeraxWindowsMediaPlayer1

ボタンの Text を「Loop Play」に変更します。Windows Media Player は画面に表示しても、非表示(Visible = false)にしても構いません。

手順4:ボタンのクリックイベントにコードを書く

ボタンをダブルクリックし、button1_Click に次のコードを書きます。ファイル先頭に using AxWMPLib; が必要です(デザイナーで配置すると自動追加される場合があります)。

axWindowsMediaPlayer1.URL = "sound.mp3";
axWindowsMediaPlayer1.settings.setMode("loop", true);
axWindowsMediaPlayer1.Ctlcontrols.play();

1回だけ再生(ループしない)の場合: setMode("loop", true) を setMode("loop", false) に変更します。

完成コード

using System;
using System.Windows.Forms;
using AxWMPLib;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        axWindowsMediaPlayer1.URL = "sound.mp3";
        axWindowsMediaPlayer1.settings.setMode("loop", true);
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
}

重要ポイント

  • ループ再生の設定が簡単
  • 画面にプレイヤーを表示して再生・停止ボタンも使える
  • COM コンポーネントの追加が必要
  • レガシー機能のため、新規開発では WPF MediaPlayer や NAudio を優先検討

補足:コードだけで作る場合

ツールボックスを使わず、COM 参照から追加する方法です。

  1. プロジェクトを右クリック → 追加 → COM 参照(C)…
  2. Windows Media Player」にチェック → OK
  3. コードで new AxWindowsMediaPlayer() を生成し、CreateControl() で初期化してから使用します。

高度機能(音量・ミキシング等):NAudio [難易度:★★★ NuGet の知識が必要]

音量を細かく変えたい「複数の音を同時に鳴らしたい」など、高度な制御ができます。

手順1:NuGet で NAudio を追加する

  1. プロジェクトを右クリック → NuGet パッケージの管理(N)…
  2. 「参照」タブで「NAudio」を検索
  3. インストールをクリック

手順2:音声ファイルを用意する

  1. プロジェクトに sound.mp3 を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…
  2. 追加したファイルを選択し、プロパティで「出力ディレクトリにコピー」を「常にコピー」に変更

手順3:フォームにボタンを配置する

フォームに次のコントロールを配置します。

コントロール名前テキスト
Buttonbutton1Play via NAudio

手順4:Form1 にフィールドを追加する

Form1.cs のクラス内に、次のフィールドを追加します。ファイル先頭に using NAudio.Wave; が必要です。

WaveOutEvent _out = new();
AudioFileReader? _reader;

手順5:ボタンのクリックイベントにコードを書く

ボタンをダブルクリックし、button1_Click に次のコードを書きます。

_out.Stop();
_reader?.Dispose();
_reader = new AudioFileReader("sound.mp3");
_out.Init(_reader);
_out.Play();

完成コード

using System;
using System.Windows.Forms;
using NAudio.Wave;

public partial class Form1 : Form
{
    WaveOutEvent _out = new();
    AudioFileReader? _reader;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _out.Stop();
        _reader?.Dispose();
        _reader = new AudioFileReader("sound.mp3");
        _out.Init(_reader);
        _out.Play();
    }
}

重要ポイント

  • WAV / MP3 など多形式に対応
  • 音量制御・ミキシングなど柔軟な操作が可能
  • NuGet でパッケージを追加する必要がある

補足:コードだけで作る場合

ボタンもコードで生成する場合は、Form1() 内で new Button して Controls.Add し、Click += でイベントを登録します。SoundPlayer の「参考:new + ラムダ式のパターン」と同様に、Click += (_, __) => { } で書けます。


よくある落とし穴と対処

困ったこと原因対処
音が鳴らないファイルの場所が違うプロジェクトに追加し「出力ディレクトリにコピー」を「常にコピー」に。別法:リソース埋め込み(SoundPlayer の補足参照)
クリックのたびに最初から鳴らしたい再生位置がリセットされていないMediaPlayer の場合、Play() の前に _player.Position = TimeSpan.Zero を書く
ループ再生したい(BGM など)AxWindowsMediaPlayer / WPF MediaPlayer / NAudio で可能。新規なら後二者を推奨
SoundPlayer で不安定になるLoad を明示している(環境依存)まずは Play() のみで試す
画面が固まったように見えるPlaySync() を使っているPlay() を使う。PlaySync は再生が終わるまで待つため画面が止まる

発展アイデア

音が鳴るようになったら、次のようなものにも挑戦できます。

  • 正解・不正解で違う音を鳴らすクイズアプリ
  • タイマーと組み合わせて、時間になったらアラームを鳴らす
  • 複数のボタンで、それぞれ違う効果音を鳴らす

参考

訪問数 3 回, 今日の訪問数 3回

広告