节奏与速度
2 节奏与速度
本章深入探讨音乐中节奏的基础知识。我们从节拍开始——它是什么,如何测量,以及我们如何可视化节拍来创作、编辑和演奏音乐。从那里开始,我们将提供来自不同音乐流派的一些常见节奏动机的示例,以及如何用 Python 编写它们。本章的主要编程概念包括循环、变量、调用函数和传递参数值。本章涵盖了很多内容,但它将为你在用代码创作音乐方面打下坚实的基础。
2.1 节拍与速度
节拍(beat)是音乐中节奏的基础。术语”节拍”在音乐中有许多不同的含义,但本章使用它来表示时间单位,即单个音符播放的时间长度——例如,“休止两拍”或”播放半拍音符”。基于节拍,音乐音符以重复的模式组合在一起,随着时间移动,使我们的耳朵能够理解节奏感。
速度(tempo)指的是节奏移动的速度,或者在一首音乐中一个节拍跟随另一个节拍的快慢程度。作为听众,你可以通过用脚跟随节奏脉冲 tapping 来感受速度。测量速度的标准方式是每分钟拍数(BPM 或 bpm),意味着在一分钟的时间内播放的总拍数。这几乎总是一个整数,如 60、120 或 78。在 60 bpm 的速度下,你的脚每分钟 tapping 60 次(或每秒一拍)。在 120 bpm 时,你每秒得到 2 拍;在 90 bpm 时,你每秒得到 1.5 拍。

图 2.1 TunePad 项目信息栏。你可以点击速度、拍号或调来更改项目的设置。
稍后在本章中,当你开始使用 TunePad 时,你可以通过点击项目顶部栏中的 bpm 指示器来设置速度(见图 2.1)。
不同流派的音乐有其典型的的速度范围(尽管每首歌曲和每位艺术家都不同)。例如,嘻哈音乐通常落在 60-110 bpm 范围内,而摇滚音乐更快,在 100-140 bpm 范围内。浩室/铁克诺/出神音乐更快,速度在 120 到 140 bpm 之间。
| 流派 | 速度范围 (BPM) |
|---|---|
| 摇滚 | 100-140 |
| R&B | 60-80 |
| 流行 | 100-132 |
| 雷鬼 | 60-92 |
| 嘻哈 | 60-110 |
| 回响贝斯 | 130-144 |
| 铁克诺 | 120-140 |
| 萨尔萨 | 140-250 |
| 巴恰塔 | 120-140 |
音乐家需要练习才能以稳定的速度演奏,他们有时使用一种叫做节拍器(metronome)的设备来帮助他们保持演奏与音乐的脉冲同步。你可以在 TunePad 中使用鼓单元格中的四行代码创建一个简单的节拍器。如果你将乐器切换到”鼓 → 打击乐声音”,这效果最好。
playNote(3, velocity=100) # 第一个音符更响
playNote(3, velocity=60)
playNote(3, velocity=60)
playNote(3, velocity=60)你可以使用 bpm 指示器调整节拍器的速度(图 2.1)。正如这个示例所说明的,计算机擅长保持完全稳定的速度。如果你想要精确性,这很好,但也有一个风险,即生成的音乐听起来太僵硬和机械化。当真实的人演奏音乐时,他们经常加快或减慢速度,要么是为了戏剧效果,要么只是因为作为人类的结果。根据流派的不同,表演者可能会添加称为 swing 或 shuffle 的节奏细微变化,这是一种节拍的来回摇摆,你几乎可以更多地感受到它,而不是听到它。我们将在本书后面展示如何给计算机生成的音乐添加更人性化的感觉。
2.2 节奏记谱法
几个世纪以来,音乐家和作曲家开发了许多不同的书写系统来记录和分享音乐。随着数字制作软件的出现,许多其他用于混音和编辑的交互式表示也变得常见。以下是同一节奏模式的四种常见视觉表示。该模式的总持续时间为四拍,可以数作”1 和 2,3 和 4”。前两个音符是 ½ 拍长,然后是一个 1 拍长的音符。然后模式重复。
2.2.1 表示 1:标准西方音乐记谱法
第一种表示(如下)显示了标准音乐记谱法(或西方记谱法),这是一种记录音符的系统,已经发展了数百年。插图左侧的两条垂直粗线表示这是节奏记谱法,意味着没有关于音高的信息,只有节奏时间。长水平线上的圆点表示音符,其形状表示要播放的每个声音的持续时间。有时不同的打击乐器会在不同的线上绘制它们的音符。我们将在图 2.2 中更详细地描述各种音符符号的含义。

图 2.2 标准记谱法示例。
2.2.2 表示 2:音频波形
第二种表示显示了当你播放音乐时发送到扬声器的实际音频波形的可视化。波形显示了音频信号的振幅(或音量)随时间的变化。下一章将更多地讨论音频波形,但现在你可以把波形看作一个图表,显示扬声器振动的文字强度随时间的变化。当你在 TunePad 中创作节拍时,你可以通过点击时间线左上角的小下拉箭头切换到波形视图(图 2.3)。

图 2.3 图 2.2 的波形表示。
2.2.3 表示 3:钢琴卷(MIDI 卷)
第三种表示显示了钢琴卷(或 MIDI(音乐仪器数字接口)卷)。它使用实线显示单个音符。线的长度表示单个音符的长度,线的垂直位置表示正在播放的打击乐声音(在这种情况下是底鼓和军鼓)。这种表示在音乐制作软件中越来越常见。许多工具甚至允许与单个音符进行拖放交互以创作和编辑音乐(图 2.4)。

图 2.4 图 2.2 的钢琴或 MIDI 卷表示。
2.2.4 表示 4:Python 代码
目前的最后一种表示显示了 TunePad 中的 Python 代码。在这种表示中,每个音符的持续时间使用 playNote 函数调用的 beats 参数设置。
playNote(2, beats=0.5)
playNote(2, beats=0.5)
playNote(6, beats=1)
playNote(2, beats=0.5)
playNote(2, beats=0.5)
playNote(6, beats=1)这些表示中的每一个都有优点和缺点;它们善于传达某些类型的信息,而不太善于传达其他信息。例如,标准节奏记谱法已经完善了几个世纪,世界各地的庞大音乐社区都可以使用。另一方面,对于没有学过如何读乐谱的人来说,它可能会令人困惑。单个音符的时间通过附加到音符的尾部和标志传达,但水平和时间之间没有一致的映射。
音频波形善于显示声音的实际样子——每个音符响多长时间(“释音”)以及它的起音有多尖锐(“起音”)。它对音乐制作、混音和母带处理很有帮助。另一方面,波形并不能真正告诉你音符的音高或作曲家记录的预期时间。
Python 代码对计算机来说比对人类更容易阅读——你绝对不会把它交给音乐家来视奏。另一方面,它的优势是可以将其合并到计算机算法中,并以无尽的方式操作和转换。有许多许多其他记谱系统旨在将音乐表演(我们在现场表演中听到的)转录到一张纸或计算机屏幕上。每种表示都是为特定目的和/或音乐流派发明的。你可能会根据上下文和你扮演的角色(音乐家(以及你演奏什么类型的乐器)、歌手、作曲家、声音工程师或制作人)来选择表示。音乐记谱系统就像发明它们的文化和音乐传统一样丰富和多样。使用软件的一个好处是,根据我们要完成的任务,可以轻松地在音乐的多种表示之间切换。
2.3 标准节奏记谱法
本节将回顾一种根植于欧洲音乐传统的标准音乐记谱系统。这种系统多功能,并且已经在很长一段时间内跨越许多国家和大洲进行了完善和调整,以与日益多样化的乐器和音乐流派一起工作。我们在本章中从打击节奏音符值开始,然后在第 3 章中继续使用有音高的乐器。
图 2.5 显示了节奏音乐记谱中使用的最常见的符号。音符用椭圆形圆点表示,这些圆点要么是开放的,要么是封闭的。除全音符(顶部)外,所有音符都有附加到它们的尾部,这些尾部可以指向上方或下方。尾部指向哪个方向(向上或向下)无关紧要。比四分音符快的音符也有连接到尾部的水平标志或梁。每个额外的标志或梁表示音符快两倍。

图 2.5 常见音符符号,从顶部的全音符(四拍)开始,到底部的十六分音符。每一新行的音符是上一行音符长度的一半。
| 符号 | 名称 | 拍数 | TunePad 代码 |
|---|---|---|---|
| ○ | 全音符 | 4 | playNote(1, beats=4) |
| ○̅ | 二分音符 | 2 | playNote(1, beats=2) |
| ● | 四分音符 | 1 | playNote(1, beats=1) |
| ♪ | 八分音符 | 0.5 | playNote(1, beats=0.5) |
| ♬ | 十六分音符 | 0.25 | playNote(1, beats=0.25) |
标准记谱法还包括附点音符,其中一个小点跟随音符符号。使用附点音符,你取原始音符的持续时间并向其添加其值的一半。所以,附点四分音符是 1.5 拍长,附点二分音符是 3 拍长,依此类推。
还有表示不同持续时间 silence 或”休止”的符号:
| 符号 | 名称 | 拍数 | TunePad 代码 |
|---|---|---|---|
| ____ | 全休止符 | 4 | rest(beats=4) |
| _ | 二分休止符 | 2 | rest(beats=2) |
| 7 | 四分休止符 | 1 | rest(beats=1) |
| ⟍ | 八分休止符 | 0.5 | rest(beats=0.5) |
| ⟋ | 十六分休止符 | 0.25 | rest(beats=0.25) |
2.4 拍号
在标准记谱法中,音符被分组为称为小节(measures 或 bars)的段。每个小节包含固定数量的拍,小节中所有音符的持续时间应该加起来等于该数量。拍号(time signature)用一个分数表示小节和拍之间的关系。分子(或顶部数字)表示小节中的拍数,分母(底部数字)表示拍的持续时间。
最常见的拍号是 4/4。它如此常见,事实上,它被称为普通拍(common time)。它通常用上面表格中显示的特殊符号表示。在普通拍中,每个小节有四拍,四分音符”获得节拍”,意味着一拍与一个四分音符相同。
在标准记谱法中,垂直线分隔小节。在下面的示例中,有两个 4/4 拍的小节(每个小节有四拍,每拍是一个四分音符)。
如果你有 3/4 拍号,那么每个小节有三拍,每拍的持续时间是一个四分音符。《音乐之声》中的 My Favorite Things、Jay Z 的 My 1st Song、Jimi Hendrix 的 Manic Depression 和 Seal 的 Kiss from a Rose 都是 3/4 拍歌曲的示例。
其他常见拍号包括 2/4 拍(每个小节有两个四分音符拍)和 2/2 拍(每个小节有两个二分音符拍)。使用 2/2 拍时,每个小节实际上有四个四分音符,因为一个二分音符的持续时间与两个四分音符相同。因此,2/2 拍的表演与普通拍相似,但通常更快。它被称为切割拍(cut time),用带有一条穿过它的线的 C 符号表示(见上表)。
你可以通过点击顶部栏中的时间指示器来调整 TunePad 项目的拍号(见图 2.1)。
2.5 打击乐声音与乐器
使用节奏时,你会遇到许多不同打击乐器和声音的专业术语。以下是你在数字音乐中将使用的一些最常见鼓声音的简要介绍(图 2.6)。

图 2.6 典型鼓组中的鼓。
| 鼓名称 | 描述 | TunePad 音符编号 |
|---|---|---|
| 底鼓或 bass 鼓 | 底鼓(或 bass 鼓)发出响亮、低沉的 thumping 声音。底鼓通常放置在摇滚、流行、浩室和电子舞曲的第 1 和第 3 拍。在其他流派如嘻哈和放克中,底鼓非常突出,但它们的放置更加多样化。 | 0 和 1 |
| 军鼓 | 军鼓发出可识别的尖锐断音声音,横跨频谱。它们是用称为 snare 的特殊金属线构建的,这些金属线赋予鼓其独特的 snap 声音。军鼓通常用于第 2 和第 4 拍。 | 2 和 3 |
| 踩镲 | 踩镲是夹在金属杆上的两个镲片的组合。脚踏板打开或关闭镲片在一起。在关闭位置时,踩镲发出明亮的 tapping 声音。在打开位置时,镲片被允许响出。踩镲已成为几乎所有流行音乐流派中节奏的组成部分。 | 4( closed)5(open) |
| 低音、中音、高音桶鼓 | 桶鼓(tom-toms)是圆柱形鼓,声音比军鼓不那么 snap。鼓组通常有多个具有略微不同音高(如低、中、高)的桶鼓。 | 6、7、8 |
| 碎音镲 | 一种发出响亮 crash 声音的大镲,通常用作打击乐重音。 | 9 |
| 拍手和沙锤 | 不同的 TunePad 鼓组包括流行音乐中常见的各种其他打击乐声音,包括各种拍手、沙锤和其他声音。 | 10 和 11 |
2.5.1 808 鼓组
Roland 808 鼓机于 1980 年代早期发布,在早期嘻哈音乐(以及其他流派)中是一种极具影响力的声音。808 使用电子合成技术创建鼓声音(如底鼓、军鼓、踩镲、桶鼓、牛铃和边框击打)的合成复制品。Tinkerers 还会打开 808 并 hack 电路以创建全新的声音。今天,808 通常指的是首先使用 808 底鼓的调整版本生成的低沉、轰鸣的低音线条。TunePad 的默认鼓组使用的采样听起来像原始的电子合成 808(图 2.7)。

图 2.7 Roland 808 鼓音序器。
2.5.2 选择 TunePad 乐器
在 TunePad 中编写代码时,你的代码发出的声音将取决于你选择的乐器。如果你在编写节奏,你可以从几种不同的鼓组中选择,包括 808 和摇滚鼓组。你可以通过点击下面显示的选择器来更改乐器(图 2.8)。

图 2.8 在 TunePad 中更改乐器的音色。
2.6 用 Python 编写节奏代码
让我们开始编码!在开始编码之前,你应该记住几件快速的事情。
2.6.1 语法错误
Python 是一种基于文本的语言,这意味着你将键入必须遵循严格语法规则的代码。当你说自然语言如英语时,语法很重要,但你通常可以弯曲或打破规则,仍然传达你的信息。当你说一些模棱两可的话时,它可能是讽刺、幽默或诗意的。在 Python 中不是这样。Python 没有幽默感,也不欣赏诗歌。如果你在编码中犯了语法错误,Python 会给你一条称为语法错误(syntax error)的消息。这些消息可能令人困惑,但它们是为了帮助你修复代码而存在的,就像拼写检查器帮助你修复拼写错误一样。以下是 TunePad 中语法错误的样子(图 2.9)。

图 2.9 TunePad 中 Python 语法错误的示例。这一行代码缺少一个括号符号。
此行代码缺少一个括号符号,生成了错误消息”bad input on line 5”。请注意,Python 正在给你关于问题所在以及如何修复它们的提示,但这些提示并不总是那么有帮助,可能会让初学者感到沮丧。我们将在本章后面给你修复语法的练习。
2.6.2 控制流
Python 程序由一系列语句组成。在大多数情况下,每个语句都在程序中的自己的行上。Python 将按你编写它们的顺序从上到下读取和执行每一行代码。在编程中,这称为控制流(flow of control)。这类似于你阅读书中的单词或一行乐谱上的音符的方式。不同之处在于,编程语言也有特殊的规则,让你改变控制流。这些规则包括循环(重复代码的某些部分多次)、条件逻辑(仅在某些条件满足时运行代码的某些部分)和用户定义的函数(允许你创建可以调用的自己的函数)。我们将在本书后面讨论这些特殊的”控制结构”。
2.7 调用函数
你在 Python 中做的几乎所有事情都涉及调用函数。函数(有时称为命令或指令)告诉 Python 做某事或计算一个值。例如,playNote 函数告诉 TunePad 发出声音。要调用函数,你必须做三件事:
首先,你必须编写函数的名称。函数有一个单词的名称(没有空格),可以由字母、数字和下划线 _ 字符组成。多词函数将在单词之间使用下划线字符,如:
my_multi_word_function()或者每个新单词将大写,如 playNote()。
其次,在你键入函数名称后,你必须包含括号。括号告诉 Python 你正在调用一个函数。
第三,你在左右括号之间包含你要传递给函数的任何参数。参数提供额外信息或告诉函数如何行为。例如,playNote 语句至少需要一个参数来告诉它要播放哪个音符或声音。有时函数接受多个参数(其中一些可以是可选的)。playNote 函数接受下一节中描述的几个可选参数。每个额外的参数用逗号分隔(图 2.10)。

图 2.10 在 TunePad 中调用带有两个参数(在括号内)的 playNote 函数。
2.8 playNote 函数
playNote 函数告诉 TunePad 播放打击乐声音或音乐音符。playNote 函数接受括号内的多达四个参数。
playNote(1, beats=1, velocity=100, sustain=0)| 名称 | 描述 |
|---|---|
note |
必需参数,表示要播放哪个音符或打击乐声音。声音的种类取决于你在 TunePad 中为此代码选择的乐器。你可以通过在方括号中包围音符来同时播放多个音符。 |
beats |
可选参数,表示播放音符的时间。TunePad 播放头将按给定的持续时间向前移动。此参数可以是整数(如 1 或 2)、小数(如 1.5 或 0.25)或分数(如 1/2)。 |
velocity |
可选参数,表示播放音符或声音的声音大小。值 100 是最大音量,值 0 是无音量(静音)。力度是数字音乐中的一个技术术语,意味着你击打乐器的速度或多快或多用力。你可以把它想象成鼓声音有多大取决于它被击打的多用力。 |
sustain |
可选参数,允许音符在不前进播放头的情况下再响几个拍。 |
2.8.1 可选参数
有时参数是可选的,意味着如果你不指定一个,它们有一个默认提供的值。对于 playNote,只有 note 参数是必需的。如果你不传递其他参数,它会默认为你提供值。你还可以在函数调用中包含参数的名称。例如,下面四行都做完全相同的事情;它们播放一拍的音符。前两个使用没有名称的参数。后两个包含参数的名称,后跟等号 (=),后跟参数值。
playNote(60) # beats 参数是可选的
playNote(60, 1) # 将 beats 参数设置为 1
playNote(60, beats=1) # 为 beats 使用参数名称
playNote(note=60, beats=1) # 为 note 和 beats 使用参数名称2.8.2 注释
在上面的代码中,某些文本出现在每行井号 (#) 符号之后。此文本称为注释(comment)。注释是程序员添加的自由格式注释,使他们的代码更容易理解。注释文本被 Python 忽略,所以你可以在一行中的井号符号后写任何你想写的内容。你还可以使用行首的井号来临时禁用代码。这称为”注释掉”代码。
2.9 rest 函数
静默是音乐的一个重要元素。rest 函数生成静默,或声音中的中断。它只接受一个参数,即保持休止的时间长度。所以,rest(beats=2) 将触发持续两拍的休止。如果你不提供参数,rest 默认使用 1.0 的值。
rest() # 休止一拍
rest(1.0) # 休止一拍
rest(0.25) # 休止四分之一拍
rest(beats=0.25) # 休止四分之一拍2.10 playNote 和 rest 的示例
让我们尝试几个 playNote 和 rest 的示例来热身。这个节奏播放两个八分音符(beats=0.5),然后是一个四分音符(beats=1)。然后模式第二次重复。
以下是我们如何在 TunePad 中用底鼓和军鼓编写此代码:
playNote(1, beats=0.5) # 播放底鼓 (1) 半拍
playNote(1, beats=0.5)
playNote(2, beats=1) # 播放军鼓 (2) 一拍
playNote(1, beats=0.5) # 播放底鼓 (1) 半拍
playNote(1, beats=0.5)
playNote(2, beats=1) # 播放军鼓 (2) 一拍这是另一个播放四分音符后跟 0.5 拍休止后跟八分音符(beats=0.5)的示例。模式连续重复两次:
playNote(2, beats=1) # 播放军鼓 (2) 一拍
rest(beats=0.5) # 休止半拍
playNote(2, beats=0.5) # 播放军鼓 (2) 半拍
playNote(2, beats=0.5)
playNote(2, beats=1)(未完待续…)
注意:由于第2章内容非常长(48K字符),我正在分批翻译。其余部分(2.11-2.16节)将在下一次继续完成。