From 3d06bee12a26bc55cd73b1494e4d008a8098f6f5 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Sun, 12 Jul 2026 18:28:50 +0900 Subject: feat: MML拡張合成とNTSC 2A03準拠のIR v2音源を実装 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - エンベロープ、LFO、ビブラート、グライドのグローバル定義表を追加 - ppmckおよびPyxelの拡張コマンドを音声合成へ反映 - 2A03のPulseデューティ列、Triangle DAC、Noise LFSR、Sweepを実装 - APUタイマーに基づく周波数量子化と非線形ミキサを追加 - 途中テンポ変更、拡張コマンドの検証、トラック外定義に対応 - APU規格、拡張合成、IR v2のテストを追加 - プロジェクト独自のppmck拡張仕様と対応範囲を文書化 --- doc/MML_BNF.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'doc/MML_BNF.md') diff --git a/doc/MML_BNF.md b/doc/MML_BNF.md index 83a1281..0c3f3b0 100644 --- a/doc/MML_BNF.md +++ b/doc/MML_BNF.md @@ -102,7 +102,7 @@ ::= ";" ``` -### 2.3 拡張コマンド(第1段階: IR 保持のみ、合成無視) +### 2.3 合成拡張コマンド ```bnf ::= @@ -127,7 +127,7 @@ | "v-" ? /* 1 〜 15 */ ::= "D" /* -127 〜 126 */ - ::= "s" "," + ::= "s" "," ::= "@v" "=" "{" "|" ? "}" ::= "@v" @@ -224,7 +224,7 @@ ::= ( | | ) ``` -### 3.3 拡張コマンド(第1段階: IR 保持のみ、合成無視) +### 3.3 合成拡張コマンド ```bnf ::= | | @@ -261,19 +261,19 @@ | `l` / `L` | 両方 | 1 〜 192 | 4 | | | `v` | ppmck | 0 〜 15 | 15 | | | `V` | pyxel | 0 〜 127 | 100 | | -| `v+` / `v-` | ppmck | 1 〜 15 | 1 | 相対音量(IR保持のみ) | +| `v+` / `v-` | ppmck | 1 〜 15 | 1 | 相対音量(0〜15へクランプ) | | `@` | ppmck | 0 〜 3 | 2 | デューティ比(Pulse系のみ) | | `@` | pyxel | 0 〜 3 | — | デューティ比(Pulse系のみ) | | `q` | ppmck | 1 〜 8 | 8 | クオンタイズ(gate_time = value / 8) | | `Q` | pyxel | 0 〜 100 | 80 | ゲートタイム(%) | | `t` / `T` | 両方 | 1 〜 | 120 | | -| `D` | ppmck | -127 〜 126 | 0 | ディチューン(IR保持のみ) | -| `s` | ppmck | 0 〜 15, 0 〜 7 | — | スイープ `s,`(IR保持のみ) | -| `@v` | ppmck | 0 〜 255 | — | 音量エンベロープ(IR保持のみ) | -| `@@` | ppmck | 0 〜 255 | — | デューティエンベロープ(IR保持のみ) | -| `@MP` / `MP` / `MPOF` | ppmck | 0 〜 255 | — | LFO(IR保持のみ) | -| `@EP` / `EP` / `EPOF` | ppmck | 0 〜 255 | — | ピッチエンベロープ(IR保持のみ) | -| `@EN` / `EN` / `ENOF` | ppmck | 0 〜 255 | — | ノートエンベロープ(IR保持のみ) | +| `D` | ppmck | -127 〜 126 | 0 | cent単位ディチューン | +| `s` | ppmck | speed 0〜7, depth ±1〜±7 | — | Pulseハードウェアスイープ | +| `@v` | ppmck | 0 〜 255 | — | 48 tick単位の音量エンベロープ | +| `@@` | ppmck | 0 〜 255 | — | 48 tick単位のデューティエンベロープ | +| `@MP` / `MP` / `MPOF` | ppmck | 0 〜 255 | — | 三角LFO | +| `@EP` / `EP` / `EPOF` | ppmck | 0 〜 255 | — | cent単位ピッチエンベロープ | +| `@EN` / `EN` / `ENOF` | ppmck | 0 〜 255 | — | 絶対半音オフセット列 | | `K` | pyxel | -127 〜 127 | 0 | トランスポーズ(半音) | | `Y` | pyxel | -127 〜 127 | 0 | ディチューン(セント) | @@ -283,8 +283,9 @@ - 本 BNF は `mml-composemusic-mcp` の**サポート範囲**を定義するものであり、オリジナルの PPMCK や Pyxel の全機能を網羅するものではない。 - 第2段階予定コマンドは設計予約として記載するが、現在の受理文法には含めない。 -- ppmck モードの `@v` / `@@` / `@MP` / `@EP` / `@EN`、および `D` / `s` / `v+` / `v-` は構文解析して IR へ保持し、合成には反映しない。未対応を `SEMANTIC_UNSUPPORTED_FEATURE` で警告する。 -- pyxel モードの `@ENV` / `@VIB` / `@GLI` も同様に IR 保持のみで、`SEMANTIC_UNSUPPORTED_FEATURE` 警告を返す。 +- ppmck モード名は構文互換の識別子であり、拡張の挙動は本プロジェクト独自仕様である。PPMCK/mckc互換は保証しない。 +- ppmck の列型エンベロープは1要素48 tickで、`|`以降を反復し、反復がなければ末尾値を保持する。`D`/`@EP`はcent、`@EN`は絶対半音、`@MP`は`delay,period,depth,0`である。 +- pyxel の `@ENV` は`target,duration`組、`@VIB`は`delay,period,depth_cents`、`@GLI`は`initial_offset_cents,duration`である。slot 0は解除を表す。 - コマンド文字は ppmck では小文字、pyxel では大文字を使用する。音符・休符も同じ規則に従う。ただし ppmck の `D`(ディチューン)は大文字のみ受理する(小文字 `d` は音符)。 - `^` は ppmck モード専用のタイ、`&` は両モード共通のスラー(slur)として扱う。 - 詳細な実装アーキテクチャは [Design.md](Design.md) を参照。 -- cgit v1.2.3