WAVEファイル再生ソフトを作ってみよう

今回のC#プログラミング学習は、WAVEファイル再生ソフトを作ります。

こんな風に書くとなんだか期待させてしまうかもしれないので正直に書くと、WAVEファイルを再生するだけのソフトウェアです。

視覚障害者がプログラミングをする場合、WAVEファイルの鳴らし方を知っておいた方がなにかと便利なので、今回はWAVE再生メモみたいな感じです。

ダウンロード

まずは、ここをクリックしてWAVファイル再生ソフトのサンプルファイルをダウンロードします。

ダウンロードした「step7.zip」を解凍すると、「Step7.txt」「Test.wav」と「Compile.bat」になります。

「Step7.txt」は、今回学習するWAVファイル再生ソフトのC#ソースファイルです。

「Test.wav」はWAVEファイルサンプルです。

「Compile.bat」は、あなたのWindowsパソコンにはじめからインストールされているC#コンパイラ「csc.exe」を使って、「Step7.txt」をコンパイルして実行ファイルを作るためのバッチファイルです。

「Compile.bat」で右クリックまたはアプリケーションキーを押してメニューを開き、編集を選び「Compile.bat」をメモ帳で開きます。

8行目のコンパイルパス(csc.exeまでのパス)をあなたのパソコン環境に合わせて修正します(たぶんこのままでもOKだと思います)。

修正しなかった場合はそのまま閉じて、コンパイルパスを変更した場合には、上書き保存してから閉じます。

実行

「Compile.bat」を実行して「Step7.txt」から「Step7.exe」を作ります。

完成した「Step7.exe」を実行すると以下のようなWAVファイル再生ソフトが起動します。

WAVファイル再生ソフトの画像

左側のエディットボックスに再生するWAVEファイルのパスが記述されています。

初期設定では同梱されていたサンプルファイル「Test.wav」となっています。

右側の「再生 / 停止」ボタンを押すとWAVEファイルが再生され、もう一度ボタンを押すまでループ再生されます。

ソースコード

WAVファイル再生ソフトのソースコードです。

using System;
using System.Drawing;
using System.Windows.Forms;


/********************
Constantsクラス
定数専用
********************/
static class Constants
{
public const String ApplicationName = "WAVファイル再生"; // アプリケーション名
public const String TextBoxFontName = "MS Gothic"; // テキストボックスに表示される文字の書体
public const int TextBoxFontSize = 10; // テキストボックスに表示される文字の大きさ
public const int TextBoxWidth = 300; // テキストボックスのよこ幅
public const int TextBoxHeight = 25; // テキストボックスのたて幅
public const String ButtonFontName = "MS UI Gothic"; // ボタンに表示される文字の書体
public const int ButtonFontSize = 9; // ボタンに表示される文字の大きさ
public const int ButtonWidth = 150; // ボタンのよこ幅
public const int ButtonHeight = TextBoxHeight; // ボタンのたて幅
public const String FileName = "Test.wav"; // 再生するWAVEファイル名
}


/********************
MyApplicationクラス
実行開始位置
********************/
class MyApplication
{
public static void Main()
{
Application.Run(new ApplicationWindow());
}
}


/********************
ApplicationWindowクラス
Formクラスを継承
********************/
class ApplicationWindow : Form
{
private TextBox textbox;
private Button button;
private System.Media.SoundPlayer player = null;

/* コンストラクタ */
public ApplicationWindow()
{
FormDesign();
}

/* FormDesignメソッド */
/* ウィンドウをデザインする */
public void FormDesign()
{
StartPosition = FormStartPosition.CenterScreen;

MaximizeBox = false; // 最大化コマンドの無効化
FormBorderStyle = FormBorderStyle.Fixed3D; // サイズ変更コマンドの無効化

Text = Constants.ApplicationName;
BackColor = SystemColors.Window;
ClientSize = new Size(Constants.TextBoxWidth + Constants.ButtonWidth, Constants.ButtonHeight);

// テキストボックスを作る
textbox = new TextBox();
textbox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize);
textbox.Width = Constants.TextBoxWidth;
textbox.Height = Constants.TextBoxHeight;
textbox.Text = Constants.FileName;
textbox.Multiline = false; // 1行テキストボックス
textbox.TextAlign = HorizontalAlignment.Left; // 左寄せ
textbox.Parent = this;
textbox.Location = new Point(0, 0);
textbox.TabIndex = 0;
textbox.TabStop = true;

// ボタンを作る
button = new Button();
button.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
button.TextAlign = ContentAlignment.MiddleCenter; // 中段中央
button.Width = Constants.ButtonWidth;
button.Height = Constants.ButtonHeight;
button.Text = "再生 / 停止";
button.BackColor = SystemColors.Control;
button.Parent = this;
button.Location = new Point(Constants.TextBoxWidth, 0);
button.Click += new EventHandler(ButtonClick);
button.TabIndex = 1;
button.TabStop = true;
}

/* ButtonClickメソッド */
/* ボタンが押された */
public void ButtonClick(object sender, EventArgs e)
{
String filepath = "";

if (player == null)
{
filepath = textbox.Text;
PlaySound(filepath);
}
else
{
StopSound();
}
}

/* PlaySoundメソッド */
/* WAVEファイルを再生する */
private void PlaySound(string wavefile)
{
player = new System.Media.SoundPlayer(wavefile); // 読み込む

// 非同期再生する
// サウンドをバックグラウンドで1回だけ再生します(非同期再生)。つまりPlayメソッドを呼び出した後も、すぐに次のコードが実行できます。
// player.Play();

// 次のようにすると、ループ再生される
// サウンドをバックグラウンドで再生し、さらにループ再生します(サウンドが終了すると、最初に戻って再び再生します)。
player.PlayLooping();

// 次のようにすると、最後まで再生し終えるまで待機します
// 同期再生です。つまりPlaySyncメソッドを呼び出した後、サウンドが終了するまでブロックされ、何もできなくなります。
// player.PlaySync();
}

/* StopSoundメソッド */
/* 再生されている音を止める */
private void StopSound()
{
if (player != null)
{
player.Stop();
player.Dispose();
player = null;
}
}

/* OnFormClosingメソッド */
/* ウィンドウが閉じるときに呼び出される */
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);

StopSound();
e.Cancel = false;
}
}

プログラム解説

WAVファイル再生ソフトのソースコードについて解説します。

使用DLLの宣言

まずはこのプログラムで使うDLLファイルを宣言します。

「using System;」で「System.dll」の使用宣言となります。

この辺は前回と同じですね。

Constantsクラス

プログラム内で使用する定数をまとめて管理するConstantsクラスです。

このクラスは定数専用です。

クラス名とメンバ変数名を「.」でつなぐことにより、ほかのクラスから定数の内容を呼び出すことができます。

例えば、「Constants.ApplicationName」とすれば、「WAVファイル再生」という文字列を呼び出すことができます。

MyApplicationクラス

WAVファイル再生ソフトプログラムを実行させるのがMyApplicationクラスです。

このクラスが実行開始位置です。

このクラスのMainメソッドから実行されます。

Application.Run命令で、ApplicationWindowクラスを呼び出し実行させていきます。

ApplicationWindowクラス

WAVファイル再生ソフトのプログラム本体を管理するのがApplicationWindowクラスです。

Windowsの提供する各種機能を使うためFormクラスを継承しています。

まずは、このクラス内の各メソッドで自由に使えるメンバ変数を宣言します。

private TextBox textbox;
private Button button;
private System.Media.SoundPlayer player = null;

テキストボックス、ボタンとサウンドを扱うための変数です。

ApplicationWindowメソッド

このメソッドはコンストラクタです。

コンストラクタとは、このクラス(この場合はApplicationWindowクラス)が呼ばれたときに、自動的に実行されるメソッドのことです。

ここでは、FormDesignメソッドを呼び出しています。

FormDesignメソッド

FormDesignメソッドは、前述のコンストラクタから呼び出されウィンドウの内容をデザインします。

まずは、「StartPosition = FormStartPosition.CenterScreen」でモニタの中央にウィンドウを表示させることを指定します。

次に、ウィンドウ自体の外見を指定していきます。

「MaximizeBox = false」で最大化ボタンを無効化し、「FormBorderStyle = FormBorderStyle.Fixed3D」でサイズ変更を無効化しています。

次に、ウィンドウタイトルと背景色とサイズを指定します。

Text = Constants.ApplicationName;
BackColor = SystemColors.Window;
ClientSize = new Size(Constants.TextBoxWidth + Constants.ButtonWidth, Constants.ButtonHeight);

ウィンドウサイズは、実際にウィンドウ内の描画領域となるクライアントサイズのみを指定し、ウィンドウの境界線やタイトルバーなどの大きさはお任せしています。

クライアントサイズは、再生するWAVEファイルパスを表示するテキストボックス、再生および停止を促すボタンが1つの合計2つのアイテムが並んで置けるように指定します。

これでウィンドウの外枠ができたので、次は中身を作っていきます。

まずは、テキストボックスを作ります。

textbox = new TextBox();
textbox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize);
textbox.Width = Constants.TextBoxWidth;
textbox.Height = Constants.TextBoxHeight;
textbox.Text = Constants.FileName;
textbox.Multiline = false; // 1行テキストボックス
textbox.TextAlign = HorizontalAlignment.Left; // 左寄せ
textbox.Parent = this;
textbox.Location = new Point(0, 0);
textbox.TabIndex = 0;
textbox.TabStop = true;

テキストボックスを作ることを宣言し、大きさ、使用フォント、1行テキストボックスで左寄せなどなど必要な指定を行います。

ここまでの学習ができていれば、わからないところはないと思います。

次はボタンを作ります。

button = new Button();
button.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
button.TextAlign = ContentAlignment.MiddleCenter; // 中段中央
button.Width = Constants.ButtonWidth;
button.Height = Constants.ButtonHeight;
button.Text = "再生 / 停止";
button.BackColor = SystemColors.Control;
button.Parent = this;
button.Location = new Point(Constants.TextBoxWidth, 0);
button.Click += new EventHandler(ButtonClick);
button.TabIndex = 1;
button.TabStop = true;

ボタンを作ることを宣言し、大きさ、表示位置と文字とフォント、ボタンが押された時のイベントハンドラなどなどを指定します。

ここも以前学習した内容と同じですから難しいところはないと思います。

これでウィンドウの外見が完成しました。

ButtonClickメソッド

ButtonClickメソッドはボタンが押された時に呼び出されます。

今回のプログラムでは、ボタンが押されたときの状況によりその後の動作を変化させています。

String filepath = "";

if (player == null)
{
filepath = textbox.Text;
PlaySound(filepath);
}
else
{
StopSound();
}

このメソッドが呼び出されif文が成立したとき、それは現在サウンドが鳴っていないことを意味しているので、テキストボックスからWAVEファイルのパスを読み取って再生するPlaySoundメソッドにWAVEファイルパスをわたして再生させています。

else以降が実行される時つまり、if文が不成立だったときは、現在WAVEファイルが再生中であることを意味しているので停止処理を行うStopSoundメソッドを呼び出しています。

PlaySoundメソッド

PlaySoundメソッドは受け取ったWAVEファイルを再生します。

メソッド宣言時のカッコ内に「string wavefile」と書くことで、変数wavefileにWAVEファイルパスを格納することができます。

この仕組みを引数と言ったりします。

ButtonClickメソッドとかですでに何度も出てきているので、システム側がC#プログラムに渡すときに使うものだと思われがちですが、このようにプログラマー側が指定することもできます。

まず、「player = new System.Media.SoundPlayer(wavefile)」で、再生するWAVEファイルを読み込みます。

そして「player.PlayLooping()」でループ再生します(サウンドが終了すると、最初に戻って再び再生します)。

StopSoundメソッド

StopSoundメソッドは再生されている音を止めます。

if (player != null)
{
player.Stop();
player.Dispose();
player = null;
}

nullというのは未定義という意味です。

WAVEファイル再生中は変数playerにサウンド関連の情報が入っているので、if文が成立します。

if文が成立したら、停止処理を行い、player変数の中身をnullに戻します。

もちろん停止中はif文が成立しないので、何もしないでこのメソッド終了です。

OnFormClosingメソッド

OnFormClosingメソッドはウィンドウが閉じられようとしているときに呼び出されます。

今回はもともとC#プログラミングのシステム側にあったものを書き換えて使います。

冒頭の「base.OnFormClosing(e)」は、メソッドをオーバーライド(書き換え)するときに書いておくことがマイクロソフトから推奨されています。

このメソッドが呼ばれたら、まずは音が鳴っていてもいなくても、StopSoundメソッドを呼び出します。

最後に「e.Cancel = false」としてこのメソッドを終了しウィンドウを閉じます。

まとめ

今回のC#プログラミング学習は、ぼくのメモ的な感じになってしまいましたが、サウンドを鳴らすというのはゲームを作るときなど必要な場面が出てくるものなので、覚えておいて損はないです。

ぼくのような視覚障害者の場合は、必須と言っても過言ではないです。

普通では使えない種類のアプリでも、自分で開発した場合には音声ガイドを付けるだけで使いやすいソフトに早変わりです。

以上、ありがとうございました。