# 対応範囲と照合結果

現行実装は0.8改訂5です。照合した全52入力は、元MDXと全バイト一致44本、EX-PCM補正後一致2本、原版同様の拒否6本です。音色・波形バンク2本も一致しています。以下の版付き見出しは各機能の導入履歴で、現在も有効です。全MML文法・全組合せ・実機再生までの完全互換を意味するものではありません。

## 0.3で追加した機能

|区分|対応内容|
|---|---|
|波形メモリ|#wavemem、@w0〜127、最大512要素、ループ有無・ループ位置、符号付き／16進数データ|
|波形エフェクト|AP、DT、TD、VM、MV、KM、TL、YA。ON/OF、Dディレイ、L間隔変更|
|波形の倍率|DTS/TDS、VMS/MVS|
|TL制御|TLMのOPマスク、モジュレータ自動選択、TLTの参照音色|
|動作モード|非同期1、同期、音符数単位の非同期2。タイによる位相継続|
|休符・発音長|Q、#reste、#nreste、#cont、zc。q/@qを音符と休符へ展開し、必要なF8を設定・復帰|
|関連コマンド|#wcmd、zw。関連するp/D/v/@v/V/( / )の書き込み抑制・無視|
|音程マップ|@k0〜7、KS/KSON/KSOF。自動切替時の音色マクロは展開しない|
|一時音量|x/@xの後、次の通常音符で基準音量へ復帰。連続指定やVOとの関係を修正|
|連符内ポルタメント|割り当て後の音長で変移を計算。目標側の音長指定は不可|

波形エフェクトは、音符を必要な時刻で分割し、通常のMDXコマンドとタイへ変換します。波形専用の独自MDX拡張は追加していません。

## 従来からの対応

音符a〜g/n/r、o、< / >、臨時記号、l、整数音長、%ステップ、符点、^/~、&、連符、有限ループ・入れ子・/、L/C。

t/@t、q/@q、k、D、TR、p、v/@v、x/@x、V/VO、( / )、@、47パラメータ音色定義、@@とSMON/SMOF、MP/MA/MH/MD、MHR、GL/GLON/GLOF、K、y、w、F、S/W、$FO。

通常マクロ、チャンネル別指定、コード入力と再使用、調号、!、?、NOTEの行末コメント。

疑似命令は#title/#pcmfile、#include、#nlist/#list、#ex-pcm、#octave-rev、#tps/#tps-all、#detune、#flat/#sharp/#natural/#normal、#overwrite/#toneofs、#coder/#ncoder、#noreturn、#glide。

## 照合済みのLFOの出力

以下のqは、LFO第2引数の「1/4周期ステップ数」です。Aは第3引数の最大振幅です。除算は符号付き整数として0方向へ切り捨てます。

|波形|MPの周期語|MPの振幅／変移語|MAの周期語|MAの振幅／変移語|
|---|---:|---:|---:|---:|
|0 鋸歯状|4q|128A/q|4q|64A/q|
|1 矩形|2q|256A|2q|256A|
|2 三角|2q|256A/q|2q|128A/q|
|3 ランダム|q|A|2q|256A|

MP波形4〜7は、0〜3と同じ引数変換を行い、波形番号4〜7をそのまま書きます。追加の倍率はドライバ側で扱います。

停止OFは80、再開ONは81です。公開資料の記述と逆だったため、参照MDXの実出力を採用しました。

`MP1,2,1` は `EC 01 00 04 01 00`、`MP1,2,-24` は `EC 01 00 04 E8 00` です。これはコンバータの符号化についての確認です。再生エンジンのLFO内部計算の確認とは別です。

## NOTE出力に合わせた挙動

### EX-PCM宣言

p11_exとf00_ex0の元MDXは、AにE8がなく、B以降の参照位置と音色データ位置が実際より1バイト先でした。Aで音符を発音するf01_ex1は正常で、元MDXと全バイト一致しています。

現行版はAが無音でもE8を出力します（0.4以降）。参照ファイルは変更せず、テストの比較コピーだけにE8を挿入しています。この2本は全バイト一致件数に含めません。

### 一時音量とオフセット

@xは@vとは異なり、NOTEが出力した生の値に合わせています。VOが0であれば@x0/1/64/127をそのまま出力し、VOがある場合には16段階へクリップする挙動も確認されました。

一時音量の復帰は音符の直後に固定して書き込まず、次の通常音符で行います。途中の音量コマンドで復帰先が変わり、連続するx/@xでは復帰が省かれます。これによりf02_ctrlも全バイト一致しています。

@q129は7F、@q192は40です。この範囲もNOTEが出力した符号化に合わせています。演奏時の聞こえ方は別途確認が必要です。

### 波形の境界と休符

効果を区切る最後の時刻にも、次の波形値が出力される場合があります。OFF時の基準値復帰は別に出力されます。休符を処理対象にするか、無音部分で位相だけ進めるか、同期位相を保つかを分けて実装しています。

## 0.4の追加対応

- #load-tone/#save-tone、#load-wave/#save-wave。元のNOTEが生成した2種類のバンクと保存結果が全バイト一致。読込はホストのコールバック、保存はResultの補助データとして提供します。
- #compress（省略／0は休符、1はタイで接続された同音程も対象）。休符128tick、音符256tickの範囲内で隣接要素を結合します。波形加工・連符・ポルタメント・グライドでは圧縮しません。
- #optのdvqpt012と*、引数なしで停止。既知の出力状態と同じコマンドを削除します。ループ境界や直接レジスタ書込で記憶を破棄し、0.7では設定済みLFOの再指定も扱います。NOTEの全コマンド移動規則までは確認していません。g06_optは全バイト一致します。
- 音符数モードの正のディレイは、g02で確認したNOTE出力に合わせて無視します。
- 同期モードの負のディレイは、#cont0ではタイの最終音符だけ、#cont1/2では各音符に適用します。
- VM/MVの一時音量、DT/TD・VM/MVの合算、同じ波形値が続く箇所の音長のまとめ方、片側効果を停止したときの出力を修正しました。
- 音程マップが直前の未発音の音色選択を上書きする場合、その音色選択を置換します。

バンクの未登録領域は新規保存時に0で埋めます。読込済みの未使用領域は維持します。異なるNOTE版のバンクは未確認です。

## 未対応の周辺機能

- #pcmlistとPCM使用状況ファイルpcmuse.map（未対応）。警告して無視します。
- -lと引数なし-oのPCMマップは認識して警告します。-i/-t/-w/-v/-r/-b/-e等は0.8改訂1で復元しました。-eは最初のエラーまでの登録済みバンク保存のみで、原版の解析継続は再現していません。-v0の色表示は対応端末のみです。全スイッチの状態はCLI_COMPATIBILITY.mdを参照してください。

#play/#remove/#beep/#verは警告して無視します。改訂5では、その他の未定義・判別不能な#命令も警告し、その行を無視して継続します。既知の命令の不正な引数、定義継続中の不正な構文は従来どおりエラーです。誤記を正しい命令へ自動補正はしません。

## 0.7の実曲検証と最適化

ILの11曲すべてが元MDXと完全一致しました。STAGE5/6は-c -z、他は既定設定です。詳細はIL_VALIDATION.mdを参照してください。

-c/-cn/-zと長形式--compress/--optを追加しました。圧縮・最適化の初期状態は従来通り無効で、CLIまたはAPIから指定した場合はMMLの指定に優先します。最適化は値の重複削除に加え、次の発音前の上書き、休符をまたぐ設定の移動、LFOの設定済み状態・パラメータ再利用を扱います。任意の全入力についてNOTEの最適化規則を完全再現したとまでは確認していません。

GLONで再開した整数半音グライドのF3出力など、文書だけでは説明しきれない挙動は実データに合わせています。採用した根拠と入力位置をIL_VALIDATION.mdに記載しています。

## 0.6までの構文修正

行頭が無効な通常行はコメントです。複数行定義の継続行は例外です。演奏行中の無効な大文字から行末までをコメントとし、有効な命令・マクロ・引数・$や#の構文は区別します。

臨時記号は連続指定できます。最初の明示記号は調号に優先し、その後は+で半音上げ、-で半音下げ、"または=で自然音へ戻します。通常音符・コード構成音・ポルタメント目標音で共通です。引用符で始まるマクロ定義は閉じ引用符までを本文とします。

## 現在エラーにする組合せと制限

- 動作中の波形を、現在の位相位置が範囲外になる長さへ再定義する場合。先にOFFにしてください。
- 連符の入れ子、連符内の波形エフェクト・?・ループ関連命令。1要素256tick超の連符。
- 有限ループ内のL、音色マクロ内のL/C。
- コードとパート別指定の括弧を論理行をまたいで記述する場合。
- タイの間に疑似命令・定義が挟まる一部の入力。

Q、連符内ポルタメント、TL自動マスク、音程マップの別音色への切替、DT/TD・VM/MVの合成はg05_mixでもNOTE出力と一致しました。これらの検査に含まれない全組合せまで確認したものではありません。

ファイル全体の上限は既定64KiBで、-mSIZE（KiB）またはAPIのmax_output_bytesで増やせます。トラック・音色開始位置はデータ先頭から65535以内です。末尾の音色データは64KiBを越えてよく、K01TAILの67,488バイトが元MDXと全バイト一致しました。原版もトラック位置超過・長距離ループを拒否しました。ループの符号付き16bit距離の検査は維持しますが、境界値そのものの原版照合までは行っていません。include16段、通常マクロ8段、ループ32段です。列番号はCP932のバイト位置、診断メッセージは英語です。

## 0.8の集計

音色とステップ数をResult::statisticsおよびCLIで取得できます。APIはFM選択済み／未使用定義、PCM発音番号／残りの番号を保持します。CLIではFM使用番号を個別に列挙し、FM・PCMとも未使用番号の表示は廃止しました。PCMバンク選択のみでは使用中と数えません。有限ループ・最終回の抜け出し・ネストを反映し、無限ループは初回の終端までを総数、L/Cから終端までをループ数として表示します。Cは初めて実行された位置を採用し、圧縮境界にもなります。Wの同期待ちは含みません。64bit超過はoverflow。元プログラムの画面表示との一致までは確認していません。

## 0.8 改訂2の大容量出力

large64k.zipのMDX2本とLOG8本を照合しました。K00SAFE（56,093バイト）とK01TAIL（67,488バイト）は全バイト一致。K02PART/K03SUMは開始位置の超過、K04LOOP/K05LOOPはL、K06REPT/K07ESCは有限ループの範囲超過として双方が拒否します。エラー行・文言・診断数までの一致は対象外です。元ログのK06/K07には複数の診断があり、原版のエラー復帰処理を完全再現したとは扱いません。詳細はLARGE64K_VALIDATION.mdに記載しています。

## 0.8 改訂4：音色定義の空白区切り

@番号={...}の47項目は、カンマに加えて半角スペース・タブ・改行で区切れます。混在も可能です。数値の個数・範囲、末尾カンマの扱いは維持します。他のコマンドのカンマ必須構文は変更していません。NoteMDXの拡張仕様で、原版note.xでの同構文の受理は未検証です。詳細はVOICE_SEPARATOR_FIX.md。

## 根拠

本ツールは「mml file converter for mxdrv2 v0.8.5 1994,95 by DIS」のドキュメントに基づき、原プログラムや第三者実装のソースを使用せずに作成しました。入力文法の根拠はnote.docです。文書に基づく独立実装には、下記の補助資料と原版の実出力による検証を含みます。

|資料|用途・内容|照合結果・記録|
|---|---|---|
|note.doc|NOTE v0.8.5の入力文法・スイッチ。CP932原文を同梱|日英説明書の基礎。実装との差は各項の補足を優先|
|MXDRVデータ資料（YURAYSAN氏）|出力形式の補助資料。下記URLに転載|記述と実出力が食い違う箇所は実出力を優先|
|priority.zip / effects.zip / followup.zip / remaining.zip|小規模33入力の元MDXと音色・波形バンク2本|31本は全バイト一致、2本はEX-PCMの比較コピー補正後一致。バンク2本一致。VALIDATION.md|
|IL.zip|実曲11組のMUS・MDX|11曲全バイト一致。STAGE5/6は-c -z、他は既定設定。IL_VALIDATION.md|
|large64k.zip|元MDX2本・LOG8本。入力はprobes/large64kの8本|K00SAFE 56,093バイト、K01TAIL 67,488バイトが-m256で全バイト一致。残り6入力は原版も拒否。LARGE64K_VALIDATION.md|

補助資料：[MXDRVデータ資料](https://w.atwiki.jp/mxdrv/pages/23.html) に転載された当時のYURAYSAN氏の資料。第三者実装のソースは使用していません。

全52入力の内訳は、元MDXとの全バイト一致44本、EX-PCMの比較コピー補正後一致2本、元ログと同じ拒否結果6本です。音色・波形バンク2本は別集計です。6本の診断文・位置・件数の完全一致や実機再生を確認したものではありません。原版のログには起動引数が残っていないため、再現用バッチのコマンドと実行済みの引数を同一視しません。

資料の権利表示：I.C.KaZeの提供資料はCC BY 4.0 Internationalで、テスト用に収録しています。Illumination LASER title copyright: (C) 2000 MYO GAME。DIS氏のnote.docはこの許諾の対象外です。原版条件と資料別の適用範囲はTHIRD_PARTY_NOTICES.mdおよびLICENSE-DATA.mdを参照してください。
