间奏5:Lean on Me
间奏5:Lean on Me
Bill Withers
让我们通过重现Bill Withers(1972年,Columbia Records)的歌曲《Lean on Me》的钢琴和声的一小部分来练习使用和弦。这是你可以尝试输入到TunePad项目中的和弦结构的简化版本。
和弦变量
Cmaj = [ 48, 52, 55 ]
Dmin = [ 50, 53, 57 ]
Emin = [ 52, 55, 59 ]
Fmaj = [ 53, 57, 60 ]
Bdim = [ 47, 50, 53 ]和弦进程
| 和弦 | 拍数 | Python代码 | 和弦 | 拍数 | Python代码 |
|---|---|---|---|---|---|
| C大调 | 4 | playNote(Cmaj, beats = 4) |
C大调 | 4 | playNote(Cmaj, beats = 4) |
| C大调 | 1 | playNote(Cmaj) |
C大调 | 1 | playNote(Cmaj) |
| D小调 | 1 | playNote(Dmin) |
D小调 | 1 | playNote(Dmin) |
| E小调 | 1 | playNote(Emin) |
E小调 | 1 | playNote(Emin) |
| F大调 | 4 | playNote(Fmaj, beats = 4) |
F大调 | 4 | playNote(Fmaj, beats = 4) |
| F大调 | 1 | playNote(Fmaj) |
F大调 | 1 | playNote(Fmaj) |
| E小调 | 1 | playNote(Emin) |
E小调 | 1 | playNote(Emin) |
| D小调 | 1 | playNote(Dmin) |
D小调 | 1 | playNote(Dmin) |
| C大调 | 4 | playNote(Cmaj, beats = 4) |
C大调 | 4 | playNote(Cmaj, beats = 4) |
| C大调 | 1 | playNote(Cmaj) |
C大调 | 1 | playNote(Cmaj) |
| D小调 | 1 | playNote(Dmin) |
D小调 | 1 | playNote(Dmin) |
| E小调 | 1 | playNote(Emin) |
E小调 | 1 | playNote(Emin) |
| E小调 | 3 | playNote(Emin, beats = 3) |
B减 | 3 | playNote(Bdim, beats = 3) |
| D小调 | 4 | playNote(Dmin, beats = 4) |
C大调 | 4 | playNote(Cmaj, beats = 4) |
你可以在此处查看完整代码:https://tunepad.com/interlude/chord-progressions
需要注意的一件事是和弦进程如何反映整首歌的情感。Withers将乐观(“我会成为你的朋友。我会帮你继续”)与生活的残酷现实(“我们都有痛苦。我们都有悲伤”)混合在一起。和声以一个大调和弦(C大调)开始,但然后经过一系列小调和弦(D小调、E小调),最后落在更令人鼓舞的大调和弦上,用于延长音符(F大调)。就好像和声也在说,我们要经历一些困难时期,但一切最终都会好起来。
上面的版本与原始版本略有修改,因为我们使用简化的和弦和结尾的减B和弦,它滑入C大调。当你听它时,注意B减和弦如何感觉不稳定,好像它需要解决到C大调以将和声完整地带回圆圈,以标志歌曲中的过渡。
更优雅的代码
编写此代码的一种诱人的方法是只键入所有playNote函数,一个接一个。这行得通,但这不一定是用音乐表达的最优雅的方式。当你编码时,总是有不止一种方法解决问题,所以养成询问是否有其他更容易的方法来完成事情的习惯是很好的。例如,如果我们想更改所有和弦的力度,怎么办?我们必须一次编辑一行,或使用查找和替换。作为替代,如果我们将所有和弦放入一个列表,然后使用for循环遍历该列表,怎么办?
chords = [ Cmaj, Cmaj, Dmin, Emin, Fmaj, Fmaj, Emin, Dmin, Cmaj ]
for chord in chords:
playNote(chord)这将是一个改进。如果不是别的,我们将减少演奏和声所需的行数。明显的问题是它不会工作,因为音符是不同的长度。有些是长的(四拍),其他是短的(一拍)。但这代码以相等的持续时间演奏所有和弦。
如果有一种简单的方法同时遍历两个列表,我们可以创建一个带有和弦的列表,另一个带有持续时间。Python正好包括这种功能,称为zip函数。把它想象像一个拉链,将两个Python列表合并在一起,而不是两片织物。它逐个元素地遍历列表,并将它们合并成成对的值。结果看起来像这样:
chords = [ Cmaj, Cmaj, Dmin, Emin, Fmaj, Fmaj, Emin, Dmin, Cmaj ]
durations = [ 4, 1, 1, 1, 4, 1, 1, 1, 4 ]
for chord, duration in zip(chords, durations):
playNote(chord, beats = duration)这是完整的示例,或者你可以在线尝试:https://tunepad.com/interlude/lean-on-me
CM = [ 48, 52, 55, 55 + 12 ]
Dm = [ 50, 53, 57, 57 + 12 ]
Em = [ 52, 55, 59, 59 + 12 ]
FM = [ 53, 57, 60, 60 + 12 ]
Bd = [ 47, 50, 53, 53 + 12 ]
chords = [ CM, CM, Dm, Em, FM, FM, Em, Dm, CM, CM, Dm, Em ]
durations = [ 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 3, 4 ]
for chord, duration in zip(chords + [ Em, Dm ], durations):
playNote(chord, beats = duration)
for chord, duration in zip(chords + [ Bd, CM ], durations):
playNote(chord, beats = duration)