unimidiを使ってrubyプログラムで音を鳴らす

# windows7のruby環境で音を鳴らす。

友人が、rubyで作曲ソフトを作りたいと言っていた。彼はプログラマーではないけれど、音楽が作れる。そのため、rubyを勉強して、作曲ソフトを作ってみたいそうだ。rubyが簡単なのでrubyを使って、音楽が作れると薦めてみた。実際に、rubyを使ってmidiで音を鳴らしてみる。
いろいろな作業は、windows7のpowershell上で行う。

# windows7でrubyで音を鳴らす準備

rubyで音を鳴らすために次のような準備をする。

* gitインストール
* rubyインストール
* bundlerのインストール
* サンプルファイルを落とす
* unimidiのインストール
* unimidiのサンプルを落としてくる
* unimidiのサンプルを見ている。
* unimidiのサンプルを鳴らしてみる。

## gitのインストール

[gitのページ](http://git-scm.com/downloads)からwindows用のgitを落としてきて、インストールする。落としてきたexeを実行する。いろいろ書いているが、そのままnextボタンを押していけば良い。

### gitが必要な理由

あとで、githubからサンプル用のファイルを落とすのでそのために必要になる。

### gitが入ったか確認

powershellを立ち上げて、

```bash
PS C:\Users\shibacow> git --version
git version 1.9.2.msysgit.0
PS C:\Users\shibacow>
```

## rubyのインストール

[ruby](http://rubyinstaller.org/)のページから、downloadを落としてきてそのまま exeを実行。

### rubyが必要な理由

rubyが必要なのは、音楽を鳴らすために必要だ。

### rubyが入ったから確認

powershellを立ち上げて

```bash
PS C:\Users\shibacow> ruby --version
ruby 2.0.0p481 (2014-05-08) [x64-mingw32]
PS C:\Users\shibacow>
```

## bundlerのインストール

bundlerのインストール
powershellを立ち上げて、次のコマンドを実行。

実行するコマンド

```bash
gem install bundler
```

実行結果

```bash
PS H:\prog\ruby\ruby_unmidi_sample> gem install bundler
Successfully installed bundler-1.6.2
Parsing documentation for bundler-1.6.2
1 gem installed
PS H:\prog\ruby\ruby_unmidi_sample>
```


### bundleを入れる理由

bundleを入れることで、他のシステムとの競合を防ぐことができる。特に音楽系のソフトは、たのシステムと競合を起こしやすいので、別の環境を用意するために、bundleを用いて環境を分けておく。

### bundlerの確認

powershellを立ち上げて、

```bash
PS C:\Users\shibacow> bundle --version
DL is deprecated, please use Fiddle
Bundler version 1.6.2
PS C:\Users\shibacow>
```

## サンプルコードを手に入れる。

unimidiをインストールするが、インストールためのスクリプトは既に準備しているのでそれを使ってインストールする。この[ページ](https://github.com/shibacow/ruby_unmidi_sample)に既にサンプルがある。

この場所からコピーするのが早い

![ssh clone URL](http://i.gyazo.com/ecab38c8a268859bedd85f3973ecbfa0.png)

powershellを立ち上げて、

```bash
git clone git@github.com:shibacow/ruby_unmidi_sample.git
```

実行すると、
![](http://i.gyazo.com/d17281d3d031af44a04316d488314373.png)

このような表示で出る。


## unimidiの導入

[unimidi](https://github.com/arirusso/unimidi)は、rubyのための、midiライブラリだ。rubyを使ってmidiを鳴らすことができる。


powershellで、先ほどのダウンロードした場所へ移動する。


```bash
cd ruby_unmidi_sample
```

unimidiをインストールする。次を実行する。

```bash
PS H:\prog\ruby\ruby_unmidi_sample> bundle install
```

実行結果は以下。

```bash
PS H:\prog\ruby\ruby_unmidi_sample> bundle install
Fetching gem metadata from https://rubygems.org/.............
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing ffi 1.9.3
Installing alsa-rawmidi 0.2.14
Installing ffi-coremidi 0.2.0
Installing midi-jruby 0.0.12
Installing midi-winmm 0.1.10
Installing unimidi 0.3.5
Using bundler 1.6.2
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
PS H:\prog\ruby\ruby_unmidi_sample>
```

次のように表示され、vendoer以下にインストールされる。

これで準備は整った。

## midiを見ている。

なんでも良いので、midi_test.rbを開いてみる。

```rb
require 'unimidi'

notes = [36,40,43,48,52,60,64]
duration = 1

UniMIDI::Output.gets do |output|
  notes.each do |note|
    output.puts(0x90, note, 100) # note on message
    sleep(duration)  # wait
    output.puts(0x80, note, 100) # note off message
  end
end

```

命令は、note onとnote offを送っている。音程は、

```rb
notes = [36,40,43,48,52,60,64]
```

で決まっている。他の音程を入れれば、その音も追加される。

## midiを再生させてみる。

先ほどのpowershell上で、

```bash
PS H:\prog\ruby\ruby_unmidi_sample> bundle ex ruby midi_test.rb
```

実行結界

```bash
DL is deprecated, please use Fiddle

Select a MIDI output...
0) Microsoft GS Wavetable Synth
> 0
PS H:\prog\ruby\ruby_unmidi_sample>
```

MIDI outputを選ぶ選択肢が出るので、0とか1とか選ぶ。この場合は0しか選べない。

それではやってみよう。

## 注意

bundle installで入れているので、別のディレクトリで実行する場合、unimidiが入っていないと言われるかもしれない。その場合は、

```bash
bundle install
```
を使って、unimidiをインストールする。

また、rubyの実行も

```bash
bundle ex ruby file名
```

のようにbundle exを前に付けなければならない。