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-i386Debian 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と共に一連のインストール手順としてまとめてみました。

「ポケットミクちゃんに何かいろいろさせる会(その1)」開催レポート

「ポケットミクちゃんに何かいろいろさせる会(その1)」開催レポート

ポケットミクちゃんに何かいろいろさせる会(その1)という会を開催してみました。

勉強会ではメモを書いたりするのですが、家に帰るとメモを見返すこともなく、せっかくのメモが埋もれてしまうパターンに陥っているので、ここは思い切って勉強会のメモを元に、(ものすごく)簡単なレポートを書き残すことにしてみました。

みんなでやってみたこと

運の良いことに、参加者のマシンがWindows,OSX,Linux,NetBSDとバラけており、Chromeさえあればポケミクアプリが利用できるという便利さを痛感しました(が、NetBSDのみChromeを動作させられなかったという残念なオチが...)。

得られたノウハウ

あれこれ試してみて、以下のようなノウハウが得られました。

  • 最初にみんなでキャリブレーション(ユーザーズ・マニュアルのP.13)をするも、以外にチューニングに手間取るケースが多かった。
  • UbuntuRosegardenでポケットミクから音が出せる
  • GarageBandのデフォルト機能ではMIDI出力が行えない。別途プラグインが必要。
  • GarageBandでは、ポケットミクのデバイス名が"Soundflower"になる。
  • DominoCubase(キューベス)でもポケットミクが利用できるらしい。
    • (どちらも使ったことが無いので分からない...)
  • NetBSDだと、midiplay(1)でMIDIファイルを指定し、ポケットミクに演奏させることができる
    • ただし、何回か演奏しているとOSごと刺さる(!)ことがある。
$ midiplay -l
0: PC speaker
1: <0 >0 on umidi0
$ midiplay -d 1 foo.mid
  • Ubuntuにもmidiplay(1)相等のコマンドがある(が、コマンド名を確認し忘れた...)

ポケミクアプリを動かしてみたり、ニコニコ超会議超ボカロサミットを一通り観たりしていると、飛び入りの参加者さんが。先ほどまで観ていたニコニコ動画に映っていた人に名前が似ている...と思っていると、その人本人(ポケットミク総合Pの@polymoogさん)ががが!

なんだか凄いことになっちゃったぞ((C)孤独のグルメ)と驚きながら、@polymoogさんからポケットミクのひみつを聞いたり、みんなでポケットミクを動かしてみた時に出てきた疑問を聞いてみました。
(※以下は私の理解による記述であり、間違って理解している可能性がある点にご注意ください)

  • 実は演奏中もキャリブレーション処理が走っているらしい。
  • カーボンキーボードのスキャン方法は2パターンあるらしい。
  • シーケンサ側から音色番号を指定して音をだせるが、ポケットミク単体でも可能かもしれない。
  • ポケットミクのカーボンキーボードでシーケンサに入力する際、同じ音程で入力される。これはピッチベンドで音を入れているため。
  • ユーザーズ・マニュアルの「デフォルト文字テーブル」にあるシステムエクスクルーシブデータ、さりげなく例を出しているが何かひみつがあるとか。
  • ポケットミクと共にWeb MIDI APIが広まって欲しい。
  • フィジカルコントローラとしてポケットミクを活用したい。
  • ポケットミクの本、5月中頃から6月頭にかけて刊行されるかも。

やはりポケットミクの開発に携わった方の話はとても興味を惹かれました。ユーザーズ・マニュアルに書かれていないひみつは多いようで、ポケットミクの本がとても待ち遠しいです。

思いついたアイディア

私の環境ではChromeブラウザが動作しないため、ポケミクアプリを利用することができませんでした。しかし、お話を聞いてみるとポケミクアプリが利用しているWeb MIDI APIに俄然興味が湧いてきました。みんなで話していると、ポケミクアプリの他にも以下のようなアイディアが出てきました。

  • フィジカルコントローラとしてのポケットミクの活用。
    • カーボンキーボードからの入力を利用したアルカノイド風ゲームを作成した人がいるとか。
  • カーボンキーボードで抑揚をつけたテキスト読み上げ
    • まるで喋っているかのようなリアルな読み上げができる?
  • ポケットミクで何か言葉を喋らせて、Siriやしゃべってコンシェルが音声認識できるか試してみたい。
    • 「神調教」と呼ばれる職人の腕前と音声認識の対決?

次回の予定

単にポケットミクを動かしてみようという所から始まった会ですが、実際に開催してみるとポケットミクの隠されたひみつやWeb MIDI API、フィジカルインタフェースとしての活用など、試してみたい項目がいろいろ出てきました。そこで今後も何回かこの会を継続してみようと考えています。

次回は6/28(土)を予定しています。告知ページは近日中に作成する予定ですので、皆様のご参加をお待ちしております。

追記

次回の告知ページを公開しました。