编辑鼓组-进阶篇

上一节介绍了简单的鼓组写法。但在实际应用时,单独为一个鼓创建一组列表显得有些冗余,所以这次尝试使用单独一组列表,把想写的鼓尽可能都放进一个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有更多上场机会。

results matching ""

    No results matching ""