// MgSoftトップ / 丸井総研 / malMODs / minorun / Uploader //
丸井総研
名称未設定展示室maruiblog

Mac OS XでPMMLを使う

PMMLとは

 PMML(Practical Music Macro Language)は会津大学の西村憲先生によって開発された、GNUライセンスのもと配付されている音楽記述言語です。C言語などに代表される構造化プログラミング言語に類似した文法をつかって音楽をテキストファイルとして記述し、PMMLインタプリタをつかって標準MIDIファイルに変換することができます。

 強力なマクロ機能があるので、大規模な曲でも比較的簡単に書くことができますし、このマクロ機能がPMMLを他のMMLの追随を許さないものにしています。

PMMLの最新版を入手する

 PMMLの本家サイトは現在メンテされていないようで、会津大学外からのアクセスができない状態になっているらしく、PMMLの入手は困難です。しかし、会津大学のFTPサイトからは過去のバージョンも含めて入手できるようになっています。次世代のPMMLも計画されているようですが、現在のところ入手できる最新版はftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gzです。

 ダウンロードしてきたソースコードは変更なしでLinux、BSD、Solaris、IRIX、MS-DOSなどでコンパイルできますが、Mac OS Xで使うには少々の変更が必要です。以下にその方法を紹介します。

PMMLをMac OS X用に変更する

エンディアンの定義部

 PowerPCのためのエンディアン宣言がないため、そのままコンパイルすると「定義文がないよ」と正常終了してしまいます。アーカイブを展開すると、その中に<pmmldir>/comp/pmml.hというファイルがありますので、そのファイルの75行目付近にある以下のようなエンディアン関連の定義文を見つけてください。

/********************************************************************
 * Definition of byte order
 ********************************************************************/
#ifndef PMML_BIG_ENDIAN
#  ifdef PMML_LITTLE_ENDIAN
#    define PMML_BIG_ENDIAN  0
#  else
#    if defined(mc68000) || defined(sparc) || defined(MIPSEB)
#      define PMML_BIG_ENDIAN  1
#    else
#      if defined(i386) || defined(MIPSEL) || defined(alpha)
#        define PMML_BIG_ENDIAN  0
#      else
         ... Either PMML_BIG_ENDIAN or PMML_LITTLE_ENDIAN must be defined.
#      endif
#    endif
#  endif
#endif

 Mac OS X(というよりもPower PC)はビッグ・エンディアンなので、その最初の方にその旨を一行追加するだけです。

/********************************************************************
 * Definition of byte order
 ********************************************************************/
#define PMML_BIG_ENDIAN 1
#ifndef PMML_BIG_ENDIAN
#  ifdef PMML_LITTLE_ENDIAN
#    define PMML_BIG_ENDIAN  0
#  else
#    if defined(mc68000) || defined(sparc) || defined(MIPSEB)
#      define PMML_BIG_ENDIAN  1
#    else
#      if defined(i386) || defined(MIPSEL) || defined(alpha)
#        define PMML_BIG_ENDIAN  0
#      else
         ... Either PMML_BIG_ENDIAN or PMML_LITTLE_ENDIAN must be defined.
#      endif
#    endif
#  endif
#endif

重複した宣言文

 同ファイルの950行付近にはsys_errlistという関数の外部宣言文がありますが、同じものがstdio.h内に別タイプとして宣言されていますので、pmml.h内のものをコメント・アウトしてしまいます。以下のように変更しました。

/* extern char *sys_errlist[]; */

 以上の二つの変更でMac OS XでコンパイルできるPMMLが準備できました。

コンパイル&インストール

 以上の変更をすませておけば、コンパイルはPMMLアーカイブのトップ・ディレクトリにてmakeと入力するだけです。たくさんのメッセージ文が表示されますが、最終的にはPMMLの実行ファイルとサポートファイルができあがります。

 通常インストールはmake installとできるように設定されているはずなのですが、Mac OS Xではうまく動きません。以下のように手動でインストールするとよいでしょう。

cd <PMML Dir>/comp
sudo make install
cd ../lib
sudo mkdir -p /usr/local/lib/pmml
sudo install -m644 *.pml /usr/local/lib/pmml
cd ../m2p
sudo make install

 これでPMMLを使う準備が整いました。

テストしてみる

 PMMLアーカイブのトップ・ディレクトリ直下にexamplesというディレクトリがあり、そのなかにいくつかサンプルが入っています。pmml <file>.pmlと入力してコンパイルすると<file>.midというファイルができますので、Quick Time Playerなどで再生してみてください。

 サンプルの中にある、etude1.pmlは西村先生によって入力されたショパンのピアノ練習曲ですが、曲中に繰り返し登場する演奏パターンの入力にはマクロ機能を利用しています。また、griegというディレクトリに入っているクラシック曲も驚きに値します。ソースファイルがいくつかに分割されており、最終的にそれを組み合わせて一曲ができるようになっています。こういった大規模な曲を入力するのにもそれほど労力を必要としないのがPMMLの利点です。

追補

 以前はオンラインでマニュアルを閲覧できましたが、現在はそのページが非公開になっているため、こちらにマニュアルを置いておきます。これはPMMLのアーカイブに含まれているものと同等ですが、Unix上で動作するTexinfoというソフトがないとHTMLに変換できないので、あらかじめ変換したものを用意しておきました。



Marui, Atsushi (jikanbae [at] mgsoft [dot] org)
GnuPG Public Key