**** 簡易 MML (Music Macro Language) 仕様(最終更新: 22/11/18) **** 以下には実習で用いる簡易 MML (Music Macro Language) の簡単な使い方を示す。 ただし、説明文だけでは理解が難しいだろうから、Web ページ上からアクセスできる 実際の曲データ例も参照するとよい。 また本説明はまだ未完成の部分が多いので、随時更新・拡張していく。 ============================================================================================= 1. 基本定義  ここでは単旋律の簡単なメロディが入力できる範囲での機能を説明する。  これらは拡張定義でもそのまま使えるものとする。 1.0 記述形式等  ・データはテキスト形式で表す。  ・データは自由形式で、1行にデータ項目をいくつ記してもよい。   (1行あたり1データといった制約はつけない。)  ・空白、タブ、改行は自由に挿入してよい。   これらは区切り文字として、データの切れ目を表すものとする。   (ただし、切れ目が文脈からわかる場合には挿入しなくてもよい。)  ・コメント   行中に '%' 文字があれば、行のそれ以後の部分はコメントと見なして無視する。  ・空行、空白・タブによるインデント、スペーシング、コメント等は、   データを読みやすくするために適宜使用する。   特にコメントは、データ内容が理解しやすいように積極的に活用する。  ・MML の仕様定義ではすべての文字は半角文字である。   MML ファイルの中で全角文字(日本語文字)が使えるのは、コメント、文字列など、   一部の場合にすぎない。(今のところ本文書には、文字列を使う定義は書かれていない)  ・全体を通じて、特別に断る場合を除いては、アルファベットの大文字・小文字は区別しない。   つまり大文字・小文字のどちらで書いてもよい。 1.0.1 数値の表現  (この項未完) 1.1 音符  音符は「音高+音長(音価)」をつなげて表す。  ただし音長は省略可能である(下記参照:音高は省略できない)。  音高と音長の間には空白は入れない。  *音符の例   A4 A 音4分音符   B-8 B♭音8分音符   C+4. C♯音付点4分音符   D D 音、デフォールト長   C 4 ×(間に空白はいれない)   (1.1.4 で見るように、さらにこの後に強弱指定もできる)  音符同士は、間に空白等を入れて区切ってもよいが、続けて書いてもかまわない。    例: 「C2D4E4」は「C2 D4 E4」と同じ。  小節内やフレーズとしてまとまる部分はつなげて表し、  小節線の箇所には空白を入れるなどすると見やすい。  1.1.1 音高   音高は音名、変化記号、オクターブ指定で指定する。   * 音名    C, D, E, F, G, A, B の7つ。意味は通常の英語音名と同じ。    小文字 c, d, e, f, g, a, b でもかまわない。    音名は省略できない。   * 休符    休符は「音名」を R(または r)で表す。    休符にも 1.1.2 の音長指定がつけられる。   * 変化記号    音名に続けて(空白なしで)、半音単位の変化を表す。    ・嬰記号(半音上げる): '+'    ・変記号(半音下げる): '-'    ・ナチュラル     : '=' (1.3.1 「調指定」参照)    ・参考: 重嬰、重変は '++', '--' のように +, - を重ねて記す。   * オクターブ指定    オクターブ指定は個々の音高には記さず、文脈情報として指定する。    つまり一度指定したオクターブは、以後別の指定があるまで有効とする。    ・絶対指定: 'On' で指定する。ただし n はオクターブ番号を表す数である。     O4 が中央オクターブ(O4 C が中央ハ音)とするのが普通だが、     MIDI ノート番号とあわせるために O5 C を中央ハとする流儀もある。     これについては適宜定義する。     デフォールトのオクターブは O4(中央オクターブ)とする。    ・相対指定:     ・'<': 1オクターブ上げる。     ・'>': 1オクターブ下げる。    例:下はニ長調音階の上がり下がりである。      O4 D E F+ G A B < C+ D C+ > B A G F+ E D    相対指定は全体をオクターブずらす場合などに便利であり、    上で O4 を O3 に変えれば全体が1オクターブ下がる。    ・単音のオクターブ変更(08/10/05 追加)     下の例のように、オクターブ変更が頻繁にあると、データとして読みづらいとともに、     オクターブ間違いのエラーも起こしやすい。       ababgc>gababgc>g1 の場合には次の音の開始以後まで現在の音が鳴り続ける。   f のデフォールト値は 1.0 である。   【2022/11/18 追記】(タイの音長の仕様変更)   タイでつながれた音符の場合、'*f' は最後の音価に適用される。   例(tick 数:四分音符 480 tick で表す)     ・A2*0.9  ⇒ (480*2) * 0.9 = 864     ・A4+4*0.9 ⇒ 480 + 480*0.9 = 912     ・A4.*0.9  ⇒ (480*1.5) * 0.9 = 648     ・A4+8*0.9 ⇒ 480 + (480/2) * 0.9 = 696     ・A8+4*0.9 ⇒ (480/2) + 480 * 0.9 = 672   注 1:旧仕様では全長に '*f' を掛ける、      例えば A4+4*0.9 は A(4+4)*0.9 = A2*0.9 ⇒ 864 としていた。   注 2:この仕様変更は、MIDI検定の解釈に合わせるためである。(良否は別として)  1.1.4 音の強弱   個別の音の強弱は、上記の各音符の後に ':' と数字で指定する。    例     A4:100  A4(A 音の4分音符)を強さ 100 で演奏する     C+2:50  C+2(C シャープ音の2分音符)を強さ 50 で演奏する   ':' の後に指定する数値は 0〜127 の範囲(MIDI の velocity 値)。   0 だと無音(実際には音は鳴らない)、数値とともに音も大きくなり、   127 のときが最大になる。   この範囲をはみ出す設定がされた場合には、0 未満であれば 0、   128 以上であれば 127 として処理する。   * 強弱の省略、標準値    強弱の指定を省略すると標準値がとられる。    強弱の標準値は、初期設定では 90 である。    標準値を変更するには、'Vn'('vn', 'V:n', 'v:n' でもよい)とする。n は強弱値である。     例      V100   強弱の標準値を 100 にする。       * 相対指定    強弱値の前に +/- の符号を入れると、標準値に対する相対的な変化を表す。     例: 現在の標準値を 90 とする。      A4:+20  標準値より 20 大きい音にする('A4:110' と同じ)      A4:-30  標準値より 30 小さい音にする('A4:60' と同じ)   * 強弱アクセント    小節の先頭のように、特定の音を回りの他の音より大きく演奏したい場合には、    音符指定の最後に "'"(シングルクォート)をつける。例: B4'    初期設定ではこの音は強弱値が +20 大きく演奏される。   * 強弱の連続的な変化    クレッシェンド、デクレッシェンドのように強弱を連続的に変化させる方法については    2.3.1 参照。 1.2 大域設定(標準値指定等)  すでに 1.1 の中で紹介してきたことではあるが、省略時の標準値指定など、  直接に音符の一部分ではない記述項目について、以下にまとめておく。   ・On: オクターブ指定。n はオクターブ番号で、意味のある値としては      0〜9 の範囲(これで MIDI ノート番号の 12〜127 がカバーできる)。   ・< : 1オクターブ上げる。   ・> : 1オクターブ下げる。   ・Ln: 標準(デフォールト)音長指定。n は各音の音長(1.1.2) と書き方は同じ。   ・Vn: 標準(デフォールト)強弱指定。n 0〜127 の範囲の値で、各音の強弱(1.1.4)と書き方は同じ。      V と n の間にコロンを挟んで V:n のように書いてもよい。 1.3 特殊指定  上記以外の特殊な指定は '@' で始まる記号列で表す。  1.3.1 調指定: '@Kn', '@kn'    曲全体の調がその音高を主音とする調であることを表す。    n は符号付の数字で、正の場合は調号のシャープの数、負の場合はフラットの数を表す。    デフォールトでは調号なし(ハ長調ないしイ短調)。    例     @K+2: シャープ2つ(ニ長調ないしロ短調)     @K-3: フラット3つ(変ホ長調ないしハ短調)    調指定を行った場合、それによる変化記号(シャープ、フラット)は    各音符でいちいち指定しなくてもよい。    例:     「@K+2 C D E F G」は「@K0 C+ D E F+ G」と同じである。    「@K+2」によってシャープ2つ、つまり F, C の2音は自動的にシャープが    ついた F+, C+ として扱われるからである。    逆にこれらの音のシャープをはずすには、「F=, C=」のようにナチュラルの    指定をする必要がある(1.1.1 参照)。    ・調は曲の途中で変更してもよい。  1.3.2 拍子指定: '@Tn/m', '@tn/m'    n, m は数で、拍子記号で表される拍子を示す。    例     @T3/4: 3/4 拍子     @T6/8: 6/8 拍子    n は任意の正数でよいが、m は 4 または 8 に固定されている。    ・拍子指定は、直接的に大きな役割を果たすわけではないが、     出力表示などで小節区切りを割り出すなどに使われる。    ・拍子指定は、デフォールトでは 4/4 になる。    ・拍子指定を行いたくない場合(小節区切りを入れたくない場合)には     「@T0」(「@T0/4」などでもよい)のように、長さ 0 を指定する。     このときは、「音符列出力」などでは小節区切りは表示されない。      # 拍子指定を省略した場合、「@T0」ではなく「@T4/4」と扱われる      # ことに注意。    ・現在の仕様では、曲の途中で拍子を変更することはできない。     (変更した場合の動作は保証しない。)  1.3.3 テンポ指定: '@Mn', '@mn'    曲の速さを指定する。いわゆるメトロノーム記号と同じ指定方法で、    4分音符が1分間にいくつあるかを n で指定する。    標準的には n=120 (Andante) ぐらいで、n がこれより小さいほど遅く、大きいほど速くなる。    ・テンポ指定は、必ずトラック 0 におかなければならない(2.2 参照)。     それ以外におくとエラーになる。    ・テンポ指定は曲の途中で変更してもよい。     したがってリタルダンドなどの速度変化をテンポ指定によって行うことができる。    ・'@M=' と書くと、曲の最初に指定したテンポに戻る(a tempo)。    ・'@M*n', '@M/n' は現在のテンポ値に対する乗算・除算を表す。     n は整数、小数点付数、分数(整数の除算)のいずれでもよく、     例えば '@M/2', '@M*0.5', '@M*1/2' はいずれも、現在のテンポを半分にする     (2倍遅くなる)。  1.3.4 楽器(音色)指定: '@In', '@in'    楽器(音色)を指定する。n は「GM 音色番号」を記す。    標準設定は @I1 で、グランドピアノ音である。    GM 音色番号の一覧は膨大な量になるので、ここには掲げない。      https://ja.wikipedia.org/wiki/General_MIDI#Program_change_events    などを参照のこと。    注    ・音色はトラックごとに指定する(2.2 参照)。    ・1つのトラックは一度には1つの音色しか持てない。    ・曲の途中でトラックの音色を変えることはできるが、しないほうがよい。    (発展:上級者向き)    音色はメインカテゴリである program change メッセージの音色番号だけでなく、    サブカテゴリであるバンク番号も指定できる。    (以下準備中)  1.3.5 音長(時間長)の標準値:  '@*f'    時間長係数の標準値を設定する(1.1.3 参照)。    初期設定は「@*1.0」(音価分だけ音を鳴らす)。  1.3.6 アクセントの標準値:    '@'n'    アクセントの標準値を設定する(1.1.4 参照)。    初期設定は「@'20」(velocity 値を 20 増やす)。  1.3.7 メインボリューム: '@vn', '@Vn'    メインボリュームとは MIDI コントロールメッセージ 0xbn07 のことで、    曲全体のボリューム(音量)を 0-127 の数値で指定する。    これにより、演奏されるデータ全体のボリュームがコントロールされる。    個々の音の大きさ(velocity 値)の指定(1.1.4, 1.2 参照)とは異なるので注意。  1.3.8 MIDI コントロールメッセージ; '@cxxxx' '@cd:d' '@Cxxxx' '@Cd:d'    上記以外の MIDI コントロールメッセージは、生データとして MML 内に    埋め込むことができる。    コントロールメッセージのデータバイト2バイトは、16進(xxxx)または    10進(d:d)で記す。    【訂正(暫定版):2018/11/08】    現状では上では正しく処理されません。すぐに直しますが、暫定的には次のようにしてください。     ・10進モードは現状では正確に処理されない。16進を指定する。     ・16進記述は、@Cxxxx のように16進4桁を続けるのではなく、@Cxx xx のように間にスペースを入れる。     例: ダンパーペダルの on/off      @C40 7f  ダンパーペダル on      @C40 00  ダンパーペダル off  1.3.9 その他     '@' を先行させないが、'|' を小節線を表す記号として使用できる。    実質的な効果はないが、これにより、データが読みやすくなるとともに、    小節内の長さ指定が正しいかのチェックもできる。 ============================================================================================= 2. 拡張機能  上の「基本機能」では簡単な単旋律しか入力できない。  もっと多様・複雑な楽曲を入力できるためには、以下のような機能を用いる必要がある。 2.1 直列形式と並列形式  「直列形式」とは時間順に演奏されるひとまとまりの音符・音符列、  「並列形式」とは同時に演奏されるひとまとまりの音符・音符列を言う。  両者をまとめて「列形式」と呼ぶことにする。  列形式により、和音、連符、複数声部/パートなど、多様な構造が記述できる。  2.1.1 記法   直列形式、並列形式の記法を先に示しておく。   記法の意味や使用例については以下の項目を参照。    ・直列形式  { e1 e2 ... ek } または { e1 e2 ... ek }n    ・並列形式  [ e1 e2 ... ek ] または [ e1 e2 ... ek ]n   上のように、系列に属する「要素」 e1, e2, ..., ek を、   直列形式では中カッコ { ... }、並列形式では大カッコ [ ... ] で括って表す。   右側の形式で、閉じカッコの後ろに 'n' とあるのは音長指定で、   左側のように省略してもよい。   ・「要素」 e1, e2, ..., ek は、一番普通には音符指定だが、    実際には任意の MML 要素(直列・並列形式も含む)を書くことができる。    (ただし、いくつかの制限はある。)   ・カッコは必ず、開きカッコ、閉じカッコが対応していなければならない。    どちらかが足りないとエラーになる。   ・カッコは必ず入れ子になっていなければならない。    言い換えると、内側の列形式は、外側の列形式の中に全部含まれていなければならない。     ○  [ { ... [ ... ] } [ ... ] ]     ×  [ ... { ... ] ... }    上の○のほうはカッコの関係が正しいが、2行目の×のほうは、 [ ... ] と { ... }    とが交差しているので、正しい定義ではない。   ・列形式も MML 全般と同様、複数行にわたって書くなど、    自由に空白や改行を入れて記述してよい。   以下、列形式の意味、使い方、具体例などを項目別に述べていく。  2.1.2 和音(同時発音の簡単な例)   和音のように複数の音を同時に鳴らすのは、並列形式の簡単な利用例である。   和音を表すには、同時に鳴らしたい音の音符指定を [ ... ] で括る。   個々の音に音長を指定してもよい。その場合、最長の音が全体の音長となる。    例     [CEG]   C, E, G の3音からなる和音(いわゆるドミソの和音)     [GEC]   上と同じ(同時音の順番を入れ替えても結果は同じ)     [C2E4G4]  C 音は2分音符、E, G は4分音符の長さで、全体の長さは2分音符分になる。          (前半では C, E, G の3音が、後半では C の1音だけが鳴る)   これは実際には次の「並列形式」の一番簡単な場合である。  2.1.3 並列形式と直列形式   上の和音の例に見られるように、並列形式 [ e1 e2 ... ek ] は要素 e1, e2, ..., ek の   先頭を揃えて並列に鳴らすという指定である。   e1, e2, ..., ek が音符(音符指定)であれば前節で見たように「和音」になり、   e1, e2, ..., ek の k 個の音符が同時に鳴り始める。逆に途中で鳴り出す音は存在しない。   鳴り終わりはそれぞれの音符の音長によって決まり、   全てが同じ音長なら、全音が同時に鳴り終わる。   並列形式が要素を同時に鳴らす指定であるのに対し、   直列形式 { e1 e2 ... ek } は要素 e1, e2, ..., ek を先頭から順に鳴らしていく。   1章で見た MML の基本レベルでも、音符の並びは直列形式として扱われる。   ただし、トップレベルでは全体をわざわざ {...} で括る必要はない。   直列形式が意味を持つのは次のような場合である。    ・並列形式と組み合わせて使用した場合(2.1.4 参照)    ・音長指定を行った場合(連符の表現など:2.1.x 参照)  2.1.4 列形式の組合せ   列形式(直列形式、並列形式)の要素を列形式とすることで、列形式同士を   組み合わせることができる。   並列形式の要素の中に並列形式がある場合、つまり:     [ G [ F D ] B ]   のように [ ... ] が入れ子になっている場合、    ・F, D の2つは同時に鳴り出す    ・G, [F D], B の3つは同時に鳴り出す   ことから、結局 G, F, D, B の4つとも同時に鳴り出すことになり、     [ G F D B ]   と書くのと結果は同じである。   (もっとも内側の [F D] に音長指定(後述)がつく場合にはもっと複雑になる。)   これに対し、要素の中に直列形式がある、例えば:     [ { C D } { G F } ]   のような場合には、    ・C, D は順に鳴り、G, F も順に鳴る(次項参照)。    ・{ C D } と { G F } は同時に鳴り出す。   これにより、C と G が同時に鳴り出し、それぞれの後に D, F が続くことになる。   このとき C, G の音長が同じなら D, F も同時に鳴り出すが、   [ { C. D/ } { G F } ] のように音長が違う場合には、D, F の鳴り出しはずれる。      他の例をいくつか示す。    ・[ C2 E2 {G4 F4} ]     C2, E2, {G4 F4} が並列で演奏され、最後の G4, F4 はこの順に演奏される。     {G4 F4} の音長の和は2分音符分で、C2, E2 の長さと等しい。     つまり C2, E2 が鳴っている間に、高音は G から F に動いている。    ・[ C2 { R4 [E4G4]}]     2.1.2 の [C2E4G4] の例では、前半で C, E, G の3音が鳴り、     後半では C の1音だけが鳴った。     これに対し、上は前半が C 1音、後半に C, E, G の3音が鳴る。     C2 が全体を通じて鳴っているのに対し、{ R4 [ E4 G4 ]} の前半は     休符のため音は鳴らず、後半で E4, G4 が並列に鳴るからである。   内側の直列形式は上の例のような短いものでなく、     [ { a1 a2 a3 ... } { b1 b2 b3 ... ] ]   のような長い音列であってもよい。   これは2つの旋律(声部) { a1, a2, a3, ... } と { b1, b2, b3, ... } を   並行して鳴らす指定になっている。   のように、各旋律は直列形式で与え、全体を並列形式にすればよい。   (2.5 の「トラック指定」も参照)   参考: 一般に並列・直列の組み合わせ方は、大きく分けると次の2通りがある。     (P) [ { ... } { ... } ... { ... } ]     (H) { [ ... ] [ ... ] ... [ ... ] }   (P) は外側の並列形式の中に直列形式が並んでいる形であり、   (H) はその逆に外側の直列形式の中に並列形式が並んでいる形である。   複数の声部(パート)からなる音楽の楽譜は、縦方向には声部や音高、   横方向は時間進行を表す2次元表記だが、   (P) はそれを声部ごとに横割りに分割して表したもの、   (H) は和音や小節ごとに縦割りに分割して表したものにあたる。   つまりもともとは2次元の対象を、横割りないし縦割りの1次元的な観点で   とらえたものである。(P) のほうは「ポリフォニック (polyphonic)」な視点、   (H) のほうは「ホモフォニック (homophonic)」な視点である。  2.1.5 列形式の要素とスコープルール   列形式の要素の中心を占めるのは音符(1.1 参照) あるいはそれを連ねた列形式である。   これ以外に、1.2 節にまとめた大域設定も列形式内に書くことができる。   (1.3 の特殊指定については書くべきではない(書いても動作は保証しない))    例    ・[ C E G G} {O3L2 [EGG} にも Ox, Lx の指定がないので、     CED>G は O5, L4 として処理される。これを一番細かく書けば:       O5C4 O5E4 O5D4 O4G4     となる。最後の G は '>' によって1オクターブ下がるのに注意。     ただし、このオクターブ下げはこの直列形式の外には及ばない。     2番目の直列形式は先頭に O3L2 があるので、こちらの指定が優先される。     したがって以後の2つの並列形式(和音)[EG')以外の  任意の文字からなる文字列である。  マクロ名では大文字・小文字は区別される。つまり '\a' と '\A' は異なるマクロ名である。  マクロは次のような「マクロ定義」で定義する。     \abc="xyz"  上で \abc がマクロ名、xyz がマクロ文字列で、間を '='(等号)でつなぎ、  マクロ文字列は "..." で括る。以後:     abc \abc\abc \abc  のようにマクロ名(マクロ呼び出し)があると、それぞれが xyz で置き換えられ、 abc xyzxyz xyz  となる。  (10/09/11)  なお '=' の後ろ、'"' の間に空白を入れることはできるが、'=' の前に空白を入れることはできない。    ○ \abc= "xyz"    × \abc ="xyz"  またマクロ文字列を複数行に継続する場合には、行末に '\' を入れる。    \abc= "line1\        line2\        line3"  マクロ文字列の中に、別のマクロへの呼び出しがあってもよい。  ただし、自分自身を呼び出すような再帰的定義は使えない。  マクロを用いる用途は大きく3つが考えられる。  (1) 繰り返し現れる長い文字列を短いマクロ名で表わすことにより、    データ全体を短く、見やすくする。  (2) マクロ名に意味のある名前を与えることで、意図・意味をわかりやすくする。  (3) 繰り返し行う設定を統一的に定義し、変更・修正を容易にする。  (2), (3) に相当する例として次を考えてみよう。    \ff="v120"     \f="v100"    \mf="v80"    \mp="v70"     \p="v50"    \pp="v30"  これにより強弱指定を \p, \ff など、楽譜の強弱記号に近いイメージで  指定できるとともに、例えば \f(フォルテ)の velocity 値を v100 から v110  に変える場合、楽譜部分中の '\f' はそのままで、マクロ定義だけ '\f="v110"'  のように変更すればいいから、統一的な修正ができる。  また上を使って:    \cresc="\p:\f"  と定義すれば、\p から \f へのクレッシェンドが定義でき、以下のように使える。    { ... }:\cresc  一方、(1) のケースとして、例えば AA'BA という形式の曲があるとしよう。  すると最初と最後の A 同士はマクロ定義で1つにまとめられる。  A と A' は現在のマクロ機能ではうまく扱えないが、それでも A = a+b, A' = a+b'  のような内部構造に分けられるなら、a の部分をマクロ定義することにより、  全体をコンパクトにまとめることはできる。  注: 現在のマクロ定義は単純な文字列置き換えしかできないが、     これについては今後拡張予定である。