Sonic Piで ネオクラシカルメタル系のフレーズを作ってみた。

## これは何？
過去に音楽系の記事をいくつか書いているのですが、最近 Sonic Pi というコードベースで音楽を作成できるツールを知ったので、少し遊んでみました。

過去書いた音楽系の記事:
[Rubyでクラシカルなアルペジオを作ってみた](https://qiita.com/inukai-masanori/items/a400eff611723dc88813)
[Scratch でジングルベルを演奏してみた](https://qiita.com/inukai-masanori/items/f9adc6be2f17e00bfc1f)


## [Sonic Pi](https://sonic-pi.net/) とは
Rubyをベースにした記法で音楽を作成できるツールで、プログラミングや音楽の勉強などにも使われいるそうです。

DLはこちらから → https://sonic-pi.net/


## 画面の説明
![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/c082411d-37fb-a2ed-a67a-11a05e47eed6.png)

左上がコードの入力になっており、Rubyをベースにした記法で音楽を鳴らす命令を書いていく部分となります。
左下には、いくつかのタブが用意されていて詳しくは下記になります。
- **Turtorial**
    - Sonic Pi の使い方が詳しく書いてあります
- **Examples**
    - すぐにそれっぽい音が鳴らせるようなサンプルプログラムが紹介されています。
        - 選んだものを画面左上のコード入力欄にペーストして再生することで確認ができます。
- **Synths**
    - 音を鳴らすための楽器の種類が紹介されています。
    - 実際に音階を奏でる場合にはこちらから何かしら一つの楽器を選ぶ必要があります。
- **Fx**
    - SynthsやSamplesの音を加工するためのエフェクターが紹介されています。
- **Samples**
    - 音のサンプルがいくつか紹介されています。楽器とは違い、音階を決めずにそのまま鳴らすものというイメージです。効果音というのが正しい表現かもしれません。
- **Lang**
    - コードの記法についてのドキュメントが記載されています。


## ドラムパターンの作成

### まずは曲のテンポを決めます
`use_bpm`という命令で、曲のテンポを指定できるので、`use_bpm 180`と入力します。

![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/38543c2b-207f-06ab-3b27-29ad46e14d6f.png)


### バスドラムを設定します
![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/b7c16814-c106-7820-9e09-ff4ccf6c9091.png)

SamplesのDrum Soundsの中にある `:drum_heavy_kick`　を使用します。
※▶︎で音を確認できます。


メタル系のフレーズを作りたいので、バスドラムは16部音符でまるでツーバスのような感じで連打します。
Samplesの中にある音を再生させるには、`sample :drum_heavy_kick`　とします。

一旦書いてみたコードがこちら
```ruby
loop do
  sample :drum_heavy_kick
  sleep (1.0/4)
end
```

繰り返し構文と`Sleep`という次の音を何拍後に鳴らすかという命令を組み合わせて作成しています。
今回は 16部音符で鳴らしたいので、1拍の4分の1としています。


### スネアドラムを設定します
![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/b12e3e99-58ec-f50f-7ca8-3755ae7b1226.png)
SamplesのSnare Drumsの中にある `:sn_zome`　を使用します。

スネアドラムは2拍目と4拍目で鳴らすのが一般的なので、先に`Sleep`を挟みながら処理を書きます。

```ruby
loop do
  sleep (1.0)
  sample :sn_zome
end
```

### ライドシンバルを設定します
SamplesのDrum Soundsの中にある `:drum_cymbal_soft`　を使用します。

ライドシンバルは各拍の頭で鳴らすのが一般的なので、バスドラムと似たような形で処理を書きます。

```ruby
loop do
  sample :drum_cymbal_soft 
  sleep (1.0)
end
```

### ドラム全体を合わせてみる
それぞれの設定が終わったので、一度再生ボタンを押してみますが、バスドラムの音しか鳴りません。
プログラムは基本的には上から下に順番に実行されるので、一番上のloop構文が無限ループしており、スネアに到達していません。

そこでSonic Piに用意されている `live_loop` という命令を使います。
`live_loop`は各ループを同時に鳴らしてくれます。


なので、各 `loop`命令を`live_loop`に置き換えていきます。
※`live_loop`には名前が必要なので合わせて設定していきます。

```ruby
live_loop :drums_k do
  sample :drum_heavy_kick
  sleep (1.0/4)
end

live_loop :drums_s do
  sleep (1.0)
  sample :sn_zome
end

live_loop :drums_h do
  sample :drum_cymbal_open 
  sleep (1.0)
end
```

これでドラムパターンは完成です。
とても激しいドラムの音が聞こえてきたかと思います。


## アルペジオパターンの作成

ネオクラシカルといえば、アルペジオを主体としたフレーズが多く使われるので、メインとなるアルペジオを作成していきます。


### 音色を設定します
![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/487e2552-379f-660f-f9dd-d3223423113f.png)

Synthsの中にある `:piano`　を使用します。
(色々とそれっぽい音を探してみたのですが、いまいち合うものがなかったので、大人しくピアノの音色を使うことにしました)

Synths の音を鳴らす場合には、`use_synth :piano`をいう感じに音を鳴らす前に宣言する必要があります。

```ruby
use_synth :piano
# 音階を書いていく
end
```

### 音階を設定します

折角なので、[Rubyでクラシカルなアルペジオを作ってみた](https://qiita.com/inukai-masanori/items/a400eff611723dc88813#%E6%BC%94%E5%A5%8F%E5%87%A6%E7%90%86%E3%82%92%E6%9B%B8%E3%81%8F)で使用したアルペジオを再利用します。

音階を鳴らすためには `play note(symbol_or_number)`を使います。
前回作成したアルペジオは6音で１パターンとしていたので、今回はドラムパターンとリズムが合うように３連符で設定してきます。

```ruby
use_synth :piano
play :E3
sleep (1.0/3)
play :A3
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :E4
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :A3
sleep (1.0/3)
...
```

## ドラムパターンとアルペジオを合わせて完成

繰り返し回数なども調整しつつ、実際に完成したのがこちらになります。
![スクリーンショット 2023-06-19 17.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/e9e2a052-dca6-8b77-3248-f9c97bf2c626.png)

```ruby
use_bpm 180

live_loop :drums_k do
  sample :drum_heavy_kick
  sleep (1.0/4)
end

live_loop :drums_s do
  sleep (1.0)
  sample :sn_zome
end

live_loop :drums_h do
  sample :drum_cymbal_open
  sleep (1.0)
end

live_loop :arpeggio do
  use_synth :piano
  4.times do
    play :E3
    sleep (1.0/3)
    play :A3
    sleep (1.0/3)
    play :C4
    sleep (1.0/3)
    play :E4
    sleep (1.0/3)
    play :C4
    sleep (1.0/3)
    play :A3
    sleep (1.0/3)
  end
  4.times do
    play :D3
    sleep (1.0/3)
    play :G3
    sleep (1.0/3)
    play :B3
    sleep (1.0/3)
    play :D4
    sleep (1.0/3)
    play :B3
    sleep (1.0/3)
    play :G3
    sleep (1.0/3)
  end
  4.times do
    play :C3
    sleep (1.0/3)
    play :F3
    sleep (1.0/3)
    play :A3
    sleep (1.0/3)
    play :C4
    sleep (1.0/3)
    play :A3
    sleep (1.0/3)
    play :F3
    sleep (1.0/3)
  end
  4.times do
    play :B2
    sleep (1.0/3)
    play :E3
    sleep (1.0/3)
    play :Ab3
    sleep (1.0/3)
    play :B3
    sleep (1.0/3)
    play :Ab3
    sleep (1.0/3)
    play :E3
    sleep (1.0/3)
  end
end
```

## 音源
https://youtu.be/771wgZJAyxQ


## 最後に
Rubyを使ったことがある人であれば、比較的スムーズにコードで音楽が作れるので、普通に楽しかったです。
また、用意されている音源やより高度な命令も用意されているので、コードベースでかなり本格的な音楽も作成できそうだなと思いました。

音楽を作りながら、プログラムの基本的な構文やアルゴリズムの勉強もできるので、教育現場でもかなり役立ちそうに思いました！