C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

XAudio2を用いて曲を再生する方法

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■97064 / inTopicNo.1)  XAudio2を用いて曲を再生する方法
  
□投稿者/ プログラマー (1回)-(2021/03/22(Mon) 15:32:24)

分類:[.NET 全般] 

いつもお世話になっております。

XAudio2を利用して音楽ファイルを再生する方法を教えていただけませんか。

VisualStudioのVB.NETプロジェクトにフォームアプリケーションを作成し、
NuGetパッケージからSharpDX.XAudio2をインストールするところまでは出来ましたが、
その後、VB.NETのソースコードをどのように記述すれば良いのでしょうか。

拡張子はMP3, MID, WAVのファイルを対象としております。
よろしくお願いいたします。
引用返信 編集キー/
■97065 / inTopicNo.2)  Re[1]: XAudio2を用いて曲を再生する方法
□投稿者/ 魔界の仮面弁士 (3021回)-(2021/03/22(Mon) 17:08:02)
No97064 (プログラマー さん) に返信
> 拡張子はMP3, MID, WAVのファイルを対象としております。

XAudio2 は MIDI に対応していません。
MCI を試してみてください。
https://dobon.net/vb/dotnet/programing/playmidifile.html


WAV の再生は可能ですが、それ以外で直接扱える圧縮形式は、
ADPCM / WMA じゃなかったかな…。

MP3 については、SharpDX.MediaFoundation を使うことで
XAudio2 にできそうな情報がありましたが、詳しくは見てないです。
http://sygh.hatenadiary.jp/entry/2015/09/23/174346
https://docs.microsoft.com/ja-jp/windows/win32/medfound/supported-media-formats-in-media-foundation


> XAudio2を利用して音楽ファイルを再生する方法を教えていただけませんか。

とりあえず WAV 版を書いておきます。
ただ、WAV なら My.Computer.Audio.Play という手もあるんですよね。

Public Class Form1
    Private WithEvents xa As SharpDX.XAudio2.XAudio2
    Private WithEvents mstVoice As SharpDX.XAudio2.MasteringVoice
    Private WithEvents srcVoice As SharpDX.XAudio2.SourceVoice = Nothing
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        xa = New SharpDX.XAudio2.XAudio2()
        mstVoice = New SharpDX.XAudio2.MasteringVoice(xa)
    End Sub
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        mstVoice.Dispose()
        srcVoice.Dispose()
        xa.Dispose()
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim bin As Byte() = System.IO.File.ReadAllBytes("C:\Windows\Media\Ring05.wav")
        Dim ss As New SharpDX.Multimedia.SoundStream(New System.IO.MemoryStream(bin))
        Dim buffer As New SharpDX.XAudio2.AudioBuffer(ss)
        srcVoice = New SharpDX.XAudio2.SourceVoice(xa, ss.Format, True)
        srcVoice.SubmitSourceBuffer(buffer, ss.DecodedPacketsInfo())
        srcVoice.Start()
    End Sub
End Class

引用返信 編集キー/
■97066 / inTopicNo.3)  Re[2]: XAudio2を用いて曲を再生する方法
□投稿者/ プログラマー (2回)-(2021/03/22(Mon) 22:09:24)
魔界の仮面弁士さん、返信して下さりありがとうございます。
おかげ様でXAudio2でWAVファイルを再生することが出来ました。

> XAudio2 は MIDI に対応していません。
> MCI を試してみてください。

提示いただいたURLを基にMCI を用いた音楽再生処理を記述しましたが、MIDファイルのオープン処理がかなり遅いです。
具体的には約80KBのファイル一つを開くだけでも2秒くらい掛かってしまいます。
そのためDirectXを使えばファイルオープン処理時間を短縮できるのではと思ったのですが…DirectXでMIDファイルを再生することは出来るのでしょうか?
そもそもDirectX、あるいはそれ以外の手段で上記処理の高速化は可能なのでしょうか?

お手数をおかけしますが、引き続きご教授いただきたく思います。
引用返信 編集キー/
■97108 / inTopicNo.4)  Re[3]: XAudio2を用いて曲を再生する方法
□投稿者/ 魔界の仮面弁士 (3031回)-(2021/03/29(Mon) 01:37:21)
No97066 (プログラマー さん) に返信
> 提示いただいたURLを基にMCI を用いた音楽再生処理を記述しましたが、MIDファイルのオープン処理がかなり遅いです。
使用されているシーケンサはおそらく、ハードウェア MIDI 音源ではなく、
ソフトウェア音源の Microsoft GS Wavetable SW Synth ですよね。
https://ja.wikipedia.org/wiki/Microsoft_GS_Wavetable_SW_Synth

MIDI は演奏データであるため、再生する MIDI 音源への依存度も高いので、
あらかじめ WAVE 等の波形データに変換しておくというのも一つの方法です。


> 具体的には約80KBのファイル一つを開くだけでも2秒くらい掛かってしまいます。
少なくとも MCI を使う以上は、オープン時間の短縮は望めないかと思います。


> DirectXでMIDファイルを再生することは出来るのでしょうか?
低レベル API である midiOutXxx 関数群を使う方法と、
高レベル API である DirectMusic を使う方法があります。(あとは DirectShow かな)
http://eternalwindows.jp/winmm/midi/midi00.html
http://yamatyuu.net/computer/program/vc2013/midi/index.html
http://maruyama.breadfish.jp/tech/smf/
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/audio/midi-and-directmusic-components
http://chokuto.ifdef.jp/urawaza/com/dmusic.html
引用返信 編集キー/
■97141 / inTopicNo.5)  Re[4]: XAudio2を用いて曲を再生する方法
□投稿者/ プログラマー (4回)-(2021/04/05(Mon) 18:24:47)

> 少なくとも MCI を使う以上は、オープン時間の短縮は望めないかと思います。
そうでしたか…MIDをWAVに変換するのが一番簡単そうですね。


魔界の仮面弁士さん、いろいろ教えてくださって参考になりました。この質問は解決とさせてもらいます。
ご回答くださり有難うございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ