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 用のパッケージ管理ツール。外部ライブラリを簡単に追加できる |
| COM | Windows に昔からある仕組み。ツールボックスや COM 参照から追加する |
| ロード | ファイルをメモリに読み込むこと |
TL;DR(用途別の選び方)
| やりたいこと | 使うもの | こんな人向け |
|---|---|---|
| 短い効果音(ピッ、ポンなど)を鳴らしたい | SoundPlayer | ★☆☆ まずはここから。設定が一番簡単 |
| MP3 を鳴らしたい | WPF の MediaPlayer | ★★☆ .NET Framework は参照追加、.NET 6/8/10 は UseWPF で使える |
| ループ再生したい(BGM など) | AxWindowsMediaPlayer | ★★☆ ツールボックスまたは COM 参照から追加。ループ設定が簡単 |
| 音量を細かく変えたい | NAudio | ★★★ NuGet で追加。少し難しいが柔軟 |
最短で動かす(WAV):SoundPlayer [難易度:★☆☆ 初心者向け]
参照の追加は不要です。標準機能なので、そのまま使えます。
手順1:音声ファイルを用意する
- プロジェクトに
fanfare.wavを追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…) - 追加したファイルを選択し、プロパティウィンドウで「出力ディレクトリにコピー」を「常にコピー」に変更
- これで exe と同じフォルダに音声がコピーされ、相対パスで指定できます
手順2:フォームにボタンを配置する
フォームに次のコントロールを配置します。
| コントロール | 名前 | テキスト |
|---|---|---|
| Button | button1 | Play 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 に同梱され、ファイルパスの問題を避けられます。
- プロジェクトに
fanfare.wavを追加 - プロパティで「ビルドアクション」を「埋め込みリソース」に変更
- 次のコードで再生:
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 の場合
- プロジェクトを右クリック → 追加 → 参照(R)…
- 参照マネージャーで「アセンブリ」→「フレームワーク」を選択
- 以下にチェックして OK
- PresentationCore
- WindowsBase
.NET 6/8/10(SDK スタイル)の場合
「参照の追加」メニューはありません。.csproj を編集します。
- プロジェクトを右クリック → プロジェクト ファイルの編集
<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:音声ファイルを用意する
- プロジェクトに
sound.mp3を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…) - 追加したファイルを選択し、プロパティで「出力ディレクトリにコピー」を「常にコピー」に変更
手順3:フォームにボタンを配置する
フォームに次のコントロールを配置します。
| コントロール | 名前 | テキスト |
|---|---|---|
| Button | button1 | Play 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 をツールボックスに追加する
- ツールボックスを右クリック → 「項目の選択」
- 「COM コンポーネント」タブで「Windows Media Player」にチェック
- OK をクリック
- ツールボックスに「Windows Media Player」が表示される
手順2:音声ファイルを用意する
- プロジェクトに
sound.mp3を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…) - 追加したファイルを選択し、プロパティで「出力ディレクトリにコピー」を「常にコピー」に変更
手順3:フォームにコントロールを配置する
フォームに次のコントロールを配置します。
| コントロール | 名前 |
|---|---|
| Button | button1 |
| Windows Media Player | axWindowsMediaPlayer1 |
ボタンの 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 参照から追加する方法です。
- プロジェクトを右クリック → 追加 → COM 参照(C)…
- 「Windows Media Player」にチェック → OK
- コードで
new AxWindowsMediaPlayer()を生成し、CreateControl()で初期化してから使用します。
高度機能(音量・ミキシング等):NAudio [難易度:★★★ NuGet の知識が必要]
音量を細かく変えたい「複数の音を同時に鳴らしたい」など、高度な制御ができます。
手順1:NuGet で NAudio を追加する
- プロジェクトを右クリック → NuGet パッケージの管理(N)…
- 「参照」タブで「NAudio」を検索
- インストールをクリック
手順2:音声ファイルを用意する
- プロジェクトに
sound.mp3を追加(プロジェクトを右クリック → 追加 → 既存の項目(G)…) - 追加したファイルを選択し、プロパティで「出力ディレクトリにコピー」を「常にコピー」に変更
手順3:フォームにボタンを配置する
フォームに次のコントロールを配置します。
| コントロール | 名前 | テキスト |
|---|---|---|
| Button | button1 | Play 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 は再生が終わるまで待つため画面が止まる |
発展アイデア
音が鳴るようになったら、次のようなものにも挑戦できます。
- 正解・不正解で違う音を鳴らすクイズアプリ
- タイマーと組み合わせて、時間になったらアラームを鳴らす
- 複数のボタンで、それぞれ違う効果音を鳴らす
参考
- 元記事(構成・知見の出典): 「WinFormsアプリケーションでのサウンド再生方法」(最終更新 2024-08-29)
- SoundPlayer(Microsoft Learn) – Play が未ロード時にロードすること等の仕様
- MediaPlayer(Microsoft Learn) – WPF メディア再生
- NAudio(GitHub)





ディスカッション
コメント一覧
まだ、コメントがありません