Skip to content

devel の成果を main に反映#172

Merged
igapyon merged 108 commits into
mainfrom
devel
Apr 15, 2026
Merged

devel の成果を main に反映#172
igapyon merged 108 commits into
mainfrom
devel

Conversation

@igapyon
Copy link
Copy Markdown
Owner

@igapyon igapyon commented Apr 15, 2026

devel の成果を main に反映

…dbg`) and update related docs/tests

### Summary

This PR standardizes `MusicXML miscellaneous-field` keys to the new `mks:*` namespace structure and updates docs/tests accordingly.

- `mks:meta:*` for roundtrip restoration metadata
- `mks:diag:*` for structured conversion diagnostics
- `mks:src:*` for source-preservation payloads
- `mks:dbg:*` for debug-only traces

### What Changed

1. Namespace migration in format I/O implementations
- `diag:*` -> `mks:diag:*`
- `src:*` -> `mks:src:*`
- legacy debug keys migrated to `mks:dbg:*`
  - `mks:abc-meta-*` -> `mks:dbg:abc:meta:*`
  - `mks:midi-meta-*` -> `mks:dbg:midi:meta:*`
  - `mks:mei-debug-*` -> `mks:dbg:mei:notes:*`
- MIDI SysEx roundtrip metadata moved to `mks:meta:*`
  - `mks:midi-sysex-*` -> `mks:meta:midi:sysex:*`

2. Behavior alignment in readers/consumers
- Diagnostic scanning/export paths now target `mks:diag:*` (ABC/LilyPond/UI summary path in `main.ts`)
- MEI misc label mapping now normalizes into `mks:*` namespace (`mks:src:mei:*` etc.)

3. Documentation updates
- Added new spec: `docs/spec/MISCELLANEOUS_FIELDS.md`
- Updated `docs/spec/FORMAT_IO_CHECKLIST.md` to the new classification/order:
  - `mks:meta` -> `mks:diag` -> `mks:src` -> `mks:dbg`
- Added `MISCELLANEOUS_FIELDS.md` links in `README.md`

4. Test updates
- Updated unit tests across ABC/MIDI/MEI/MuseScore/LilyPond to assert new key names.

### Impact

- Output key names are now based on the new namespace policy.
- Any downstream tooling that depends on legacy names (`diag:*`, `src:*`, old `mks:*` variants) must be updated to the new keys.

### Files in Scope (main)

- `src/ts/abc-io.ts`
- `src/ts/midi-io.ts`
- `src/ts/mei-io.ts`
- `src/ts/musescore-io.ts`
- `src/ts/lilypond-io.ts`
- `src/ts/main.ts`
- `docs/spec/MISCELLANEOUS_FIELDS.md` (new)
- `docs/spec/FORMAT_IO_CHECKLIST.md`
- `README.md`
- `tests/unit/*-io.spec.ts`
- generated artifacts: `src/js/main.js`, `mikuscore.html`
Unify `miscellaneous-field` namespaces under `mks:*` (`meta/diag/src/…
…namespace references

### Summary

This PR finalizes the documentation and runtime behavior for `miscellaneous-field` naming by treating `mks:*` as the canonical output namespace and removing legacy-output guidance.

### Changes

- Updated ABC debug metadata references in docs:
  - `mks:abc-meta-*` -> `mks:dbg:abc:meta:*`
  - File: `docs/spec/ABC_IO.md`

- Updated MIDI debug metadata references in docs:
  - `mks:midi-meta-*` -> `mks:dbg:midi:meta:*`
  - File: `docs/spec/MIDI_IO.md`

- Removed migration note that allowed legacy dual-write/dual-read from checklist:
  - File: `docs/spec/FORMAT_IO_CHECKLIST.md`

- Simplified `miscellaneous-field` spec to new canonical policy:
  - Explicitly states output should follow `mks:*`
  - Removed `Legacy Names (Current)` section
  - File: `docs/spec/MISCELLANEOUS_FIELDS.md`

- Updated metadata stripping selector in app code to target only `mks:*` fields:
  - `name^="src:"` fallback removed
  - File: `src/ts/main.ts`

- Regenerated build artifacts:
  - `src/js/main.js`
  - `mikuscore.html`

### Impact

- Runtime metadata handling now assumes `mks:*` namespace for stripping/export-side treatment.
- Documentation no longer describes legacy output naming as an active behavior.
- This change helps keep implementation and specs consistent with the new namespace policy.
Align `miscellaneous-field` policy to `mks:*` only and remove legacy …
## 概要
ファイル読み込みフローを拡張し、`.zip` を入力として受け付けられるようにしました。
ZIP内の対応ファイルは「ルート直下のみ」を候補表示し、選択後は既存の通常ロード経路に合流します。
あわせて、ファイルロード中のUIとして全画面オーバーレイ(スピナー)を追加しました。

## 主な変更点
- `accept` を拡張し、`.zip` と関連MIMEを追加
- ZIP読み込み時の候補選択UIを追加(`#zipEntrySelectBlock`)
  - ルート直下の対応拡張子のみ列挙
  - 候補1件は自動選択、複数件はユーザー選択
- ZIP内選択後、既存 `resolveLoadFlow` に仮想 `File` として渡す実装を追加
- ZIPユーティリティを `mxl-io.ts` に追加
  - `listZipRootEntryPathsByExtensions`
  - `extractZipEntryBytesByPath`
- ファイルロード中の全画面オーバーレイを追加
  - `Loading file...` + スピナー
  - ロード中は関連UIを非活性化
- ZIPユーティリティのユニットテストを追加

## 変更ファイル
- `mikuscore-src.html`
- `src/css/app.css`
- `src/ts/main.ts`
- `src/ts/mxl-io.ts`
- `tests/unit/download-flow.spec.ts`
- `src/js/main.js`(ビルド成果物)
- `mikuscore.html`(ビルド成果物)

## テスト
- `npm run typecheck` ✅
- `npm run test:unit -- tests/unit/download-flow.spec.ts` ✅
- `npm run build` ✅

## 影響範囲
- 入力画面のファイルロードUX
- ZIP経由の各フォーマット取り込み経路
- ビルド済み配布HTML / JS
ZIPファイル入力対応を追加し、ルート直下エントリ選択とロード中オーバーレイ表示を実装
## 概要
Output周りの操作性と視認性を改善するため、ボタン順・色・初期設定を調整しました。
主な目的は、実運用で使う導線(MusicXML/MIDI/MuseScore)をわかりやすくし、圧縮エクスポートを初期状態で有効化することです。

## 変更内容

### 1. Outputボタン順の調整
- `MusicXML, MuseScore, MIDI` だった並びを
- `MusicXML, MIDI, MuseScore` に変更

対象:
- `mikuscore-src.html`
- `mikuscore.html`(ビルド成果物)

### 2. ボタン配色の調整
- `MIDI` ボタンをセカンダリ配色に変更
  - CSS対象を `#exportPlayBtn` から `#downloadMidiBtn:not(:disabled)` へ変更
- `Play` ボタン(Score / Output)のスタイルをプライマリから通常トーンへ変更
  - `md-button--primary` → `md-button--tonal`

対象:
- `src/css/app.css`
- `mikuscore-src.html`
- `mikuscore.html`(ビルド成果物)

### 3. 圧縮エクスポートのデフォルトをON化
- `Compress MusicXML / MuseScore export` を初期状態でONに変更
  - UIのチェック状態をON
  - 定数 `DEFAULT_COMPRESS_XML_MUSESCORE_EXPORT` を `false` → `true`

対象:
- `mikuscore-src.html`
- `src/ts/main.ts`
- `src/js/main.js`(ビルド成果物)
- `mikuscore.html`(ビルド成果物)

## 期待される効果
- Outputの主要導線が直感的になり、MIDI出力が見つけやすくなる
- Playボタンの視覚的優先度を適正化
- 圧縮出力(`.mxl` / `.mscz`)が初期状態で有効になり、配布時のファイルサイズ最適化をしやすくなる

## 影響範囲
- Input/Score/Edit の機能ロジックには影響なし
- Output UIおよびデフォルト設定値に影響あり
- 既存ユーザーの保存済み設定がある場合は、そちらが優先される(ローカル設定読み込み仕様に準拠)
Output導線のUI調整と圧縮エクスポート設定のデフォルトON化
### 概要
`docs/spec/HARMONY_ANALYSIS_EXTENSION.md` を新規追加し、mikuscore の和声解析拡張仕様(v1 Draft)を英語版・日本語版で定義しました。

### 変更内容
- 新規ファイル追加:
  - `docs/spec/HARMONY_ANALYSIS_EXTENSION.md`
- 仕様の主な定義:
  - MusicXML 標準 `<harmony>` を基盤にした和声情報設計
  - `mks:*` 名前空間による拡張情報分離(`<other-harmony>` / `<other-play>`)
  - `mks:analysis` の必須・任意項目、`mks:harmony-id` 制約
  - `mks:special-chord`(`It6 | Fr6 | Gr6 | N6`)の定義
  - `mks:secondary-of` の v1 制約と v2 拡張余地の注記
  - 演奏表現制御:
    - `mks:intonation`(`mks:unit="cent"`、`mks:scope`)
    - `mks:dynamic-offset`(`mks:unit="velocity"`、`mks:scope`)
  - 検証・診断:
    - 推奨診断コード
    - 構造化診断例(`mks:measure` / `mks:tick` を含む)
  - 互換性、ラウンドトリップ、ロールバック、フェーズ別機能目標、将来拡張

### 期待効果
- 標準互換性を維持しながら、高度な和声解析情報を安全に保持可能
- 実装時の一貫したバリデーション/失敗時動作/拡張方針を明文化
- 学習用途から音大課題レベルまでを見据えた仕様土台を確立

### 影響範囲
- ドキュメント追加のみ(実装コード変更なし)
docs(spec): 和声解析拡張仕様 v1 ドラフトを新規追加(EN/JA)
…IDIダウンロードを実装

### 概要
Edit画面の情報量が増えてきたため、編集UIとXML確認UIをサブタブで分離しました。
あわせて、選択中小節の `Self-contained MusicXML DOM` を直接ダウンロードできる `MusicXML` / `MIDI` ボタンを追加しています。

### 変更内容

1. Editパネルにサブタブを追加
- `Editor` / `Measure XML` の2タブを追加
- 既存の編集操作UI(Convert/Split/Delete 等)を `Editor` 側へ移動
- XML表示UIを `Measure XML` 側へ移動

2. Measure XML表示UIを強化
- 表示を2テキストエリア構成に整理
  - `Measure DOM`
  - `Self-contained MusicXML DOM`
- XML見出し文言を短縮・タイトル化
- テキストエリアの通常時ボーダーを明示(未フォーカスでも枠が見える状態)

3. Edit操作ボタン列の再配置・追加
- `Play` を `Discard` の右へ移動
- `Play` の右に `MusicXML` ボタンを追加
- `MusicXML` の右に `MIDI` ボタンを追加

4. 小節XML/MIDIダウンロード機能を追加
- `MusicXML` ボタン:
  - ダウンロード対象は `draftCore.debugSerializeCurrentXml()`(Self-contained MusicXML DOM)
  - 小節情報を含むファイル名で保存
- `MIDI` ボタン:
  - 上記と同じSelf-contained MusicXMLをMIDI変換して保存
  - ノートなし/パース失敗時は既存診断経由でエラー表示

### 主な変更ファイル
- `mikuscore-src.html`
- `src/ts/main.ts`
- `src/css/app.css`
- (ビルド生成物)
  - `src/js/main.js`
  - `mikuscore.html`

### 影響範囲
- Editタブ内のUI構造・操作導線
- 小節編集ドラフトのエクスポート導線(MusicXML/MIDI)
- スタイル(XML表示テキストエリア、サブタブ)

### 確認観点
- 小節選択時に `Editor`/`Measure XML` を切替可能
- `Measure XML` タブで2つのDOM表示が更新される
- `MusicXML` ボタンでSelf-contained MusicXMLが保存できる
- `MIDI` ボタンで同一XML由来のMIDIが保存できる
- テキストエリアは未フォーカス時でも枠が視認できる
Editパネルに「Editor / Measure XML」サブタブを追加し、小節単位のSelf-contained MusicXML/M…
…tained XMLへのsrc注入

### 概要
MEI入力時のトレース性と編集時の可視性を改善するため、以下を追加しました。

- MEI生テキスト由来の `mks:src:mei:raw-*` メタデータを MusicXML へ付与
- MEIの `stem.mod="*slash"`(例: `1slash`)を、MusicXML上の刻み音符列へ展開
- Edit画面の **Self-contained MusicXML DOM** に、選択小節時点で有効な `mks:src:mei:*` を注入表示

### 主な変更点

#### 1) `src/ts/mei-io.ts`
- `buildMeiSourceRawMiscFields()` を追加
  - `raw-encoding / raw-length / raw-encoded-length / raw-chunks / raw-truncated / raw-0001...`
  - escape-v1 でチャンク化して `miscellaneous-field` に格納
- `convertMeiToMusicXml()` で `meiSource` から raw fields を作成し、各パートの初回 attributes 出力時に付与
- `parseLayerEvents()` に `stem.mod=slash` 展開ロジックを追加
  - `note/chord` の `stem.mod` を解析
  - 長い音価を拍内の短い反復イベントへ展開
  - 展開後イベントは既存の note/chord 生成フローへ流す(既存処理と整合)

#### 2) `src/ts/main.ts`
- `collectEffectiveSrcFieldsForSelectedMeasure()` を追加
  - 選択小節までの `mks:src:mei:*` を収集(同名は最新値を採用)
- `injectSrcFieldsIntoSelfContainedXml()` を追加
  - Self-contained XMLの対象小節 attributes/miscellaneous に未存在分のみ注入
- `buildMeasureXmlInspectorText()` を更新
  - Self-contained XML生成時に上記 `src` フィールドを反映

#### 3) 生成物更新
- `src/js/main.js`
- `mikuscore.html`

### 期待される効果
- MEI取込結果に対して、元入力(raw)を追跡しやすくなる
- `stem.mod=slash` 記譜が「保持和音」ではなく「刻み」として解釈されるケースを改善
- EditのSelf-contained表示だけ見ても、該当小節のMEI由来メタ情報を確認可能

### 動作確認
- `npm run typecheck` : OK
- `npm run build` : OK
- `npm run build:all` : OK(unit/spot/property/roundtrip 含む)
MEI取込強化: `mks:src:mei:raw-*` 常時付与 + `stem.mod=slash` の刻み展開 + Self-con…
### 概要
`Keep source/extension metadata (src:*, mks:*)` の単一スイッチを廃止し、`mks:meta:*` / `mks:src:*` / `mks:dbg:*` を個別に ON/OFF できるようにしました。
MusicXML 出力時の metadata 除去も prefix 単位で制御します。

### 変更内容
- General Settings のUIを3スイッチ化
- 設定モデル (`PlaybackSettings`) を3項目へ拡張
- 旧設定 `keepMetadataInMusicXml` からの後方互換マイグレーションを追加
- MusicXML 出力フィルタを prefix 判定に変更
- 3スイッチすべてON時は XML をそのまま返す早期 return を追加
- 取込時オプションの連携を変更
- `sourceMetadata` は `mks:src` スイッチに連動
- `debugMetadata` は `mks:dbg` スイッチに連動
- スイッチ変更時の保存・再描画イベントを更新
- ビルド成果物を更新
- `src/js/main.js`
- `mikuscore.html`

### 期待される効果
- metadata を用途別に細かく制御可能
- `mks:meta/src/dbg` の必要なものだけを保持できる
- 全ON時は不要な再シリアライズを回避し、DOM変更を最小化

### 変更ファイル
- `src/ts/main.ts`
- `mikuscore-src.html`
- `src/js/main.js` (generated)
- `mikuscore.html` (generated)
`General Settings` の metadata 制御を `mks:meta/src/dbg` の個別スイッチに分離
### 概要

このPRは、以下 2 点をまとめて反映します。

1. 組み込みサンプル名の完全リネーム
   - `sample1` → `sample6`
   - `sample2` → `sample7`
   ※ 互換名は残さず、参照先を全面更新しています。

2. MEIソース埋め込み時の上限拡張
   - `src/ts/mei-io.ts` の `maxChunks` を `512` から `16384` に引き上げ
   - 大きな MEI を `mks:src:mei:*` として保持する際の途中切れ(truncated)を起こしにくくする目的です。

---

### 変更内容

#### 1) sample 名称の完全リネーム

- ファイル/生成物
  - `src/samples/musicxml/sample1.musicxml` → `sample6.musicxml`
  - `src/samples/musicxml/sample2.musicxml` → `sample7.musicxml`
  - `src/ts/sampleXml.ts` → `sampleXml6.ts`
  - `src/ts/sampleXml2.ts` → `sampleXml7.ts`
- 参照更新
  - UIボタンID/ラベル
    - `loadSampleBtn1` → `loadSampleBtn6`
    - `loadSample2Btn` → `loadSample7Btn`
    - `Load sample 1/2` → `Load sample 6/7`
  - ビルド定数・エクスポート名
    - `SAMPLE1_* / SAMPLE2_*` → `SAMPLE6_* / SAMPLE7_*`
    - `sampleXml / sampleXml2` → `sampleXml6 / sampleXml7`
  - テストケースID/fixture名
    - `sample1`/`sample2` 系を `sample6`/`sample7` 系へ更新
- ドキュメント更新
  - `docs/spec/SCREEN_SPEC.md` のアクション表記を `Load sample 6/7` に更新

#### 2) MEI raw chunk 上限の拡張

- `src/ts/mei-io.ts`
  - `const maxChunks = 512;`
  - → `const maxChunks = 16384;`
- 意図
  - 大きい MEI を `mks:src:mei:raw-xxxx` に分割保存する際の打ち切りを緩和

---

### 影響範囲

- **Breaking**: 既存の `sample1` / `sample2` 名称を前提にした外部参照はそのままでは動作しません(完全リネーム方針)。
- アプリUI、ビルド時サンプル同期、roundtrip/unit テスト、ドキュメントに影響します。

---

### 補足

- 生成物 (`mikuscore.html`, `src/js/main.js`) もリネーム内容に合わせて更新済みです。
sample1/2 を sample6/7 へ完全リネームし、MEI raw 埋め込みの chunk 上限を拡張
### 概要
MuseScore 取込時の以下の不具合を修正しました。

- ハ音記号・ヘ音記号がト音記号として解釈されるケース
- MuseScore 側で非表示にしたテンポ文字列(例: `metNoteQuarterUp... = 60`)が表示されるケース
- タイトル/作曲者が `無題のスコア` / `Unknown` になるケース
- 併せて、`mks:src:*` 系フィールド収集ロジックを汎化

### 変更内容

#### 1. Clef 解釈の強化(`src/ts/musescore-io.ts`)
- C clef(例: `C3`, `C4`)を正式対応
- `Part > Staff` に `id` がない場合でも、実 Staff へのフォールバック割当を実施
- `defaultClef` / `Instrument clef` からの補完を改善
- これにより、Mozart SQ fixture で P3 が C3、P4 が F4 として正しく取り込まれるように修正

#### 2. 非表示テンポ文字列の抑制(`src/ts/musescore-io.ts`)
- `Tempo` 要素の `visible=0` を尊重
- 非表示テンポは `words` を出さず、`sound tempo` のみ出力

#### 3. タイトル/作曲者メタデータ抽出の修正(`src/ts/musescore-io.ts`)
- `metaTag(workTitle/composer)` が MuseScore の既定プレースホルダ
  - `無題のスコア`
  - `作曲者 / 編曲者`
  - `Untitled Score` など
  の場合、`VBox > Text(style=title/composer)` を優先採用
- MusicXML 出力に `identification > creator[type="composer"]` を追加

#### 4. src メタデータ収集対象の拡張(`src/ts/main.ts`)
- `mks:src:mei:*` 固定から `mks:src:*` に拡張
- 全 part/measure の attributes から最新値を収集するように改善
- 従来ロジック(選択パートを使うフォールバック)も維持

#### 5. テスト追加(`tests/unit/musescore-io.spec.ts`)
- VBox タイトル/作曲者優先のテスト
- 非表示テンポ(`visible=0`)のテスト
- C clef 取込のテスト(measure clef / defaultClef)
- ローカル Mozart SQ fixture(`mscz` 展開)で clef 検証

### 生成物更新
- `mikuscore.html`
- `src/js/main.js`

### 期待される効果
- MuseScore 由来の実運用データで、記号・テンポ表示・ヘッダメタデータの再現性が向上
- 既定値混入時でも、ユーザーが意図したタイトル/作曲者を表示可能
MuseScore 取込の互換性改善: C/ヘ音記号対応・非表示テンポ抑制・タイトル/作曲者抽出修正
### 概要
MuseScore由来データの取り込みと簡易Play再生で発生していた以下の問題をまとめて修正しました。

- `sample4`(MXL)をGUIから直接ロードできない
- 弱起(anacrusis)譜面で、簡易Play時に冒頭で不自然な空白が入る
- MuseScoreが出力する measure直下の `<sound tempo="..."/>`(非表示テンポ相当)を取りこぼす
- MuseScore側にBeam情報がない場合でも、mikuscore側で梁(beam)を推定してしまう

---

### 主な変更点

#### 1. sample4の追加とGUIロード対応
- `src/samples/musicxml/sample4.mxl` を追加
- `scripts/build.mjs`
  - MXLを `unzip` で展開して MusicXML本文を抽出する処理を追加
  - `sampleXml4.ts` の自動生成を追加
- `src/ts/main.ts`
  - `sampleXml4` を読み込み
  - `#loadSample4Btn` クリックでロードする導線を追加
- `mikuscore-src.html` / `mikuscore.html` / `src/js/main.js`
  - `Load sample 4` ボタンを追加(ビルド成果物反映)

#### 2. 再生タイムラインの弱起補正
- `src/ts/midi-io.ts`
  - `resolveMeasureAdvanceDiv` を拡張し、先頭小節の underfull を条件付きで弱起扱いできるように変更
  - `shouldTreatFirstUnderfullAsPickup` / `estimateMeasureContentSpanDiv` などの補助ロジックを追加
  - 判定は**全パート先頭小節が underfull の場合のみ**有効化し、通常の underfull 小節挙動への影響を抑制

#### 3. standalone `<sound tempo>` の取り込み
- `src/ts/midi-io.ts`
  - `collectMidiTempoEventsFromMusicXmlDoc` で、`<direction>` 配下だけでなく
    measure直下の `<sound tempo="..."/>` もテンポイベントとして収集するように修正

#### 4. MuseScore Beam情報優先
- `src/ts/musescore-io.ts`
  - 明示的な MuseScore BeamMode が存在しない場合は、beamを推定付与しないよう変更
- `tests/unit/musescore-io.spec.ts`
  - 上記仕様に合わせてテストを更新

#### 5. サンプル/フィクスチャ追加
- `src/samples/musescore/Mozart_SQ_No15_K421_Mvt4.mscz` を追加
- `src/ts/sampleXml4.ts` を追加(自動生成物)

---

### 変更ファイル
- `mikuscore-src.html`
- `mikuscore.html`
- `scripts/build.mjs`
- `src/js/main.js`
- `src/samples/musescore/Mozart_SQ_No15_K421_Mvt4.mscz`
- `src/samples/musicxml/sample4.mxl`
- `src/ts/main.ts`
- `src/ts/midi-io.ts`
- `src/ts/musescore-io.ts`
- `src/ts/sampleXml4.ts`
- `tests/unit/musescore-io.spec.ts`

---

### 検証
- `npm run build` 実行
- `npm run test:unit` 実行(全件パス)
MuseScore取込と再生タイムラインを改善(sample4追加・弱起補正・standalone tempo対応・Beam推定抑止)
### 概要
サンプルデータ群を整理し、形式ごとに `sample1`〜`sample4` を揃えて追加しました。
既存の個別名ファイル(`Mozart_SQ_No15_K421_Mvt4.mscz`)は削除し、`sample4.mscz` へ統一しています。

### 変更内容

#### 追加
- MEI
  - `src/samples/mei/sample1.mei`
  - `src/samples/mei/sample2.mei`
  - `src/samples/mei/sample3.mei`
  - `src/samples/mei/sample4.mei`
- MIDI
  - `src/samples/midi/sample1.mid`
  - `src/samples/midi/sample2.mid`
  - `src/samples/midi/sample3.mid`
  - `src/samples/midi/sample4.mid`
- MuseScore
  - `src/samples/musescore/sample1.mscz`
  - `src/samples/musescore/sample2.mscz`
  - `src/samples/musescore/sample3.mscz`
  - `src/samples/musescore/sample4.mscz`
- MusicXML (MXL)
  - `src/samples/musicxml/sample1.mxl`
  - `src/samples/musicxml/sample2.mxl`
  - `src/samples/musicxml/sample3.mxl`

#### 更新
- `src/samples/musicxml/sample4.mxl` を更新

#### 削除
- `src/samples/musescore/Mozart_SQ_No15_K421_Mvt4.mscz`

### 目的 / 効果
- サンプル命名規則を `sample1`〜`sample4` に統一
- 複数フォーマット間で対応するサンプルを比較しやすくする
- GUI/テスト/ドキュメントからの参照を簡潔化

### 補足
- 本コミットはサンプル資産の追加・差し替えが中心で、アプリケーションロジックの変更は含みません。
サンプル資産を `sample1`〜`sample4` に統一し、MEI/MIDI/MuseScore/MusicXML 一式を追加
### 概要
このPRでは、GUIから読み込める組み込みサンプルを拡張し、sample1-4 のフィクスチャ/生成物を最新化しました。

### 変更内容
- GUIに以下のボタンを追加
  - `Load sample 1`
  - `Load sample 2`
  - `Load sample 3`
- `main.ts` にて各ボタンのクリック時に `loadBuiltInSample(...)` を呼び出す処理を追加
- `scripts/build.mjs` を拡張し、以下を自動生成するように変更
  - `src/samples/musicxml/sample1.mxl` → `src/ts/sampleXml1.ts`
  - `src/samples/musicxml/sample2.mxl` → `src/ts/sampleXml2.ts`
  - `src/samples/musicxml/sample3.mxl` → `src/ts/sampleXml3.ts`
- ビルド成果物を再生成
  - `src/js/main.js`
  - `mikuscore.html`
- sample1-4 のサンプル資産を更新
  - `src/samples/musicxml/sample{1..4}.mxl`
  - `src/samples/musescore/sample{1..4}.mscz`
  - `src/samples/mei/sample{1..4}.mei`
- 生成済みサンプルTSを更新
  - `src/ts/sampleXml{1..4}.ts`

### 目的
- sample1-3 をGUIから直接読み込めるようにするため
- `.mxl` フィクスチャ更新時に対応するTS生成物を確実に同期するため
- MusicXML/MuseScore/MEI 間のサンプル整合性を保つため

### 確認結果
- `npm run build:all` を実行し、テスト・ビルドともに成功
- 生成物およびGUI側のローダー配線が反映済みであることを確認
sample1-3 の組み込みローダー追加と sample1-4 関連アセットの更新
### 概要
MEI / MuseScore / MIDI の import/export 周りをまとめて改善し、以下の不整合を解消しました。

- MEI: 拍子・テンポ・スラー/トリル・アーティキュレーション・パート名・臨時記号の読み取り強化
- MuseScore: 小節途中リピート、トリル、tpc由来の綴り(B♭/A#)保持、ビーム補完制御の改善
- MIDI: Viola系パートのハ音記号優先、(以前の)detached推定スタッカート付与の停止

### 主な変更点

#### 1) `src/ts/mei-io.ts`
- MEI `artic` を MusicXML `notations/articulations` に双方向対応拡張
  - `stacc` / `spicc(stacciss)` / `acc` / `ten(tenuto)` / `marc(marcato)` を対応
- `accid` 子要素を読むよう修正(視覚臨時記号・発音臨時記号の読み取り改善)
- `staffDef` の `meter.count` / `meter.unit` を優先した拍子解釈を追加
- `meter.sym` (`common`/`cut`) を MusicXML `time@symbol` に反映
- `staffDef` の `<label>` / `<labelAbbr>` からパート名を取得
- measureレベル control event(slur/tie/trill/tempo)の取り込みを拡張
- tempo は visible tempo を優先し、`infer-from-text` は fallback のみ採用

#### 2) `src/ts/musescore-io.ts`
- MuseScore BarLine subtype の派生(`start-repeat` / `end-repeat` / `end-start-repeat`)を解釈し、
  小節途中リピートを MusicXML barline として往復可能に
- Ornament の trill 読み取りを強化し、`trill-mark` / `accidental-mark` を反映
- `tpc` から臨時記号表記を復元し、`Accidental` が欠落している場合でも綴りを優先保持
- BeamMode 不在時のビーム補完をオプションで制御できるよう改善
- export 時に repeat direction 情報を適切に subtype へ戻す処理を追加

#### 3) `src/ts/midi-io.ts`
- part名に `Viola` / `Vla` を含む場合、C3(ハ音記号)を優先
- 広音域でも Viola は grand staff 化せず単譜表維持
- detached 比率からの自動 staccato 推定は停止(テストで固定)

#### 4) テスト
- `tests/unit/mei-io.spec.ts`:tempo/拍子/accidental/artic/trill/label などのケースを追加
- `tests/unit/musescore-io.spec.ts`:小節途中リピート・tpc綴り・trill accidental・beam挙動を追加
- `tests/unit/midi-io.spec.ts`:Viola clef 挙動と staccato非推定を追加

### 影響範囲
- 取込結果の記譜がより原譜寄りになります(特に MEI / MuseScore)。
- MIDI import は「detachedパターンからの自動スタッカート付与」を行いません。

### 変更ファイル
- `src/ts/mei-io.ts`
- `src/ts/musescore-io.ts`
- `src/ts/midi-io.ts`
- `tests/unit/mei-io.spec.ts`
- `tests/unit/musescore-io.spec.ts`
- `tests/unit/midi-io.spec.ts`
- `mikuscore.html`
- `src/js/main.js`

### 確認
- Unit tests 追加・更新済み
- `mikuscore.html` / `src/js/main.js` はビルド成果物更新
MEI/MuseScore/MIDI 取込の精度改善(拍子・テンポ・装飾音・リピート・綴り保持・Viola譜表)
### 背景
実装の進展に対して `docs/spec` の役割重複や記述の分散が増えていたため、以下を目的にドキュメントを整理しました。

- プロダクトの現在位置(編集中心ではなく変換中心)を明確化
- 仕様文書の責務分離(正本/要約/運用)を明文化
- README / index の説明を実態に合わせる
- Playback の実運用上の制約を明示

### 変更概要

#### 1. 新規ドキュメント追加(`docs/`)
- `docs/PRODUCT_POSITIONING.md`
- `docs/CONVERSION_PRINCIPLES.md`
- `docs/FORMAT_COVERAGE.md`
- `docs/QUALITY.md`

目的:
- `docs/spec/*` から「プロダクト説明・方針・品質運用」を分離し、読む順序を明確化。

#### 2. MuseScore I/O仕様を独立
- 新規: `docs/spec/MUSESCORE_IO.md`

目的:
- `musescore-io.ts` の実装仕様(repeat/tpc/trill/beam/options など)を一箇所に集約。
- `MUSESCORE_EXPORT_PARITY_TEST.md` は「検証戦略文書」として位置づけを限定。

#### 3. `docs/spec` の重複解消(無理のない範囲)
- `COMMANDS.md`: 詳細仕様を `COMMAND_CATALOG.md` / `DIAGNOSTICS.md` 参照へ整理
- `BUILD_PROCESS.md`: 日常運用コマンドを `LOCAL_WORKFLOW.md` 参照に整理
- `SPEC.md` / `ARCHITECTURE.md` / `TEST_MATRIX.md` / `TEST_CFFP.md`:
  - それぞれの責務(上位原則・設計境界・ゲート・ケース台帳)を `Scope note` で明示
- `PLAYBACK.md`:
  - 大規模譜面での簡易再生制約を明記
  - 推奨運用(MIDIエクスポート→外部MIDI再生)を明記

#### 4. 多言語運用ポリシーを導入
- `docs/spec/TERMS.md` に Language Policy 追加
  - 英語を正本
  - 日本語は抄訳
  - 未決定事項は例外的に日本語のみ可
- 日本語重複の大きい文書を抄訳化:
  - `docs/spec/UI_SPEC.md`
  - `docs/spec/SCREEN_SPEC.md`
  - `docs/spec/abc-compat-parser-ebnf.md`

#### 5. README / index の更新
- `README.md`:
  - 変換中心の説明へ更新
  - スクリーンショットを各言語セクション上部へ配置
  - 対応フォーマットを拡張子込みで明示(圧縮/非圧縮含む)
- `index.html`:
  - 「score editor」表現を変換中心に更新
  - 対応フォーマットを拡張子込みで明示(`.musicxml/.xml/.mxl`, `.mscx/.mscz`, `.mid/.midi`, etc.)

### 期待効果
- 新規参入者が「どの文書を読むべきか」をすぐ判断できる
- 仕様変更時の更新先が明確になり、乖離リスクを低減
- プロダクト実態(MusicXML中心の変換ソフト)と公開文言の整合が取れる
- 大規模譜面時のPlayback制約を事前に共有できる
ドキュメント体系を再編し、mikuscoreを「MusicXML中心の変換ソフト」として明確化
igapyon added 29 commits April 12, 2026 10:48
コントリビューション関連文書を追加し、TypeScript ファイルに標準 Apache ヘッダを付与
## 概要

`docs/articles` 配下に、Qiita / Note 向けの記事管理用 Markdown 一式を追加します。

あわせて、記事作成のための README・テンプレート・記事原稿を追加します。

## 変更内容

- `docs/articles/README.md` を追加
- `docs/articles/qiita/README.md` を追加
- `docs/articles/qiita/TEMPLATE.md` を追加
- `docs/articles/note/README.md` を追加
- `docs/articles/note/TEMPLATE.md` を追加
- Qiita 向け記事原稿 `docs/articles/qiita/20260412-ai-score-abc-first.md` を追加
- Qiita 向け記事草案 `docs/articles/qiita/2026XXXX-mikuscore-skills-intro.md` を追加
- Note 向け記事草案 `docs/articles/note/2026XXXX-mikuscore-skills-intro.md` を追加

## 追加された内容の要点

- 記事管理用ディレクトリ `docs/articles` の方針と命名ルールを整理
- Qiita 向けの想定スタイル、テーマ、テンプレートを追加
- Note 向けの想定スタイル、テーマ、テンプレートを追加
- 「生成AI に譜面対応させたくて、まず ABC 記譜法に寄っていった話」の Qiita 記事原稿を追加
- `mikuscore-skills` 紹介記事の Qiita / Note 向け草案を追加
docs/articles 配下に Qiita/Note 向け記事管理テンプレートと記事原稿を追加
## 変更内容

- `docs/articles/note/20260412-ai-score-abc-first.md` を新規追加
  - Note 掲載先情報、タイトル、ハッシュタグを記載
  - 「生成AI と譜面の受け渡しにおいて、まず ABC 記譜法を足場にした」という内容の記事本文を追加
  - 関連リンク、想定読者、使用した生成AI を記載
- `docs/articles/qiita/20260412-ai-score-abc-first.md` を更新
  - タグを `Score` から `ABC記譜法` に変更
  - `MusicXML` に関する説明を調整
    - 会話欄で重いことに加え、対話の流れの中でデータが切れたことがある旨を追記
  - 画像を追加
    - 冒頭付近
    - 本文中
    - まとめ付近
  - 見出しを `実行ページとソースコード` から `実行ページなど` に変更
  - 想定読者から `MusicXML` と `ABC` のどちらを足場にするか悩んでいる人、の記述を削除
  - `使用した生成AI` を追加
    - `VS Code` + `GPT-5.4`
Note版記事を追加し、Qiita版「生成AI に譜面対応させたくて、まず ABC 記譜法に寄っていった話」を調整
## 概要

記事ドキュメントのメタ情報と関連情報を整理します。

## 変更内容

- `docs/articles/note/20260412-ai-score-abc-first.md`
  - 掲載先情報のタイトル表記を `[mikuscore]` から `[mikuscore-skills]` に修正

- `docs/articles/qiita/20260412-ai-score-abc-first.md`
  - 掲載先情報から `公開記事タイトル` と `スクリーンショット挿入` の記述を削除
  - `## Qiita 掲載用属性情報` 見出しを削除
  - 末尾付近に `## 関連情報リンク` を追加
  - Note 記事へのリンク情報を追加

## 補足

- 変更対象は記事ドキュメント 2 ファイルです
記事メタ情報を `mikuscore-skills` 表記に合わせて整理
## 概要

MuseScore 取り込み時の調号復元を見直し、`KeySig > accidental` だけでなく `KeySig > concertKey` / `KeySig > transposeKey` を考慮するようにします。
あわせて、移調楽器では written pitch 側の調号を優先して復元できるようにし、関連する仕様文書と回帰テストを追加します。

## 変更内容

- `src/ts/musescore-io.ts`
  - `readMuseKeyFifths` を追加
  - MuseScore import 時の key signature 読み取りを整理
  - 非移調パートでは `KeySig > accidental` に加えて `KeySig > concertKey` を受理
  - 移調パートでは `KeySig > transposeKey` を優先し、`concertKey` を written key としてそのまま採用しないように調整
  - 既存の `accidental` は互換フォールバックとして維持

- `tests/unit/musescore-io.spec.ts`
  - `accidental` がなく `concertKey` のみを持つ MuseScore key signature の取り込みテストを追加
  - 移調楽器で `transposeKey` と `concertKey` が併存する場合に、`transposeKey` を優先して MusicXML の `key` / `transpose` を復元するテストを追加

- `docs/spec/MUSESCORE_IO.md`
  - MuseScore import における `KeySig` 読み取りルールを追記

- `docs/spec/FORMAT_IO_CHECKLIST.md`
  - written pitch / concert pitch に影響する source-specific key variant を文書化・テスト対象に含める観点を追記

- `src/js/main.js`
- `mikuscore.html`
  - ビルド生成物を更新

## 期待される効果

- MuseScore 4 系の `concertKey` ベースのデータでも、調号が C major / A minor 扱いに落ちるケースを防止
- 移調楽器を含むスコアで、MusicXML の written key と transpose の整合性を保ちやすくする
- 今回の調号復元不具合に対する回帰防止

## テスト

- `npx vitest run tests/unit/musescore-io.spec.ts`

## 補足

- ビルド生成物として `src/js/main.js` と `mikuscore.html` が更新されています。
MuseScore import で `concertKey` / `transposeKey` を考慮して調号復元を改善
…0+ 寄りにする

## 概要

MusicXML から MuseScore へのエクスポート時の `KeySig` 出力を見直し、`accidental` に加えて `concertKey` を出力するようにします。
また、移調情報を持つパートでは `transposeKey` も併記し、MuseScore 4.0+ の key signature 表現に寄せます。

## 変更内容

- `src/ts/musescore-io.ts`
  - MuseScore export 用の key signature 組み立て処理を追加
  - `KeySig` 出力を `accidental` 単独から、`concertKey` / `transposeKey` を含む形に変更
  - 移調情報を持たない場合は `accidental` と `concertKey` を出力
  - 移調情報を持つ場合は `accidental` と `concertKey` と `transposeKey` を出力

- `tests/unit/musescore-io.spec.ts`
  - 基本的な MusicXML -> MuseScore エクスポートで `concertKey` を含むことを確認する期待値に更新
  - 移調楽器の roundtrip テストで、`transposeDiatonic` / `transposeChromatic` に加えて `KeySig` に `concertKey` / `transposeKey` が出ることを確認する期待値を追加

- `TODO.md`
  - MuseScore export を 4.0+ ネイティブ寄りに寄せる方針を追記
  - import 側の互換フォールバックは維持しつつ、export 側の独自 transpose helper tag を将来的に整理する TODO を追加

- `src/js/main.js`
- `mikuscore.html`
  - ビルド生成物を更新

## 期待される効果

- MuseScore export の `KeySig` が `accidental` 単独よりも 4.0+ の表現に近づく
- 移調楽器のエクスポートで、written key と concert key の区別が `KeySig` 上でも明示される
- MusicXML -> MuseScore -> MusicXML の transpose roundtrip 確認を強化できる

## テスト

- 変更対象の unit test 更新あり
- 実行コマンド: `npx vitest run tests/unit/musescore-io.spec.ts`

## 補足

- import 側の互換フォールバックを削除する変更ではありません。
- `mksTransposeDiatonic` / `mksTransposeChromatic` の整理は、このコミットでは未対応です。`TODO.md` に記載されています。
MusicXML からの MuseScore エクスポートで `concertKey` / `transposeKey` を出力して 4.…
## 概要

MuseScore へのエクスポートから独自の transpose helper tag を削除し、`transposeDiatonic` / `transposeChromatic` のみを出力するようにします。
あわせて、MuseScore import 側でも当該 helper tag の読み取りをやめ、TODO を現状に合わせて更新します。

## 変更内容

- `src/ts/musescore-io.ts`
  - MuseScore export の `Instrument` から `mksTransposeDiatonic` / `mksTransposeChromatic` の出力を削除
  - MuseScore import の `readPartTransposeFromMusePart(...)` から `mksTransposeDiatonic` / `mksTransposeChromatic` の読み取りを削除
  - `transposeDiatonic` / `transposeChromatic` と通常の `transpose` 読み取りは維持

- `TODO.md`
  - export 側の helper tag 削除が反映された前提で、残課題を「former custom MuseScore transpose helper tags の import-side fallback 整理」に更新
  - `museScore/@version` を `4.0` から引き上げる条件に関する TODO を追加

- `src/js/main.js`
- `mikuscore.html`
  - ビルド生成物を更新

## 期待される効果

- MuseScore export の `Instrument` 出力が、独自補助タグを含まない形になる
- MuseScore I/O の transpose 表現が簡潔になり、4.0+ ネイティブ寄りの方針に近づく
- 旧 helper tag に依存しない import/export 経路へ整理できる

## 補足

- このコミットでは `museScore/@version` の値自体は変更していません。
- import 側の互換フォールバック全体はそのまま残します。
MuseScore export から独自 transpose helper tag を削除して 4.0+ ネイティブ寄りにする
## 概要

ABC 書き出し時の初期テンポ解釈を見直し、MusicXML の `metronome` 情報がある場合は拍単位を反映した `Q:` ヘッダを出力するようにします。
あわせて、曲頭に複数のテンポ指示が並ぶ場合の選択ロジックを修正し、関連テストと TODO を更新します。

## 変更内容

- `src/ts/abc-io.ts`
  - ABC の `Q:` ヘッダ出力で、MusicXML の `metronome > beat-unit` / `per-minute` を使って拍単位付きテンポを出力する処理を追加
  - 初期テンポ取得処理を追加し、最初の part の最初の measure に複数のテンポ指示がある場合は、先頭位置に並ぶ候補のうち最後のテンポを採用するように変更
  - 従来の単純な先頭 `sound[tempo]` 参照から、曲頭テンポを明示的に解釈する実装に変更

- `tests/unit/abc-io.spec.ts`
  - `metronome` の拍単位を ABC の `Q:` ヘッダに反映するテストを追加
  - 曲頭に複数テンポがある場合に、最後の先頭テンポを採用するテストを追加

- `TODO.md`
  - MuseScore 由来の「表示テンポと hidden metronome/playback tempo が同居するケース」の一般ルール整理を TODO として追加

- `src/js/main.js`
- `mikuscore.html`
  - ビルド生成物を更新

## 期待される効果

- 四分音符固定ではないテンポ指定でも、ABC の `Q:` ヘッダに拍単位を反映できる
- 曲頭に複数のテンポ指示がある場合に、意図しないテンポを拾うケースを減らせる
- MuseScore 由来データの ABC 書き出しで、初期テンポの解釈が改善される

## テスト

- `npx vitest run tests/unit/abc-io.spec.ts`

## 補足

- 複数テンポが同居する MuseScore データの一般ルールは、このコミットでは完全には確定していません。`TODO.md` に要整理事項として記載されています。
ABC エクスポートの初期テンポ解釈を修正し、拍単位付き `Q:` 出力に対応
## 概要

`mikuscore` の更新時に、`devel` と連携している downstream 側で追従作業が発生しうることを、開発フローとコントリビューション文書から気づけるようにするためのドキュメント更新です。

## 変更内容

- `CONTRIBUTING.md`
  - `mikuscore` の変更が `mikuscore-skills` / `miku-abc-player` に影響しうることを Development Notes に追記
  - PR 記載事項として、必要に応じて downstream 側の `devel` 追従に触れることを追記
- `docs/spec/LOCAL_WORKFLOW.md`
  - 日常フローに `downstream 影響確認` を追加
  - shared behavior / format contract / 生成物 / AI handoff 前提に影響する変更では、downstream 側の追従作業発生可能性を意識する旨を追記
- `README.md`
  - documentation map に `docs/spec/LOCAL_WORKFLOW.md` と `docs/spec/BUILD_PROCESS.md` を追加
  - 運用文書への到達性を改善

## 目的

- `mikuscore` 側の変更時に、downstream 側の確認や追従が必要になる可能性を見落としにくくする
- 既存の downstream 側手順そのものではなく、こちら側での気づきと記載漏れ防止を強化する

## 影響

- ドキュメントのみの変更
- 実装変更なし

## テスト

- ドキュメント更新のみ
docs: downstream 追従確認の運用メモと workflow 導線を追加
…段階的リファクタリング

## 概要

ABC import における bounded な `%%score` staff grouping 対応を追加しつつ、`musicxml-io.ts` と `musescore-io.ts` の責務分解を進めた変更です。あわせて、関連 spec と TODO、生成物を更新しています。

## 変更内容

### ABC

- `%%score` の扱いを見直し、ordered ids に加えて parenthesized groups を扱う形に変更
- `parseScoreVoiceOrder(...)` を `parseScoreLayout(...)` に置き換え
- grouped voices を 1 part + multiple staves として扱うための内部データ組み立てを追加
- `tests/unit/abc-io.spec.ts` に関連テストを追加

### MusicXML

- `src/ts/musicxml-io.ts` を段階的に整理
- parse / serialize
- normalization / fixup
- render-oriented helper
  という責務のまとまりが読みやすくなるよう helper を分解
- part-list / part-id normalization、tuplet enrichment、final barline、beam-related normalization まわりの helper を整理

### MuseScore

- `src/ts/musescore-io.ts` の import / export / helper 群を段階的に整理
- import 側で、metadata / staff grouping / measure context / voice holder event walk などの helper を切り出し
- export 側でも、part scaffold / measure context / header emission / document emission の helper を整理
- `convertMuseScoreToMusicXml(...)` の top-level が orchestration として読める形に近づくよう分解

### ドキュメント / TODO

- `docs/spec/ABC_IO.md` を更新
  - `%%score` を voice ordering に加えて bounded な staff-grouping directive として記述
- `docs/spec/ABC_STANDARD_COVERAGE.md` を更新
- `TODO.md` に ABC / MuseScore / MusicXML の refactoring series と今後の作業分解を追加

### 生成物

- `mikuscore.html`
- `src/js/main.js`

を更新

## この PR で意図している範囲

- `%%score` は bounded support です
- parenthesized grouping を practical に取り込むための対応であり、ABC 全体の staff-layout semantics を網羅するものではありません
- `brace` / `bracket` / `staves` などの broader `V:` property semantics は引き続き別課題です
ABC の bounded `%%score` staff grouping 対応と MusicXML / MuseScore I/O の…
## 概要

`src/ts/musescore-io.ts` の内部構造を整理し、MuseScore import / export の責務境界をこれまでより明確にする変更です。
このコミットでは、公開 API の追加や削除ではなく、主に内部 helper・状態・処理単位の分解と再構成が行われています。

あわせて、生成物である `src/js/main.js` および `mikuscore.html` が更新されています。

## 変更内容

### 1. MuseScore import 側の処理分解

`src/ts/musescore-io.ts` で、MuseScore -> MusicXML 変換の part / measure / voice 単位の処理が分解されています。

含まれる変更例:
- measure 単位の attribute 出力要否判定の切り出し
- import 時の measure header 組み立て処理の分離
- part 内 voice 番号解決 helper の分離
- primary measure / staff measure 解決 helper の追加
- measure 完成処理の分離
- voice 出力処理の分離

### 2. MusicXML export 側の処理分解

MusicXML -> MuseScore 変換でも、metadata / part scaffold / measure context / staff state / voice rendering などの単位で helper や型が追加されています。

含まれる変更例:
- part identity、document body、staff state などの型追加
- MusicXML metadata 読み取り helper の整理
- part 定義 body / instrument XML の組み立て処理の分離
- measure context に clef / key / time / repeat などの出力判断を集約
- direction seed の XML 化 helper の追加
- export の voice / measure / staff 単位の描画処理分離
- MusicXML note / direction / barline の child dispatch 処理分解

### 3. measure / voice / event データフローの明示化

内部的に、以下のような責務のまとまりがより明示されています。

- import 側:
  - measure header 判定
  - part voice 解決
  - voice event 出力
  - measure 完成処理
- export 側:
  - metadata 抽出
  - part scaffold 構築
  - measure context 構築
  - staff state 更新
  - voice event 生成
  - child dispatch 処理

### 4. 生成物の更新

以下の生成物が更新されています。

- `src/js/main.js`
- `mikuscore.html`

## 変更ファイル

- `src/ts/musescore-io.ts`
- `src/js/main.js`
- `mikuscore.html`

## 目的

この変更の主目的は、`src/ts/musescore-io.ts` に集中していた import / export / 共通 helper の責務を段階的に整理し、今後の仕様拡張や追加分割に備えた内部構造に近づけることです。
MuseScore I/O の内部構造を段階的に整理し import/export の責務境界を明確化
## 概要

`src/ts/abc-io.ts` の in-file staged refactor を大きく進め、ABC import / export の責務境界をこれまでより明確にする変更です。
あわせて、日常用 build とフル build の導線を `package.json` で分離し、`TODO.md` に進捗と次アクションを反映しています。

このコミットには、ABC body parser で `idx` が進まない経路を検出・抑止する進行保証の追加も含まれます。

## 変更内容

### 1. `src/ts/abc-io.ts` の段階的リファクタリング

`src/ts/abc-io.ts` に多数の helper / type を追加し、ABC import / export の大きな塊を段階的に分解しています。

含まれる整理の方向性:
- score-layout 読み取りの分離
- line parsing / header/body dispatch の helper 化
- normalized voice data / part 構築の分離
- body token / grace / bracket / fallback dispatch の分離
- pending note-state 適用の共通化
- grouped-staff MusicXML emission の helper 化
- measure header / repeat-ending / note serialization の helper 化
- top-level part-list / part-body / document / export-context orchestration の整理

差分上で追加されている代表的な helper / type 例:
- `parseAbcScoreLayout(...)`
- `parseAbcScoreVoiceOrder(...)`
- `processAbcImportLine(...)`
- `buildAbcNormalizedVoiceDataById(...)`
- `buildAbcParsedPartsFromLayout(...)`
- `processAbcBarlineEntry(...)`
- `processAbcNonPlayableBodyEntry(...)`
- `processAbcPlayableEvent(...)`
- `buildAbcMeasureXml(...)`
- `buildAbcMeasureNotesXml(...)`
- `buildAbcPartListXml(...)`
- `buildAbcPartBodyXml(...)`
- `buildAbcMusicXmlExportContext(...)`
- `buildAbcScorePartwiseXmlDocument(...)`

### 2. ABC body parser の進行保証追加

ABC import の body loop に、cursor が前進しないまま処理継続しないための guard が追加されています。

差分上で確認できる内容:
- `ensureAbcBodyCursorAdvanced(...)` の追加
- `handleBodyEntry` / `handleBodyFallback` / ignorable-char 処理の各 `continue` 前で進行確認
- barline 処理と non-playable wrapper で `idx` を古い値で戻さないよう `Math.max(idx, ...)` を使った伝播修正

このコミットには、barline / ending marker 周辺で `idx` が停滞しうる経路の修正が含まれています。

### 3. build scripts の整理

`package.json` で build 導線が整理されています。

追加・変更された script:
- `build:full`
- `test:build:full`
- `test:slow`

また、`build` / `build:all` / `test:build` の役割が調整され、重い suite を分離する方向に変更されています。

### 4. `TODO.md` の更新

`TODO.md` には以下の反映があります。

- `## Build` セクション追加
- `build:full` の時間短縮と安定化を今後の課題として明記
- ABC refactor の current status 更新
- MuseScore refactor の current status 更新
- ABC series 4 の「Resume here next time」メモ追加

### 5. 生成物の更新

差分には以下の生成物更新が含まれます。

- `src/js/main.js`
- `mikuscore.html`

## 変更ファイル

- `src/ts/abc-io.ts`
- `package.json`
- `TODO.md`
- `src/js/main.js`
- `mikuscore.html`

## 目的

この変更の主目的は以下です。

- `src/ts/abc-io.ts` の責務を段階的に整理し、将来の分割や追加変更に耐えやすくする
- build の日常利用経路とフル検証経路を分ける
- ABC body parser の cursor 停滞を検出・抑止し、無限ループ的な停止を避ける
ABC I/O の段階的リファクタリングを進めつつ build 導線を整理し、ABC body parser の進行保証を追加
… coverage を追加

## 概要

`src/ts/abc-io.ts` の staged refactor をさらに進め、ABC export 側の note / measure / part rendering をより小さい helper に分解した変更です。
あわせて、grouped `%%score` import の複数 measure と repeat / ending 復元を対象にした characterization test を追加しています。

生成物として `src/js/main.js` と `mikuscore.html` も更新されています。

## 変更内容

### 1. ABC export helper の追加分解

`src/ts/abc-io.ts` で、MusicXML emission 側の helper 分解がさらに進んでいます。

差分上で追加されている代表的な helper:
- `buildAbcRenderedMeasureMiscXml(...)`
- `createInitialAbcPartRenderState(...)`
- `buildAbcPartXml(...)`
- `buildAbcNoteXml(...)`
- `buildAbcNoteHarmonyAndWordsDirectionXml(...)`
- `buildAbcNoteControlDirectionXml(...)`
- `buildAbcNotePitchOrRestXml(...)`
- `buildAbcNoteLyricXml(...)`
- `buildAbcNoteTimeModificationXml(...)`
- `buildAbcNoteAccidentalXml(...)`
- `buildAbcNoteOrnamentsXml(...)`
- `buildAbcNoteArticulationsXml(...)`
- `buildAbcNoteTechnicalXml(...)`

これにより、note serialization は少なくとも以下のまとまりが以前より明確になっています。

- leading directions
- note core subfragments
- note notations subgroups
- per-measure misc assembly
- per-part render state / part assembly

### 2. grouped `%%score` の characterization test 追加

`tests/unit/abc-io.spec.ts` に、grouped `%%score` の bounded behavior を凍結するテストが追加されています。

追加された観点:
- grouped voices が複数 measure でも `<backup>` と staff 配置を維持すること
- grouped `%%score` import で repeat / alternate ending が multi-staff part 上に復元されること

### 3. `TODO.md` の現在地更新

`TODO.md` に、ABC refactor と characterization coverage の進捗が反映されています。

反映内容の例:
- grouped `%%score` multi-measure backup emission の coverage 追加
- grouped repeat / ending restoration の coverage 追加
- series 4 の current status 更新
- 次の高価値な coverage 候補を grouped-staff lyrics / grouped key-meter-tempo changes に整理

### 4. 生成物の更新

差分には以下の生成物更新が含まれます。

- `src/js/main.js`
- `mikuscore.html`

## 変更ファイル

- `src/ts/abc-io.ts`
- `tests/unit/abc-io.spec.ts`
- `TODO.md`
- `src/js/main.js`
- `mikuscore.html`

## 目的

この変更の主目的は以下です。

- ABC export 側の helper 境界をさらに明確にする
- grouped `%%score` の bounded behavior を characterization test で明示する
- ABC refactor の current status を `TODO.md` に反映し、次の作業地点を分かりやすくする

## 確認事項

- `typecheck` 実行: 確認済み
- ABC 関連 targeted test 実行: 確認済み
- 実行した targeted test:
  - `tests/unit/abc-io.spec.ts`
  - `tests/unit/abc-inline-voice-switch.spec.ts`
  - `tests/unit/abc-roundtrip-golden.spec.ts`
  - `tests/unit/cli-api.spec.ts`
- 上記 targeted test の結果: `385 passed`
ABC I/O の export helper 分解をさらに進め、grouped `%%score` の characterization…
## 概要

`mikuscore` の説明を、開発者寄り・軽量エディタ寄りの見え方から、「MusicXML-first な譜面変換ツール」という位置づけに揃える変更です。
このコミットでは、`README.md` を利用者向けに再構成し、開発向け情報を `docs/DEVELOPMENT.md` に分離しています。あわせて、関連ドキュメントと `About mikuscore` の UI 文言も同じ方向に更新されています。

## 変更内容

### 1. `README.md` の再構成

`README.md` は、利用者向けの製品説明に寄せて大きく整理されています。

差分上で確認できる主な内容:
- `mikuscore` を MusicXML-first の score converter として説明
- `What mikuscore is for`
- `What mikuscore is not`
- `Core idea`
- `Supported formats`
- `Typical use cases`
- `Related projects`
- `Quick start`
- `Documents`
- 日本語セクションの再整理

### 2. 開発者向け情報の新設

新規ファイル `docs/DEVELOPMENT.md` が追加されています。

この文書には、差分上で以下の内容が含まれます。
- build / test / verification コマンド一覧
- CLI の開発者向けメモ
- documentation map
- AI interaction policy への導線
- debugging note
- `mikuscore-skills` および `miku-abc-player` が `mikuscore` を upstream dependency として取り込むことに関する注意

### 3. 周辺ドキュメントの位置づけ調整

以下の文書も、README と同じプロダクト像に合わせて更新されています。

- `docs/PRODUCT_POSITIONING.md`
- `docs/FORMAT_COVERAGE.md`
- `docs/CONVERSION_PRINCIPLES.md`
- `docs/AI_INTERACTION_POLICY.md`

差分上で確認できる方向性:
- `mikuscore` は notation editor ではなく変換ツールであることを明確化
- MusicXML-first / conversion / inspection / handoff の役割を強調
- AI は bridge use case の一つであり、製品の唯一の主軸ではないことを明示
- format coverage でも、lossless editing parity を約束するものではないことを補強

### 4. `About mikuscore` UI 文言の更新

`mikuscore-src.html` と生成物 `mikuscore.html` にある `About mikuscore` の tooltip 文言が更新されています。
また、`docs/spec/SCREEN_SPEC.md` の該当説明も同じ内容に合わせて更新されています。

差分上で確認できる変更例:
- `browser-based local score editor` から `browser-based MusicXML-first score converter` へ変更
- workflow を `Inspect the score and diagnostics` / `Export or hand off in another format` に寄せて更新
- MuseScore などの dedicated notation editor を使うべき場面を `notation editing` として明示

## 変更ファイル

- `README.md`
- `docs/DEVELOPMENT.md`
- `docs/PRODUCT_POSITIONING.md`
- `docs/FORMAT_COVERAGE.md`
- `docs/CONVERSION_PRINCIPLES.md`
- `docs/AI_INTERACTION_POLICY.md`
- `docs/spec/SCREEN_SPEC.md`
- `mikuscore-src.html`
- `mikuscore.html`

## 目的

この変更の主目的は以下です。

- `mikuscore` の価値を「MusicXML-first な変換ツール」として読みやすくする
- 利用者向け README と開発者向け文書の役割を分ける
- ドキュメントと UI の説明文を同じプロダクト像に揃える
mikuscore の説明を変換ツール中心に整理し、README・開発文書・UI文言を整合させる
## 概要

ルートの `index.html` を手編集前提のファイルから生成物に切り替える変更です。
あわせて、編集元として `index-src.html` を追加し、build 時に `{{BUILD_DATE}}` を埋めて `index.html` を生成するようにしています。

この変更には、`index.html` 上の製品説明の更新も含まれます。

## 変更内容

### 1. `index-src.html` を追加

新規ファイル `index-src.html` を追加し、ランディングページの編集元をこちらへ移しています。

差分上で確認できる内容:
- `Updated: {{BUILD_DATE}}` のプレースホルダ追加
- 英語 / 日本語の説明文を `index-src.html` 側に保持
- CLI への短い言及を追加
- 関連プロダクト `mikuscore-skills` / `miku-abc-player` への短い言及を追加
- `ABC` 表記を `experimental` / `実験的対応` から外す更新を反映

### 2. `scripts/build.mjs` で `index.html` を生成

build script に `index-src.html -> index.html` の生成処理が追加されています。

差分上で確認できる内容:
- `INDEX_TEMPLATE = "index-src.html"`
- `INDEX_DIST = "index.html"`
- `formatBuildDate()`
- `renderStaticTemplate(...)`
- build 時に `{{BUILD_DATE}}` を現在日付へ置換
- build 完了ログを `mikuscore.html, index.html, src/js/main.js` に拡張

### 3. 生成物 `index.html` の更新

`index.html` 自体も生成結果に合わせて更新されています。

差分上で確認できる内容:
- `Updated: 2026-04-15` の埋め込み
- CLI への短い言及
- `mikuscore-skills` / `miku-abc-player` の説明追加
- `ABC` の experimental 表記削除

### 4. build / development 文書の更新

生成物化された `index.html` の扱いに合わせて、以下の文書も更新されています。

- `docs/spec/BUILD_PROCESS.md`
- `docs/DEVELOPMENT.md`

差分上で確認できる内容:
- editable source template に `index-src.html` を追加
- generated artifact に `index.html` を追加
- `index.html` は直接編集しないことを明記
- `{{BUILD_DATE}}` は build 時に埋めることを明記

## 変更ファイル

- `index-src.html`
- `index.html`
- `scripts/build.mjs`
- `docs/spec/BUILD_PROCESS.md`
- `docs/DEVELOPMENT.md`

## 目的

この変更の主目的は以下です。

- `index.html` を generated artifact として扱えるようにする
- build 日付を手書きではなく build 時埋め込みにする
- ルートのランディングページ説明を現在の製品説明に合わせて保守しやすくする

## 確認事項

- `index-src.html` は新規追加: 確認済み
- `index.html` は generated artifact として更新: 確認済み
- `scripts/build.mjs` に `index.html` 生成処理追加: 確認済み
`index.html` を生成物化し、ビルド日付付きのランディングページ運用へ切り替える
@igapyon igapyon merged commit 9d2be0a into main Apr 15, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant