我正在尝试仅使用 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 ();
}
}