反数

时间:2011-10-21 21:24:51

标签: c arduino

随着我们上升音阶,音符频率增加;

    #define A4 440 // These are the frequencies of the notes in herts
    #define AS4 466
    #define B4 494
    #define C5 523
    #define CS5 554
    #define D5 587

我正在机械地产生音调,我告诉步进电机步进,延迟,步进,延迟等等。

步骤之间的延迟越长,音符越低。是否有一些智能数学我可以使用它来反转频率,以便我爬上比例数字越来越低?

通过这种方式,我可以使用频率来帮助计算生成音符的正确延迟。

2 个答案:

答案 0 :(得分:4)

那么你所说的是你想要数字代表步骤之间的时间而不是频率?

440 Hz意味着440周/秒。你想要的是秒数/周期数(即步数之间的时间)。这只是1 / <frequency>。这意味着您所要做的就是将您的值定义为1/4401/466等(或者,如果您希望值为毫秒,1000/4401000/466等。)

如果太快(或与实际音符不匹配),您可以将每个值乘以比例因子,并且可听音调之间的关系应保持不变。

例如,假设您凭经验发现机器发出“A4”音,步骤之间的延迟为10毫秒。要找出比例因子,求解x:

x / 440 = 10
x = 4400

因此,请定义scale = 4400,并将每个笔记定义为scale / 440scale / 466等。

答案 1 :(得分:2)

是的,这听起来有可能!我们来看看......(其中一些你会知道,但无论如何我都会发布)

在所谓的equal tempered scale中,您可以通过乘以每个半音的第二十二根来计算赫兹值。整个八度音程中有12个半音,乘以12倍的频率会使频率增加一倍,从而将音调提高一个八度。

所以,如果你想计算下降的半音频率,例如A 440,您可以计算double x = pow(2.0, 1.0/12.0)(假设为C),然后重复除以该值(请记住将double除以int s :))并且然后你会得到你的降序。

除此之外:如果你想做一个大音阶而不是半音(半音)音阶,这是使用音调和半音的模式:(例如在C大调中 - 使用T代表音调,S代表半音)

C [T] D [T] E [S] F [T] G [T] A [T] B [S] C