间奏6:随机和弦进程

间奏6:随机和弦进程

这是一个简短的Python示例,它生成然后演奏随机和弦进程,使用图6.3中的图表。我们可以从一个将每个和弦映射到一组简化的可能转移和弦的表开始。左边的表使用罗马数字,右边的表使用阿拉伯数字显示相同的事情。注意这些表不包括上面流程图中的所有可能性,但包括了大多数可能的转移。

罗马数字 转移选项 阿拉伯数字 转移选项
I → iii, IV, V, vi 1 → 3, 4, 5, 6
ii → I, V 2 → 1, 5
iii → IV 3 → 4
IV → I, ii, V 4 → 1, 2, 5
V → I, vi 5 → 1, 6
vi → ii, iii, IV 6 → 2, 3, 4

现在我们可以使用Python将这个转移表转换为计算机算法。

步骤1:随机和弦算法

在TunePad项目中创建一个新的钢琴单元并添加此代码。

from random import choice # 导入choice函数

progression = [ 1 ] # 创建一个只有一个和弦的列表
chord = choice([3, 4, 5, 6]) # 选择一个随机的下一个和弦

while chord != 1: # 当和弦不等于1时重复
    progression.append(chord) # 将下一个和弦添加到列表
    if chord == 2: # 如果当前和弦是2
        chord = choice([1, 5]) # 然后选择一个随机的下一个和弦
    elif chord == 3: # 否则如果当前和弦是3
        chord = 4 # …
    elif chord == 4:
        chord = choice([1, 2, 5])
    elif chord == 5:
        chord = choice([1, 6])
    else: # 和弦是6
        chord = choice([ 2, 3, 4 ])
        
print(progression)

这段代码有很多内容,但让我们逐行分解它。

第1行从Python的random模块导入一个名为choice的函数。choice函数从列表中随机选择一个元素。你可以把它想象成从一副牌中随机抽取一张卡。

第3行创建一个名为progression的变量,它由一个只有一个元素的列表组成。这个列表将保存我们完成的和弦进程,我们以为主和弦1开始它。

第4行随机选择下一个和弦。我们使用转移表从3、4、5和6中选择作为序列中可能的下一个和弦。我们将随机选择保存在名为chord的变量中。

第6行是一种我们以前没有见过的新的Python循环,称为while循环。这个循环无限重复,直到满足某个条件。在我们的情况下,我们将重复循环,直到我们的chord变量等于1。

第7行是while循环的一部分。它使用append函数将我们的新和弦添加到progression列表的末尾。第一次通过循环时,progression列表将有两个元素,1和在第4行选择的任何随机和弦。每次额外通过循环时,第7行将向列表添加另一个和弦。

第8行询问我们的随机和弦是否等于2。如果是,它根据转移表中的值选择随机的下一个和弦(在第9行)。

第10行仅在第8行为False时使用。elif是”else if”的缩写。所以,这一行说:否则,如果chord的值是3,则将下一个和弦设置为4。

第12、14和16行根据转移表处理chord值的下一组选项。

一旦循环完成,第19行打印出结果。示例输出可能是[1, 5, 6, 3, 4, 2],但由于这使用随机选择,每次代码运行时输出可能不同。

步骤2:演奏和弦

那么我们的随机和弦进程听起来如何?我们可以在末尾添加几行代码,在TunePad中演奏我们的进程。让我们首先用字典定义我们的自然和弦。我们不使用罗马数字作为键,而是使用和弦编号。

tonic = 48
chords = {
    1 : majorChord(tonic),
    2 : minorChord(tonic + 2),
    3 : minorChord(tonic + 4),
    4 : majorChord(tonic + 5),
    5 : majorChord(tonic + 7),
    6 : minorChord(tonic + 9),
    7 : diminishedChord(tonic + 11)
}

接下来我们可以遍历我们的progression列表,依次演奏每个和弦。

for chord in progression:
    playNote(chords[chord], beats = 2)

你可以在TunePad上尝试此代码:https://tunepad.com/interlude/random-chords