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

Posted

技术标签:

【中文标题】将频率转换为 -1..1 浮点数【英文标题】:Converting a frequency into a -1..1 float 【发布时间】:2013-01-16 13:46:16 【问题描述】:

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

【问题讨论】:

我认为你最好使用笔记本身,然后使用this page上的数字计算比率。 我已经有了 MIDI 音符的 Hz 频率,但如果其他解决方案更好,我不必使用它。该页面上的值远远高于我可以使用的 -1...1 浮动区域,并且简单地划分数字是行不通的。 【参考方案1】:

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

假设您的样本是440 HzA,并且您希望A 降低一个八度音程(220 Hz)。您需要的值为-1yourPitch / initiPitch = 0.52.0。您需要将其设置为-1+1 的范围。我不能确切地告诉你如何,因为文档不清楚比例是否是对数的。您必须进行实验,但这应该可以帮助您入门。

【讨论】:

以上是关于将频率转换为 -1..1 浮点数的主要内容,如果未能解决你的问题,请参考以下文章

将一个 32 位浮点数转换为两个 16 位 uint 数,然后再次转换回该 32 位浮点数

在 Swift 中将半精度浮点数(字节)转换为浮点数

怎么将4字节16进制转化成浮点数

如何把浮点数转换成字符串?

FORTRAN里怎样把数值类型(整数,浮点数)转换为字符串

将字节转换为浮点数?