包络,随机数与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)

至此,你的数值由波谷刚走到波峰。

但我们还希望它从山顶回来,这就用到操作数列的两个点方法,mirrorreflect

(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

results matching ""

    No results matching ""