编辑Drum Loop
本节将介绍loop的简单编程方法。
播放Drum Loop采样
Sonic pi 内置多种风格的drum loop采样,我们来播放一个内置loop听听看
sample :loop_compus
冒号后是采样名称,当你输入:loop_后稍等,会出现loop下存储的多个采样,你可以随意挑选一个自己中意的loop
为了循环播放,我们将上面的指令放进live_loop
播放时长2小结一个循环(8拍)
live_loop :drum do
sample :loop_compus
sleep 8
end
但实际播放时发现好像有些混乱,原因是采样本身的速度与现在的默认速度有出入。所以需要将:loop_compus的长度拉伸到当前8拍的长度,所以用到了beat_stretch. 这个指令与ableton 里sample warp有些类似。
use_bpm 120
live_loop :drum do
sample :loop_compus, beat_stretch:8
sleep 8
end
现在你可以通过修改use_bpm自由修改loop速度。但是因为速度提升,鼓的音调也会升高,这就和磁带快进时的声音效果是一样的。
编辑Pattern
分析pattern
下面的pattern是要用代码打出的一段鼓
Kick X - - - X - - - X - - - X - - -
Snare - - - - X - - - - - - - X - - -
Hihat X - X - X - X - X - X - X - X -
这个网格状表格是3X16大小的。每行分别代表底鼓,军鼓,镲片三种乐器。16列表示它有1个小节,每小节4拍,而每拍又能均分成四份(四分音符)。4X4构成16步,是音序器最常见的界面
从图像看镲片的节奏最密集,其次是底鼓,最后是军鼓,但是每一轨/行各自间隔是不变的。所以我们用程序表示这段节奏时,关键在于设定每个乐器被触发的时间间隔。
代码鼓手的第一步
基础的节奏都是以底鼓为参照的,所以底鼓一拍一次,那么相应的军鼓就是两拍一次,镲片一拍两次。
程序使用sleep指令数拍,
Sleep 1 = 1拍
那么节奏应该这样表示
Kick: sleep 1
Snare: sleep 2
Hats: sleep 0.5
有了这个草稿,我们先找到各轨道的采样,之后按照这个时间间隔来播放。
底鼓:sample :drum_bass_hard
军鼓:sample :drum_snare_hard
镲片:sample :drum_cymbal_hard
但是加入sleep 后,每一条采样都是按顺序播放,而不是同时播放
sample :drum_bass_hard
sleep 1
sample :drum_snare_hard
sleep 2
sample :drum_cymbal_hard
sleep 0.5
原因是程序会一条一条读取。除非你将三组乐器分配到3组平行的轨道里,才能实现同时播放。
知道原因后,我们就创建3个不同的live_loop,把上面的代码分别放进来吧。
use_bpm 120
live_loop :kick do
sample :drum_bass_hard
sleep 1
end
live_loop :snare do
sample :drum_snare_hard
sleep 2
end
live_loop :hats do
sample :drum_cymbal_hard
sleep 0.5
end
将use_bpm 120 升高至140,你会发现节奏确实加快了。
但并不会像播放loop那样,提升乐器的音调。
初步编辑节奏与力度
自己设定节奏制作loop真的很简单。如果想更进一步,你可以试着改变镲片的节奏,比如像这样:
live_loop :hats do
sample :drum_cymbal_hard
sleep [0.75,0.5].choose
end
sleep [0.75,0.5].choose会随机选择0.75或0.5的时值。也就是说,有可能一拍打两次镲,也有可能在一拍的3/4位置打镲。
live_loop :hats do
sample :drum_cymbal_hard, amp:rrand(0.8,1)
sleep [0.75,0.5].choose
end
或者模仿真实鼓手的效果,使镲的声音听起来更自然。
在音量amp上添加范围在(0.8,1)的随机数。如果在ableton live, 相同的操作是挂上random velocity的插件。但是sonic pi播放采样时并没有将其视作MIDI,所以我就简单粗暴的修改了音量。也许还会存在其他的方法,比如修改filter数值。但不论是哪种操作,都会用到随机数。
最终完整代码
use_bpm 120
live_loop :kick do
sample :drum_bass_hard
sleep 1
end
live_loop :snare do
sample :drum_snare_hard
sleep 2
end
live_loop :hats do
sample :drum_cymbal_hard, amp:rrand(0.8,1)
sleep [0.75,0.5].choose
end