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



我正在学习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) { }
}
}
}

最新更新