Skip to content

Commit ad17dd4

Browse files
committed
Make MIDI Studio V2 UAT-testable with manifest import, playable song, and roadmap - PR_26146_023-midi-studio-v2-uat-layout-roadmap-and-playable-manifest
1 parent 5c93380 commit ad17dd4

15 files changed

Lines changed: 622 additions & 326 deletions
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# PR_26146_023 MIDI Studio V2 UAT Layout Roadmap And Playable Manifest Validation
2+
3+
## Result
4+
- PASS: Import JSON Manifest is the primary UAT workflow.
5+
- PASS: The imported UAT game manifest lists multiple MIDI Studio songs.
6+
- PASS: The upbeat `Camptown Races UAT Reel` arrangement can be selected.
7+
- PASS: The selected song appears in the Studio tab with visible track rows and note/clip blocks.
8+
- PASS: Play starts audible Preview Synth playback state.
9+
- PASS: Stop clears audible Preview Synth playback state and active timeline cells.
10+
- PASS: Roadmap exists and uses `[ ]`, `[.]`, and `[x]` status markers.
11+
12+
## Scope
13+
- Replaced the old Load Example primary path with an Import JSON Manifest workflow.
14+
- Added a real UAT manifest fixture with three MIDI Studio songs.
15+
- Added a public-domain/traditional-style upbeat arrangement with Lead, Bass, Chords/Pad, and Drums lanes.
16+
- Added tab organization for Studio, Song Setup, Instruments, Auto-Create Parts, MIDI Import, Export, and Diagnostics.
17+
- Kept the Studio tab immediately visible with left track rows, center note/timeline editor, and right properties/status panels.
18+
- Removed hidden example fallback song data from MIDI Studio V2 runtime code.
19+
- Added `studioArrangement` manifest normalization and schema support.
20+
- Added the MIDI Studio V2 roadmap with required and optional work items.
21+
22+
## Lanes
23+
- recovery/UAT: executed because this PR repairs the failed MIDI Studio V2 UAT flow from PR_26146_022.
24+
- tools: executed through targeted MIDI Studio V2 syntax and Playwright checks.
25+
- runtime: executed through targeted Playwright because Preview Synth playback and browser UI behavior changed.
26+
- integration: skipped because Workspace Manager registration/handoff was not changed.
27+
- engine: skipped because no `src/engine` files changed.
28+
- samples: skipped because no sample JSON was modified and full samples smoke was explicitly out of scope.
29+
30+
## Validation Commands
31+
- PASS: `node --check tools/midi-studio-v2/js/MidiStudioV2App.js`
32+
- PASS: `node --check tools/midi-studio-v2/js/bootstrap.js`
33+
- PASS: `node --check tools/midi-studio-v2/js/controls/ActionNavControl.js`
34+
- PASS: `node --check tools/midi-studio-v2/js/controls/PlaybackControl.js`
35+
- PASS: `node --check tools/midi-studio-v2/js/controls/StudioTabsControl.js`
36+
- PASS: `node --check tools/midi-studio-v2/js/controls/InstrumentGridControl.js`
37+
- PASS: `node --check tools/midi-studio-v2/js/services/MidiStudioStateSerializer.js`
38+
- PASS: `node --check tests/playwright/tools/MidiStudioV2.spec.mjs`
39+
- PASS: JSON parse for `tests/fixtures/midi-studio-v2/uat-midi-studio-v2.game.manifest.json`
40+
- PASS: JSON parse for `tools/schemas/tools/midi-studio-v2.schema.json`
41+
- PASS: HTML external-only guard for `tools/midi-studio-v2/index.html`; no inline `<script>`, `<style>`, or inline event handlers found.
42+
- PASS: `rg -n "imageDataUrl" tools/midi-studio-v2 tests/fixtures/midi-studio-v2 tools/schemas/tools/midi-studio-v2.schema.json` returned no matches.
43+
- PASS: `rg -n "Load Example|Use Example|EXAMPLE_TOOL_STATE|Twinkle" tools/midi-studio-v2 tests/fixtures/midi-studio-v2` returned no matches.
44+
- PASS: `$env:PLAYWRIGHT_BROWSERS_PATH='0'; npx.cmd playwright test tests/playwright/tools/MidiStudioV2.spec.mjs --project=playwright --grep "imports UAT manifest and plays|roadmap exists|launches and renders|expands and restores|updates play and stop control state|rejects invalid payloads before render"`
45+
- Result: 6 passed.
46+
- Proved UAT manifest JSON import, multiple listed songs, upbeat song selection, visible Studio tracks and note/clip blocks, Play audible preview state, Stop playback reset, roadmap status markers, removed Load Example controls, tab-aware expanded view, rendered-preview compatibility, and invalid-payload handling.
47+
- PASS: `git diff --check`
48+
- Note: Git reported LF-to-CRLF normalization warnings for touched files; no whitespace errors were reported.
49+
50+
## Coverage Reports
51+
- Updated `docs/dev/reports/playwright_v8_coverage_report.txt`.
52+
- Updated `docs/dev/reports/coverage_changed_js_guardrail.txt`.
53+
- Guardrail status: advisory PASS, no changed runtime JS coverage warnings.
54+
55+
## Manual UAT Steps
56+
1. Open `tools/midi-studio-v2/index.html`.
57+
2. Click `Import JSON Manifest`.
58+
3. Choose `tests/fixtures/midi-studio-v2/uat-midi-studio-v2.game.manifest.json`.
59+
4. Select `Camptown Races UAT Reel`.
60+
5. Confirm the Studio tab shows Lead, Bass, Chords/Pad, and Drums tracks with timeline note/clip blocks.
61+
6. Click `Play` and confirm the audible preview playback state starts.
62+
7. Click `Stop` and confirm playback stops and active cells clear.
63+
64+
## Skips
65+
- Full samples smoke test: SKIPPED per PR instructions.
66+
- Workspace lane: SKIPPED because Workspace contract/runtime files were not touched.
67+
- Sample JSON modification: SKIPPED per repo and PR instructions.
68+
69+
## Artifacts
70+
- `docs/dev/reports/codex_review.diff`
71+
- `docs/dev/reports/codex_changed_files.txt`
72+
- `docs/dev/reports/playwright_v8_coverage_report.txt`
73+
- `docs/dev/reports/coverage_changed_js_guardrail.txt`
74+
- `docs/dev/codex_commands.md`
75+
- `docs/dev/commit_comment.txt`
76+
- Repo-structured delta ZIP: `tmp/PR_26146_023-midi-studio-v2-uat-layout-roadmap-and-playable-manifest_delta.zip`
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# MIDI Studio V2 Roadmap
2+
3+
## Required UAT Path
4+
5+
- [.] First priority: UAT manifest import, multiple songs in manifest, selectable upbeat multi-instrument song, visible studio layout, Play audible preview, and Stop all audio.
6+
- [x] UAT manifest import uses Import JSON Manifest instead of Load Example as the primary workflow.
7+
- [x] Real UAT manifest fixture includes multiple MIDI Studio songs.
8+
- [x] Playable upbeat public-domain/traditional-style test song arrangement includes Lead, Bass, Chords/Pad, and Drums.
9+
- [x] Studio tab shows a visible track/timeline editor without opening accordions.
10+
- [x] Tabs organize Studio, Song Setup, Instruments, Auto-Create Parts, MIDI Import, Export, and Diagnostics.
11+
- [.] Editable note/timeline grid remains the primary music studio editing surface.
12+
- [ ] Track volume, pan, mute, and solo controls.
13+
- [.] Song setup fields for tempo, key, style, intro, and loop.
14+
- [ ] MIDI import conversion to editable tracks.
15+
- [ ] Rendered WAV/MP3/OGG export.
16+
- [ ] SoundFont and real instrument playback.
17+
- [ ] Auto-Create Parts helpers for generated bass, pad, arpeggio, and drums.
18+
- [.] Diagnostics for audio state, selected song, selected section, active lanes, and warnings.
19+
20+
## Optional Future Items
21+
22+
- [ ] Optional piano roll.
23+
- [ ] Optional advanced MIDI event editor.
24+
- [ ] Optional per-note velocity and duration editing.
25+
- [ ] Optional arrangement section copy/paste helpers.
26+
- [ ] Optional quantize and humanize helpers.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
{
2+
"schema": "html-js-gaming.game-manifest",
3+
"version": 1,
4+
"game": {
5+
"id": "midi-studio-v2-uat",
6+
"name": "MIDI Studio V2 UAT",
7+
"folder": "midi-studio-v2-uat"
8+
},
9+
"launch": {
10+
"directPath": "games/midi-studio-v2-uat/index.html"
11+
},
12+
"tools": {
13+
"midi-studio-v2": {
14+
"version": 1,
15+
"activeSongId": "camptown-races-uat-reel",
16+
"directorMode": {
17+
"enabled": true,
18+
"defaultIntensity": "bright"
19+
}
20+
}
21+
},
22+
"music": {
23+
"version": 1,
24+
"runtimePreference": "live-midi",
25+
"activeSongId": "camptown-races-uat-reel",
26+
"directorMode": {
27+
"enabled": true,
28+
"defaultIntensity": "bright"
29+
},
30+
"songs": [
31+
{
32+
"id": "camptown-races-uat-reel",
33+
"name": "Camptown Races UAT Reel",
34+
"sourceMidi": "assets/music/midi/camptown-races-uat-reel.mid",
35+
"instrumentSet": "Preview Synth public-domain UAT band",
36+
"rendered": {},
37+
"defaultRuntimeFormat": "ogg",
38+
"loop": {
39+
"enabled": true,
40+
"startSeconds": 0,
41+
"endSeconds": 14
42+
},
43+
"director": {
44+
"mood": "upbeat",
45+
"intensity": "bright",
46+
"usage": ["uat", "public-domain", "preview-synth"],
47+
"notes": "Traditional Camptown Races style public-domain test arrangement with lead, bass, chords/pad, and drums."
48+
},
49+
"tags": ["uat", "upbeat", "traditional", "public-domain"],
50+
"studioArrangement": {
51+
"tempo": "144",
52+
"key": "G major",
53+
"style": "public-domain-reel",
54+
"sections": "verse:2, chorus:2",
55+
"beatsPerBar": "4",
56+
"subdivision": "1",
57+
"songSheet": {
58+
"intro": "G C G D",
59+
"loop": "G C G D"
60+
},
61+
"lanes": {
62+
"chords": "G G C G | D D G G | G G C G | D C G G",
63+
"bass": "G2 G2 C2 G2 | D2 D2 G2 G2 | G2 G2 C2 G2 | D2 C2 G2 G2",
64+
"pad": "G - C - | D - G - | G - C - | D C G -",
65+
"lead": "G4 G4 E4 G4 | A4 G4 E4 - | B4 B4 A4 B4 | D5 B4 G4 -",
66+
"drums": "kick hat snare hat | kick hat snare hat | kick hat snare hat | kick hat snare hat"
67+
},
68+
"previewInstruments": {
69+
"chords": "warm-pad",
70+
"bass": "synth-bass",
71+
"pad": "ambient-pad",
72+
"lead": "retro-pulse-lead",
73+
"drums": "basic-drums"
74+
}
75+
}
76+
},
77+
{
78+
"id": "menu-march-sketch",
79+
"name": "Menu March Sketch",
80+
"sourceMidi": "assets/music/midi/menu-march-sketch.mid",
81+
"instrumentSet": "Preview Synth sketch",
82+
"rendered": {},
83+
"defaultRuntimeFormat": "ogg",
84+
"loop": {
85+
"enabled": true
86+
},
87+
"director": {
88+
"mood": "confident",
89+
"intensity": "medium",
90+
"usage": ["menu"],
91+
"notes": "Secondary song to prove multi-song manifest selection."
92+
},
93+
"tags": ["uat", "menu"]
94+
},
95+
{
96+
"id": "quiet-village-pad",
97+
"name": "Quiet Village Pad",
98+
"sourceMidi": "assets/music/midi/quiet-village-pad.mid",
99+
"instrumentSet": "Preview Synth sketch",
100+
"rendered": {},
101+
"defaultRuntimeFormat": "ogg",
102+
"loop": {
103+
"enabled": false
104+
},
105+
"director": {
106+
"mood": "calm",
107+
"intensity": "low",
108+
"usage": ["ambient"],
109+
"notes": "Low-intensity contrast song for the imported song list."
110+
},
111+
"tags": ["uat", "ambient"]
112+
}
113+
]
114+
}
115+
}

0 commit comments

Comments
 (0)