Vimで作曲

うぇーい、バクダンくんですよ。初めましまし。

友人が使っているのを見てVimを始めてからもう４年も経ったことだし、そろそろ僕も何かVimの魅力を語って周りに布教したいと思っていたのですが、うだうだしているうちにAdvent Calendarの季節になってしまったので、これを機に初投稿するのです。

そういうわけでこの記事は[Vim Advent Calendar 2015](http://qiita.com/advent-calendar/2015/vim)の10日目の記事になるのですよ。初めに言っておくと、タイトルで期待させてしまった方には申し訳ありませんが、そんなにすごいことやってるわけじゃないです。


# なんでVimで作曲

僕は趣味でDTM（PCを使った音楽制作）をやっております。といってもまだ始めてから十数曲程度しか書いていないエンジョイ勢。

しかし、とりあえず曲を作るためにはひたすら重いDAW（音楽制作ソフト）を立ち上げ、テンポや拍子などプロジェクトの設定を済ませ、音源を沢山ある中から選び、なぜか音が鳴らないので環境設定やトラックの設定とにらめっこし……などなどしなければなりません。こんなことをしていてはせっかく天から降りてきた神フレーズもどっかへ行ってしまいます。

また、最近のDAWは基本的にMIDIキーボードが無いと非常に不便なものです。マウスとキーボードだけで打ち込むのは非常に煩わしく、電車の中で膝の上に乗せたノートPCでそんなことをする気にはなれません。

浮かんだメロディからラフを作るために使うのでMIDIが出力できれば十分。なんとかPCのキーボードだけでサクッと曲を書けるようなソフトは無いだろうか。色々試してみたのですがなかなか丁度いいものが見つかりません。そこで思います。

というか、Vimで作曲したい。


# ざいりょう

* WindowsのパソコンまたはMac  
試してないですがLinuxでも頑張ればできないことはないと思います。
* Vim  
コマンドラインでも作曲できちゃうすごいソフト。
* [quickrun](https://github.com/thinca/vim-quickrun)   
`\r`で好きなコマンドを実行できる便利なプラグイン。
* [テキスト音楽「サクラ」](http://oto.chu.jp/)（コンソール版）  
今回の肝。
* TiMidity++（Macの場合）  
あらMacってMIDI再生できないのね。Homebrewを使ってインストールするのが一番楽でしょう。


# テキスト音楽「サクラ」

テキスト音楽「サクラ」は、MML表記で書いた楽譜をMIDIに変換し演奏してくれるシーケンサーソフトです。それだけでなくMMLを独自に拡張して日本語（ストトン表記）に対応させ、例えば`ドレミファ`と書くとドレミファと鳴らしてくれます。その手軽さも相まって今でも愛用者は多いそうです。

サクラは本来エディタつきのソフトウェアで、それを使えばGUIの鍵盤をポチポチ押して入力したりもできるのですが、Vim以外のエディタを使うなんて考えられないので今回はコンソール版を利用させていただきます。


# 準備

## Vimのインストール

パソコンを買ったら手が勝手にインストールしているはずなので省略。


## quickrunのインストール

お好きな方法で[quickrun](https://github.com/thinca/vim-quickrun)をインストールします。僕は[NeoBundle](https://github.com/Shougo/neobundle.vim)を使っていますが、他の方法でもきっと大丈夫でしょう。

なお、曲をバックグラウンドで再生するために[vimproc](https://github.com/Shougo/vimproc.vim)も必要ですが、KaoriYaさんのVimやMacVim-KaoriYaの場合は既に含まれているため自分でインストールする必要はありません。


## （Macの場合）TiMidity++のインストール

まずは`brew install timidity`。しかしMacのTiMidity++の場合、初期設定では対応していない音色が多いようなので、別のサウンドフォントを導入しておきましょう。

ネットに転がっているサウンドフォントは色々ありますが、僕の場合[こちらのサイト](http://yppts.adam.ne.jp/music/timidity.html#FONT)からFluidR3.zipをダウンロードし、解凍した中の`FluidR3 GM.SF2`を`/Library/Audio/Sounds/Banks/FluidR3_GM.SF2`に移動し、`/usr/local/Cellar/timidity/2.14.0/share/timidity/`にある`timidity.cfg`を`timidity.cfg.old`にバックアップしてから新しい`timidity.cfg`に

```nohighlight:timidity.cfg
dir /Library/Audio/Sounds/Banks
soundfont /Library/Audio/Sounds/Banks/FluidR3_GM.SF2
```

とだけ書いて保存した、ような痕跡があります。あんまり覚えておらずこれだけで大丈夫か不安なのでダメだったらどうにかして調べてくださいな。


## テキスト音楽「サクラ」のダウンロード

[こちら](http://oto.chu.jp/top/index.php?ダウンロード#h5ce8facb)からテキスト音楽「サクラ」のコンソール版をダウンロードし、解凍して適当な場所に配置します。Macの場合はベータ版ですが[こちら](http://kujirahand.com/blog/index.php?%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%9F%B3%E6%A5%BD%E3%80%8C%E3%82%B5%E3%82%AF%E3%83%A9%E3%80%8Dfor%20Mac%20OS%20X%E3%81%AE%E3%83%99%E3%83%BC%E3%82%BF%E7%89%88)があります。Linuxの場合は試していませんが[C言語版(β)のソースコード](https://github.com/kujirahand/sakuramml-c)が公開されているのでなんとかなる気がします。


## Vimの設定

`~/.vimrc`に以下を書いておきます。`/path/to/...`の部分は各自サクラを置いた場所に読み替えてください。

```vim:.vimrc
if !exists('g:quickrun_config')
	let g:quickrun_config = {}
endif
if has('win32')	" Windows用の設定
	autocmd BufRead,BufNewFile *.mml set filetype=mml fileencoding=cp932
	let g:quickrun_config['mml'] = {
		\ 'tempfile' : '%{tempname()}.mml',
		\ 'command' : expand('/path/to/csakura-pack/cSakura.exe'),
		\ 'runner' : 'vimproc',
		\ 'exec' : ['%c %s %s:p:r.mid', 'start %s:p:r.mid'],
		\ 'outputter' : 'null'
		\ }
elseif has('mac')	" Mac用の設定
	autocmd BufRead,BufNewFile *.mml set filetype=mml fileencoding=utf-8
	let g:quickrun_config['mml'] = {
		\ 'hook/cd/directory' : '/path/to/bin_sakura_osx',
		\ 'tempfile' : '%{tempname()}.mml',
		\ 'command' : expand('/path/to/bin_sakura_osx/sakura'),
		\ 'runner' : 'vimproc',
		\ 'exec' : ['%C %s || echo', 'timidity -OO %s:p:r.mid'],
		\ 'outputter' : 'null'
		\ }
endif
```

quickrunのマニュアルを読んだもののいまいちよくわからないので何かマズイところがありましたらお教えください。Mac版は仕様なのかわかりませんが`sakura`を実行した作業ディレクトリの中でIncludeディレクトリを探そうとしてしまうので`hook/cd/directory`を設定してあります。


# Vimで作曲

## とりあえず書いてみる

ではVimを開き適当に`:e hoge.mml`とします。その状態で以下のように書いてみましょ。

```mml:hoge.mml
拍子6,8　テンポ60　音符８
ソ８．ラ16ソミーッ　ソ８．ラ16ソミーッ
↑レーレ"シーッ　ドード"ソーッ
↓【２　ラーラ`ド８．シ16ラ　ソ８．ラ16ソミーッ】
↑レーレファ８．レ16"シ　ドーッミーッ
↓`ドソミソ８．ファ16レ　ド２．
```

ノーマルモードに戻って`\r`（正確には`<Leader>r`）を入力するとピアノの音できよしこの夜が流れてくるハズです。WindowsではWindows Media Player（または拡張子`.mid`に関連付けされているプログラム）が開いて再生してくれるのでシークもできます。hoge.mmlを保存済みの場合は同じフォルダにhoge.midが作成されます。

おめでとうございます、これであなたが大好きなVimで作曲までできちゃう環境が整いました。


## MML表記

サクラは普通のMML表記や、マクロを書いて複雑なMIDIを作ることもできます。詳しくは[テキスト音楽「サクラ」のマニュアル](http://oto.chu.jp/a.oto.chu.jp/doc/index.htm)で。じゃあためしにちょっと書いてみますか。

```mml
Tempo=110 Key=0

Track=1 Channel=1 V(100)
@BrassSection
l8 o6
eeee12f24gc`cb abag12f24e4r8a12b24
`cbab12a24g`ccd12e24 fedc'cd+,,80g+,,80'4'df,,80a+,,80'4
eeee12f24gc`cb agab12g24>c4de
fedc"gdcc12<b24 a`cba12b24`c4


Track=2 Channel=2 V(80)
@SynthBrass1
l8 o4
[2 cccc<bbbb aaaagggg ffffeeee: ddddg+4a+4> ]ddggc4


Track=10 Channel=10
@RoomSet
// リズムパートを入力するためのマクロを設定
$k{n(Kick1),} $s{n(Snare1),} $j{n(JingleBell),} $c{n(CrashCymbal1),}
Rythm{
l8
Sub{v60 [28 j ]jrjr}
Sub{v100 [7 kkrk ]krkr}
Sub{v100 [3 rrsr12s24 ]rrs12s24r [2 rrsr12s24 ] rrs12s24r12s24srsr}
v90 r1 r1 r1 r2crcr

Sub{v60 [29 j ]}
Sub{v100 [7 kkrk ]k}
Sub{v100 [3 rrsr12s24 ]rrs12s24r [2 rrsr12s24 ] rrs12s24r12s24s}
v90 r1 r1 r1 r2c
}
```

サクラMMLの言語仕様を調べながら書いたので５時間もかかっちゃいましたが、慣れればきっともっと速く書けるようになるでしょう。これでいつでも気軽に曲作りできちゃいます。


# できないこと

今のところの課題は、

* 途中から再生できない
* Windows以外はシークもできない
* 音色の一覧やサクラMMLの仕様を確認できるhelpが欲しい
* シンタックスハイライトさせたい
* よく使うスニペットを簡単に入力できる機能が欲しい
* 音色や音階のプレビューが欲しい

あたりでしょうか。音色の一覧に関しては今はサクラを配置したディレクトリの中にある`Include/stdmsg.h`を見て確認している現状です。もっとVim力があればプラグインを作ってquickrun要らずにもしたいところですが、今の僕にはこれが限界なので誰か作ってくださいお願いします。お願いしましたよ。ではおさらば。

--------

2015/12/11追記: MacVim-KaoriYaでいつの間にかvimprocを自力でインストールする必要が無くなっていたので修正しました。