MML2Q1 MML形式ファイルをQ1形式に変換する

書法

MML2Q1 [ filename | * | :script ]* [ option ]*

SHELLMODE

@記述、!記述、^記述

詳細

MML形式ファイルをQ1形式に変換して標準出力する。
ファイル名を複数指定すると順に連結してから取り扱う。 ファイル名を省略すると標準入力を取り扱う。

「*」の場合は標準入力を扱う。

先頭が「:」の場合は、文字列をソーステキストとして取り扱う。

P1形式を出力できる(-P)。

ティック

MMLでの時間管理はティック単位で行う。ティックの分解能は四分音符当たり480である。

リストファイル

リストファイルは、MMLの文法検査、及び、ステップ検査に使用する。

エラーが発生した場合は、その位置までのリストを出力する。 また、MML内に「?」、すなわち、小節区切りが書かれると、その小節のティック数の値をリスト上に出力するので小節の中の音符の長さを検査できる。

MML記述

トラック単位で記述するようになってる。トラック数の制限はなく、トラック記述を単純に並べるだけでよい。

トラックには実際にその場でチャンネルに展開されるリアルトラックと、いったん記憶しておくマクロトラックの二種類がある。

リアルトラックにチャンネルを割り当てるが、複数のトラックを同一チャンネルに割り当てることも可能である。ただし、この場合は、チャンネル内の発音のぶつかりを検定しない。

リアルトラック記述

リアルトラックはつぎのように書く。

$n ={ { イベント }+ }

ここで、n はMIDIチャンネル(0 〜 15)。

記述例:

$0={ CDEFGAB<C }

マクロトラック記述

一つのマクロトラックはつぎのように書く。

@name ={ { イベント }+ }

ここで、name はマクロ名。全角か、半角英数字で書く。

マクロトラックはmml記述内で引用できる。引用する前にマクロトラックは記述されていなければならない。

現在は、マクロトラック内のチャンネルはすべて同一のものとして扱われるので、マクロトラック内でのチャンネル変更は勧められない。特殊な引用方法をした場合には、マクロトラック内のチャンネルはそのまま展開される。

注釈

注釈は二種類ある。

  1. /*」と「*/」の間
  2. //」から行末まで

注釈は特殊なmmlの一種として実現しているので、mmlイベントの間、トラック記述の間に記述する必要がある。 記述の区切りに書けばよい。

数値の記法

数値は整数の範囲で十進数で記述する。このほかに補助的な記法が用意されている

$16進数

先頭に $をつけると16進数として書くことが出来る。

`音程

` 音名 [ 変位記号 ] オクターブ指定

先頭に `をつけると音程が示すノート番号を値とする。音程記述は C3が60。

音名
C から B
変位記号
# で半音高くなり、b で半音低くなる。
オクターブ指定
オクターブを表す数字。O イベントと同じ数字。
~音符長
全音符を1とした分割数で表した音符長をティックに変換した値。四分音符は4と書き、480ティック。八分音符は8と書き、240ティック。
_;
_; で囲んで整数を返すTSEXPR式を書ける。

トラック内に書いたときには、式中で次の値を使用できる。

&1 または ??channel
現在のチャンネル
&2 または ??tick
式開始時のtickで表した時間
&3 または ??offset
指定されているクロックオフセット
&4 または ??mark
^ イベントで設定した時間(ティック)
&5 または ??mtop
現在の小節の先頭(ティック)
&6 または ??mlen
現在の小節の長さ(ティック)

イベント記述

^ 現在の時間をマークする

現在の時間を記憶する。この時間は 「*」イベントで取り出すことができる。マークは現在のトラック内で有効。

^# 現在の時間をマークする

^# マーク名 ;

現在の時間を指定の名前のマークに記憶する。この時間は 「*#」イベントで取り出すことができる。 名前つきのマークは全てのトラックで共通である。

* 現在の時間をマークした時間にする

^」イベントで記憶した時間を現在の時間とする。

タイは解除する。また、現在位置は小節の先頭になる。

*# 現在の時間をマークした時間にする

*# マーク名 ;

^#」イベントで名前つきのマークに記憶した時間を現在の時間とする。

タイは解除する。また、現在位置は小節の先頭になる。

*ティック 現在の時間を指定した時間にする

現在時間を指定のティックにする。一拍は480ティック。

タイは解除する。また、現在位置は小節の先頭になる。

/ 現在の時間を指定した小節の先頭にする

/ [ 小節長 , ] 小節番号

1小節を指定の小節長として、小節番号で指定した小節の先頭に現在時間を設定する。 小節長はクロック単位で指定する。4/4ならば1920。

小節長を省略すると、前回の小節長を使用する。トラックの最初では1920がデフォルトになっている。

タイは解除する。

| 現在の時間を指定した次の小節の先頭にする

| [ 小節長 ]

現在の小節の先頭に指定の小節長を加えて新たな小節先頭位置とし、現在時間をそこへ移動する。 小節長はクロック単位で指定する。4/4ならば1920。

小節長を省略すると、前回の小節長を使用する。トラックの最初では1920がデフォルトになっている。

タイは解除する。

> オクターブ下げる

音程を1オクターブ下げる。

< オクターブ上げる

音程を1オクターブ上げる。

? 小節の終わり

?」イベントを書いたところを小節線とみなし、リストファイルに小節内のティック数を出力する。

[ ] 和音

[]で囲まれた内容は和音とみなす。和音に付いては後述する。

( ) 割り込みトラック

()で囲まれたmmlは、現在時間からトラックとて展開するが、外側の時間の流れには影響を与えない。

= システム・イクスクルーシブ

システム・イクスクルーシブ。後述する。

現在時間は変化しない。

@ マクロ引用

@ マクロ名 [ , 繰り返し数 ] ;

指定されたマクロを現在時間から展開する。現在時間はマクロの分だけ先へ進む。 マクロ内のチャンネルは現在のチャンネルに変換される。

現在時間を進行させたくない場合には、割り込みトラック内にマクロを書けばよい。

@# マクロ特殊引用

@# マクロ名 [ , 繰り返し数 ] ;

指定されたマクロを現在時間から展開する。現在時間はマクロの分だけ先へ進む。 この指定は特殊で、マクロ内のチャンネルがそのまま展開される。通常は使わない。

現在時間を進行させたくない場合には、割り込みトラック内にマクロを書けばよい。

@( ) 式マクロトラック

@( TSEXPR )

文字列を返すTSEXPR式を書くとそれを内容としたトラック展開を行う。時間が進行する。 生成した内容はトラックとして扱うので呼び出し側に影響を与えない。

現在時間を進行させたくない場合には、割り込みトラック内に式マクロトラックを書けばよい。

式中で使用できる値は次の通り

&1 または ??channel
現在のチャンネル
&2 または ??tick
式開始時のtickで表した時間
&3 または ??offset
指定されているクロックオフセット
&4 または ??mark
^ イベントで設定した時間(ティック)
&5 または ??mtop
現在の小節の先頭(ティック)
&6 または ??mlen
現在の小節の長さ(ティック)
@[ ] 式マクロ

@[ TSEXPR ]

文字列を返すTSEXPR式を書くとそれを内容とした展開を行う。時間が進行する。 展開は式を呼び出した側のトラックの上で行われる。

現在時間を進行させたくない場合には、割り込みトラック内に式マクロを書けばよい。

式中で使用できる値は次の通り

&1 または ??channel
現在のチャンネル
&2 または ??tick
式開始時のtickで表した時間
&3 または ??offset
指定されているクロックオフセット
&4 または ??mark
^ イベントで設定した時間(ティック)
A-G 音符

音程 [ 音長 ] [ タイ ] [ , ヴェロシティ ]

音程

音名 [ 変位記号 ]

音名
C | D | E | F | G | A | B
変位記号
# | + | -
#半音上げる
+半音上げる
-半音下げる
音長

n [ . | .. | ' | '' ] | . | .. | ' | '' | %t

n 音の長さ。全音符を1とした分割数で表す。四分音符は4。八分音符は8。指定した音長は記憶される。
. 付点。音符の長さを1.5倍する。付点指定は一時的な効果しか持たない、
.. 付点。音符の長さを1.75倍する。付点指定は一時的な効果しか持たない、
' 音符の長さを半分にする。一時的な効果しか持たない。
'' 音符の長さを1/4にする。一時的な効果しか持たない
%t ティック単位で音長を指定する。
タイ

&

タイを表す。次の音符が同じ音高ならば一つの音符にまとめる。

ヴェロシティ
0〜127の間の数値。
H チャンネル指定

Hn

n midiチャンネル (0〜15)

以降の出力チャンネルを切り替える。タイは無効になる。

J タイミングオフセット

J [ [ - ] n ]

n ティック数。省略すると 0 。

midiイベントやメトロノームの働くタイミングを移動する。

K ポリフォニック・アフタータッチ

K { ノート番号 | ノート表記 } , v

ノート番号 0-127のノート番号。
ノート表記 音名による表記。
音名 [ # | b ] [ -] octave
C#3、Eb-1といった書き方。
v 数値 。
K# ポリフォニック・アフタータッチ変化

K# { ノート番号 | ノート表記 } , start , end , span [ , divide [ , delay ] ]

ノート番号 0-127のノート番号。
ノート表記 音名による表記。
音名 [ # | b ] [ -] octave
C#3、Eb-1といった書き方。
start ポリフォニック・アフタータッチ開始値(0-127)
end ポリフォニック・アフタータッチ終了値(0-127)
span 区間長。クロック単位で正の値を指定。
divide 分割数。1以上を指定
delay 位置をクロック単位で調整

現在から、区間長のあいだ、開始値から終了値まで変化させながらポリフォニック・アフタータッチを生成する。現在時間は変化しない。

L 音長指定

L [ n ]

n 音の長さ。全音符を1とした分割数で表す。

四分音符は4。八分音符は8。指定した音長は記憶される。

M 速度指定

M n

n 1分間に入る四分音符の数で指定する。

メトロノームは同一ティック内では一番後に書いたものが有効になる。混乱を避けるために、最初のトラック、または、速度指定専用のトラックに書く事を推奨する。

N 移調指定

N [ [ - ] n ]

n 半音単位で移調量を指定する。
O オクターブ指定

O [ [ - ] n ]

n オクターブ指定(-2から8)。省略すると3。

O3のCが中央ド。これは、ヤマハの記述方法と同じ。

P ピッチベンド

P [ [ - n

n ピッチベンド量(-8192〜8191)。省略すると 0 。

現在時間は変化しない。

P# ピッチベンド変化

P# start , end , span [ divide ]

start ピッチベンド開始値(-8192〜8191)
end ピッチベンド終了値(-8192〜8191)
span 区間長。クロック単位で正の値を指定。
divide 分割数。1以上を指定

現在から、区間長のあいだ、開始値から終了値まで変化させながらピッチベンドを生成する。現在時間は変化しない。

Q コントロールチェンジ

Q [ n , ] m

n コントロールチェンジ番号。省略すると前回の番号。
m コントロールチェンジ量(0-127)

現在時間は変化しない。

Q# コントロールチェンジ変化

Q# n , start , end , span [ , divide [ , delay ] ]

n コントロールチェンジ番号。省略すると前回の番号。
start コントロールチェンジ開始値(0-127)
end コントロールチェンジ終了値(0-127)
span 区間長。クロック単位で正の値を指定。
divide 分割数。1以上を指定
delay 位置をクロック単位で調整

現在から、区間長のあいだ、開始値から終了値まで変化させながらコントロールチェンジを生成する。現在時間は変化しない。

R 休符

R [ 音長 ]

音長

n [ . | .. | ' | '' ] | . | .. | ' | '' | %t

n 音の長さ。全音符を1とした分割数で表す。四分音符は4。八分音符は8。指定した音長は記憶される。
. 付点。音符の長さを1.5倍する。付点指定は一時的な効果しか持たない、
.. 付点。音符の長さを1.75倍する。付点指定は一時的な効果しか持たない、
' 音符の長さを半分にする。一時的な効果しか持たない。
'' 音符の長さを1/4にする。一時的な効果しか持たない
%t ティック単位で音長を指定する。

休符。タイは無効になる。

S プログラムチェンジ

S n
S MSB , n
S MSB , LSB , n

n プログラムチェンジ番号
MSB バンクMSB
LSB バンクLSB

バンクを指定すると、バンク番号、プログラムチェンジの順で出力する。複数のメッセージを同じタイミングで出力するが、このとき、オプション(-D)で指定したティック間隔でメッセージを出力する。 現在時間は変化しない。

T チャンネル・アフタータッチ指定

T [ n ]

n アフタータッチ量(省略すると 0 )

現在時間は変化しない。

T# チャンネル・アフタータッチ変化

T# start , end , span [ , divide [ , delay ] ]

start チャンネル・アフタータッチ開始値(0-127)
end チャンネル・アフタータッチ終了値(0-127)
span 区間長。クロック単位で正の値を指定。
divide 分割数。1以上を指定
delay 位置をクロック単位で調整

現在から、区間長のあいだ、開始値から終了値まで変化させながらチャンネル・アフタータッチを生成する。現在時間は変化しない。

V ベロシティ指定

V [ n ]

n ベロシティ値(省略すると64)
W 音長指定

W [ n ]

n ティック。省略すると480。

音長をティックで指定。

X 発音時間指定

X [ n ]

n ティック。省略すると 0 。

発音時間をティックで指定。

Y 無音時間指定

Y [ n ]

n ティック。省略すると 48。

無音時間を指定する。 これが指定されると、発音時間は、音長−無音時間になる。 発音時間が負になると、発音時間0で出力する。

Z 発音時間比率指定

Z [ n ]

n 比率。省略すると 80。

発音時間を音長に対するパーセントで指定する。

和音

和音は以下の書式で記述する。

[ [ n [ . ] | % t ] [ , offs ] イベント並び ]

n 音の長さ。全音符を1とした分割数。四分音符は4。八分音符は8。指定した音長は記憶される。
. 付点。音符の長さを1.5倍にする。付点指定は一時的な効果しか持たない。
%t 音の長さをティック単位で指定する。
offs 音のズレをティック単位で指定する。和音内で音符を書くたびに音のズレの分だけ発音が遅れていく。

[」「]」の中にイベントを書くが、音長を変更するようなイベントは書けない。次のような制限がある。

L,R,W、マクロ関係、割り込みトラック、マーク関係、和音、SYSEX
書けない
音符
通常の音符と同様に書けるが、音長に関するものは、発音時間を決めるために仮に指定するものとなる。また、音長を省略すると和音の先頭で指定した音長を利用する。「&」は意味がないので書けない。

マーク機能

^」で現在時間を記憶し、「*」で記憶した時間を取り出して現在時間に設定する。

マークの有効範囲はトラック記述の範囲。

マーク機能を使う事で、複数のメロディからなるラインを同一のトラックにまとめて書く事ができる。複数のメロディは本来は別のトラックに書くべきものだが、同一トラック内に複数ラインをMMLで書いて見やすくするために付加した機能である。

下の例は、全音から出ている「和声学」(石黒著)の例題を表したもの。なんとか、縦横の関係が掴めるのではないでだろうか。

$1={
^O4 E4FE  D2>B4& B<C>G  A2 G4   G2.     ;ソプラノ
*O3 G2.   F2.    E2.    F4ED    E2.     ;アルト
*O3 C2.  >B4<CD  C2.&   C2>B4   C2.     ;テナー
*O2 C2.   G2.    A2.    F2 G4   C2.     ;バス
}

割り込みトラック

(」と「)」で挟んだ内側は、割り込みトラックとして扱う。通常のトラックと同様に書くが、割り込みトラックの現れた時間位置から展開し、終了すると、割り込みトラックの外側は元の時間位置に戻る。

割り込みトラックは、開始時にデフォルトの音長などが初期化される。チャンネルは外側のチャンネルを継承する。また、割り込みトラック内での操作は外側のトラックに影響を及ぼさない。

SYXの扱い

システム・イクスクルーシブメッセージを「=」と「;」の間にスペースで区切って内容を記述できる。基本的にはバイト単位で記述するが、メッセージ先頭の0xf0とメッセージ末尾の0xf7は書く必要が無い。プログラムが自動的に補う。

内容として記述できるものは以下の通り。

16進数
二桁の16進数
&10進数
10進数は先頭に &をつける。
/ 集計のリセット
R、Y、Kの三種の集計をリセットする。
K
/以降現在位置までの集計結果を出力。合計に0xa5を加えた下位7bit。
R
合計の2の補数の下位7bit。
Y
合計の下位7bit。
( bin tsexpr式 )
バイナリ型を返すTSEXPR式を書ける。

SYX内を分割出力するために特殊な記法があるが、通常は使用する必要は無い。

=! 内容 ;
この書き方をすると、メッセージの最後に0xf7を自動付加しない。
=# 内容 ;
この書き方をすると、何も付加せず内容を出力する。

OPTION

-Dティック数
mmlのSコマンドでバンクを出力するときに、メッセージ間に挟むクロック数を指定する。デフォルトは0。
-Lfilename
指定のファイルへリスト出力する。
-N
出力しない。
-Ofilename
指定のファイルに出力を切り替える。
-P
出力をP1形式にする。
-Q
出力をQ1形式にする。(デフォルト)
-Ttime
P1形式でのティックあたりの時間をmS単位で指定する
時間指定には小数での指定が可能。(例、-T8.224)。
デフォルトは8.00mSである。
-X
オプション(-L)指定で出力するリストの中に、式マクロの出力を挟まない。

用例

参考

バージョン

Ver 1.00初版