# Work マスター時間（BGM · PM 決定）

Player / 楽譜 / 3D の **transport 同期** — 実装: [transport-sync-v2.md](./transport-sync-v2.md)。

## 決定（2026-11）

| 論点 | 決定 |
|------|------|
| **マスター時間** | **BGM の尺** — 0 〜 `durationSec` が唯一のタイムライン |
| **Work API** | **`durationSec`**（秒 · number）と **`assets.masterAudio.url`**（共通 BGM）を enrich で付与 |
| **投稿** | **譜面＋振付**は同一曲・**motion の `duration` ≒ `durationSec`**。**譜面のみ**（motion なし）も可 |

## フィールド

| フィールド | 保存 | enrich |
|------------|------|--------|
| `durationSec` | 投稿時（motion から自動）またはカタログ | motion JSON · `durationSecFallback` · 明示値 |
| `assets.masterAudio` | 将来: 公式 BGM アップロード | `bgmFallback` / `assets/{workId}/master.mp3` → `GET /poc/bgm/:id` |
| `hasMotion` | — | **レスポンスのみ** — 3D タブ表示可否 |

`assets.audioOfficial`（パートナー DRM）は従来どおり。同期クロックの正本は **`masterAudio`**。

## 投稿（8782 `POST /works`）

- **譜面** — 必須
- **motion JSON** — 任意。ある場合 `duration` 必須 → `durationSec` に保存
- **マスター BGM** — 任意 · `masterAudioBase64` + `masterAudioFileName`（`.mp3` / `.wav` · 最大 10MB）→ `uploads/{workId}/master.mp3` 等 · enrich で `assets.masterAudio.url`
- **譜面のみ + マスター BGM** — **`durationSec` は WAV / MP3 から自動**（`parseWavDurationSec` · `parseMp3DurationSec`）。解析不能時は手入力 `durationSec` 必須
- **PATCH `/works/:id`** — 所有者が **`masterAudioBase64`** で後付け（振付なし Work は尺更新）。UI: `work.html?work=…&api=1` 作成者向けパネル
- **譜面のみ** — BGM なし · 手入力 `durationSec` 必須

## Player（PoC）

- `hasMotion === false` → **3Dダンス**タブを非表示
- 親 **transport バー** + `muvic:transport` / `muvic:session` 拡張 — [transport-sync-v2.md](./transport-sync-v2.md)
- **尺の正本:** API の **`durationSec`** が設定されているとき、親 transport の total・自然終了・`muvic:session.durationSec` は **マスター BGM ファイルより長い秒数に伸ばさない**（長い MP3 でも Work 8s デモは 0:08 で止まる）。Karaoke 楽譜 UI の total も session 受信後は同じ尺。

## PoC 設定

`apps/web/config/karaoke-poc-assets.json`

- `durationSecFallback` — Work ID → 秒（デモ motion 8s 等）
- `bgmFallback` — Work ID → `apps/web/assets/poc/master-demo-8s.wav`（`GET /poc/bgm/:workId` · enrich → `assets.masterAudio.url`）
- 再生成: `npm run generate:poc-bgm`

## BGM マスター体験（PoC）

1. **8782 再起動** · `?api=1` · `GET /works/work_demo_001` → `assets.masterAudio.url`
2. Player 親 transport — **「マスター BGM（親）」** · 8 秒 440Hz
3. `masterBgmActive` — 子 BGM ミュート · **`muvic:clockSync`** で譜面/3D 追従
4. **3D embed ▶** など iframe 起点の再生 — 親 `<audio>` が autoplay できない場合、親は **サイレントクロック**で尺を進める（詳細 [transport-sync-v2.md](./transport-sync-v2.md)）

## 関連

- [player-ui-phases.md](./player-ui-phases.md) · [LEGACY-CLIENTS.md](../LEGACY-CLIENTS.md)
- スキーマ: [packages/work-schema/work-catalog.schema.json](../../packages/work-schema/work-catalog.schema.json)
