Sonic Pi でペンタトニックスケールを扱う（和音/単音、ランダムな要素を使う）

以下の記事で使ってきた Sonic Pi の話です。

- [Node.js で発生させた乱数で自動で音を鳴らす（Sonic Pi に OSC通信でデータを送信して音を出す） - Qiita](https://qiita.com/youtoy/items/25c923e9747b21ed6283)
- [Sonic Pi による音の出力を Node.js のプログラム（osc.js を利用）から制御： OSC over UDP による通信 - Qiita](https://qiita.com/youtoy/items/a158b847b142f0a134a6)
- [Sonic Pi でのいろいろな音の鳴らし方についてのメモ（自分用まとめ その1） - Qiita](https://qiita.com/youtoy/items/f82d2c350bc60a4e5816)
- [Sonic Pi でのいろいろな音の鳴らし方についてのメモ（自分用まとめ その2） - Qiita](https://qiita.com/youtoy/items/98fa180433eca747f63b)

その中でペンタトニックスケールを扱ってみます。

## ペンタトニックスケールについて
自分は音楽関連は詳しくないので、説明は以下のサイトなどに譲ります。
これを使おうとした理由は、ランダムに鳴らした音が良い感じに聞こえるようにしたい、というものです。

- [ペンタトニック・スケールとは - 8monji-guitar.com](https://www.8monji-guitar.com/%E3%82%AE%E3%82%BF%E3%83%BC%E6%95%99%E5%89%87/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB/%E3%83%9A%E3%83%B3%E3%82%BF%E3%83%88%E3%83%8B%E3%83%83%E3%82%AF-%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AF/)
- [メジャーペンタトニックスケール【エレキギター博士】](https://guitar-hakase.com/337/)

## Sonic Pi と ペンタトニックスケール
### ペンタトニックスケールを扱う方法
Sonic Pi では `:major_pentatonic` などという指定ができるものがあるようです。

アプリでも見られる公式チュートリアルの 8.3 に以下の記載があります。
![スケール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b4f8c4c0-64e0-9bb6-452c-84a2b1d4eb7c.jpeg)

その前の 8．2 に以下の記載などもありますが、単純に和音として鳴らすなら以下のような形になるようです。

![和音.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bed74784-323b-2ea0-704c-4a89fc9c0261.jpeg)

試しにループやスリープを含め、以下のようにしてみました。
単純に一定間隔で和音が鳴るだけ、のものになります。

```ruby
loop do
  play scale(:c, :major_pentatonic)
  sleep 1
end
```

`num_octaves` を組み合わせた形も試してみました。

```ruby
loop do
  play scale(:c, :major_pentatonic, num_octaves: 3)
  sleep 1
end
```

### ランダムに音を選んで鳴らす

こちらは、スリープの時間を半分にして、ランダムに 1音ずつ選んで鳴らすものです。

```ruby
loop do
  play choose(scale(:C, :major_pentatonic, num_octaves: 3))
  sleep 0.5
end
```

`use_synth` と組み合わせてみました。

```ruby
use_synth :tb303
loop do
  play choose(scale(:C, :major_pentatonic, num_octaves: 3))
  sleep 0.25
end
```

`use_bpm` も使ってみたものです。

```ruby
use_bpm 120
use_synth :tb303
loop do
  play choose(scale(:C3, :major_pentatonic, num_octaves: 3))
  sleep 0.25
end
```

### ランダムに音を選んで鳴らす2
さらに別パターンも試してみます。
`play_pattern_timed`  を使ったバージョンです。

```ruby
loop do
  use_octave [1, 2, 3].choose
  play_pattern_timed scale(:c3, :major_pentatonic), 0.125, release: 0.1
  sleep [0.25, 0.25, 0.5].choose
end
```

```ruby
use_bpm 80
use_synth :tb303
loop do
  use_octave [1, 2, 3].choose
  play_pattern_timed scale(:c3, :major_pentatonic, num_octaves: 2), 0.125, release: 0.1
  sleep [0.25, 0.25, 0.5].choose
end
```

### ランダムに音を選んで鳴らす2
`live_loop` や `amp` 、 `cutoff` なども使ってみます。

```ruby
use_bpm 80

live_loop :mp do
  use_synth :tb303
  use_octave [1, 2].choose
  play choose(scale(:C, :major_pentatonic, num_octaves: 2)), amp: rrand(0.3, 0.4), cutoff: rrand(60, 100)
  sleep [0.25, 0.25, 0.5].choose
end

live_loop :mp2 do
  use_synth :tech_saws
  play choose(scale(:C, :major_pentatonic)), amp: rrand(0.5, 0.7), cutoff: rrand(60, 120)
  sleep 0.25
end
```

最後のものは、動かしてみた時の様子を動画にしてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">使い方を少しずつ学ぶため触ってた Sonic Pi、<a href="https://twitter.com/akichika?ref_src=twsrc%5Etfw">@akichika</a> さんに音を作る話というので聞いたペンタトニックスケールを使うやり方を調べたり、Sonic Pi のチュートリアル等を見たりなどしてランダムな要素を盛り込む方法を調べたりして、<br>ひとまずこんな感じのものが出来上がった！ <a href="https://t.co/tbX3FVsAAW">pic.twitter.com/tbX3FVsAAW</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1462110439031123979?ref_src=twsrc%5Etfw">November 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

改良の余地はいろいろあると思うのですが、音楽・作曲とかが全く分からない自分が 10行ちょっとのコードを書いただけで、こんな感じの音が出来上がるのは面白いと感じました。

## 参考情報（後からも、いくつか追加）

●メロディーを鳴らす
　https://sonic-pi.mehackit.org/exercises/ja/01-introduction/02-play-a-melody.html
![メロディーを鳴らす.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c85d249e-8f2d-fd81-e9ed-dfdbf473a767.jpeg)

●Class: SonicPi::Scale — Documentation for samaaron/sonic-pi (main)
　https://www.rubydoc.info/github/samaaron/sonic-pi/SonicPi/Scale
![ペンタトニック_scale.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/000c5cdd-8b9a-43bb-4782-3f3e349a2fbf.jpeg)

●tick
　https://sonic-pi.mehackit.org/exercises/ja/04-generate-sounds/02-tick.html

```ruby
live_loop :arp do
  play (scale :e3, :minor_pentatonic).tick, release: 0.1
  sleep 0.125
end

live_loop :arp2 do
  use_synth :dsaw
  play (scale :e2, :minor_pentatonic, num_octaves: 3).tick, release: 0.25
  sleep 0.25
end
```

●変数
　https://sonic-pi.mehackit.org/exercises/ja/04-generate-sounds/03-variables.html

上記の改変版1

```ruby
live_loop :melody do
  use_synth :blade
  r = [0.25, 0.25, 0.5, 1].choose
  play (scale(:C, :major_pentatonic, num_octaves: 2)).choose, attack: 0, release: r
  sleep r
end
```

上記の改変版2

```ruby
live_loop :bass do
  use_synth :fm
  n = (scale :C, :major_pentatonic).tick
  3.times do
    play n
    sleep 1
  end
  play n
  sleep 0.5
  play (scale :C, :major_pentatonic).tick
  sleep 0.5
end
```

```上記の改変版3
live_loop :bass do
  use_synth :fm
  r = [0.25, 0.25, 0.5, 1].choose
  n = (scale :C, :major_pentatonic, num_octaves: 2).tick
  play n, attack: 0, release: r
  sleep 0.35
end
```