AudioClip的频率和音高关系 - Unity3D

时间:2016-04-22 12:16:14

标签: c# audio unity3d frequency audioclip

我正在尝试使用6个音频剪辑重新创建全系列的吉他。

我在想有一种设置音频剪辑频率的方法,但audio.frequency只根据压缩格式而不是实际音调返回音频的频率。

我知道我可以读取GetSpectrumData,但是这个解决方案相当复杂,需要进行一些傅里叶变换分析或类似的东西。

影响音高,很容易改变音调,所以我可以上下移动但是有办法找出使用的步骤。

void Update () 
{
    CheckAudio(KeyCode.Q, 1.0f);
    CheckAudio(KeyCode.W, 1.1f);
    CheckAudio(KeyCode.E, 1.2f);
    CheckAudio(KeyCode.R, 1.3f);
    CheckAudio(KeyCode.T, 1.4f);
}

void CheckAudio(KeyCode key, float pitch)
{
    if (Input.GetKeyDown (key)) 
    {
        audio.pitch = pitch;
        audio.Play ();
    }
}

我听说听起来不对。

知道初始音调E4 329.63Hz,音高为1是否有任何影响音高的等式,我会得到下一个键F4 349.23Hz(或足够接近)?

还必须考虑Unity AudioSource将音高限制在-3/3范围内(我认为这超出了需要)。

编辑:添加一些个人研究。似乎音高1是初始音符,设置为2给出相同的音高一个八度。

由于半音阶(钢琴上的所有黑白音符)都是12个键,我假设每步使用1/12应该这样做。

听起来很接近,但我觉得它不太对劲。这是新代码:

[SerializeField] private AudioSource audio;
float step = 1f/12f;
KeyCode[]keys = new KeyCode[]{
    KeyCode.Q, KeyCode.W,KeyCode.E,KeyCode.R,KeyCode.T,
    KeyCode.Y, KeyCode.U, KeyCode.I, KeyCode.O, KeyCode.P,
    KeyCode.A, KeyCode.S, KeyCode.D
};

void Update () 
{
    float f = 0.0f;
    foreach (KeyCode key in keys) 
    {
        CheckAudio(key, f);
        f += 1f;
    }
}

void CheckAudio(KeyCode key, float pitch)
{
    if (Input.GetKeyDown (key)) 
    {
        audio.pitch = 1f + pitch * step;
        audio.Play ();
    }
}

1 个答案:

答案 0 :(得分:6)

只要更改音频的音高,您想要做的就是。通过改变音高,你会遇到其他问题,例如声音结束太快或者花费更多时间完成,声音也不会很好。

第一个解决方案是在 C ++ 中创建一个插件( Synthesizer ),该插件从Unity读取音频文件并更改频率。它还应该执行其他操作来修复速度问题。除非你是具有一些很好的数学技能的音频工程师,否则这非常复杂。在移动设备上尝试这个是完全不同的故事。 OnAudioFilterRead是您决定使用此方法时应使用的函数。

第二推荐解决方案是为每个吉他键制作一个音频文件,然后将它们放入{{1}的数组中}。这解决了每个其他问题。下方是您将更多文件

编辑:

如果你不关心它是否完美,你可以在internet上使用下面这个好人的东西。

audioClip

编辑:对于那些对Mathf.Pow等式使用和工作原因感兴趣的人,请阅读以下内容:https://en.wikipedia.org/wiki/Twelfth_root_of_two