条件文

ランダムな音符を再生する(前章参照)だけでなく、あるコードとそれとは別なコードの実行をランダムに決めたくなるかもしれません。例えば、ドラムとシンバルをランダムに再生したいような場合です。このような場合、if文を使うことで実現できます。

コイントス

それではコインをトス(投げる)してみましょう。もしもコインが表であればドラムを鳴らし、裏であればシンバルを鳴らします。簡単ですね。コイントスの機能はone_in という機能(ランダムのセクションで紹介しています)によって実現されます。2つのうちの1つというように条件を細かく指定するときにはone_in(2)と記述すると、ドラムを鳴らすコードとシンバルを鳴らす2つのコードどちらかを決められるようになります。

loop do
  if one_in(2)
    sample :drum_heavy_kick
  else
    sample :drum_cymbal_closed
  end
  
  sleep 0.5
  
end

if文は3つのパートを持っていることに注目してみましょう。

典型的なプログラム言語では、概ね、真(正しいという意味)をtrueで表現し、偽(正しくない場合)はfalseと表記します。そのため、先の例でone_inが行っているような、truefalseか答えることができる質問が必要となります。

はじめの選択では ifelseの間に挟まれたプログラムが実行され、そして2番目の選択ではelseendの間が実行されるということに注目しましょう。それは複数行のコードをまとめるdo/endブロックにとても似ていますね。例えば、

loop do
  if one_in(2)
    sample :drum_heavy_kick
    sleep 0.5
  else
    sample :drum_cymbal_closed
    sleep 0.25
  end
  
end

sleep 0.5sleep 0.25など、異なる休符時間を持つ場合、そのどちらかに応じることになります。

シンプルなif(if修飾子)

時には、任意のコードを1行だけ実行したいときがあるでしょう。これはifと条件を後ろに記述することで可能です。例えば、

use_synth :dsaw
loop do
  play 50, amp: 0.3, release: 2
  play 53, amp: 0.3, release: 2 if one_in(2)
  play 57, amp: 0.3, release: 2 if one_in(3)
  play 60, amp: 0.3, release: 2 if one_in(4)
  sleep 1.5
end

上のコードでは、それぞれの音符が持つ別の確率によって、異なる数のコード(和音)を奏でるでしょう。