MCMXII

提供:JUDSTYLE Wiki
移動: 案内, 検索

MCMXIIは、PMDMX等に使用するコンパイラVer.2の案。現時点では実装したモジュールは存在しない検討用の資料。

目次

前提条件

このMMLにおける前提条件を以下の通り定める。

  • 7バイト半角文字(ASCII)とShift-JIS全角文字で記述することが望ましい。
  • タブ文字で移動するカラム位置は、4半角文字単位が望ましい。
  • 最終行の末尾にはLF文字を配置することが望ましい。
  • 1物理行は255文字までに折り返すことが望ましい。

無視文字種

CR(0x0d)
解釈上の意味を持たないため、CR文字は無視される。行末はLF文字のみを根拠とするため、CRのみで行を区切ることはできない。
空白文字・タブ文字(0x20,0x09)
一部の例外を除き、連続する空白文字・タブ文字は無視される。行頭に存在する場合のみ意味を持つ文字であり、行内ではデリミタとして使用されるため、連続することが解釈上意義を持たないため。

メタ解釈

MMLをメタ解釈する単位は、とする。行はLF文字で区切られた文字列であり、その影響範囲は行頭の文字種によって決定する。必ずしも最終行末にLF文字が存在する必要はないが、最終行においてもLF文字で終端することが望ましい。

コメント

コメント書式は2種類存在し、コメントのメタ解釈は、全ての文字列解釈よりも先に実施される。

範囲コメント(/*開始~終了*/ 0x2F/2A~0x2A/2F)
開始点から終了点までが、コメントとして扱われMML解釈されない。コメント終了点の次の文字は行頭と判定されない。範囲コメント内の行末文字(LF文字)のみ解釈される。範囲コメント内の行コメント開始文字(セミコロン)は無視される。
行コメント(;~LF 0x3B~0x0a)
セミコロンから行末までが、コメントとして扱われMML解釈されない。行コメント中に範囲コメントが完結している場合は行末までが行コメントとして扱われる。行コメント中に範囲コメントが開始し完結するまでに行末文字(LF文字)が出現した場合、該当範囲コメント終了よりも向こうの文字列はコメントではないと解釈される。

行頭

行頭の文字種により、その行の影響範囲と適用ルールが決定される。

タブ文字(0x09)
タブ文字で開始する行は、全行の末尾に連結される。この処理はコメント処理が完了したあとに実施されるため、前行に行コメントが存在した場合でも、コメントとはみなされない。
空白文字(0x20)
井桁(# 0x23)
井桁で開始する行は、全体MML解釈にかかわる情報を定義する行と解釈される。外部MMLのincludeや、基礎的定義情報などが該当する。
疑問符(? 0x3F)
疑問符で開始する行は、関数を定義する行と解釈される。クレッシェンド時のエクスプレッション操作関数等が該当する。
アットマーク(@ 0x40)
アットマークで開始する行は、音色等を定義する行と解釈される。
英数字
パート、チャネル、あるいは定義されたパートグループ定義に関する演奏情報MMLを定義する行であると解釈する。細部は現状では定義しない。
未定義文字
定められた字種が行頭に据えられている場合、その行はコメント乃至誤記として無視する。

MML内

ダブルクォート(" 0x22)
メタ文字列と解釈する。ダブルクォートで括られた内部はプリプロセッサ変換されず、コメント定義なども無視される。
井桁(# 0x23)
数値パラメータの接頭辞として使用する井桁は、当該パラメータが相対指定であることを示す。実際に相対値指定を出力するのか、コンパイラ内部で相対解釈し絶対値出力するかについては、各音源の実装に依存する。
通貨記号($ 0x24)
数値パラメータの接頭辞として使用する通貨記号は、当該パラメータが16進指定であることを示す。範囲指定可能。
パーセント記号(% 0x25)
数値パラメータの接頭辞として使用するパーセント記号は、当該パラメータが非音長表現指定であることを示す。
括弧("( )" 0x28,0x29)
括弧は、内部のMML文字列を一括して取り扱うことを示す。16進表現や関数のパラメータ、スラー等演奏表現指定の範囲を明示するために使用する。
カンマ(, 0x2C)
カンマは、パラメータのデリミタ。
ゼロ(0 0x30)
ゼロは特別な接頭辞として扱わない。ゼロで始まる数値文字列を記述した場合は、8進数ではなく10進数として解釈する。
バックスラッシュ(\ 0x5C)
忌避文字。使用しない。
バッククォート(` 0x5E)
忌避文字。使用しない。

トラック種類

MML解釈上、または内部的なトラックの種別について。

システムトラック

制御トラック
テンポトラック
拍子とテンポを制御するトラック。
セクショントラック

演奏トラック

単演奏トラック
グループトラック

(stub)

パート・チャネル概念

多岐に亘る音源とデータ形式にするため、MML概念でのパートと、物理音源概念でのパートは非対称の関係を持つ。各単位を記述するためには、後述の音源ドメインを用いて記す。

トラック
MMLを解釈する単位をトラックと呼ぶ。
チャネル
音源の発音単位をチャネルと呼ぶ。1ボイスが1パートに紐付けられているFM音源ドライバ等では1チャネルを指し、MIDIシンセサイザーでは該当する概念はない。
パート
音源のチャネルをパートと呼ぶ。MIDIシンセサイザーの1パートを指し、FM音源ドライバでは1チャネル以上のチャネルを組み合わせて仮想パートを構築したものを指す。
レジメント
1個以上のパートで構築される演奏単位をレジメントと呼ぶ。

音源ドメイン

音源ドメインとは、MMLによる記述で実際に発音されるボイスを記述するための表現。所在を表す文字列をピリオドで区切って表現する。ドメインの記述は左側が上位であり、右側が下位である。ドメインの区分は以下の通りとする。

  1. 音源種別
    音源が何であるか示す。MIDIポートで接続されたシンセサイザーであるか、対応した音源ドライバであるか等が該当する。当該トラック(ないしパート・チャネル)でのMML解釈は、これにより変化する。
  2. 音源ポート
    音源接続ポート識別子を記す。MIDI接続である場合はMIDIインターフェース名またはポート番号を、対応した音源ドライバで指定可能(PMDMX等)なものは文字列または番号で識別子を記述する。
  3. 音源区分
    音源種別・音源ポートで特定されたモジュール内で音源区分が単一でない場合に指定する。モノ音源で仮想パートを自動構築する場合のみ有効。
  4. 音源ボイス数
    その音源が利用できるパート数を示す。
midi.UM-880.1.24
PMDMX0.0.FM.1



MML詳細

MMLコマンドについて定義する。

ノート

ノートオン/オフ関連のMMLコマンドについての定義。対象文字と書式は以下の通り。

<cdefgabCDEFGABrRxX>[+…|-…|=][音長[.…]|%発音steps]

ノート各種

ノートオン(通常)
cdefgab が該当する。調定義あるいは+-=の何れかが存在する場合は音程補正を行い、指定の通りノートオンし、指定された長さを発音後にノートオフする。発音した長さだけ、時間も進行する。
ノートオン(繰り返し)
x が該当する。直前に発音したノートと同音程のノートオンを行う以外はノートオン(通常)と同様。
ノートオン(アクセント)
CDEFGABX が該当する。後述のアクセントによる変化を加える以外はノートオン(通常あるいは繰り返し)と同様。
休符
r が該当する。指定された長さの時間を進行させる。ノートオフは行わない。
ノートオフ
R が該当する。その時点でノートオンされているノートをノートオフする以外は休符と同様。

アクセント

アクセント定義は、関数機能を使用して定義する。アクセント定義関数を使用した場合、該当文字(ABCDEFGX)の単文字マクロはアクセント機能のために固定され、独自定義を使用できない。パラメータの指定は絶対値または相対値で指定する。

v110 ?defAccent(v127) ;通常ノートはv110で、アクセントノートはv127でノートオン

(アクセントに定義可能なパラメータについては未定)

オクターブ

オクターブを設定する。

o数値

ループ制御

ループ制御に関する定義。書式は以下の通り。

[ (A) :: (B) : (C) ]数値

括弧[ ]で括られた部分が、数値で指定された回数だけ繰り返される。一部音源に限り、数値にゼロを指定(無限ループ)することができる。数値を略した場合、規定値(未定義なら2回)とみなされる。2連コロン::が存在した場合、繰り返し初回はその地点から演奏される。単コロン:が存在した場合、繰り返し最終回はその地点で中断する。2連コロンと単コロンの前後及び隣接が可能。

ループ定義

ループ回数を定義する場合には関数機能を使用して定義する。

?defLoopDefault(0)

ゲートタイム

ゲートタイム設定についての定義。書式及び解釈は音源により異なる。共通する書式は以下の通り。

qx ;書式1
q[+-]<音長|%数値> ;書式2
q(種別a,数値b,数値c) ;書式3
書式1(無視指定)
ノートオフを行わない。MIDIドラムマップやYM-2608リズム音源等に適用される。
書式2(単指定)
ノートオフのタイミングのみ指定する。負の値が指定された場合、次のノートまたは休符が開始するまでノートオフしない。(負値指定時に実装で時間指定を有効にするか+1固定にするかは未定)
書式3(完全指定)
詳細な設定を行う場合に使用。
  • 種別a normal(通常/デフォルト)、fixed(発音時間固定)
  • 数値b 発音保証時間
  • 数値c 末端からノートオフを先行させる時間

音源毎の相違

ノートオフのタイミング
MIDIでは、次のノートオンまたは休符に到達する1step前にノートオフする。
FMでは、次のノートオンのタイミングでノートオフする。

タイ・スラー

タイとスラーに関する定義。

タイ

タイは、直前のノートオフと直後のノートオンを行わないことを指定する。MIDIにおいては直前直後のノートが一致せず、直後のノートが休符でもない場合、無視する。

スラー

スラーは、指定音符のゲートタイムを延長する。スラーの書式は二通りあり、それぞれの書式は以下の通り。

c&&e ;ゲートタイムにかかわらず、cのゲートタイムを伸ばしc→eと滑らかに演奏する
a&&(ceg) ;c/eのゲートタイムを伸ばしc→e→gと滑らかに演奏する。範囲外のaには手を加えない。

それぞれの書式については、スラーMMLコマンドの直後が範囲指定を示す(であるか否かで判定する。

ポルタメント/和音

同一のMMLコマンド{~}nにポルタメントまたは和音を割り当て、トラック毎に定義されたモノ/ポリ設定を元に解釈を変更する。

  • モノの場合
{ab}8 ;ポルタメント速度は八分音符に設定し、a→bの順でノートオン
{a} ;ポルタメント速度は標準音長に従い設定し、直前の音をノートオフせずにaをノートオン

ポルタメントと解釈する。範囲内に音符記号を2個まで記述し、2個記述されている場合は前者キーオンの1step後に後者キーオンする。1個記述されている場合はキーオフせずに指定されたノートでキーオンする。数値nにて指定された時間をポルタメント速度として設定する。あらかじめポルタメント速度を設定した状態でレガート演奏する場合との差別化は、実施毎にポルタメント速度を設定できる点とする。

  • ポリの場合
{ceg}1 ;Cmaj全音を発音
{c8e8g8>c8e8c8<g8e8} ;ノートオフせずに演奏して最後のeが発音した八分音符後にノートオフ
{c8e8g8>c8e8c8<g8e}8 ;同上

和音と解釈する。範囲内に音符記号を任意個数記述できる。和音区間内では音長の自動解釈は為されず、音長指定のない連続したnotesコマンドはすべて和音構成部品として解釈される。

デフォルト音長

ノートオンまたは休符が音長指定なく記述された場合の長さを指定する。これが指定されていない場合は規定値が適用されるが、設定によりエラーとすることも可能。

l<数値[.…]|%数値>

規定値はシステム定義を使用し設定する。

#tacitlyDefaultLength 8 ;未定義時のデフォルト音長は八分音符
#tacitlyDefaultLength prohibit ;未定義時のデフォルト音長は使用禁止

音量

音量指定について設定する。演奏中にVolume(MIDI時)またはミキサーボリューム(FM時)は可能な限り操作しないものとする。

v[+|-]<数値> ;書式1
vx[+|-]<数値> ;書式2

書式1では、MIDIならベロシティ、PMDではVに該当。書式2ではMIDIならボリューム、PMDならvに該当する。プラスまたはマイナス記号が付与されている場合、相対的変更であると解釈し、出力データは実装に依存する。規定の単文字マクロVには、vxが割り当てられている。

パン

パンの設定を行う。

p[L|C|R][[+|-]数値]

数値を指定しないL/C/Rにて全左全右中央の設定が可能。数値のみ指定した場合は実装依存。L/C/Rと数値双方を指定した場合は中間値での指定が可能。

音色

音色定義と音色変更は同じ文字@で割り当てられているが、行頭に@が置かれた場合は音色定義、MML行内に@が置かれた場合は音色変更として解釈する。

音色変更

MML行内に@が記述された場合、音色変更と解釈する。各音源によりパラメータの解釈も変更される。値は省略できるが、デリミタは省略できない。

@数値                    ;書式1
@数値1,数値2,数値3,数値4 ;書式2(PMDのSSG部Eの代用/PCM部@)
@数値1,数値2,数値3       ;書式3(MIDI)
書式1(PMD/MIDI共通)
音色番号を指定する。MIDIの場合はプログラムチェンジに該当する。
書式2(PMD)
音色番号と、PCMループポインタを指定する。または、PMDにおけるG/H/IパートのEコマンドの代用として使用する。
書式3(MIDI)
バンクMSB,バンクLSB,コントロールチェンジの順に指定する。

音色定義

行頭で@が記述された場合、音色定義に関する行として扱う。

FM

PMD-FMの場合は、FMレジスタに設定するデータの定義を行う。

SSG

PMD-SSGの場合はエンベロープ設定を行う。

PCM

PMD-PCMの場合はループポインタまたはエンベロープの設定を行う。ここでループポインタやエンベロープの設定を行った場合、MML行内で番号指定のみの音色変更を行った際に自動的に適用される。

MIDI

MIDIの場合はバンク番号やフィルタ等の設定を行う。ここでバンク番号やフィルタ等の設定を行った場合、MML行内でプログラムチェンジのみの音色変更を行った際に自動的に適用される。


基本方針

  • トラックやデータ量の節約は基本的に考慮しない
    演奏中のMIDIトラックにおけるボリュームの変更やプログラムチェンジ、FMにおける効果音モード制御などについては、単文字MMLコマンドの設定を行わない。現代の高性能音源モジュールやPMDMXの使用により、これらのMMLコマンドを割り当てるよりもマクロ準備文字数を増やす方にメリットを見出す。
  • 想定されるトラックパターン
    • ベースライン
      "aaaaaaaa"や"a>a<a>a<"の繰り返しなどが中心。後者のパターンはアクセント機能で簡略化する。繰り返し回数については拡充したループ機能で充分対応可能。
    • 白玉バッキング
      和音が中心。繰り返しや特定のパターンは頻出せず、とにかく和音を速く入力できることが重要。
    • アルペジオバッキング
      繰り返しが多い。本質的にMML機能でどうにかできるようなものではないので、ここの改善は思い切って捨てるという手もあり。
    • ピアノリフ
      和音、繰り返し、スタッカートなどの入力改善を中心に。
    • ギターリフ
      コードとミュートの切り替えを、アクセント機能で補助する前提。PCMなら頻繁な音色変更、MIDIなら音源側スプリット機能を使って頻繁なオクターブ変更を行い、アクセント機能で入力を軽くする。
    • 単音メロ
      キーオンディレイLFOやキーオンディレイモジュレーションのON/OFFを軽くする?
    • 和音メロ
      標準ゼロ音長l0 音長符省略時音長設定をゼロとすること)を認めて、cf4dg4のように入力させるか? あるいはテキストで何らかの加工をさせるか?
    • FM/PCM/MIDIリズム
      V1では単文字マクロで実装し標準ゼロ音長を認めるにとどめ、V2ではステップシーケンス入力に類似した方法を考える。
  • 中間データ
    MMLから複数形式のでデータを処理し出力するので、中間データに関しては別途設計する必要がある。


懸案事項

  • キーオフ制御
    以下の場合におけるキーオフの制御について、とくにゲートタイム(q)をマイナスに扱う場合の検討が必要である。レガートでは単にタイ・スラー記号で繋げばよいか、明示キーオフでは新規に文字を割り当てるか、等。
    • MIDIシンセサイザーにおけるポルタメントでは、レガートしなくてはならないためゲートタイムをマイナスに設定する必要がある
    • ポリ音源におけるボイス制限またはレガート。または記述による明示的なキーオフ。
    • モノ音源におけるポルタメント時。または記述による明示的なキーオフ。
  • アクセント要素
    • ベロシティやボリュームによるアクセント
    • ゲートタイムによるアクセント(不要?)
    • モジュレーションによるアクセント
    • 音階によるアクセント。ベースラインで+12とか、MIDIでのリードギターとか
    • 音色によるアクセント。リードギターとか
    • 他には・・・?
  • 小節処理
    • timebase
      四分音符のsteps数を設定
    • beat
      6/8など。timebaseを元にzenlenを算出したりSMFに出力したりする
  • Tempo/Timer変換
    • PMDMXのMIDIクロックあるいはWAVE-DAW取り込みのために、PMDMXでのTimer値を実測して、対応するTempo値をtimebase値を元に取得するテーブルを作成しておく必要がある。
個人用ツール
名前空間
変種
操作
案内
ツールボックス