曾几何时,我们是荒野中的生物,我们进化了听到声音的能力。现在这里有一个有趣的东西,如果你听到频率f和频率2f,3f等的其他声音,那么它是由于谐振的物理原则,这些声音来自同一对象的机会很好。 。所以我们对声音的感知进化了反映这一点;我们认为任何谐波频率f,2f,3f等,以某种方式相关。对于2F / F对来说,效果最强,但它对于3F / 2F对非常强大。谈论进化,在某些时候,我们发现制作体面的音乐增加了交配的几率。因此,它来通过音乐符号通过在音乐术语中的2/1比率中的频率赋予频率的所有笔记来明确地认识到2F / f的关系。八个optive - 彼此相同的名称。
对所有这一切的另一种含义是存在函数粗糙度(声音),其近似于我们将一组声音视为属于(平滑或辅音)与发出不同(不和谐或粗略)的声音。一个名为EndoLith的GitHub用户已经在Python中实现了这一点,作为占用两个列表的函数:粗糙度(频率,放大器)。它'因为我的第一段意味着,因为,嗯,我,我不是一个生物学家,但我聚集人类大脑是以某种方式思考的脂肪?我们的耳朵的精确度有限,我们利用节拍的现象来帮助我们检测频率差异。但是,我将此作为我们剩下的冒险的生物学依据,最后我们将推断出钢琴键盘的样子。
正确的。通过计算523-1046Hz的每个其他频率的粗糙度,通过计算粗糙度的粗糙度来测试粗糙度,从而开始'
来自__future__从Numpy Import exp,AsArray,ArgSort,Sort,Sum,Minume Import Numpy的Import Dirm,作为PLT Fmin = 261.63 * 2#C以上C fmax = fmin * 2 freqs = np。 Geomspace(Fmin,Fmax,200)粗糙度= AsArray([FREQS的F的粗糙度([Fmin,F],[1,1])])PLT。绘图(频率,粗糙度)PLT。 Xlabel("频率")plt。 ylabel("粗糙度为%d hz"%fmin)plt。表演 ()
但它比这更复杂。由钢琴播放的注释已经包含了谐波系列中的多个频率,因此当您一起播放两个时,您需要考虑每个音符中的所有频率的粗糙度彼此冲突。
def make_harmonic_series(f,n_harmonics,harmonic_decay):"""将谐波系列作为两个阵列返回,分别给出频率和幅度。""返回float(f)* np。 Arange(1,N_Harmonics + 1),Harmonic_decay ** NP。 Arange(0,n_harmonics)def粗糙度_two_series(f1,f2,n_harmonics = 10,harmonic_decay = 0.99):""两个谐波系列的粗糙度与基本面F1,F2默认为10次谐波,衰减为0.99 - 我不知道这与真正的钢琴&#34有多匹配;"" freq1,amp1 = make_harmonic_series(f1,n_harmonics,harmonic_decay)freq2,amp2 = make_harmonic_series(f2,n_harmonics,harmonic_decay)断言(AMP1 == AMP2)。所有()f = np。附加(freq1,freq2)a = np。附加(AMP1,AMP2)返回粗糙度(F,A)粗糙度= AsArray(频率f的f for f的[粗糙度_two_series(fmin,f)])plt。绘图(频率,粗糙度)PLT。 Xlabel("频率")plt。 ylabel("粗糙度为%d hz"%fmin)plt。 show()print"间隔f-2f的所有频率的平均粗糙度:" ,NP。平均值(粗糙度)
注意在1046Hz的粗糙度下的大槽(对应于2F / 1F关系,或引入中讨论的2/1比)和784Hz(对应于3/2比率)。
粗糙度和平滑度都非常好,但如果你想写一些音乐,那么传统的方法就是选择所有可能频率的子集,以便为您的笔记使用,并将其用作调谐的构建块。实际上,大多数音乐家们甚至这样做,他们甚至这样做了,他们只是与其他人挑选的笔记。这可能是尚非原创的,也许,但方便在一起。
请记住2F / F的关系是最强的吗?让'使用这个事实来简化采摘笔记的任务,如下所示:
添加到我们的一组音符,所有与它们相关的注释由2倍,即2n_1,2n_2,2n_3 ... $和$ 4n_1,4n_2,4n_3,... $和$ \ frac {1} {2 n_1,\ frac {1} {2} n_2,\ frac {1} {2} n_3,... $和$ \ frac {1} {4} n_1,\ frac {1} {4} n_2,\ FRAC {1} {4} N_3,... $等,唯一限制因素是人类感知球场的能力范围。
这是不吃的,说我们' ll选择钢琴键盘短部分的笔记,然后将其全部上下复制并粘贴人类听证的范围。但是我们如何选择最初的笔记?我希望你' ll同意这些是指导我们的一些明智的标准:
当我们希望发挥给定频率的声音时,音符应该均匀跨越F到2F的范围,并且通常是靠近它的合适的音符。 ("均匀"意味着均匀地在对数刻度上,这里,以匹配人类俯仰感知)。
回想一下,由2/1比率声音平滑相关的音符,并通过3/2比声音相关的音符几乎如此平滑。我们所做的一件事是利用一个有用的巧合:
打印" 3/2到电力为12 =" ,(3/2)** 12打印" 2/1到7 =&#34的力量; ,(2/1)** 7打印"这些都在彼此的%.1f %%中!" %((3/2)** 12 /(2/1)** 7 * 100 - 100)
3/2到电力为12 = 129.7463378912 / 1到7 = 128.0的力量彼此的1.4%内。
Pythagorean调谐是一种算法,它使用上面的巧合来导出一组音符,它在一起听起来很好。它通过确保所选择的任何一对音符之间的比率为大约$(\ FRAC {1} {2})^ x(\ frac {3} {2})^ y $,因此相当流畅:
#从单个音符开始pythag_freqs = [fmin],而len(pythag_freqs)< 12:#12是从上面的巧合中出现的魔法号码#继续乘以3/2的最新说明来生成新的音符next_freq = pythag_freqs [ - 1] * 3/2#如果新的音符高于原始的两倍如果next_freq&gt,则频率(2f)划分为两个; Pythag_freqs [0] * 2:next_freq / = 2 pythag_freqs + = [next_freq] pythag_freqs。 sort()#we' ll稍后要求他们
所以从F1到F2的一组音符应该听起来相对平滑,富裕我们上面的标准。
挂断,为什么他们跨越整个范围,而不是被捆绑到一边或其他号码?它再次归结为巧合$ \ frac {3} {2} ^ {12} \约2 ^ 7 $。我们通过$ \ FRAC {3} {2} $以及当我们完成12次,我们最终获得的频率高于原来的频率大约2 ^ 7 $。这在所示的范围之外很好,这就是为什么我们将所有频率除以2以使它们保持在正确的范围内 - 而且,在最终$ 2 ^ 7的情况下,这划分为相同注意我们开始了。在虽然沿几次,但是在越过F-2F范围内,用粗略地间隔的音符填充它。在音乐符号中,这被称为第五个圈子(以及我对一个离散数学课程的有雾回忆告诉我,这一结果可能与副本,余额等有关)。
Pythag_roughnesses = [[粗糙度_two_series f2在pythag_freqs中的f2中的f2 f2] PLT。 imshow(pythag_rougheses,cmap ='热',插值='最近')cb = plt。彩色栏()CB。 set_label('粗糙')plt。 Xlabel("注1")PLT。 ylabel("注2")plt。标题("用于毕达哥拉斯秤的成对粗糙度")plt。 show()print"毕达哥拉斯规模的平均粗糙度:" ,NP。意思(Pythag_roughnesses)
我们还计算了任何便条对的平均粗糙度为4.35 - 对于间隔内所有可能频率的4.96而言,但随着少许盐,忽略了从范围之外的音符的粗糙度,所以在4.96上改进。显示。
总结:毕达哥拉斯调整教会我们可以通过表单$(\ FRAC {1} {2})^ x(\ frac {3} {2)^ y $当我们这样做时,这些注释将F-2F范围分成对数刻度大致相等的间隔。让'颠倒该逻辑,并建议如果我们选择一个不同的12个音符,那么在日志比例上准确地将F-2F范围分割为平等的间隔,他们会赢得' t与毕达哥拉斯集太不同因此,最好的声音也太糟糕了。这是平等气质调整的前提 - 这是在中国的首次发明,但现在是大多数西方音乐的基础。
#12来自上面的魔法巧合,但现在我们直接使用3/2比率,并依靠以下输出#的记录,这些记录由3/2等于的某些功率= [fmin *(2 **(1/12))** n为n范围(12)] plt。图(FIGSIZE =(4,1))PLT。散射(相等_freqs,np。zeros_like(相等的_freqs))plt。 yticks([])plt。 Xlabel("频率")plt。标题("相等的气质尺度注释频率")PLT。 show()等于f1的f2为f1的show()compant_roughnesses = [f2的f2 rugine_two_series(f1,f2).PLT。 imshow(compant_roughnesses,cmap ='热',插值='最近')cb = plt。彩色栏()CB。 set_label('粗糙')plt。 Xlabel("注1")PLT。 ylabel("注2")plt。标题("对等气质尺度的成对粗糙度和#34;)PLT。 show()打印"平均粗糙度为平均气质规模:" ,NP。意思(等于_roughnesses)
平均气质的平均粗糙度为4.43,比毕达哥兰人略微粗糙(读者练习:如果您考虑在范围之上和下方的范围之下,则仍然是这种情况;重新使用?)。仍然,在那里使用它的好理由。注意如何,与毕达哥兰图上的成对粗糙度不同,等气质图上的每个对角线都具有沿着对角线的长度大致相同的粗糙度。此外,如果对角线做出粗糙度的变化,它们会如此顺利。这意味着,无论您如何记下您,现在都在播放,对其上面和下方的那些笔记的关系总是相同的。实际含义是它不会在你从中开始的速度;您可以在任何钥匙中播放相同的气质仪器,而无需重新调整它以最小化您目前在播放的任何东西的粗糙度。
最后,我们可以发明钢琴!假设我们想将我们的平等气质缩放分为两个笔记集群,使得来自每个群集的音符倾向于从同一群集中的音符发出更好。
来自Sklearn.Cluster导入AgglomerativeClustering AC = AgglomerativeClustering(N_Clusters = 2)AC。 FIT(1 / ASArray(Equal_Roughnesses))相邻_temp_clusters = AC。标签_打印"每个音符的等气质簇标签(按低到高点):" ,compand_temp_flusters.
每个音符的相同气质簇标签(按顺序从低到高):[0 1 0 1 0 0 1 0 1 0 1 0]
如果你已经意识到了,我毫不犹豫地欺骗了。特别是,分析忽略了F-2F范围之外的音符冲突,并且还忽略了我们选择的起始音符的事实是任意的 - 所以我们'重新幸运的是这么整齐地工作。如果你'重复感觉敏锐,我肯定可以在不忽视这些点的情况下得到相同的结果。