《程序员的音乐理论:从零推导乐理系统》

标签:
#音乐理论 #编程 #Web_Audio_API #声学物理 #数学原理 #计算机科学

总结:

本文从物理和算术的第一性原理出发,用 JavaScript 代码逐步推导出整个西方音乐理论体系。作者不依赖记忆,而是通过编程和听觉验证,解释了为什么音乐有十二个音、为什么大调音阶是那个形状、为什么和弦听起来和谐,以及乐谱本质上是一种序列化格式。核心洞察是:音乐理论并非 arbitrary 的约定,而是物理(泛音列)和数学(简单整数比)的自然结果。

文章要点:

1. 声音的本质是随时间变化的数字 — 音频就是每秒 44,000 次描述扬声器位置的数字列表,频率即音高,440Hz 只是人为约定的基准。

2. 音色来自你没要求的频率 — 任何乐器发出的都不是单一频率,而是基频的整数倍(泛音列)。不同波形(正弦、三角、方波、锯齿波)本质上是泛音配方的差异,这解释了为什么小提琴和小号音色不同。

3. 八度是频率翻倍,音高是乘法关系 — 220Hz、440Hz、880Hz 听起来是"同一个音",因为高八度的所有泛音都包含在低八度的泛音列中。因此整个音高问题简化为"如何把倍频区间分割"。

4. 简单整数比听起来和谐 — 2:1(八度)、3:2(五度)、4:3(四度)、5:4(大三度)听起来协和,是因为它们的泛音列有大量重叠;而复杂比例(如 √2)产生拍频和粗糙感。协和的本质是耳朵能快速找到重复模式。

5. 十二音律是数学妥协 — 纯五度(3:2)叠 12 次不等于 7 个八度(2^7),这个无法修复的误差叫"毕达哥拉斯音差"。现代十二平均律将八度均分为 12 份(每份是 2 的 12 次方根),虽然除了八度都不纯,但让所有调都能用。12 之所以被选中,是因为它是第一个能把五度误差控制在约 0.1% 以内的数字。

6. 音阶是间隔数组 — 大调音阶 [2,2,1,2,2,2,1] 只是一个七元素数组,加起来为 12。自然小调是它的旋转(从第 5 位开始),七种调式则是同一数组的 7 种循环移位,这让作者感叹"音乐理论终于不再像 arbitrary 的 trivia"。

7. 和弦是隔一个音取的堆叠 — 三和弦 [0,2,4] 取音阶中每隔一个的音,大三和弦 [0,4,7] 与小三和弦 [0,3,7] 只差一个半音,却代表了西方音乐两大情感极。七和弦加入第四个音后,音乐开始从"圣咏"变成"爵士"。

8. 调内七和弦是自然涌现的 — 在一个大调音阶上,从七个音级分别构建三和弦,会自动得到:I(大三)、ii(小三)、iii(小三)、IV(大三)、V(大三)、vi(小三)、vii°(减三)。罗马数字标记是相对寻址,移调只需加一个常数。

9. 张力与解决有物理基础 — V7 → I 是最强的解决感,因为 V 和弦中的 B(导音)距 I 的根音只差半音,且 V7 包含三全音(B-F,√2 比例,最不稳定),这两个音分别向相反方向移动半音到达稳定位置。

10. 乐谱是带 header 的序列化格式 — 五线谱本质是针对"实时阅读、手在忙"场景优化的数据格式:纵轴是音阶度数(非线性频率),谱号定义坐标原点,升降号是 escape hatch,调号是 DRY 原则(常量提升),时值是 2 的负幂次,附点是二进制分数,速度(BPM)把拍子映射到秒。

URL:
https://runjs.app/blog/music-theory-for-programmers Music theory for programmers
 
 
Back to Top