我正在Android上创建一个调谐器,我从设备的麦克风那里获得音频,然后让它获得频率。然而,一旦我在一个音符上改变频率,我想知道是否有一种方法可以做到这一点,而不必使用一堆" IF""是否有计算以更有效的方式做到这一点?
答案 0 :(得分:1)
是的,这可以做到。首先,你必须知道工作的关键。假设普通的C大调你开始时音符 a1 是440Hz。每个八度音程都会使频率加倍,每个八度音程都会减半,所以你有一个很好的对数音阶,基数为2。
在对数标度内,乘法变成了加法。因此,如果您将 _ 的音符的间隔与 a 相对应,则所有八度音程的频率之间的比率保持不变。所以你要找出你所处的八度音阶,减去或加上那个数字,残差就是频率间隔的对数。查找八度音阶也很简单,只需评估 floor(log2(f / 440Hz))。
答案 1 :(得分:1)
音阶是对数的(基数为2):八度音高的增加使基频增加一倍,八度音减少一半。
在西欧音乐传统中,假设equal temperament,我们将八度音阶划分为半音。半音的频率形成一个几何序列,其比率为~1.06
(更确切地说,它是2的第12个根或pow(2, 1/12)
。每个半音可以进一步分为美分,每个八度音程精确地产生1200
。
目前的音乐练习是针对A4(中间C以上的A)精确440Hz
如果你不能从第一原则算出数学,那就记录在案here。