第9章 歌曲创作与EarSketch

第9章 歌曲创作与EarSketch

客座章节 by Lauren McCall

采样和混音的艺术已成为现代数字音乐制作的核心实践。从Dr. Dre到Cardi B的艺术家都使用新技术将现有音乐中的短采样混合到全新的作品中。本章介绍使用名为EarSketch的免费在线平台进行采样、混音和歌曲创作。这个平台类似于TunePad,它将Python编程与音乐创作相结合。但EarSketch的重点更多是通过组合和混音预录采样来创建全长歌曲,而不是从个人音符和打击乐声音创作音乐。我们将介绍使用EarSketch的基础知识,并展示如何将音乐采样构建为全长作品。

9.1 歌曲结构

创作音乐不仅仅是想出节拍、和声和旋律。几乎每首流行歌曲都遵循某种编码的结构。在录音音频之前的日子里,结构和重复帮助听众与音乐建立关系。材料将在歌曲早期引入,然后在整个过程中阐述。蓝调歌曲的结构是一个很好的例子,但这几乎适用于从朋克到嘻哈到乡村的每种流行音乐流派。结构和重复对我们今天聆听的音乐同样重要,因为它让我们有机会注意到对比元素、记住旋律或与副歌一起唱。

歌曲由嵌套和重复的音符、乐句和部分组成。

歌曲结构——有时称为音乐形式——描述了音乐想法和材料如何在音乐作品中展开。在本书前面,我们介绍了音乐乐句的想法:一个独立的音乐思想,就像一句话。我们可以将这些乐句分组为更大的音乐部分。这些部分可以重复以形成更大的结构(图9.1)。

音乐家对歌曲的不同部分进行分类和讨论的最常见方式是用字母标记它们。每次有新部分时,它会得到字母表中的下一个字母。如果部分重新出现,我们重用我们已经应用于该部分的字母。如果部分重新出现但略有不同——也许有不同的歌词——我们可以给它一个数字。这作为歌曲的时间线或地图。在流行音乐中,主歌-副歌形式是最常见的歌曲结构。在最简单的情况下,这种形式建立在两个重复的部分上,称为主歌和副歌。这种基本结构有无穷的变化,但形式往往包括:

部分 描述
A1 intro(前奏)
B verse(主歌)
A2 verse(主歌)
B chorus(副歌)
C bridge(桥段)
B chorus(副歌)
outro(尾奏)

一些歌曲将以建立能量并介绍音乐材料的前奏为特色。主歌是一个重复的部分,帮助讲述歌曲的故事。通常,主歌的旋律每次都相同,但歌词不同。副歌或hook通常包含歌曲的重要音乐或歌词主题。这通常是歌曲中最令人难忘的部分,歌词几乎每次重复都相同。桥段提供与歌曲其余部分的对比,通常使用一些特别的东西,如和声或节奏的变化。不是每首歌都有桥段;有些有主歌的另一次重复。最后部分,尾奏,是完成歌曲的一种方式。这可能包括像副歌的慢淡出之类的东西。

以Carrie Underwood的热门单曲《Before He Cheats》(2005)为例。这完全遵循上表中的结构。有一个短前奏,然后是第一个主歌(“Right now, he’s probably slow dancin’…”),然后是副歌(“I dug my key into the side of his pretty little souped-up four-wheel drive…”)。然后第二个主歌和副歌之后是桥段(“I might have saved a little trouble for the next girl”),最后一个副歌和尾奏(“Oh, maybe next time he’ll think before he cheats”)。就像本书中讨论的许多概念一样,这些规则更像是粗略的指南而不是硬规则。意识到歌曲形式可以使创作音乐变得更容易得多,你可以以更大的部分思考。使用常见形式的变体给听众一个入口点,以了解从你的音乐中可以期望什么。

9.2 采样

采样涉及从现有音乐作品中获取部分并重新用途或混音它们以创建新的创作。采样可能由原始歌曲的特定音乐元素组成,如贝斯线、鼓断点、人声甚至语音片段。采样通常应用创意效果,如混响、合唱或滤波器,它们可能被循环、音高移动甚至反转。示例包括像Kanye West的《Good Morning》(2007)这样的歌曲,它采样了Elton John的《Someone Saved My Life Tonight》(1975),或Naughty By Nature的《O.P.P.》(1991),它采样了Jackson 5的《ABC》(1970)的多个元素。采样通常发生在与原始作品的对话中或向其致敬。艺术家可能包括对他们启发他们的作品的引用,通过合并特征性弦进程、乐器或旋律。

20世纪新录音技术的可用性让艺术家有机会以创新的方式与前几代音乐互动。虽然采样对许多音乐流派很常见,但它是嘻哈音乐的定义特征之一。嘻哈的根源在于现场表演——DJ在转盘上操纵现有唱片以创建全新的声音景观。现场表演的技术然后转移到由专为采样设计的录音技术和设备的进步驱动的原始作品中。先进的采样工具现在内置在数字音频工作站(DAW)软件中,现代音乐绝大多数是在其中创建的。

在你的作品中组合采样时,要注意不同音乐元素如何相互协作。如果你的歌曲在E大调中,你添加的采样在D小调中,它可能在和声上冲突。如果采样在不同的节奏中,它可能在节奏上不与歌曲的其余部分对齐。采样在音高或节奏或其他各种方式中被操纵,以使它们在风格上与歌曲的其余部分一起工作。

版权法 注意你采样的音乐周围的版权问题,特别是如果你正在考虑在线分享或许可它以赚钱。TunePad和EarSketch网站上的大多数音乐都被许可,以便你可以随意使用它们,但在采样其他艺术家的音乐时获得许可或许可证很重要。

9.3 EarSketch简介

EarSketch(图9.2)是一个免费的在线平台,用于使用代码创建音乐,由亚特兰大佐治亚理工学院的研究人员开发。EarSketch使用几种不同的编程语言工作,包括Python和JavaScript。你一直在学习的所有Python概念(列表、循环、变量、函数和参数)仍然适用,尽管音乐制作函数不同。例如,EarSketch没有playNote或rest函数。相反,它有一个fitMedia函数,将音乐采样放置在DAW的时间线上。

EarSketch界面。

JavaScript是另一种重要且广泛使用的编程语言。它通常被称为网络语言,因为网站使用JavaScript添加逻辑、用户交互和动态效果。每次你点击网页上的按钮时,它几乎肯定在运行JavaScript代码。如果你看看TunePad和EarSketch的引擎盖下,你会看到它们都使用JavaScript来生成和演奏音乐。如果你有兴趣尝试,EarSketch有学习JavaScript的出色资源。

一旦你登录主EarSketch网站 https://earsketch.gatech.edu,你就可以在代码编辑器中编写程序(图9.2中心)。注意EarSketch和TunePad有时都使用术语脚本来指代程序。脚本只是执行较小任务的短计算机程序的另一个词,如组装歌曲。在EarSketch中创建新脚本会生成少量样板代码以设置你的项目。在计算机编程中,“样板”意味着你在多个项目中使用的标准代码。这是EarSketch样板:

from earsketch import *
init()
setTempo(120)
finish()

第一行导入核心EarSketch模块。在TunePad中,我们也使用了Python的导入功能,但你可以在本书末尾的Python附录中阅读更多关于它如何工作的信息。第二行,init(),设置DAW。接下来,setTempo指定项目的节奏,以每分钟拍数(bpm)为单位。你为项目编写的代码应该添加到setTempofinish()函数调用之间。

EarSketch的最佳部分之一是其广泛的声音库。这个库有近4,000个由制作人和音乐家创建的预制音频剪辑,你可以在项目中免费使用。你可以在主EarSketch页面浏览采样库,按音乐流派、艺术家和乐器类型过滤(图9.2;左下)。你可以使用其预定义变量名和fitMedia函数将采样添加到你的项目中。

9.3.1 fitMedia函数

fitMedia函数将采样放置在你所选的小节处的音轨上。图9.3显示了EarSketch的DAW界面的特写。个人采样显示为波形,布局在编号的水平音轨上,让你能够组织你的作品。例如,你可能为你的旋律、贝斯线和和声有单独的音轨。音轨一次只能演奏一个采样,没有重叠。如果你的代码放置两个音频采样以便它们重叠,EarSketch将给你一条信息消息,并从音轨中删除其中一个采样。

fitMedia函数具有以下必需参数:

参数 描述
audio_file_name EarSketch库中的采样变量名——或——音频文件名的字符串。如果所选采样的节奏与你的项目的节奏不匹配,EarSketch将自动为你调整节奏。
track_number 大于或等于1的整数值,指定将采样放在哪个音轨上。
start_measure 大于或等于1的小数值,指定将采样放在哪个小节上。值1将采样放在音轨的开始,值2.5将采样放在第二小节的中间。
end_measure 大于start_measure的小数值,指定采样应演奏多长时间。如果结束和开始之间的差异大于采样的长度,EarSketch将自动为你循环采样。

这是一个如何使用fitMedia将图9.3中显示的采样放置在第一音轨上的快速示例。你可以从EarSketch库访问名为RD_UK_HOUSE_MAINBEAT_8的变量中的采样。我们想将这个采样放在第一个音轨的开始,然后延伸出四小节(图9.4)。

fitMedia(RD_UK_HOUSE_MAINBEAT_8, 1, 1, 5)

我们将在下面展示更详细的示例,但一旦你输入了程序,你就可以按RUN按钮将你的代码放入DAW中供你演奏。

9.3.2 makeBeat函数

如果你基于现有采样创建歌曲,你可能想添加你自己独特的节拍。或者也许你想添加自定义鼓填充以从一个歌曲部分过渡到另一个。makeBeat函数通过指定给定乐器的节奏作为文本字符串来创建鼓模式。EarSketch声音库包含大量一次性打击乐器采样,你可以与makeBeat一起使用以创建独特的鼓模式。makeBeat函数具有以下参数:

参数 描述
audio_file_name EarSketch库中的采样名——或——音频文件名的字符串
track_number 大于或等于1的整数值,指示将节拍模式放在哪个音轨上
start_measure 大于或等于1的小数值,指定模式的开始
rhythm_pattern 表示节拍模式的文本字符串。可以使用这些字符:“0”演奏采样一个16分音符;“-”休止一个16分音符;“+”必须跟随0并将采样延伸另一个16分音符

第四个参数rhythm_pattern描述音频将遵循的节奏模式。

rhythm_pattern字符串可以是任何长度,但16的倍数长度是最佳的,因为它们与一个小节的持续时间对齐。这是一个示例:

makeBeat(OS_SNARE03, 2, 1, "0---0+--0+++0000")

这采用名为OS_SNARE03的采样,并在第二音轨的第一小节上放置鼓模式。鼓模式由第一个拍上的16分音符、第二个拍上的8分音符、第三个拍上的四分音符和最后四个16分音符组成。这相当于TunePad中的以下代码:

playNote(snare, 0.25)
rest(0.75)
playNote(snare, 0.5)
rest(0.5)
playNote(snare, 1)
playNote(snare, 0.25)
playNote(snare, 0.25)
playNote(snare, 0.25)
playNote(snare, 0.25)

我们可以使用三行代码在EarSketch中为底鼓、小军鼓和踩镲创建基本的”四 on the floor”鼓节拍:

makeBeat(OS_KICK01, 1, 1, "0---0---0---0---")
makeBeat(OS_SNARE01, 2, 1, "----0-------0---")
makeBeat(OS_CLOSEDHAT01, 3, 1, "0+0+0+0+0+0+0+0+")

注意,由于构成我们节奏的乐器彼此重叠,我们必须将每个放在单独的音轨上。

9.3.3 EarSketch效果

一旦你掌握了将采样添加到DAW,有许多音频效果你可以使用称为setEffect的函数应用到音轨。这个功能的最基本形式将效果应用到给定音轨的整个长度。例如:

# 在第一音轨上应用延迟效果
setEffect(1, DELAY, DELAY_TIME, 250)

setEffect的更高级版本创建在特定时间开始和结束的动态效果。现在,这里是基本参数。你可以在EarSketch网站上阅读完整文档。

参数 描述
track_number 大于或等于1的整数值,指定将效果应用到哪个音轨。你还可以使用MIX_TRACK常量将效果应用到所有音轨。
effectType 指定效果类型的常量。它可以是以下值之一:BANDPASS, CHORUS, COMPRESSOR, DELAY, DISTORTION, EQ3BAND, FILTER, FLANGER, PAN, PHASER, PITCHSHIFT, REVERB, RINGMOD, TREMOLO, VOLUME, WAH
effectParameter 为给定效果设置哪个参数。有关更多细节,请参阅在线EarSketch文档。
effectValue 设置指定参数值的小数(浮点)数。

9.4 EarSketch中的循环

我们必须指定EarSketch中采样的开始和结束小节的事实在我们想要在歌曲的持续时间内多次重复采样时创造了一个有趣的问题。例如,假设你想要每小节演奏一次两拍采样。我们如何用Python代码优雅地做到这一点?一种解决方案是在Python for循环中使用循环变量。循环变量在循环的每次迭代中 updated,序列中的下一个数字。例如,这段代码段将打印数字2、3、4、5:

for v in range(2, 6):
    print(v)

注意我们的循环变量v从2开始,计数到(但不包括)range函数的第二个参数。使用循环变量的这个特性,我们可以让EarSketch示例仅用两行代码工作:

for measure in range(1, 5):
    fitMedia(SAMPLE, 1, measure, measure + 0.5)

在这个循环的第一次迭代中,measure的值是1,意味着我们的采样在小节1开始,在小节1.5结束。在下次迭代中,measure的值是2,我们的采样在小节2开始,在小节2.5结束。模式继续直到我们的循环完成迭代。

如果我们想更改我们的代码,以便采样仅每隔一个小节演奏?这意味着我们将以某种方式想出一种方法来按二计数而不是按一计数。range函数有一个可选的第三个参数,它指定我们的计数器在循环的每次迭代中增加的数量,这使得这种任务容易。在下面的示例中,我们设置一个称为skip_count的变量,我们可以用它来尝试不同的数字(例如,按三计数而不是按二)。skip_count变量用作我们对第2行上range函数调用的第三个参数:

skip_count = 2
for measure in range(1, 5, skip_count):
    fitMedia(SAMPLE, 1, measure, measure + 0.5)

9.5 使用歌曲结构编程

现在我们对在EarSketch中可以做什么有了粗略的概述,让我们稍微思考一下如何创建具有不同部分和结构的全长歌曲(如前奏-主歌-副歌-桥段)。在过去几章中,我们讨论了如何在Python中定义我们自己的函数作为创建可重用代码段的方式。用户定义函数也可以是关于歌曲结构思考的好方法。

第一步是为我们的歌曲收集材料。我们部分的持续时间会变化,但通常它将是四小节的倍数。假设我们想创建一个ABA形式的音乐作品。A部分开始我们的作品,然后是对比的B部分,最后回到A部分。让我们使用我们的”四 on the floor”鼓模式以及两个人声循环和几个贝斯线。这里是采样的完整列表:

  • 底鼓:OS_KICK01
  • 踩镲:OS_CLOSEDHAT01
  • 小军鼓:OS_SNARE01
  • 人声主唱:ENTREP_VOX_BK_FALSETTO
  • 人声和声:CIARA_SET_VOX_HOOK_HARMONY
  • 贝斯线1:ELECTRO_ANALOGUE_BASS_001
  • 贝斯线2:ELECTRO_ANALOGUE_BASS_009

现在我们已经有了歌曲的材料,我们可以将它们组装成ABA模式。这是完整的EarSketch脚本:

from earsketch import *

init()
setTempo(90)

### 部分A - 4小节 (1-4)
for bar in range(1, 5):
    makeBeat(OS_KICK01, 1, bar, "0---0---0---0---")
    makeBeat(OS_SNARE01, 2, bar, '----0-------0---')
    makeBeat(OS_CLOSEDHAT01, 3, bar, '0+0+0+0+0+0+0+0+')
    fitMedia(CIARA_SET_VOX_HOOK_HARMONY, 4, bar, bar+1) # 人声循环
for bar in range(1, 5, 2):
    fitMedia(ELECTRO_ANALOGUE_BASS_001, 5, bar, bar+2) # 贝斯

### 部分B - 4小节 (5-8)
for bar in range(5, 9):
    makeBeat(OS_KICK01, 1, bar, "0---0---0---0---")
    makeBeat(OS_SNARE01, 2, bar, '----0-------0---')
    makeBeat(OS_CLOSEDHAT01, 3, bar, '0+0+0+0+0+0+0+00')
    fitMedia(ENTREP_VOX_BK_FALSETTO, 4, bar, bar+1) # 人声循环
for bar in range(5, 9, 2):
    fitMedia(ELECTRO_ANALOGUE_BASS_009, 5, bar, bar+2) # 贝斯

### 部分A - 4小节 (9-13)
for bar in range(9, 13):
    makeBeat(OS_KICK01, 1, bar, "0---0---0---0---")
    makeBeat(OS_SNARE01, 2, bar, '----0-------0---')
    makeBeat(OS_CLOSEDHAT01, 3, bar, '0+0+0+0+0+0+0+0+')
    fitMedia(CIARA_SET_VOX_HOOK_HARMONY, 4, bar, bar+1) # 人声循环
for bar in range(9, 13, 2):
    fitMedia(ELECTRO_ANALOGUE_BASS_001, 5, bar, bar+2) # 贝斯

finish()

注意,当A部分重新出现时,代码几乎完全相同——唯一的区别是我们部分的开始和结束小节。代码的其余部分保持不变。每当你看到大量重复的代码时,你应该考虑创建函数或循环。记住你作为程序员的目标是提高可能简单和优雅的代码。让我们尝试编写将开始和持续时间值指定为参数的函数。函数内的循环从开始值迭代到开始+持续时间,总共持续时间迭代。这是使用函数的代码的修订版本:

from earsketch import *

init()
setTempo(90)

def section_a(start, duration):
    for bar in range(start, start+duration):
        makeBeat(OS_KICK01, 1, bar, "0---0---0---0---")
        makeBeat(OS_SNARE01, 2, bar, '----0-------0---')
        makeBeat(OS_CLOSEDHAT01, 3, bar, '0+0+0+0+0+0+0+0+')
        fitMedia(CIARA_SET_VOX_HOOK_HARMONY, 4, bar, bar+1)
    for bar in range(start, start+duration, 2):
        fitMedia(ELECTRO_ANALOGUE_BASS_001, 5, bar, bar+2)

def section_b(start, duration):
    for bar in range(start, start+duration):
        makeBeat(OS_KICK01, 1, bar, "0---0---0---0---")
        makeBeat(OS_SNARE01, 2, bar, '----0-------0---')
        makeBeat(OS_CLOSEDHAT01, 3, bar, '0+0+0+0+0+0+0+00')
        fitMedia(ENTREP_VOX_BK_FALSETTO, 4, bar, bar+1)
    for bar in range(start, start+duration, 2):
        fitMedia(ELECTRO_ANALOGUE_BASS_009, 5, bar, bar+2)

section_a(1, 4)
section_b(5, 4)
section_a(9, 4)

finish()

为什么使用函数的方法更好?它具有与我们尝试的第一个版本相同的最终结果。不同之处在于,如果我们想更改音符或节奏,我们只需要更改一次。如果我们想重新排序我们的部分,我们只需要更改单个函数调用。如果我们正在尝试调试错误,我们可以轻松地将错误隔离在一个函数中。带有函数的代码也更容易读,特别是在最后,我们正在排序歌曲部分时。

9.6 EarSketch的后续步骤

EarSketch有一个充满活力的在线社区以及广泛的文档和视频教程。我们鼓励你花一些时间探索平台,尝试一些示例项目,并制作你自己的音乐。这是在另一个上下文中应用你的Python编码技能甚至尝试另一种语言(如JavaScript)的好方法。玩得开心,看看你能创建什么!