一、节奏及节奏复杂度
音乐包含节奏、曲调、和声三大要素,然而要怎么精确的定义“节奏”,却不是一件容易的事,有人说节奏是拍子结构上的一种变化,有人说节奏包括了音乐中所有与时间相关的因素,而知名的音乐学家 Curt Sachs 曾经这样形容“节奏”这个词,“没有广泛被接受的意义”。
二、作曲中的节奏表示法
目前一共有四种节奏表示法,前面两种是以原本音乐的表示法,也就是以平常所见的乐谱上的形式来呈现,后面两种则是在分析节奏是较常使用到的方式,去除了原本音符的长度,只留下音符出现的时间点。
第一种方式是音乐当中最熟悉、最常见的表现方式。以五线谱的方式来表示节奏,只有一个小节拍号为 4/4,因为加上了反复记号,所以会重复一遍,最小的单位是十六分音符所以会将此小节切成十六等分。第二种方式通常是使用在打击乐器上,同样是乐谱的表示方式。比起五线谱,少了音高的表示,只是很单纯的表示出节奏。但在打击乐器中,乐器所发生的声响只有一瞬间,实际上是无法表示出音符长度的,所以可以将原本音符的长度去掉,只留下发生声音的那个时间点,其余的位置由休止符补上。第三种方式是音乐学家 James Koetting 在研究非洲复节奏时所提出的表示法 box notation,这样的表示法取代了传统乐谱,以图像化的方式清楚地表现出节奏的模样,比起乐谱更适合用在节奏复杂度上,其中“x”标示着发出声音的点,也就是音符开始的位置,而原本没有声音的位置,也就是休止符所在的点,则由“?”标示。最后一个表示法以计算机科学的方式来表示,在只有 0 跟1 的计算机的世界,将先前的 box notation 转换成为二元表示法,以 1 代替“x”标示着发出声音的点,以 0 代替“?”标示休止符所在的点,这样的表示法可以最直接的使用在计算机程序上,在此篇论文中,系统实践时就是以这样的表示法在进行。
三、作曲中的节奏复杂度分析实践
在上述四种复杂度的基础上,我们将原来 Metric 对于复杂度的定义,加上前面所提及应用在不同拍号以及不规则节奏的延伸定义,在系统实践当中,以 Music XML 作为输入的格式,按照拍号把每个小节切割出来,再按照指定的基础单位,建立所有点的权重,因为 Metric 必须以同样 onset 个数的权重总和最大值作为基准相减,所以分别必须算出每个小节的 onset 个数,再按照先前建立好的权重找出最大总和,如果没有不规则节奏,则按照此权重算出每个小节的复杂度,如果在节奏当中发现不规则节奏,则调整权重,按照调整后的权重算出复杂度。
拍号上方的数字代表的是一个小节有几拍,称为 beat count,在系统当中可以接受所有整数的 beat count,拍号下方的数字代表的是音符时值,也就是以何种单位当作一拍,称为 beat unit,在此系统当中只能接受二的幂次方为音符时值,虽然也是有以非二的幂次方作为 beat unit 的音乐作品,但其实这样的拍号与音乐节奏,是可以调整而成以二的幂次方作为 beat unit 的样子,所以我们没有实践非二的幂次方作为 beat unit 的拍号在此系统当中。其中预设的拍号有六种 beat count,我们将simple 以及compound 两种拍号的 metrical hierarchy 定义在程序里面。如果使用者输入这六种以外的拍号,则会要求使用者自行定义 metrical hierarchy,如果使用者希望将预设的拍号重新定义,也可以按照输入的 metricalhierarchy 去建立权重。
在系统当中,所有的权重都以 0 为最大值作为最高阶层的数值,以下的阶层则以负数表示,以方便在出现不规则节奏时,找到最小阶层的权重值往下减一,如果按照原来 Metric 的正数阶层,在碰到不规则节奏需要设定下一阶层的权重值的时候,则会需要将所有权重值往上加一,因为 Metric 是算出与最简单节奏也就是权重总和最大值的差,所以只要阶层之间的相对位置没有被改变,正数负数并不影响结果。
四、作曲中的节奏产生方法
上述实践系统除了将乐曲分析节奏复杂度以外,也实践了以节奏复杂度为基础的节奏产生方法,将一个复杂度的数值反过来产生出一小节的节奏,以 Metric 复杂度定义为基础,让使用者指定拍号、基础单位以建立权重,指定 onset 个数、输入复杂度,建立出最简单节奏也就是权重总和最高、复杂度最低的节奏,然后以移动 onset 使其复杂度增加,直到符合指定的复杂度,另外也可选择加入不规则节奏,提高复杂度。
就节奏产生的步骤而言,假设我们要产生出一个拍号 4/4、基础单位为十六分音符、小节里面一个有六个 onset 的节奏,第一步,首先我们找出权重值当中六个最大的数值,第一个一定是0 所在的位置也就是第一拍,第二个是-1 所在的位置也就是第三拍,然后第三个与第四个则是第二拍与第四拍,权重为-2 的两个位置,接着剩下两个,我们从下一层-3 当中随机选出两个点,于是将 onset 都放上这些点的位置,成为了复杂度为 0 的最简单节奏。建立了最简单的节奏之后,再按照输入的复杂度,去移动 onset 的点,符合我们所指定的复杂度值。以复杂度 3 为例子:首先,我们随机指定一个 onset 的点,假设我们找到了权重-3 的这个位置,然后移动到-4 这个位置,我们的复杂度就变成了 1;进而,我们再随机指定一个 onset 的点,假设我们找到了权重-2 的这个位置,然后移动到同样是-4 的另一个位置,复杂度就变成了 3。这样一来,就可产生出符合我们所指定的复杂度的节奏。有一点需要特别注意的,如果设定了某些拍子会有不规则节奏产生时,我们会从调整过的权重去寻找最简单的节奏,但此时所建立出来的最简单节奏的复杂度值,有可能不是 0。