イテレーション(反復)とループ

以前に我々は、playsampleのブロックで、様々な音を作り出せることを見てきました。また、sleepを使うことで、これらの音を時間に沿って再生する方法も学びました。

これらの基本的なブロックを使用することで多くの楽しさがあることを理解してもらえたのではないでしょうか。しかし、音楽を作るための強力なコードを学べば、その楽しさの次元はまた新しい段階に向かうでしょう。次のいくつかのセクションではパワフルな新しいツールを探っていきます。はじめに「イテレーション(反復)とループ」を学びます。

リピート

何回か繰り返しを行うためにはどのようにコードを書いたらよいでしょう? 例えばこのようなコードです。

play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25

これを3回繰り返したい場合、どうしたら良いでしょう? 単純に考えればコピーして貼り付けを3回繰り返せば可能です。

play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25

ちょっと長過ぎますよね。もしサンプルを:elec_plipに変更させたい場合、どうしたら良いでしょうか? 3か所全部の:elec_blup をひとつひとつ変えなくてはいけません。さらに重要なことですが、繰り返しが50回とか1000回になったとしたらどうでしょう? 変更したいコードがすごくたくさんになってしまいます。

イテレーション(反復)

コードの繰り返しは、これを3回やってと言うくらい簡単に出来るべきだし、実際のところ簡単に出来ます。先ほど学んだコードブロックを思い出してください。3回繰り返したいコードのブロックには「始まり」と「終わり」が記されていますね。そんな時にこの特別なコードである3.timesを使いましょう。同じコードを3回繰り返す代わりに、3.timesを書くことで、とても簡単に出来るようになります。その時にコードの最終行にendを書き入れることも忘れないようにしましょう。

3.times do
  play 50
  sleep 0.5
  sample :elec_blup
  sleep 0.5
  play 62
  sleep 0.25
end

コピーと貼り付けを繰り返すより、ずっと美しいコードになったと思いませんか? このようにブロックを使うと、沢山の繰り返しの構造を作ることが出来るのです。

4.times do
  play 50
  sleep 0.5
end
8.times do
  play 55, release: 0.2
  sleep 0.25
end
4.times do
  play 50
  sleep 0.5
end

イテレーション(反復)のネスティング(入れ子)

繰り返しの中にさらに繰り返しを入れることによって面白いパターンを作ることが出来ます。例えば

4.times do
  sample :drum_heavy_kick
  2.times do
    sample :elec_blip2, rate: 2
    sleep 0.25
  end
  sample :elec_snare
  4.times do
    sample :drum_tom_mid_soft
    sleep 0.125
  end
end

ループ(終わりのない繰り返し)

もしすごくたくさんの繰り返しをしたい場合、1000.times doのようにすごく大きな数値の繰り返しをさせることになってしまいます。こういった場合は、おそらく(stopボタンを押すまで)無限に繰り返す機能がほしいと思うでしょう。さあ、アーメン・ブレイクのサンプルを無限にループさせてみましょう。

loop do
  sample :loop_amen
  sleep sample_duration :loop_amen
end

loopについて知っておかなくてはならない重要な点は、これはコードの中でブラックホールのように動いてしまう点です。一度loop機能が動いてしまうと、stopボタンを押さない限り永遠に再生されるということです。つまり、これはloopより後ろにあるコードを絶対に聞くことが出来ないということを意味しています。例えば、下の例で言うと、シンバルの音はloopより後ろにあるため、決して再生されることはありません。

loop do
  play 50
  sleep 1
end
sample :drum_cymbal_open

さあ、これで回数を指定するイテレーション(反復)と永遠に繰り返すループのコーディング方法を理解することができましたね!