RubyでHipHopする ~ Sonic Piのチュートリアル後の遊び方 ~


これは [リクルートライフスタイル Advent Calendar 2018](https://qiita.com/advent-calendar/2018/recruitlifestyle) の13日目の記事です。

バックエンドエンジニアをやっている@pchatsuです。
今回は、個人的趣味の話で恐縮ですが、Rubyで書けるプログラマブルなシーケンサ＆ライブパフォーマンスツール[Sonic Pi](https://sonic-pi.net/)について書きます。
難しい技術の話は出てこないので、アドベントカレンダー折返し地点の箸休めにどうぞ。

## Sonic Piとは何か
簡単にいうと、Rubyのコードで作曲やライブ演奏ができるソフトウェアです。
百聞は一見に如かず。以下の動画を見てみてください。
Daft PunkのAround the worldをSonic Piで**プログラミングした**動画になります。
https://www.youtube.com/watch?v=7W4yTXsTavQ

また
https://vimeo.com/132813228
こんな感じでライブ演奏の楽器としても使えます。

実行環境は
https://sonic-pi.net からダウンロードできます。

## チュートリアルについて
すでにいろいろな方が記事を書いているようです。ドットインストールもありました。

* https://qiita.com/santa_sukitoku/items/6585a84eeb01d2b8d3a3
* https://dotinstall.com/lessons/basic_sonicpi

Sonic Piをダウンロードすると同梱されているチュートリアルがかなりよくできていて、さらに日本語翻訳も充実しているので、まず最初にやることをおすすめします。

## チュートリアルを終えたら...

本家チュートリアルでも口酸っぱく言われているように

> 間違いはない、あるのはただ可能性だけ 

とあるように完全に自由なのですが、今回は個人的におすすめの楽しみ方を紹介したいと思います。

##　メロディーを楽しむ
私の音楽理論の知識はほぼ[関ジャム完全燃SHOW](https://www.tv-asahi.co.jp/kanjam/)という番組から仕入れているので、専門家には程遠いですが、
簡単な約束事だけでそれっぽい曲やメロディーに聞こえるパターンがあるのでやってみましょう。

### 沖縄音階
`C E F G B C` ドミファソシド と弾くと沖縄っぽい響きになります。
これを利用して、ランダムにメロディーを決めてやると、沖縄風BGMを作曲することができます。

```ruby
use_bpm 90

live_loop :melody do
  use_synth :pluck
  okinawan_scale = [:C4, :E4, :F4, :G, :B, :C5]
  play okinawan_scale.choose
  sleep 1
  play okinawan_scale.choose
  sleep 0.5
  play okinawan_scale.choose
  sleep 0.5
  play okinawan_scale.choose
  sleep 1
  play okinawan_scale.choose
  sleep 1
end

live_loop :drums do
  drumline
end

define :drumline do
  sample :bd_fat, amp: 3
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
  sample :bd_fat, amp: 3
  sample :sn_zome, amp: 0.7
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
end
```

##　リズムを楽しむ
ループが主体のジャンルである、HOUSE, EDM, HipHopはSonic Piと相性がよく、簡単にそれっぽい雰囲気になるので、チュートリアルから次に進むのによいお題だと思います。

さきほど例にあげた、Daft PunkのAround the worldのコードを写経してドラムとベースを抜き出して見ましょう。
先程の演奏動画のコードは
https://github.com/luiscript/SonicPi-Music/blob/master/songs/Daft%20Punk%20-%20Around%20the%20world.rb
にアップされています。

### ４つ打ち

```ruby

use_bpm 128

live_loop :base do
  funkyBaseline
end

live_loop :drum do
  drumline
end

define :funkyBaseline do
  with_fx :lpf, cutoff: 80 do
    play_pattern_timed [:e2, :d3, :e3, :e2, :d3, :e2, :d3, :e2, :d3, :e3, :c2, :c3, :c2, :c3, :c2, :b1, :b1, :a2, :b2, :g2],
      [0.5, 0.5, 0.5, 0.5, 0.5, 0.25, 0.5, 0.25, 0.25, 0.25, 0.5, 0.5, 0.25, 0.25, 0.5, 0.25, 0.5, 0.25, 0.5, 0.5],
      release: 0.0 , sustain: 0.3
  end
end

# 何かうわものを追加していく
live_loop :melody do
  4.times do
    play sample :guit_e_slide
    sleep 8
  end
end


define :drumline do
  sample :bd_fat, amp: 3
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
  sample :bd_fat, amp: 3
  sample :sn_zome, amp: 0.7
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
end
```

このコードにうわもののシンセを好きに足してあげるだけで、なんちゃって４つ打ちEDMとして遊べます。
余談ですが、EDMのテンポは、コンピュータで扱いやすいからなのか、BPM=128が基本になっていておもしろいです。

### HipHop
個人的に一番好きなジャンルです。

[アーメンブレイク](https://matome.naver.jp/odai/2145795935693621401)という一番オーソドックスなビートのループは


```ruby

use_bpm 90

live_loop :beat do
  sample :loop_amen, beat_stretch: 4
  sleep 4
end

live_loop :scratch do
  sleep 15
  2.times do
    sample :vinyl_scratch, beat_stretch: 0.5
    sleep 0.5
  end
end
```

で簡単に書けるので、これもいろいろと音を重ねていって楽しめます。

あるいは、先程使ったDaft Punkのドラムを改変して、ちょっとHipHopっぽくして見るのも良かったです。
スネアのタイミングを少しずらしていって、心地よいと感じるグルーブ感を探ってみるというのをやってみたのですが、これがなかなかおもしろかったのでおすすめです。

```ruby

use_bpm 90

live_loop :base do
  funkyBaseline
end

live_loop :drum do
  drumline
end

define :funkyBaseline do
  with_fx :lpf, cutoff: 80 do
    play_pattern_timed [:e2, :d3, :e3, :e2, :d3, :e2, :d3, :e2, :d3, :e3, :c2, :c3, :c2, :c3, :c2, :b1, :b1, :a2, :b2, :g2],
      [0.5, 0.5, 0.5, 0.5, 0.5, 0.25, 0.5, 0.25, 0.25, 0.25, 0.5, 0.5, 0.25, 0.25, 0.5, 0.25, 0.5, 0.25, 0.5, 0.5],
      release: 0.0 , sustain: 0.3
  end
end

define :drumline do
  laid_back = 0.01
  sample :drum_cymbal_closed, amp: 0.7
  sample :bd_fat, amp: 4
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.25
  sample :bd_fat, amp: 4
  sleep 0.25
  sample :drum_cymbal_closed, amp: 0.7
  # スネアを少しジャストからずらす
  sleep laid_back
  sample :sn_zome, amp: 0.7
  sleep 0.5 - laid_back
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.25
  sample :bd_fat, amp: 4
  sleep 0.25
  sample :drum_cymbal_closed, amp: 0.7
  # スネアを少しジャストからずらす
  sleep laid_back
  sample :sn_zome, amp: 0.7
  sleep 0.5 - laid_back
  sample :drum_cymbal_closed, amp: 0.7
  sleep 0.5
end
```

## まとめ
今回はSonic Piの紹介と、チュートリアル後のおすすめの楽しみ方を紹介しました。
本当に簡単なので、ぜひ実際に鳴らして遊んで見てください！