ランダム性のある電子音楽をRubyで作る

本記事は [iCARE Advent Calendar](https://qiita.com/advent-calendar/2020/icare) 2020 の18日目です。

# 音楽をRubyで書く
「音楽作ってました！」「DAW触ってます！」
これはエンジニア界隈では本当にあるあるだと思います。なぜでしょう 笑
自分もその一人で、エレクトロニカやIDMと言われるジャンルの曲を作っています。

さて、皆様は**[Sonic Pi](https://sonic-pi.net/)**をご存知でしょうか。
このツールを使えばRubyで音楽が作れるということを知り試したところ、すごく面白くて便利なツールだと感じました。
そしてこの記事は**これだけ抑えておけばSonic Piでそれっぽいものが作れるよ**というものです。

# Sonic Pi
上記の通り、Sonic Piをダウンロードして使用します。
概要についてはQiitaで検索すればいろいろと出るので詳しい紹介はしませんが、
この環境でRubyを書き、実行することで音を奏でることができます。
![スクリーンショット 2020-12-15 20.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358229/37993f22-dae6-d01e-e14d-10995161bd16.png)


# Sonic Piは電子音楽向き
電子音楽や実験音楽は綿密に計算された楽曲よりも、意図的に偶然を生んで生成した音を利用した楽曲が多いように感じます。
妙な立体感、不思議な音、ぐちゃぐちゃなのに心地良いリズム、ノイズなど、、
そしてSonic Piはそんなランダム性のある音を簡単に生成してくれます。
最高です。はい。

# グリッチなビートを作ってみた
グリッチとは
> デジタル装置のエラー、そのために生じるノイズ、またはそれらを利用して作品を制作する手法のこと。この手法は1990年代半ばの音楽に現われ、偶発的で小さな欠陥を意味する「グリッチ」という語で呼ばれ始める。
https://artscape.jp/artword/index.php/%E3%82%B0%E3%83%AA%E3%83%83%E3%83%81

## 環境構築・基本動作
本記事では省略します。
[こちらの記事](https://qiita.com/miyoshi_613/items/6c75e6d9c72759fbd713)に細かく書かれていれるので、気になる方はどうぞ。
とても分かりやすくまとめられています。

## ソース

```ruby
# 四つ打ちのキック
live_loop :kick do
  use_bpm 60
  sample :bd_haus, rate: 0.8, release: 0.4, amp: 0.5
  sleep 1 # 1拍休む
end

# 上とずらして同様のキックを打つ
live_loop :kick2 do
  sleep 0.75
  sample :bd_haus, rate: 0.5, amp: 0.7
end

# アンビエンスなもわっとした音で雰囲気をつくる
live_loop :ambi_dark do
  sample  :ambi_dark_woosh, rate: 0.5, finish: 0.2
  sleep 0.5
end

# パーカッション
live_loop :perc do
  # ディストーションエフェクトをかける
  with_fx :distortion do
    sample :glitch_perc1, rate: 0.2, finish: 0.05, amp: 0.05
    sleep 1.5
  end
end

# パーカッション２
live_loop :perc2 do
  # rateをランダム化して1再生ごとの表現を変える
  sample :glitch_perc5, rate: rrand(0.1, 1.5), amp: 0.1, slice: 0.1
  sleep 0.125
end

```

## 解説
やっていることは単純で、
1. サンプルを選ぶ
2. rateを設定する
3. amp, releaseなどの調整
4. 肝となる要素にrrandを設定する
くらい。

### サンプルを選ぶ
Sonic Piはデフォルトで多くの音サンプルを用意しており、
`sample hoge`とするだけで簡単にサンプルを呼び出すことができます。

### rate
rateは音の速度を変更できます。
1が標準の長さ、0.5にすると音は標準の半分の速度で再生されます。
半分の速度で再生されるとゆっくりになるのはもちろん、音程も低くなります。
グラスをお箸で叩くと`チーン`と鳴りそうですが、

```ruby
sample :chine, rate: 0.1
```
とすれば`じいいいいぃぃぃぃぃぃぃぃぃぃぃぃぃぃんんんん`と鳴るでしょう。
またマイナスの値を設定すると電子音楽家の大好物、逆再生になります。

```ruby
sample :chine, rate: -1
```
`んんんぅぅぅぅぃぃぃぃいいい↑↑`
といった感じでしょうか。表現が下手ですみません。
シンバルをrate: -1すればリバースシンバルになるイメージです。

音色や音程を一気に変えてくれるrateオプション、素晴らしいです。

### amp, release
ampは音量です1が標準、0.5にすると半分の音量になります。
releaseは俗にいうADSR(Attack, Decay, Sustain, Release)のReleaseで、減衰音を指します。
余韻に近いでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358229/36ef9bff-af25-1419-9ada-c031b8d3c716.png)

上のソースの最初のところで、releaseを0.4に設定しています。
グリッチ感を出す他の要素の邪魔をしないためにも、余韻を減らして切れ味の良いキックを目指しました。

```ruby
# 基本のキック
live_loop :kick do
  use_bpm 60
  sample :bd_haus, rate: 0.8, release: 0.4, amp: 0.5
  sleep 1 # 1拍休む
end
```

### 肝となる要素にrrandを設定する
名前から察することができるように、rrandオプションで設定した数値をランダム化することが可能です。
ソースの最後、パーカッション２のrateで使用しています。

```ruby
# パーカッション２
live_loop :perc2 do
  sample :glitch_perc5, rate: rrand(0.1, 1.5), amp: 0.1, slice: 0.1
  sleep 0.125
end
```
`rate: rrand(0.1, 0.5)`とすることで1小節でループする度に0.1から0.5の間の数値をランダムにセットしてくれるようになります。
こうすることでそれぞれの小節で音に変化を与えられる・・・
つまり**機械的な単調な音から生きた音に昇華**することができます。
最高です。

## ソースを実行した結果
1分ほど録音し、soundcloudにアップしました。（イヤホン推奨）
https://soundcloud.com/tenten1105/sonic_pi-beat

我ながらなかなか良いものができたと思います！
なんとSonic Piは録音機能もついていて、実行したデータをその場ですぐwavで書き出してくれるところも素敵です。

# あとがき
あれだけのコードでここまでできるSonic Piは本当に素晴らしいです。

今回はsampleを使用しましたが、自身のDAWで作成したデータや環境音を録音したものを使用してrrandで加工後、DAWに戻して制作なんてことも勿論できます。
可能性は無限大ですね！
ありがとう、Ruby。ありがとう、Sonic Pi。