おそらくご想像のとおり、着メロのために作ったものです ^^;
あんまりエラーチェックとかまじめにやってませんが、 非PCMな音源を鳴らすサンプルにでもなれば幸いです。
コンパイルにはglibが必要です。 OSによってはglibcも必須です(←こらこら^^;)
コンパイル時の設定は、Makefileを編集することで行います。Makefile中に
#################### user configuration part ####################で囲まれた部分がありますので、ここの部分を適当なエディタで編集します。 変更する可能性があるのは、次の3箇所です。
CONFIG_CONSOLE=yesコンソールベルによる演奏機能を無効にしたい場合は、 「#」でこの行をコメントアウトしてください。
CONFIG_X11=yesXサーバによる演奏機能を無効にしたい場合は、 「#」でこの行をコメントアウトしてください。
X11_LIBDIR=/usr/X11R6/libX11のライブラリが入っているディレクトリが上記のものと異なる場合はその値にしてください。
mmlx [-ix] [-fDISPLAY] MML_FILEDISPLAYは接続するディスプレイ名で、省略した場合はDISPLAY環境変数で 指定されたディスプレイを使います。 Xサーバによってはベル音の周波数を変えることができず、 音階を出すことができないものがあります。 このようなXサーバで実行すると、単調なビープ音が鳴るだけです。 MML_FILEは、以下の章で説明する文法にしたがって記述したMMLファイル名です。
コンソールベルで演奏する場合
mmlx [-ic] [-fTTY] MML_FILETTYは端末デバイスで、省略した場合は/dev/tty (簡単に言うと、そのプロセスが起動された端末を指すデバイス)を使います。 ここで指定する端末は、ベル周波数とベル発音長が エスケープシーケンスで指定できないといけません。 rxvtやxtermで実現されている端末などでは、単調なビープ音が鳴るだけです。
-ixや-icを付ける必要があるのは、 コンパイルスイッチCONFIG_X11とCONFIG_CONSOLEの両方をyesにした場合だけです。 2つを有効にした場合に-ixも-icも付けなかった場合は、 -ixが指定されたものとみなされます。
クロスハッチ記号「#」は、行末までコメントであることを意味します。 他のMMLのように「半音上げる」ことを意味しません。 (ちなみに「#」は「クロスハッチ」または「ナンバーサイン」であって、 シャープは「♯」です。)
トラックはシーケンス(フレーズ)の並びで、曲全体を構成します。 これはMIDIで言えば、MIDIチャンネルに対応します。 1つのトラックが1つの楽器に対応しますが、 1トラックで同時に発音できるのは1音だけです(少なくとも現バージョンでは)。
シーケンスの定義は、以下の形式に従います。
シーケンス名 = 要素 [要素 ...] ;要素は、発音要素または休止要素または修飾要素のいずれかです。 空白や改行は無視されます。 シーケンス名はアルファベットまたは数字、アンダースコアが使えます。
A〜Gのいずれか [+または-] [発音長] [.]いわゆる「ドレミファソラシ」が"CDEFGAB"に対応します。 半音上げたり下げたりする場合、後ろに"+"または"-"を付けます。 大文字小文字は区別しません。
発音長は、8分音符には8、4分音符には4、…、全音符には1を指定します。 ピリオドを付けると、1.5倍の長さ、つまり「付点ほにゃらら音符」になります。
例:「ドレミ♯」を演奏するシーケンスojamajoを定義しています。
ojamajo = cde+ ;
R [発音長] [.]例えば、"R4."は付点4分休符に対応します。
L 発音長 [.]で、発音要素や休止要素で発音長を省略したときのデフォルト値を指定します。 なお、L要素に限らず、修飾要素は使用された箇所から、 そのシーケンスの終わりまで有効です。
O 数値で、デフォルトのオクターブを指定します。 "O3A"が440Hzの「ラ」になるようになっています。 数値は1(低音)から8(高音)までが有効です。
@trk [シーケンス名 [/数値] [シーケンス名 [/数値] ...]] ;数値は、直前のシーケンスの繰り返し回数を指定します。 トラック定義は複数出現できますが、現バージョン (とコンソールベルの出力 f^^;)では最初のトラックしか演奏されません。
例えば
@trk up/2 down/2 left right left right;は
@trk up up down down left right left right;と同じです。
@tempo 数値;演奏する速度を指定します(よく楽譜に「♪=80」とかあるやつ)。 数値は、1分間にいくつ4分音符があるかを指定します。
jihou = O3L4 AAA > A2; @tempo 60; @trk jihou;時報2
jihou = O3L16 ARRR ARRR ARRR > A2; @tempo 60; @trk jihou;
このプログラムの由来ですが、 もともと学生時代に一種のジョークプログラムとして作ったものです。 んで、しばらくこれを作ったことを忘れてたりしてたんですが、 昨今の携帯ブームとなって着メロのテスト用ツールとして 再び日の目を見ることになりました。 ええ、どーしても坂本真綾さんの「プラチナ」を入れたかったので f^^;
最初はUNIX版STedとか使って音取りしようかと思ってたんですが、 ハードウェアMIDI音源持ってないため;_;、断念。 BASIC感覚で音鳴らせるプログラム欲しいなあと思い、 昔のプログラムにちょっと手を入れて復活させました。
んで、某UNIX Q&Aな掲示板で「UNIXで音鳴らしたい」という需要があったので、 急きょこの文書をでっちあげて公開してみたわけです。 ま、MIDIなMMLはGORRYさんのSPICE(回路シミュレータじゃないほう)とか abcmidiとかもっとちゃんとしたのがいっぱいありますので、 いろいろ試してみてください。
ちなみにMMLの文法は、(今は亡きMSX Magazineの)Musicaがベースになってます。 Musicaは知らなくても、MS系BASICがmother tongueな人にとってはMMLはお手のものでしょう…
でも、トシがばれますな(汗)
そのうちの一つに、PC9801用の「SuperDepth」があります。 これはMMLを別ファイルで持っていたので変換しやすかったというのもありますが、 単純なメロディーなのにけっこうゲームの雰囲気がでてて 個人的にはお気に入りです。
で、これが配布可能かどうかライセンスを調べようとしていたんです。 SuperDepthのオリジナルアーカイブ探せばいいかなと思って 謎書庫をごそごそあさってフロッピーディスクを発見できたのはいいんですが、 これがなんと(PC9801用の)1.2MBフォーマット… 読めないじゃないか(-_-;;;
いろいろと時の流れを感じさせられるプログラムでした。
ただこれ、本物に近づけるために周波数とかタイミングの規格を 通信関係の本を調べて調整した記憶があります ^^; いちおうオリジナルであるとして収録しちゃいました。