SoundEffect
(C#) XNA オーディオ フレームワークのクラスを使用して、特定のピッチでサウンドを再生しようとしています。これまでのところ、私はこれを持っています(非常に基本的です)
public void playSynth(SoundEffect se, int midiNote) {
float pitch = (float)functions.getMIDIFreq(midiNote) / ((float)functions.getMIDIFreq(127)/2);
pitch-=1F;
Debug.WriteLine("Note: {0}. Float: {1}",midiNote,pitch);
synth = se.CreateInstance();
synth.IsLooped = false;
synth.Pitch = pitch;
synth.Play();
}
現在、計算が間違っているため、再生されるピッチは非常にオフキーです。この関数が機能する方法は、私が作成したgetMIDIFreqという関数を使用して MIDI ノート (0 ~ 127) を関数に送信し、そのノートを周波数に変換することです。これは正常に機能します。
この関数を呼び出すために、私はこれを使用しています:
SoundEffect sound = SoundEffect.FromStream(TitleContainer.OpenStream(@"synth.wav"));
playSynth(sound,(int)midiNote); //where midiNote is 0...127 number
はsynth.wav
、DAW で作成してエクスポートした単純な C ノートです。このプログラムの要点は、そのシンセ音で指定された MIDI ノートを再生することですが、私は喜んで正弦波またはその他のもので解決します。Console.Beep
非常に遅く、音符のある曲全体を立て続けに再生するのには適していないため、使用できません。
私の質問は、サンプルを正しいピッチで再生するように、このコードを修正するにはどうすればよいですか? ここで作業するのは 2 オクターブしかないので、特定の周波数でトーンを生成することを含む非常に高速なソリューションがあれば、それはさらに優れています。
ありがとう!
編集:これを XNA ゲームではなく WinForms アプリケーションにしていますが、プロジェクトでフレームワークをダウンロードして参照しています。