无限音乐生成器(上)

看完重轻老师关于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

results matching ""

    No results matching ""