无限音乐生成器(上)
看完重轻老师关于Ableton live的rack插件教程,对自动填充和弦进行的程序意犹未尽,所以非常想用代码的方式复现一遍教程里实现的音乐插件生成功能。
https://www.bilibili.com/video/BV1pg4y1B7yj?from=search&seid=101604192617649041
原视频教程发布在B站,‘音乐生成器’简言之就是规定好所在调内的根音与和弦级数的进行模式之后,程序会帮你自动补齐和弦。最终生成的和弦片段又被分配到不同乐器轨道里,按照不同的演奏模式最终组合成完整的音乐。因为和弦可以被随机分配,每次生成的乐曲和上一次都有些许差异,所以才会被称为“无限音乐生成器”吧。
视频里介绍的RACK插件是LIVE里的大杀器,使用套娃技巧很有启发性。怼插件的好处就是,明明midi clip里什么都没有写,程序已经把内容自动填好了。所以,live技术向玩家的终极形态也许就是live set轨道里白茫茫一片,但是打开效果链一看内有乾坤。
简言之,你听到的东西都是程序补充的,作者给电脑的指示只有一个大纲或是大致的框架。
这就是用程序代劳的方便之处。毕竟我还是喜欢聪明偷懒的好办法,所以这次想用sonic pi重写一遍,视频教程【根音】轨道里,插件在做的事。
首先,假设你想写一首C大调的歌,那么先把调内所有音列出来,以便之后使用和弦插件在根音上堆叠。C大调一级到七级和弦的根音是C到B。
#######define scale##########
current_scale = 'Cmajor_scale'
if current_scale =='Cmajor_scale'
note = scale(:C3,:major)
elsif current_scale == 'Cminor_scale'
note = scale(:C3,minor)
end
在这里,列表note储存调内所有的音。如果想切换大小调,只需要修改current_scale的标签就OK了。在这个例子暂时只用大调。
之后,你需要为一到七级和弦定义一个和弦集合。在同一级数的和弦内,备选的和弦都有可能被演奏出来。
I II III IV V VI VII
root C D E F G A B
major7 minor7 minor7 major7 major7 minor7 diminished
major9 minor9 minor9 major9 major9 minor9 dim7
dom7 minor13 minor13 dom7 dom7 minor13
madd(11) madd(13)
之后依照这张表格,在程序里也做出一模一样的表格。
#######define chord collection########
I = [(chord note[0],:major7),(chord note[0],:maj9),(chord note[0],:dom7)]
II = [(chord note[1],:minor7),(chord note[1],:m9),(chord note[1],:m13)]
III = [(chord note[2],:minor7),(chord note[2],:m9),(chord note[2],:m13)]
IV = [(chord note[3],:major7),(chord note[3],:maj9),(chord note[3],:dom7)]
V = [(chord note[4],:major7),(chord note[4],:maj9),(chord note[4],:dom7)]
VI = [(chord note[5],:minor7),(chord note[5],:m9),(chord note[5],:m13)]
VII = [(chord note[6],:diminished),(chord note[6],:dim7)]
每一级和弦各是一个列表。Note[n]代表了和弦的根音,‘:’后面是和弦名称。
sonic pi编辑器会为你自动补齐音名,所以即便不查文档也能轻松输入常见和弦。这样,聚齐所有你要使用的和弦列表就完成了。
只要你输入和弦进行,就可以准备演奏了。
########## define chord progression ######
chordProgression=(ring I,VI,II,V)
像这样定义和弦进行,常规的1-6-2-5。但在这里我使用的不是列表,而是ruby特有的数据结构ring。其优势在于和弦可以无限循环播放。如果是列表,放完一遍就会报错,所以乐谱还是用ring写比较牢靠。
###### play #####
n = chordProgression.length
live_loop :chordProgression_test do
use_random_seed 10300
play chordProgression.tick.choose
sleep 1
end
最后循环播放你‘设计’的乐章!
因为和弦选择是随机的,所以需要用use_random_seed把自己喜欢的组合固定下来。具体填哪些数不重要,关键是能遇见自己满意的和弦进行就OK。
chordProgression.tick.choose是执行播放和弦的指令。有语法糖加持,语句变得简洁不少。在这里我们不光按照1-6-2-5的顺序播放和弦,也在各级和弦里随机选出一个和弦来播放。
Sleep 1 意味着每个和弦的长度是一拍。
到这里,‘无限音乐生成器’的基本和弦框架就搭好了。至于其它轨道的设置,音色的选择,段落,bpm之类的功能追加,请参见下节。
完整代码
默认音色是beep,祝你玩得开心!
#######define scale##########
current_scale = 'Cmajor_scale'
if current_scale =='Cmajor_scale'
note = scale(:C3,:major)
elsif current_scale == 'Cminor_scale'
note = scale(:C3,minor)
end
#######define chord collection########
I = [(chord note[0],:major7),(chord note[0],:maj9),(chord note[0],:dom7)]
II = [(chord note[1],:minor7),(chord note[1],:m9),(chord note[1],:m13)]
III = [(chord note[2],:minor7),(chord note[2],:m9),(chord note[2],:m13)]
IV = [(chord note[3],:major7),(chord note[3],:maj9),(chord note[3],:dom7)]
V = [(chord note[4],:major7),(chord note[4],:maj9),(chord note[4],:dom7)]
VI = [(chord note[5],:minor7),(chord note[5],:m9),(chord note[5],:m13)]
VII = [(chord note[6],:diminished),(chord note[6],:dim7)]
########## define chord progression ######
chordProgression=(ring I,VI,II,V)
###### play #####
n = chordProgression.length
live_loop :chordProgression_test do
use_random_seed 10300
play chordProgression.tick.choose
sleep 1
end