
咳咳,大家好!还是我,(不能踢的猫X) 本尼桑√~
今天我们将要讲日系流行里的一个不错的转调公式,即下全音转调~
这一次的教程会分为两部分:
(1)跟之前一样的乐理讲解
(2)用python scripting 实现的代码讲解
那么,我们开始吧~
第一部分:乐理性讲解
三重下全音转调:(Fmaj7 --> Cmaj9/E )--> (Ebmaj7 --> Bbmaj9/D )-->( Dbmaj7 --> Abmaj9/C )--> Bbm7add4 --> Gadd4 -->G7 -->Cmaj
废话不多说,咱们上视频先:
知乎视频www.zhihu.com原位:
知乎视频www.zhihu.com首先,何为下全音转调? 其实就是字面意思,1转到下面一个全音,也就是b7,b7转到b6以此类推。(这种转调循环到最后会回到第一个调上,所有转过的调性会构成全音阶,即:1,2,3,b5,b6,b7)
咱们还是做个功能图先:

这个和声走向有趣的地方在于,他连续重复了三次4-->3,不过是在三个以一个全音相隔的调上。然后最后的bA调通过voice leading的方式转回一开始的C大调。
那么这个和弦走向是怎么来的呢?下面就给大家讲解~
首先我们获得一个简单的不能再简单的43251~
Fmaj7 --> Em7 --> Dm7 --> G7 -->Cmaj7
好的很无聊,我们想延长43这俩'意犹未尽和弦'的感觉,咱们就暴力复制粘贴弄出个434343251,即:
(Fmaj7 --> Em7 )-->(Fmaj7 --> Em7 )-->(Fmaj7 --> Em7 )--> Dm7 --> G7 -->Cmaj7
听起来没那么有意思... 呜,用上下全音转调,得到43↓43↓43251!
(Fmaj7 --> Em7 )-->(Ebmaj7 --> Dm7 )-->(Dbmaj7 --> Cm7 )--> Dm7 --> G7 -->Cmaj7
其实这时候已经可以用了,不过我们还可以再让他有意思一点,咱们把倒数第三个PD功能的Dm7,转为在bA调里同为二级PD功能的Bbm7,即:
(Fmaj7 --> Em7 )-->(Ebmaj7 --> Dm7 )-->(Dbmaj7 --> Cm7 --> Bbm7 )--> G7 -->Cmaj7
最后咱们为了voice leading考虑,加上转位和add4延留音,就能弄出个这个:
Fmaj7 --> Cmaj9/E )--> (Ebmaj7 --> Bbmaj9/D )-->( Dbmaj7 --> Abmaj9/C )--> Bbm7add4 -->( Gadd4 -->G7) -->Cmaj
看到这里的朋友,点击左下角给个赞吧~
第二部分:算法作曲讲解(optional)
身为程序员,咱们发现个规律,就是这个转调可以给你4-->3 感觉的同时无限进行下去!
于是咱们可以用代码实现这个这个逻辑特征,最后可以得到一个这样的和弦走向的字符串表达式:
其中C是和弦走向;x,y,z 是单个和弦;
为了能无线循环,我根据voice leading给钢琴和弦乐设置了两个seed pattern,钢琴的seed循环十六次;弦乐是nested loop,它的seed先循环三次seed然后再提高个octave,最后再外面循环4次于钢琴同步。最后我再加上设计好的coda pattern,最后再parse到daw,效果是这样:
知乎视频www.zhihu.com规则实例化部分代码:
(在这里打个小广告,我和 @矮木矮木诶 正在编写一个python开源库,名为pydaw,预计今年下半年上线。这段代码是基于这个库实现的~)
import mido
import pydaw as daw
import my_pattern_lib as pattern
class Infinity_Transposition_Composition:
def __init__(self):
self.bpm = 130
self.meter = 4
self.score = generate_score(bpm,meter)
playback(self.score)
def playback(self):
daw.playback(score)
def generate_score(self):
# one for piano, one for strings
track = [daw.empty_track() for i in range (2)]
#=================================
# Piano generation for first 16 bars
#=================================
# lowest key in this pattern first beat is G5
cur_pos_piano = 67
# number of subsequent occuerence of the piano pattern
iter_time_piano = 16
for i in range(iter_time_piano):
track[0] = track[0].append(pattern.piano_meta_seed_1, cur_pos_piano) # append at the last note position
cur_pos_piano -= 2 # transpose down 2, which is a whole tone interval
#=================================
# Strings generation for first 16 bars
#=================================
cur_pos_strings = 43
# number of subsequent occuerence of the strings pattern
iter_time_strings = 4
for i in range(iter_time_strings):
internal_iter_time = 3
for j in range(internal_iter_time):
track[1] = track[1].append(pattern.string_meta_seed_1,cur_pos_strings)
cur_pos_strings -= 2 # transpose up 4, which is a Major 3rd interval
cur_pos_strings += 13 # transpose up a 9th
track[1] = track[1].append(pattern.string_meta_seed_2,cur_pos_strings) # add different
# Coda generation qwq
track[0] = track[0].append(pattern.piano_coda_1, pattern.keys.default())
track[1] = track[1].append(pattern.string_coda_1, pattern.keys.default())
return track
if __name__ == "__main__":
my_song = Infinity_Transposition_Composition()
my_song.playback()
那么我们下次再见~