包络,随机数与LFO
电子音乐的机械感是与生俱来的。使用程序生成音乐,听起来多少都会有很浓重的机器味道。如果想弱化这种印象,可以借助包络,随机数,LFO,让声音往富有变化的方向上改造。
接下来介绍一些简单但非常有效的控件,活用它们能让你马上获得更自然的效果。
手动设置包络
创建列表并填入具体数值,效果类似手绘包络线
比如手动设置鼓的力度变化
list = (ring 0.3,0.5,0.7,0.4)
live_loop :drums do
sample :glitch_perc5, amp: list.tick
sleep 0.25
end
如法炮制效果器包络
env=(ring 0.5,0.3,0.2,0.1)
define :bitLead do |note|
#8bit lead: tune phase
with_fx :reverb do
with_fx :slicer, phase: env.tick do
use_synth :beep
play note: note, amp: 1 ,release: 0.25
end
end
end
prg=(ring 0,2,4,5)
live_loop :lead do
bitLead chord(:C3+prg.tick(:chord),'m7')
sleep 0.5
end
个人推荐 把包络数列写在define之前,即表明这是全局可以访问的数列。当然你也可以把数列写进live_loop与Function里,效果虽然相同,但会增加CPU负担。
define :bitLead do |note|
env=(ring 0.5,0.3,0.2,0.1)
#8bit lead: tune phase
with_fx :reverb do
with_fx :slicer, phase: env.tick do
use_synth :beep
play note: note, amp: 1 ,release: 0.25
end
end
end
live_loop :lead do
prg=(ring 0,2,4,5)
bitLead chord(:C3+prg.tick(:chord),'m7')
sleep 0.5
end
这种情况下,每次loop或调用function时,数列env,prg又被重新创建一遍。
下面的紧凑写法也OK:
live_loop :lead do
bitLead chord(:C3+(ring 0,2,4,5).tick(:chord),'m7')
sleep 0.5
end
但太紧凑的代码不一定好读,所以我还是会把数列单独写出来。
随机数
随机数控制Hihat力度
live_loop :drums do
sample :drum_cymbal_closed, amp: rand(0.25..1)
sleep 0.125
end
rand()内设置随机数的范围,机械死板的印象立刻消失。
另外,也能用随机数控制音色。下面例子里的amb_pad 音色分别对attack,release,filter设置随机数,会出现很有意思的效果。
define :amb_pad do |the_chord|
use_synth :saw
with_fx :reverb ,mix: 0.9 do
the_chord.each do |note|
play note, attack: rand(0.05), release: rand(3..4), cutoff:rand(30..65), amp: 0.5
end
end
end
live_loop :pad do
prg=(ring 0,2,4,5)
amb_pad chord(:C3+prg.tick(:chord),'m7')
sleep 2
end
类似LFO的控件
对我来说,LFO一种好用的参数控件,可以加在你想调整的任何一种参数上(其实也要看不同vst是否支持)。max4live的LFO插件我很爱用,可视化界面非常方便使用。
用代码的方法也可以模拟LFO,虽然没有波形可选,但听起来效果和LFO很相近。
你首先需要设定一下最大最小值,步长。
(range -1,1,0.25)
# (ring -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75)
之后数值由最小值走到最大值,至于走多久才到,是由步长决定的。越大的步长步数越少,设定的标准取决于你希望一个周期横跨多少小结。
与range类似的还有line方法,它可以直接指定步数。加了inclusive: true以后,最大最小值都能顾及到。
(line -1,1,steps: 5, inclusive: true)
#(ring -1.0, -0.5, 0.0, 0.5, 1.0)
至此,你的数值由波谷刚走到波峰。
但我们还希望它从山顶回来,这就用到操作数列的两个点方法,mirror与reflect。
(line-1,1,steps: 5, inclusive: true).mirror
#(ring-1.0, -0.5, 0.0, 0.5, 1.0, 1.0, 0.5, 0.0, -0.5, -1.0)
(line -1,1,steps: 5, inclusive: true).reflect
#(ring-1.0, -0.5, 0.0, 0.5, 1.0, 0.5, 0.0, -0.5, -1.0)
Mirror会把数列原本最后一个值重复两遍,而reflect不会。你可以听听看再决定用哪个,最后别忘了加.tick遍历整个数列。
这是应用LFO以后的效果,只是循环周期有点长:
define:bitLead do |note|
#8bit lead: tune phase
with_fx :reverb do
with_fx :slicer, phase: (range 0.4,0.05,0.025).mirror.tick(:lfo) do
use_synth :beep
play note: note, amp: 1 ,release: 0.25
end
end
end
prg=(ring 0,2,4,5)
live_loop:lead do
bitLead :C6+prg.tick(:chord)
sleep 0.5
end