どうも!リョクちゃです。
ということで今回は音源ファイルの一種である、wavファイルについて
VB.Netで再生するにはどうすればいいのかWindowsフォームアプリケーションを
作りながら紹介していきます。
ちなみに前回の記事はこちら
目次
準備編
VisualStudio2019を使って、Windowsフォームアプリケーションを作成していきます。
最初の手順については、下記記事をご参照ください。
フォームの作成
以下のようなフォームを作成します。
①~②のコントロールについては以下の表のとおりです。
No | コントロール | 名前 |
---|---|---|
1 | Button | btnStart |
2 | Button | btnStop |
各コントロールのフォントは、メイリオの18ptを設定しています。
実行環境
筆者の実行環境は、
- VisualStudio2019
- Windows 10 64bit
- .Net Framework 4.5.1
になります。
※ Windows7 8 8.1でも動作はできますが、画面デザインの表示が変わるかもしれません。
アプリケーションの目的
“wavファイル再生”ボタンを押すことで、指定されたwavファイルが再生され、
“wavファイル停止”ボタンを押すことで、再生されているwavファイルを停止する。
これらができることを目的とする。
動作
動作としては、
- btnWavStartを押すことで、指定のwavファイルを再生。
- btnWavStopを押すことで、再生されているwavファイルの停止。
これらができることとします。
プログラム編
wavファイル
WAVまたはWAVE(ウェイヴ、ウェヴ、ワヴ) (RIFF waveform Audio Format) は、マイクロソフトとIBMにより開発された音声データ記述のためのフォーマットである。RIFFの一種。主としてWindowsで使われるファイル形式である。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ゲーム内の効果音やプレゼン資料などの効果音などに使われることが多いですね。
今回、使用するwavファイルは下記サイトでダウンロードさせていただきました。
使用するwavファイル
・cat1.wav
・dog1.wav
今回は音源ファイルをアプリケーションで使う方法を2パターン紹介していきます。
音源ファイルを事前にプログラムフォルダに配置する
音源ファイルをプロジェクトフォルダ(プログラムフォルダ)内に配置する方法があります。
下図の様な流れで配置します。
プロジェクト内のbinフォルダのDebugフォルダ上にWaveフォルダを新たに作成します。
作成したフォルダに使用するwavファイルを配置します。
配置するには、作成したWaveフォルダを選択し、右クリックを押します。
押したら追加タブの既存項目の追加をクリックし、wavファイルを選択し追加します。
これで準備は完了です。
音源ファイルの再生
Waveフォルダに配置したwavファイルを実際に読み出し再生していきます。
wavファイルを再生するには、若干の準備が必要になります。
音源ファイル再生の準備
wavファイルを扱う際に必要となるDLL“winmm.dll”をインポートします。
コードで書くと、
1 2 |
<System.Runtime.InteropServices.DllImport("winmm.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> |
次にDLLを使用して、音源ファイルの再生用の関数を準備します。
winmm.dllではPlaySound関数が用意されていて、
これを使うことでwavファイルの再生ができます
1 2 3 |
Public Shared Function PlaySound(ByVal pszSound As String, ByVal hmod As IntPtr, ByVal fdwSound As PlaySoundFlags) As Boolean End Function |
引数の
- pszSoundは音源ファイルのパス
- hmodはインスタンスハンドル
- fdwsoundは再生フラグ
になります。
インスタンスハンドルは、メモリ領域に展開されたプログラムコードの実態を表します。
すなわちメモリ領域のハンドルになります。
例えば、
学生クラスがあり、このクラスでは、名前、学部、学科などが収められています。
このクラスを、”鈴木”、”工学部”、”計数工学科”として、インスタンスを作成します。
コードだと、
1 |
Dim student_1 As ClsStudent = New ClsStudent("鈴木","工学部","計数工学科") |
これでインスタンスが生成されます。
インスタンス化されたstudent_1に学籍番号(例:123456)を割り当てた場合、
この学籍番号がハンドルに相当するものになります。
インスタンスを生成すると、メモリ領域というメモリ内にある部屋に展開され、
展開された部屋に番号が割り当てられるといったイメージ。
ようはメモリ領域が住所で、その住所のある番地にインスタンスが生成される。
この番地がハンドル相当のものになるといった感じですかね。
→ うーん、難しい。
fdwsoundは、一つまたは複数のフラグを組合わせて指定します。
fdwsoundは、以下のコードで準備ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' ビットフィールドとして取り扱う ' 複数の組み合わせができるよう <Flags()> Public Enum PlaySoundFlags SND_SYNC = &H0 '同期再生 SND_ASYNC = &H1 '非同期再生 SND_NODEFAULT = &H2 SND_MEMORY = &H4 'バッファからの再生 SND_LOOP = &H8 'ループ再生 SND_NOSTOP = &H10 '再生中のサウンドを停止しない SND_NOWAIT = &H2000 'ビジー状態なら即座に処理を返す SND_ALIAS = &H10000 SND_ALIAS_ID = &H110000 SND_FILENAME = &H20000 SND_RESOURCE = &H40004 SND_PURGE = &H40 SND_APPLICATION = &H80 End Enum |
PlaySoundFlagsを組み合わせて使うことで、再生や停止ができるようになります。
同期再生や非同期再生については、
- 同期再生はwavファイルの再生が終了するまで他の処理ができません。
- 非同期再生はwavファイルの再生をバックグラウンドで実行するので、
他の処理も継続して行えます。
準備が整ったので実際に再生をするコードを書いていきます。
wavファイルを再生するには、先ほどのPlaySound関数を使います。
1 |
PlaySound(MusicPath, IntPtr.Zero, PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_ASYNC) |
と書くことで、wavファイルを再生できます。
PlaySoundFlags.SND_FILENAME or PlaySoundFlags.SND_ASYNCは
wavファイルを直接ファイルから読みだして非同期再生することを意味しています。
PlaySoundFlags.SND_FILENAMEがファイルを直接読み出すコマンドになります。
PlaySoundFlags.SND_ASYNCは音源の非同期再生を表すコマンドになります。
MusicPathは音源ファイルのパスになります。
これは後で作成する関数にて渡す引数になります。
今回、音源ファイルのパスは以下のように設定しておきます。
1 2 |
Private Const WAVE_PATH_1 As String = "./Wave/cat1.wav" Private Const WAVE_PATH_2 As String = "./Wave/dog1.wav" |
それぞれの相対パスを各変数に定数として宣言しています。
再生する際の呼び出し方がわかったので、
PlaySound関数を新たに作成する関数内で呼び出す関数を作成します。
(冗長ではありますが……。)
1 2 3 4 5 |
'ファイルから再生 非同期再生 ' 音源をバックグラウンドで再生 → ほかの処理の邪魔をしない Private Shared Sub SyncMusic(ByVal MusicPath As String) PlaySound(MusicPath, IntPtr.Zero, PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_ASYNC) End Sub |
SyncMusic関数を”wavファイルを再生する”ボタンが押されたときに呼び出すようにします。
1 2 3 |
Private Sub btnWavStart_Click(sender As Object, e As EventArgs) Handles btnWavStart.Click Call SyncMusic(WAVE_PATH_1) End Sub |
音源ファイルの停止
再生中の音源ファイルを停止するには、以下のコードを書きます。
1 |
PlaySound(IntPtr.Zero, IntPtr.Zero, PlaySoundFlags.SND_PURGE) |
これも同様に、新たに作成した関数で呼び出せるようにします。
1 2 3 4 5 6 |
''' <summary> ''' 音源ファイルの再生を停止 ''' </summary> Private Shared Sub StopWaveSound() PlaySound(IntPtr.Zero, IntPtr.Zero, PlaySoundFlags.SND_PURGE) End Sub |
StopWaveSound()を”Wavファイル停止”ボタンが押されたときに、
呼び出せるようにします。
1 2 3 |
Private Sub btnWavStop_Click(sender As Object, e As EventArgs) Handles btnWavStop.Click Call StopWaveSound() End Sub |
これで音源ファイルの再生と停止が各ボタンが押されることで実行できるようになりました。
音源ファイルをリソースファイルとして埋め込む
続いて、音声ファイルをリソースとして埋め込んでいきます。
方法としては、
プロジェクトのプロパティを開き、リソースを選択します。
文字列のプルダウンからオーディオを選択し、リソースの追加を選択します。
使用する音源を選択し、追加します。
追加すると、音源ファイルのアイコンがリソース画面上に表示されます。
追加がされると、プロジェクト内にもResourcesフォルダが自動作成され、
追加した音源ファイルが作成されたフォルダ内に自動配置されます。
これでリソースとして音源ファイルを埋め込むことができました。
音源ファイルの再生
リソースとして音源ファイルを埋め込んだ場合は、
“音源ファイルを事前にプログラムフォルダに配置する”での方法とは異なります。
流れとしては、
- リソースの読み込み
- 読み込んだリソースの再生
といった流れで行います。
リソースの読み込み
以下のコードで行います。
1 2 |
' 音源リソースを取り込む Dim mediaStream As System.IO.Stream = My.Resources.cat1 |
読み込んだリソースの再生
1 2 |
' 音源を再生する My.Computer.Audio.Play(mediaStream, AudioPlayMode.Background) |
My.Computer.Audio.Play()メソッドを使用して、リソースの音源ファイルを再生します。
引数のmediaStreamはリソースを読み込んだ変数になります。
AudioPlayMode.Backgroundでバックグラウンドでの再生を意味しています。
メインの処理の邪魔をせずバックで処理をして再生する、非同期再生と同じ役割があります。
これでリソースとして埋め込んだ音源ファイルの再生ができるようになりました。
実行編は、音源の再生になるので画面キャプチャではわかりにくいので、
割愛します。
まとめ
VB.Netで音源ファイルであるwavファイルの再生について紹介してきました。
やり方としては、
- 音源ファイルを事前にプログラムフォルダに配置する方法
- 音源ファイルをリソースとして埋め込む方法
の2種類について紹介しました。
時にシステム音ではものたりないそんな時に活用してみてはいかがでしょうか。
音源ファイルの再生に悩んでいる読者の方の参考になれば嬉しいです。
最後までお読みいただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。