c# - 将频率转换为-1..1浮点

标签 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();
}

目前,由于数学上的错误,回放的音调非常关键。该函数的工作方式是,我使用我创建的名为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)。您需要的值是-1yourPitch / initiPitch = 0.52.0。您需要将其设置为-1+1的范围。我无法确切告诉您如何进行操作,因为文档尚不清楚比例是否为对数。您将不得不尝试,但这应该可以帮助您入门。

关于c# - 将频率转换为-1..1浮点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14359881/

相关文章:

c# - 如何将检测到的边缘合并到 Emgu CV 中的颜色捕获

c# - 单击复选框标签后禁用选中/取消选中复选框

loops - 如何在 Asterisk 的调用文件中循环播放单个播放声音文件?

silverlight - 在WP7中提取声谱数据

c# - 线程同步 XNA 网络

c# - 发布和调试之间的区别?

java - 无法从Java中的JComboBox播放声音

audio - 使用 mlt 混合两个音轨

3d - 在 XNA 中使用 CreateOrthographicOffCenter

c# - ASP.NET MVC - 自动注销