2016-09-02 2 views
1

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(); 
    } 

答えて

0

クリックが、波形の不連続によって引き起こされます。理想的にはボリュームをある値から別の値に徐々に増加させるため、このようなクラスではこれを修正するのは難しいです。これは、目標振幅を持つようにコードを修正することによって実行できます。そして、現在の振幅が目標振幅と等しくなければ、ループのたびに計算される小さなデルタ量でその振幅に向かって移動します。したがって、10msの期間にわたって、古い振幅から新しい振幅に移行します。しかし、残念なことに、これを自分で書く必要があります。

周波数が振幅ではなく徐々に変化している同様の概念については、portamento in NAudioのブログ記事をご覧ください。

関連する問題