2

私はこれを行うことでノイズを増加させようとします:

public void maakgeluid() {
    WaveOut waveOut = new WaveOut();

    SineWaveOscillator osc = new SineWaveOscillator(44100);

    for (short amplitude = 1; amplitude <500; amplitude+=1) {
        Console.WriteLine("amplitude:" + amplitude);
        for (int i = 1; i < 10; i++) {
            Console.WriteLine(i);
            osc.Frequency = 500;
            osc.Amplitude = amplitude;
            try {
                waveOut.Init(osc);
            } catch (Exception ) { Console.WriteLine("error"); }

            waveOut.Play();
        }
    }
}

目的は、耳の専門家に行って聴力検査を受けるときのように、音を生成することです。そのため、非常に静かに開始し、ゆっくりとローダーを取得する必要があります。

しかし、私にはさまざまな問題があります:

  • すぐに音が聞こえる
  • 音が速くなる
  • 音の長さを長くするために i カウンターでループを使用していますが、それは正しい方法ではないと思います。
  • サウンド レベルを上げるためのループがすぐに停止しますが、その理由がわかりません。

どうも

次のコードに基づいています msdn.microsoft.com/en-us/magazine/ee309883.asp

4

2 に答える 2

1

現在のコードは WaveOut デバイスを再作成し続けますが、これは良い考えではありません。サウンドカードを一度開いてから、時間の経過とともに音量が徐々に増加する信号を 1 つフィードします。これを行う 1 つの方法は、SignalGeneratorクラスを使用して正弦波を作成し、それを a に渡してFadeInSampleProvider徐々にフェード インすることです。

 var sg = new SignalGenerator(44100,1);
 sg.Frequency = 500;
 sg.Type = SignalGeneratorType.Sin;
 var fadeIn = new FadeInOutSampleProvider(sg, true);
 fadeIn.BeginFadeIn(20000); // fade in over 20 seconds
 waveOut.Init(fadein);
 waveOut.Play();

spender が正しく指摘しているように、0dB が最大であるため、これはフェードイン時間の間に負の無限大デシベルから 0dB まで変化します。-60dB で開始する場合、または乗算器のランプアップを線形にしない場合は、FadeInOutSampleProvider に似た独自のカスタム ISampleProvider を作成し、代わりにそれを使用する必要があります。

于 2013-11-01T16:23:57.557 に答える