pmml(MMLコンパイラ)によるMIDIファイル生成環境を構築してみた
pmml(MMLコンパイラ)によるMIDIファイル生成環境を構築してみた
ポケットミクちゃん本を読む会(その2)で使用するMIDIファイルを用意しておきたいと考え、MIDIファイルの生成環境を構築してみました。
以前開催した、やはり俺の耳コピはまちがっている。(その1) ゆるゆに-ゆるいUNIX勉強会-#6でもMIDIファイル生成環境の構築を行ったりしましたが、改めて備忘録として手順をまとめておこうと思います。
構築するMIDIファイル生成環境について
NetBSD-6.1-i386上に、pmmlとTiMidity++をインストールしてみます。pmmlはMML(Music Macro Language)コンパイラと呼ばれるツールで、MMLで記述した楽譜情報からMIDIファイルを生成します。TiMidityはソフトウェアMIDI音源で、pmmlで生成したMIDIファイルを再生するのに利用します。
PMMLをビルドする
まずはPMMLをビルドします。オリジナルのソースファイルはftp://ftp.u-aizu.ac.jp/u-aizu/pmml/にありますが、pmml-0.2p1.tar.gz(1998/06/17)以降は新しいバージョンがリリースされておらず、そのままの状態では現在の環境でビルドできません。
そのため、pmml-0.2p1.tar.gzをビルドが通るように修正したものを以下のリポジトリに用意しました。
cloneしてmakeするだけでビルドできます。筆者の環境ではNetBSD-6.1-i386とDebian GNU/Linux 7.4 (wheezy)でビルドできることを確認できています。
$ git clone https://github.com/furandon-pig/pmml-0.2p1-fork-201405.git $ cd pmml-0.2p1-fork-201405/
ビルドは単にmakeコマンドを実行するだけであり、./configure --prefix=...のような指定ができません(そもそも現状ではconfigure未対応です...)。インストール先を変更したい場合は、以下のようにMakefile中のLIBDIR,BINDIRを修正します。以下の例では/opt/pmml-0.2p1-fork-201405にインストールする設定に修正しています。
$ diff -u Makefile.orig Makefile --- Makefile.orig 2014-05-14 15:32:04.000000000 +0900 +++ Makefile 2014-05-14 15:33:04.000000000 +0900 @@ -5,10 +5,10 @@ #------ configuration parameters ------ # The directory to which PMML library files are installed. -LIBDIR = /usr/local/lib/pmml +LIBDIR = /opt/pmml-0.2p1-fork-201405/lib/pmml # The directory to which executable files are installed. -BINDIR = /usr/local/bin +BINDIR = /opt/pmml-0.2p1-fork-201405/bin # Command name of the C compiler CC = gcc
あとはmake,make installでビルドとインストールは完了です。
$ make 2>&1 | tee -a _make.log $ sudo make install 2>&1 | tee -a _make_install.log
TiMidity++をビルドする
TiMidityについてもconfigure,make,make installで完了します。パッケージで提供されているソフトウェアですが、今回は自分でビルドしてみます。インストール先は/opt/TiMidity++-2.13.0としています。
$ cd work $ wget http://ftp.jaist.ac.jp/pub/sourceforge/t/project/ti/timidity/TiMidity++/TiMidity++-2.13.0/TiMidity++-2.13.0.tar.gz $ tar zxvf TiMidity++-2.13.0.tar.gz $ cd TiMidity++-2.13.0 $ ./configure --prefix=/opt/TiMidity++-2.13.0 2>&1 | tee -a _configure.log $ gmake 2>&1 | tee -a _make.log $ sudo gmake install 2>&1 | tee -a _make_install.log
音源ファイルを用意する
TiMidityを使用するには、「音源ファイル」と呼ばれる、音色のファイル集が必要です。以下の手順で用意します。
$ cd work $ wget ftp://ftp.iij.ad.jp/pub/linux/gentoo/distfiles/shominst-0409.zip $ sudo mkdir -p /opt/TiMidity++-2.13.0/share/timidity $ cd /opt/TiMidity++-2.13.0/share/timidity $ sudo unzip /home/fpig/work/shominst-0409.zip # ディレクトリ直下に展開されるので注意
timidity.cfg内のファイルパスを自分の環境に合わせて修正します。/opt/TiMidity++-2.13にインストールしたtimidiyがデフォルトで参照するファイルパスに一致するよう音源ファイルを置いています(このためTiMidity側での音源ファイルの場所設定は不要です)。
$ diff -u timidity.cfg.orig timidity.cfg --- timidity.cfg.orig 1996-04-08 03:31:00.000000000 +0900 +++ timidity.cfg 2014-05-14 15:15:47.000000000 +0900 @@ -30,9 +30,9 @@ #dir /usr/local/lib/timidity # -dir /nethome/sak95/shom/lib/timidity/inst/GUS -dir /nethome/sak95/shom/lib/timidity/inst -dir /nethome/sak95/shom/lib/timidity/inst/test +dir /opt/TiMidity++-2.13.0/share/timidity/inst/GUS +dir /opt/TiMidity++-2.13.0/share/timidity/inst +dir /opt/TiMidity++-2.13.0/share/timidity/inst/test bank 0 source default.cfg
pmml,timidityコマンドのパスを設定する
pmml,timidyのコマンドを通常と異なる/opt以下にインストールしているため、環境変数PATHを設定します。
$ export PATH=$PATH:/opt/pmml-0.2p1-fork-201405/bin $ export PATH=$PATH:/opt/TiMidity++-2.13.0/bin
それぞれのコマンドが見つかることを確認して設定完了です。
$ which pmml timidity /opt/pmml-0.2p1-fork-201405/bin/pmml /opt/TiMidity++-2.13.0/bin/timidity
MMLのサンプルからMIDIファイルを生成する
MMLのコンパイル環境とMIDI再生環境が構築できたので、MMLのサンプルからMIDIファイルを生成してみます。 PMMLのexamplesディレクトリにMMLのサンプルがあるので、これを利用します。
"pmml <MMLファイル名>"でMMLをコンパイルします。MIDIファイルは MMLファイルと同じディレクトリ に生成される点に注意してください(相対パスでMMLファイルを指定すると「MIDIファイルが生成されない!」と早とちりしてしまいます...)
$ cd ~/work/pmml-0.2p1-fork-201405/examples $ pmml menuet1.pml $ ls Makefile grieg/ menuet1.mid menuet2.pml rand2.pml etude1.pml handel.pml menuet1.pml rand1.pml $ file menuet1.mid menuet1.mid: Standard MIDI data (format 1) using 3 tracks at 1/480
生成されたMIDIファイルをtimidityで再生してみます。
$ timidity menuet1.mid Playing menuet1.mid MIDI file: menuet1.mid Format: 1 Tracks: 3 Divisions: 480 Track name: (rh) Track name: (lh)
emacs+pmmlモードを使ってみる
PMMLの配布物にはpmml-mode.elというファイルが同梱されています。これを利用すると、emacs上でのMMLファイル作成が効率よく行えそうです。
pmml-mode.elを~/.emacs.dにコピーし、.emacsに以下の設定を追加します(最近のemacsは.emacsがobsoleteだった気がする...)。
$ cp pmml-0.2p1-fork-201405/emacs/pmml-mode.el ~/.emacs.d/ $ cat <<_EOF | tail -a ~/.emacs ;; PMML mode setup (setq pmml-player-command '("timidity" "-s16000")) (require 'pmml-mode) _EOF $ emacs --version GNU Emacs 24.3.1 ...
上記設定後、emacsで.pmlファイルを開くと自動的にpmmlモードになります。"C-c C-f"と入力すると、現在開いている.pmlファイルのコンパイルと再生が行われます。
基本的には"C-c C-f"だけでも良さそうですが、"M-x describe-bindings"で利用可能なpmmlモードのキーバインディングを確認してみました。
Major Mode Bindings: key binding 備考 --- ------- ---- C-c C-c pmml-record-finish (筆者の環境では利用できず) C-c C-f pmml-play-file pmlファイル全体を演奏する C-c C-p pmml-play-from-here-all カーソル位置から最後まで演奏する C-c C-q pmml-stop 演奏を停止する C-c C-r pmml-record (筆者の環境では"Recording is not supported."と表示される) C-c C-s pmml-step-record (筆者の環境では"Step recording is not supported."と表示される) C-c C-t pmml-show-track-summary MIDIトラックのサマリ情報を表示する C-c C-y pmml-play-region-all 選択したリージョンを演奏する C-c p pmml-play-from-here-solo カーソル位置のパートをソロで演奏する C-c y pmml-play-region-solo 選択したリージョンをソロで演奏する
MIDIファイルをWAVファイルに変換する
timidityのもう一つの機能として、MIDIファイルをWAVファイルに変換するというものがあります。"-Ow"でWAVファイルへの変換が行えます。
$ timidity -h ...中略... Available output modes (-O, --output-mode option): -Od NetBSD audio device -Ow RIFF WAVE file -Or Raw waveform data -Ou Sun audio file -Oa AIFF file -Ol List MIDI event -OM MOD -> MIDI file conversion Output format options (append to -O? option): `S' stereo `M' monophonic `s' signed output `u' unsigned output `1' 16-bit sample width `2' 24-bit sample width `8' 8-bit sample width `l' linear encoding `U' U-Law encoding `A' A-Law encoding `x' byte-swapped output
以下の例では、pmmlでMIDIファイルを生成し、そこからWAVファイルに変換しています。さらにMP3にエンコードするといった活用方法も可能です。
$ pmml menuet1.pml $ timidity -Ow2 menuet1.mid Playing menuet1.mid MIDI file: menuet1.mid Format: 1 Tracks: 3 Divisions: 480 Track name: (rh) Track name: (lh) Output menuet1.wav Playing time: ~42 seconds Notes cut: 0 Notes lost totally: 0 $ file menuet1.wav menuet1.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 24 bit, stereo 44100 Hz
まとめ
pmmlとTiMidityのビルドとインストール手順をまとめてみました。ビルドが通るよう修正したpmmlのソースコードは以前から手元にあったのですが、HDDの奥深くに埋もれてしまうことが何度かあったため、GitHub上のリポジトリで管理することにしました。TiMidityについても、それ自体のインストールと音源ファイルの準備という若干ややこしい手順のため、pmmlと共に一連のインストール手順としてまとめてみました。