http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.htmlから直接SineWaveProvider32コードでnaudioを使用して の正弦波トーンを生成しています。 SineWaveProvider32クラスに関連するコード:naudio SineWaveProvider32は、振幅を変更するときにクリックを与えます
public override int Read(float[] buffer, int offset, int sampleCount)
{
int sampleRate = WaveFormat.SampleRate;
for (int n = 0; n < sampleCount; n++)
{
buffer[n + offset] =
(float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency)/sampleRate));
sample++;
if (sample >= sampleRate) sample = 0;
}
return sampleCount;
}
私はクリック/毎秒打つなっていたので、私はこれは毎秒(そのクリックを固定
if (sample >= (int)(sampleRate/Frequency)) sample = 0;
に
if (sample >= sampleRate) sample = 0;
を変更その「サンプル」は常にサンプル・レートではなくゼロクロスに関連していました)。
しかし、Amplitude変数を設定するたびに、クリックが発生します。私は、バッファ[]がゼロクロスしているときにのみ設定しようとしましたが、振幅の急激な増加が問題の原因になると考えているのは です。それは問題を解決しませんでした。私は は、いずれかの効果がなかったことをNAudio change volume in runtimeで提案されているように、私はバッファの遅延と数をadusting試してみました 0.25と0.0
間の値に振幅を設定するが、しています。
振幅を変化マイコード:
public async void play(int durationMS, float amplitude = .25f)
{
PitchPlayer pPlayer = new PitchPlayer(this.frequency, amplitude);
pPlayer.play();
await Task.Delay(durationMS/2);
pPlayer.provider.Amplitude = .15f;
await Task.Delay(durationMS /2);
pPlayer.stop();
}