製作一首歌曲

添加隨機化

好樣的!你的歌曲已經有了穩定的節拍和低音並且跟主旋律配合良好了。下面我們要做的能釋放出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