间奏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)