Sonic Pi でのいろいろな音の鳴らし方についてのメモ（自分用まとめ その1）

以下の記事を書くときにも使った [Sonic Pi](https://sonic-pi.net/) について、音の鳴らし方の情報をシンプルに自分用にまとめたくて書いた記事です。

- [Sonic Pi による音の出力を Node.js のプログラム（osc.js を利用）から制御： OSC over UDP による通信 - Qiita](https://qiita.com/youtoy/items/a158b847b142f0a134a6)
- [Node.js で発生させた乱数で自動で音を鳴らす（Sonic Pi に OSC通信でデータを送信して音を出す） - Qiita](https://qiita.com/youtoy/items/25c923e9747b21ed6283)

以下、公式のドキュメント（アプリの画面左下に表示されるチュートリアル）から色々な設定をする部分を抜粋して、まとめていきます。
実際に Sonic Pi を起動し、プログラムの部分をコピペして、実際の音確かめながら見ていくのがオススメです。

## 1拍分の音を鳴らす
### 単音
まず、1つの音を鳴らす話です。

Sonic Pi のアプリ上で「初めての音」というドキュメントに書かれているものです。1拍分、指定した数字に対応した高さの音が鳴ります

```ruby
play 70 
```

ちなみに、C や F# などの音名を使うこともできるようです。
その場合は `play :C` など、コロンと一緒に音名を記載する必要があるようです。

### 和音
play を複数書くと、それらが同時に鳴ります。

```ruby
play 72
play 75
play 79 
```

上記は、リストの記法を使って、以下のようにも書くことができます。

```ruby
play [72, 75, 79] 
```

#### 和音名を使う
Sonic Pi では、例えば以下のように和音名も利用できるようです。

```ruby
play chord(:E3, :m7)
```

他にも、以下が他の例の一部として紹介されていました。

> chord(:E3, :m7)
chord(:E3, :minor)
chord(:E3, :dim7)
chord(:E3, :dom7)

### 1音ずつ鳴らす/少しずつずらして音を鳴らす
上記の 3つの音を順番に鳴らす方法です。
音を指定した後に、 `sleep 1` で　1拍分の休みを入れると、音が順番になります。

```ruby
play 72
sleep 1
play 75
sleep 1
play 79 
```

sleep の後の数字を 1未満にすると、音の鳴る区間の一部が重複した形になるようです。

```ruby
play 72
sleep 0.3
play 75
sleep 0.3
play 79
```

#### 和音名を使う
上記の和音名と「play_pattern関数」を組み合わせると、和音を構成する音を一音ずつ順番に弾く形にできるようです。
以下が、その一例です。

```ruby
play_pattern chord(:E3, :m7) 
```

そして、デフォルトでは `sleep 1` で音を鳴らす設定になっているのを、以下のように設定して変更することもできるようです。

```ruby
play_pattern_timed chord(:E3, :m7), 0.25 
```

さらに、以下のようにリストを渡すと、1音毎の鳴らす長さを「0.25 ⇒ 0.5 ⇒ 0.25 ⇒ 0.5 ⇒ ...」となるように指定した形になるようです。

```ruby
play_pattern_timed chord(:E3, :m13), [0.25, 0.5] 
```

#### 広い範囲の音階を演奏する
広範囲の音階を演奏する指定もできるようです。
以下に 2つの公式の事例を記載します。

```ruby
play_pattern_timed scale(:c3, :major, num_octaves: 3), 0.125, release: 0.1 
```

```ruby
play_pattern_timed scale(:c3, :major_pentatonic, num_octaves: 3), 0.125, release: 0.1 
```

## 音量変更「amp」・音の鳴る位置の変更「pan」
### 音量を変える
先ほど音を鳴らすのに使っていた `play 【数字】` の後に `, amp: 0.5` という形の指定をすると、音量を変えられるようです。このようなオプションを付与するときは、カンマで区切りを入れて、オプション名の後にコロンを入れる書き方になります。

```ruby
play 70, amp: 0.5
```

### ステレオで音の位置を制御する
左右の音の出し方を変えられるようです。

```ruby
play 70, pan: 1
```

上記のように指定すると、右のスピーカーから音が鳴ります。
数字の部分を「-1」にすると「右のスピーカーから音が鳴り」、「0」にすると中心から鳴るようです（※デフォルト設定）。

## シンセサイザーの機能
### 音の種類を変える
デフォルトだとビープ音を使う形ですが、これを別の音に変更することができます。
以下は、「ノコギリ（saw）波」を使う例です。

```ruby
use_synth :saw
play 70
sleep 1
play 50
```

他の音も試してみます。

```ruby
use_synth :prophet
play 60
```

上記 2つを組み合わせた例を、公式ドキュメントから引用します。

```ruby
use_synth :saw
play 38
sleep 0.25
play 50
sleep 0.25
use_synth :prophet
play 57
sleep 0.25
```

以下は、公式ドキュメントの 3つ種類をまぜて使った例です。

```ruby
use_synth :tb303
play 38
sleep 0.25
use_synth :dsaw
play 50
sleep 0.25
use_synth :prophet
play 57
sleep 0.25 
```

#### 音の種類
上記のような切り替えができる音の種類は、20以上あるようです。公式で、著者のお気に入りと書かれたものを以下に記載しておきます。

> :prophet 
:dsaw 
:fm 
:tb303 
:pulse 

## 音の鳴る長さを変える
### フェードアウト/フェードイン
これまで 1つの音の長さが 1拍分でしたが、それを変更してみます。
以下は、長さをのばしつつフェードアウトする指定となります。

```ruby
play 60, release: 2
```

逆にフェードインする場合は、以下となります。

```ruby
play 60, attack: 2
```

### フェードインとフェードアウトの組み合わせ
先ほどのフェードインとフェードアウトを、以下のように組み合わせることもできるようです。

```ruby
play 60, attack: 0.7, release: 2
```

```ruby
play 60, attack: 0.5, release: 0.5 
```

また、以下のようにフェードイン・フェードアウトの減衰を制御したりもできるようです。
詳細はここでは省略しますが、こちらの詳細を知りたい場合は「ディケイレベル」・「ディケイ・フェーズ」というキーワードで調べてみてください。

```ruby
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5 
```

## 録音済みサンプル
### 録音済みサンプルをシンプルに使う
Sonic Pi では、録音済みのサンプルというのも用意されているようです。

以下の `sample :ambi_lunar_land` と `sample :ambi_drone ` が、その録音済みサンプルを指定している部分です。

```ruby
play 36
play 48
sample :ambi_lunar_land
sample :ambi_drone 
```

録音済みサンプルは、一覧から選ぶこともできるようですが、それ以外に `sample ` と以下の接頭語を Sonic Pi上で入力すると、入力補完でそれぞれの接頭語がつくサンプルのリストを表示させて、選ぶことができるようです。

> :ambi_ 
:bass_ 
:elec_ 
:perc_ 
:guit_ 
:drum_ 
:misc_ 
:bd_ 

### 録音済みサンプルを活用する
#### 音の位置変更と組み合わせる
以下は、録音済みサンプルを使い、「左耳で再生開始 ⇒ 半分のところで右耳で再生」という鳴らし方をしている例です。面白い聞こえ方の音でした。

```ruby
sample :loop_amen, pan: -1
sleep 0.877
sample :loop_amen, pan: 1 
```

#### 録音済みサンプルのレートを変える
録音済みサンプルを変化させる方法を使ってみます。

以下は、 `rate` というオプションを指定しているものの、無指定の場合と同じです。

```ruby
sample :ambi_choir, rate: 1 
```

ここで以下のような指定をすると、「音の鳴る長さが2倍」になり、かつ「1オクターブ低い音」になります。

```ruby
sample :ambi_choir, rate: 0.5
```

また、 `-1` を指定すると逆再生になるようです。
以下の 2つをぜひ鳴らしてみて、比べてみてください。

```ruby
sample :loop_amen, rate: -1 
```

```ruby
sample :loop_amen, rate: 1 
```

#### 録音済みサンプルの時間を知る/フェードの適用のされ方
録音済みサンプルの長さは、 `print sample_duration` を使って知ることができるようです（以下の1つ目）。
以下の 1つ目を実行した結果として `1.753310657596372` という値が得られます。

そして、約1．75 の長さのうち、以下の 2つ目は 0．75 の長さの分のフェードアウトを指定しています。
録音済みサンプルでは、その場合、「最初の1秒をフル・アンプで再生、最後の0.75秒はフェード・アウト」という動作をするようです。

```ruby
print sample_duration :loop_amen
sample :loop_amen, release: 0.75
```

実際に音を鳴らしてみると分かりやすいかと思います。

以下のように、フェードイン・フェードアウトの両方を組み合わせて指定することもできます。

```ruby
sample :loop_amen, attack: 0.75, release: 0.75 
```

#### 録音済みサンプルのフェードの適用のされ方2
以下のような指定をすると、0.75 の長さだけフェードアウトされて音が鳴る、という形になるようです。
（ `sustain: 0` を指定したことで、上の例では「最初の1秒をフル・アンプで再生」となっていた部分が、再生時間ゼロになるようです）

```ruby
sample :loop_amen, sustain: 0, release: 0.75 
```

これを利用して、音を打楽器的に鳴らす、という例が紹介されています。
以下がその例になります。

```ruby
sample :drum_cymbal_open 
```

```ruby
sample :drum_cymbal_open, attack: 0.01, sustain: 0, release: 0.1 
```

#### 録音済みサンプルの開始/終了位置の指定
上記では、録音済みサンプルの最初の部分から音が鳴る形でしたが、サンプルの途中の部分から鳴らしたり、途中で打ち切ることもできるようです。

以下は、スタート位置をずらした例です。

```ruby
sample :loop_amen, start: 0.5
```

また、終了位置を指定することもでき、開始と終了の両方を指定することもできます。
その際、開始位置が終了より後になるように指定すると、逆再生を行うこともできるようです。

```ruby
sample :loop_amen, start: 0.6, finish: 0.4 
```

また、レートと組み合わせて、「録音済みサンプルの途中の部分をゆっくり再生させる」といったこともできたりするようです。

```ruby
sample :loop_amen, start: 0.5, finish: 0.7, rate: 0.2 
```

## おわりに
自分が Sonic Pi を使う場合に、できることの一覧をざっと見られるものがあればと、この記事を書きました。

しかし、Sonic Pi にいろいろな機能があり、全てを 1つにまとめると見づらくなりそうだったので、いったん上記の部分までで一区切りとして、続きは別記事に分けようと思います。

### 【追記】 続きの記事を作りました
●Sonic Pi でのいろいろな音の鳴らし方についてのメモ（自分用まとめ その2） - Qiita
　https://qiita.com/youtoy/items/98fa180433eca747f63b