将频率转换为-1..1浮点数

时间:2013-01-16 13:46:17

标签: c# audio xna signal-processing

我正在尝试使用(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游戏,但我在项目中下载并引用了框架。

1 个答案:

答案 0 :(得分:2)

您无法应用任意频率。您只能将音高降低一个八度音程(半频率)或将音高提高八度(双倍频率)。因此,要计算弯音值,首先需要知道样本的初始音高。

假设您的样本为440 Hz A,并且您想要A八度音阶(220 Hz)。您需要的值是-1yourPitch / initiPitch = 0.52.0。您需要将其调整为-1+1的范围。我无法确切地告诉您如何,因为如果比例是对数的,则文档不清楚。你必须进行实验,但这应该让你开始。