我想重新创建只有6个音频剪辑的吉他的全部范围。音频剪辑的频率和音调关系 - Unity3D
我在想会有一种方法来设置音频剪辑的频率,但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();
}
}
我可以听到它听起来不对。
知道音高为1的E4 329.63Hz的初始音调是否有任何影响音调的方程式,我会得到下一个键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();
}
}
是的我想到了第二种方案,但被扫描是否会有一个更编程方法来避免你提到的缺点。现在你把它带出去了,事实上声音比较短的时候可能会想要上场。想想吉他,当你上指板时,弦线更短,并且谐振时间更短。由于这是一个个人研究项目,我想我会选择一个不完全完美的解决方案。不管怎么说,还是要谢谢你。 – Everts
@Everts如果你不在乎它有多完美,你可以试试刚刚编辑的代码。它不是来自我,而是我把它从哪里来的链接。我认为这是你可能正在寻找的等式。 – Programmer
好的编辑实际上已经足够接近了。我正在和一些在线钢琴进行比较,它很好。为此非常感谢。 – Everts