0

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 游戏,但我已经下载并在我的项目中引用了框架。

4

1 回答 1

2

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

假设您的样本是440 Hz A,并且您想要A一个八度降低 ( 220 Hz)。您需要的值为-1. yourPitch / initiPitch = 0.52.0. 你需要把它变成-1to的规模+1。我不能确切地告诉你如何,因为如果比例是对数的,文档并不清楚。您必须进行实验,但这应该可以帮助您入门。

于 2013-01-16T14:21:42.000 回答