PMMLの最近のブログ記事



PMMLは会津大学の西村先生が作ったMML拡張とそのコンパイラの実装。LinuxでMMLコンパイラといえばSPICE(電気回路シミュレータにあらず)が有名(っぽい)が、なんとなく適当にインストールしたらあっさりは動かなかったので、こんなん(NOTE:PDF)見つけてPMMLへの手がかりを得る。


入手とインストール


丸井綜研


会大のPMMLの公式サイトはアクセスできない状態らしいのだが、FTPサーバからPMML自体は入手できる様子。


URL: ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz


これをダウンロードして展開すると、INSTALLには「適宜Makefile書き直せ」とか初心者を蹴り殺すようなことが書いてあるがスルーしてビルドする。


とダメなので上記のサイトの「重複した宣言文」なるセクションの処理を施す。で、今度こそビルド。



$ wget ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz
$ tar xvzf pmml-0.2p1.tar.gz
$ cd pmml-0.2p1
$ make && make install

と、大コケした。make時だかinstall時だかわからないが、次のようなエラーが。



TLS definition in /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in input.o



libc.so.6とか絡んでるしぶっちゃけもう読む気にならないような感じだがとりあえず検索。


すると何か結構良くあるトラブルらしい:



/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o


↑というエラーが出る場合 errno の扱いに問題があるらしい 以下のいずれか もしくは組み合わせの対処法で



  1. ソースプログラム.c の extern int errno; をコメントアウト

  2. #include がなければ 追加

  3. #include を追加してみる

  4. gccのオプションに –include /usr/include/errno.hを指定


errno.h は glibc 提供のヘッダファイルです djbdns qmail 関連 ucspi-tcp のビルドのときに問題がでやすいようです


UNIXとプログラムとゲーム » Blog Archive » errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o

(整形はtnzkによるが文章は原文ママ)


cat comp/*.c |grep include すると、errno.hはインクルードされているようだったので、4番だけを試す(あと、2と3の違いがわからないんだが、どういうことなんだろ?)。


Makefileを開くと、



CCOPTS = -O



という行がある(tnzkの場合は17行目だった)ので、これを以下のように書き換える。



CCOPTS = -O2 --include /usr/include/errno.h



2つ補足。



  • 先ほど引用したページはミスかどうかで「-include /usr/include/errno.h」となっているが、正しくは「--include /usr/include/errno.h」

  • 最適化オプションが-O2に変更されているが、自分がなぜこうしたのかイマイチ覚えていないしどちらでもあまり影響はないんじゃないかと思う


この変更を加えてからmake && make installすると通る。


使ってみる


試しにとりあえずpmmlを呼んでみたらUTF8の端末では化けたのでnkfを噛ませる:



$ pmml -h | nkf -w
PMML Compiler Release 0.2 (Compiler version 0.67)
Copyright (C) 1997,1998 Satoshi Nishimura
This program comes with ABSOLUTELY NO WARRANTY.

使用法: pmml [オプション] ファイル名
オプション:
-0 format 0 の標準MIDIファイルを生成する
-1 format 1 の標準MIDIファイルを生成する
-2 format 2 の標準MIDIファイルを生成する
-c ch,ch-ch,...
指定されたMIDIチャネルだけを出力する
-d 空のトラックを削除する
-e PMMLソース文字列
PMMLソース文字列を評価する
-f {小節数[:ティック], /マーカ, /マーカ/{+,-}小節数[:ティック]}
指定された位置から演奏を開始する
-h ヘルプメッセージを出力する
-i file 初期化ファイルの名前を変更する
-l file 標準MIDIファイルをロードする (-e 'load("file")' に同じ)
-n ノート衝突時におけるノートイベントの修正を行わない
-o file 出力標準MIDIファイルの名前を変更する
-p 優先度によるイベントのソートを行わない
-q 初期化ファイルを読み込まない
-r N 出力分解能を N に設定する (省略時: 480)
-t {小節数[:ティック], /マーカ, /マーカ/{+,-}小節数[:ティック]}
指定された位置で演奏を中止する
-w 警告出力を抑制する
-F file PMMLソースファイルを読み込む (-e 'include("file")' に同じ)
-I dir dir をソースファイル検索パスの先頭に追加する
-R ランニング・ステータス・ルールを適用しない
-T track,track-track,/trackname/,...
指定されたトラックだけを出力する

普通に使える感じ。


サンプルをコンパイルしてみる。



$ cd examples
$ pmml menuet1.pml
$ cp menuet1.mid ~/public_html/

で、http://example.com/~tnzk/menuet1.midにアクセスする。ちゃんとメヌエットが聞こえたらおっけー!


このアーカイブについて

このページには、過去に書かれたブログ記事のうちPMMLカテゴリに属しているものが含まれています。

前のカテゴリはPICです。

次のカテゴリはPythonです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja