C#では、簡単な効果音から音楽再生まで、さまざまな方法で音を鳴らすことができます。Windowsアプリケーションの開発中に「クリック音を鳴らしたい」「通知音を追加したい」「BGMを再生したい」と思った経験はないでしょうか?
この記事では、System.Media.SoundPlayer
を使ったWAVファイルの再生から、外部ライブラリ(NAudio
)を用いたMP3再生方法まで、C#で音を鳴らす基本と応用テクニックを初心者向けに解説します。コード例も豊富に紹介しているので、ぜひ実践してみてください。
C#で最もシンプルに音を鳴らす方法は、System.Media.SoundPlayer
クラスを使う方法です。このクラスは、WAV形式のファイルを再生できます。
using System.Media;
SoundPlayer player = new SoundPlayer("sample.wav");
player.Play(); // 非同期で再生
Play()
は非同期再生、PlaySync()
は同期再生.NET Framework
と.NET Core
の両方で使えますファイルパスが間違っていたり、WAVファイルが壊れていたりすると例外が発生します。以下のようにtry-catch
でエラー処理を入れると安全です。
try
{
SoundPlayer player = new SoundPlayer("sample.wav");
player.Load();
player.Play();
}
catch (Exception ex)
{
Console.WriteLine("再生エラー: " + ex.Message);
}
アプリと一緒に配布する場合、音声ファイルをリソースに埋め込んでおくと便利です。
sample.wav
をプロジェクトに追加using System.Reflection;
Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream("Namespace.sample.wav");
SoundPlayer player = new SoundPlayer(stream);
player.Play();
※ "Namespace.sample.wav"
の部分は正しい名前空間とファイル名に置き換えてください。
C#の標準ライブラリではMP3の再生はサポートされていません。そこで便利なのが、オープンソースの音声処理ライブラリ「NAudio」です。
NuGetでインストール:
Install-Package NAudio
using NAudio.Wave;
AudioFileReader reader = new AudioFileReader("sample.mp3");
WaveOutEvent outputDevice = new WaveOutEvent();
outputDevice.Init(reader);
outputDevice.Play();
WaveOutEvent.Dispose()
を使ってリソースを解放しましょうWindows FormsやWPFでのGUIアプリ開発でも、ボタンを押した時に効果音を鳴らすのはよくある要望です。
private void button1_Click(object sender, EventArgs e)
{
SoundPlayer player = new SoundPlayer("click.wav");
player.Play();
}
XAMLでボタンを定義し、イベントに音再生を組み込みます。
<Button Content="再生" Click="Button_Click"/>
private void Button_Click(object sender, RoutedEventArgs e)
{
SoundPlayer player = new SoundPlayer("click.wav");
player.Play();
}
GUIアプリケーションで音をつけることで、ユーザー体験が格段に向上します。
たとえばBGMのようにループ再生したい場合、SoundPlayer
ではなくNAudioのほうが適しています。
// 繰り返し再生(Loop)する方法
var reader = new AudioFileReader("bgm.mp3");
var loop = new LoopStream(reader); // LoopStream は自作クラス
var outputDevice = new WaveOutEvent();
outputDevice.Init(loop);
outputDevice.Play();
LoopStream
クラスを自作して、Read()
を制御することでループが可能です。
複数の音声を同時に再生したい場合は、個別にSoundPlayer
やWaveOutEvent
をインスタンス化すれば対応可能です。ただし、スレッド競合やリソースの管理には注意が必要です。
// 複数の音声を別スレッドで再生
Task.Run(() =>
{
var player = new SoundPlayer("effect1.wav");
player.PlaySync();
});
Task.Run(() =>
{
var player = new SoundPlayer("effect2.wav");
player.PlaySync();
});
C#で音を鳴らす方法には、用途に応じて複数のアプローチがあります。
方法 | 対応フォーマット | 特徴 |
---|---|---|
System.Media.SoundPlayer | WAVのみ | 簡単に扱えるが制限あり |
NAudio | MP3, WAVなど | 高機能で拡張性が高い |
リソース埋め込み再生 | WAV | 配布時に便利 |
効果音やBGMの再生をアプリに加えることで、操作感や演出が一段と洗練されます。この記事で紹介した方法をベースに、ぜひ自分のアプリに音を取り入れてみてください。