C# NAudioでフェードアウトさせる

2021/08/02

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();


  このエントリーをはてなブックマークに追加  

<<「ソフトウェア開発」の記事一覧に戻る

関連記事