1993/2/7 2001/4/24 更新 mml2mid Version 5.29 利用の手引 門田暁人 藤井秀樹 黒田久泰 新出尚之 1. はじめに mml2midは,MMLファイルをコンパイルしてMIDIファイルに変換するツールです。 MML(Music Macro Language)という音楽を記述する言語で書かれたテキスト ファイルを,標準MIDIファイル(FORMAT 0 および 1)に変換します. mml2midでは緻密なデータ作成を可能とするために,作者がMMLによる打ち込みを 行ってきた長年の経験を活かして,MIDIデータの作成に適した仕様を決定しました. 従来のMMLドライバ PMD, MUSIC LALF, FSD, MUZAX, MDD, FPD などの仕様を参考に しています。 (※ 以下、nおよびn1,n2,n3……は数値を表します.) 2. 使用方法 mml2mid では,指定された MMLファイルを,MIDファイルに変換します. 起動方法は, mml2mid [オプションスイッチ] MMLファイル名 [MIDファイル名] です. 以下にオプションスイッチの仕様を示します. -f FORMAT0のファイルを出力する.(ディフォルトではFORMAT1の ファイルが出力されます) -tn 全体をnだけトランスポーズ(移調)させる. ただし、後で説明しますが'RT'の付いているトラックはトランスポーズ しません. -x オクターブの上げ下げ > , < の効果を逆にする。 -v ベロシティの上げ下げ ) , ( の効果を逆にする。 -m MMLファイル中の文字列を「MS漢字コード(シフトJIS)ではない」と 判断するかどうかを反転する。 -w MMLファイル中に理解できない文字が現れた場合、エラーとせずに 警告だけしてその文字を無視し、コンパイルを続行する。 -c 古いバージョンのmml2midに存在した、ドキュメントに書かれて いなかった以下の2つの振る舞いを模倣する。 1) MMLファイル中の、行頭が空白の行は注釈行と見なす(前の行 からの継続行は除く)。 2) 「/* */」による注釈が閉じていなくてもエラーとしない。 -t以外の各オプションはトグル・スイッチになっていて、偶数回指定すると元に 戻ります。 環境変数MML2MID_OPTIONSにオプションスイッチを指定しておくこともできます。 (-mオプションに関する補注) mml2midでは、MMLファイル中の文字列内(「" "」の中)の「\」は、後述のように 特別な扱いを受けますが、MS漢字コードでは日本語文字の2バイト目に「\」と 同じコードが混じることがあります。そのため、文字列内にMS漢字コードが 使われているのにmml2midが「文字列はMS漢字コードでない」と思ったり、 あるいはその逆が起きたりすると、誤動作を引き起こす場合があります。 -mは、それを回避するために必要となるオプションです。 mml2midはデフォルトでは、DOS版/Windows版は「文字列はMS漢字コードである」 と仮定し、UNIX版は「文字列はMS漢字コードでない」と仮定します。-mオプション は、この仮定を反転します。 従って、MS漢字コードで書かれたMMLファイルをUNIX版mml2midでコンパイルする 場合と、MS漢字コードでないMMLファイルをDOS/Windows版mml2midでコンパイルする 場合は、-mオプションを指定しないと、文字列によっては誤動作する場合があり ます(むろん、たまたま正常動作する場合もあります)。 通常の使用(DOS環境で、文字コードにMS漢字コードを使っている場合など)では 指定の必要はないでしょう。 なお、文字列にISO-2022-JP(俗称「JISコード」)などのコードを使うことは 今のところできません。MS漢字コードか日本語EUCなどを使って下さい。また、 文字列内と注釈以外には日本語文字は書けません。書くと正常動作しないおそれが あります。 [実行例] 例1: mml2mid -t2 sample.mml sample.mid 例2: mml2mid -f sample.mml 例3: mml2mid -f -x -t5 sample.mml 例4: mml2mid -fxt5 sample.mml 入力ファイル名の拡張子「.mml」は省略できます。例えば入力ファイル名が 「sample.mml」の場合、「sample」と指定することができます。但しその場合、 「sample」というファイルが別にあった場合はそちらの方が読まれます。 出力ファイル名を省略することもできます。その場合、入力ファイル名の拡張 子を「.mid」に変えた名のファイルが、出力ファイルとなります。 入力ファイル名を「-」と指定すると、MML入力を標準入力から読みます(bccで コンパイルされているDOS版を除く)。この場合、出力ファイル名を略すると、標準 出力に出力します(UNIX版のみ。その他の場合はエラー)。 出力ファイル名を「-」と指定すると、MIDI出力は標準出力へ出ます(UNIX版のみ)。 ただし、端末には出力できません。ファイルやパイプへリダイレクトして下さい。 なお、mml2midはコンパイルの際に、タイトルや各チャンネルの総ステップ数 などの情報を出力します。これは、UNIX版では標準エラー出力へ、DOS/Windows版 では標準出力へ出ます。UNIX版以外でMIDI出力を標準出力に出せないようになって いるのは、このためです。 3. MMLの仕様 以下でMMLの仕様について説明します. いままでMMLを使ったことがないという人にとっては、大変分かりにくいかと 思いますので,一通り目を通した後でサンプルMMLを参考にすることをお勧めします. 3.1 MMLファイル全体の構成 mml2midにおけるMMLファイルは,定義行,マクロ行,MML行,の3種類の行から 構成されます.詳しくは後で説明しますが,ここでは,概略だけ紹介します. ・定義行は,'#' で始まる行です. 曲のタイトルやタイムベースを記述したり,外部ファイルを読み込みます. [例] #title"Catch Me Tonight" #copyright"(c) Akito Monden" #timebase 48 #include "def.mml" ・マクロ行は,'$'で始まる行です. 後で繰り返し呼び出して使うマクロと呼ばれる行を記述します. ドラムの各楽器に割り当てると便利です。 (Jコマンドを使うとドラム音色の指定が楽になります。後ほどJコマンドの 説明をご覧下さい) [例] $k k100 J36 ; kick $s k105 J38 ; snare $h k70 J44 ; hihat $2h k70 J42 ; hihat2 ・MML行は,下の例のように,'A', '1A' などのトラック名で始まる行です. 音符やプログラムチェンジなどのMMLコマンドを記述します. [例] A C1 @17 v110 k110 q6 o5 l8 p64 B C2 @38 v97 k100 q3 o1 l16 p64 A f2^8fga->c4]4 なお、MMLファイル中では行頭の空白は無視されます。 以降では、定義行,マクロ行,MML行のそれぞれについて、 詳しく説明していきます。 3.2 定義行 #title "文字列" 曲名を指定します.最大文字数は半角文字で255文字です. 通常,ファイルの先頭に書いておきます. 文字列では、次のような表記が使えます。 \034 …8進数で034の文字 \x4a …16進数で4aの文字 \n, \t, \b, \r, \f, \a, \v …C言語と同じ \e …\033と同じ \の次に上記以外の文字 …その文字そのもの なお、これらはtitleだけでなく、MMLファイル中の「" "」で囲まれた文字列一般 に有効です。 リターン(改行コード)を文字列の中に直接入れることはできません。入れたい 場合は「\n」と表記して下さい。また、文字列を閉じる「"」を省略することは できません(エラーになります)。 #copyright "文字列" 著作権表示を記述します。 標準MIDIファイルの第1トラックにコピーライト記述が入ります。 SMFメタイベント FF 02 により出力されます。 #timebase n タイムベース(4分音符の分解能)を指定します. #timebase の記述を省略した場合には n = 48 となります. nの値は,48, 60, 80, 96, 120, 160, 240, 480 が指定可能です. 通常は,n = 48 で問題ないと思います. [例] n = 48 (#timebase 48)の場合,4分音符の長さを48ステップに指定します. その他の音長は,例えば,次のようなステップ数になります. 2分音符 = 96ステップ 8分音符 = 24ステップ 16分音符 = 12ステップ 32分音符 = 6ステップ 64分音符 = 3ステップ #include "ファイル名" この場所に指定したファイルを読み込みます. C言語の#include文とほぼ同じです。 いろいろな曲でよく使うExclusiveなどの設定を別ファイルにまとめておいて, #includeで読み込むようにすると便利です. [注意] 「#include "c:\mml\common.mml"」などとすると期待通りの動作はしません。 文字列中の「\」が、#titleの項で説明したような特別な扱いを受けるためです。 「#include "c:/mml/common.mml"」あるいは「#include "c:\\mml\\common.mml"」 などのようにして下さい。 #swap<> オクターブの上げ下げ「>」「<」の効果を逆にします。偶数回指定すると元に戻り ます。ファイル中のどこか1箇所で指定すると全体に有効です(局所的に「<」「>」 を入れ換えるなどのことはできません)。 #swap() ベロシティの上げ下げ「)」「(」の効果を逆にします。偶数回指定すると元に戻り ます。#swap<>と同様、ファイル中のどこか1箇所で指定すると全体に有効です。 #german ドイツ流の音名を使います。hがシ、bがシのフラットになります。この宣言が ない場合、bがシで、hはエラーになります。これも、ファイル中のどこか1箇 所で指定すると全体に有効です。 #xtempo n 曲全体のテンポをn/100倍します。複数回指定しても最後のものだけがファイル 全体に有効で、部分的にテンポの倍率を変えたりはできません。 #bc525 ver5.26でそれまでとコンパチブルでなくなった一部のMMLコマンドについて、 動作を以前とコンパチブルに戻します。 ver5.25まではMMLコマンド「*」が「__」と同じ意味でしたが、5.26からは 「*」は音符の後に付くナチュラルの意味になります。また、5.25までは 音符の後に「-」を2つ付けた場合、1つ目はフラット、2つ目は標準の音長 からの引き算の意味でしたが、5.26からは2つのフラットになります。これら について、5.25までの動作に戻します。 3.3 マクロ行 $a〜$zで始まる行です.マクロ行はMML行から,$a〜$zを指定することにより, 呼び出すことができます。 [例] $a c8cc ; マクロ行 $b cccccccc ; マクロ行 ※ Ver5.05からは、マクロの数が10倍に増えました。 $1a〜$9a, $1b〜$9b, $1c〜$9c, …, $1z〜$9z が使えます。 $0a,$0b,$0c,…,$0z は、$a,$b,$c,…,$z と同じ扱いになります。 ※ Ver5.05からは、マクロ内で別のマクロを呼び出すことも可能になりました。 ただし、呼び出される方のマクロを先に指定しておく必要があります。 A C3 @115 [$a]7$b[[$a]3:cccc]2ggee ; この行でマクロを呼び出している | | | | | 音色番号115の指定 | | | MIDIチャンネル3の指定 | トラック0Aの指定 なお,旧バージョンでは,マクロ行は,マクロを呼び出す行よりも前に置く 必要がありましたが,Ver5.00以降では,マクロ行はファイル中のどこにあっても かまいません。(ただし、マクロ内から別のマクロを呼び出す場合に限り、 呼び出される方のマクロを先に書いておく必要があります) ※ マクロ内のループ(「[ ]」)は、マクロが呼び出される時点ではなく定義され る時点で展開されます。従って、マクロ内で使うループは(回数指定も含めて) マクロ内で完結していなければなりません。例えば $a [cde] A $a3 のようなことはできません。これは $a cde A [$a]3 あるいは $a [cde]3 A $a のように書く必要があります。 ※ 「" "」で囲まれた文字列の中ではマクロ展開が行われません。しかし、マク ロの定義内容を文字列にすることはできます。 [例] $a "violin" A C1"1st."+$a … B C2"2nd."+$a … これでAトラックのトラック名は「1st.violin」になります。(「+」は文字列 の連接です。「Cn"文字列"」コマンドの項参照) 3.4 MML行 MML行は,トラック名と,その後に続くMMLコマンド列から構成されます. トラックヘッダの記述の形式は,Version 5.00α から大幅に変更されました. (従来通りの指定も可能です.) さらに、Ver5.00から、従属トラックの概念が導入されました。 [例] AC @120 v100 k100 o4 f2^8fga->c4]4 D [fcfga-fa-b->cfcce-fge-ga-b->e-c4 ・トラック名は、ワイルドカード'?'による指定も可能です。 '?'は'ABCDEFGHIJKLMNOPQRSTUVWXYZ'を表します。 [例] ? cdefg …… A〜Z全てのトラックに cdefg を書いたのと同じです。 1? cdefg …… 1A〜1Z全てのトラックに cdefg を書いたのと同じです。 ?1? cdefg …… A〜Z,1A〜1Z全てのトラックに cdefg を書いたのと同じです。 -------------------------------------------------------------------------- ここからは従属トラックの説明をしますが、初めてこのドキュメントを読む方は、 ここを読み飛ばして、先に「3.4.2 MMLコマンド列」の方を読んでください。 ここから下は、ある程度MMLコマンドが分かってないと理解できないと思います。 -------------------------------------------------------------------------- 従属トラックは、和音を書くためのトラックです。従属トラックでは、 その直前に現れた主トラックと自動的に同期が取られます。 ちょっと分かりにくいですので、具体例を出します。 例えば、Aトラックでメロディーの音を鳴らしているとします。 ところが、メロディーの途中で、一部分だけ和音を鳴らしたくなりました。 A ……… A ……… A ……… A ……… ←― このあたりで和音が鳴らしたくなった。 さあ大変、新たにトラックを作らないといけません。例えばBトラックを 作る事にします。そして、Bトラックの最初の方には休符をたくさんいれて、 和音を鳴らしたい部分にステップタイムを合わせないといけません。 そうすると、例えば、次のようになります。 A ……… B r1r1r1r1 A ……… B r1r1r1r1 A ……… B r1r1r1r1 A ……… ←このあたりで和音が鳴らしたくなった。 B …… こうやると、メロディーの途中で和音を鳴らせますが、結構手間がかかります。 新たにBトラックを作って、しかも最初の方に休符をたくさん入れないと いけないわけですから。 このような場合に、従属トラックを使うと、非常に楽に事が運びます。 A ……… A ……… A ……… A ………… ←このあたりで和音が鳴らしたくなった。 1A …… このようにすればいいのです。従属トラック1A の先頭では、直前の主トラックAの 先頭と、自動的にステップタイムが揃えられます。 従属トラックは、好きな時にいつでも、主トラックの直後に入れることが できます。 では次に、複数の箇所で和音を鳴らしたくなった場合の例を紹介します。 [別の例] A ……… A ……… A ……… A ………… ←このあたりで和音が鳴らしたくなった。 1A … 2A … A ……… A ……… A ……… A ………… ←このあたりで和音が鳴らしたくなった。 1A … 2A … A ……… A ……… A ………… ←このあたりで和音が鳴らしたくなった。 1A … 2A … A ……… このように、和音が鳴らしたくなった場所だけに従属トラックを入れれば 良いのです。主トラック'A'の従属トラックは1A〜9Aまでありますので、 1個の主トラックに付き、最高で10重和音まで鳴らせるということになります。 ようするに、「和音を鳴らしたい場合は従属トラックを使え!」です。 曲の最初から最後まで和音を鳴らしたいような場合は、従属トラックを 使う必要はありませんが。(使ってもいいですが) なお、従属トラックでも主トラックと同様に、チャンネルの指定(Cnコマンド)や、 基本音長、オクターブ、ベロシティーの設定は必要です。 ただし、ボリューム、エクスプレッション、ピッチベンドなど、1チャンネルに 付き1個の値しか持たないMIDIイベントは、従属トラックでは書かないように して下さい。 [例] A C1 o4 l8 k100 @0 v120 E127 BS64 …… 1A C1 o4 l8 k100 …… 2A C1 o4 l8 k100 …… 上の例ですと、従属トラックでは、プログラムチェンジ(@n)、ボリューム(vn)、 エクスプレッション(En)、ピッチベンド(BSn)の記述は不要です。 3.4.2 MMLコマンド列 MMLコマンドの説明をする前に,まず,数値の指定について説明します. mml2midでは,いくつかのコマンドで数値を指定する場合がありますが,10進数 による指定の他に,16進数による指定ができます. 具体的には,数値nの前に「x」あるいは「0x」を付けると,その直後の2桁の 数を16進数として扱います. [例] x4F, x0a, x40 この場合、16進数はちょうど2桁で指定せねばなりません。例えば「xa」とか 「x103」などは認められません。これは、桁数を可変にすると直後の音符指定 との境界が曖昧になるためです。 但し、「x」や「0x」の後を「{ }」でくくれば任意桁の16進数値が書けます。 例えば「0x{103}」のようにです。 「x」や「0x」で始まっていない数値は、10進数として扱います. では,以降で,個々のMMLコマンドについて説明していきます. 各コマンドは、大文字、小文字の区別がありますので、注意してください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cn そのトラックの出力するMIDIチャンネルを設定します。範囲は1〜16です。 トラックの途中でもチャンネルを変更できます.このコマンドは各トラックの 一番最初で必ず指定して下さい。 なお、このコマンドが指定されたときには、後で説明する's'コマンドの 効果が自動的に発効します。 Cn"文字列" チャンネル指定の直後に文字列を記述することで、トラック名の表記が 可能です。SMFメタイベント FF 03 により出力されます。 (日本語文字を使う場合、必要に応じてMML2MID実行時のオプションスイッチ -mを指定しないと誤動作する場合があります。2章参照) 「+」を使って文字列を連接することもできます。 (例) C3"abc"+"def" …C3"abcdef"と同じ これはエクスクルーシブの表記中やWT, WI, WL, WM, WCコマンドの引数の 文字列にも共通です(要するに「#」で始まる行以外の文字列すべてに有効)。 a〜g ・音符。c,d,e,f,g,a,bがそれぞれド,レ,ミ,ファ,ソ,ラ,シを表します。 ・後ろに'+'でシャープ(半音上がる)、'-'でフラット(半音下がる)を指定 できます。半音記号は必ず音長指定の前に置いて下さい。'++'や'--'と いう指定も可能です(3つ以上は不可)。 また、'*'でナチュラルの意になります。調号指定(後述)をしている場合 に、元の高さに戻すのに使います。 ・後ろに書かれた数値は音長を表し、音長を省略した場合はlコマンドの 設定値が採用されます。 [例1] c2 ドの2分音符 [例2] d-4 レのフラットの4分音符 [例3] l8 e ミの8分音符 ・符点'.'を1つまたは複数つけることができます。(例:c4.d4..e.) ・'^'で音長を加算することができます。'^'はいくつ使ってもかまいません。 (例: c8^16.^64) ・'-'で音長を減算することができます。'-'はいくつ使ってもかまいません。 '-'はフラット(半音下げる)の記号と同じであるため、表記には注意が 必要です。([例1] c-32 フラットと判定される) ([例2] c8-32 音長の減算と判定される) ([例3] c-8-32 最初の'-'はフラット、後の'-'は音長の減算) なお、減算および加算は後ろから累算されるため、c8-32-48などとやると、 32から48を引いた長さ96(= %2)が減算されてしまいます。このような 場合にはc8-32^48としなくてはなりません。これだと、32に48を足した 長さが8分音符から引かれることになります。 ・音長はどんなに長くなってもかまいません。(SMFでは音長指定を可変長 で表記するため) ・コンマ','で区切って、ベロシティを指定する事が可能です。省略時は kコマンドの値が採用されます。(例: c16,100 ) c16,+10やc16,-10のようにkコマンドの値からの相対指定も可能です。 ・音長指定を0にした場合には、ノートオフが行われません。これを利用して 和音演奏が可能です。(例: c0e0g4. この場合、g4.の後でc,e,gが ノートオフされます。) タイミングをずらした和音演奏については&コマンドを参照して下さい。 ・音長指定で前に'%'を付けると、クロック数の指定になります。4分音符を 48クロックとします(c4 = c%48)。 (例: l4c0f0a-.^%12-48.,110 …aフラットの音長は付点4分音符 プラス 12クロック マイナス 付点48分音符) ・'%'を付けた場合も、音長を省略するとlコマンドの設定値が採用されます。 これによって、「所定の長さより××だけ長い(or短い)音」という記述も 可能です。 (例1: l2a%-8 …aの音長は2分音符 マイナス 8分音符。これを「l2a-8」 と記述すると、aのフラットの8分音符と解釈されてしまいます) ・Version 5.00 から,新機能が付け加わりました. 音符に対して,第2引数,第3引数の指定が可能になりました. 第2引数は,ゲートタイムの指定です. 第3引数は,キーオフベロシティの指定です. キーオフベロシティは,値の相対指定が可能です. [例] a4.,100,10,40 ラの符点4分音符を, ベロシティ100, ゲートタイム10, キーオフベロシティ40 で発音します. ・Version 5.26以降、重変記号(ダブルフラット、「--」)の指定が可能に なった関係で、音符の後ろに「--」を書いた場合の解釈が従来と非互換に なりました。例えば「a--8」と書くと、従来の版では最初の「-」はフラット で2番目の「-」は音長の(標準の長さからの)減算と解釈されましたが、 Version 5.26以降では「--」がダブルフラットと解釈されます。 Version 5.26で従来と同じ解釈をさせるには、定義行で「#bc525」指定を するか、「a-%-8」のように記述して下さい。 ln 音長を設定します。初期値は4です。音長指定は音符の場合と同じです。 (例: l4.-%12 …音長を付点4分音符マイナス12クロックに指定) r 休符を指定します。音長指定は音符の場合と同じです。 現在発音中の音は、休符の後でノートオフされます。 (例: c&e&g&r4. とやると、r4.の後でc,e,gがノートオフされる。これは c&e&g^4.とやった場合と同じです。) Ver5.00以前では,休符の後でキーオフする場合には、qコマンドが働かない という欠点がありましたが,Ver5.0以降では修正されています. (qおよび&コマンドを参照して下さい.) qn1,n2 ノートオフのタイミングをn1ステップだけ早くします.n1の初期値は1です. n2は最低発音長です.n1よりも優先されます. つまり,qコマンドによってノートオフのタイミングをn1ステップだけ 短くしますが,短くするとは言っても最低n2の長さは発音する,という ことです.n2の初期値は0です. このコマンドは,打ち込みには欠かせないコマンドです。 このコマンドは,Version5.0 から仕様が少し変わっています. n1にマイナスの値を指定(q-n1)すると,Ver5.0 以前のバージョンでは, ノートオン後n1クロックしてノートオフする,という意味でしたが, Ver5.0 以降では,q0よりも,さらにノートオフを遅らせるという意味に なっています. [例] q-4 a2c2 aの音がノートオンされて,次に,cの音がノートオンされてから 4ステップ後にaの音がノートオフされます. つまり,n1のマイナス指定は,レガート奏法のシミュレートに使えます. [例] q-10 c4e4a4 などとやると,スラーの効果を発揮します. Ver5.0以前のバージョンのようなnのマイナス指定をしたい場合は, 第1, 第2パラメータをうまく組み合わせて使って下さい. [例] 旧バージョンのq-2 → Ver5.0以降 q500,2 第1パラメータn1に大きな値を指定しておいて,第2パラメータn2に小さな値を 指定することにより,キーオンしてからn2ステップ後にキーオフされるように なります. 図で説明すると,以下のようになります. 音符のキーオン位置 | |<===========音符の長さ===============>| +------------+------------+------------+---> |<=== n2 ===>| |<====n1====>| 最低発音長 | 音符のキーオフ位置 Qn ノートオフのタイミングを割合で指定します(発音時間をn/8にします)。 初期値は8です。 (このコマンドは、PMDやN88BasicのMMLと同様の効果があります。) [例1] c4 [例2] Q2 c4 例1は4分音符の長さのcの音が発音されますが、例2では'Q2'が 指定されているので、4分音符の2/8の長さ(16分音符)だけcの音が 発音されます。つまり、4分音符=48ステップの2/8で12ステップ目で ノートオフされることになります。 このコマンドは、qコマンドと併用が可能です。 [例1] c2 … 2分音符=96ステップ [例2] Q2 c2 … 96の2/8で24ステップ目でノートオフされます。 [例3] Q2 q3 c2 … 24-3の21ステップ目でノートオフされます。 & 前の音をキーオフしない。このコマンドは音符または休符の直後でないと 意味を持ちません。 このコマンドはあくまでも前の音をキーオフしないだけで、従来のドライバに あった音符間のタイ(例えばc&c2のような)を指定する機能はありません。 タイコマンドとして機能させるには、次のようにして下さい。 (例:c&r2 この場合はc^2とほぼ同じ意味です.) また、次のようにするとタイミングをずらした和音演奏が可能です。 (例1: c&e&g 例2: c64&e64&g8-32 ) キーオン後、発音したまま(キーオフせずに)ボリュームを変えたりする ような場合にも使えます。(例: v100 c4& v80 r2 ) Ver5.0以前のバージョンと、少しだけ仕様が変わっています。 旧バージョンでは、c&r2 のように&で音符や休符を繋げた場合に、qコマンド の値の効果が無視されましたが、Ver5.0以降では修正されています。 kn ベロシティを設定します。初期値は100です。k-nおよびk+nで相対指定が できます。相対指定の時のnも省略できます.'k-'は,'k-1'と同じです. 'k+'は'k+1'と同じです. kn1 (,n2) (,n3) kコマンドに第2、第3パラメータを指定することもできます。この場合、 キーオンごとのベロシティの変化が指定できます。 n1 … ベロシティ(相対指定可) n2 … キーオンごとのベロシティ変化量(-127〜127) n3 … ベロシティが0か127を越えたときの処理を指定するスイッチ n3 = 1 のときベロシティの変化が反射的になる。 n3の初期値は0です。 [例1] k64,10 キーオンごとにk64からベロシティが10ずつ増加。127を越えそうになると 停止する. [例2] k80,-15,1 キーオンごとにk80からベロシティが15ずつ減少する. 0を越えそうになると今度は15ずつ増加。(つまり,'反射的'になります) この効果を解除するには、k64などとして新たにkコマンドを送ればよい。 解除の時にベロシティの値を変えたくない場合は,k+0のように0を 相対指定すればよい. krn1 (,n2) ベロシティをランダムに変化させます.kr0で解除します. n1 … 最大変化量(現在のベロシティ値から -n1 〜 +n1 の範囲で 変化させます) n2 … 変化のタイプ(省略時は1となります) n2=1では,現在のベロシティ値(k)に近い値の生起確率が高く, kから離れる値ほど生起確率が低くなります.実際の演奏に近い 自然な効果が得られます. n2=2では,kから離れるにつれて直線的に生起確率が下がります. n2>=3では,kから離れた値の生起確率が高くなります.n2を大きく するほどこの傾向が強まります. タイプ = 1 タイプ = 2 タイプ >= 3 * * *|* *|* *|* * | * ***** * | * * | * ** | ** * | * * | * * | * * | * * | * * | * ** | ** * | * * | * *** | *** * | * * | * --+-------+-------+-- --+-------+-------+-- --+------+------+-- k-n1 k k+n1 k-n1 k k+n1 k-n1 k k+n1 ランダムベロシティ生起確率のグラフ [例1] kr10 ; スネアドラム等に適しています. [例2] kr5 [例3] kr10,2 [例4] kr0 ; ランダムベロシティの解除 on オクターブを設定します。初期値は4です。 o4のcがSMFのノートナンバー60(3CH)に対応します。 o-nおよびo+nで相対指定ができます. < オクターブを1つ下げます。o-1と同じです. > オクターブを1つ上げます。o+1と同じです. (n ベロシティをn下げます。(nを省略した時はVnで指定した値となります) kコマンドの相対指定「k-n」と似ていますが、以下のような違いがあります。 ・「(n」コマンドでは第2・3引数は指定できません。直前のkコマンドで 第2・3引数が指定されていればそれが引き続き有効になります。 ・「k-n」ではnを略すると1を仮定します。 )n ベロシティをn上げます。(nを省略した時はVnで指定した値となります) kコマンドの相対指定「k+n」との関係は、「(n」と「k-n」の関係と同じです。 Vn ベロシティコマンドのnを省略したときのディフォルト値の設定を設定します。 初期値は4です。 vn 音量を設定します。範囲は0〜127です。初期値は不定です。 v-nおよびv+nで相対指定が可能です。 pn パンポットを設定します。範囲は0〜127で中央は64です。 数値nを省略した場合にはn=2と同じ扱いになります。 初期値は不定です。p-nおよびp+nで相対指定が可能です。 kコマンドと同様に、第2、第3パラメータの指定ができます。 ( kn1 (,n2) (,n3) コマンドを参照してください ) [〜]n '[]'で囲まれた間を指定回数だけ繰り返します.回数の指定を略すると 2回になります。あるチャンネルでの繰り返しが、複数行にまたがって いてもかまいません。なお、マクロ内で使う場合、繰り返しはマクロ内で 閉じていなければなりません。また、「" "」で囲まれた文字列内では、 「[」や「]」が現れても繰り返しは行われません。 : '[]'の中を演奏中、最後の繰り返しでその階層のループを抜けます。 (例: [ce:ge]4cg ) @n プログラムチェンジを行います。範囲は0〜127です。初期値は不定です。 @+n プログラムチェンジの値をすべてnだけ増やします。GM音源用。 wn キーオフベロシティを指定します。初期値は0です。 音源によってはキーオフベロシティの効果は無視されます。 通常は設定する必要はないと思います。 yn1,n2 コントロールチェンジを行います。範囲はn1,n2ともに0〜127です。 Hn1,n2 バンクチェンジを行います。n1がMSB(コントロールチェンジ0番)、 n2がLSB(コントロールチェンジ32番)です。 (例1:H0,1 @12 例2:H8,1 @0) BRn ベンドレンジを設定します。範囲は音源の機種によって違います。 (ただし負の値は受け付けません。) このデータはMIDI RPNパラメータ0番で送信されます。 GM対応音源では初期値は2になっていると思います。 BSn ベンドをセットします。範囲は0〜127です。初期値は不定です。 最初にBS64をやっておくと良いでしょう。 BS-nおよびBS+nでの相対指定が可能です。 ~n BSnと同じです。 BWn ベンドを2バイトでセットします。範囲は0〜16383です。 BS127はBW16256に、BS64はBW8192に対応します。 BW-nおよびBW+nでの相対指定が可能です。 BTn1,n2 BEAT(拍子)設定します。分子がn1で分母がn2です。 (例:BT6,8 = 6/8拍子) SMFのFORMAT1では第1トラック(テンポマップ)に出力します。 tn テンポを設定します。範囲は1〜65535。初期値は不定です。 複数パートにちらばっていても可。 SMFのFORMAT1では第1トラック(テンポマップ)に出力します。 t-nやt+nでの相対指定もできます。 「t(n」と指定すると(nは省略可)、その時点でのテンポをスタックに退避 した上で新たなテンポを設定します。また、「t)」で前回退避された テンポを復帰します。 [例] t150 cde t(-30 fga t) gfed 真ん中のfgaはテンポ120、それ以外はテンポ150で演奏します。 Mn1,n2 ディレイタイム(n1)付きモジュレーションを設定します。ノートオン後、 n1クロック後にn2の値でモジュレーションを掛けます。ノートオフと同時に モジュレーションもオフとなります。初期値はM0,0です。M0,0またはMOF コマンドが来るまで、ノートオンするごとにこのコマンドが働きます。 Ver5.0からは,モジュレーションを0に戻すタイミングが変わりました. 旧バージョンでは,キーオフ直後にモジュレーションを0に戻しましたが, Ver5.0からは,次のキーオンの直前にモジュレーションが0に戻ります. 音符のキーオン 音符のキーオフ 次のキーオン | | | ++------------+------------------------+---------++----------> | <=== n1 ===>| | | | | | モジュレーションをn2に設定 モジュレーションを0に戻す | モジュレーションを0に設定 MONn 無条件にモジュレーションを掛けます。 範囲は0〜127です。 このコマンドが指定された時には,Mn1,n2コマンドの効果が解除されます. MOF MONnおよびMn1,n2コマンドを解除します.MON0 と同じです. En エクスプレッションを送ります。コントロールチェンジの11番で送信 します。E+nおよびE-nでの相対指定が可能です。 RT そのトラックをリズムパートに指定します。 これがあるパートは、コンパイル時にスイッチtを付けてもトランスポーズ しなくなります。 このパートではノートオン後、1クロック後にノートオフします。 (このトラックではqコマンドを使う必要がありません。) EXn1,n2,n3,n4… エクスクルーシブを送信します。16進数で指定した場合には数値の前に 'x'を付けて記述してください。 1バイト目に機種のIDナンバーが来て、最後に終端コード247(xF7)が来ます。 主なメーカーのIDナンバーは以下の通りです。 x40…KAWAI x42…KORG x44…CASIO x41…ROLAND x43…YAMAHA x47…AKAI Rolandの音源は,CheckSumを送る必要がありますが,CheckSum自動計算 することもできます.例えば, [例] EXn1,n2,{n3,n4,n5,n6},n7 のように指定すると,n3,n4,n5,n6に対してCheckSumを計算し,n6とn7の 間の位置にCheckSumが自動的に出力されます. エクスクルーシブの表記中に"文字列"を入れることも可能です. [例] EXx41,x10,x45,x12,{x10,x00,x00,"abc"},x7f バルクダンプ送信のため、ビットの整形機能が使用できます。 バルクダンプは、音源内のデータを直接送りますが、本来8ビット長の ダンプを行なうのにMIDI信号では7ビットしか送れないため、送信データ を整形する必要があり、この整形を自動で行なうことが出来ます。 整形の方法は、機種やメーカーによって違いますが、現在は以下の2通り の方式が用意されています。 {N…} GS音源などで使われる、Niblize方式に整形します。 {T…} KORGのTR-Rackで使われる方式に整形します。 いずれも、カッコ内のデータ列が整形されます。このカッコ内では、データ は8ビット長(x00〜xff)の指定が可能で、負の値も使うことが出来ます。 (負を指定する場合は-128まで) [例1] EX……,{Nx80,xff,xc7},xf7 これは、EX……,x08,x00,x0f,x0f,x0c,x07,xf7 と同じになります。 niblize方式とは、単純に上位4ビットと下位4ビットを分けて送信 する方式です。詳しくはGS音源などのマニュアルを参照して下さい。 [例2] EX……,{Tx80,xff,xc7,x40,x55,x67,xd9},xf7 これは Ex……,x47,x00,x7f,x47,x40,x55,x67,x39,xf7 と同じになり ます。TR-Rackは、8Bitのデータ7個を7Bitのデータ8個に整形します。 整形前(Dump Data):n0[b7-b0],n1[b7-b0],……,n6[b7-b0] 整形後(Midi Data):[n6b7…n0b7],n0[b6-b0],n1[b6-b0],…,n6[b6-b0] 詳しくは、音源のマニュアルを参照して下さい。なお、確認はしていま せんが、他のKORG音源(03R/Wなど)も同じ方式の可能性は強いと思い ます。 バルク整形とチェックサムを同時に使用することが出来ます。ただし、 チェックサムのカッコはバルク整形のカッコより外側でのみ使用可能となり ます。 バルク整形のカッコ内では、中途半端なビット幅(8ビット未満)を持つ 数値が指定出来ます。数字の前にBn_をつけて下さい。nはビット幅を表す 数字で、1〜8が使用出来ます(8の場合は何も指定しないのと同じにな ります)。例えば、この指定により5ビットの数値を指定した場合、次の 数値は、その1バイトの残り3ビットから格納されます。3ビットで入り きらない場合は、バイト境界をまたいで格納されることになります。 [例1] Ex…,{NB4_x0f,B4_x08} EX…,{Nxf8} と同じになります。 [例2] Ex…,{NB3_x07,B6_x08,B7_x7f} Ex…,{Nxe4,x7f} と同じになります。ちょっとややこしいので説明 しますと、この2つの数値を2進で書くと、11100100,01111111 に なります。最初の3ビットは111なので7です。次の6ビットは、 001000なので8です(これはバイト境界をまたいで格納されています) 最後7ビットは1111111なのでx7fです。 [例3] Ex…,{NB3_-1,B6_8,B7_127} 数値としては例2と全く同じですが、10進表記やマイナスの指定も 出来ます。 ビットの格納状態が半端な状態でバルク整形のカッコを閉じた場合、未格納の ビットは0で埋められます。 EEn1,n2,n3,n4… データをSMFに直接出力します. ! コンパイル時に、そのトラックのこのコマンド以降のデータを無視します。 /* このコマンド以降、「*/」までをコメントとみなします。入れ子には できません。コメントを閉じる「*/」がないとエラーになります。 ; このコマンド以降、行末までをコメントとみなします。 $a〜$z マクロ定義行を呼び出します. _n これがあるトラックのこのコマンド以降をnだけ移調します。 範囲は-99〜99です。初期値は0です。 __n 移調の相対コマンドです.(_nで指定した値をnだけ変化) Jn 音階を番号で指定し、なおかつ、このコマンド以降の音階を無視します。 (強制的に音階がnになります) 初期値は0です。また、J0とやると、このコマンドの効果が無効になります。 このコマンドは、ドラムパートに使うと効果的です。 [例] $k J36 k100 ; bass drum $s J38 k105 ; snare drum A C10 v100 [$kc4$sc8$kc4c8$sc4]4 ; ドラムパターン K このコマンドの直後に表記する音符の音階でキーオンします。 普通の音符の指定と同様、'+'(シャープ)、'-'(フラット)、'*'(ナチュラル) などが使えますし、調号指定も有効です。 コンマ','で区切って、ベロシティを指定する事が可能です。省略時は kコマンドの値が採用されます。音長指定は'rn&'コマンドにより行います。 このコマンドを使って音を鳴らした場合には自動的にキーオフしませんので、 後でKc,0などとやってベロシティー0の音符を入れてキーオフ(鍵盤楽器の 場合は鍵盤から指を放すことを示す)してやる必要があります。 例1:ドの音をベロシティー100で鳴らしながら、8分音符経過後にe16r16g8 と鳴らし、さらに8分音符経過後にドの音をキーオフする場合。 Kc,100 r8& e16r16g8 r8 Kc,0 例2:ドの音を鳴らし、8分音符経過後にミの音を鳴らし、さらに8分音符 経過後にソの音を鳴らすと同時にドの音をキーオフし、さらに8分音符 経過後にミの音をキーオフし、さらに8分音符経過後にソの音をキー オフする場合。(ギターパートなどで効果があります。) Kc r8& Ke r8& KgKc,0 r8& Ke,0 r8& Kg,0 実際には面倒なので c8&e8&g4 とやって済ますことが多いですが. (これだと最後にド、ミ、ソが同時にキーオフされます。) このコマンドは1トラックであらゆる音符の組み合わせを表記できるように するため追加しました。MMLとしてはかなり無理のある表記になるため、複雑 な音符の組み合わせを再現する場合にはなるべく複数のトラック(または 従属トラック)を用いて表記して下さい。 例: A C1 Kc,100r8&e16r16g8r8Kc,0 ;これを従属トラックを用いて表記すると A C1 c2 ;こうなる 1A C1 r8e16r16g8r8 ; わけです。 A ポリフォニック・キー・プレッシャーを指定します. このコマンドの直後に表記する音符の音階で既に発音中の音に対し、 ポリフォニック・キー・プレッシャーの効果を与えます。 実際にどのような効果が得られるかは,MIDI音源の種類やMIDI音源の設定に 依存します.このコマンドの指定の仕方はKコマンドと全く同じで、 「,」で区切ってベロシティ(キー・プレッシャーの強さ)を指定できます. ベロシティの省略時はkコマンドの値が採用されます。 例: ドの音を鳴らし,4分音符経過後にベロシティ50でポリフォニック キープレッシャー与え,さらに8分音符経過後にキーオフにします. c4& Ac,50 r8 s Control Change,および,Pitch Bendの省略機能を,各Control Change, および,Pitch Bendに対して,次の1回だけ解除します. mml2midでは,基本的に,無駄なControl ChangeやBendは,一切出力しません. つまり,例えば,MML中で'E100'が指定されても,すでに現在のExpressionが 100である場合には,ExpressionはSMF中には出力されません. しかし,Exclusiveなどを使って,トラックの途中でMIDI音源の割り当て パートを変更するような場合には,コマンドが省略されるという機能が 問題となる場合があります.このような場合に's'を指定すれば,次の1回に 限り,省略機能を解除することができます. なお,sコマンドは,Volume, Expression, Panpot, Modulation, Pitch Bend のそれぞれに対して,各1回効果を発揮します. したがって,例えば,「s v120 s E100 s p64」などのように,v,E,pの それぞれに対して指定する必要はなく,「s v120 E100 p64」とやれば OKです. なお、'Cn'コマンドによってトラックの途中でMIDIチャンネル番号が 変更された場合には、自動的に's'コマンドが発効します。 &n 「n分音符」による数値の指定です.本来はステップ数で指定するべき値を n分音符の単位で指定したい場合に,数値の直前に&を付けます. [例]M&4.,120 Mコマンドのディレイタイムを符点4分音符の長さに設定します. '&n'は、音を繋げるコマンド'&'と同じ文字を使っていますので混同しやすい ですが、こちらの'&n'は、数値の直前に置いてください。 Dn 現在のチャンネルに対してディチューンをかけます.nは,-64〜63 の範囲で 指定して下さい.SMFには,RPNイベントを使って記述されます. BSコマンドのピッチベンドと似た効果が得られますが,ベンドとは独立に かかります。 TCn フィルタのカットオフ周波数を指定します。(0≦n≦127) nが大きくなるほど明るい音になり、nが小さくなるほど暗くこもった 感じの音になります。(音源や音色によっては効果が現れません) TRn レゾナンスを指定します。(0≦n≦127) nが大きくなるほどファンキーな音になります。 (音源や音色によっては効果が現れません) FE, FB, FW, FV, FP, FC, FR, FM, FA, FT (エンベロープコマンド) FEはエクスプレッション、FBはベンド、FWは2バイトのベンド、 FVはボリューム、FPはパンポット、FCはカットオフ周波数、FRはレゾナンス、 FMはモジュレーション、FAはアフタータッチ(チャンネル・プレッシャー)、 FTはテンポに対して効果がかかります。 ノートオン(発音)のたびに毎回エンベロープの効果が開始します。 [パラメータの説明] FEn1,n2,n3,n4(,n5,n6)(,n7,n8)(,n9,n10)(,n11,n12)…… n1:値を書き込む頻度 (ステップ数) n2:初期変位 n3:1回目の変位時間 (n分音符指定) n4:1回目の変位 n5:2回目の変位時間 (n分音符指定) n6:2回目の変位 n7:3回目の変位時間 (n分音符指定) n8:3回目の変位 n9:…以下同様 変位(n2,n4,n6,…)は、FWに対しては-16383〜16383、 それ以外(FTを除く)に対しては-127〜127で指定して下さい。 [例] E127 FE3,0,8,-50,2.,50 c2e2g1 (c2,e2,g1のそれぞれにエンベロープの効果がかかります) FE0,FB0 などのように、第1パラメータに0を指定すると解除されます。 この場合を除き、パラメータは4個以上の偶数個でなければなりません。 ____________________________ ^ ** ^ | ** | n2| ** | ____________ | ** n4 *** ^ v ** | *** ^ * | - +---------**-----|-------***----|--*----|------------ | ** | *** n6 * n8 | ** v *** v * | | ***--------------- * | | *v | ********** |<======n3======>|<=====n5=====>|<==n7=>| n3,n5,n7…はn分音符の単位で指定する。 n1は、何ステップごとに書くか。 n1の値を小さくすると精度は良くなりますが、その反面、音源に 大きな負荷をかけることになります。timebaseの値が大きい場合には 注意が必要です。 (参考)FBをポルタメント機能の代用として使えます。 例: BS64 BR24 c4& FB2,0,4,32 r2 BRを使って上げ下げ幅を調整します。 UE, UB, UW, UV, UP, UC, UR, UM, UA, UT (第2エンベロープコマンド) 音符や休符と無関係に作用するエンベロープコマンドです。 指定するパラメータはFE, FB, FW, FV, FP, FC, FR, FM, FA, FTコマンドと 同じです。 UE,UB,UW,UV,UP,UC,UR.UM,UA,UTコマンドが書かれた時点でエンベロープの 効果が発効し、エンベロープが終了した時点で自動的にコマンドが解除 されます。(UE0,UB0 のように、第1パラメータに0を指定することは できません。) パラメータは4個以上の偶数個でなければなりません。 [例] E127 UE3,0,2,-100,2,100 l8 cdefgab>cdefg< (音量が次第に小さくなってから大きくなります。) IE, IB, IW, IV, IP, IC, IR, IM, IA, IT (LFO(振幅変調)コマンド) IEはエクスプレッション、IBはベンド、IWは2バイトのベンド、 IVはボリューム、IPはパンポット、ICはカットオフ周波数、IRはレゾナンス、 IMはモジュレーション、IAはアフタータッチ(チャンネル・プレッシャー)、 ITはテンポに対して効果がかかります。 ノートオン(発音)のたびに毎回効果が開始します。 [パラメータの説明] IEn1,n2,n3,n4,n5 n1:振幅(1〜63) n2:値を書き込む頻度(ステップ数) n3:ディレイ長(ステップ数) n4:波長(ステップ数) n5:最大振幅になるまでの長さ(ステップ数) [例] B64 IB10,2,32,12,24 c2e2g1 (c2,e2,g1のそれぞれに効果がかかります) IE0, IB0 のように第1パラメータに0を指定すると解除されます。 それ以外の場合は、パラメータは4個か5個でなければなりません。 パラメータが4個の場合は、第5引数に0を指定したものと見なされます。 ------------------------------------- / * * * * ^ 音符のキーオン / * * * * * * * * |振幅 | / * * * * * * * * |n1 | / *** * * * * * * * * v +-------+***-*--*---*---*---*---*---*---*---*---*----------> | |\ ** * * * * * * * * * |<=n3==>| \ * * * * * *| * *| * ディレイ| \ * * * * * *| * *| * ステップ数| \ * * * | * | * | --------------- | | |<==n5==>| |<==n4=>| 最大振幅になるまでの 波長 n2:何ステップごとに ステップ数 書き込むか. n2の値を小さくすると精度は良くなりますが、その反面、音源に 大きな負荷をかけることになります。timebaseの値が大きい場合には 注意が必要です。 | 小節線.MMLが見易くなるという効果があります.コンパイルにおいては 空白やTABと同等に扱われます.音符の音長指定の途中にも入れられます. (例: f4.^4g4a-8 | ^2f2 | e-4.^4f4g8 | ^1 ) Nn1,n2,n3 NRPNパラメータを送るコマンドです。(音源によって指定する値は 異なります。詳しくは各音源のマニュアルをご覧下さい。) n1 … MSBパラメータ Control Change 99番で送信されます。 n2 … LSBパラメータ Control Change 98番で送信されます。 n3 … データ Control Change 6番で送信されます。 なお、データの下位バイトは無視します。 [例]最近のGM音源(MU80, SC88, NS5Rなど)の場合 N1,x20,n … Filter n = x40 が中心(TCnと同じです) N1,x21,n … レゾナンス n = x40 が中心(TRnと同じです) N1,x63,n … EG Attack n = x40 が中心(大きい程遅い) N1,x64,n … EG Decay n = x40 が中心(大きい程遅い) N1,x66,n … EG Release n = x40 が中心(大きい程遅い) アタックを一番速くしたい場合には、N1,x63,0 のように指定します。 P ダンパー・ペダル(コントロールチェンジ64番)をオンにします。 X ダンパー・ペダルをオフにします。 S このコマンドが記述されている時点のステップ数などの情報を (コンパイル時に)表示します。 MMLを打ち込んでいるうちにあるパートで音がずれた、などの場合に ステップ数を確かめるのに役に立ちます。 ステップ数以外にも、次の情報が表示されます。 バンク番号、プログラム番号、オクターブ、ボリューム、ベロシティ、 エクスプレッション、パンポット、ベンド、ゲートタイム、 第2ゲートタイム、基本音長。 曲の全体に渡ってループさせる時に、ループ開始時と終了時の オクターブなどの一致を確かめるのに役立ちます。 Gn チャンネル・プレッシャーをセットします。(0≦n≦127) KJ, KI 調号コマンドです。キーオンのコマンドKと1文字目が同じですが、 こちらは2文字目が大文字のJかIであることにより区別できます。 KJはKey maJorの略で、例えば「KJg」のように指定するとそのトラックは ト長調の調号、つまり特に指定しなければ音符fは半音上げて演奏すると いう意味になります。KIはKey mInorの略で、例えば「KIe」は「KJg」と 同じ意味です(ト長調とホ短調の調号は同じ)。 指定する調子の後には「+」か「-」を2つまで繋げられます。例えば 「KJe-」は変ホ長調の意味です。但し#german指定がある場合、KJbや KIbの後ろにだけは「+」も「-」も繋げられません。 調号指定は、ハ長調の指定KJc(あるいはイ短調の指定KIa)で解除できます。 調号指定をしても、明示的に「+」や「-」を付けた音符は、元々の高さ から半音上下になります。例えばKJgでト長調にしていても、「f-」は fの半音下(eと同じ音)であり、fのシャープの半音下でfに戻るのでは ありません。 また、#german指定がある場合、調号は音符hには効きますが、bには効き ません。音符bは常にh-と同じ音です。 C 'Cn'コマンドはチャンネル番号の指定ですが、文字'C'は定数としても 使えます。 いろいろなコマンドの数値中で'C'が出てきたら、それはMIDIチャンネル 番号を表す定数として扱われます。 例:Emu Proteux FXにおいて、現在のチャンネルをオフにしたい場合。 EXx18,x04,x00,x03,C - 1,x03,x00,x00,xf7 r%1 ; Channnel C off R 'R'も'C'と同様、定数を表します。'R'はローランド式のチャンネル番号を 表します。 チャンネル10ならばRは0 チャンネル1〜9ならばRは1〜9 チャンネル11〜16ならばRは10〜15 となります。 例:Roland GS音源において、現在のチャンネルをオフにしたい場合。 EXx41,x10,x42,x12,{x40,R + x10,x02,x10},xf7 ; GS-Ch. off Z{…} 変数演算コマンド。変数に値を代入したり、足し算、引き算をします。 変数はz0〜z255です。 例: Z{z3 = x10 + C, z4 = z4 + z1, z5 = x20} 代入ができます。 例: Z{z0 = 10} z0に10を代入します。 代入文をコンマ「,」で列挙できます。 例: Z{z3 = 1, z4 = x10} z3に1を代入し、z4にx10を代入します。 足し算や引き算が使えます。 例1: Z{z1 = 5 + 2} z1に7を代入します。 例2: Z{z1 = 5 - 2} z1に3を代入します。 足し算や引き算中に変数名を含めることができます。 例1: Z{z1 = z0 + 2} z1にz0 + 2を代入します。 例2: Z{z1 = 5 - z12} z1に5 - z12を代入します。 定数'C'および'R'が使えます。 例: A C10 Z{z1 = C, z2 = R} z1に10を代入し、z2に0を代入します。 zn 変数。(0≦n≦255) 変数演算コマンド'Z'と合わせて使います。 変数の使用例: Z{z0 = 0} [ @z0 c4 Z{z0 = z0 + 1} ]127 数値の演算 多くのコマンドにおいては、「+」および「-」記号を使って 数値を足したり引いたりすることが可能です。 例:y10+22,50-15 (あまり良い例ではありませんが、演算ができる ことを示しました) SMFメタイベントによる文字列の出力。 以下に示す WT,WI,WL,WM,WCコマンドにより、標準MIDIファイルに メモや歌詞などを出力することができます。 (日本語文字を使う場合、必要に応じてMML2MID実行時のオプションスイッチ -mを指定しないと誤動作する場合があります。2章参照) WT"テキスト" メモなどのテキスト文字を記述します。 SMFメタイベント FF 01 により出力されます。 WI"楽器名" 楽器名を記述します。 SMFメタイベント FF 04 により出力されます。 WL"歌詞" 歌詞を記述します。 SMFメタイベント FF 05 により出力されます。 WM"マーカー" リハーサル・マークやセクション名を記述します。 SMFメタイベント FF 06 により出力されます。 WC"キュー・ポイント" キューポイント等のメモ書きを記述します。 SMFメタイベント FF 07 により出力されます。 (注) これらもMMLコマンドの1種ですので、トラック名の後ろに記述し て下さい。もし行頭に「WL "歌詞"」のように書くと、「WトラックとL トラックのデータが書かれていて、その中にいきなり文字列が現れてい る」という解釈になってエラーになります。 ・以下は,旧バージョンとの互換性のために残されているコマンドです. なるべく使わないで下さい. \n 休符に'&'を付けた'rn&'と全く同等に扱われます. / ループアウト':'と同じです. BBn 相対ベンドです.BS+nやBS-nと同じです. *n 転調の相対コマンドです.__nと同じです. v5.26以後では「#bc525」指定を行わない限り使えません(「*」はナチュラル の意味になります)。 3.4.3 特殊なコマンド =n 演奏スイッチ(nは0または1。nを省略してもよい) このコマンドは、トラックの外に置いてください。 つまり、行頭に置いてください。 このコマンドは、全てのトラックに対して効果がかかります。 「MMLの途中までをスキップして、曲を途中から鳴らしたい」という要望に 応えるためのコマンドです。 ただ単にMMLのある部分をコメントアウトすると、その部分で音色が 変わったり音量が変わったりしていると、曲を正常に鳴らせません。 そのような場合には、'=n'コマンドが役に立ちます。 '=1'が指定されると、それ以降の音符と休符のコンパイルをスキップします。 '=0'が指定された時点で、元の演奏状態に戻ります。 休符と音符がスキップされている間に変更されたボリューム、オクターブ、 ベロシティなどの全ての値は、'=0'が指定された直後に反映されます。 初期状態は'=0'です。 '=n'のnを省略して指定した場合は、'=0'および'=1'の状態を交互に 切り換えます。 また、'=n'は、トラックの中に置くことも一応できます。その場合は、 そのトラックだけに効果が働きます。 [例] A … B … C … =1 A … <-- この3行の演奏が飛ばされる。ボリューム、オクターブ、 B … <-- ベロシティなどのあらゆる値の変化は'=0'の直後に反映される。 C … <-- 長い曲を打ち込む場合に、途中を飛ばせるので便利です。 =0 A … B … C … \ 行末の「\」(注釈内を除く)は継続行を表します。次の行が、あたかも その行の続きにあるかのように扱われます。特に、次の行でエラーが出た 場合も、その行でエラーが出たかのように表示されますので(現在の版 では)、注意して下さい。 3.5 その他の機能 外部のプリプロセッサとの連携機能があります(通常は、ユーザが明示的に使 う必要はないと思います)。 MMLファイル中に # 数 "名前" という形の行があった場合、それ以後でエラーが起きると、mml2midはあたかも その「名前」のファイルでエラーがあったかのように報告します。「#」は行頭 になければなりません。 例えば「# 19 "foo.mid"」という行があり、その行の4行先でエラーが起きた 場合、mml2midは「foo.midというファイルの22(=19+4-1)行目でエラーが起きた」 と報告します。 mml2midへの外部プリプロセッサを作成する場合、出力中にこの形の情報を埋 め込むようにしておけば、mml2midが報告するエラーメッセージが、プリプロセッ サへの入力となった大本のファイルを参照するような形にすることができます (4.2で述べるmmlppはその例になっています)。 4. mml2mid支援ツール群 4.1 エディタとの連携 PC-98互換機上でVZエディタを使用している場合と、UNIX上でmuleを使用して いる場合は、mml2midとエディタを連携させ、エディタの中からワンタッチでmml をコンパイルしたりそれを演奏したりする手段が用意されています。 PC-98+VZ用…mmldef.txt(mml2midのアーカイブに同梱) UNIX+mule用…marmalade(mml2midのWebページで別配布) 4.2 mml2mid用プリプロセッサ 長い名前のマクロ、引数を取るマクロを実現するmml2midのプリプロセッサ mmlppが用意されています。mml2midのアーカイブに同梱してあります。 4.3 mml2mid用GUI WindowsおよびUNIX上で、コマンドライン版mml2midと併用することにより mml2midのグラフィカルインタフェースを実現する、tkmml2midというものが用意 されています。これもmml2midのアーカイブに同梱です。 その他にも、さまざまな支援ツールをmml2midのWebページで配布しています。 5.作者 門田暁人 (もんでん あきと) 藤井秀樹 (MKR: ふじい ひでき) 黒田久泰 (くろだ ひさやす) 新出尚之 (にいで なおゆき) バグの指摘、苦情、感想などは歓迎します。 MML2MID Home Pageは, http://platz.jp/~mml2mid/ です. MMLの機能をフルに使ったサンプルMML(オリジナル曲)も募集中です。 我こそはと思う方はぜひぜひ御応募下さい。 なお、本プログラムを利用した結果生じたいかなる不利益に対しても当方は 一切責任を持ちません。