C# NAudioで個別に音量調整をしたい

タグの編集
投稿者 祈り星  (社会人) 投稿日時 2024/3/16 01:39:59
C#初心者でC#のプログラミング言語しか分かりませんが質問させてください。

OS Windows10
visual studio community 2022
フレームワーク .NET 7.0

NAudioで音を鳴らしていますが音楽と効果音を別々に音量調整をしたいのですがどうすればいいでしょうか?
bgm1.Volume = 0.5f; などで音量調整をしようとしてもPC自体の機能として存在している音量を調整するミキサーを操作しているようで、個別ではなく全体の音量を弄ってしまうため個別音量調整は根本的にこのようなコードではないようで困っています。
現在は以下のように音楽を鳴らしています、どうかよろしくお願いします。



WaveStream bgm1Stream = new Mp3FileReader(new System.IO.MemoryStream(Resources.音楽1));
WaveOut bgm1 = new();

WaveStream se1Stream = new Mp3FileReader(new System.IO.MemoryStream(Resources.効果音1));
WaveOut se1 = new();

public Form1()
{
    bgm1.Init(bgm1Stream);
    se1.Init(se1Stream);
}

private void SoundPlay(int bgm)
{

    if (bgm == -1)
    {
        if (bgm1Stream.Position <= 0 || bgm1Stream.Position >= bgm1Stream.Length - 1000)
        {
            bgm1Stream.Position = 0;
            bgm1.Play();
        }
    }

if (bgm == 1)
{
    if (se1Stream.Position <= 0 || se1Stream.Position >= 120000) 
    { se1.Stop(); se1Stream.CurrentTime = TimeSpan.FromSeconds(0.55); se1.Play();
    }
}

}


投稿者 (削除されました)  () 投稿日時 2024/3/22 05:20:56
(削除されました)
投稿者 KOZ  (社会人) 投稿日時 2024/3/22 06:33:22
AudioFileReader と WaveOutEvent を使い、AudioFileReader の Volume プロパティを使うと個別に調整できるようです。

using NAudio.Wave;

public partial class Form1 : Form
{
    readonly AudioFileReader reader1 = new("test1.mp3");
    readonly AudioFileReader reader2 = new("test2.mp3");
    readonly WaveOutEvent WaveOut1 = new();
    readonly WaveOutEvent WaveOut2 = new();

    public Form1() {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        WaveOut1.Init(reader1);
        WaveOut2.Init(reader2);
    }

    private void button1_Click(object sender, EventArgs e) {
        PlayControl(WaveOut1, reader1, trackBar1);
    }

    private void button2_Click(object sender, EventArgs e) {
        PlayControl(WaveOut2, reader2, trackBar2);
    }

    private void trackBar1_Scroll(object sender, EventArgs e) {
        SetVolume(reader1, trackBar1);
    }

    private void trackBar2_Scroll(object sender, EventArgs e) {
        SetVolume(reader2, trackBar2);
    }

    private static void PlayControl(WaveOutEvent waveOut, AudioFileReader reader, TrackBar trackBar) {
        if (waveOut.PlaybackState == PlaybackState.Playing) {
            waveOut.Stop();
        } else {
            SetVolume(reader, trackBar);
            reader.Position = 0;
            waveOut.Play();
        }
    }

    private static void SetVolume(AudioFileReader reader, TrackBar trackBar) {
        reader.Volume = (float)trackBar.Value / trackBar.Maximum;
    }

}
投稿者 祈り星  (社会人) 投稿日時 2024/3/23 07:57:08
回答ありがとうございます。
試したところ、無事に問題なく目的の個別音量調整が出来ました。
ありがとうございます、凄く助かりました。