如何将衰减包络与 nAudio 信号发生器一起使用?

How can I use a decay envelope with nAudio signal generator?

我正在学习 C# 和 NAudio。在我的项目中,我需要使用衰减包络来播放一系列短音。看起来 ADSR Envelope 示例提供程序会执行此操作,但我似乎无法使其与信号发生器一起使用。当我设置释放时间时,我只会听到一个恒定的音调。 谁能告诉我我做错了什么? 这是一个非常简单的控制台应用程序,我试图用它来测试它:

    class Program
    {
        public SignalGenerator wg;
        public IWavePlayer driverOut;
        static void Main(string[] args)
        {
            // Init Audio
            var driverOut = new WaveOutEvent();
            var wg = new SignalGenerator();
            var adsr = new AdsrSampleProvider(wg.ToMono());
            wg.Type = SignalGeneratorType.Sin;
            adsr.AttackSeconds = 0;
            adsr.ReleaseSeconds = (float)1;
            wg.Take(TimeSpan.FromMilliseconds(500));
            driverOut.Init(wg);
            wg.Frequency = 500  ;
            wg.Gain = 0.1;  
            
            driverOut.Play();
            Thread.Sleep(3000);
        }
    }

因此您可以通过调用 adsr.Stop() 来触发 Release 阶段。这是有道理的,因为键盘上的释放阶段发生在您释放按键之后,但它不是特别直观。

class Program
{
    static void Main(string[] args)
    {
        var wg = new SignalGenerator
        {
            Type = SignalGeneratorType.Sin,
            Frequency = 500,
            Gain = 0.1
        };

        var adsr = new AdsrSampleProvider(wg.ToMono())
        {
            AttackSeconds = 0.3f,
            ReleaseSeconds = 0.3f
        };
            
        using (var driverOut = new WaveOutEvent())
        {
            driverOut.Init(adsr);
            driverOut.Play();

            Thread.Sleep(500);

            adsr.Stop();

            while (driverOut.PlaybackState == PlaybackState.Playing) { }
        }
    }
}