Rubyでクラシカルなアルペジオを作ってみた (Mac環境)

## これは何？
元ミュージシャンの私が、今現場で使っているRubyでなんとか作曲っぽいことができないか試みた記事です。
OSは、Montereyを使用しており、特に有料ツールなども使用しておりません。


## 用語の説明

- アルペジオ
    - 和音を構成する音を一音ずつ順番に弾いていくことで、リズム感や深みを演出する演奏方法。
- MIDI (MIDIデータ)
    - 音楽の演奏情報をデータ化し、電子楽器やパソコンで再生できるようにしたものです。
- MIDI音源 (ソフトウェア音源)
    - MIDIの情報に従って演奏をする機器


## 下準備編

### MacのMIDI出力を準備する

1. Launchpad から MIDI で検索し、`Audio MIDI設定` を開きます。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/6d84ad4c-d804-58e9-33a6-70a8524ec779.png">

2. ウインドウ から `MIDIスタジオを表示` を選択します。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/2e8069e9-a694-a48f-b17e-5c466e0086e2.png">

3. 表示されたウインドウから `IACのドライバ` を選択します。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/23fb7944-2697-2d29-65a1-8650609722b9.png">

4. 表示されたウインドウから `装置はオンライン` の項目のチェックマークを入れます。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/55ea2dd1-2d2a-1c88-af66-6a328e3f842b.png">


### MIDI音源を用意する

1. App Store から `GarageBand` をダウンロードします。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/b9d236b7-d276-f29b-87d6-c69d085c9b09.png">

2. ダウンロードした `GarageBand` を開き、ファイルから `新規` を選択します。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/71995e92-5148-4e3a-9edb-0a078cca89d6.png">

3. 開いた画面から `空のプロジェクト` を選択します。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/88702bf6-9768-4037-3c81-cc06342d3305.png">

4. プロジェクトが開いたら、 `ソフトウェア音源` を選択して、作成します。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/5c11b86d-cedf-4af9-85b5-2a10856c97ae.png">

5. デフォルトでは、ピアノが選択されていると思いますが、赤枠の中から好きな楽器に変更することができます。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/24d94593-87c0-9581-5a63-fd50ea914b9a.png">

6. 念の為、環境設定の`オーディオ/MIDI　設定` で、赤枠の様に1個のMIDI入力が検出されましたと表示されていれば、ここまでの設定はおそらく大丈夫なはずです。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322481/5d7a3a51-4cee-7100-cb6b-ba073bda302d.png">


## 実践編

今回私の環境では、すでにRails環境が使用できる状態だったので、環境構築などの手順は割愛させていただき、Rakeタスクにて、音楽を再生するタスクを作成する部分から解説します。

- 参考記事
    - https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b
    - https://qiita.com/mmaumtjgj/items/8384b6a26c97965bf047


### Gemの導入

調べているとMIDI関連のライブラリがいくつかありましたが、その中で扱いが簡単そうな、[MicroMIDI](https://github.com/arirusso/micromidi)というものを今回は使用してみようと思います。

Rails環境のGemfileに下記を記載します。

```rb
gem "micromidi"
```

ターミナルを開いて、Gemを導入します。

```sh
bundle install
```

### Rakeタスクを作成

rakeコマンドにて、下記を実行し、lib/tasks配下に `music.rake` というファイルを生成します。

```sh
rails g task music
```

再生されたファイルにタスクを記載します。

```rb
namespace :music do
  desc "アルペジオを再生する"
  task play: :environment do
    # 音楽を流す処理を書く
  end
end
```

### 演奏処理を書く

やることは比較的シンプルで、下準備で用意したMIDI出力を認識させるための処理と、実際に音符を演奏するための処理を書くだけです。

ライブラリのサンプルを参考に下記を記述します。

```rb
namespace :music do
  desc "アルペジオを再生する"
  task play: :environment do

    # 再生時のMIDI出力を選ぶための処理
    @output = UniMIDI::Output.gets
    notes = []

    MIDI.using(@output) do
      # play の第一引数は音階、第二引数は音符の長さを指定する
      notes.each { |note| play(note, 0.1) }
    end
  end
end
```

あとは音階を英語名で配列に設定することで、音を鳴らすことができます。
(今回は音符の長さは固定で0.1としていますが、こちらを変更すればリズムも変更はできます)

- 音階の対応表はこちら 
    - オクターブの違いは`数字`を追加
    - シャープなどは`#`を追加

    | 日本 | 英語 |
    |:-:|:-:|
    | ド  |  C |   
    |  レ |  D |   
    |  ミ |  E |   
    |  ファ | F  |   
    |  ソ |  G |   
    |  ラ |  A |   
    |  シ |  B |   


### 実際に音階を入れたもの

```ruby
namespace :music do
  desc "アルペジオを再生する"
  task play: :environment do

    # 再生時のMIDI出力を選ぶための処理
    @output = UniMIDI::Output.gets
    notes = %w{
      E3 A3 C4 E4 C4 A3
      E3 A3 C4 E4 C4 A3
      E3 A3 C4 E4 C4 A3
      E3 A3 C4 E4 C4 A3
      D3 G3 B3 D4 B3 G3
      D3 G3 B3 D4 B3 G3
      D3 G3 B3 D4 B3 G3
      D3 G3 B3 D4 B3 G3
      C3 F3 A3 C4 A3 F3
      C3 F3 A3 C4 A3 F3
      C3 F3 A3 C4 A3 F3
      C3 F3 A3 C4 A3 F3
      B2 E3 G#3 B3 G#3 E3
      B2 E3 G#3 B3 G#3 E3
      B2 E3 G#3 B3 G#3 E3
      B2 E3 G#3 B3 G#3 E3
    }

    MIDI.using(@output) do
      # play の第一引数は音階、第二引数は音符の長さを指定する
      notes.each { |note| play(note, 0.1) }
    end
  end
end
```

これで、`rails music:play`を実行し、下準備で設定したMIDI出力を選択することで、GarageBandからクラシカルなアルペジオフレーズが聞けると思います！

```sh
> rails music:play

Select a MIDI output...
1) Apple Inc. IACドライバ
> 1
```

一応動画にしてハープとシンセのバージョンで書き出しておきました！

https://youtu.be/YL9lyOHG4_U


## 最後に
ここまで記事を読んでいただき、ありがとうございました。
Rubyでなんとか音楽制作っぽいことに挑戦しましたが、結論　GarageBandだけを使って作曲した方が100倍早いです。。