H-MML 2.00 仕様書 ドラフト

Last Updated: 2001/09/08


 この文章はH-MML(HiNa's Music Macro Language) Version 2.00のドラフト版仕様書です。
 この文章では「H-MML」の文法を定義し、いくつかの命令を定義します。(実際にどのように実装されるかは実装ソフトウェアによって異なりますので、各々の実装仕様書又はリファレンスを見てください。)



H-MMLの記載方法

 H-MMLはテキスト文章です。通常、メモ帳(Windows)やシンプルテキスト(Macintosh)などを用いて作成を行います。その際、機種毎に依存の出てくる「文字セット」や「改行コード」はともに『自由』としています。ただし、実装ソフトウェアによっては「文字セット」や「改行コード」を指定するものがあるかもしれません。

※文字セット:日本語やその他の言語(英独伊中韓など全ての言語)をコンピュータに理解させるときの情報の表し方です。日本語の場合は主に「Shift JIS」「ISO-2022-JP(JIS)」「EUC-JP」が一般的によく用いられます。また、国際統一で「UNICODE」というものも定義されています。通常、H-MMLのメインに関する部分は半角英数字でかかれますので気にする必要はありません。
※改行コード:行の終わりを示すコード(符号)で、一般的には<CR>や<LF>などの符号を用いて表記し、多くは基本ソフト(OS)に依存します。H-MMLでは改行を区切りとして利用しますので、OSとソフトウェアの組み合わせによっては正常に改行と認識しないこともあります。

 実際の記述は、【1音休符】又は【1命令】毎に1行を利用します。また、各行中での文字の区切りには1つ以上の【タブ】又は【スペース】を利用します。また、以下、記述上の決まりとして、タブやスペースで区切られた各要素を前(左)から「第1項」…「第χ項」とします。


音符の記述方法

 音符(「ド」とか「レ」など)は以下の形式に従って記述します。それぞれの項目は「タブ」又は「半角スペース」によって区切られます。タブやスペースの数は特に指定しません(実装ソフトウェアでは制限しないことが推奨されます)。

記述例:  4      C#      2

 音符の場合、第1項から順に「音の長さ」「音程」「音の高さ」の順に記載します。この例の場合は、「音の長さ=4」「音程=C#」「音の高さ=2」となります。
 特に変換プログラムで指定が無い限り記載には「半角英数文字」を使います。

音の長さ

 H-MMLで扱う「音の長さ」とは、予め任意に設定した【最小音符】に対する相対長を示します。例えば、八分音符を最小音符とした場合、四分音符は「2」、付点四分音符は「3」、全音符は「8」のように指定します。最小音符より短い音符(長さが1未満になる)や小数倍の長さは指定できません。また、OMPの仕様上、16倍を超える長さは扱うことができません。

音程

 H-MMLの言語指定デフォルト(初期値)は「English」となっています。後に解説する「C-LANGUAGE命令」を使わなければ、「英米国式表記」を用いて音程を指定します。「ドレミファソラシド」との対応は以下の表の通りです。

ファ
CDEFGAB

 言語の指定を変更するしないに関わらず、それぞれの指定音から半音あげる「#」の指定もできます。例えば、「ド#」は「C#」と書くことができます。また、「#」と同一の機能として「+」を指定する事もできます。
 なお、半音下げる「フラット」に対応するものはありませんし、ダブルシャープに相当するものも利用できません。

音の高さ

 この項目では、いわゆる「オクターヴの指定」をします。OMPの仕様やポケコンのBEEP命令の仕様から考慮し、音の高さは「1」〜「4」に対応します。また、いわゆる「真ん中の音」は「2」となり、数字が小さければ低く、大きければ高くなります。


休符の記述方法

 休符は音符と似た書式をとり、下のようになります。

記述例:  4      *

 基本的に上記「音符の記述方法」に準じます。ただし、第2項が「*」になり、第3項はありません。
 第1項は「音の長さ」を示します。第2項には音程の代わりに休符を示す「*」を書きます。言語指定に関わらず「*」のみが認められます。


コメント(注釈)の記述方法

 コメント(注釈)はH-MML中のどこに書いても問題なく、コメント宣言文字以降その行が終わるまで変換時に無視します。
 コメントは半角のシングルクォート「'」によって認識されます。「'」とそれに続く文字列の間にタブやスペースは必要ありません。
 命令中にシングルクォートを書いた場合もそれ以降コメントと解釈しますので注意して下さい。

記述例1:  'ここはコメントです。
記述例2:  '4  C  2 ここもコメントになり、音符と認識されません。
記述例3:  4  C  2 'これは認識されます。
記述例4:  C-TITLE: HiNa's Music   命令に認識できるのは「HiNa」までです。

H-MML 1.x以前では「コメントも命令と認識する」としていましたが、命令法則に反するため独立して認識します。


各種命令の記述方法

 各種命令の指定方法は2.00によって変更になりました。全ての命令語の先頭に「C-」(Command-)と付き、拡張命令という扱いは無くなりました。以前のバージョンとの互換性はありません。
 H-MMLに追加したい機能があれば、HiNaに申請してください。必要であるか考えた上で採用/非採用を決めます。なお、自分に識別できない命令があった場合は無視してください(警告でも構いません)。

 命令の指定形式は「C-meirei: hikisu」となります。「meirei」部分には任意(又は指定)の命令識別子が入ります。「hikisu」には必要な場合、引数を指定する事ができます。パラメータとして受け取れば良いでしょう。また、引数を必要としない命令も有ります。

テンポ命令

 テンポは対応/利用ともに必須となっています。H-MML中で最初の音符や休符が出てくる前に必ず定義する必要があります。
 テンポを途中で変更する事も可能ですが、実用性がとても低いためH-MMLとしては推奨しません。

 テンポの指定には「C-TEMPO:」を利用します。引数は「1分間あたりの最小音符演奏回数」です。例えば、最小音符が240回/分の場合、次のように記載します。
記述例:  C-TEMPO: 240
 この命令は1.xの「TEMPO:」命令と完全な互換性を持ちます。

言語指定命令

 従来のH-MMLでは完全に「英米国式表記」である「CDEFGAB(English)」を用いて来ましたが、何らかの理由その他の言語を指定するときに指定します。デフォルトでは「English」が認識されます。
 この命令は最初の音休符データより前に定義する必要があります。最初の音休符より後に有る場合は、エラーとしてください。

 言語指定には「C-LANGUAGE:」を利用します。引数は「言語識別符号」です。基本的にEnglish以外は定義しませんが、別のものを定義する場合は他の実装ソフトウェアの状況を見た上で決定してください。
記述例:  C-LANGUAGE: ENGLISH

ループ指定命令

 従来のH-MMLでは繰り返したい場合にもう一度全てを書く必要があり、冗長が見られました。この命令では、ループを定義する事で冗長を減らすのを目的とします。
 この命令は2つの命令を必ず対として利用する必要があります。多重ループはできませんし、完全なループ以外に利用する事は出来ません。

 ループ開始指定には「C-LOOP:」を利用します。引数は「付加回数」です。例えば2を指定したときは、元の部分にあわせて2回、つまり3回演奏分のループが実行されます。
記述例:  C-LOOP: 2
 ループ終了指定には「C-LEND:」を利用します。引数はありません。
記述例:  C-LEND:

タイトル命令

 楽曲のタイトルを指定する命令です。H-MMLはその利用方法を特に定義しません。実装ソフトウェアに完全に依存します。
 この命令は実装しなくても構いません。OMPデータ以外の何かを作成する場合に利用しても良いと思います。

 タイトル指定には「C-TITLE:」を利用します。引数は「タイトル文字列」です。
記述例:  C-TITLE: SampleSongTitle

著作権/製作者命令

 楽曲ですから、著作権やらが絡んできます。それを定義する命令ですが、H-MMLはその利用方法を特に定義しません。実装ソフトウェアに完全に依存します。
 この命令は実装しなくても構いません。OMPデータ以外の何かを作成する場合に利用しても良いと思います。

 著作権指定には「C-COPYRIGHT:」を利用します。引数は「著作者名」です。
記述例:  C-COPYRIGHT: 著作者
 データ制作者指定には「C-AUTHOR:」を利用します。引数は「制作者名」です。
記述例:  C-AUTHOR: 制作者

パート終了命令

 H-MMLは単音を想定して作成されていますが、H-MMLから着メロを製作したりMIDIを製作したりする場合はマルチパートが欲しくなるかも知れません。そのパート毎の終了を示すのがこの命令です。
 マルチパートに対応しないプログラムの場合は、この命令が来たらそれ以上MMLの解析をしないようにしてください。
 この終了データによって、テンポや言語のデータはリセットされません。C-LOOP〜C-LEND中の場合は、C-LENDも同時にかかれているものとして処理してください。

 指定には「C-PARTEND:」を利用します。引数は特にありません。
記述例:  C-PARTEND:


H-MML Version 2.00 Copyright © by HiNa soft / HiNa. All rights resaved.
転載許可。
HiNa連絡先:h-i-n-a at post.tok2.com