2012-03-06 10 views
0

ミニシンセプログラムを作成しようとしています。本質的に、200mSごとにタイマーが起動されます。これが起動されると、200mS相当のPCMサンプル(例えば、のこぎり波、正弦波など)、サンプルレートおよびスキャン期間に関連するサンプル数がループによって生成される。例えば200mSごとに、4000個のサンプルが再生のためにウェーブアレイに用意されています。私の質問は、どのように私はこの配列を再生するのですか?PlaySoundメソッドは何をしますか? 200mSごとにPlaySoundを呼び出すと、後続のサンプルが連続して再生されます。私はDirectSoundとNAudioを利用して遊んでいません。C#で合成音をリアルタイムに再生する

const int SAMPLE_RATE = 20000; 
    const double SCAN_PERIOD = .2; // S 
    Timer _ScanTimer = new Timer(); 


    double[] wave = new double[(int)((double)SAMPLE_RATE * SCAN_PERIOD)]; 



_ScanTimer.Tick += new EventHandler(_ScanTimer_Tick); 




    private void _ScanTimer_Tick(object sender, EventArgs e) { 
     int numSamplesPerTick = (int)((double)SAMPLE_RATE * SCAN_PERIOD); 
     double secondsPerTick = (double)2/SAMPLE_RATE; 

     for (int i = 0; i < numSamplesPerTick; i++) { 
      wave[i] = GetSynthOutput(); 
      _CurrentTime += secondsPerTick; 
      if (_CurrentTime > double.MaxValue - 1) 
       _CurrentTime = 0; 

     } 



     PlaySound(wave); 
    } 

私はタイマーは正確にすべての200ミリ秒を発射し、4000個のサンプルは実際の時間のために、わずか数が少なすぎるか、あまりにも多くのサンプルが含まれていてもよいということではないことを実感します。私はこれについて心配していません。それは、その後のタイマーの起動の間の実際の時間に応じてサンプルの数を調整することができるからです。

+0

System.Media.SoundPlayerを試しましたか?あなたのサンプルは流れの中にありますか?正確なサウンドフォーマットは何ですか? – weismat

+0

現在、彼らは2倍の配列で、1サンプルあたり1要素ですが、問題なくmemorrystreamに入れることができます。その間にSoundPlayerを見てください。乾杯。 – user1240122

答えて

1

ほとんどのオーディオ合成プログラムは、タイマーでサウンドを作成する代わりに、2つのバッファで動作します.1つは、もう一方のサウンドが再生されている間に1つは満たされています。 NAudioでは、ISampleProviderまたはIWaveProvider派生クラスにRead関数を実装することで、これを行うことができます。サウンドカードがより多くのオーディオを再生したいときは常に、このメソッドが呼び出されます。必要に応じて、バッファサイズを200msに設定することができます。

関連する問題