A.13 確率的シーケンサーをコーディングする

# 確率的シーケンサーをコーディングする

このシリーズの前回の記事では、ランダム化の力を探求し、それがライブコーディングされたトラックやパフォーマンスに多様性や驚きや変化をもたらすのを示しました。例えば、ある音階からランダムにピックアップした音符で、終わりのないメロディーを作りました。今日は、ランダム化をリズムに適用した新しいテクニック、確率的ビートについて学びます。

## 確率

新しいビートやシンセのリズムを作り始める前に、確率に関する基本についてざっと見てみる必要があります。これは複雑で骨の折れるように聞こえるかもしれませんが、実際のところ、サイコロを振るのと同じくらい簡単です！ 普通の6面のサイコロを振ると何が起きるでしょうか？ そうですね。1, 2, 3, 4, 5, 6のいずれかが同じチャンスで得られるでしょう。実際、6面のサイコロであれば、（もしあなたが何度も何度も振れば）平均して6回に1回1の目が出るでしょう。これが1の目を出すのに1/6のチャンスがあることを示しています。Sonic Piでは、サイコロを振るのを`dice`関数でエミュレートできます。では8回サイコロを振ってみましょう：

```
8.times do
  puts dice
  sleep 1
end
```

ちょうど実物のサイコロを振ったのと同じように、1から6の間の値をログに表示していることに注目してください。

## ランダム・ビート

では、あなたの目の前にドラムがあって、それを叩こうとするときにいつもサイコロを振るのを想像してみてください。もしあなたが1の目を出したらドラムを叩き、それ以外の目を出したら叩かないとしましょう。これであなたは、1/6の確率で動作する確率的なドラムマシーンを手に入れたことになります！ どんな音がするか聞いてみましょう：

```
live_loop :random_beat do
  sample :drum_snare_hard if dice == 1
  sleep 0.125
end
```


全てが明確になるよう、各行をざっと見ていきましょう。最初に、`:random_beat`という名前を付けた`live_loop`を作って、`do`から`end`までの2行を繰り返しています。ループ内の最初の行は、`sample`を呼んであらかじめ録音された音（この場合は`:drum_snare_hard`の音）を再生しています。しかし、この行には特別な`if`の条件が末尾に付いています。これは、この行が`if`の右側の条件式が`true`であるときだけ実行されることを意味しています。この場合、条件式は`dice == 1`です。`dice`関数の呼び出しは、我々が既に見てきたように、1から6の値を返します。つづいて、等価演算子の`==`を使って、この値が`1`かどうかチェックしています。もし`1`であれば、この条件式は`true`となり、スネアドラムの音が再生され、`1`でなければ、この条件式は`false`となり、スネアドラムはスキップされます。ループ内の2行目は、次にサイコロを振る前に、単に`0.125`秒間待っているだけです。

## 確率を変更する

ロールプレイングゲームをプレイしたことがある人の中には、さまざまな範囲を持つ不思議なな形をしたサイコロに馴染みがあるかもしれません。たとえば、三角錐（正四面体）の形をした4面のサイコロや、正二十面体の形をした20面のサイコロがあります。サイコロの面の数はも1の目を出すチャンスや確率を変えます。面が少なければ、より1の目を出しやすくなり、面が多くなれば、より1の目を出しにくくなります。たとえば、4面のサイコロでは、1の目をだすのに1/4のチャンスがありますが、20面のサイコロでは、1の目をだすのに1/20のチャンスがあります。幸いにも、Sonic Piにはちょうどこれと同じことができる便利な`one_in`関数があります。次をやってみましょう：

```
live_loop :different_probabilities do
  sample :drum_snare_hard if one_in(6)
  sleep 0.125
end
```

上のライブループを開始すると、馴染みのあるランダムリズムを聞くことができるでしょう。しかし、実行されているコードを止めないでください。そのかわり、`6`を異なる値、たとえば`2`とか`20`に変更して、`Run`ボタンを叩いてみてください。小さい数字はスネアドラムがより頻繁に再生され、大きい数字はスネアドラムがあまり頻繁に再生されないということを意味しているのに注目してください。これであなたは確率で音楽を作っていることになるのです！

## 確率を組み合せる

複数のサンプルが異なる確率でトリガーされるのを組み合せると、本当に刺激的になります。例えば：

```
live_loop :multi_beat do
  sample :elec_hi_snare if one_in(6)
  sample :drum_cymbal_closed if one_in(2)
  sample :drum_cymbal_pedal if one_in(3)
  sample :bd_haus if one_in(4)
  sleep 0.125
end
```

もう一度、上のコードを実行して、リズムを変更するために確率を変更してみてください。また、試しにサンプルを変更してみると、全く新しい感覚を生み出すでしょう。例えば、低音を追加するために、試しに`:drum_cymbal_closed`を`:bass_hit_c`に変更してみてください！


## 再現可能なリズム

次に、我々にはすっかりお馴染みの`use_random_seed`を使って、8回の繰り返しの後に、ランダム・ストリームをリセットすると、規則的なビートを作ることができます。次のコードをタイプして、より規則的で再現可能なリズムを聞いてみましょう。一度ビートを聞いたら、シードの値を`1000`から別なものにしてみましょう。異なる数字が異なるビートを生成することに注目してください。

```
live_loop :multi_beat do
  use_random_seed 1000
  8.times do
    sample :elec_hi_snare if one_in(6)
    sample :drum_cymbal_closed if one_in(2)
    sample :drum_cymbal_pedal if one_in(3)
    sample :bd_haus if one_in(4)
    sleep 0.125
  end
end
```

この種の構造で私がよくやるのは、よい感じの音がしたらシードを記録しておくことです。それにより、後で練習したりパフォーマンスしたりするときに、簡単にそのリズムを再生成することができます。

## まとめ

最後に、よい感じのメロディーを提供するランダムなベースを入れることができます。我々が新しく発見した確率的なシーケンスの方法は、サンプルと同じようにシンセに対しても同様に使用可能です。このコードをそのままにせずに、数字を操作して、確率の力であなた自身のトラックを是非作ってください！

```
live_loop :multi_beat do
  use_random_seed 2000
  8.times do
    c = rrand(70, 130)
    n = (scale :e1, :minor_pentatonic).take(3).choose
    synth :tb303, note: n, release: 0.1, cutoff: c if rand < 0.9
    sample :elec_hi_snare if one_in(6)
    sample :drum_cymbal_closed if one_in(2)
    sample :drum_cymbal_pedal if one_in(3)
    sample :bd_haus, amp: 1.5 if one_in(4)
    sleep 0.125
  end
end
```
