制作一首歌曲

添加随机化

好样的!你的歌曲已经有了稳定的节拍和低音并且跟主旋律配合良好了。下面我们要做的能释放出Sonic Pi的真正潜力。在轨道上添加一些生成元素,我们能用编程让计算机为我们作曲!

掷骰子并移调

移调意味着向上或向下改变音高。我们可以偶尔将旋律移调来增添曲子新鲜感。你可以掷骰子来决定什么时候来让曲调上扬。下面是举例:

live_loop :melody do
  if one_in(6)
    use_transpose 2
  else
    use_transpose 0
  end
  play_pattern_timed [:c4, :e4, :f4, :g4, :f4, :e4, :f4, :g4, :f4, :e4, :f4], [0.25, 0.25, 0.25, 1.5, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], attack: 0, release: 0.2
end

创建一个随机酸贝斯音轨

让我们给低音循环加点料。.choose是一种非常顺手的方法,用来从列表中随机挑选一个元素。就像这样:

play [:c, :e, :g].choose

[:c, :e, :g]是一串音符(此情况下音符是C大调和弦)。.choose指令会随机选取音符。其他内容也可以随机选取,比如sleep的数值:

loop do
  use_octave [0, 1].choose
  play [:c, :e, :g].choose
  sleep [0.25, 0.25, 0.5, 1].choose
end

你都不需要记得你在哪个和弦里写了什么音符。Sonic Pi你能帮你搞定一切。你可以用(chord :C, :major)来替代[:c, :e, :g]。这样就能自动生成一串正确的音符。例如:

loop do
  play (chord :c, :major).choose
  sleep [0.25, 0.25, 0.5, 1].choose
end

把这个神奇的方法用在低音音轨上看看能创造出什么奇迹。保存你的作品然后把现在的:bass循环复制到另一个缓存上,以防你还想回到原处。接着给新的低音音轨腾出位置并删除循环里面的内容。我们用古典:tb303合成器在C大调和弦里演奏随机的十六分音符。

live_loop :bass do
  use_synth :tb303
  play (chord :C2, :major).choose
  sleep 0.25
end

哎呀,好像哪里不对。在play指令末尾加上参数release:0.125,像这样试试:

live_loop :bass do
  use_synth :tb303
  play (chord :C2, :major).choose, release: 0.125
  sleep 0.25
end

这就好多了嘛,尽管我们还有点删减要做。到现在为止你已经在play指令里运用了attack:release:参数。还有很多参数可以根据你的合成器来添加。 例如tb303合成器就有45个可调选项。我们现在给低音音轨添加cutoff指令。Cutoff能把所有不在范围内的频率清除。可以输入的数值范围在0-130间。

设定随机数值时别只是用固定的cutoff数值。还可以用rrand(min, max)指令来划定数值范围。赶快试试!

live_loop :bass do
  use_synth :tb303
  play (chord :C2, :major).choose, release: 0.125, cutoff: rrand(60, 110)
  sleep 0.25
end

太太太太棒了!时刻记得多多尝试和探索。下面是一个总结举例,可以给你一个大概的前进方向:

use_bpm 120

live_loop :drums do
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
  sample :drum_heavy_kick
  sleep 1
  sample :drum_snare_hard
  sleep 1
end

live_loop :hihat do
  sample :drum_cymbal_closed
  sleep 0.25
  sample :drum_cymbal_pedal
  sleep 1
end

live_loop :bass do
  use_synth :tb303
  play (chord :C2, :major).choose, release: 0.125, cutoff: rrand(60, 110)
  sleep 0.25
end


live_loop :melody do
  if one_in(6)
    use_transpose 2
  else
    use_transpose 0
  end
  play_pattern_timed [:c4, :e4, :f4, :g4, :f4, :e4, :f4, :g4, :f4, :e4, :f4], [0.25, 0.25, 0.25, 1.5, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], attack: 0, release: 0.2
end