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();
}
目前,回放的音调非常偏离关键,因为数学是错误的。这个函数的工作方式是我向该函数发送一个 MIDI 音符(0 到 127),使用我制作的一个名为getMIDIFreq的函数将该音符转换为频率 - 这很好。
要调用这个函数,我使用这个:
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 个八度音阶可以使用,所以如果有一种解决方案涉及在给定频率产生音调并且速度非常快,那就更好了。
谢谢!
编辑:我正在制作这个 WinForms 应用程序,而不是 XNA 游戏,但我已经下载并在我的项目中引用了框架。