我正在尝试使用(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();
}
目前,由于数学上的错误,回放的音调非常关键。该函数的工作方式是,我使用我创建的名为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个 Octave 音阶可以使用,因此,如果有一种解决方案,涉及以给定的频率生成音调并且非常快,那会更好。
谢谢!
编辑:我正在使它成为WinForms应用程序,而不是XNA游戏,但是我在项目中下载并引用了该框架。
最佳答案
您不能应用任意频率。您只能将音调降低一个 Octave (半个频率)或提高一个 Octave (双倍的频率)。因此,要计算音高弯曲值,首先需要知道样本的初始音高。
假设您的样本是440 Hz
A
,并且您希望将A
降低 Octave (220 Hz
)。您需要的值是-1
。 yourPitch / initiPitch = 0.5
到2.0
。您需要将其设置为-1
到+1
的范围。我无法确切告诉您如何进行操作,因为文档尚不清楚比例是否为对数。您将不得不尝试,但这应该可以帮助您入门。
关于c# - 将频率转换为-1..1浮点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14359881/