如何将衰减包络与 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) { }
}
}
}
我正在学习 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) { }
}
}
}