间奏4:演奏和弦
间奏4:演奏和弦
在本间奏中,我们将探索使用TunePad和Python演奏和弦的几种选项。当你创作歌曲的和声时,你需要考虑的不仅仅是选择和弦。你还必须考虑如何演奏这些和弦。音色、和声和时机的微妙变化可以对你最终产生的声音产生巨大影响。在第4章中,我们看到了如何使用列表和单个playNote语句演奏和弦,如下所示:
playNote([48, 53, 55], beats = 4.0)这是你最基本和最机械的声音选项。这里有一些其他想法和技术可以尝试。你可以在线跟随这个TunePad项目:https://tunepad.com/interlude/play-chords
选项1:块状和弦
使用块状和弦,你可以在完全相同的时间演奏和弦中的每个音符,并且持续时间完全相同。这种方法很简单,可以为你的音乐增添强烈的节奏感。但在某些情况下,使用块状和弦可能听起来刺耳和过于机械。这是一个简单的函数,它接受一个和弦(一个数字列表)并在相同时间内以相等的持续时间演奏每个音符:
def block(chord, beats):
playNote(chord, beats)选项2:分解和弦
有时当人类演奏和弦时,他们会在音符起始之间的时机中引入微妙的变化。这种变化可能是 intentional 和夸张的,或者只是用手演奏或拨弄和弦的自然结果。这种风格称为分解和弦。如果你想突出和声的变化,或者想模仿拨弦乐器,我们可能会分解和弦。像Dr. Dre这样的艺术家在钢琴上使用分解和弦来创造标志性的声音。你也可以结合分解和弦和块状和弦。如果你的和弦进程正在变化和弦,你可以通过分解变化的和弦来吸引注意力。这个函数通过在每个音符起始之间添加短的、固定的延迟来分解和弦。
def rolled(chord, duration):
delay = 0.1 # 音符起始时间之间的间隔
offset = 0 # 累积延迟
for note in chord:
playNote(note, beats = delay, sustain = duration - offset)
offset += delay # 跟踪累积延迟
fastForward(duration - offset)该函数使用两个”记账”变量,称为delay和offset。delay变量只是说明在演奏和弦中的每个连续音符之前暂停多长时间。offset变量跟踪我们在for循环中引入的总延迟量。我们在两个地方使用offset变量。首先,在第6行,我们调整sustain参数,以便和弦中的所有音符在同一时间释放(sustain参数让音符响得比传入beats参数的时间长)。其次,在第9行,我们在循环完成后调整播放头位置。这使得调用rolled函数使播放头向前推进duration参数中指定的确切量。另一件快速说明的事情:第7行使用加等运算符(+=)。这是一种简写方式,说明:
offset = offset + delay选项3:随机分解和弦
我们可以通过随机变化音符起始时间来进一步采用这种技术。为此,我们将使用Python的random模块中的其中一个实用程序:uniform函数。这个函数接受两个数字作为输入,并生成这两个数字之间的随机小数。我们将使用它来生成和弦中每个连续音符之间的偏移。与前面的示例一样,我们将使用playNote的sustain参数来保持每个音符持续原始输入节拍的剩余持续时间,每次减去总的累积偏移量。
from random import uniform
def rolled(chord, duration):
max_delay = 0.15
offset = 0
for note in chord:
next_delay = uniform(0, max_delay)
playNote(note, beats = next_delay, sustain = duration - offset)
offset += next_delay
fastForward(duration - offset)这段代码比前面的示例稍微复杂一些,但让我们逐行讨论它。在第一行,我们导入uniform函数。在第2行,我们定义我们的rolled函数,它有两个参数:和弦中的音符列表和总拍数。在第3行,我们定义一个常量值,它定义两个音符之间的偏移可以采取的最大值。更高的值将创造更分散的声音,更低的值将创造更封闭、更紧凑的声音。在第4行,我们初始化一个变量来跟踪每个步骤的总偏移,它从零开始。从第5行开始,我们遍历和弦的每个音符。在每个步骤,我们计算到下一个音符的偏移,然后调用playNote。最后,在第9行,我们将播放头移动剩余的拍数。
如果这段代码看起来令人困惑,那没关系。我们将在后面的章节中更深入地理解这种代码。你可以将这个函数视为编码工具包中的另一个工具。
选项4:琶音
演奏和弦的另一种方式是一次演奏一个音符。这种方法称为琶音。你演奏音符的顺序无关紧要。你可以从任何音符开始,以任何顺序演奏和弦的音符,以获得适合你的曲目的声音。在下面的代码中,我们从最低的音符开始,按音高增加的顺序工作。
def arpeggio(chord, total_beats):
duration = total_beats / len(chord)
for note in chord:
playNote(note, beats = duration)在第一行,我们设置函数定义,它有两个参数:和弦中的音符列表和演奏和弦的总拍数。在第二行,我们通过将总拍数除以及弦中的音符数来平均计算每个单独音符的持续时间。在第3行和第4行,我们使用for循环遍历和弦中的音符列表,每个音符演奏相同数量的拍数。
选项5:模式琶音
这个琶音函数可以,但让我们尝试做一些更有趣的事情。记住,我们不必均匀地演奏每个音符,我们可以切换和弦的顺序。让我们定义一个函数,它接受一个七和弦(正好有四个音符),并在一个小节的时间内演奏它。我们将使用索引的概念,我们将在下一章中更多阅读。现在,只知道索引是我们如何访问列表的特定元素。要在Python中索引列表,你在想要使用的元素的位置周围使用方括号。这些位置从零开始,所以如果我们有一个变量chord,并且我们想要访问列表的第一个元素,根音,我们将键入以下内容:
chord[0]考虑到这一点,让我们定义一个函数。我们有四拍工作和四个音符——即索引0到3。这是一个可能性的快速示例,但你可以尝试不同的音符变化和音符顺序以获得不同的效果。
def my_pattern(chord):
playNote(chord[0], 0.75)
playNote(chord[1], 0.25)
playNote(chord[2], 0.5)
playNote(chord[1], 0.5)
playNote(chord[3], 0.5)
playNote(chord[2], 0.5)
rest(1)在这个函数中,我们没有做任何花哨的事情来遍历和弦,我们不需要每次都计算我们的拍数。第2行到第8行的拍值加起来正好是4.0拍。如果你在跟随,你可以尝试调整这些值为仍然是4.0拍的不同值。你也可以尝试调整音符的索引以更改哪个和弦音演奏。