我正在尝试使用(C#)XNA音频框架的SoundEffect
类以给定音高播放声音。到目前为止,我有这个(非常基本的)
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游戏,但我在项目中下载并引用了框架。答案 0 :(得分:2)
您无法应用任意频率。您只能将音高降低一个八度音程(半频率)或将音高提高八度(双倍频率)。因此,要计算弯音值,首先需要知道样本的初始音高。
假设您的样本为440 Hz
A
,并且您想要A
八度音阶(220 Hz
)。您需要的值是-1
。 yourPitch / initiPitch = 0.5
到2.0
。您需要将其调整为-1
到+1
的范围。我无法确切地告诉您如何,因为如果比例是对数的,则文档不清楚。你必须进行实验,但这应该让你开始。