MML演奏プログラムxmml

Version 2.0.4
3 Jan, 2001
ksw <card_captor@geocities.co.jp>

1 はじめに

このプログラムは、MML(Music Macro Language)で記述された単音のメロディを XサーバやLinuxのコンソールで演奏するプログラムです (もしかするとFreeBSDなどのコンソール上でも動くかもしれないのですが、 現在試せる環境がありません ^^;)。

おそらくご想像のとおり、着メロのために作ったものです ^^;

あんまりエラーチェックとかまじめにやってませんが、 非PCMな音源を鳴らすサンプルにでもなれば幸いです。


2 入手とコンパイル

http://www.geocities.co.jp/Technopolis/6855/ にて配布しています。配布にはGPLを適用します。

コンパイルにはglibが必要です。 OSによってはglibcも必須です(←こらこら^^;)

コンパイル時の設定は、Makefileを編集することで行います。Makefile中に

#################### user configuration part ####################
で囲まれた部分がありますので、ここの部分を適当なエディタで編集します。 変更する可能性があるのは、次の3箇所です。

CONFIG_CONSOLE=yes
コンソールベルによる演奏機能を無効にしたい場合は、 「#」でこの行をコメントアウトしてください。

CONFIG_X11=yes
Xサーバによる演奏機能を無効にしたい場合は、 「#」でこの行をコメントアウトしてください。

X11_LIBDIR=/usr/X11R6/lib
X11のライブラリが入っているディレクトリが上記のものと異なる場合はその値にしてください。

3 実行

Xサーバで演奏する場合
	mmlx [-ix] [-fDISPLAY] MML_FILE
DISPLAYは接続するディスプレイ名で、省略した場合はDISPLAY環境変数で 指定されたディスプレイを使います。 Xサーバによってはベル音の周波数を変えることができず、 音階を出すことができないものがあります。 このようなXサーバで実行すると、単調なビープ音が鳴るだけです。 MML_FILEは、以下の章で説明する文法にしたがって記述したMMLファイル名です。

コンソールベルで演奏する場合

	mmlx [-ic] [-fTTY] MML_FILE
TTYは端末デバイスで、省略した場合は/dev/tty (簡単に言うと、そのプロセスが起動された端末を指すデバイス)を使います。 ここで指定する端末は、ベル周波数とベル発音長が エスケープシーケンスで指定できないといけません。 rxvtやxtermで実現されている端末などでは、単調なビープ音が鳴るだけです。

-ixや-icを付ける必要があるのは、 コンパイルスイッチCONFIG_X11とCONFIG_CONSOLEの両方をyesにした場合だけです。 2つを有効にした場合に-ixも-icも付けなかった場合は、 -ixが指定されたものとみなされます。


4 MMLの書式

4.1 MMLの形式

MMLは、大きく制御文とデータ定義文から構成されます。 制御文は、テンポ(演奏速度)やデータの並びを定義し、 データ定義文は発音データそのものを記述します。

クロスハッチ記号「#」は、行末までコメントであることを意味します。 他のMMLのように「半音上げる」ことを意味しません。 (ちなみに「#」は「クロスハッチ」または「ナンバーサイン」であって、 シャープは「♯」です。)

4.2 MMLデータの構成

MMLデータは、「シーケンス定義」とシーケンスを並べた 「トラック定義」から構成されます。 シーケンスは、
  1. 音符に対応する発音要素
  2. 休符に対応する休止要素
  3. 発音要素と休止要素への修飾要素
の並びとして定義されます。 音楽のフレーズを表すものといえます。 曲をどのようにシーケンスに分割するかはプログラマ次第です。 普通はパートごとか、小節ごとに分割します。

トラックはシーケンス(フレーズ)の並びで、曲全体を構成します。 これはMIDIで言えば、MIDIチャンネルに対応します。 1つのトラックが1つの楽器に対応しますが、 1トラックで同時に発音できるのは1音だけです(少なくとも現バージョンでは)。

4.3 シーケンス定義

シーケンスの定義は、以下の形式に従います。

シーケンス名 = 要素 [要素 ...] ;
要素は、発音要素または休止要素または修飾要素のいずれかです。 空白や改行は無視されます。 シーケンス名はアルファベットまたは数字、アンダースコアが使えます。

4.4 発音要素

発音要素は、以下の形式に従います。
A〜Gのいずれか [+または-] [発音長] [.]
いわゆる「ドレミファソラシ」が"CDEFGAB"に対応します。 半音上げたり下げたりする場合、後ろに"+"または"-"を付けます。 大文字小文字は区別しません。

発音長は、8分音符には8、4分音符には4、…、全音符には1を指定します。 ピリオドを付けると、1.5倍の長さ、つまり「付点ほにゃらら音符」になります。

例:「ドレミ♯」を演奏するシーケンスojamajoを定義しています。

ojamajo = cde+ ;

4.5 休止要素

休止要素は、以下の形式に従います。
R [発音長] [.]
例えば、"R4."は付点4分休符に対応します。

4.6.1 修飾要素L

L 発音長 [.]
で、発音要素や休止要素で発音長を省略したときのデフォルト値を指定します。 なお、L要素に限らず、修飾要素は使用された箇所から、 そのシーケンスの終わりまで有効です。

4.6.2 修飾要素O

O 数値
で、デフォルトのオクターブを指定します。 "O3A"が440Hzの「ラ」になるようになっています。 数値は1(低音)から8(高音)までが有効です。

4.6.2 修飾要素>, <

>は修飾要素Oで指定した値を1増やします(つまり、1オクターブあがります)。 <は修飾要素Oで指定した値を1減らします(つまり、1オクターブさがります)。

4.6.3 修飾要素V, Q

VおよびQはそれぞれボリュームやゲートタイム(実際に発音する期間。 同じ4分音符でも、スタッカートが指定された場合にはゲートタイムは短くなります)を 指定しますが、現バージョンでは無視されます。

4.7 トラック定義

トラック定義は、演奏する際のシーケンスの並びを指定します。
@trk [シーケンス名 [/数値] [シーケンス名 [/数値] ...]] ;
数値は、直前のシーケンスの繰り返し回数を指定します。 トラック定義は複数出現できますが、現バージョン (とコンソールベルの出力 f^^;)では最初のトラックしか演奏されません。

例えば

@trk up/2 down/2 left right left right;
@trk up up down down left right left right;
と同じです。

4.8 テンポ定義

@tempo 数値;
演奏する速度を指定します(よく楽譜に「♪=80」とかあるやつ)。 数値は、1分間にいくつ4分音符があるかを指定します。

5 例

時報1
jihou = O3L4 AAA > A2;
@tempo 60;
@trk jihou;
時報2
jihou = O3L16 ARRR ARRR ARRR > A2;
@tempo 60;
@trk jihou;

6 さいごに

バージョン2.0.4以降から、Xサーバのベルを利用して演奏することが可能になりました。 xmmlのxが、ようやくウソにならないですみます f(^^; ずっと前のバージョンでは複数のX端末から1音ずつ発音して 和音(笑)を鳴らす機能もあったんですが、これはちょっと復活させる予定はありません。

このプログラムの由来ですが、 もともと学生時代に一種のジョークプログラムとして作ったものです。 んで、しばらくこれを作ったことを忘れてたりしてたんですが、 昨今の携帯ブームとなって着メロのテスト用ツールとして 再び日の目を見ることになりました。 ええ、どーしても坂本真綾さんの「プラチナ」を入れたかったので f^^;

最初はUNIX版STedとか使って音取りしようかと思ってたんですが、 ハードウェアMIDI音源持ってないため;_;、断念。 BASIC感覚で音鳴らせるプログラム欲しいなあと思い、 昔のプログラムにちょっと手を入れて復活させました。

んで、某UNIX Q&Aな掲示板で「UNIXで音鳴らしたい」という需要があったので、 急きょこの文書をでっちあげて公開してみたわけです。 ま、MIDIなMMLはGORRYさんのSPICE(回路シミュレータじゃないほう)とか abcmidiとかもっとちゃんとしたのがいっぱいありますので、 いろいろ試してみてください。

ちなみにMMLの文法は、(今は亡きMSX Magazineの)Musicaがベースになってます。 Musicaは知らなくても、MS系BASICがmother tongueな人にとってはMMLはお手のものでしょう…

でも、トシがばれますな(汗)


7 後日談

「プラチナ」なんですが、結局楽譜を買っちゃいました f^^;;; このプログラムの意義は…まあいいや。 だってメロディーむずかしいし〜

8 後日談

アーカイブにはいくつかサンプルデータが付属してますが、 私の手元にはもうちょっといろいろなデータがあります (ただ、著作権の関係で一般配布は不可能です)。

そのうちの一つに、PC9801用の「SuperDepth」があります。 これはMMLを別ファイルで持っていたので変換しやすかったというのもありますが、 単純なメロディーなのにけっこうゲームの雰囲気がでてて 個人的にはお気に入りです。

で、これが配布可能かどうかライセンスを調べようとしていたんです。 SuperDepthのオリジナルアーカイブ探せばいいかなと思って 謎書庫をごそごそあさってフロッピーディスクを発見できたのはいいんですが、 これがなんと(PC9801用の)1.2MBフォーマット… 読めないじゃないか(-_-;;;

いろいろと時の流れを感じさせられるプログラムでした。


9 後日談

サンプルのphone.mmlですが、 もしかすると元ネタは今は亡きMSX-FANに掲載されていた (たぶんファンダムの)プログラムかもしれません。ちょっと記憶が曖昧。

ただこれ、本物に近づけるために周波数とかタイミングの規格を 通信関係の本を調べて調整した記憶があります ^^; いちおうオリジナルであるとして収録しちゃいました。


1