编辑鼓组-进阶篇
上一节介绍了简单的鼓组写法。但在实际应用时,单独为一个鼓创建一组列表显得有些冗余,所以这次尝试使用单独一组列表,把想写的鼓尽可能都放进一个ring里。这样的写法方便将多个轨道合并到一起浏览。在乐器之间没有重叠的情况下,应该能应对大部分pattern。
编辑两组音色
如果是两组音色,可以直接使用0或1表示他们的pattern,之后遍历这个列表。
在读取pattern时,需要条件语句if / else区分这两组情况。
live_loop :drums do
if bools(0,0,1,0, 1,0,1,0 ,0,0,1,0, 1,0,0,0)[tick]
sample :elec_blip
else
sample :elec_flip
end
sleep 0.25
end
机器在这里把1,0看做是与否的条件判断,根据情况触发预先定好的sample。
这里统一时值都是0.25,也就是四分之一拍。
编辑三组音色
在三组音色的情况下,我们分别用0,1,2表示pattern
之后用条件句规定0,1,2分别会触发哪些sample
如果像之前一样,只分出两种情况,条件句if/else就够用。
如果是三种或三种以上的情况,除了头与尾写作if与else,就会出现elsif这个奇怪的写法,在ruby里elsif特别不容易写对。因为其它语言里会写作else if 或elseif。
不过这些琐事你都不必介意,只要看到他们就能明白这是用来区分不同状况的标志。
在if flag == XX 分别填入你想使用的sample,并且确认序号就可以了。
use_bpm 90
pattern=(ring 2,0,1,2, 1,1,2,0, 2,0,1,2, 1,1,2,0)
live_loop :drumsNew do
flag = pattern.tick
puts flag #打印当前flag
if flag == 0
sample :elec_flip,amp: 0.5
elsif flag ==1
sample :elec_blip,amp: 0.5
elsif flag ==2
sample :elec_beep,amp: 0.5
end
sleep 0.25
end
程序运行过程中,当前会被演奏出来的鼓的序号,会在右侧console打印出来。
你可以靠打印结果验证是不是自己预先设定的结果。
之后在听的过程中修改pattern就能很快得到你想要的结果。
之前都统一设定了时值0.25。
但你也可以分别为不同sample设定时值,比如像这样:
use_bpm 90
pattern=(ring 2,0,1,2, 1,1,2,0, 2,0,1,2, 1,1,2,0)
live_loop :drumsNew do
flag = pattern.tick
if flag == 0
sample :elec_flip,amp: 0.5
sleep 0.25
elsif flag ==1
sample :elec_blip,amp: 0.5
sleep 0.5
elsif flag ==2
sample :elec_beep,amp: 0.5
sleep 0.25
end
#sleep 0.25
end
但同时问题也出现了,那就是你不一定能保证loop始终保持统一长度。
修改pattern后loop时长也会改变。
如果对loop长度有要求,那么pattern长度由16改为32,统一sleep 0.125,手动编写带切分的pattern更可行。
编辑随机音色
假设在有一段节奏里,你不希望在某一拍使用相同的音色,可以试着在条件句里添加随机选择音色的指令。
在这里以写好的两个鼓音色preset为例。音色参数都已经打包进function,所以不用管里面写了什么,直接在代码里喊出他们各自的名字drumDown和drumUp,音色就能被召唤出来
define :drumDown do
with_fx :distortion, distort: 0.1, mix: 0.3 do
with_fx :lpf, cutoff: 26 do
with_fx :hpf, cutoff: 55 do
drum = play 36, amp: 40, release: 0.5, note_slide: 0.5
control drum, note: 30
end
end
end
end
define :drumUp do
with_fx :distortion, distort: 0.1, mix: 0.3 do
with_fx :lpf, cutoff: 23 do
with_fx :hpf, cutoff: 55 do
drum = play 36, amp: 70, release: 0.5, note_slide: 0.5
control drum, note: 40
end
end
end
end
把两个function粘贴在你要写的live_loop之前,这样你稍后召唤function时,计算机就能回溯前文并找到他们。
接下来我们先试着召唤drumDown
非常短的pattern(1,1,0, 1), 程序捋到1时就能听到drumDown,其它时候播放sample
live_loop :drums do
if bools(1,1,0, 1)[tick]
drumDown
sleep 0.5
else
sample :elec_flip
sleep 0.5
end
end
之后我希望pattern(1,1,0, 1),捋到1时,drumDown, drumUp
都有机会被触发,便用到了one_in(2)
live_loop :drums do
if bools(1,1,0, 1)[tick]
if one_in(2)
drumDown
else
drumUp
end
sleep 0.5
else
sample :elec_flip
sleep 0.5
end
end
one_in(2)让 drumDown, drumUp二者有均等机会上场
if one_in(2)
drumDown
else
drumUp
end
类似的指令还有one_in(3)..one_in(100)
one_in(3)时,1/3的概率触发drumDown
2/3的概率触发drumUp
因此drumUp比drumDown有更多上场机会。