我正在尝试仅使用6个音频剪辑来重新创建吉他的完整音域。
我曾考虑过设置音频剪辑的频率,但是audio.frequency仅基于压缩格式返回音频频率而非实际音调。
我知道可以使用GetSpectrumData来读取,但这个解决方案相当复杂,需要进行傅里叶变换分析或类似的东西。
影响音高很容易改变音调以便进行升降,但是否有办法找出要使用的步骤?
我曾考虑过设置音频剪辑的频率,但是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,如果要得到下一个音键F4(或接近它),有没有影响音高的方程式呢?
还需要考虑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 ();
}
}