C#でNAudioを使って .wav ファイルを再生した後、フェードアウトでBGMを終了したくなりました。実現方法をメモしておきます。
ネットで調べると、ISampleProvider を継承したクラスを実装して、予め指定した特定時間からフェードアウトするようにするサンプルが見つかりました。
https://gist.github.com/markheath/8fb396a5fe4bf117f361
しかし、これは私のやりたい事ではありません。再生中の任意のタイミングでフェードアウトを実行する、というのが私のやりたい事です。
結論としては、WaveOutEvent に Volume プロパティがあったので、そのプロパティの値を徐々に下げていくだけの簡単な実装で実現できました。
サンプルコードを貼っておきます。
var reader = new AudioFileReader("./test.wav");
WaveOutEvent output = new WaveOutEvent();
reader.Volume = 1.0f;
output.Init(reader);
// 再生開始
output.Play();
// 1秒再生
Thread.Sleep(1000);
// 3秒かけてフェードアウト
int fadeOutMilliseconds = 3000;
int fadeOutSamples = 10;
int sleepMilliseconds = fadeOutMilliseconds / fadeOutSamples;
float volumeDecrement = output.Volume / fadeOutSamples;
for (int i = 0; i < fadeOutSamples; ++i)
{
Thread.Sleep(sleepMilliseconds);
float nextVolume = output.Volume - volumeDecrement;
output.Volume = nextVolume < 0.0f ? 0.0f : nextVolume;
}
output.Stop();
コメント(5 件)
5(ID: 2345050674) 2023-12-01 16:35 別クラスでという意味でしょうか? |
4(管理人) 2023-11-29 08:12 あぁ、なるほど。すみません、書いてなかったんですが、私の手元では、この処理を Task.Run() で独立した別スレッドで非同期実行していました。 |
3(ID: 612059286) 2023-11-28 20:02 ご返信ありがとうございます! |
2(管理人) 2023-11-26 23:28 参考になるかはわかりませんが、以下の記事にループ再生するwavをフェードイン、フェードアウトさせる簡易サンプルを掲載しておきました。 |
1(ID: 612059286) 2023-11-26 19:10 始めまして。とても参考になる記事ありがとうございます。 |